125c896eaSAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause 225c896eaSAndrew Boyer * Copyright 2021-2024 Advanced Micro Devices, Inc. 325c896eaSAndrew Boyer */ 425c896eaSAndrew Boyer 525c896eaSAndrew Boyer #ifndef _IONIC_CRYPTO_IF_H_ 625c896eaSAndrew Boyer #define _IONIC_CRYPTO_IF_H_ 725c896eaSAndrew Boyer 825c896eaSAndrew Boyer #define IOCPT_DEV_INFO_SIGNATURE 0x43585660 /* 'CRPT' */ 925c896eaSAndrew Boyer #define IOCPT_DEV_INFO_VERSION 1 1025c896eaSAndrew Boyer #define IOCPT_IFNAMSIZ 16 1125c896eaSAndrew Boyer 1225c896eaSAndrew Boyer /** 1325c896eaSAndrew Boyer * enum iocpt_cmd_opcode - Device commands 1425c896eaSAndrew Boyer */ 1525c896eaSAndrew Boyer enum iocpt_cmd_opcode { 1625c896eaSAndrew Boyer IOCPT_CMD_NOP = 0, /* D, A */ 1725c896eaSAndrew Boyer 1825c896eaSAndrew Boyer /* Device commands */ 1925c896eaSAndrew Boyer IOCPT_CMD_IDENTIFY = 1, /* D */ 2025c896eaSAndrew Boyer IOCPT_CMD_RESET = 3, /* D */ 2125c896eaSAndrew Boyer 2225c896eaSAndrew Boyer /* LIF commands */ 2325c896eaSAndrew Boyer IOCPT_CMD_LIF_IDENTIFY = 20, /* D */ 2425c896eaSAndrew Boyer IOCPT_CMD_LIF_INIT = 21, /* D */ 2525c896eaSAndrew Boyer IOCPT_CMD_LIF_RESET = 22, /* D */ 2625c896eaSAndrew Boyer IOCPT_CMD_LIF_GETATTR = 23, /* D, A */ 2725c896eaSAndrew Boyer IOCPT_CMD_LIF_SETATTR = 24, /* D, A */ 2825c896eaSAndrew Boyer 2925c896eaSAndrew Boyer /* Queue commands */ 3025c896eaSAndrew Boyer IOCPT_CMD_Q_IDENTIFY = 39, /* D, A */ 3125c896eaSAndrew Boyer IOCPT_CMD_Q_INIT = 40, /* D, A */ 3225c896eaSAndrew Boyer IOCPT_CMD_Q_CONTROL = 41, /* D, A */ 3325c896eaSAndrew Boyer 3425c896eaSAndrew Boyer /* Session commands */ 3525c896eaSAndrew Boyer IOCPT_CMD_SESS_CONTROL = 45, /* D, A */ 3625c896eaSAndrew Boyer }; 3725c896eaSAndrew Boyer 3825c896eaSAndrew Boyer /** 3925c896eaSAndrew Boyer * enum iocpt_status_code - Device command return codes 4025c896eaSAndrew Boyer */ 4125c896eaSAndrew Boyer enum iocpt_status_code { 4225c896eaSAndrew Boyer IOCPT_RC_SUCCESS = 0, /* Success */ 4325c896eaSAndrew Boyer IOCPT_RC_EVERSION = 1, /* Incorrect version for request */ 4425c896eaSAndrew Boyer IOCPT_RC_EOPCODE = 2, /* Invalid cmd opcode */ 4525c896eaSAndrew Boyer IOCPT_RC_EIO = 3, /* I/O error */ 4625c896eaSAndrew Boyer IOCPT_RC_EPERM = 4, /* Permission denied */ 4725c896eaSAndrew Boyer IOCPT_RC_EQID = 5, /* Bad qid */ 4825c896eaSAndrew Boyer IOCPT_RC_EQTYPE = 6, /* Bad qtype */ 4925c896eaSAndrew Boyer IOCPT_RC_ENOENT = 7, /* No such element */ 5025c896eaSAndrew Boyer IOCPT_RC_EINTR = 8, /* Operation interrupted */ 5125c896eaSAndrew Boyer IOCPT_RC_EAGAIN = 9, /* Try again */ 5225c896eaSAndrew Boyer IOCPT_RC_ENOMEM = 10, /* Out of memory */ 5325c896eaSAndrew Boyer IOCPT_RC_EFAULT = 11, /* Bad address */ 5425c896eaSAndrew Boyer IOCPT_RC_EBUSY = 12, /* Device or resource busy */ 5525c896eaSAndrew Boyer IOCPT_RC_EEXIST = 13, /* Object already exists */ 5625c896eaSAndrew Boyer IOCPT_RC_EINVAL = 14, /* Invalid argument */ 5725c896eaSAndrew Boyer IOCPT_RC_ENOSPC = 15, /* No space left or alloc failure */ 5825c896eaSAndrew Boyer IOCPT_RC_ERANGE = 16, /* Parameter out of range */ 5925c896eaSAndrew Boyer IOCPT_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */ 6025c896eaSAndrew Boyer IOCPT_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */ 6125c896eaSAndrew Boyer IOCPT_RC_ENOSUPP = 19, /* Operation not supported */ 6225c896eaSAndrew Boyer IOCPT_RC_ERROR = 29, /* Generic error */ 6325c896eaSAndrew Boyer }; 6425c896eaSAndrew Boyer 6525c896eaSAndrew Boyer enum iocpt_notifyq_opcode { 6625c896eaSAndrew Boyer IOCPT_EVENT_RESET = 1, 6725c896eaSAndrew Boyer IOCPT_EVENT_HEARTBEAT = 2, 6825c896eaSAndrew Boyer IOCPT_EVENT_LOG = 3, 6925c896eaSAndrew Boyer }; 7025c896eaSAndrew Boyer 7125c896eaSAndrew Boyer enum iocpt_lif_type { 7225c896eaSAndrew Boyer IOCPT_LIF_TYPE_DEFAULT = 0, 7325c896eaSAndrew Boyer }; 7425c896eaSAndrew Boyer 7525c896eaSAndrew Boyer /** 7625c896eaSAndrew Boyer * struct iocpt_admin_cmd - General admin command format 7725c896eaSAndrew Boyer * @opcode: Opcode for the command 7825c896eaSAndrew Boyer * @lif_index: LIF index 7925c896eaSAndrew Boyer * @cmd_data: Opcode-specific command bytes 8025c896eaSAndrew Boyer */ 8125c896eaSAndrew Boyer struct iocpt_admin_cmd { 8225c896eaSAndrew Boyer u8 opcode; 8325c896eaSAndrew Boyer u8 rsvd; 8425c896eaSAndrew Boyer __le16 lif_index; 8525c896eaSAndrew Boyer u8 cmd_data[60]; 8625c896eaSAndrew Boyer }; 8725c896eaSAndrew Boyer 8825c896eaSAndrew Boyer /** 8925c896eaSAndrew Boyer * struct iocpt_admin_comp - General admin command completion format 9025c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 9125c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 9225c896eaSAndrew Boyer * @cmd_data: Command-specific bytes 9325c896eaSAndrew Boyer * @color: Color bit (Always 0 for commands issued to the 9425c896eaSAndrew Boyer * Device Cmd Registers) 9525c896eaSAndrew Boyer */ 9625c896eaSAndrew Boyer struct iocpt_admin_comp { 9725c896eaSAndrew Boyer u8 status; 9825c896eaSAndrew Boyer u8 rsvd; 9925c896eaSAndrew Boyer __le16 comp_index; 10025c896eaSAndrew Boyer u8 cmd_data[11]; 10125c896eaSAndrew Boyer u8 color; 10225c896eaSAndrew Boyer #define IOCPT_COMP_COLOR_MASK 0x80 10325c896eaSAndrew Boyer }; 10425c896eaSAndrew Boyer 10525c896eaSAndrew Boyer static inline u8 iocpt_color_match(u8 color, u8 done_color) 10625c896eaSAndrew Boyer { 10725c896eaSAndrew Boyer return (!!(color & IOCPT_COMP_COLOR_MASK)) == done_color; 10825c896eaSAndrew Boyer } 10925c896eaSAndrew Boyer 11025c896eaSAndrew Boyer /** 11125c896eaSAndrew Boyer * struct iocpt_nop_cmd - NOP command 11225c896eaSAndrew Boyer * @opcode: Opcode 11325c896eaSAndrew Boyer */ 11425c896eaSAndrew Boyer struct iocpt_nop_cmd { 11525c896eaSAndrew Boyer u8 opcode; 11625c896eaSAndrew Boyer u8 rsvd[63]; 11725c896eaSAndrew Boyer }; 11825c896eaSAndrew Boyer 11925c896eaSAndrew Boyer /** 12025c896eaSAndrew Boyer * struct iocpt_nop_comp - NOP command completion 12125c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 12225c896eaSAndrew Boyer */ 12325c896eaSAndrew Boyer struct iocpt_nop_comp { 12425c896eaSAndrew Boyer u8 status; 12525c896eaSAndrew Boyer u8 rsvd[15]; 12625c896eaSAndrew Boyer }; 12725c896eaSAndrew Boyer 12825c896eaSAndrew Boyer #define IOCPT_IDENTITY_VERSION_1 1 12925c896eaSAndrew Boyer 13025c896eaSAndrew Boyer /** 13125c896eaSAndrew Boyer * struct iocpt_dev_identify_cmd - Driver/device identify command 13225c896eaSAndrew Boyer * @opcode: Opcode 13325c896eaSAndrew Boyer * @ver: Highest version of identify supported by driver 13425c896eaSAndrew Boyer */ 13525c896eaSAndrew Boyer struct iocpt_dev_identify_cmd { 13625c896eaSAndrew Boyer u8 opcode; 13725c896eaSAndrew Boyer u8 ver; 13825c896eaSAndrew Boyer u8 rsvd[62]; 13925c896eaSAndrew Boyer }; 14025c896eaSAndrew Boyer 14125c896eaSAndrew Boyer /** 14225c896eaSAndrew Boyer * struct iocpt_dev_identify_comp - Device identify command completion 14325c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 14425c896eaSAndrew Boyer * @ver: Version of identify returned by device 14525c896eaSAndrew Boyer */ 14625c896eaSAndrew Boyer struct iocpt_dev_identify_comp { 14725c896eaSAndrew Boyer u8 status; 14825c896eaSAndrew Boyer u8 ver; 14925c896eaSAndrew Boyer u8 rsvd[14]; 15025c896eaSAndrew Boyer }; 15125c896eaSAndrew Boyer 15225c896eaSAndrew Boyer /** 15325c896eaSAndrew Boyer * struct iocpt_dev_reset_cmd - Device reset command 15425c896eaSAndrew Boyer * Will reset all LIFs on the device. 15525c896eaSAndrew Boyer * @opcode: Opcode 15625c896eaSAndrew Boyer */ 15725c896eaSAndrew Boyer struct iocpt_dev_reset_cmd { 15825c896eaSAndrew Boyer u8 opcode; 15925c896eaSAndrew Boyer u8 rsvd[63]; 16025c896eaSAndrew Boyer }; 16125c896eaSAndrew Boyer 16225c896eaSAndrew Boyer /** 16325c896eaSAndrew Boyer * struct iocpt_dev_reset_comp - Reset command completion 16425c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 16525c896eaSAndrew Boyer */ 16625c896eaSAndrew Boyer struct iocpt_dev_reset_comp { 16725c896eaSAndrew Boyer u8 status; 16825c896eaSAndrew Boyer u8 rsvd[15]; 16925c896eaSAndrew Boyer }; 17025c896eaSAndrew Boyer 17125c896eaSAndrew Boyer /** 17225c896eaSAndrew Boyer * struct iocpt_lif_identify_cmd - LIF identify command 17325c896eaSAndrew Boyer * @opcode: Opcode 17425c896eaSAndrew Boyer * @type: LIF type (enum iocpt_lif_type) 17525c896eaSAndrew Boyer * @lif_index: LIF index 17625c896eaSAndrew Boyer * @ver: Version of identify returned by device 17725c896eaSAndrew Boyer */ 17825c896eaSAndrew Boyer struct iocpt_lif_identify_cmd { 17925c896eaSAndrew Boyer u8 opcode; 18025c896eaSAndrew Boyer u8 type; 18125c896eaSAndrew Boyer __le16 lif_index; 18225c896eaSAndrew Boyer u8 ver; 18325c896eaSAndrew Boyer u8 rsvd[59]; 18425c896eaSAndrew Boyer }; 18525c896eaSAndrew Boyer 18625c896eaSAndrew Boyer /** 18725c896eaSAndrew Boyer * struct iocpt_lif_identify_comp - LIF identify command completion 18825c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 18925c896eaSAndrew Boyer * @ver: Version of identify returned by device 19025c896eaSAndrew Boyer */ 19125c896eaSAndrew Boyer struct iocpt_lif_identify_comp { 19225c896eaSAndrew Boyer u8 status; 19325c896eaSAndrew Boyer u8 ver; 19425c896eaSAndrew Boyer u8 rsvd2[14]; 19525c896eaSAndrew Boyer }; 19625c896eaSAndrew Boyer 19725c896eaSAndrew Boyer /** 19825c896eaSAndrew Boyer * struct iocpt_lif_init_cmd - LIF init command 19925c896eaSAndrew Boyer * @opcode: Opcode 20025c896eaSAndrew Boyer * @type: LIF type (enum iocpt_lif_type) 20125c896eaSAndrew Boyer * @lif_index: LIF index 20225c896eaSAndrew Boyer * @info_pa: Destination address for LIF info (struct iocpt_lif_info) 20325c896eaSAndrew Boyer */ 20425c896eaSAndrew Boyer struct iocpt_lif_init_cmd { 20525c896eaSAndrew Boyer u8 opcode; 20625c896eaSAndrew Boyer u8 type; 20725c896eaSAndrew Boyer __le16 lif_index; 20825c896eaSAndrew Boyer __le32 rsvd; 20925c896eaSAndrew Boyer __le64 info_pa; 21025c896eaSAndrew Boyer u8 rsvd2[48]; 21125c896eaSAndrew Boyer }; 21225c896eaSAndrew Boyer 21325c896eaSAndrew Boyer /** 21425c896eaSAndrew Boyer * struct iocpt_lif_init_comp - LIF init command completion 21525c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 21625c896eaSAndrew Boyer * @hw_index: Hardware index of the initialized LIF 21725c896eaSAndrew Boyer */ 21825c896eaSAndrew Boyer struct iocpt_lif_init_comp { 21925c896eaSAndrew Boyer u8 status; 22025c896eaSAndrew Boyer u8 rsvd; 22125c896eaSAndrew Boyer __le16 hw_index; 22225c896eaSAndrew Boyer u8 rsvd2[12]; 22325c896eaSAndrew Boyer }; 22425c896eaSAndrew Boyer 22525c896eaSAndrew Boyer /** 22625c896eaSAndrew Boyer * struct iocpt_lif_reset_cmd - LIF reset command 22725c896eaSAndrew Boyer * Will reset only the specified LIF. 22825c896eaSAndrew Boyer * @opcode: Opcode 22925c896eaSAndrew Boyer * @lif_index: LIF index 23025c896eaSAndrew Boyer */ 23125c896eaSAndrew Boyer struct iocpt_lif_reset_cmd { 23225c896eaSAndrew Boyer u8 opcode; 23325c896eaSAndrew Boyer u8 rsvd; 23425c896eaSAndrew Boyer __le16 lif_index; 23525c896eaSAndrew Boyer __le32 rsvd2[15]; 23625c896eaSAndrew Boyer }; 23725c896eaSAndrew Boyer 23825c896eaSAndrew Boyer /** 23925c896eaSAndrew Boyer * enum iocpt_lif_attr - List of LIF attributes 24025c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_STATE: LIF state attribute 24125c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_NAME: LIF name attribute 24225c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_FEATURES: LIF features attribute 24325c896eaSAndrew Boyer * @IOCPT_LIF_ATTR_STATS_CTRL: LIF statistics control attribute 24425c896eaSAndrew Boyer */ 24525c896eaSAndrew Boyer enum iocpt_lif_attr { 24625c896eaSAndrew Boyer IOCPT_LIF_ATTR_STATE = 0, 24725c896eaSAndrew Boyer IOCPT_LIF_ATTR_NAME = 1, 24825c896eaSAndrew Boyer IOCPT_LIF_ATTR_FEATURES = 4, 24925c896eaSAndrew Boyer IOCPT_LIF_ATTR_STATS_CTRL = 6, 25025c896eaSAndrew Boyer }; 25125c896eaSAndrew Boyer 25225c896eaSAndrew Boyer /** 25325c896eaSAndrew Boyer * struct iocpt_lif_setattr_cmd - Set LIF attributes on the NIC 25425c896eaSAndrew Boyer * @opcode: Opcode 25525c896eaSAndrew Boyer * @attr: Attribute type (enum iocpt_lif_attr) 25625c896eaSAndrew Boyer * @lif_index: LIF index 25725c896eaSAndrew Boyer * @state: LIF state (enum iocpt_lif_state) 25825c896eaSAndrew Boyer * @name: The name string, 0 terminated 25925c896eaSAndrew Boyer * @features: Features (enum iocpt_hw_features) 26025c896eaSAndrew Boyer * @stats_ctl: Stats control commands (enum iocpt_stats_ctl_cmd) 26125c896eaSAndrew Boyer */ 26225c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd { 26325c896eaSAndrew Boyer u8 opcode; 26425c896eaSAndrew Boyer u8 attr; 26525c896eaSAndrew Boyer __le16 lif_index; 266*e7750639SAndre Muezerie union __rte_packed_begin { 26725c896eaSAndrew Boyer u8 state; 26825c896eaSAndrew Boyer char name[IOCPT_IFNAMSIZ]; 26925c896eaSAndrew Boyer __le64 features; 27025c896eaSAndrew Boyer u8 stats_ctl; 27125c896eaSAndrew Boyer u8 rsvd[60]; 272*e7750639SAndre Muezerie } __rte_packed_end; 27325c896eaSAndrew Boyer }; 27425c896eaSAndrew Boyer 27525c896eaSAndrew Boyer /** 27625c896eaSAndrew Boyer * struct iocpt_lif_setattr_comp - LIF set attr command completion 27725c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 27825c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 27925c896eaSAndrew Boyer * @features: Features (enum iocpt_hw_features) 28025c896eaSAndrew Boyer * @color: Color bit 28125c896eaSAndrew Boyer */ 28225c896eaSAndrew Boyer struct iocpt_lif_setattr_comp { 28325c896eaSAndrew Boyer u8 status; 28425c896eaSAndrew Boyer u8 rsvd; 28525c896eaSAndrew Boyer __le16 comp_index; 286*e7750639SAndre Muezerie union __rte_packed_begin { 28725c896eaSAndrew Boyer __le64 features; 28825c896eaSAndrew Boyer u8 rsvd2[11]; 289*e7750639SAndre Muezerie } __rte_packed_end; 29025c896eaSAndrew Boyer u8 color; 29125c896eaSAndrew Boyer }; 29225c896eaSAndrew Boyer 29325c896eaSAndrew Boyer /** 29425c896eaSAndrew Boyer * struct iocpt_lif_getattr_cmd - Get LIF attributes from the NIC 29525c896eaSAndrew Boyer * @opcode: Opcode 29625c896eaSAndrew Boyer * @attr: Attribute type (enum iocpt_lif_attr) 29725c896eaSAndrew Boyer * @lif_index: LIF index 29825c896eaSAndrew Boyer */ 29925c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd { 30025c896eaSAndrew Boyer u8 opcode; 30125c896eaSAndrew Boyer u8 attr; 30225c896eaSAndrew Boyer __le16 lif_index; 30325c896eaSAndrew Boyer u8 rsvd[60]; 30425c896eaSAndrew Boyer }; 30525c896eaSAndrew Boyer 30625c896eaSAndrew Boyer /** 30725c896eaSAndrew Boyer * struct iocpt_lif_getattr_comp - LIF get attr command completion 30825c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 30925c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 31025c896eaSAndrew Boyer * @state: LIF state (enum iocpt_lif_state) 31125c896eaSAndrew Boyer * @name: LIF name string, 0 terminated 31225c896eaSAndrew Boyer * @features: Features (enum iocpt_hw_features) 31325c896eaSAndrew Boyer * @color: Color bit 31425c896eaSAndrew Boyer */ 31525c896eaSAndrew Boyer struct iocpt_lif_getattr_comp { 31625c896eaSAndrew Boyer u8 status; 31725c896eaSAndrew Boyer u8 rsvd; 31825c896eaSAndrew Boyer __le16 comp_index; 319*e7750639SAndre Muezerie union __rte_packed_begin { 32025c896eaSAndrew Boyer u8 state; 32125c896eaSAndrew Boyer __le64 features; 32225c896eaSAndrew Boyer u8 rsvd2[11]; 323*e7750639SAndre Muezerie } __rte_packed_end; 32425c896eaSAndrew Boyer u8 color; 32525c896eaSAndrew Boyer }; 32625c896eaSAndrew Boyer 32725c896eaSAndrew Boyer /** 32825c896eaSAndrew Boyer * enum iocpt_logical_qtype - Logical Queue Types 32925c896eaSAndrew Boyer * @IOCPT_QTYPE_ADMINQ: Administrative Queue 33025c896eaSAndrew Boyer * @IOCPT_QTYPE_NOTIFYQ: Notify Queue 33125c896eaSAndrew Boyer * @IOCPT_QTYPE_CRYPTOQ: Cryptographic Queue 33225c896eaSAndrew Boyer * @IOCPT_QTYPE_MAX: Max queue type supported 33325c896eaSAndrew Boyer */ 33425c896eaSAndrew Boyer enum iocpt_logical_qtype { 33525c896eaSAndrew Boyer IOCPT_QTYPE_ADMINQ = 0, 33625c896eaSAndrew Boyer IOCPT_QTYPE_NOTIFYQ = 1, 33725c896eaSAndrew Boyer IOCPT_QTYPE_CRYPTOQ = 2, 33825c896eaSAndrew Boyer IOCPT_QTYPE_MAX = 8, 33925c896eaSAndrew Boyer }; 34025c896eaSAndrew Boyer 34125c896eaSAndrew Boyer /** 34225c896eaSAndrew Boyer * struct iocpt_q_identify_cmd - queue identify command 34325c896eaSAndrew Boyer * @opcode: Opcode 34425c896eaSAndrew Boyer * @type: Logical queue type (enum iocpt_logical_qtype) 34525c896eaSAndrew Boyer * @lif_index: LIF index 34625c896eaSAndrew Boyer * @ver: Highest queue type version that the driver supports 34725c896eaSAndrew Boyer */ 34825c896eaSAndrew Boyer struct iocpt_q_identify_cmd { 34925c896eaSAndrew Boyer u8 opcode; 35025c896eaSAndrew Boyer u8 type; 35125c896eaSAndrew Boyer __le16 lif_index; 35225c896eaSAndrew Boyer u8 ver; 35325c896eaSAndrew Boyer u8 rsvd2[59]; 35425c896eaSAndrew Boyer }; 35525c896eaSAndrew Boyer 35625c896eaSAndrew Boyer /** 35725c896eaSAndrew Boyer * struct iocpt_q_identify_comp - queue identify command completion 35825c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 35925c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 36025c896eaSAndrew Boyer * @ver: Queue type version that can be used with FW 36125c896eaSAndrew Boyer */ 36225c896eaSAndrew Boyer struct iocpt_q_identify_comp { 36325c896eaSAndrew Boyer u8 status; 36425c896eaSAndrew Boyer u8 rsvd; 36525c896eaSAndrew Boyer __le16 comp_index; 36625c896eaSAndrew Boyer u8 ver; 36725c896eaSAndrew Boyer u8 rsvd2[11]; 36825c896eaSAndrew Boyer }; 36925c896eaSAndrew Boyer 37025c896eaSAndrew Boyer /** 37125c896eaSAndrew Boyer * struct iocpt_q_init_cmd - Queue init command 37225c896eaSAndrew Boyer * @opcode: Opcode 37325c896eaSAndrew Boyer * @type: Logical queue type 37425c896eaSAndrew Boyer * @lif_index: LIF index 37525c896eaSAndrew Boyer * @ver: Queue type version 37625c896eaSAndrew Boyer * @index: (LIF, qtype) relative admin queue index 37725c896eaSAndrew Boyer * @intr_index: Interrupt control register index, or Event queue index 37825c896eaSAndrew Boyer * @pid: Process ID 37925c896eaSAndrew Boyer * @flags: 38025c896eaSAndrew Boyer * IRQ: Interrupt requested on completion 38125c896eaSAndrew Boyer * ENA: Enable the queue. If ENA=0 the queue is initialized 38225c896eaSAndrew Boyer * but remains disabled, to be later enabled with the 38325c896eaSAndrew Boyer * Queue Enable command. If ENA=1, then queue is 38425c896eaSAndrew Boyer * initialized and then enabled. 38525c896eaSAndrew Boyer * SG: Enable Scatter-Gather on the queue. 38625c896eaSAndrew Boyer * @cos: Class of service for this queue 38725c896eaSAndrew Boyer * @ring_size: Queue ring size, encoded as a log2(size), in 38825c896eaSAndrew Boyer * number of descriptors. The actual ring size is 38925c896eaSAndrew Boyer * (1 << ring_size). For example, to select a ring size 39025c896eaSAndrew Boyer * of 64 descriptors write ring_size = 6. The minimum 39125c896eaSAndrew Boyer * ring_size value is 2 for a ring of 4 descriptors. 39225c896eaSAndrew Boyer * The maximum ring_size value is 12 for a ring of 4k 39325c896eaSAndrew Boyer * descriptors. Values of ring_size <2 and >12 are 39425c896eaSAndrew Boyer * reserved. 39525c896eaSAndrew Boyer * @ring_base: Queue ring base address 39625c896eaSAndrew Boyer * @cq_ring_base: Completion queue ring base address 39725c896eaSAndrew Boyer * @sg_ring_base: Scatter/Gather ring base address 39825c896eaSAndrew Boyer */ 399*e7750639SAndre Muezerie struct __rte_packed_begin iocpt_q_init_cmd { 40025c896eaSAndrew Boyer u8 opcode; 40125c896eaSAndrew Boyer u8 type; 40225c896eaSAndrew Boyer __le16 lif_index; 40325c896eaSAndrew Boyer u8 ver; 40425c896eaSAndrew Boyer u8 rsvd[3]; 40525c896eaSAndrew Boyer __le32 index; 40625c896eaSAndrew Boyer __le16 pid; 40725c896eaSAndrew Boyer __le16 intr_index; 40825c896eaSAndrew Boyer __le16 flags; 40925c896eaSAndrew Boyer #define IOCPT_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 41025c896eaSAndrew Boyer #define IOCPT_QINIT_F_ENA 0x02 /* Enable the queue */ 41125c896eaSAndrew Boyer #define IOCPT_QINIT_F_SG 0x04 /* Enable scatter/gather on queue */ 41225c896eaSAndrew Boyer u8 cos; 41325c896eaSAndrew Boyer #define IOCPT_QSIZE_MIN_LG2 2 41425c896eaSAndrew Boyer #define IOCPT_QSIZE_MAX_LG2 12 41525c896eaSAndrew Boyer u8 ring_size; 41625c896eaSAndrew Boyer __le64 ring_base; 41725c896eaSAndrew Boyer __le64 cq_ring_base; 41825c896eaSAndrew Boyer __le64 sg_ring_base; 41925c896eaSAndrew Boyer u8 rsvd2[20]; 420*e7750639SAndre Muezerie } __rte_packed_end; 42125c896eaSAndrew Boyer 42225c896eaSAndrew Boyer /** 42325c896eaSAndrew Boyer * struct iocpt_q_init_comp - Queue init command completion 42425c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 42525c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 42625c896eaSAndrew Boyer * @hw_index: Hardware Queue ID 42725c896eaSAndrew Boyer * @hw_type: Hardware Queue type 42825c896eaSAndrew Boyer * @color: Color 42925c896eaSAndrew Boyer */ 43025c896eaSAndrew Boyer struct iocpt_q_init_comp { 43125c896eaSAndrew Boyer u8 status; 43225c896eaSAndrew Boyer u8 rsvd; 43325c896eaSAndrew Boyer __le16 comp_index; 43425c896eaSAndrew Boyer __le32 hw_index; 43525c896eaSAndrew Boyer u8 hw_type; 43625c896eaSAndrew Boyer u8 rsvd2[6]; 43725c896eaSAndrew Boyer u8 color; 43825c896eaSAndrew Boyer }; 43925c896eaSAndrew Boyer 44025c896eaSAndrew Boyer enum iocpt_desc_opcode { 44125c896eaSAndrew Boyer IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT = 0, 44225c896eaSAndrew Boyer IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT = 1, 44325c896eaSAndrew Boyer IOCPT_DESC_OPCODE_XTS_ENCRYPT = 2, 44425c896eaSAndrew Boyer IOCPT_DESC_OPCODE_XTS_DECRYPT = 3, 44525c896eaSAndrew Boyer }; 44625c896eaSAndrew Boyer 44725c896eaSAndrew Boyer #define IOCPT_DESC_F_AAD_VALID 0x1 44825c896eaSAndrew Boyer 44925c896eaSAndrew Boyer /** 45025c896eaSAndrew Boyer * struct iocpt_desc - Crypto queue descriptor format 45125c896eaSAndrew Boyer * @opcode: 45225c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT: 45325c896eaSAndrew Boyer * Perform a GCM-AES encrypt operation 45425c896eaSAndrew Boyer * 45525c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT: 45625c896eaSAndrew Boyer * Perform a GCM-AES decrypt operation 45725c896eaSAndrew Boyer * 45825c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_XTS_ENCRYPT: 45925c896eaSAndrew Boyer * Perform an XTS encrypt operation 46025c896eaSAndrew Boyer * 46125c896eaSAndrew Boyer * IOCPT_DESC_OPCODE_XTS_DECRYPT: 46225c896eaSAndrew Boyer * Perform an XTS decrypt operation 46325c896eaSAndrew Boyer * @flags: 46425c896eaSAndrew Boyer * IOCPT_DESC_F_AAD_VALID: 46525c896eaSAndrew Boyer * Source SGL contains an AAD addr and length 46625c896eaSAndrew Boyer * @num_src_dst_sgs: Number of scatter-gather elements in SG 46725c896eaSAndrew Boyer * descriptor (4 bits for source, 4 bits for destination) 46825c896eaSAndrew Boyer * @session_tag: Session tag (key index) 46925c896eaSAndrew Boyer * @intr_ctx_addr: Completion interrupt context address 47025c896eaSAndrew Boyer * @intr_ctx_data: Completion interrupt context data 47125c896eaSAndrew Boyer */ 472*e7750639SAndre Muezerie struct __rte_packed_begin iocpt_crypto_desc { 47325c896eaSAndrew Boyer uint8_t opcode; 47425c896eaSAndrew Boyer uint8_t flags; 47525c896eaSAndrew Boyer uint8_t num_src_dst_sgs; 47625c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_MASK 0xf 47725c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_SHIFT 0 47825c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_MASK 0xf 47925c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_SHIFT 4 48025c896eaSAndrew Boyer uint8_t rsvd[9]; 48125c896eaSAndrew Boyer __le32 session_tag; 48225c896eaSAndrew Boyer __le64 intr_ctx_addr; 48325c896eaSAndrew Boyer __le64 intr_ctx_data; 484*e7750639SAndre Muezerie } __rte_packed_end; 48525c896eaSAndrew Boyer 48625c896eaSAndrew Boyer static inline uint8_t iocpt_encode_nsge_src_dst(uint8_t src, uint8_t dst) 48725c896eaSAndrew Boyer { 48825c896eaSAndrew Boyer uint8_t nsge_src_dst; 48925c896eaSAndrew Boyer 49025c896eaSAndrew Boyer nsge_src_dst = (src & IOCPT_DESC_NSGE_SRC_MASK) << 49125c896eaSAndrew Boyer IOCPT_DESC_NSGE_SRC_SHIFT; 49225c896eaSAndrew Boyer nsge_src_dst |= (dst & IOCPT_DESC_NSGE_DST_MASK) << 49325c896eaSAndrew Boyer IOCPT_DESC_NSGE_DST_SHIFT; 49425c896eaSAndrew Boyer 49525c896eaSAndrew Boyer return nsge_src_dst; 49625c896eaSAndrew Boyer }; 49725c896eaSAndrew Boyer 49825c896eaSAndrew Boyer static inline void iocpt_decode_nsge_src_dst(uint8_t nsge_src_dst, 49925c896eaSAndrew Boyer uint8_t *src, uint8_t *dst) 50025c896eaSAndrew Boyer { 50125c896eaSAndrew Boyer *src = (nsge_src_dst >> IOCPT_DESC_NSGE_SRC_SHIFT) & 50225c896eaSAndrew Boyer IOCPT_DESC_NSGE_SRC_MASK; 50325c896eaSAndrew Boyer *dst = (nsge_src_dst >> IOCPT_DESC_NSGE_DST_SHIFT) & 50425c896eaSAndrew Boyer IOCPT_DESC_NSGE_DST_MASK; 50525c896eaSAndrew Boyer }; 50625c896eaSAndrew Boyer 50725c896eaSAndrew Boyer /** 50825c896eaSAndrew Boyer * struct iocpt_crypto_sg_elem - Crypto scatter-gather (SG) descriptor element 50925c896eaSAndrew Boyer * @addr: DMA address of SG element data buffer 51025c896eaSAndrew Boyer * @len: Length of SG element data buffer, in bytes 51125c896eaSAndrew Boyer */ 51225c896eaSAndrew Boyer struct iocpt_crypto_sg_elem { 51325c896eaSAndrew Boyer __le64 addr; 51425c896eaSAndrew Boyer __le16 len; 51525c896eaSAndrew Boyer uint8_t rsvd[6]; 51625c896eaSAndrew Boyer }; 51725c896eaSAndrew Boyer 51825c896eaSAndrew Boyer /** 51925c896eaSAndrew Boyer * struct iocpt_crypto_sg_desc - Crypto scatter-gather (SG) list 52025c896eaSAndrew Boyer * @src_elems: Source SG elements; also destination in IP case 52125c896eaSAndrew Boyer * AES_GCM: 52225c896eaSAndrew Boyer * SGE0: Nonce 52325c896eaSAndrew Boyer * SGE1: AAD (see IOCPT_DESC_F_AAD_VALID) 52425c896eaSAndrew Boyer * SGE2 to SGE(N): Payload 52525c896eaSAndrew Boyer * SGE(N+1): Auth tag 52625c896eaSAndrew Boyer * @dst_elems: Destination SG elements for OOP case; unused in IP case 52725c896eaSAndrew Boyer */ 52825c896eaSAndrew Boyer struct iocpt_crypto_sg_desc { 52925c896eaSAndrew Boyer #define IOCPT_CRYPTO_MAX_SG_ELEMS 8 53025c896eaSAndrew Boyer #define IOCPT_CRYPTO_NONCE_ELEM 0 53125c896eaSAndrew Boyer #define IOCPT_CRYPTO_AAD_ELEM 1 53225c896eaSAndrew Boyer struct iocpt_crypto_sg_elem src_elems[IOCPT_CRYPTO_MAX_SG_ELEMS]; 53325c896eaSAndrew Boyer struct iocpt_crypto_sg_elem dst_elems[IOCPT_CRYPTO_MAX_SG_ELEMS]; 53425c896eaSAndrew Boyer }; 53525c896eaSAndrew Boyer 53625c896eaSAndrew Boyer /** 53725c896eaSAndrew Boyer * struct iocpt_crypto_comp - Crypto queue completion descriptor 53825c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 53925c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 54025c896eaSAndrew Boyer * @color: Color bit 54125c896eaSAndrew Boyer */ 54225c896eaSAndrew Boyer struct iocpt_crypto_comp { 54325c896eaSAndrew Boyer #define IOCPT_COMP_SUCCESS 0 54425c896eaSAndrew Boyer #define IOCPT_COMP_INVAL_OPCODE_ERROR 1 54525c896eaSAndrew Boyer #define IOCPT_COMP_UNSUPP_OPCODE_ERROR 2 54625c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_SG_ERROR 3 54725c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_DST_SG_ERROR 4 54825c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_DST_LEN_MISMATCH 5 54925c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HW_QAVAIL_ERROR 6 55025c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_AUTH_VERIFY_ERROR 7 55125c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_OTHER_VERIFY_ERROR 8 55225c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_PI_MODE_CHKSUM_ERROR 9 55325c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HARDWARE_ERROR 10 55425c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_KEY_IDX_ERROR 11 55525c896eaSAndrew Boyer u8 status; 55625c896eaSAndrew Boyer u8 rsvd; 55725c896eaSAndrew Boyer __le16 comp_index; 55825c896eaSAndrew Boyer u8 rsvd2[11]; 55925c896eaSAndrew Boyer u8 color; 56025c896eaSAndrew Boyer }; 56125c896eaSAndrew Boyer 56225c896eaSAndrew Boyer /** 56325c896eaSAndrew Boyer * enum iocpt_hw_features - Feature flags supported by hardware 56425c896eaSAndrew Boyer * @IOCPT_HW_SYM: Symmetric crypto operations 56525c896eaSAndrew Boyer * @IOCPT_HW_ASYM: Asymmetric crypto operations 56625c896eaSAndrew Boyer * @IOCPT_HW_CHAIN: Chained crypto operations 56725c896eaSAndrew Boyer * @IOCPT_HW_IP: In-Place (destination same as source) 56825c896eaSAndrew Boyer * @IOCPT_HW_OOP: Out-Of-Place (destination differs from source) 56925c896eaSAndrew Boyer */ 57025c896eaSAndrew Boyer enum iocpt_hw_features { 57125c896eaSAndrew Boyer IOCPT_HW_SYM = BIT(0), 57225c896eaSAndrew Boyer IOCPT_HW_ASYM = BIT(1), 57325c896eaSAndrew Boyer IOCPT_HW_CHAIN = BIT(2), 57425c896eaSAndrew Boyer IOCPT_HW_IP = BIT(3), 57525c896eaSAndrew Boyer IOCPT_HW_OOP = BIT(4), 57625c896eaSAndrew Boyer }; 57725c896eaSAndrew Boyer 57825c896eaSAndrew Boyer /** 57925c896eaSAndrew Boyer * struct iocpt_q_control_cmd - Queue control command 58025c896eaSAndrew Boyer * @opcode: Opcode 58125c896eaSAndrew Boyer * @type: Queue type 58225c896eaSAndrew Boyer * @lif_index: LIF index 58325c896eaSAndrew Boyer * @index: Queue index 58425c896eaSAndrew Boyer * @oper: Operation (enum iocpt_q_control_oper) 58525c896eaSAndrew Boyer */ 58625c896eaSAndrew Boyer struct iocpt_q_control_cmd { 58725c896eaSAndrew Boyer u8 opcode; 58825c896eaSAndrew Boyer u8 type; 58925c896eaSAndrew Boyer __le16 lif_index; 59025c896eaSAndrew Boyer __le32 index; 59125c896eaSAndrew Boyer u8 oper; 59225c896eaSAndrew Boyer u8 rsvd2[55]; 59325c896eaSAndrew Boyer }; 59425c896eaSAndrew Boyer 59525c896eaSAndrew Boyer enum iocpt_q_control_oper { 59625c896eaSAndrew Boyer IOCPT_Q_DISABLE = 0, 59725c896eaSAndrew Boyer IOCPT_Q_ENABLE = 1, 59825c896eaSAndrew Boyer }; 59925c896eaSAndrew Boyer 60025c896eaSAndrew Boyer /* NB: It will take 64 transfers to update a 2048B key */ 60125c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MIN 16 60225c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_SYMM 32 60325c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_ASYM 2048 60425c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_LEN 32 60525c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_SHFT 5 60625c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_CNT \ 60725c896eaSAndrew Boyer (IOCPT_SESS_KEY_LEN_MAX_SYMM >> IOCPT_SESS_KEY_SEG_SHFT) 60825c896eaSAndrew Boyer 60925c896eaSAndrew Boyer enum iocpt_sess_type { 61025c896eaSAndrew Boyer IOCPT_SESS_NONE = 0, 61125c896eaSAndrew Boyer IOCPT_SESS_AEAD_AES_GCM = 1, 61225c896eaSAndrew Boyer }; 61325c896eaSAndrew Boyer 61425c896eaSAndrew Boyer enum iocpt_sess_control_oper { 61525c896eaSAndrew Boyer IOCPT_SESS_INIT = 0, 61625c896eaSAndrew Boyer IOCPT_SESS_UPDATE_KEY = 2, 61725c896eaSAndrew Boyer IOCPT_SESS_DISABLE = 3, 61825c896eaSAndrew Boyer }; 61925c896eaSAndrew Boyer 62025c896eaSAndrew Boyer /** 62125c896eaSAndrew Boyer * struct iocpt_sess_control_cmd - Session control command 62225c896eaSAndrew Boyer * @opcode: Opcode 62325c896eaSAndrew Boyer * @type: Session type (enum iocpt_sess_type) 62425c896eaSAndrew Boyer * @lif_index: LIF index 62525c896eaSAndrew Boyer * @oper: Operation (enum iocpt_sess_control_oper) 62625c896eaSAndrew Boyer * @flags: 62725c896eaSAndrew Boyer * END: Indicates that this is the final segment of the key. 62825c896eaSAndrew Boyer * When this flag is set, a write will be triggered from the 62925c896eaSAndrew Boyer * controller's memory into the dedicated key-storage area. 63025c896eaSAndrew Boyer * @key_len: Crypto key length in bytes 63125c896eaSAndrew Boyer * @index: Session index, as allocated by PMD 63225c896eaSAndrew Boyer * @key_seg_len: Crypto key segment length in bytes 63325c896eaSAndrew Boyer * @key_seg_idx: Crypto key segment index 63425c896eaSAndrew Boyer * @key: Crypto key 63525c896eaSAndrew Boyer */ 63625c896eaSAndrew Boyer struct iocpt_sess_control_cmd { 63725c896eaSAndrew Boyer u8 opcode; 63825c896eaSAndrew Boyer u8 type; 63925c896eaSAndrew Boyer __le16 lif_index; 64025c896eaSAndrew Boyer u8 oper; 64125c896eaSAndrew Boyer u8 flags; 64225c896eaSAndrew Boyer #define IOCPT_SCTL_F_END 0x01 /* Final segment of key */ 64325c896eaSAndrew Boyer __le16 key_len; 64425c896eaSAndrew Boyer __le32 index; 64525c896eaSAndrew Boyer u8 key_seg_len; 64625c896eaSAndrew Boyer u8 key_seg_idx; 64725c896eaSAndrew Boyer u8 rsvd[18]; 64825c896eaSAndrew Boyer u8 key[IOCPT_SESS_KEY_SEG_LEN]; 64925c896eaSAndrew Boyer }; 65025c896eaSAndrew Boyer 65125c896eaSAndrew Boyer /** 65225c896eaSAndrew Boyer * struct iocpt_sess_control_comp - Session control command completion 65325c896eaSAndrew Boyer * @status: Status of the command (enum iocpt_status_code) 65425c896eaSAndrew Boyer * @comp_index: Index in the descriptor ring for which this is the completion 65525c896eaSAndrew Boyer * @index: Session index 65625c896eaSAndrew Boyer * @hw_type: Hardware Session type 65725c896eaSAndrew Boyer * @color: Color 65825c896eaSAndrew Boyer */ 65925c896eaSAndrew Boyer struct iocpt_sess_control_comp { 66025c896eaSAndrew Boyer u8 status; 66125c896eaSAndrew Boyer u8 rsvd; 66225c896eaSAndrew Boyer __le16 comp_index; 66325c896eaSAndrew Boyer __le32 index; 66425c896eaSAndrew Boyer u8 hw_type; 66525c896eaSAndrew Boyer u8 rsvd2[6]; 66625c896eaSAndrew Boyer u8 color; 66725c896eaSAndrew Boyer }; 66825c896eaSAndrew Boyer 66925c896eaSAndrew Boyer /** 67025c896eaSAndrew Boyer * enum iocpt_stats_ctl_cmd - List of commands for stats control 67125c896eaSAndrew Boyer * @IOCPT_STATS_CTL_RESET: Reset statistics 67225c896eaSAndrew Boyer */ 67325c896eaSAndrew Boyer enum iocpt_stats_ctl_cmd { 67425c896eaSAndrew Boyer IOCPT_STATS_CTL_RESET = 0, 67525c896eaSAndrew Boyer }; 67625c896eaSAndrew Boyer 67725c896eaSAndrew Boyer /** 67825c896eaSAndrew Boyer * struct iocpt_dev_status - Device status register 67925c896eaSAndrew Boyer * @eid: most recent NotifyQ event id 68025c896eaSAndrew Boyer */ 68125c896eaSAndrew Boyer struct iocpt_dev_status { 68225c896eaSAndrew Boyer __le64 eid; 68325c896eaSAndrew Boyer u8 rsvd2[56]; 68425c896eaSAndrew Boyer }; 68525c896eaSAndrew Boyer 68625c896eaSAndrew Boyer enum iocpt_dev_state { 68725c896eaSAndrew Boyer IOCPT_DEV_DISABLE = 0, 68825c896eaSAndrew Boyer IOCPT_DEV_ENABLE = 1, 68925c896eaSAndrew Boyer IOCPT_DEV_HANG_RESET = 2, 69025c896eaSAndrew Boyer }; 69125c896eaSAndrew Boyer 69225c896eaSAndrew Boyer /** 69325c896eaSAndrew Boyer * enum iocpt_dev_attr - List of device attributes 69425c896eaSAndrew Boyer * @IOCPT_DEV_ATTR_STATE: Device state attribute 69525c896eaSAndrew Boyer * @IOCPT_DEV_ATTR_NAME: Device name attribute 69625c896eaSAndrew Boyer * @IOCPT_DEV_ATTR_FEATURES: Device feature attributes 69725c896eaSAndrew Boyer */ 69825c896eaSAndrew Boyer enum iocpt_dev_attr { 69925c896eaSAndrew Boyer IOCPT_DEV_ATTR_STATE = 0, 70025c896eaSAndrew Boyer IOCPT_DEV_ATTR_NAME = 1, 70125c896eaSAndrew Boyer IOCPT_DEV_ATTR_FEATURES = 2, 70225c896eaSAndrew Boyer }; 70325c896eaSAndrew Boyer 70425c896eaSAndrew Boyer /** 70525c896eaSAndrew Boyer * struct iocpt_notify_event - Generic event reporting structure 70625c896eaSAndrew Boyer * @eid: event number 70725c896eaSAndrew Boyer * @ecode: event code 70825c896eaSAndrew Boyer * @data: unspecified data about the event 70925c896eaSAndrew Boyer * 71025c896eaSAndrew Boyer * This is the generic event report struct from which the other 71125c896eaSAndrew Boyer * actual events will be formed. 71225c896eaSAndrew Boyer */ 71325c896eaSAndrew Boyer struct iocpt_notify_event { 71425c896eaSAndrew Boyer __le64 eid; 71525c896eaSAndrew Boyer __le16 ecode; 71625c896eaSAndrew Boyer u8 data[54]; 71725c896eaSAndrew Boyer }; 71825c896eaSAndrew Boyer 71925c896eaSAndrew Boyer /** 72025c896eaSAndrew Boyer * struct iocpt_reset_event - Reset event notification 72125c896eaSAndrew Boyer * @eid: event number 72225c896eaSAndrew Boyer * @ecode: event code = IOCPT_EVENT_RESET 72325c896eaSAndrew Boyer * @reset_code: reset type 72425c896eaSAndrew Boyer * @state: 0=pending, 1=complete, 2=error 72525c896eaSAndrew Boyer * 72625c896eaSAndrew Boyer * Sent when the NIC or some subsystem is going to be or 72725c896eaSAndrew Boyer * has been reset. 72825c896eaSAndrew Boyer */ 72925c896eaSAndrew Boyer struct iocpt_reset_event { 73025c896eaSAndrew Boyer __le64 eid; 73125c896eaSAndrew Boyer __le16 ecode; 73225c896eaSAndrew Boyer u8 reset_code; 73325c896eaSAndrew Boyer u8 state; 73425c896eaSAndrew Boyer u8 rsvd[52]; 73525c896eaSAndrew Boyer }; 73625c896eaSAndrew Boyer 73725c896eaSAndrew Boyer /** 73825c896eaSAndrew Boyer * struct iocpt_heartbeat_event - Sent periodically by NIC to indicate health 73925c896eaSAndrew Boyer * @eid: event number 74025c896eaSAndrew Boyer * @ecode: event code = IOCPT_EVENT_HEARTBEAT 74125c896eaSAndrew Boyer */ 74225c896eaSAndrew Boyer struct iocpt_heartbeat_event { 74325c896eaSAndrew Boyer __le64 eid; 74425c896eaSAndrew Boyer __le16 ecode; 74525c896eaSAndrew Boyer u8 rsvd[54]; 74625c896eaSAndrew Boyer }; 74725c896eaSAndrew Boyer 74825c896eaSAndrew Boyer /** 74925c896eaSAndrew Boyer * struct iocpt_log_event - Sent to notify the driver of an internal error 75025c896eaSAndrew Boyer * @eid: event number 75125c896eaSAndrew Boyer * @ecode: event code = IOCPT_EVENT_LOG 75225c896eaSAndrew Boyer * @data: log data 75325c896eaSAndrew Boyer */ 75425c896eaSAndrew Boyer struct iocpt_log_event { 75525c896eaSAndrew Boyer __le64 eid; 75625c896eaSAndrew Boyer __le16 ecode; 75725c896eaSAndrew Boyer u8 data[54]; 75825c896eaSAndrew Boyer }; 75925c896eaSAndrew Boyer 76025c896eaSAndrew Boyer /** 76125c896eaSAndrew Boyer * union iocpt_lif_config - LIF configuration 76225c896eaSAndrew Boyer * @state: LIF state (enum iocpt_lif_state) 76325c896eaSAndrew Boyer * @name: LIF name 76425c896eaSAndrew Boyer * @features: LIF features active (enum iocpt_hw_features) 76525c896eaSAndrew Boyer * @queue_count: Queue counts per queue-type 76625c896eaSAndrew Boyer */ 76725c896eaSAndrew Boyer union iocpt_lif_config { 768*e7750639SAndre Muezerie struct __rte_packed_begin { 76925c896eaSAndrew Boyer u8 state; 77025c896eaSAndrew Boyer u8 rsvd[3]; 77125c896eaSAndrew Boyer char name[IOCPT_IFNAMSIZ]; 77225c896eaSAndrew Boyer u8 rsvd2[12]; 77325c896eaSAndrew Boyer __le64 features; 77425c896eaSAndrew Boyer __le32 queue_count[IOCPT_QTYPE_MAX]; 775*e7750639SAndre Muezerie } __rte_packed_end; 77625c896eaSAndrew Boyer __le32 words[56]; 77725c896eaSAndrew Boyer }; 77825c896eaSAndrew Boyer 77925c896eaSAndrew Boyer /** 78025c896eaSAndrew Boyer * struct iocpt_lif_status - LIF status register 78125c896eaSAndrew Boyer * @eid: most recent NotifyQ event id 78225c896eaSAndrew Boyer */ 78325c896eaSAndrew Boyer struct iocpt_lif_status { 78425c896eaSAndrew Boyer __le64 eid; 78525c896eaSAndrew Boyer u8 rsvd[56]; 78625c896eaSAndrew Boyer }; 78725c896eaSAndrew Boyer 78825c896eaSAndrew Boyer /** 78925c896eaSAndrew Boyer * struct iocpt_lif_info - LIF info structure 79025c896eaSAndrew Boyer * @config: LIF configuration structure 79125c896eaSAndrew Boyer * @status: LIF status structure 79225c896eaSAndrew Boyer * @stats: LIF statistics structure 79325c896eaSAndrew Boyer */ 79425c896eaSAndrew Boyer struct iocpt_lif_info { 79525c896eaSAndrew Boyer union iocpt_lif_config config; 79625c896eaSAndrew Boyer struct iocpt_lif_status status; 79725c896eaSAndrew Boyer }; 79825c896eaSAndrew Boyer 79925c896eaSAndrew Boyer union iocpt_dev_cmd { 80025c896eaSAndrew Boyer u32 words[16]; 80125c896eaSAndrew Boyer struct iocpt_admin_cmd cmd; 80225c896eaSAndrew Boyer struct iocpt_nop_cmd nop; 80325c896eaSAndrew Boyer 80425c896eaSAndrew Boyer struct iocpt_dev_identify_cmd identify; 80525c896eaSAndrew Boyer struct iocpt_dev_reset_cmd reset; 80625c896eaSAndrew Boyer 80725c896eaSAndrew Boyer struct iocpt_lif_identify_cmd lif_identify; 80825c896eaSAndrew Boyer struct iocpt_lif_init_cmd lif_init; 80925c896eaSAndrew Boyer struct iocpt_lif_reset_cmd lif_reset; 81025c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd lif_getattr; 81125c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd lif_setattr; 81225c896eaSAndrew Boyer 81325c896eaSAndrew Boyer struct iocpt_q_identify_cmd q_identify; 81425c896eaSAndrew Boyer struct iocpt_q_init_cmd q_init; 81525c896eaSAndrew Boyer struct iocpt_q_control_cmd q_control; 81625c896eaSAndrew Boyer 81725c896eaSAndrew Boyer struct iocpt_sess_control_cmd sess_control; 81825c896eaSAndrew Boyer }; 81925c896eaSAndrew Boyer 82025c896eaSAndrew Boyer union iocpt_dev_cmd_comp { 82125c896eaSAndrew Boyer u32 words[4]; 82225c896eaSAndrew Boyer u8 status; 82325c896eaSAndrew Boyer struct iocpt_admin_comp comp; 82425c896eaSAndrew Boyer struct iocpt_nop_comp nop; 82525c896eaSAndrew Boyer 82625c896eaSAndrew Boyer struct iocpt_dev_identify_comp identify; 82725c896eaSAndrew Boyer struct iocpt_dev_reset_comp reset; 82825c896eaSAndrew Boyer 82925c896eaSAndrew Boyer struct iocpt_lif_identify_comp lif_identify; 83025c896eaSAndrew Boyer struct iocpt_lif_init_comp lif_init; 83125c896eaSAndrew Boyer struct iocpt_lif_getattr_comp lif_getattr; 83225c896eaSAndrew Boyer struct iocpt_lif_setattr_comp lif_setattr; 83325c896eaSAndrew Boyer 83425c896eaSAndrew Boyer struct iocpt_q_identify_comp q_identify; 83525c896eaSAndrew Boyer struct iocpt_q_init_comp q_init; 83625c896eaSAndrew Boyer 83725c896eaSAndrew Boyer struct iocpt_sess_control_comp sess_control; 83825c896eaSAndrew Boyer }; 83925c896eaSAndrew Boyer 84025c896eaSAndrew Boyer /** 84125c896eaSAndrew Boyer * union iocpt_dev_info_regs - Device info register format (read-only) 84225c896eaSAndrew Boyer * @signature: Signature value of 0x43585660 ('CRPT') 84325c896eaSAndrew Boyer * @version: Current version of info 84425c896eaSAndrew Boyer * @asic_type: Asic type 84525c896eaSAndrew Boyer * @asic_rev: Asic revision 84625c896eaSAndrew Boyer * @fw_status: Firmware status 84725c896eaSAndrew Boyer * @fw_heartbeat: Firmware heartbeat counter 84825c896eaSAndrew Boyer * @serial_num: Serial number 84925c896eaSAndrew Boyer * @fw_version: Firmware version 85025c896eaSAndrew Boyer */ 85125c896eaSAndrew Boyer union iocpt_dev_info_regs { 85225c896eaSAndrew Boyer #define IOCPT_FWVERS_BUFLEN 32 85325c896eaSAndrew Boyer #define IOCPT_SERIAL_BUFLEN 32 85425c896eaSAndrew Boyer struct { 85525c896eaSAndrew Boyer u32 signature; 85625c896eaSAndrew Boyer u8 version; 85725c896eaSAndrew Boyer u8 asic_type; 85825c896eaSAndrew Boyer u8 asic_rev; 85925c896eaSAndrew Boyer #define IOCPT_FW_STS_F_RUNNING 0x1 86025c896eaSAndrew Boyer u8 fw_status; 86125c896eaSAndrew Boyer u32 fw_heartbeat; 86225c896eaSAndrew Boyer char fw_version[IOCPT_FWVERS_BUFLEN]; 86325c896eaSAndrew Boyer char serial_num[IOCPT_SERIAL_BUFLEN]; 86425c896eaSAndrew Boyer }; 86525c896eaSAndrew Boyer u32 words[512]; 86625c896eaSAndrew Boyer }; 86725c896eaSAndrew Boyer 86825c896eaSAndrew Boyer /** 86925c896eaSAndrew Boyer * union iocpt_dev_cmd_regs - Device command register format (read-write) 87025c896eaSAndrew Boyer * @doorbell: Device Cmd Doorbell, write-only 87125c896eaSAndrew Boyer * Write a 1 to signal device to process cmd, 87225c896eaSAndrew Boyer * poll done for completion. 87325c896eaSAndrew Boyer * @done: Done indicator, bit 0 == 1 when command is complete 87425c896eaSAndrew Boyer * @cmd: Opcode-specific command bytes 87525c896eaSAndrew Boyer * @comp: Opcode-specific response bytes 87625c896eaSAndrew Boyer * @data: Opcode-specific side-data 87725c896eaSAndrew Boyer */ 87825c896eaSAndrew Boyer union iocpt_dev_cmd_regs { 879*e7750639SAndre Muezerie struct __rte_packed_begin { 88025c896eaSAndrew Boyer u32 doorbell; 88125c896eaSAndrew Boyer u32 done; 88225c896eaSAndrew Boyer union iocpt_dev_cmd cmd; 88325c896eaSAndrew Boyer union iocpt_dev_cmd_comp comp; 88425c896eaSAndrew Boyer u8 rsvd[48]; 88525c896eaSAndrew Boyer u32 data[478]; 886*e7750639SAndre Muezerie } __rte_packed_end; 88725c896eaSAndrew Boyer u32 words[512]; 88825c896eaSAndrew Boyer }; 88925c896eaSAndrew Boyer 89025c896eaSAndrew Boyer /** 89125c896eaSAndrew Boyer * union iocpt_dev_regs - Device register format for bar 0 page 0 89225c896eaSAndrew Boyer * @info: Device info registers 89325c896eaSAndrew Boyer * @devcmd: Device command registers 89425c896eaSAndrew Boyer */ 89525c896eaSAndrew Boyer union iocpt_dev_regs { 896*e7750639SAndre Muezerie struct __rte_packed_begin { 89725c896eaSAndrew Boyer union iocpt_dev_info_regs info; 89825c896eaSAndrew Boyer union iocpt_dev_cmd_regs devcmd; 899*e7750639SAndre Muezerie } __rte_packed_end; 90025c896eaSAndrew Boyer __le32 words[1024]; 90125c896eaSAndrew Boyer }; 90225c896eaSAndrew Boyer 90325c896eaSAndrew Boyer union iocpt_adminq_cmd { 90425c896eaSAndrew Boyer struct iocpt_admin_cmd cmd; 90525c896eaSAndrew Boyer struct iocpt_nop_cmd nop; 90625c896eaSAndrew Boyer struct iocpt_q_identify_cmd q_identify; 90725c896eaSAndrew Boyer struct iocpt_q_init_cmd q_init; 90825c896eaSAndrew Boyer struct iocpt_q_control_cmd q_control; 90925c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd lif_setattr; 91025c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd lif_getattr; 91125c896eaSAndrew Boyer struct iocpt_sess_control_cmd sess_control; 91225c896eaSAndrew Boyer }; 91325c896eaSAndrew Boyer 91425c896eaSAndrew Boyer union iocpt_adminq_comp { 91525c896eaSAndrew Boyer struct iocpt_admin_comp comp; 91625c896eaSAndrew Boyer struct iocpt_nop_comp nop; 91725c896eaSAndrew Boyer struct iocpt_q_identify_comp q_identify; 91825c896eaSAndrew Boyer struct iocpt_q_init_comp q_init; 91925c896eaSAndrew Boyer struct iocpt_lif_setattr_comp lif_setattr; 92025c896eaSAndrew Boyer struct iocpt_lif_getattr_comp lif_getattr; 92125c896eaSAndrew Boyer struct iocpt_sess_control_comp sess_control; 92225c896eaSAndrew Boyer }; 92325c896eaSAndrew Boyer 92425c896eaSAndrew Boyer union iocpt_notify_comp { 92525c896eaSAndrew Boyer struct iocpt_notify_event event; 92625c896eaSAndrew Boyer struct iocpt_reset_event reset; 92725c896eaSAndrew Boyer struct iocpt_heartbeat_event heartbeat; 92825c896eaSAndrew Boyer struct iocpt_log_event log; 92925c896eaSAndrew Boyer }; 93025c896eaSAndrew Boyer 93125c896eaSAndrew Boyer /** 93225c896eaSAndrew Boyer * union iocpt_dev_identity - device identity information 93325c896eaSAndrew Boyer * @version: Version of device identify 93425c896eaSAndrew Boyer * @type: Identify type (0 for now) 93525c896eaSAndrew Boyer * @state: Device state 93625c896eaSAndrew Boyer * @nlifs: Number of LIFs provisioned 93725c896eaSAndrew Boyer * @nintrs: Number of interrupts provisioned 93825c896eaSAndrew Boyer * @ndbpgs_per_lif: Number of doorbell pages per LIF 93925c896eaSAndrew Boyer * @intr_coal_mult: Interrupt coalescing multiplication factor 94025c896eaSAndrew Boyer * Scale user-supplied interrupt coalescing 94125c896eaSAndrew Boyer * value in usecs to device units using: 94225c896eaSAndrew Boyer * device units = usecs * mult / div 94325c896eaSAndrew Boyer * @intr_coal_div: Interrupt coalescing division factor 94425c896eaSAndrew Boyer * Scale user-supplied interrupt coalescing 94525c896eaSAndrew Boyer * value in usecs to device units using: 94625c896eaSAndrew Boyer * device units = usecs * mult / div 94725c896eaSAndrew Boyer */ 94825c896eaSAndrew Boyer union iocpt_dev_identity { 94925c896eaSAndrew Boyer struct { 95025c896eaSAndrew Boyer u8 version; 95125c896eaSAndrew Boyer u8 type; 95225c896eaSAndrew Boyer u8 state; 95325c896eaSAndrew Boyer u8 rsvd; 95425c896eaSAndrew Boyer __le32 nlifs; 95525c896eaSAndrew Boyer __le32 nintrs; 95625c896eaSAndrew Boyer __le32 ndbpgs_per_lif; 95725c896eaSAndrew Boyer __le32 intr_coal_mult; 95825c896eaSAndrew Boyer __le32 intr_coal_div; 95925c896eaSAndrew Boyer u8 rsvd2[8]; 96025c896eaSAndrew Boyer }; 96125c896eaSAndrew Boyer __le32 words[8]; 96225c896eaSAndrew Boyer }; 96325c896eaSAndrew Boyer 96425c896eaSAndrew Boyer /** 96525c896eaSAndrew Boyer * union iocpt_lif_identity - LIF identity information (type-specific) 96625c896eaSAndrew Boyer * 96725c896eaSAndrew Boyer * @features: LIF features (see enum iocpt_hw_features) 96825c896eaSAndrew Boyer * @version: Identify structure version 96925c896eaSAndrew Boyer * @hw_index: LIF hardware index 97025c896eaSAndrew Boyer * @max_nb_sessions: Maximum number of sessions supported 97125c896eaSAndrew Boyer * @config: LIF config struct with features, q counts 97225c896eaSAndrew Boyer */ 97325c896eaSAndrew Boyer union iocpt_lif_identity { 974*e7750639SAndre Muezerie struct __rte_packed_begin { 97525c896eaSAndrew Boyer __le64 features; 97625c896eaSAndrew Boyer 97725c896eaSAndrew Boyer u8 version; 97825c896eaSAndrew Boyer u8 hw_index; 97925c896eaSAndrew Boyer u8 rsvd[2]; 98025c896eaSAndrew Boyer __le32 max_nb_sessions; 98125c896eaSAndrew Boyer u8 rsvd2[120]; 98225c896eaSAndrew Boyer union iocpt_lif_config config; 983*e7750639SAndre Muezerie } __rte_packed_end; 98425c896eaSAndrew Boyer __le32 words[90]; 98525c896eaSAndrew Boyer }; 98625c896eaSAndrew Boyer 98725c896eaSAndrew Boyer /** 98825c896eaSAndrew Boyer * union iocpt_q_identity - queue identity information 98925c896eaSAndrew Boyer * @version: Queue type version that can be used with FW 99025c896eaSAndrew Boyer * @supported: Bitfield of queue versions, first bit = ver 0 99125c896eaSAndrew Boyer * @features: Queue features 99225c896eaSAndrew Boyer * @desc_sz: Descriptor size 99325c896eaSAndrew Boyer * @comp_sz: Completion descriptor size 99425c896eaSAndrew Boyer * @sg_desc_sz: Scatter/Gather descriptor size 99525c896eaSAndrew Boyer * @max_sg_elems: Maximum number of Scatter/Gather elements 99625c896eaSAndrew Boyer * @sg_desc_stride: Number of Scatter/Gather elements per descriptor 99725c896eaSAndrew Boyer */ 99825c896eaSAndrew Boyer union iocpt_q_identity { 99925c896eaSAndrew Boyer struct { 100025c896eaSAndrew Boyer u8 version; 100125c896eaSAndrew Boyer u8 supported; 100225c896eaSAndrew Boyer u8 rsvd[6]; 100325c896eaSAndrew Boyer #define IOCPT_QIDENT_F_CQ 0x01 /* queue has completion ring */ 100425c896eaSAndrew Boyer #define IOCPT_QIDENT_F_SG 0x02 /* queue has scatter/gather ring */ 100525c896eaSAndrew Boyer __le64 features; 100625c896eaSAndrew Boyer __le16 desc_sz; 100725c896eaSAndrew Boyer __le16 comp_sz; 100825c896eaSAndrew Boyer __le16 sg_desc_sz; 100925c896eaSAndrew Boyer __le16 max_sg_elems; 101025c896eaSAndrew Boyer __le16 sg_desc_stride; 101125c896eaSAndrew Boyer }; 101225c896eaSAndrew Boyer __le32 words[20]; 101325c896eaSAndrew Boyer }; 101425c896eaSAndrew Boyer 101525c896eaSAndrew Boyer struct iocpt_identity { 101625c896eaSAndrew Boyer union iocpt_dev_identity dev; 101725c896eaSAndrew Boyer union iocpt_lif_identity lif; 101825c896eaSAndrew Boyer union iocpt_q_identity q; 101925c896eaSAndrew Boyer }; 102025c896eaSAndrew Boyer 102125c896eaSAndrew Boyer #endif /* _IONIC_CRYPTO_IF_H_ */ 1022