0001
0002
0003
0004
0005
0006
0007 #include <linux/fsl/mc.h>
0008 #include "dpseci.h"
0009 #include "dpseci_cmd.h"
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 int dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id,
0028 u16 *token)
0029 {
0030 struct fsl_mc_command cmd = { 0 };
0031 struct dpseci_cmd_open *cmd_params;
0032 int err;
0033
0034 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_OPEN,
0035 cmd_flags,
0036 0);
0037 cmd_params = (struct dpseci_cmd_open *)cmd.params;
0038 cmd_params->dpseci_id = cpu_to_le32(dpseci_id);
0039 err = mc_send_command(mc_io, &cmd);
0040 if (err)
0041 return err;
0042
0043 *token = mc_cmd_hdr_read_token(&cmd);
0044
0045 return 0;
0046 }
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 int dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
0060 {
0061 struct fsl_mc_command cmd = { 0 };
0062
0063 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_CLOSE,
0064 cmd_flags,
0065 token);
0066 return mc_send_command(mc_io, &cmd);
0067 }
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 int dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
0078 {
0079 struct fsl_mc_command cmd = { 0 };
0080
0081 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_ENABLE,
0082 cmd_flags,
0083 token);
0084 return mc_send_command(mc_io, &cmd);
0085 }
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
0096 {
0097 struct fsl_mc_command cmd = { 0 };
0098
0099 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_DISABLE,
0100 cmd_flags,
0101 token);
0102
0103 return mc_send_command(mc_io, &cmd);
0104 }
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
0115 {
0116 struct fsl_mc_command cmd = { 0 };
0117
0118 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET,
0119 cmd_flags,
0120 token);
0121 return mc_send_command(mc_io, &cmd);
0122 }
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 int dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0134 int *en)
0135 {
0136 struct fsl_mc_command cmd = { 0 };
0137 struct dpseci_rsp_is_enabled *rsp_params;
0138 int err;
0139
0140 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_IS_ENABLED,
0141 cmd_flags,
0142 token);
0143 err = mc_send_command(mc_io, &cmd);
0144 if (err)
0145 return err;
0146
0147 rsp_params = (struct dpseci_rsp_is_enabled *)cmd.params;
0148 *en = dpseci_get_field(rsp_params->is_enabled, ENABLE);
0149
0150 return 0;
0151 }
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 int dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0163 struct dpseci_attr *attr)
0164 {
0165 struct fsl_mc_command cmd = { 0 };
0166 struct dpseci_rsp_get_attributes *rsp_params;
0167 int err;
0168
0169 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_ATTR,
0170 cmd_flags,
0171 token);
0172 err = mc_send_command(mc_io, &cmd);
0173 if (err)
0174 return err;
0175
0176 rsp_params = (struct dpseci_rsp_get_attributes *)cmd.params;
0177 attr->id = le32_to_cpu(rsp_params->id);
0178 attr->num_tx_queues = rsp_params->num_tx_queues;
0179 attr->num_rx_queues = rsp_params->num_rx_queues;
0180 attr->options = le32_to_cpu(rsp_params->options);
0181
0182 return 0;
0183 }
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 int dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0198 u8 queue, const struct dpseci_rx_queue_cfg *cfg)
0199 {
0200 struct fsl_mc_command cmd = { 0 };
0201 struct dpseci_cmd_queue *cmd_params;
0202
0203 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_SET_RX_QUEUE,
0204 cmd_flags,
0205 token);
0206 cmd_params = (struct dpseci_cmd_queue *)cmd.params;
0207 cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
0208 cmd_params->priority = cfg->dest_cfg.priority;
0209 cmd_params->queue = queue;
0210 dpseci_set_field(cmd_params->dest_type, DEST_TYPE,
0211 cfg->dest_cfg.dest_type);
0212 cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
0213 cmd_params->options = cpu_to_le32(cfg->options);
0214 dpseci_set_field(cmd_params->order_preservation_en, ORDER_PRESERVATION,
0215 cfg->order_preservation_en);
0216
0217 return mc_send_command(mc_io, &cmd);
0218 }
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231 int dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0232 u8 queue, struct dpseci_rx_queue_attr *attr)
0233 {
0234 struct fsl_mc_command cmd = { 0 };
0235 struct dpseci_cmd_queue *cmd_params;
0236 int err;
0237
0238 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE,
0239 cmd_flags,
0240 token);
0241 cmd_params = (struct dpseci_cmd_queue *)cmd.params;
0242 cmd_params->queue = queue;
0243 err = mc_send_command(mc_io, &cmd);
0244 if (err)
0245 return err;
0246
0247 attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id);
0248 attr->dest_cfg.priority = cmd_params->priority;
0249 attr->dest_cfg.dest_type = dpseci_get_field(cmd_params->dest_type,
0250 DEST_TYPE);
0251 attr->user_ctx = le64_to_cpu(cmd_params->user_ctx);
0252 attr->fqid = le32_to_cpu(cmd_params->fqid);
0253 attr->order_preservation_en =
0254 dpseci_get_field(cmd_params->order_preservation_en,
0255 ORDER_PRESERVATION);
0256
0257 return 0;
0258 }
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 int dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0272 u8 queue, struct dpseci_tx_queue_attr *attr)
0273 {
0274 struct fsl_mc_command cmd = { 0 };
0275 struct dpseci_cmd_queue *cmd_params;
0276 struct dpseci_rsp_get_tx_queue *rsp_params;
0277 int err;
0278
0279 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE,
0280 cmd_flags,
0281 token);
0282 cmd_params = (struct dpseci_cmd_queue *)cmd.params;
0283 cmd_params->queue = queue;
0284 err = mc_send_command(mc_io, &cmd);
0285 if (err)
0286 return err;
0287
0288 rsp_params = (struct dpseci_rsp_get_tx_queue *)cmd.params;
0289 attr->fqid = le32_to_cpu(rsp_params->fqid);
0290 attr->priority = rsp_params->priority;
0291
0292 return 0;
0293 }
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304 int dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0305 struct dpseci_sec_attr *attr)
0306 {
0307 struct fsl_mc_command cmd = { 0 };
0308 struct dpseci_rsp_get_sec_attr *rsp_params;
0309 int err;
0310
0311 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_SEC_ATTR,
0312 cmd_flags,
0313 token);
0314 err = mc_send_command(mc_io, &cmd);
0315 if (err)
0316 return err;
0317
0318 rsp_params = (struct dpseci_rsp_get_sec_attr *)cmd.params;
0319 attr->ip_id = le16_to_cpu(rsp_params->ip_id);
0320 attr->major_rev = rsp_params->major_rev;
0321 attr->minor_rev = rsp_params->minor_rev;
0322 attr->era = rsp_params->era;
0323 attr->deco_num = rsp_params->deco_num;
0324 attr->zuc_auth_acc_num = rsp_params->zuc_auth_acc_num;
0325 attr->zuc_enc_acc_num = rsp_params->zuc_enc_acc_num;
0326 attr->snow_f8_acc_num = rsp_params->snow_f8_acc_num;
0327 attr->snow_f9_acc_num = rsp_params->snow_f9_acc_num;
0328 attr->crc_acc_num = rsp_params->crc_acc_num;
0329 attr->pk_acc_num = rsp_params->pk_acc_num;
0330 attr->kasumi_acc_num = rsp_params->kasumi_acc_num;
0331 attr->rng_acc_num = rsp_params->rng_acc_num;
0332 attr->md_acc_num = rsp_params->md_acc_num;
0333 attr->arc4_acc_num = rsp_params->arc4_acc_num;
0334 attr->des_acc_num = rsp_params->des_acc_num;
0335 attr->aes_acc_num = rsp_params->aes_acc_num;
0336 attr->ccha_acc_num = rsp_params->ccha_acc_num;
0337 attr->ptha_acc_num = rsp_params->ptha_acc_num;
0338
0339 return 0;
0340 }
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351 int dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
0352 u16 *major_ver, u16 *minor_ver)
0353 {
0354 struct fsl_mc_command cmd = { 0 };
0355 struct dpseci_rsp_get_api_version *rsp_params;
0356 int err;
0357
0358 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_API_VERSION,
0359 cmd_flags, 0);
0360 err = mc_send_command(mc_io, &cmd);
0361 if (err)
0362 return err;
0363
0364 rsp_params = (struct dpseci_rsp_get_api_version *)cmd.params;
0365 *major_ver = le16_to_cpu(rsp_params->major);
0366 *minor_ver = le16_to_cpu(rsp_params->minor);
0367
0368 return 0;
0369 }
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381 int dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
0382 u16 token, const struct dpseci_congestion_notification_cfg *cfg)
0383 {
0384 struct fsl_mc_command cmd = { 0 };
0385 struct dpseci_cmd_congestion_notification *cmd_params;
0386
0387 cmd.header = mc_encode_cmd_header(
0388 DPSECI_CMDID_SET_CONGESTION_NOTIFICATION,
0389 cmd_flags,
0390 token);
0391 cmd_params = (struct dpseci_cmd_congestion_notification *)cmd.params;
0392 cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
0393 cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
0394 cmd_params->priority = cfg->dest_cfg.priority;
0395 dpseci_set_field(cmd_params->options, CGN_DEST_TYPE,
0396 cfg->dest_cfg.dest_type);
0397 dpseci_set_field(cmd_params->options, CGN_UNITS, cfg->units);
0398 cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
0399 cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
0400 cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
0401 cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
0402
0403 return mc_send_command(mc_io, &cmd);
0404 }
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416 int dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
0417 u16 token, struct dpseci_congestion_notification_cfg *cfg)
0418 {
0419 struct fsl_mc_command cmd = { 0 };
0420 struct dpseci_cmd_congestion_notification *rsp_params;
0421 int err;
0422
0423 cmd.header = mc_encode_cmd_header(
0424 DPSECI_CMDID_GET_CONGESTION_NOTIFICATION,
0425 cmd_flags,
0426 token);
0427 err = mc_send_command(mc_io, &cmd);
0428 if (err)
0429 return err;
0430
0431 rsp_params = (struct dpseci_cmd_congestion_notification *)cmd.params;
0432 cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
0433 cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
0434 cfg->dest_cfg.priority = rsp_params->priority;
0435 cfg->dest_cfg.dest_type = dpseci_get_field(rsp_params->options,
0436 CGN_DEST_TYPE);
0437 cfg->units = dpseci_get_field(rsp_params->options, CGN_UNITS);
0438 cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
0439 cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
0440 cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
0441 cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
0442
0443 return 0;
0444 }