| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* Copyright (C) 2025 Intel Corporation */ |
| 3 | |
| 4 | #ifndef __LIBIE_ADMINQ_H |
| 5 | #define __LIBIE_ADMINQ_H |
| 6 | |
| 7 | #include <linux/build_bug.h> |
| 8 | #include <linux/types.h> |
| 9 | |
| 10 | #define LIBIE_CHECK_STRUCT_LEN(n, X) \ |
| 11 | static_assert((n) == sizeof(struct X)) |
| 12 | #define LIBIE_AQ_MAX_BUF_LEN 4096 |
| 13 | |
| 14 | /** |
| 15 | * struct libie_aqc_generic - Generic structure used in adminq communication |
| 16 | * @param0: generic parameter high 32bit |
| 17 | * @param1: generic parameter lower 32bit |
| 18 | * @addr_high: generic address high 32bit |
| 19 | * @addr_low: generic address lower 32bit |
| 20 | */ |
| 21 | struct libie_aqc_generic { |
| 22 | __le32 param0; |
| 23 | __le32 param1; |
| 24 | __le32 addr_high; |
| 25 | __le32 addr_low; |
| 26 | }; |
| 27 | LIBIE_CHECK_STRUCT_LEN(16, libie_aqc_generic); |
| 28 | |
| 29 | /** |
| 30 | * struct libie_aqc_get_ver - Used in command get version (direct 0x0001) |
| 31 | * @rom_ver: rom version |
| 32 | * @fw_build: number coressponding to firmware build |
| 33 | * @fw_branch: branch identifier of firmware version |
| 34 | * @fw_major: major number of firmware version |
| 35 | * @fw_minor: minor number of firmware version |
| 36 | * @fw_patch: patch of firmware version |
| 37 | * @api_branch: brancch identifier of API version |
| 38 | * @api_major: major number of API version |
| 39 | * @api_minor: minor number of API version |
| 40 | * @api_patch: patch of API version |
| 41 | */ |
| 42 | struct libie_aqc_get_ver { |
| 43 | __le32 rom_ver; |
| 44 | __le32 fw_build; |
| 45 | u8 fw_branch; |
| 46 | u8 fw_major; |
| 47 | u8 fw_minor; |
| 48 | u8 fw_patch; |
| 49 | u8 api_branch; |
| 50 | u8 api_major; |
| 51 | u8 api_minor; |
| 52 | u8 api_patch; |
| 53 | }; |
| 54 | LIBIE_CHECK_STRUCT_LEN(16, libie_aqc_get_ver); |
| 55 | |
| 56 | /** |
| 57 | * struct libie_aqc_driver_ver - Used in command send driver version |
| 58 | * (indirect 0x0002) |
| 59 | * @major_ver: driver major version |
| 60 | * @minor_ver: driver minor version |
| 61 | * @build_ver: driver build version |
| 62 | * @subbuild_ver: driver subbuild version |
| 63 | * @reserved: for feature use |
| 64 | * @addr_high: high part of response address buff |
| 65 | * @addr_low: low part of response address buff |
| 66 | */ |
| 67 | struct libie_aqc_driver_ver { |
| 68 | u8 major_ver; |
| 69 | u8 minor_ver; |
| 70 | u8 build_ver; |
| 71 | u8 subbuild_ver; |
| 72 | u8 reserved[4]; |
| 73 | __le32 addr_high; |
| 74 | __le32 addr_low; |
| 75 | }; |
| 76 | LIBIE_CHECK_STRUCT_LEN(16, libie_aqc_driver_ver); |
| 77 | |
| 78 | enum libie_aq_res_id { |
| 79 | LIBIE_AQC_RES_ID_NVM = 1, |
| 80 | LIBIE_AQC_RES_ID_SDP = 2, |
| 81 | LIBIE_AQC_RES_ID_CHNG_LOCK = 3, |
| 82 | LIBIE_AQC_RES_ID_GLBL_LOCK = 4, |
| 83 | }; |
| 84 | |
| 85 | enum libie_aq_res_access_type { |
| 86 | LIBIE_AQC_RES_ACCESS_READ = 1, |
| 87 | LIBIE_AQC_RES_ACCESS_WRITE = 2, |
| 88 | }; |
| 89 | |
| 90 | #define LIBIE_AQ_RES_NVM_READ_DFLT_TIMEOUT_MS 3000 |
| 91 | #define LIBIE_AQ_RES_NVM_WRITE_DFLT_TIMEOUT_MS 180000 |
| 92 | #define LIBIE_AQ_RES_CHNG_LOCK_DFLT_TIMEOUT_MS 1000 |
| 93 | #define LIBIE_AQ_RES_GLBL_LOCK_DFLT_TIMEOUT_MS 3000 |
| 94 | |
| 95 | #define LIBIE_AQ_RES_GLBL_SUCCESS 0 |
| 96 | #define LIBIE_AQ_RES_GLBL_IN_PROG 1 |
| 97 | #define LIBIE_AQ_RES_GLBL_DONE 2 |
| 98 | |
| 99 | /** |
| 100 | * struct libie_aqc_req_res - Request resource ownership |
| 101 | * @res_id: resource ID (look at enum definition above) |
| 102 | * @access_type: read or write (enum definition above) |
| 103 | * @timeout: Upon successful completion, FW writes this value and driver is |
| 104 | * expected to release resource before timeout. This value is provided in |
| 105 | * milliseconds. |
| 106 | * @res_number: for SDP, this is the pin ID of the SDP |
| 107 | * @status: status only used for LIBIE_AQC_RES_ID_GLBL_LOCK, for others reserved |
| 108 | * @reserved: reserved for future use |
| 109 | * |
| 110 | * Used in commands: |
| 111 | * request resource ownership (direct 0x0008) |
| 112 | * request resource ownership (direct 0x0009) |
| 113 | */ |
| 114 | struct libie_aqc_req_res { |
| 115 | __le16 res_id; |
| 116 | __le16 access_type; |
| 117 | |
| 118 | __le32 timeout; |
| 119 | __le32 res_number; |
| 120 | __le16 status; |
| 121 | u8 reserved[2]; |
| 122 | }; |
| 123 | LIBIE_CHECK_STRUCT_LEN(16, libie_aqc_req_res); |
| 124 | |
| 125 | /** |
| 126 | * struct libie_aqc_list_caps - Getting capabilities |
| 127 | * @cmd_flags: command flags |
| 128 | * @pf_index: index of PF to get caps from |
| 129 | * @reserved: reserved for future use |
| 130 | * @count: number of capabilities records |
| 131 | * @addr_high: high part of response address buff |
| 132 | * @addr_low: low part of response address buff |
| 133 | * |
| 134 | * Used in commands: |
| 135 | * get function capabilities (indirect 0x000A) |
| 136 | * get device capabilities (indirect 0x000B) |
| 137 | */ |
| 138 | struct libie_aqc_list_caps { |
| 139 | u8 cmd_flags; |
| 140 | u8 pf_index; |
| 141 | u8 reserved[2]; |
| 142 | __le32 count; |
| 143 | __le32 addr_high; |
| 144 | __le32 addr_low; |
| 145 | }; |
| 146 | LIBIE_CHECK_STRUCT_LEN(16, libie_aqc_list_caps); |
| 147 | |
| 148 | /* Device/Function buffer entry, repeated per reported capability */ |
| 149 | #define LIBIE_AQC_CAPS_SWITCH_MODE 0x0001 |
| 150 | #define LIBIE_AQC_CAPS_MNG_MODE 0x0002 |
| 151 | #define LIBIE_AQC_CAPS_NPAR_ACTIVE 0x0003 |
| 152 | #define LIBIE_AQC_CAPS_OS2BMC_CAP 0x0004 |
| 153 | #define LIBIE_AQC_CAPS_VALID_FUNCTIONS 0x0005 |
| 154 | #define LIBIE_AQC_MAX_VALID_FUNCTIONS 0x8 |
| 155 | #define LIBIE_AQC_CAPS_SRIOV 0x0012 |
| 156 | #define LIBIE_AQC_CAPS_VF 0x0013 |
| 157 | #define LIBIE_AQC_CAPS_VMDQ 0x0014 |
| 158 | #define LIBIE_AQC_CAPS_8021QBG 0x0015 |
| 159 | #define LIBIE_AQC_CAPS_8021QBR 0x0016 |
| 160 | #define LIBIE_AQC_CAPS_VSI 0x0017 |
| 161 | #define LIBIE_AQC_CAPS_DCB 0x0018 |
| 162 | #define LIBIE_AQC_CAPS_FCOE 0x0021 |
| 163 | #define LIBIE_AQC_CAPS_ISCSI 0x0022 |
| 164 | #define 0x0040 |
| 165 | #define LIBIE_AQC_CAPS_RXQS 0x0041 |
| 166 | #define LIBIE_AQC_CAPS_TXQS 0x0042 |
| 167 | #define LIBIE_AQC_CAPS_MSIX 0x0043 |
| 168 | #define LIBIE_AQC_CAPS_VF_MSIX 0x0044 |
| 169 | #define LIBIE_AQC_CAPS_FD 0x0045 |
| 170 | #define LIBIE_AQC_CAPS_1588 0x0046 |
| 171 | #define LIBIE_AQC_CAPS_MAX_MTU 0x0047 |
| 172 | #define LIBIE_AQC_CAPS_NVM_VER 0x0048 |
| 173 | #define LIBIE_AQC_CAPS_PENDING_NVM_VER 0x0049 |
| 174 | #define LIBIE_AQC_CAPS_OROM_VER 0x004A |
| 175 | #define LIBIE_AQC_CAPS_PENDING_OROM_VER 0x004B |
| 176 | #define LIBIE_AQC_CAPS_NET_VER 0x004C |
| 177 | #define LIBIE_AQC_CAPS_PENDING_NET_VER 0x004D |
| 178 | #define LIBIE_AQC_CAPS_RDMA 0x0051 |
| 179 | #define LIBIE_AQC_CAPS_LED 0x0061 |
| 180 | #define LIBIE_AQC_CAPS_SDP 0x0062 |
| 181 | #define LIBIE_AQC_CAPS_MDIO 0x0063 |
| 182 | #define LIBIE_AQC_CAPS_WSR_PROT 0x0064 |
| 183 | #define LIBIE_AQC_CAPS_SENSOR_READING 0x0067 |
| 184 | #define LIBIE_AQC_INLINE_IPSEC 0x0070 |
| 185 | #define LIBIE_AQC_CAPS_NUM_ENABLED_PORTS 0x0072 |
| 186 | #define LIBIE_AQC_CAPS_PCIE_RESET_AVOIDANCE 0x0076 |
| 187 | #define LIBIE_AQC_CAPS_POST_UPDATE_RESET_RESTRICT 0x0077 |
| 188 | #define LIBIE_AQC_CAPS_NVM_MGMT 0x0080 |
| 189 | #define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG0 0x0081 |
| 190 | #define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG1 0x0082 |
| 191 | #define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG2 0x0083 |
| 192 | #define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG3 0x0084 |
| 193 | #define LIBIE_AQC_CAPS_TX_SCHED_TOPO_COMP_MODE 0x0085 |
| 194 | #define LIBIE_AQC_CAPS_NAC_TOPOLOGY 0x0087 |
| 195 | #define LIBIE_AQC_CAPS_FW_LAG_SUPPORT 0x0092 |
| 196 | #define LIBIE_AQC_BIT_ROCEV2_LAG BIT(0) |
| 197 | #define LIBIE_AQC_BIT_SRIOV_LAG BIT(1) |
| 198 | #define LIBIE_AQC_BIT_SRIOV_AA_LAG BIT(2) |
| 199 | #define LIBIE_AQC_CAPS_FLEX10 0x00F1 |
| 200 | #define LIBIE_AQC_CAPS_CEM 0x00F2 |
| 201 | |
| 202 | /** |
| 203 | * struct libie_aqc_list_caps_elem - Getting list of caps elements |
| 204 | * @cap: one from the defines list above |
| 205 | * @major_ver: major version |
| 206 | * @minor_ver: minor version |
| 207 | * @number: number of resources described by this capability |
| 208 | * @logical_id: logical ID, only meaningful for some types of resources |
| 209 | * @phys_id: physical ID, only meaningful for some types of resources |
| 210 | * @rsvd1: reserved for future use |
| 211 | * @rsvd2: reserved for future use |
| 212 | */ |
| 213 | struct libie_aqc_list_caps_elem { |
| 214 | __le16 cap; |
| 215 | |
| 216 | u8 major_ver; |
| 217 | u8 minor_ver; |
| 218 | __le32 number; |
| 219 | __le32 logical_id; |
| 220 | __le32 phys_id; |
| 221 | __le64 rsvd1; |
| 222 | __le64 rsvd2; |
| 223 | }; |
| 224 | LIBIE_CHECK_STRUCT_LEN(32, libie_aqc_list_caps_elem); |
| 225 | |
| 226 | /* Admin Queue command opcodes */ |
| 227 | enum libie_adminq_opc { |
| 228 | /* FW Logging Commands */ |
| 229 | libie_aqc_opc_fw_logs_config = 0xFF30, |
| 230 | libie_aqc_opc_fw_logs_register = 0xFF31, |
| 231 | libie_aqc_opc_fw_logs_query = 0xFF32, |
| 232 | libie_aqc_opc_fw_logs_event = 0xFF33, |
| 233 | }; |
| 234 | |
| 235 | enum libie_aqc_fw_logging_mod { |
| 236 | LIBIE_AQC_FW_LOG_ID_GENERAL = 0, |
| 237 | LIBIE_AQC_FW_LOG_ID_CTRL, |
| 238 | LIBIE_AQC_FW_LOG_ID_LINK, |
| 239 | LIBIE_AQC_FW_LOG_ID_LINK_TOPO, |
| 240 | LIBIE_AQC_FW_LOG_ID_DNL, |
| 241 | LIBIE_AQC_FW_LOG_ID_I2C, |
| 242 | LIBIE_AQC_FW_LOG_ID_SDP, |
| 243 | LIBIE_AQC_FW_LOG_ID_MDIO, |
| 244 | LIBIE_AQC_FW_LOG_ID_ADMINQ, |
| 245 | LIBIE_AQC_FW_LOG_ID_HDMA, |
| 246 | LIBIE_AQC_FW_LOG_ID_LLDP, |
| 247 | LIBIE_AQC_FW_LOG_ID_DCBX, |
| 248 | LIBIE_AQC_FW_LOG_ID_DCB, |
| 249 | LIBIE_AQC_FW_LOG_ID_XLR, |
| 250 | LIBIE_AQC_FW_LOG_ID_NVM, |
| 251 | LIBIE_AQC_FW_LOG_ID_AUTH, |
| 252 | LIBIE_AQC_FW_LOG_ID_VPD, |
| 253 | LIBIE_AQC_FW_LOG_ID_IOSF, |
| 254 | LIBIE_AQC_FW_LOG_ID_PARSER, |
| 255 | LIBIE_AQC_FW_LOG_ID_SW, |
| 256 | LIBIE_AQC_FW_LOG_ID_SCHEDULER, |
| 257 | LIBIE_AQC_FW_LOG_ID_TXQ, |
| 258 | LIBIE_AQC_FW_LOG_ID_RSVD, |
| 259 | LIBIE_AQC_FW_LOG_ID_POST, |
| 260 | LIBIE_AQC_FW_LOG_ID_WATCHDOG, |
| 261 | LIBIE_AQC_FW_LOG_ID_TASK_DISPATCH, |
| 262 | LIBIE_AQC_FW_LOG_ID_MNG, |
| 263 | LIBIE_AQC_FW_LOG_ID_SYNCE, |
| 264 | LIBIE_AQC_FW_LOG_ID_HEALTH, |
| 265 | LIBIE_AQC_FW_LOG_ID_TSDRV, |
| 266 | LIBIE_AQC_FW_LOG_ID_PFREG, |
| 267 | LIBIE_AQC_FW_LOG_ID_MDLVER, |
| 268 | LIBIE_AQC_FW_LOG_ID_MAX |
| 269 | }; |
| 270 | |
| 271 | /* Set FW Logging configuration (indirect 0xFF30) |
| 272 | * Register for FW Logging (indirect 0xFF31) |
| 273 | * Query FW Logging (indirect 0xFF32) |
| 274 | * FW Log Event (indirect 0xFF33) |
| 275 | */ |
| 276 | #define LIBIE_AQC_FW_LOG_CONF_UART_EN BIT(0) |
| 277 | #define LIBIE_AQC_FW_LOG_CONF_AQ_EN BIT(1) |
| 278 | #define LIBIE_AQC_FW_LOG_QUERY_REGISTERED BIT(2) |
| 279 | #define LIBIE_AQC_FW_LOG_CONF_SET_VALID BIT(3) |
| 280 | #define LIBIE_AQC_FW_LOG_AQ_REGISTER BIT(0) |
| 281 | #define LIBIE_AQC_FW_LOG_AQ_QUERY BIT(2) |
| 282 | |
| 283 | #define LIBIE_AQC_FW_LOG_MIN_RESOLUTION 1 |
| 284 | #define LIBIE_AQC_FW_LOG_MAX_RESOLUTION 128 |
| 285 | |
| 286 | struct libie_aqc_fw_log { |
| 287 | u8 cmd_flags; |
| 288 | |
| 289 | u8 rsp_flag; |
| 290 | __le16 fw_rt_msb; |
| 291 | union { |
| 292 | struct { |
| 293 | __le32 fw_rt_lsb; |
| 294 | } sync; |
| 295 | struct { |
| 296 | __le16 log_resolution; |
| 297 | __le16 mdl_cnt; |
| 298 | } cfg; |
| 299 | } ops; |
| 300 | __le32 addr_high; |
| 301 | __le32 addr_low; |
| 302 | }; |
| 303 | |
| 304 | /* Response Buffer for: |
| 305 | * Set Firmware Logging Configuration (0xFF30) |
| 306 | * Query FW Logging (0xFF32) |
| 307 | */ |
| 308 | struct libie_aqc_fw_log_cfg_resp { |
| 309 | __le16 module_identifier; |
| 310 | u8 log_level; |
| 311 | u8 rsvd0; |
| 312 | }; |
| 313 | |
| 314 | /** |
| 315 | * struct libie_aq_desc - Admin Queue (AQ) descriptor |
| 316 | * @flags: LIBIE_AQ_FLAG_* flags |
| 317 | * @opcode: AQ command opcode |
| 318 | * @datalen: length in bytes of indirect/external data buffer |
| 319 | * @retval: return value from firmware |
| 320 | * @cookie_high: opaque data high-half |
| 321 | * @cookie_low: opaque data low-half |
| 322 | * @params: command-specific parameters |
| 323 | * |
| 324 | * Descriptor format for commands the driver posts on the Admin Transmit Queue |
| 325 | * (ATQ). The firmware writes back onto the command descriptor and returns |
| 326 | * the result of the command. Asynchronous events that are not an immediate |
| 327 | * result of the command are written to the Admin Receive Queue (ARQ) using |
| 328 | * the same descriptor format. Descriptors are in little-endian notation with |
| 329 | * 32-bit words. |
| 330 | */ |
| 331 | struct libie_aq_desc { |
| 332 | __le16 flags; |
| 333 | __le16 opcode; |
| 334 | __le16 datalen; |
| 335 | __le16 retval; |
| 336 | __le32 cookie_high; |
| 337 | __le32 cookie_low; |
| 338 | union { |
| 339 | u8 raw[16]; |
| 340 | struct libie_aqc_generic generic; |
| 341 | struct libie_aqc_get_ver get_ver; |
| 342 | struct libie_aqc_driver_ver driver_ver; |
| 343 | struct libie_aqc_req_res res_owner; |
| 344 | struct libie_aqc_list_caps get_cap; |
| 345 | struct libie_aqc_fw_log fw_log; |
| 346 | } params; |
| 347 | }; |
| 348 | LIBIE_CHECK_STRUCT_LEN(32, libie_aq_desc); |
| 349 | |
| 350 | /* FW defined boundary for a large buffer, 4k >= Large buffer > 512 bytes */ |
| 351 | #define LIBIE_AQ_LG_BUF 512 |
| 352 | |
| 353 | /* Flags sub-structure |
| 354 | * |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11 |12 |13 |14 |15 | |
| 355 | * |DD |CMP|ERR|VFE| * * RESERVED * * |LB |RD |VFC|BUF|SI |EI |FE | |
| 356 | */ |
| 357 | #define LIBIE_AQ_FLAG_DD BIT(0) /* 0x1 */ |
| 358 | #define LIBIE_AQ_FLAG_CMP BIT(1) /* 0x2 */ |
| 359 | #define LIBIE_AQ_FLAG_ERR BIT(2) /* 0x4 */ |
| 360 | #define LIBIE_AQ_FLAG_VFE BIT(3) /* 0x8 */ |
| 361 | #define LIBIE_AQ_FLAG_LB BIT(9) /* 0x200 */ |
| 362 | #define LIBIE_AQ_FLAG_RD BIT(10) /* 0x400 */ |
| 363 | #define LIBIE_AQ_FLAG_VFC BIT(11) /* 0x800 */ |
| 364 | #define LIBIE_AQ_FLAG_BUF BIT(12) /* 0x1000 */ |
| 365 | #define LIBIE_AQ_FLAG_SI BIT(13) /* 0x2000 */ |
| 366 | #define LIBIE_AQ_FLAG_EI BIT(14) /* 0x4000 */ |
| 367 | #define LIBIE_AQ_FLAG_FE BIT(15) /* 0x8000 */ |
| 368 | |
| 369 | /* error codes */ |
| 370 | enum libie_aq_err { |
| 371 | LIBIE_AQ_RC_OK = 0, /* Success */ |
| 372 | LIBIE_AQ_RC_EPERM = 1, /* Operation not permitted */ |
| 373 | LIBIE_AQ_RC_ENOENT = 2, /* No such element */ |
| 374 | LIBIE_AQ_RC_ESRCH = 3, /* Bad opcode */ |
| 375 | LIBIE_AQ_RC_EIO = 5, /* I/O error */ |
| 376 | LIBIE_AQ_RC_EAGAIN = 8, /* Try again */ |
| 377 | LIBIE_AQ_RC_ENOMEM = 9, /* Out of memory */ |
| 378 | LIBIE_AQ_RC_EACCES = 10, /* Permission denied */ |
| 379 | LIBIE_AQ_RC_EBUSY = 12, /* Device or resource busy */ |
| 380 | LIBIE_AQ_RC_EEXIST = 13, /* Object already exists */ |
| 381 | LIBIE_AQ_RC_EINVAL = 14, /* Invalid argument */ |
| 382 | LIBIE_AQ_RC_ENOSPC = 16, /* No space left or allocation failure */ |
| 383 | LIBIE_AQ_RC_ENOSYS = 17, /* Function not implemented */ |
| 384 | LIBIE_AQ_RC_EMODE = 21, /* Op not allowed in current dev mode */ |
| 385 | LIBIE_AQ_RC_ENOSEC = 24, /* Missing security manifest */ |
| 386 | LIBIE_AQ_RC_EBADSIG = 25, /* Bad RSA signature */ |
| 387 | LIBIE_AQ_RC_ESVN = 26, /* SVN number prohibits this package */ |
| 388 | LIBIE_AQ_RC_EBADMAN = 27, /* Manifest hash mismatch */ |
| 389 | LIBIE_AQ_RC_EBADBUF = 28, /* Buffer hash mismatches manifest */ |
| 390 | }; |
| 391 | |
| 392 | static inline void *libie_aq_raw(struct libie_aq_desc *desc) |
| 393 | { |
| 394 | return &desc->params.raw; |
| 395 | } |
| 396 | |
| 397 | const char *libie_aq_str(enum libie_aq_err err); |
| 398 | |
| 399 | #endif /* __LIBIE_ADMINQ_H */ |
| 400 | |