1*25c896eaSAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause 2*25c896eaSAndrew Boyer * Copyright 2021-2024 Advanced Micro Devices, Inc. 3*25c896eaSAndrew Boyer */ 4*25c896eaSAndrew Boyer 5*25c896eaSAndrew Boyer #ifndef _IONIC_CRYPTO_IF_H_ 6*25c896eaSAndrew Boyer #define _IONIC_CRYPTO_IF_H_ 7*25c896eaSAndrew Boyer 8*25c896eaSAndrew Boyer #define IOCPT_DEV_INFO_SIGNATURE 0x43585660 /* 'CRPT' */ 9*25c896eaSAndrew Boyer #define IOCPT_DEV_INFO_VERSION 1 10*25c896eaSAndrew Boyer #define IOCPT_IFNAMSIZ 16 11*25c896eaSAndrew Boyer 12*25c896eaSAndrew Boyer /** 13*25c896eaSAndrew Boyer * enum iocpt_cmd_opcode - Device commands 14*25c896eaSAndrew Boyer */ 15*25c896eaSAndrew Boyer enum iocpt_cmd_opcode { 16*25c896eaSAndrew Boyer IOCPT_CMD_NOP = 0, /* D, A */ 17*25c896eaSAndrew Boyer 18*25c896eaSAndrew Boyer /* Device commands */ 19*25c896eaSAndrew Boyer IOCPT_CMD_IDENTIFY = 1, /* D */ 20*25c896eaSAndrew Boyer IOCPT_CMD_RESET = 3, /* D */ 21*25c896eaSAndrew Boyer 22*25c896eaSAndrew Boyer /* LIF commands */ 23*25c896eaSAndrew Boyer IOCPT_CMD_LIF_IDENTIFY = 20, /* D */ 24*25c896eaSAndrew Boyer IOCPT_CMD_LIF_INIT = 21, /* D */ 25*25c896eaSAndrew Boyer IOCPT_CMD_LIF_RESET = 22, /* D */ 26*25c896eaSAndrew Boyer IOCPT_CMD_LIF_GETATTR = 23, /* D, A */ 27*25c896eaSAndrew Boyer IOCPT_CMD_LIF_SETATTR = 24, /* D, A */ 28*25c896eaSAndrew Boyer 29*25c896eaSAndrew Boyer /* Queue commands */ 30*25c896eaSAndrew Boyer IOCPT_CMD_Q_IDENTIFY = 39, /* D, A */ 31*25c896eaSAndrew Boyer IOCPT_CMD_Q_INIT = 40, /* D, A */ 32*25c896eaSAndrew Boyer IOCPT_CMD_Q_CONTROL = 41, /* D, A */ 33*25c896eaSAndrew Boyer 34*25c896eaSAndrew Boyer /* Session commands */ 35*25c896eaSAndrew Boyer IOCPT_CMD_SESS_CONTROL = 45, /* D, A */ 36*25c896eaSAndrew Boyer }; 37*25c896eaSAndrew Boyer 38*25c896eaSAndrew Boyer /** 39*25c896eaSAndrew Boyer * enum iocpt_status_code - Device command return codes 40*25c896eaSAndrew Boyer */ 41*25c896eaSAndrew Boyer enum iocpt_status_code { 42*25c896eaSAndrew Boyer IOCPT_RC_SUCCESS = 0, /* Success */ 43*25c896eaSAndrew Boyer IOCPT_RC_EVERSION = 1, /* Incorrect version for request */ 44*25c896eaSAndrew Boyer IOCPT_RC_EOPCODE = 2, /* Invalid cmd opcode */ 45*25c896eaSAndrew Boyer IOCPT_RC_EIO = 3, /* I/O error */ 46*25c896eaSAndrew Boyer IOCPT_RC_EPERM = 4, /* Permission denied */ 47*25c896eaSAndrew Boyer IOCPT_RC_EQID = 5, /* Bad qid */ 48*25c896eaSAndrew Boyer IOCPT_RC_EQTYPE = 6, /* Bad qtype */ 49*25c896eaSAndrew Boyer IOCPT_RC_ENOENT = 7, /* No such element */ 50*25c896eaSAndrew Boyer IOCPT_RC_EINTR = 8, /* Operation interrupted */ 51*25c896eaSAndrew Boyer IOCPT_RC_EAGAIN = 9, /* Try again */ 52*25c896eaSAndrew Boyer IOCPT_RC_ENOMEM = 10, /* Out of memory */ 53*25c896eaSAndrew Boyer IOCPT_RC_EFAULT = 11, /* Bad address */ 54*25c896eaSAndrew Boyer IOCPT_RC_EBUSY = 12, /* Device or resource busy */ 55*25c896eaSAndrew Boyer IOCPT_RC_EEXIST = 13, /* Object already exists */ 56*25c896eaSAndrew Boyer IOCPT_RC_EINVAL = 14, /* Invalid argument */ 57*25c896eaSAndrew Boyer IOCPT_RC_ENOSPC = 15, /* No space left or alloc failure */ 58*25c896eaSAndrew Boyer IOCPT_RC_ERANGE = 16, /* Parameter out of range */ 59*25c896eaSAndrew Boyer IOCPT_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */ 60*25c896eaSAndrew Boyer IOCPT_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */ 61*25c896eaSAndrew Boyer IOCPT_RC_ENOSUPP = 19, /* Operation not supported */ 62*25c896eaSAndrew Boyer IOCPT_RC_ERROR = 29, /* Generic error */ 63*25c896eaSAndrew Boyer }; 64*25c896eaSAndrew Boyer 65*25c896eaSAndrew Boyer enum iocpt_notifyq_opcode { 66*25c896eaSAndrew Boyer IOCPT_EVENT_RESET = 1, 67*25c896eaSAndrew Boyer IOCPT_EVENT_HEARTBEAT = 2, 68*25c896eaSAndrew Boyer IOCPT_EVENT_LOG = 3, 69*25c896eaSAndrew Boyer }; 70*25c896eaSAndrew Boyer 71*25c896eaSAndrew Boyer enum iocpt_lif_type { 72*25c896eaSAndrew Boyer IOCPT_LIF_TYPE_DEFAULT = 0, 73*25c896eaSAndrew Boyer }; 74*25c896eaSAndrew Boyer 75*25c896eaSAndrew Boyer /** 76*25c896eaSAndrew Boyer * struct iocpt_admin_cmd - General admin command format 77*25c896eaSAndrew Boyer * @opcode: Opcode for the command 78*25c896eaSAndrew Boyer * @lif_index: LIF index 79*25c896eaSAndrew Boyer * @cmd_data: Opcode-specific command bytes 80*25c896eaSAndrew Boyer */ 81*25c896eaSAndrew Boyer struct iocpt_admin_cmd { 82*25c896eaSAndrew Boyer u8 opcode; 83*25c896eaSAndrew Boyer u8 rsvd; 84*25c896eaSAndrew Boyer __le16 lif_index; 85*25c896eaSAndrew Boyer u8 cmd_data[60]; 86*25c896eaSAndrew Boyer }; 87*25c896eaSAndrew Boyer 88*25c896eaSAndrew Boyer /** 89*25c896eaSAndrew Boyer * struct iocpt_admin_comp - General admin command completion format 90*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 91*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 92*25c896eaSAndrew Boyer * @cmd_data: Command-specific bytes 93*25c896eaSAndrew Boyer * @color: Color bit (Always 0 for commands issued to the 94*25c896eaSAndrew Boyer * Device Cmd Registers) 95*25c896eaSAndrew Boyer */ 96*25c896eaSAndrew Boyer struct iocpt_admin_comp { 97*25c896eaSAndrew Boyer u8 status; 98*25c896eaSAndrew Boyer u8 rsvd; 99*25c896eaSAndrew Boyer __le16 comp_index; 100*25c896eaSAndrew Boyer u8 cmd_data[11]; 101*25c896eaSAndrew Boyer u8 color; 102*25c896eaSAndrew Boyer #define IOCPT_COMP_COLOR_MASK 0x80 103*25c896eaSAndrew Boyer }; 104*25c896eaSAndrew Boyer 105*25c896eaSAndrew Boyer static inline u8 iocpt_color_match(u8 color, u8 done_color) 106*25c896eaSAndrew Boyer { 107*25c896eaSAndrew Boyer return (!!(color & IOCPT_COMP_COLOR_MASK)) == done_color; 108*25c896eaSAndrew Boyer } 109*25c896eaSAndrew Boyer 110*25c896eaSAndrew Boyer /** 111*25c896eaSAndrew Boyer * struct iocpt_nop_cmd - NOP command 112*25c896eaSAndrew Boyer * @opcode: Opcode 113*25c896eaSAndrew Boyer */ 114*25c896eaSAndrew Boyer struct iocpt_nop_cmd { 115*25c896eaSAndrew Boyer u8 opcode; 116*25c896eaSAndrew Boyer u8 rsvd[63]; 117*25c896eaSAndrew Boyer }; 118*25c896eaSAndrew Boyer 119*25c896eaSAndrew Boyer /** 120*25c896eaSAndrew Boyer * struct iocpt_nop_comp - NOP command completion 121*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 122*25c896eaSAndrew Boyer */ 123*25c896eaSAndrew Boyer struct iocpt_nop_comp { 124*25c896eaSAndrew Boyer u8 status; 125*25c896eaSAndrew Boyer u8 rsvd[15]; 126*25c896eaSAndrew Boyer }; 127*25c896eaSAndrew Boyer 128*25c896eaSAndrew Boyer #define IOCPT_IDENTITY_VERSION_1 1 129*25c896eaSAndrew Boyer 130*25c896eaSAndrew Boyer /** 131*25c896eaSAndrew Boyer * struct iocpt_dev_identify_cmd - Driver/device identify command 132*25c896eaSAndrew Boyer * @opcode: Opcode 133*25c896eaSAndrew Boyer * @ver: Highest version of identify supported by driver 134*25c896eaSAndrew Boyer */ 135*25c896eaSAndrew Boyer struct iocpt_dev_identify_cmd { 136*25c896eaSAndrew Boyer u8 opcode; 137*25c896eaSAndrew Boyer u8 ver; 138*25c896eaSAndrew Boyer u8 rsvd[62]; 139*25c896eaSAndrew Boyer }; 140*25c896eaSAndrew Boyer 141*25c896eaSAndrew Boyer /** 142*25c896eaSAndrew Boyer * struct iocpt_dev_identify_comp - Device identify command completion 143*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 144*25c896eaSAndrew Boyer * @ver: Version of identify returned by device 145*25c896eaSAndrew Boyer */ 146*25c896eaSAndrew Boyer struct iocpt_dev_identify_comp { 147*25c896eaSAndrew Boyer u8 status; 148*25c896eaSAndrew Boyer u8 ver; 149*25c896eaSAndrew Boyer u8 rsvd[14]; 150*25c896eaSAndrew Boyer }; 151*25c896eaSAndrew Boyer 152*25c896eaSAndrew Boyer /** 153*25c896eaSAndrew Boyer * struct iocpt_dev_reset_cmd - Device reset command 154*25c896eaSAndrew Boyer * Will reset all LIFs on the device. 155*25c896eaSAndrew Boyer * @opcode: Opcode 156*25c896eaSAndrew Boyer */ 157*25c896eaSAndrew Boyer struct iocpt_dev_reset_cmd { 158*25c896eaSAndrew Boyer u8 opcode; 159*25c896eaSAndrew Boyer u8 rsvd[63]; 160*25c896eaSAndrew Boyer }; 161*25c896eaSAndrew Boyer 162*25c896eaSAndrew Boyer /** 163*25c896eaSAndrew Boyer * struct iocpt_dev_reset_comp - Reset command completion 164*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 165*25c896eaSAndrew Boyer */ 166*25c896eaSAndrew Boyer struct iocpt_dev_reset_comp { 167*25c896eaSAndrew Boyer u8 status; 168*25c896eaSAndrew Boyer u8 rsvd[15]; 169*25c896eaSAndrew Boyer }; 170*25c896eaSAndrew Boyer 171*25c896eaSAndrew Boyer /** 172*25c896eaSAndrew Boyer * struct iocpt_lif_identify_cmd - LIF identify command 173*25c896eaSAndrew Boyer * @opcode: Opcode 174*25c896eaSAndrew Boyer * @type: LIF type (enum iocpt_lif_type) 175*25c896eaSAndrew Boyer * @lif_index: LIF index 176*25c896eaSAndrew Boyer * @ver: Version of identify returned by device 177*25c896eaSAndrew Boyer */ 178*25c896eaSAndrew Boyer struct iocpt_lif_identify_cmd { 179*25c896eaSAndrew Boyer u8 opcode; 180*25c896eaSAndrew Boyer u8 type; 181*25c896eaSAndrew Boyer __le16 lif_index; 182*25c896eaSAndrew Boyer u8 ver; 183*25c896eaSAndrew Boyer u8 rsvd[59]; 184*25c896eaSAndrew Boyer }; 185*25c896eaSAndrew Boyer 186*25c896eaSAndrew Boyer /** 187*25c896eaSAndrew Boyer * struct iocpt_lif_identify_comp - LIF identify command completion 188*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 189*25c896eaSAndrew Boyer * @ver: Version of identify returned by device 190*25c896eaSAndrew Boyer */ 191*25c896eaSAndrew Boyer struct iocpt_lif_identify_comp { 192*25c896eaSAndrew Boyer u8 status; 193*25c896eaSAndrew Boyer u8 ver; 194*25c896eaSAndrew Boyer u8 rsvd2[14]; 195*25c896eaSAndrew Boyer }; 196*25c896eaSAndrew Boyer 197*25c896eaSAndrew Boyer /** 198*25c896eaSAndrew Boyer * struct iocpt_lif_init_cmd - LIF init command 199*25c896eaSAndrew Boyer * @opcode: Opcode 200*25c896eaSAndrew Boyer * @type: LIF type (enum iocpt_lif_type) 201*25c896eaSAndrew Boyer * @lif_index: LIF index 202*25c896eaSAndrew Boyer * @info_pa: Destination address for LIF info (struct iocpt_lif_info) 203*25c896eaSAndrew Boyer */ 204*25c896eaSAndrew Boyer struct iocpt_lif_init_cmd { 205*25c896eaSAndrew Boyer u8 opcode; 206*25c896eaSAndrew Boyer u8 type; 207*25c896eaSAndrew Boyer __le16 lif_index; 208*25c896eaSAndrew Boyer __le32 rsvd; 209*25c896eaSAndrew Boyer __le64 info_pa; 210*25c896eaSAndrew Boyer u8 rsvd2[48]; 211*25c896eaSAndrew Boyer }; 212*25c896eaSAndrew Boyer 213*25c896eaSAndrew Boyer /** 214*25c896eaSAndrew Boyer * struct iocpt_lif_init_comp - LIF init command completion 215*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 216*25c896eaSAndrew Boyer * @hw_index: Hardware index of the initialized LIF 217*25c896eaSAndrew Boyer */ 218*25c896eaSAndrew Boyer struct iocpt_lif_init_comp { 219*25c896eaSAndrew Boyer u8 status; 220*25c896eaSAndrew Boyer u8 rsvd; 221*25c896eaSAndrew Boyer __le16 hw_index; 222*25c896eaSAndrew Boyer u8 rsvd2[12]; 223*25c896eaSAndrew Boyer }; 224*25c896eaSAndrew Boyer 225*25c896eaSAndrew Boyer /** 226*25c896eaSAndrew Boyer * struct iocpt_lif_reset_cmd - LIF reset command 227*25c896eaSAndrew Boyer * Will reset only the specified LIF. 228*25c896eaSAndrew Boyer * @opcode: Opcode 229*25c896eaSAndrew Boyer * @lif_index: LIF index 230*25c896eaSAndrew Boyer */ 231*25c896eaSAndrew Boyer struct iocpt_lif_reset_cmd { 232*25c896eaSAndrew Boyer u8 opcode; 233*25c896eaSAndrew Boyer u8 rsvd; 234*25c896eaSAndrew Boyer __le16 lif_index; 235*25c896eaSAndrew Boyer __le32 rsvd2[15]; 236*25c896eaSAndrew Boyer }; 237*25c896eaSAndrew Boyer 238*25c896eaSAndrew Boyer /** 239*25c896eaSAndrew Boyer * enum iocpt_lif_attr - List of LIF attributes 240*25c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_STATE: LIF state attribute 241*25c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_NAME: LIF name attribute 242*25c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_FEATURES: LIF features attribute 243*25c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_STATS_CTRL: LIF statistics control attribute 244*25c896eaSAndrew Boyer */ 245*25c896eaSAndrew Boyer enum iocpt_lif_attr { 246*25c896eaSAndrew Boyer IOCPT_LIF_ATTR_STATE = 0, 247*25c896eaSAndrew Boyer IOCPT_LIF_ATTR_NAME = 1, 248*25c896eaSAndrew Boyer IOCPT_LIF_ATTR_FEATURES = 4, 249*25c896eaSAndrew Boyer IOCPT_LIF_ATTR_STATS_CTRL = 6, 250*25c896eaSAndrew Boyer }; 251*25c896eaSAndrew Boyer 252*25c896eaSAndrew Boyer /** 253*25c896eaSAndrew Boyer * struct iocpt_lif_setattr_cmd - Set LIF attributes on the NIC 254*25c896eaSAndrew Boyer * @opcode: Opcode 255*25c896eaSAndrew Boyer * @attr: Attribute type (enum iocpt_lif_attr) 256*25c896eaSAndrew Boyer * @lif_index: LIF index 257*25c896eaSAndrew Boyer * @state: LIF state (enum iocpt_lif_state) 258*25c896eaSAndrew Boyer * @name: The name string, 0 terminated 259*25c896eaSAndrew Boyer * @features: Features (enum iocpt_hw_features) 260*25c896eaSAndrew Boyer * @stats_ctl: Stats control commands (enum iocpt_stats_ctl_cmd) 261*25c896eaSAndrew Boyer */ 262*25c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd { 263*25c896eaSAndrew Boyer u8 opcode; 264*25c896eaSAndrew Boyer u8 attr; 265*25c896eaSAndrew Boyer __le16 lif_index; 266*25c896eaSAndrew Boyer union { 267*25c896eaSAndrew Boyer u8 state; 268*25c896eaSAndrew Boyer char name[IOCPT_IFNAMSIZ]; 269*25c896eaSAndrew Boyer __le64 features; 270*25c896eaSAndrew Boyer u8 stats_ctl; 271*25c896eaSAndrew Boyer u8 rsvd[60]; 272*25c896eaSAndrew Boyer } __rte_packed; 273*25c896eaSAndrew Boyer }; 274*25c896eaSAndrew Boyer 275*25c896eaSAndrew Boyer /** 276*25c896eaSAndrew Boyer * struct iocpt_lif_setattr_comp - LIF set attr command completion 277*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 278*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 279*25c896eaSAndrew Boyer * @features: Features (enum iocpt_hw_features) 280*25c896eaSAndrew Boyer * @color: Color bit 281*25c896eaSAndrew Boyer */ 282*25c896eaSAndrew Boyer struct iocpt_lif_setattr_comp { 283*25c896eaSAndrew Boyer u8 status; 284*25c896eaSAndrew Boyer u8 rsvd; 285*25c896eaSAndrew Boyer __le16 comp_index; 286*25c896eaSAndrew Boyer union { 287*25c896eaSAndrew Boyer __le64 features; 288*25c896eaSAndrew Boyer u8 rsvd2[11]; 289*25c896eaSAndrew Boyer } __rte_packed; 290*25c896eaSAndrew Boyer u8 color; 291*25c896eaSAndrew Boyer }; 292*25c896eaSAndrew Boyer 293*25c896eaSAndrew Boyer /** 294*25c896eaSAndrew Boyer * struct iocpt_lif_getattr_cmd - Get LIF attributes from the NIC 295*25c896eaSAndrew Boyer * @opcode: Opcode 296*25c896eaSAndrew Boyer * @attr: Attribute type (enum iocpt_lif_attr) 297*25c896eaSAndrew Boyer * @lif_index: LIF index 298*25c896eaSAndrew Boyer */ 299*25c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd { 300*25c896eaSAndrew Boyer u8 opcode; 301*25c896eaSAndrew Boyer u8 attr; 302*25c896eaSAndrew Boyer __le16 lif_index; 303*25c896eaSAndrew Boyer u8 rsvd[60]; 304*25c896eaSAndrew Boyer }; 305*25c896eaSAndrew Boyer 306*25c896eaSAndrew Boyer /** 307*25c896eaSAndrew Boyer * struct iocpt_lif_getattr_comp - LIF get attr command completion 308*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 309*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 310*25c896eaSAndrew Boyer * @state: LIF state (enum iocpt_lif_state) 311*25c896eaSAndrew Boyer * @name: LIF name string, 0 terminated 312*25c896eaSAndrew Boyer * @features: Features (enum iocpt_hw_features) 313*25c896eaSAndrew Boyer * @color: Color bit 314*25c896eaSAndrew Boyer */ 315*25c896eaSAndrew Boyer struct iocpt_lif_getattr_comp { 316*25c896eaSAndrew Boyer u8 status; 317*25c896eaSAndrew Boyer u8 rsvd; 318*25c896eaSAndrew Boyer __le16 comp_index; 319*25c896eaSAndrew Boyer union { 320*25c896eaSAndrew Boyer u8 state; 321*25c896eaSAndrew Boyer __le64 features; 322*25c896eaSAndrew Boyer u8 rsvd2[11]; 323*25c896eaSAndrew Boyer } __rte_packed; 324*25c896eaSAndrew Boyer u8 color; 325*25c896eaSAndrew Boyer }; 326*25c896eaSAndrew Boyer 327*25c896eaSAndrew Boyer /** 328*25c896eaSAndrew Boyer * enum iocpt_logical_qtype - Logical Queue Types 329*25c896eaSAndrew Boyer * @IOCPT_QTYPE_ADMINQ: Administrative Queue 330*25c896eaSAndrew Boyer * @IOCPT_QTYPE_NOTIFYQ: Notify Queue 331*25c896eaSAndrew Boyer * @IOCPT_QTYPE_CRYPTOQ: Cryptographic Queue 332*25c896eaSAndrew Boyer * @IOCPT_QTYPE_MAX: Max queue type supported 333*25c896eaSAndrew Boyer */ 334*25c896eaSAndrew Boyer enum iocpt_logical_qtype { 335*25c896eaSAndrew Boyer IOCPT_QTYPE_ADMINQ = 0, 336*25c896eaSAndrew Boyer IOCPT_QTYPE_NOTIFYQ = 1, 337*25c896eaSAndrew Boyer IOCPT_QTYPE_CRYPTOQ = 2, 338*25c896eaSAndrew Boyer IOCPT_QTYPE_MAX = 8, 339*25c896eaSAndrew Boyer }; 340*25c896eaSAndrew Boyer 341*25c896eaSAndrew Boyer /** 342*25c896eaSAndrew Boyer * struct iocpt_q_identify_cmd - queue identify command 343*25c896eaSAndrew Boyer * @opcode: Opcode 344*25c896eaSAndrew Boyer * @type: Logical queue type (enum iocpt_logical_qtype) 345*25c896eaSAndrew Boyer * @lif_index: LIF index 346*25c896eaSAndrew Boyer * @ver: Highest queue type version that the driver supports 347*25c896eaSAndrew Boyer */ 348*25c896eaSAndrew Boyer struct iocpt_q_identify_cmd { 349*25c896eaSAndrew Boyer u8 opcode; 350*25c896eaSAndrew Boyer u8 type; 351*25c896eaSAndrew Boyer __le16 lif_index; 352*25c896eaSAndrew Boyer u8 ver; 353*25c896eaSAndrew Boyer u8 rsvd2[59]; 354*25c896eaSAndrew Boyer }; 355*25c896eaSAndrew Boyer 356*25c896eaSAndrew Boyer /** 357*25c896eaSAndrew Boyer * struct iocpt_q_identify_comp - queue identify command completion 358*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 359*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 360*25c896eaSAndrew Boyer * @ver: Queue type version that can be used with FW 361*25c896eaSAndrew Boyer */ 362*25c896eaSAndrew Boyer struct iocpt_q_identify_comp { 363*25c896eaSAndrew Boyer u8 status; 364*25c896eaSAndrew Boyer u8 rsvd; 365*25c896eaSAndrew Boyer __le16 comp_index; 366*25c896eaSAndrew Boyer u8 ver; 367*25c896eaSAndrew Boyer u8 rsvd2[11]; 368*25c896eaSAndrew Boyer }; 369*25c896eaSAndrew Boyer 370*25c896eaSAndrew Boyer /** 371*25c896eaSAndrew Boyer * struct iocpt_q_init_cmd - Queue init command 372*25c896eaSAndrew Boyer * @opcode: Opcode 373*25c896eaSAndrew Boyer * @type: Logical queue type 374*25c896eaSAndrew Boyer * @lif_index: LIF index 375*25c896eaSAndrew Boyer * @ver: Queue type version 376*25c896eaSAndrew Boyer * @index: (LIF, qtype) relative admin queue index 377*25c896eaSAndrew Boyer * @intr_index: Interrupt control register index, or Event queue index 378*25c896eaSAndrew Boyer * @pid: Process ID 379*25c896eaSAndrew Boyer * @flags: 380*25c896eaSAndrew Boyer * IRQ: Interrupt requested on completion 381*25c896eaSAndrew Boyer * ENA: Enable the queue. If ENA=0 the queue is initialized 382*25c896eaSAndrew Boyer * but remains disabled, to be later enabled with the 383*25c896eaSAndrew Boyer * Queue Enable command. If ENA=1, then queue is 384*25c896eaSAndrew Boyer * initialized and then enabled. 385*25c896eaSAndrew Boyer * SG: Enable Scatter-Gather on the queue. 386*25c896eaSAndrew Boyer * @cos: Class of service for this queue 387*25c896eaSAndrew Boyer * @ring_size: Queue ring size, encoded as a log2(size), in 388*25c896eaSAndrew Boyer * number of descriptors. The actual ring size is 389*25c896eaSAndrew Boyer * (1 << ring_size). For example, to select a ring size 390*25c896eaSAndrew Boyer * of 64 descriptors write ring_size = 6. The minimum 391*25c896eaSAndrew Boyer * ring_size value is 2 for a ring of 4 descriptors. 392*25c896eaSAndrew Boyer * The maximum ring_size value is 12 for a ring of 4k 393*25c896eaSAndrew Boyer * descriptors. Values of ring_size <2 and >12 are 394*25c896eaSAndrew Boyer * reserved. 395*25c896eaSAndrew Boyer * @ring_base: Queue ring base address 396*25c896eaSAndrew Boyer * @cq_ring_base: Completion queue ring base address 397*25c896eaSAndrew Boyer * @sg_ring_base: Scatter/Gather ring base address 398*25c896eaSAndrew Boyer */ 399*25c896eaSAndrew Boyer struct iocpt_q_init_cmd { 400*25c896eaSAndrew Boyer u8 opcode; 401*25c896eaSAndrew Boyer u8 type; 402*25c896eaSAndrew Boyer __le16 lif_index; 403*25c896eaSAndrew Boyer u8 ver; 404*25c896eaSAndrew Boyer u8 rsvd[3]; 405*25c896eaSAndrew Boyer __le32 index; 406*25c896eaSAndrew Boyer __le16 pid; 407*25c896eaSAndrew Boyer __le16 intr_index; 408*25c896eaSAndrew Boyer __le16 flags; 409*25c896eaSAndrew Boyer #define IOCPT_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 410*25c896eaSAndrew Boyer #define IOCPT_QINIT_F_ENA 0x02 /* Enable the queue */ 411*25c896eaSAndrew Boyer #define IOCPT_QINIT_F_SG 0x04 /* Enable scatter/gather on queue */ 412*25c896eaSAndrew Boyer u8 cos; 413*25c896eaSAndrew Boyer #define IOCPT_QSIZE_MIN_LG2 2 414*25c896eaSAndrew Boyer #define IOCPT_QSIZE_MAX_LG2 12 415*25c896eaSAndrew Boyer u8 ring_size; 416*25c896eaSAndrew Boyer __le64 ring_base; 417*25c896eaSAndrew Boyer __le64 cq_ring_base; 418*25c896eaSAndrew Boyer __le64 sg_ring_base; 419*25c896eaSAndrew Boyer u8 rsvd2[20]; 420*25c896eaSAndrew Boyer } __rte_packed; 421*25c896eaSAndrew Boyer 422*25c896eaSAndrew Boyer /** 423*25c896eaSAndrew Boyer * struct iocpt_q_init_comp - Queue init command completion 424*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 425*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 426*25c896eaSAndrew Boyer * @hw_index: Hardware Queue ID 427*25c896eaSAndrew Boyer * @hw_type: Hardware Queue type 428*25c896eaSAndrew Boyer * @color: Color 429*25c896eaSAndrew Boyer */ 430*25c896eaSAndrew Boyer struct iocpt_q_init_comp { 431*25c896eaSAndrew Boyer u8 status; 432*25c896eaSAndrew Boyer u8 rsvd; 433*25c896eaSAndrew Boyer __le16 comp_index; 434*25c896eaSAndrew Boyer __le32 hw_index; 435*25c896eaSAndrew Boyer u8 hw_type; 436*25c896eaSAndrew Boyer u8 rsvd2[6]; 437*25c896eaSAndrew Boyer u8 color; 438*25c896eaSAndrew Boyer }; 439*25c896eaSAndrew Boyer 440*25c896eaSAndrew Boyer enum iocpt_desc_opcode { 441*25c896eaSAndrew Boyer IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT = 0, 442*25c896eaSAndrew Boyer IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT = 1, 443*25c896eaSAndrew Boyer IOCPT_DESC_OPCODE_XTS_ENCRYPT = 2, 444*25c896eaSAndrew Boyer IOCPT_DESC_OPCODE_XTS_DECRYPT = 3, 445*25c896eaSAndrew Boyer }; 446*25c896eaSAndrew Boyer 447*25c896eaSAndrew Boyer #define IOCPT_DESC_F_AAD_VALID 0x1 448*25c896eaSAndrew Boyer 449*25c896eaSAndrew Boyer /** 450*25c896eaSAndrew Boyer * struct iocpt_desc - Crypto queue descriptor format 451*25c896eaSAndrew Boyer * @opcode: 452*25c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT: 453*25c896eaSAndrew Boyer * Perform a GCM-AES encrypt operation 454*25c896eaSAndrew Boyer * 455*25c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT: 456*25c896eaSAndrew Boyer * Perform a GCM-AES decrypt operation 457*25c896eaSAndrew Boyer * 458*25c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_XTS_ENCRYPT: 459*25c896eaSAndrew Boyer * Perform an XTS encrypt operation 460*25c896eaSAndrew Boyer * 461*25c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_XTS_DECRYPT: 462*25c896eaSAndrew Boyer * Perform an XTS decrypt operation 463*25c896eaSAndrew Boyer * @flags: 464*25c896eaSAndrew Boyer * IOCPT_DESC_F_AAD_VALID: 465*25c896eaSAndrew Boyer * Source SGL contains an AAD addr and length 466*25c896eaSAndrew Boyer * @num_src_dst_sgs: Number of scatter-gather elements in SG 467*25c896eaSAndrew Boyer * descriptor (4 bits for source, 4 bits for destination) 468*25c896eaSAndrew Boyer * @session_tag: Session tag (key index) 469*25c896eaSAndrew Boyer * @intr_ctx_addr: Completion interrupt context address 470*25c896eaSAndrew Boyer * @intr_ctx_data: Completion interrupt context data 471*25c896eaSAndrew Boyer */ 472*25c896eaSAndrew Boyer struct iocpt_crypto_desc { 473*25c896eaSAndrew Boyer uint8_t opcode; 474*25c896eaSAndrew Boyer uint8_t flags; 475*25c896eaSAndrew Boyer uint8_t num_src_dst_sgs; 476*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_MASK 0xf 477*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_SHIFT 0 478*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_MASK 0xf 479*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_SHIFT 4 480*25c896eaSAndrew Boyer uint8_t rsvd[9]; 481*25c896eaSAndrew Boyer __le32 session_tag; 482*25c896eaSAndrew Boyer __le64 intr_ctx_addr; 483*25c896eaSAndrew Boyer __le64 intr_ctx_data; 484*25c896eaSAndrew Boyer } __rte_packed; 485*25c896eaSAndrew Boyer 486*25c896eaSAndrew Boyer static inline uint8_t iocpt_encode_nsge_src_dst(uint8_t src, uint8_t dst) 487*25c896eaSAndrew Boyer { 488*25c896eaSAndrew Boyer uint8_t nsge_src_dst; 489*25c896eaSAndrew Boyer 490*25c896eaSAndrew Boyer nsge_src_dst = (src & IOCPT_DESC_NSGE_SRC_MASK) << 491*25c896eaSAndrew Boyer IOCPT_DESC_NSGE_SRC_SHIFT; 492*25c896eaSAndrew Boyer nsge_src_dst |= (dst & IOCPT_DESC_NSGE_DST_MASK) << 493*25c896eaSAndrew Boyer IOCPT_DESC_NSGE_DST_SHIFT; 494*25c896eaSAndrew Boyer 495*25c896eaSAndrew Boyer return nsge_src_dst; 496*25c896eaSAndrew Boyer }; 497*25c896eaSAndrew Boyer 498*25c896eaSAndrew Boyer static inline void iocpt_decode_nsge_src_dst(uint8_t nsge_src_dst, 499*25c896eaSAndrew Boyer uint8_t *src, uint8_t *dst) 500*25c896eaSAndrew Boyer { 501*25c896eaSAndrew Boyer *src = (nsge_src_dst >> IOCPT_DESC_NSGE_SRC_SHIFT) & 502*25c896eaSAndrew Boyer IOCPT_DESC_NSGE_SRC_MASK; 503*25c896eaSAndrew Boyer *dst = (nsge_src_dst >> IOCPT_DESC_NSGE_DST_SHIFT) & 504*25c896eaSAndrew Boyer IOCPT_DESC_NSGE_DST_MASK; 505*25c896eaSAndrew Boyer }; 506*25c896eaSAndrew Boyer 507*25c896eaSAndrew Boyer /** 508*25c896eaSAndrew Boyer * struct iocpt_crypto_sg_elem - Crypto scatter-gather (SG) descriptor element 509*25c896eaSAndrew Boyer * @addr: DMA address of SG element data buffer 510*25c896eaSAndrew Boyer * @len: Length of SG element data buffer, in bytes 511*25c896eaSAndrew Boyer */ 512*25c896eaSAndrew Boyer struct iocpt_crypto_sg_elem { 513*25c896eaSAndrew Boyer __le64 addr; 514*25c896eaSAndrew Boyer __le16 len; 515*25c896eaSAndrew Boyer uint8_t rsvd[6]; 516*25c896eaSAndrew Boyer }; 517*25c896eaSAndrew Boyer 518*25c896eaSAndrew Boyer /** 519*25c896eaSAndrew Boyer * struct iocpt_crypto_sg_desc - Crypto scatter-gather (SG) list 520*25c896eaSAndrew Boyer * @src_elems: Source SG elements; also destination in IP case 521*25c896eaSAndrew Boyer * AES_GCM: 522*25c896eaSAndrew Boyer * SGE0: Nonce 523*25c896eaSAndrew Boyer * SGE1: AAD (see IOCPT_DESC_F_AAD_VALID) 524*25c896eaSAndrew Boyer * SGE2 to SGE(N): Payload 525*25c896eaSAndrew Boyer * SGE(N+1): Auth tag 526*25c896eaSAndrew Boyer * @dst_elems: Destination SG elements for OOP case; unused in IP case 527*25c896eaSAndrew Boyer */ 528*25c896eaSAndrew Boyer struct iocpt_crypto_sg_desc { 529*25c896eaSAndrew Boyer #define IOCPT_CRYPTO_MAX_SG_ELEMS 8 530*25c896eaSAndrew Boyer #define IOCPT_CRYPTO_NONCE_ELEM 0 531*25c896eaSAndrew Boyer #define IOCPT_CRYPTO_AAD_ELEM 1 532*25c896eaSAndrew Boyer struct iocpt_crypto_sg_elem src_elems[IOCPT_CRYPTO_MAX_SG_ELEMS]; 533*25c896eaSAndrew Boyer struct iocpt_crypto_sg_elem dst_elems[IOCPT_CRYPTO_MAX_SG_ELEMS]; 534*25c896eaSAndrew Boyer }; 535*25c896eaSAndrew Boyer 536*25c896eaSAndrew Boyer /** 537*25c896eaSAndrew Boyer * struct iocpt_crypto_comp - Crypto queue completion descriptor 538*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 539*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 540*25c896eaSAndrew Boyer * @color: Color bit 541*25c896eaSAndrew Boyer */ 542*25c896eaSAndrew Boyer struct iocpt_crypto_comp { 543*25c896eaSAndrew Boyer #define IOCPT_COMP_SUCCESS 0 544*25c896eaSAndrew Boyer #define IOCPT_COMP_INVAL_OPCODE_ERROR 1 545*25c896eaSAndrew Boyer #define IOCPT_COMP_UNSUPP_OPCODE_ERROR 2 546*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_SG_ERROR 3 547*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_DST_SG_ERROR 4 548*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_DST_LEN_MISMATCH 5 549*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HW_QAVAIL_ERROR 6 550*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_AUTH_VERIFY_ERROR 7 551*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_OTHER_VERIFY_ERROR 8 552*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_PI_MODE_CHKSUM_ERROR 9 553*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HARDWARE_ERROR 10 554*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_KEY_IDX_ERROR 11 555*25c896eaSAndrew Boyer u8 status; 556*25c896eaSAndrew Boyer u8 rsvd; 557*25c896eaSAndrew Boyer __le16 comp_index; 558*25c896eaSAndrew Boyer u8 rsvd2[11]; 559*25c896eaSAndrew Boyer u8 color; 560*25c896eaSAndrew Boyer }; 561*25c896eaSAndrew Boyer 562*25c896eaSAndrew Boyer /** 563*25c896eaSAndrew Boyer * enum iocpt_hw_features - Feature flags supported by hardware 564*25c896eaSAndrew Boyer * @IOCPT_HW_SYM: Symmetric crypto operations 565*25c896eaSAndrew Boyer * @IOCPT_HW_ASYM: Asymmetric crypto operations 566*25c896eaSAndrew Boyer * @IOCPT_HW_CHAIN: Chained crypto operations 567*25c896eaSAndrew Boyer * @IOCPT_HW_IP: In-Place (destination same as source) 568*25c896eaSAndrew Boyer * @IOCPT_HW_OOP: Out-Of-Place (destination differs from source) 569*25c896eaSAndrew Boyer */ 570*25c896eaSAndrew Boyer enum iocpt_hw_features { 571*25c896eaSAndrew Boyer IOCPT_HW_SYM = BIT(0), 572*25c896eaSAndrew Boyer IOCPT_HW_ASYM = BIT(1), 573*25c896eaSAndrew Boyer IOCPT_HW_CHAIN = BIT(2), 574*25c896eaSAndrew Boyer IOCPT_HW_IP = BIT(3), 575*25c896eaSAndrew Boyer IOCPT_HW_OOP = BIT(4), 576*25c896eaSAndrew Boyer }; 577*25c896eaSAndrew Boyer 578*25c896eaSAndrew Boyer /** 579*25c896eaSAndrew Boyer * struct iocpt_q_control_cmd - Queue control command 580*25c896eaSAndrew Boyer * @opcode: Opcode 581*25c896eaSAndrew Boyer * @type: Queue type 582*25c896eaSAndrew Boyer * @lif_index: LIF index 583*25c896eaSAndrew Boyer * @index: Queue index 584*25c896eaSAndrew Boyer * @oper: Operation (enum iocpt_q_control_oper) 585*25c896eaSAndrew Boyer */ 586*25c896eaSAndrew Boyer struct iocpt_q_control_cmd { 587*25c896eaSAndrew Boyer u8 opcode; 588*25c896eaSAndrew Boyer u8 type; 589*25c896eaSAndrew Boyer __le16 lif_index; 590*25c896eaSAndrew Boyer __le32 index; 591*25c896eaSAndrew Boyer u8 oper; 592*25c896eaSAndrew Boyer u8 rsvd2[55]; 593*25c896eaSAndrew Boyer }; 594*25c896eaSAndrew Boyer 595*25c896eaSAndrew Boyer enum iocpt_q_control_oper { 596*25c896eaSAndrew Boyer IOCPT_Q_DISABLE = 0, 597*25c896eaSAndrew Boyer IOCPT_Q_ENABLE = 1, 598*25c896eaSAndrew Boyer }; 599*25c896eaSAndrew Boyer 600*25c896eaSAndrew Boyer /* NB: It will take 64 transfers to update a 2048B key */ 601*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MIN 16 602*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_SYMM 32 603*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_ASYM 2048 604*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_LEN 32 605*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_SHFT 5 606*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_CNT \ 607*25c896eaSAndrew Boyer (IOCPT_SESS_KEY_LEN_MAX_SYMM >> IOCPT_SESS_KEY_SEG_SHFT) 608*25c896eaSAndrew Boyer 609*25c896eaSAndrew Boyer enum iocpt_sess_type { 610*25c896eaSAndrew Boyer IOCPT_SESS_NONE = 0, 611*25c896eaSAndrew Boyer IOCPT_SESS_AEAD_AES_GCM = 1, 612*25c896eaSAndrew Boyer }; 613*25c896eaSAndrew Boyer 614*25c896eaSAndrew Boyer enum iocpt_sess_control_oper { 615*25c896eaSAndrew Boyer IOCPT_SESS_INIT = 0, 616*25c896eaSAndrew Boyer IOCPT_SESS_UPDATE_KEY = 2, 617*25c896eaSAndrew Boyer IOCPT_SESS_DISABLE = 3, 618*25c896eaSAndrew Boyer }; 619*25c896eaSAndrew Boyer 620*25c896eaSAndrew Boyer /** 621*25c896eaSAndrew Boyer * struct iocpt_sess_control_cmd - Session control command 622*25c896eaSAndrew Boyer * @opcode: Opcode 623*25c896eaSAndrew Boyer * @type: Session type (enum iocpt_sess_type) 624*25c896eaSAndrew Boyer * @lif_index: LIF index 625*25c896eaSAndrew Boyer * @oper: Operation (enum iocpt_sess_control_oper) 626*25c896eaSAndrew Boyer * @flags: 627*25c896eaSAndrew Boyer * END: Indicates that this is the final segment of the key. 628*25c896eaSAndrew Boyer * When this flag is set, a write will be triggered from the 629*25c896eaSAndrew Boyer * controller's memory into the dedicated key-storage area. 630*25c896eaSAndrew Boyer * @key_len: Crypto key length in bytes 631*25c896eaSAndrew Boyer * @index: Session index, as allocated by PMD 632*25c896eaSAndrew Boyer * @key_seg_len: Crypto key segment length in bytes 633*25c896eaSAndrew Boyer * @key_seg_idx: Crypto key segment index 634*25c896eaSAndrew Boyer * @key: Crypto key 635*25c896eaSAndrew Boyer */ 636*25c896eaSAndrew Boyer struct iocpt_sess_control_cmd { 637*25c896eaSAndrew Boyer u8 opcode; 638*25c896eaSAndrew Boyer u8 type; 639*25c896eaSAndrew Boyer __le16 lif_index; 640*25c896eaSAndrew Boyer u8 oper; 641*25c896eaSAndrew Boyer u8 flags; 642*25c896eaSAndrew Boyer #define IOCPT_SCTL_F_END 0x01 /* Final segment of key */ 643*25c896eaSAndrew Boyer __le16 key_len; 644*25c896eaSAndrew Boyer __le32 index; 645*25c896eaSAndrew Boyer u8 key_seg_len; 646*25c896eaSAndrew Boyer u8 key_seg_idx; 647*25c896eaSAndrew Boyer u8 rsvd[18]; 648*25c896eaSAndrew Boyer u8 key[IOCPT_SESS_KEY_SEG_LEN]; 649*25c896eaSAndrew Boyer }; 650*25c896eaSAndrew Boyer 651*25c896eaSAndrew Boyer /** 652*25c896eaSAndrew Boyer * struct iocpt_sess_control_comp - Session control command completion 653*25c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 654*25c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 655*25c896eaSAndrew Boyer * @index: Session index 656*25c896eaSAndrew Boyer * @hw_type: Hardware Session type 657*25c896eaSAndrew Boyer * @color: Color 658*25c896eaSAndrew Boyer */ 659*25c896eaSAndrew Boyer struct iocpt_sess_control_comp { 660*25c896eaSAndrew Boyer u8 status; 661*25c896eaSAndrew Boyer u8 rsvd; 662*25c896eaSAndrew Boyer __le16 comp_index; 663*25c896eaSAndrew Boyer __le32 index; 664*25c896eaSAndrew Boyer u8 hw_type; 665*25c896eaSAndrew Boyer u8 rsvd2[6]; 666*25c896eaSAndrew Boyer u8 color; 667*25c896eaSAndrew Boyer }; 668*25c896eaSAndrew Boyer 669*25c896eaSAndrew Boyer /** 670*25c896eaSAndrew Boyer * enum iocpt_stats_ctl_cmd - List of commands for stats control 671*25c896eaSAndrew Boyer * @IOCPT_STATS_CTL_RESET: Reset statistics 672*25c896eaSAndrew Boyer */ 673*25c896eaSAndrew Boyer enum iocpt_stats_ctl_cmd { 674*25c896eaSAndrew Boyer IOCPT_STATS_CTL_RESET = 0, 675*25c896eaSAndrew Boyer }; 676*25c896eaSAndrew Boyer 677*25c896eaSAndrew Boyer /** 678*25c896eaSAndrew Boyer * struct iocpt_dev_status - Device status register 679*25c896eaSAndrew Boyer * @eid: most recent NotifyQ event id 680*25c896eaSAndrew Boyer */ 681*25c896eaSAndrew Boyer struct iocpt_dev_status { 682*25c896eaSAndrew Boyer __le64 eid; 683*25c896eaSAndrew Boyer u8 rsvd2[56]; 684*25c896eaSAndrew Boyer }; 685*25c896eaSAndrew Boyer 686*25c896eaSAndrew Boyer enum iocpt_dev_state { 687*25c896eaSAndrew Boyer IOCPT_DEV_DISABLE = 0, 688*25c896eaSAndrew Boyer IOCPT_DEV_ENABLE = 1, 689*25c896eaSAndrew Boyer IOCPT_DEV_HANG_RESET = 2, 690*25c896eaSAndrew Boyer }; 691*25c896eaSAndrew Boyer 692*25c896eaSAndrew Boyer /** 693*25c896eaSAndrew Boyer * enum iocpt_dev_attr - List of device attributes 694*25c896eaSAndrew Boyer * @IOCPT_DEV_ATTR_STATE: Device state attribute 695*25c896eaSAndrew Boyer * @IOCPT_DEV_ATTR_NAME: Device name attribute 696*25c896eaSAndrew Boyer * @IOCPT_DEV_ATTR_FEATURES: Device feature attributes 697*25c896eaSAndrew Boyer */ 698*25c896eaSAndrew Boyer enum iocpt_dev_attr { 699*25c896eaSAndrew Boyer IOCPT_DEV_ATTR_STATE = 0, 700*25c896eaSAndrew Boyer IOCPT_DEV_ATTR_NAME = 1, 701*25c896eaSAndrew Boyer IOCPT_DEV_ATTR_FEATURES = 2, 702*25c896eaSAndrew Boyer }; 703*25c896eaSAndrew Boyer 704*25c896eaSAndrew Boyer /** 705*25c896eaSAndrew Boyer * struct iocpt_notify_event - Generic event reporting structure 706*25c896eaSAndrew Boyer * @eid: event number 707*25c896eaSAndrew Boyer * @ecode: event code 708*25c896eaSAndrew Boyer * @data: unspecified data about the event 709*25c896eaSAndrew Boyer * 710*25c896eaSAndrew Boyer * This is the generic event report struct from which the other 711*25c896eaSAndrew Boyer * actual events will be formed. 712*25c896eaSAndrew Boyer */ 713*25c896eaSAndrew Boyer struct iocpt_notify_event { 714*25c896eaSAndrew Boyer __le64 eid; 715*25c896eaSAndrew Boyer __le16 ecode; 716*25c896eaSAndrew Boyer u8 data[54]; 717*25c896eaSAndrew Boyer }; 718*25c896eaSAndrew Boyer 719*25c896eaSAndrew Boyer /** 720*25c896eaSAndrew Boyer * struct iocpt_reset_event - Reset event notification 721*25c896eaSAndrew Boyer * @eid: event number 722*25c896eaSAndrew Boyer * @ecode: event code = IOCPT_EVENT_RESET 723*25c896eaSAndrew Boyer * @reset_code: reset type 724*25c896eaSAndrew Boyer * @state: 0=pending, 1=complete, 2=error 725*25c896eaSAndrew Boyer * 726*25c896eaSAndrew Boyer * Sent when the NIC or some subsystem is going to be or 727*25c896eaSAndrew Boyer * has been reset. 728*25c896eaSAndrew Boyer */ 729*25c896eaSAndrew Boyer struct iocpt_reset_event { 730*25c896eaSAndrew Boyer __le64 eid; 731*25c896eaSAndrew Boyer __le16 ecode; 732*25c896eaSAndrew Boyer u8 reset_code; 733*25c896eaSAndrew Boyer u8 state; 734*25c896eaSAndrew Boyer u8 rsvd[52]; 735*25c896eaSAndrew Boyer }; 736*25c896eaSAndrew Boyer 737*25c896eaSAndrew Boyer /** 738*25c896eaSAndrew Boyer * struct iocpt_heartbeat_event - Sent periodically by NIC to indicate health 739*25c896eaSAndrew Boyer * @eid: event number 740*25c896eaSAndrew Boyer * @ecode: event code = IOCPT_EVENT_HEARTBEAT 741*25c896eaSAndrew Boyer */ 742*25c896eaSAndrew Boyer struct iocpt_heartbeat_event { 743*25c896eaSAndrew Boyer __le64 eid; 744*25c896eaSAndrew Boyer __le16 ecode; 745*25c896eaSAndrew Boyer u8 rsvd[54]; 746*25c896eaSAndrew Boyer }; 747*25c896eaSAndrew Boyer 748*25c896eaSAndrew Boyer /** 749*25c896eaSAndrew Boyer * struct iocpt_log_event - Sent to notify the driver of an internal error 750*25c896eaSAndrew Boyer * @eid: event number 751*25c896eaSAndrew Boyer * @ecode: event code = IOCPT_EVENT_LOG 752*25c896eaSAndrew Boyer * @data: log data 753*25c896eaSAndrew Boyer */ 754*25c896eaSAndrew Boyer struct iocpt_log_event { 755*25c896eaSAndrew Boyer __le64 eid; 756*25c896eaSAndrew Boyer __le16 ecode; 757*25c896eaSAndrew Boyer u8 data[54]; 758*25c896eaSAndrew Boyer }; 759*25c896eaSAndrew Boyer 760*25c896eaSAndrew Boyer /** 761*25c896eaSAndrew Boyer * union iocpt_lif_config - LIF configuration 762*25c896eaSAndrew Boyer * @state: LIF state (enum iocpt_lif_state) 763*25c896eaSAndrew Boyer * @name: LIF name 764*25c896eaSAndrew Boyer * @features: LIF features active (enum iocpt_hw_features) 765*25c896eaSAndrew Boyer * @queue_count: Queue counts per queue-type 766*25c896eaSAndrew Boyer */ 767*25c896eaSAndrew Boyer union iocpt_lif_config { 768*25c896eaSAndrew Boyer struct { 769*25c896eaSAndrew Boyer u8 state; 770*25c896eaSAndrew Boyer u8 rsvd[3]; 771*25c896eaSAndrew Boyer char name[IOCPT_IFNAMSIZ]; 772*25c896eaSAndrew Boyer u8 rsvd2[12]; 773*25c896eaSAndrew Boyer __le64 features; 774*25c896eaSAndrew Boyer __le32 queue_count[IOCPT_QTYPE_MAX]; 775*25c896eaSAndrew Boyer } __rte_packed; 776*25c896eaSAndrew Boyer __le32 words[56]; 777*25c896eaSAndrew Boyer }; 778*25c896eaSAndrew Boyer 779*25c896eaSAndrew Boyer /** 780*25c896eaSAndrew Boyer * struct iocpt_lif_status - LIF status register 781*25c896eaSAndrew Boyer * @eid: most recent NotifyQ event id 782*25c896eaSAndrew Boyer */ 783*25c896eaSAndrew Boyer struct iocpt_lif_status { 784*25c896eaSAndrew Boyer __le64 eid; 785*25c896eaSAndrew Boyer u8 rsvd[56]; 786*25c896eaSAndrew Boyer }; 787*25c896eaSAndrew Boyer 788*25c896eaSAndrew Boyer /** 789*25c896eaSAndrew Boyer * struct iocpt_lif_info - LIF info structure 790*25c896eaSAndrew Boyer * @config: LIF configuration structure 791*25c896eaSAndrew Boyer * @status: LIF status structure 792*25c896eaSAndrew Boyer * @stats: LIF statistics structure 793*25c896eaSAndrew Boyer */ 794*25c896eaSAndrew Boyer struct iocpt_lif_info { 795*25c896eaSAndrew Boyer union iocpt_lif_config config; 796*25c896eaSAndrew Boyer struct iocpt_lif_status status; 797*25c896eaSAndrew Boyer }; 798*25c896eaSAndrew Boyer 799*25c896eaSAndrew Boyer union iocpt_dev_cmd { 800*25c896eaSAndrew Boyer u32 words[16]; 801*25c896eaSAndrew Boyer struct iocpt_admin_cmd cmd; 802*25c896eaSAndrew Boyer struct iocpt_nop_cmd nop; 803*25c896eaSAndrew Boyer 804*25c896eaSAndrew Boyer struct iocpt_dev_identify_cmd identify; 805*25c896eaSAndrew Boyer struct iocpt_dev_reset_cmd reset; 806*25c896eaSAndrew Boyer 807*25c896eaSAndrew Boyer struct iocpt_lif_identify_cmd lif_identify; 808*25c896eaSAndrew Boyer struct iocpt_lif_init_cmd lif_init; 809*25c896eaSAndrew Boyer struct iocpt_lif_reset_cmd lif_reset; 810*25c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd lif_getattr; 811*25c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd lif_setattr; 812*25c896eaSAndrew Boyer 813*25c896eaSAndrew Boyer struct iocpt_q_identify_cmd q_identify; 814*25c896eaSAndrew Boyer struct iocpt_q_init_cmd q_init; 815*25c896eaSAndrew Boyer struct iocpt_q_control_cmd q_control; 816*25c896eaSAndrew Boyer 817*25c896eaSAndrew Boyer struct iocpt_sess_control_cmd sess_control; 818*25c896eaSAndrew Boyer }; 819*25c896eaSAndrew Boyer 820*25c896eaSAndrew Boyer union iocpt_dev_cmd_comp { 821*25c896eaSAndrew Boyer u32 words[4]; 822*25c896eaSAndrew Boyer u8 status; 823*25c896eaSAndrew Boyer struct iocpt_admin_comp comp; 824*25c896eaSAndrew Boyer struct iocpt_nop_comp nop; 825*25c896eaSAndrew Boyer 826*25c896eaSAndrew Boyer struct iocpt_dev_identify_comp identify; 827*25c896eaSAndrew Boyer struct iocpt_dev_reset_comp reset; 828*25c896eaSAndrew Boyer 829*25c896eaSAndrew Boyer struct iocpt_lif_identify_comp lif_identify; 830*25c896eaSAndrew Boyer struct iocpt_lif_init_comp lif_init; 831*25c896eaSAndrew Boyer struct iocpt_lif_getattr_comp lif_getattr; 832*25c896eaSAndrew Boyer struct iocpt_lif_setattr_comp lif_setattr; 833*25c896eaSAndrew Boyer 834*25c896eaSAndrew Boyer struct iocpt_q_identify_comp q_identify; 835*25c896eaSAndrew Boyer struct iocpt_q_init_comp q_init; 836*25c896eaSAndrew Boyer 837*25c896eaSAndrew Boyer struct iocpt_sess_control_comp sess_control; 838*25c896eaSAndrew Boyer }; 839*25c896eaSAndrew Boyer 840*25c896eaSAndrew Boyer /** 841*25c896eaSAndrew Boyer * union iocpt_dev_info_regs - Device info register format (read-only) 842*25c896eaSAndrew Boyer * @signature: Signature value of 0x43585660 ('CRPT') 843*25c896eaSAndrew Boyer * @version: Current version of info 844*25c896eaSAndrew Boyer * @asic_type: Asic type 845*25c896eaSAndrew Boyer * @asic_rev: Asic revision 846*25c896eaSAndrew Boyer * @fw_status: Firmware status 847*25c896eaSAndrew Boyer * @fw_heartbeat: Firmware heartbeat counter 848*25c896eaSAndrew Boyer * @serial_num: Serial number 849*25c896eaSAndrew Boyer * @fw_version: Firmware version 850*25c896eaSAndrew Boyer */ 851*25c896eaSAndrew Boyer union iocpt_dev_info_regs { 852*25c896eaSAndrew Boyer #define IOCPT_FWVERS_BUFLEN 32 853*25c896eaSAndrew Boyer #define IOCPT_SERIAL_BUFLEN 32 854*25c896eaSAndrew Boyer struct { 855*25c896eaSAndrew Boyer u32 signature; 856*25c896eaSAndrew Boyer u8 version; 857*25c896eaSAndrew Boyer u8 asic_type; 858*25c896eaSAndrew Boyer u8 asic_rev; 859*25c896eaSAndrew Boyer #define IOCPT_FW_STS_F_RUNNING 0x1 860*25c896eaSAndrew Boyer u8 fw_status; 861*25c896eaSAndrew Boyer u32 fw_heartbeat; 862*25c896eaSAndrew Boyer char fw_version[IOCPT_FWVERS_BUFLEN]; 863*25c896eaSAndrew Boyer char serial_num[IOCPT_SERIAL_BUFLEN]; 864*25c896eaSAndrew Boyer }; 865*25c896eaSAndrew Boyer u32 words[512]; 866*25c896eaSAndrew Boyer }; 867*25c896eaSAndrew Boyer 868*25c896eaSAndrew Boyer /** 869*25c896eaSAndrew Boyer * union iocpt_dev_cmd_regs - Device command register format (read-write) 870*25c896eaSAndrew Boyer * @doorbell: Device Cmd Doorbell, write-only 871*25c896eaSAndrew Boyer * Write a 1 to signal device to process cmd, 872*25c896eaSAndrew Boyer * poll done for completion. 873*25c896eaSAndrew Boyer * @done: Done indicator, bit 0 == 1 when command is complete 874*25c896eaSAndrew Boyer * @cmd: Opcode-specific command bytes 875*25c896eaSAndrew Boyer * @comp: Opcode-specific response bytes 876*25c896eaSAndrew Boyer * @data: Opcode-specific side-data 877*25c896eaSAndrew Boyer */ 878*25c896eaSAndrew Boyer union iocpt_dev_cmd_regs { 879*25c896eaSAndrew Boyer struct { 880*25c896eaSAndrew Boyer u32 doorbell; 881*25c896eaSAndrew Boyer u32 done; 882*25c896eaSAndrew Boyer union iocpt_dev_cmd cmd; 883*25c896eaSAndrew Boyer union iocpt_dev_cmd_comp comp; 884*25c896eaSAndrew Boyer u8 rsvd[48]; 885*25c896eaSAndrew Boyer u32 data[478]; 886*25c896eaSAndrew Boyer } __rte_packed; 887*25c896eaSAndrew Boyer u32 words[512]; 888*25c896eaSAndrew Boyer }; 889*25c896eaSAndrew Boyer 890*25c896eaSAndrew Boyer /** 891*25c896eaSAndrew Boyer * union iocpt_dev_regs - Device register format for bar 0 page 0 892*25c896eaSAndrew Boyer * @info: Device info registers 893*25c896eaSAndrew Boyer * @devcmd: Device command registers 894*25c896eaSAndrew Boyer */ 895*25c896eaSAndrew Boyer union iocpt_dev_regs { 896*25c896eaSAndrew Boyer struct { 897*25c896eaSAndrew Boyer union iocpt_dev_info_regs info; 898*25c896eaSAndrew Boyer union iocpt_dev_cmd_regs devcmd; 899*25c896eaSAndrew Boyer } __rte_packed; 900*25c896eaSAndrew Boyer __le32 words[1024]; 901*25c896eaSAndrew Boyer }; 902*25c896eaSAndrew Boyer 903*25c896eaSAndrew Boyer union iocpt_adminq_cmd { 904*25c896eaSAndrew Boyer struct iocpt_admin_cmd cmd; 905*25c896eaSAndrew Boyer struct iocpt_nop_cmd nop; 906*25c896eaSAndrew Boyer struct iocpt_q_identify_cmd q_identify; 907*25c896eaSAndrew Boyer struct iocpt_q_init_cmd q_init; 908*25c896eaSAndrew Boyer struct iocpt_q_control_cmd q_control; 909*25c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd lif_setattr; 910*25c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd lif_getattr; 911*25c896eaSAndrew Boyer struct iocpt_sess_control_cmd sess_control; 912*25c896eaSAndrew Boyer }; 913*25c896eaSAndrew Boyer 914*25c896eaSAndrew Boyer union iocpt_adminq_comp { 915*25c896eaSAndrew Boyer struct iocpt_admin_comp comp; 916*25c896eaSAndrew Boyer struct iocpt_nop_comp nop; 917*25c896eaSAndrew Boyer struct iocpt_q_identify_comp q_identify; 918*25c896eaSAndrew Boyer struct iocpt_q_init_comp q_init; 919*25c896eaSAndrew Boyer struct iocpt_lif_setattr_comp lif_setattr; 920*25c896eaSAndrew Boyer struct iocpt_lif_getattr_comp lif_getattr; 921*25c896eaSAndrew Boyer struct iocpt_sess_control_comp sess_control; 922*25c896eaSAndrew Boyer }; 923*25c896eaSAndrew Boyer 924*25c896eaSAndrew Boyer union iocpt_notify_comp { 925*25c896eaSAndrew Boyer struct iocpt_notify_event event; 926*25c896eaSAndrew Boyer struct iocpt_reset_event reset; 927*25c896eaSAndrew Boyer struct iocpt_heartbeat_event heartbeat; 928*25c896eaSAndrew Boyer struct iocpt_log_event log; 929*25c896eaSAndrew Boyer }; 930*25c896eaSAndrew Boyer 931*25c896eaSAndrew Boyer /** 932*25c896eaSAndrew Boyer * union iocpt_dev_identity - device identity information 933*25c896eaSAndrew Boyer * @version: Version of device identify 934*25c896eaSAndrew Boyer * @type: Identify type (0 for now) 935*25c896eaSAndrew Boyer * @state: Device state 936*25c896eaSAndrew Boyer * @nlifs: Number of LIFs provisioned 937*25c896eaSAndrew Boyer * @nintrs: Number of interrupts provisioned 938*25c896eaSAndrew Boyer * @ndbpgs_per_lif: Number of doorbell pages per LIF 939*25c896eaSAndrew Boyer * @intr_coal_mult: Interrupt coalescing multiplication factor 940*25c896eaSAndrew Boyer * Scale user-supplied interrupt coalescing 941*25c896eaSAndrew Boyer * value in usecs to device units using: 942*25c896eaSAndrew Boyer * device units = usecs * mult / div 943*25c896eaSAndrew Boyer * @intr_coal_div: Interrupt coalescing division factor 944*25c896eaSAndrew Boyer * Scale user-supplied interrupt coalescing 945*25c896eaSAndrew Boyer * value in usecs to device units using: 946*25c896eaSAndrew Boyer * device units = usecs * mult / div 947*25c896eaSAndrew Boyer */ 948*25c896eaSAndrew Boyer union iocpt_dev_identity { 949*25c896eaSAndrew Boyer struct { 950*25c896eaSAndrew Boyer u8 version; 951*25c896eaSAndrew Boyer u8 type; 952*25c896eaSAndrew Boyer u8 state; 953*25c896eaSAndrew Boyer u8 rsvd; 954*25c896eaSAndrew Boyer __le32 nlifs; 955*25c896eaSAndrew Boyer __le32 nintrs; 956*25c896eaSAndrew Boyer __le32 ndbpgs_per_lif; 957*25c896eaSAndrew Boyer __le32 intr_coal_mult; 958*25c896eaSAndrew Boyer __le32 intr_coal_div; 959*25c896eaSAndrew Boyer u8 rsvd2[8]; 960*25c896eaSAndrew Boyer }; 961*25c896eaSAndrew Boyer __le32 words[8]; 962*25c896eaSAndrew Boyer }; 963*25c896eaSAndrew Boyer 964*25c896eaSAndrew Boyer /** 965*25c896eaSAndrew Boyer * union iocpt_lif_identity - LIF identity information (type-specific) 966*25c896eaSAndrew Boyer * 967*25c896eaSAndrew Boyer * @features: LIF features (see enum iocpt_hw_features) 968*25c896eaSAndrew Boyer * @version: Identify structure version 969*25c896eaSAndrew Boyer * @hw_index: LIF hardware index 970*25c896eaSAndrew Boyer * @max_nb_sessions: Maximum number of sessions supported 971*25c896eaSAndrew Boyer * @config: LIF config struct with features, q counts 972*25c896eaSAndrew Boyer */ 973*25c896eaSAndrew Boyer union iocpt_lif_identity { 974*25c896eaSAndrew Boyer struct { 975*25c896eaSAndrew Boyer __le64 features; 976*25c896eaSAndrew Boyer 977*25c896eaSAndrew Boyer u8 version; 978*25c896eaSAndrew Boyer u8 hw_index; 979*25c896eaSAndrew Boyer u8 rsvd[2]; 980*25c896eaSAndrew Boyer __le32 max_nb_sessions; 981*25c896eaSAndrew Boyer u8 rsvd2[120]; 982*25c896eaSAndrew Boyer union iocpt_lif_config config; 983*25c896eaSAndrew Boyer } __rte_packed; 984*25c896eaSAndrew Boyer __le32 words[90]; 985*25c896eaSAndrew Boyer }; 986*25c896eaSAndrew Boyer 987*25c896eaSAndrew Boyer /** 988*25c896eaSAndrew Boyer * union iocpt_q_identity - queue identity information 989*25c896eaSAndrew Boyer * @version: Queue type version that can be used with FW 990*25c896eaSAndrew Boyer * @supported: Bitfield of queue versions, first bit = ver 0 991*25c896eaSAndrew Boyer * @features: Queue features 992*25c896eaSAndrew Boyer * @desc_sz: Descriptor size 993*25c896eaSAndrew Boyer * @comp_sz: Completion descriptor size 994*25c896eaSAndrew Boyer * @sg_desc_sz: Scatter/Gather descriptor size 995*25c896eaSAndrew Boyer * @max_sg_elems: Maximum number of Scatter/Gather elements 996*25c896eaSAndrew Boyer * @sg_desc_stride: Number of Scatter/Gather elements per descriptor 997*25c896eaSAndrew Boyer */ 998*25c896eaSAndrew Boyer union iocpt_q_identity { 999*25c896eaSAndrew Boyer struct { 1000*25c896eaSAndrew Boyer u8 version; 1001*25c896eaSAndrew Boyer u8 supported; 1002*25c896eaSAndrew Boyer u8 rsvd[6]; 1003*25c896eaSAndrew Boyer #define IOCPT_QIDENT_F_CQ 0x01 /* queue has completion ring */ 1004*25c896eaSAndrew Boyer #define IOCPT_QIDENT_F_SG 0x02 /* queue has scatter/gather ring */ 1005*25c896eaSAndrew Boyer __le64 features; 1006*25c896eaSAndrew Boyer __le16 desc_sz; 1007*25c896eaSAndrew Boyer __le16 comp_sz; 1008*25c896eaSAndrew Boyer __le16 sg_desc_sz; 1009*25c896eaSAndrew Boyer __le16 max_sg_elems; 1010*25c896eaSAndrew Boyer __le16 sg_desc_stride; 1011*25c896eaSAndrew Boyer }; 1012*25c896eaSAndrew Boyer __le32 words[20]; 1013*25c896eaSAndrew Boyer }; 1014*25c896eaSAndrew Boyer 1015*25c896eaSAndrew Boyer struct iocpt_identity { 1016*25c896eaSAndrew Boyer union iocpt_dev_identity dev; 1017*25c896eaSAndrew Boyer union iocpt_lif_identity lif; 1018*25c896eaSAndrew Boyer union iocpt_q_identity q; 1019*25c896eaSAndrew Boyer }; 1020*25c896eaSAndrew Boyer 1021*25c896eaSAndrew Boyer #endif /* _IONIC_CRYPTO_IF_H_ */ 1022