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 LIBIE_AQC_CAPS_RSS 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