1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 2 /* 3 * Copyright 2013-2016 Freescale Semiconductor Inc. 4 * Copyright 2017-2018 NXP 5 */ 6 7 #include <linux/fsl/mc.h> 8 #include "dpseci.h" 9 #include "dpseci_cmd.h" 10 11 /** 12 * dpseci_open() - Open a control session for the specified object 13 * @mc_io: Pointer to MC portal's I/O object 14 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15 * @dpseci_id: DPSECI unique ID 16 * @token: Returned token; use in subsequent API calls 17 * 18 * This function can be used to open a control session for an already created 19 * object; an object may have been declared statically in the DPL 20 * or created dynamically. 21 * This function returns a unique authentication token, associated with the 22 * specific object ID and the specific MC portal; this token must be used in all 23 * subsequent commands for this specific object. 24 * 25 * Return: '0' on success, error code otherwise 26 */ 27 int dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id, 28 u16 *token) 29 { 30 struct fsl_mc_command cmd = { 0 }; 31 struct dpseci_cmd_open *cmd_params; 32 int err; 33 34 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_OPEN, 35 cmd_flags, 36 0); 37 cmd_params = (struct dpseci_cmd_open *)cmd.params; 38 cmd_params->dpseci_id = cpu_to_le32(dpseci_id); 39 err = mc_send_command(mc_io, &cmd); 40 if (err) 41 return err; 42 43 *token = mc_cmd_hdr_read_token(&cmd); 44 45 return 0; 46 } 47 48 /** 49 * dpseci_close() - Close the control session of the object 50 * @mc_io: Pointer to MC portal's I/O object 51 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 52 * @token: Token of DPSECI object 53 * 54 * After this function is called, no further operations are allowed on the 55 * object without opening a new control session. 56 * 57 * Return: '0' on success, error code otherwise 58 */ 59 int dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 60 { 61 struct fsl_mc_command cmd = { 0 }; 62 63 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_CLOSE, 64 cmd_flags, 65 token); 66 return mc_send_command(mc_io, &cmd); 67 } 68 69 /** 70 * dpseci_enable() - Enable the DPSECI, allow sending and receiving frames 71 * @mc_io: Pointer to MC portal's I/O object 72 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 73 * @token: Token of DPSECI object 74 * 75 * Return: '0' on success, error code otherwise 76 */ 77 int dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 78 { 79 struct fsl_mc_command cmd = { 0 }; 80 81 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_ENABLE, 82 cmd_flags, 83 token); 84 return mc_send_command(mc_io, &cmd); 85 } 86 87 /** 88 * dpseci_disable() - Disable the DPSECI, stop sending and receiving frames 89 * @mc_io: Pointer to MC portal's I/O object 90 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 91 * @token: Token of DPSECI object 92 * 93 * Return: '0' on success, error code otherwise 94 */ 95 int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 96 { 97 struct fsl_mc_command cmd = { 0 }; 98 99 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_DISABLE, 100 cmd_flags, 101 token); 102 103 return mc_send_command(mc_io, &cmd); 104 } 105 106 /** 107 * dpseci_reset() - Reset the DPSECI, returns the object to initial state 108 * @mc_io: Pointer to MC portal's I/O object 109 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 110 * @token: Token of DPSECI object 111 * 112 * Return: '0' on success, error code otherwise 113 */ 114 int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 115 { 116 struct fsl_mc_command cmd = { 0 }; 117 118 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET, 119 cmd_flags, 120 token); 121 return mc_send_command(mc_io, &cmd); 122 } 123 124 /** 125 * dpseci_is_enabled() - Check if the DPSECI is enabled. 126 * @mc_io: Pointer to MC portal's I/O object 127 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 128 * @token: Token of DPSECI object 129 * @en: Returns '1' if object is enabled; '0' otherwise 130 * 131 * Return: '0' on success, error code otherwise 132 */ 133 int dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 134 int *en) 135 { 136 struct fsl_mc_command cmd = { 0 }; 137 struct dpseci_rsp_is_enabled *rsp_params; 138 int err; 139 140 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_IS_ENABLED, 141 cmd_flags, 142 token); 143 err = mc_send_command(mc_io, &cmd); 144 if (err) 145 return err; 146 147 rsp_params = (struct dpseci_rsp_is_enabled *)cmd.params; 148 *en = dpseci_get_field(rsp_params->is_enabled, ENABLE); 149 150 return 0; 151 } 152 153 /** 154 * dpseci_get_attributes() - Retrieve DPSECI attributes 155 * @mc_io: Pointer to MC portal's I/O object 156 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 157 * @token: Token of DPSECI object 158 * @attr: Returned object's attributes 159 * 160 * Return: '0' on success, error code otherwise 161 */ 162 int dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 163 struct dpseci_attr *attr) 164 { 165 struct fsl_mc_command cmd = { 0 }; 166 struct dpseci_rsp_get_attributes *rsp_params; 167 int err; 168 169 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_ATTR, 170 cmd_flags, 171 token); 172 err = mc_send_command(mc_io, &cmd); 173 if (err) 174 return err; 175 176 rsp_params = (struct dpseci_rsp_get_attributes *)cmd.params; 177 attr->id = le32_to_cpu(rsp_params->id); 178 attr->num_tx_queues = rsp_params->num_tx_queues; 179 attr->num_rx_queues = rsp_params->num_rx_queues; 180 attr->options = le32_to_cpu(rsp_params->options); 181 182 return 0; 183 } 184 185 /** 186 * dpseci_set_rx_queue() - Set Rx queue configuration 187 * @mc_io: Pointer to MC portal's I/O object 188 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 189 * @token: Token of DPSECI object 190 * @queue: Select the queue relative to number of priorities configured at 191 * DPSECI creation; use DPSECI_ALL_QUEUES to configure all 192 * Rx queues identically. 193 * @cfg: Rx queue configuration 194 * 195 * Return: '0' on success, error code otherwise 196 */ 197 int dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 198 u8 queue, const struct dpseci_rx_queue_cfg *cfg) 199 { 200 struct fsl_mc_command cmd = { 0 }; 201 struct dpseci_cmd_queue *cmd_params; 202 203 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_SET_RX_QUEUE, 204 cmd_flags, 205 token); 206 cmd_params = (struct dpseci_cmd_queue *)cmd.params; 207 cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 208 cmd_params->priority = cfg->dest_cfg.priority; 209 cmd_params->queue = queue; 210 dpseci_set_field(cmd_params->dest_type, DEST_TYPE, 211 cfg->dest_cfg.dest_type); 212 cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); 213 cmd_params->options = cpu_to_le32(cfg->options); 214 dpseci_set_field(cmd_params->order_preservation_en, ORDER_PRESERVATION, 215 cfg->order_preservation_en); 216 217 return mc_send_command(mc_io, &cmd); 218 } 219 220 /** 221 * dpseci_get_rx_queue() - Retrieve Rx queue attributes 222 * @mc_io: Pointer to MC portal's I/O object 223 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 224 * @token: Token of DPSECI object 225 * @queue: Select the queue relative to number of priorities configured at 226 * DPSECI creation 227 * @attr: Returned Rx queue attributes 228 * 229 * Return: '0' on success, error code otherwise 230 */ 231 int dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 232 u8 queue, struct dpseci_rx_queue_attr *attr) 233 { 234 struct fsl_mc_command cmd = { 0 }; 235 struct dpseci_cmd_queue *cmd_params; 236 int err; 237 238 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE, 239 cmd_flags, 240 token); 241 cmd_params = (struct dpseci_cmd_queue *)cmd.params; 242 cmd_params->queue = queue; 243 err = mc_send_command(mc_io, &cmd); 244 if (err) 245 return err; 246 247 attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id); 248 attr->dest_cfg.priority = cmd_params->priority; 249 attr->dest_cfg.dest_type = dpseci_get_field(cmd_params->dest_type, 250 DEST_TYPE); 251 attr->user_ctx = le64_to_cpu(cmd_params->user_ctx); 252 attr->fqid = le32_to_cpu(cmd_params->fqid); 253 attr->order_preservation_en = 254 dpseci_get_field(cmd_params->order_preservation_en, 255 ORDER_PRESERVATION); 256 257 return 0; 258 } 259 260 /** 261 * dpseci_get_tx_queue() - Retrieve Tx queue attributes 262 * @mc_io: Pointer to MC portal's I/O object 263 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 264 * @token: Token of DPSECI object 265 * @queue: Select the queue relative to number of priorities configured at 266 * DPSECI creation 267 * @attr: Returned Tx queue attributes 268 * 269 * Return: '0' on success, error code otherwise 270 */ 271 int dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 272 u8 queue, struct dpseci_tx_queue_attr *attr) 273 { 274 struct fsl_mc_command cmd = { 0 }; 275 struct dpseci_cmd_queue *cmd_params; 276 struct dpseci_rsp_get_tx_queue *rsp_params; 277 int err; 278 279 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE, 280 cmd_flags, 281 token); 282 cmd_params = (struct dpseci_cmd_queue *)cmd.params; 283 cmd_params->queue = queue; 284 err = mc_send_command(mc_io, &cmd); 285 if (err) 286 return err; 287 288 rsp_params = (struct dpseci_rsp_get_tx_queue *)cmd.params; 289 attr->fqid = le32_to_cpu(rsp_params->fqid); 290 attr->priority = rsp_params->priority; 291 292 return 0; 293 } 294 295 /** 296 * dpseci_get_sec_attr() - Retrieve SEC accelerator attributes 297 * @mc_io: Pointer to MC portal's I/O object 298 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 299 * @token: Token of DPSECI object 300 * @attr: Returned SEC attributes 301 * 302 * Return: '0' on success, error code otherwise 303 */ 304 int dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 305 struct dpseci_sec_attr *attr) 306 { 307 struct fsl_mc_command cmd = { 0 }; 308 struct dpseci_rsp_get_sec_attr *rsp_params; 309 int err; 310 311 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_SEC_ATTR, 312 cmd_flags, 313 token); 314 err = mc_send_command(mc_io, &cmd); 315 if (err) 316 return err; 317 318 rsp_params = (struct dpseci_rsp_get_sec_attr *)cmd.params; 319 attr->ip_id = le16_to_cpu(rsp_params->ip_id); 320 attr->major_rev = rsp_params->major_rev; 321 attr->minor_rev = rsp_params->minor_rev; 322 attr->era = rsp_params->era; 323 attr->deco_num = rsp_params->deco_num; 324 attr->zuc_auth_acc_num = rsp_params->zuc_auth_acc_num; 325 attr->zuc_enc_acc_num = rsp_params->zuc_enc_acc_num; 326 attr->snow_f8_acc_num = rsp_params->snow_f8_acc_num; 327 attr->snow_f9_acc_num = rsp_params->snow_f9_acc_num; 328 attr->crc_acc_num = rsp_params->crc_acc_num; 329 attr->pk_acc_num = rsp_params->pk_acc_num; 330 attr->kasumi_acc_num = rsp_params->kasumi_acc_num; 331 attr->rng_acc_num = rsp_params->rng_acc_num; 332 attr->md_acc_num = rsp_params->md_acc_num; 333 attr->arc4_acc_num = rsp_params->arc4_acc_num; 334 attr->des_acc_num = rsp_params->des_acc_num; 335 attr->aes_acc_num = rsp_params->aes_acc_num; 336 attr->ccha_acc_num = rsp_params->ccha_acc_num; 337 attr->ptha_acc_num = rsp_params->ptha_acc_num; 338 339 return 0; 340 } 341 342 /** 343 * dpseci_get_api_version() - Get Data Path SEC Interface API version 344 * @mc_io: Pointer to MC portal's I/O object 345 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 346 * @major_ver: Major version of data path sec API 347 * @minor_ver: Minor version of data path sec API 348 * 349 * Return: '0' on success, error code otherwise 350 */ 351 int dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, 352 u16 *major_ver, u16 *minor_ver) 353 { 354 struct fsl_mc_command cmd = { 0 }; 355 struct dpseci_rsp_get_api_version *rsp_params; 356 int err; 357 358 cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_API_VERSION, 359 cmd_flags, 0); 360 err = mc_send_command(mc_io, &cmd); 361 if (err) 362 return err; 363 364 rsp_params = (struct dpseci_rsp_get_api_version *)cmd.params; 365 *major_ver = le16_to_cpu(rsp_params->major); 366 *minor_ver = le16_to_cpu(rsp_params->minor); 367 368 return 0; 369 } 370 371 /** 372 * dpseci_set_congestion_notification() - Set congestion group 373 * notification configuration 374 * @mc_io: Pointer to MC portal's I/O object 375 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 376 * @token: Token of DPSECI object 377 * @cfg: congestion notification configuration 378 * 379 * Return: '0' on success, error code otherwise 380 */ 381 int dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, 382 u16 token, const struct dpseci_congestion_notification_cfg *cfg) 383 { 384 struct fsl_mc_command cmd = { 0 }; 385 struct dpseci_cmd_congestion_notification *cmd_params; 386 387 cmd.header = mc_encode_cmd_header( 388 DPSECI_CMDID_SET_CONGESTION_NOTIFICATION, 389 cmd_flags, 390 token); 391 cmd_params = (struct dpseci_cmd_congestion_notification *)cmd.params; 392 cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 393 cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode); 394 cmd_params->priority = cfg->dest_cfg.priority; 395 dpseci_set_field(cmd_params->options, CGN_DEST_TYPE, 396 cfg->dest_cfg.dest_type); 397 dpseci_set_field(cmd_params->options, CGN_UNITS, cfg->units); 398 cmd_params->message_iova = cpu_to_le64(cfg->message_iova); 399 cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx); 400 cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry); 401 cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit); 402 403 return mc_send_command(mc_io, &cmd); 404 } 405 406 /** 407 * dpseci_get_congestion_notification() - Get congestion group notification 408 * configuration 409 * @mc_io: Pointer to MC portal's I/O object 410 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 411 * @token: Token of DPSECI object 412 * @cfg: congestion notification configuration 413 * 414 * Return: '0' on success, error code otherwise 415 */ 416 int dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, 417 u16 token, struct dpseci_congestion_notification_cfg *cfg) 418 { 419 struct fsl_mc_command cmd = { 0 }; 420 struct dpseci_cmd_congestion_notification *rsp_params; 421 int err; 422 423 cmd.header = mc_encode_cmd_header( 424 DPSECI_CMDID_GET_CONGESTION_NOTIFICATION, 425 cmd_flags, 426 token); 427 err = mc_send_command(mc_io, &cmd); 428 if (err) 429 return err; 430 431 rsp_params = (struct dpseci_cmd_congestion_notification *)cmd.params; 432 cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id); 433 cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode); 434 cfg->dest_cfg.priority = rsp_params->priority; 435 cfg->dest_cfg.dest_type = dpseci_get_field(rsp_params->options, 436 CGN_DEST_TYPE); 437 cfg->units = dpseci_get_field(rsp_params->options, CGN_UNITS); 438 cfg->message_iova = le64_to_cpu(rsp_params->message_iova); 439 cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx); 440 cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry); 441 cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit); 442 443 return 0; 444 } 445