David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame] | 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 | #ifndef _DPSECI_H_ |
| 7 | #define _DPSECI_H_ |
| 8 | |
| 9 | /* |
| 10 | * Data Path SEC Interface API |
| 11 | * Contains initialization APIs and runtime control APIs for DPSECI |
| 12 | */ |
| 13 | |
| 14 | struct fsl_mc_io; |
| 15 | |
| 16 | /** |
| 17 | * General DPSECI macros |
| 18 | */ |
| 19 | |
| 20 | /** |
| 21 | * Maximum number of Tx/Rx queues per DPSECI object |
| 22 | */ |
| 23 | #define DPSECI_MAX_QUEUE_NUM 16 |
| 24 | |
| 25 | /** |
| 26 | * All queues considered; see dpseci_set_rx_queue() |
| 27 | */ |
| 28 | #define DPSECI_ALL_QUEUES (u8)(-1) |
| 29 | |
| 30 | int dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id, |
| 31 | u16 *token); |
| 32 | |
| 33 | int dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); |
| 34 | |
| 35 | /** |
| 36 | * Enable the Congestion Group support |
| 37 | */ |
| 38 | #define DPSECI_OPT_HAS_CG 0x000020 |
| 39 | |
| 40 | /** |
| 41 | * struct dpseci_cfg - Structure representing DPSECI configuration |
| 42 | * @options: Any combination of the following flags: |
| 43 | * DPSECI_OPT_HAS_CG |
| 44 | * @num_tx_queues: num of queues towards the SEC |
| 45 | * @num_rx_queues: num of queues back from the SEC |
| 46 | * @priorities: Priorities for the SEC hardware processing; |
| 47 | * each place in the array is the priority of the tx queue |
| 48 | * towards the SEC; |
| 49 | * valid priorities are configured with values 1-8; |
| 50 | */ |
| 51 | struct dpseci_cfg { |
| 52 | u32 options; |
| 53 | u8 num_tx_queues; |
| 54 | u8 num_rx_queues; |
| 55 | u8 priorities[DPSECI_MAX_QUEUE_NUM]; |
| 56 | }; |
| 57 | |
| 58 | int dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); |
| 59 | |
| 60 | int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); |
| 61 | |
Olivier Deprez | 157378f | 2022-04-04 15:47:50 +0200 | [diff] [blame^] | 62 | int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); |
| 63 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame] | 64 | int dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, |
| 65 | int *en); |
| 66 | |
| 67 | /** |
| 68 | * struct dpseci_attr - Structure representing DPSECI attributes |
| 69 | * @id: DPSECI object ID |
| 70 | * @num_tx_queues: number of queues towards the SEC |
| 71 | * @num_rx_queues: number of queues back from the SEC |
| 72 | * @options: any combination of the following flags: |
| 73 | * DPSECI_OPT_HAS_CG |
| 74 | */ |
| 75 | struct dpseci_attr { |
| 76 | int id; |
| 77 | u8 num_tx_queues; |
| 78 | u8 num_rx_queues; |
| 79 | u32 options; |
| 80 | }; |
| 81 | |
| 82 | int dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, |
| 83 | struct dpseci_attr *attr); |
| 84 | |
| 85 | /** |
| 86 | * enum dpseci_dest - DPSECI destination types |
| 87 | * @DPSECI_DEST_NONE: Unassigned destination; The queue is set in parked mode |
| 88 | * and does not generate FQDAN notifications; user is expected to dequeue |
| 89 | * from the queue based on polling or other user-defined method |
| 90 | * @DPSECI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN |
| 91 | * notifications to the specified DPIO; user is expected to dequeue from |
| 92 | * the queue only after notification is received |
| 93 | * @DPSECI_DEST_DPCON: The queue is set in schedule mode and does not generate |
| 94 | * FQDAN notifications, but is connected to the specified DPCON object; |
| 95 | * user is expected to dequeue from the DPCON channel |
| 96 | */ |
| 97 | enum dpseci_dest { |
| 98 | DPSECI_DEST_NONE = 0, |
| 99 | DPSECI_DEST_DPIO, |
| 100 | DPSECI_DEST_DPCON |
| 101 | }; |
| 102 | |
| 103 | /** |
| 104 | * struct dpseci_dest_cfg - Structure representing DPSECI destination parameters |
| 105 | * @dest_type: Destination type |
| 106 | * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type |
| 107 | * @priority: Priority selection within the DPIO or DPCON channel; valid values |
| 108 | * are 0-1 or 0-7, depending on the number of priorities in that channel; |
| 109 | * not relevant for 'DPSECI_DEST_NONE' option |
| 110 | */ |
| 111 | struct dpseci_dest_cfg { |
| 112 | enum dpseci_dest dest_type; |
| 113 | int dest_id; |
| 114 | u8 priority; |
| 115 | }; |
| 116 | |
| 117 | /** |
| 118 | * DPSECI queue modification options |
| 119 | */ |
| 120 | |
| 121 | /** |
| 122 | * Select to modify the user's context associated with the queue |
| 123 | */ |
| 124 | #define DPSECI_QUEUE_OPT_USER_CTX 0x00000001 |
| 125 | |
| 126 | /** |
| 127 | * Select to modify the queue's destination |
| 128 | */ |
| 129 | #define DPSECI_QUEUE_OPT_DEST 0x00000002 |
| 130 | |
| 131 | /** |
| 132 | * Select to modify the queue's order preservation |
| 133 | */ |
| 134 | #define DPSECI_QUEUE_OPT_ORDER_PRESERVATION 0x00000004 |
| 135 | |
| 136 | /** |
| 137 | * struct dpseci_rx_queue_cfg - DPSECI RX queue configuration |
| 138 | * @options: Flags representing the suggested modifications to the queue; |
| 139 | * Use any combination of 'DPSECI_QUEUE_OPT_<X>' flags |
| 140 | * @order_preservation_en: order preservation configuration for the rx queue |
| 141 | * valid only if 'DPSECI_QUEUE_OPT_ORDER_PRESERVATION' is contained in 'options' |
| 142 | * @user_ctx: User context value provided in the frame descriptor of each |
| 143 | * dequeued frame; valid only if 'DPSECI_QUEUE_OPT_USER_CTX' is contained |
| 144 | * in 'options' |
| 145 | * @dest_cfg: Queue destination parameters; valid only if |
| 146 | * 'DPSECI_QUEUE_OPT_DEST' is contained in 'options' |
| 147 | */ |
| 148 | struct dpseci_rx_queue_cfg { |
| 149 | u32 options; |
| 150 | int order_preservation_en; |
| 151 | u64 user_ctx; |
| 152 | struct dpseci_dest_cfg dest_cfg; |
| 153 | }; |
| 154 | |
| 155 | int dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, |
| 156 | u8 queue, const struct dpseci_rx_queue_cfg *cfg); |
| 157 | |
| 158 | /** |
| 159 | * struct dpseci_rx_queue_attr - Structure representing attributes of Rx queues |
| 160 | * @user_ctx: User context value provided in the frame descriptor of each |
| 161 | * dequeued frame |
| 162 | * @order_preservation_en: Status of the order preservation configuration on the |
| 163 | * queue |
| 164 | * @dest_cfg: Queue destination configuration |
| 165 | * @fqid: Virtual FQID value to be used for dequeue operations |
| 166 | */ |
| 167 | struct dpseci_rx_queue_attr { |
| 168 | u64 user_ctx; |
| 169 | int order_preservation_en; |
| 170 | struct dpseci_dest_cfg dest_cfg; |
| 171 | u32 fqid; |
| 172 | }; |
| 173 | |
| 174 | int dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, |
| 175 | u8 queue, struct dpseci_rx_queue_attr *attr); |
| 176 | |
| 177 | /** |
| 178 | * struct dpseci_tx_queue_attr - Structure representing attributes of Tx queues |
| 179 | * @fqid: Virtual FQID to be used for sending frames to SEC hardware |
| 180 | * @priority: SEC hardware processing priority for the queue |
| 181 | */ |
| 182 | struct dpseci_tx_queue_attr { |
| 183 | u32 fqid; |
| 184 | u8 priority; |
| 185 | }; |
| 186 | |
| 187 | int dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, |
| 188 | u8 queue, struct dpseci_tx_queue_attr *attr); |
| 189 | |
| 190 | /** |
| 191 | * struct dpseci_sec_attr - Structure representing attributes of the SEC |
| 192 | * hardware accelerator |
| 193 | * @ip_id: ID for SEC |
| 194 | * @major_rev: Major revision number for SEC |
| 195 | * @minor_rev: Minor revision number for SEC |
| 196 | * @era: SEC Era |
| 197 | * @deco_num: The number of copies of the DECO that are implemented in this |
| 198 | * version of SEC |
| 199 | * @zuc_auth_acc_num: The number of copies of ZUCA that are implemented in this |
| 200 | * version of SEC |
| 201 | * @zuc_enc_acc_num: The number of copies of ZUCE that are implemented in this |
| 202 | * version of SEC |
| 203 | * @snow_f8_acc_num: The number of copies of the SNOW-f8 module that are |
| 204 | * implemented in this version of SEC |
| 205 | * @snow_f9_acc_num: The number of copies of the SNOW-f9 module that are |
| 206 | * implemented in this version of SEC |
| 207 | * @crc_acc_num: The number of copies of the CRC module that are implemented in |
| 208 | * this version of SEC |
| 209 | * @pk_acc_num: The number of copies of the Public Key module that are |
| 210 | * implemented in this version of SEC |
| 211 | * @kasumi_acc_num: The number of copies of the Kasumi module that are |
| 212 | * implemented in this version of SEC |
| 213 | * @rng_acc_num: The number of copies of the Random Number Generator that are |
| 214 | * implemented in this version of SEC |
| 215 | * @md_acc_num: The number of copies of the MDHA (Hashing module) that are |
| 216 | * implemented in this version of SEC |
| 217 | * @arc4_acc_num: The number of copies of the ARC4 module that are implemented |
| 218 | * in this version of SEC |
| 219 | * @des_acc_num: The number of copies of the DES module that are implemented in |
| 220 | * this version of SEC |
| 221 | * @aes_acc_num: The number of copies of the AES module that are implemented in |
| 222 | * this version of SEC |
| 223 | * @ccha_acc_num: The number of copies of the ChaCha20 module that are |
| 224 | * implemented in this version of SEC. |
| 225 | * @ptha_acc_num: The number of copies of the Poly1305 module that are |
| 226 | * implemented in this version of SEC. |
| 227 | **/ |
| 228 | struct dpseci_sec_attr { |
| 229 | u16 ip_id; |
| 230 | u8 major_rev; |
| 231 | u8 minor_rev; |
| 232 | u8 era; |
| 233 | u8 deco_num; |
| 234 | u8 zuc_auth_acc_num; |
| 235 | u8 zuc_enc_acc_num; |
| 236 | u8 snow_f8_acc_num; |
| 237 | u8 snow_f9_acc_num; |
| 238 | u8 crc_acc_num; |
| 239 | u8 pk_acc_num; |
| 240 | u8 kasumi_acc_num; |
| 241 | u8 rng_acc_num; |
| 242 | u8 md_acc_num; |
| 243 | u8 arc4_acc_num; |
| 244 | u8 des_acc_num; |
| 245 | u8 aes_acc_num; |
| 246 | u8 ccha_acc_num; |
| 247 | u8 ptha_acc_num; |
| 248 | }; |
| 249 | |
| 250 | int dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, |
| 251 | struct dpseci_sec_attr *attr); |
| 252 | |
| 253 | int dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, |
| 254 | u16 *major_ver, u16 *minor_ver); |
| 255 | |
| 256 | /** |
| 257 | * enum dpseci_congestion_unit - DPSECI congestion units |
| 258 | * @DPSECI_CONGESTION_UNIT_BYTES: bytes units |
| 259 | * @DPSECI_CONGESTION_UNIT_FRAMES: frames units |
| 260 | */ |
| 261 | enum dpseci_congestion_unit { |
| 262 | DPSECI_CONGESTION_UNIT_BYTES = 0, |
| 263 | DPSECI_CONGESTION_UNIT_FRAMES |
| 264 | }; |
| 265 | |
| 266 | /** |
| 267 | * CSCN message is written to message_iova once entering a |
| 268 | * congestion state (see 'threshold_entry') |
| 269 | */ |
| 270 | #define DPSECI_CGN_MODE_WRITE_MEM_ON_ENTER 0x00000001 |
| 271 | |
| 272 | /** |
| 273 | * CSCN message is written to message_iova once exiting a |
| 274 | * congestion state (see 'threshold_exit') |
| 275 | */ |
| 276 | #define DPSECI_CGN_MODE_WRITE_MEM_ON_EXIT 0x00000002 |
| 277 | |
| 278 | /** |
| 279 | * CSCN write will attempt to allocate into a cache (coherent write); |
| 280 | * valid only if 'DPSECI_CGN_MODE_WRITE_MEM_<X>' is selected |
| 281 | */ |
| 282 | #define DPSECI_CGN_MODE_COHERENT_WRITE 0x00000004 |
| 283 | |
| 284 | /** |
| 285 | * if 'dpseci_dest_cfg.dest_type != DPSECI_DEST_NONE' CSCN message is sent to |
| 286 | * DPIO/DPCON's WQ channel once entering a congestion state |
| 287 | * (see 'threshold_entry') |
| 288 | */ |
| 289 | #define DPSECI_CGN_MODE_NOTIFY_DEST_ON_ENTER 0x00000008 |
| 290 | |
| 291 | /** |
| 292 | * if 'dpseci_dest_cfg.dest_type != DPSECI_DEST_NONE' CSCN message is sent to |
| 293 | * DPIO/DPCON's WQ channel once exiting a congestion state |
| 294 | * (see 'threshold_exit') |
| 295 | */ |
| 296 | #define DPSECI_CGN_MODE_NOTIFY_DEST_ON_EXIT 0x00000010 |
| 297 | |
| 298 | /** |
| 299 | * if 'dpseci_dest_cfg.dest_type != DPSECI_DEST_NONE' when the CSCN is written |
| 300 | * to the sw-portal's DQRR, the DQRI interrupt is asserted immediately |
| 301 | * (if enabled) |
| 302 | */ |
| 303 | #define DPSECI_CGN_MODE_INTR_COALESCING_DISABLED 0x00000020 |
| 304 | |
| 305 | /** |
| 306 | * struct dpseci_congestion_notification_cfg - congestion notification |
| 307 | * configuration |
| 308 | * @units: units type |
| 309 | * @threshold_entry: above this threshold we enter a congestion state. |
| 310 | * set it to '0' to disable it |
| 311 | * @threshold_exit: below this threshold we exit the congestion state. |
| 312 | * @message_ctx: The context that will be part of the CSCN message |
| 313 | * @message_iova: I/O virtual address (must be in DMA-able memory), |
| 314 | * must be 16B aligned; |
| 315 | * @dest_cfg: CSCN can be send to either DPIO or DPCON WQ channel |
| 316 | * @notification_mode: Mask of available options; use 'DPSECI_CGN_MODE_<X>' |
| 317 | * values |
| 318 | */ |
| 319 | struct dpseci_congestion_notification_cfg { |
| 320 | enum dpseci_congestion_unit units; |
| 321 | u32 threshold_entry; |
| 322 | u32 threshold_exit; |
| 323 | u64 message_ctx; |
| 324 | u64 message_iova; |
| 325 | struct dpseci_dest_cfg dest_cfg; |
| 326 | u16 notification_mode; |
| 327 | }; |
| 328 | |
| 329 | int dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, |
| 330 | u16 token, const struct dpseci_congestion_notification_cfg *cfg); |
| 331 | |
| 332 | int dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags, |
| 333 | u16 token, struct dpseci_congestion_notification_cfg *cfg); |
| 334 | |
| 335 | #endif /* _DPSECI_H_ */ |