/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2025 Intel Corporation */
#ifndef __LIBIE_ADMINQ_H
#define __LIBIE_ADMINQ_H
#include <linux/build_bug.h>
#include <linux/types.h>
#define LIBIE_CHECK_STRUCT_LEN(n, X) \
static_assert((n) == sizeof (struct X))
/**
* struct libie_aqc_generic - Generic structure used in adminq communication
* @ param0 : generic parameter high 32 bit
* @ param1 : generic parameter lower 32 bit
* @ addr_high : generic address high 32 bit
* @ addr_low : generic address lower 32 bit
*/
struct libie_aqc_generic {
__le32 param0;
__le32 param1;
__le32 addr_high;
__le32 addr_low;
};
LIBIE_CHECK_STRUCT_LEN(16 , libie_aqc_generic);
/**
* struct libie_aqc_get_ver - Used in command get version ( direct 0 x0001 )
* @ rom_ver : rom version
* @ fw_build : number coressponding to firmware build
* @ fw_branch : branch identifier of firmware version
* @ fw_major : major number of firmware version
* @ fw_minor : minor number of firmware version
* @ fw_patch : patch of firmware version
* @ api_branch : brancch identifier of API version
* @ api_major : major number of API version
* @ api_minor : minor number of API version
* @ api_patch : patch of API version
*/
struct libie_aqc_get_ver {
__le32 rom_ver;
__le32 fw_build;
u8 fw_branch;
u8 fw_major;
u8 fw_minor;
u8 fw_patch;
u8 api_branch;
u8 api_major;
u8 api_minor;
u8 api_patch;
};
LIBIE_CHECK_STRUCT_LEN(16 , libie_aqc_get_ver);
/**
* struct libie_aqc_driver_ver - Used in command send driver version
* ( indirect 0 x0002 )
* @ major_ver : driver major version
* @ minor_ver : driver minor version
* @ build_ver : driver build version
* @ subbuild_ver : driver subbuild version
* @ reserved : for feature use
* @ addr_high : high part of response address buff
* @ addr_low : low part of response address buff
*/
struct libie_aqc_driver_ver {
u8 major_ver;
u8 minor_ver;
u8 build_ver;
u8 subbuild_ver;
u8 reserved[4 ];
__le32 addr_high;
__le32 addr_low;
};
LIBIE_CHECK_STRUCT_LEN(16 , libie_aqc_driver_ver);
enum libie_aq_res_id {
LIBIE_AQC_RES_ID_NVM = 1 ,
LIBIE_AQC_RES_ID_SDP = 2 ,
LIBIE_AQC_RES_ID_CHNG_LOCK = 3 ,
LIBIE_AQC_RES_ID_GLBL_LOCK = 4 ,
};
enum libie_aq_res_access_type {
LIBIE_AQC_RES_ACCESS_READ = 1 ,
LIBIE_AQC_RES_ACCESS_WRITE = 2 ,
};
#define LIBIE_AQ_RES_NVM_READ_DFLT_TIMEOUT_MS 3000
#define LIBIE_AQ_RES_NVM_WRITE_DFLT_TIMEOUT_MS 180000
#define LIBIE_AQ_RES_CHNG_LOCK_DFLT_TIMEOUT_MS 1000
#define LIBIE_AQ_RES_GLBL_LOCK_DFLT_TIMEOUT_MS 3000
#define LIBIE_AQ_RES_GLBL_SUCCESS 0
#define LIBIE_AQ_RES_GLBL_IN_PROG 1
#define LIBIE_AQ_RES_GLBL_DONE 2
/**
* struct libie_aqc_req_res - Request resource ownership
* @ res_id : resource ID ( look at enum definition above )
* @ access_type : read or write ( enum definition above )
* @ timeout : Upon successful completion , FW writes this value and driver is
* expected to release resource before timeout . This value is provided in
* milliseconds .
* @ res_number : for SDP , this is the pin ID of the SDP
* @ status : status only used for LIBIE_AQC_RES_ID_GLBL_LOCK , for others reserved
* @ reserved : reserved for future use
*
* Used in commands :
* request resource ownership ( direct 0 x0008 )
* request resource ownership ( direct 0 x0009 )
*/
struct libie_aqc_req_res {
__le16 res_id;
__le16 access_type;
__le32 timeout;
__le32 res_number;
__le16 status;
u8 reserved[2 ];
};
LIBIE_CHECK_STRUCT_LEN(16 , libie_aqc_req_res);
/**
* struct libie_aqc_list_caps - Getting capabilities
* @ cmd_flags : command flags
* @ pf_index : index of PF to get caps from
* @ reserved : reserved for future use
* @ count : number of capabilities records
* @ addr_high : high part of response address buff
* @ addr_low : low part of response address buff
*
* Used in commands :
* get function capabilities ( indirect 0 x000A )
* get device capabilities ( indirect 0 x000B )
*/
struct libie_aqc_list_caps {
u8 cmd_flags;
u8 pf_index;
u8 reserved[2 ];
__le32 count;
__le32 addr_high;
__le32 addr_low;
};
LIBIE_CHECK_STRUCT_LEN(16 , libie_aqc_list_caps);
/* Device/Function buffer entry, repeated per reported capability */
#define LIBIE_AQC_CAPS_SWITCH_MODE 0 x0001
#define LIBIE_AQC_CAPS_MNG_MODE 0 x0002
#define LIBIE_AQC_CAPS_NPAR_ACTIVE 0 x0003
#define LIBIE_AQC_CAPS_OS2BMC_CAP 0 x0004
#define LIBIE_AQC_CAPS_VALID_FUNCTIONS 0 x0005
#define LIBIE_AQC_MAX_VALID_FUNCTIONS 0 x8
#define LIBIE_AQC_CAPS_SRIOV 0 x0012
#define LIBIE_AQC_CAPS_VF 0 x0013
#define LIBIE_AQC_CAPS_VMDQ 0 x0014
#define LIBIE_AQC_CAPS_8021QBG 0 x0015
#define LIBIE_AQC_CAPS_8021QBR 0 x0016
#define LIBIE_AQC_CAPS_VSI 0 x0017
#define LIBIE_AQC_CAPS_DCB 0 x0018
#define LIBIE_AQC_CAPS_FCOE 0 x0021
#define LIBIE_AQC_CAPS_ISCSI 0 x0022
#define LIBIE_AQC_CAPS_RSS 0 x0040
#define LIBIE_AQC_CAPS_RXQS 0 x0041
#define LIBIE_AQC_CAPS_TXQS 0 x0042
#define LIBIE_AQC_CAPS_MSIX 0 x0043
#define LIBIE_AQC_CAPS_VF_MSIX 0 x0044
#define LIBIE_AQC_CAPS_FD 0 x0045
#define LIBIE_AQC_CAPS_1588 0 x0046
#define LIBIE_AQC_CAPS_MAX_MTU 0 x0047
#define LIBIE_AQC_CAPS_NVM_VER 0 x0048
#define LIBIE_AQC_CAPS_PENDING_NVM_VER 0 x0049
#define LIBIE_AQC_CAPS_OROM_VER 0 x004A
#define LIBIE_AQC_CAPS_PENDING_OROM_VER 0 x004B
#define LIBIE_AQC_CAPS_NET_VER 0 x004C
#define LIBIE_AQC_CAPS_PENDING_NET_VER 0 x004D
#define LIBIE_AQC_CAPS_RDMA 0 x0051
#define LIBIE_AQC_CAPS_LED 0 x0061
#define LIBIE_AQC_CAPS_SDP 0 x0062
#define LIBIE_AQC_CAPS_MDIO 0 x0063
#define LIBIE_AQC_CAPS_WSR_PROT 0 x0064
#define LIBIE_AQC_CAPS_SENSOR_READING 0 x0067
#define LIBIE_AQC_INLINE_IPSEC 0 x0070
#define LIBIE_AQC_CAPS_NUM_ENABLED_PORTS 0 x0072
#define LIBIE_AQC_CAPS_PCIE_RESET_AVOIDANCE 0 x0076
#define LIBIE_AQC_CAPS_POST_UPDATE_RESET_RESTRICT 0 x0077
#define LIBIE_AQC_CAPS_NVM_MGMT 0 x0080
#define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG0 0 x0081
#define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG1 0 x0082
#define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG2 0 x0083
#define LIBIE_AQC_CAPS_EXT_TOPO_DEV_IMG3 0 x0084
#define LIBIE_AQC_CAPS_TX_SCHED_TOPO_COMP_MODE 0 x0085
#define LIBIE_AQC_CAPS_NAC_TOPOLOGY 0 x0087
#define LIBIE_AQC_CAPS_FW_LAG_SUPPORT 0 x0092
#define LIBIE_AQC_BIT_ROCEV2_LAG 0 x01
#define LIBIE_AQC_BIT_SRIOV_LAG 0 x02
#define LIBIE_AQC_CAPS_FLEX10 0 x00F1
#define LIBIE_AQC_CAPS_CEM 0 x00F2
/**
* struct libie_aqc_list_caps_elem - Getting list of caps elements
* @ cap : one from the defines list above
* @ major_ver : major version
* @ minor_ver : minor version
* @ number : number of resources described by this capability
* @ logical_id : logical ID , only meaningful for some types of resources
* @ phys_id : physical ID , only meaningful for some types of resources
* @ rsvd1 : reserved for future use
* @ rsvd2 : reserved for future use
*/
struct libie_aqc_list_caps_elem {
__le16 cap;
u8 major_ver;
u8 minor_ver;
__le32 number;
__le32 logical_id;
__le32 phys_id;
__le64 rsvd1;
__le64 rsvd2;
};
LIBIE_CHECK_STRUCT_LEN(32 , libie_aqc_list_caps_elem);
/**
* struct libie_aq_desc - Admin Queue ( AQ ) descriptor
* @ flags : LIBIE_AQ_FLAG_ * flags
* @ opcode : AQ command opcode
* @ datalen : length in bytes of indirect / external data buffer
* @ retval : return value from firmware
* @ cookie_high : opaque data high - half
* @ cookie_low : opaque data low - half
* @ params : command - specific parameters
*
* Descriptor format for commands the driver posts on the Admin Transmit Queue
* ( ATQ ) . The firmware writes back onto the command descriptor and returns
* the result of the command . Asynchronous events that are not an immediate
* result of the command are written to the Admin Receive Queue ( ARQ ) using
* the same descriptor format . Descriptors are in little - endian notation with
* 32 - bit words .
*/
struct libie_aq_desc {
__le16 flags;
__le16 opcode;
__le16 datalen;
__le16 retval;
__le32 cookie_high;
__le32 cookie_low;
union {
u8 raw[16 ];
struct libie_aqc_generic generic;
struct libie_aqc_get_ver get_ver;
struct libie_aqc_driver_ver driver_ver;
struct libie_aqc_req_res res_owner;
struct libie_aqc_list_caps get_cap;
} params;
};
LIBIE_CHECK_STRUCT_LEN(32 , libie_aq_desc);
/* FW defined boundary for a large buffer, 4k >= Large buffer > 512 bytes */
#define LIBIE_AQ_LG_BUF 512
/* Flags sub-structure
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
* | DD | CMP | ERR | VFE | * * RESERVED * * | LB | RD | VFC | BUF | SI | EI | FE |
*/
#define LIBIE_AQ_FLAG_DD BIT(0 ) /* 0x1 */
#define LIBIE_AQ_FLAG_CMP BIT(1 ) /* 0x2 */
#define LIBIE_AQ_FLAG_ERR BIT(2 ) /* 0x4 */
#define LIBIE_AQ_FLAG_VFE BIT(3 ) /* 0x8 */
#define LIBIE_AQ_FLAG_LB BIT(9 ) /* 0x200 */
#define LIBIE_AQ_FLAG_RD BIT(10 ) /* 0x400 */
#define LIBIE_AQ_FLAG_VFC BIT(11 ) /* 0x800 */
#define LIBIE_AQ_FLAG_BUF BIT(12 ) /* 0x1000 */
#define LIBIE_AQ_FLAG_SI BIT(13 ) /* 0x2000 */
#define LIBIE_AQ_FLAG_EI BIT(14 ) /* 0x4000 */
#define LIBIE_AQ_FLAG_FE BIT(15 ) /* 0x8000 */
/* error codes */
enum libie_aq_err {
LIBIE_AQ_RC_OK = 0 , /* Success */
LIBIE_AQ_RC_EPERM = 1 , /* Operation not permitted */
LIBIE_AQ_RC_ENOENT = 2 , /* No such element */
LIBIE_AQ_RC_ESRCH = 3 , /* Bad opcode */
LIBIE_AQ_RC_EIO = 5 , /* I/O error */
LIBIE_AQ_RC_EAGAIN = 8 , /* Try again */
LIBIE_AQ_RC_ENOMEM = 9 , /* Out of memory */
LIBIE_AQ_RC_EACCES = 10 , /* Permission denied */
LIBIE_AQ_RC_EBUSY = 12 , /* Device or resource busy */
LIBIE_AQ_RC_EEXIST = 13 , /* Object already exists */
LIBIE_AQ_RC_EINVAL = 14 , /* Invalid argument */
LIBIE_AQ_RC_ENOSPC = 16 , /* No space left or allocation failure */
LIBIE_AQ_RC_ENOSYS = 17 , /* Function not implemented */
LIBIE_AQ_RC_EMODE = 21 , /* Op not allowed in current dev mode */
LIBIE_AQ_RC_ENOSEC = 24 , /* Missing security manifest */
LIBIE_AQ_RC_EBADSIG = 25 , /* Bad RSA signature */
LIBIE_AQ_RC_ESVN = 26 , /* SVN number prohibits this package */
LIBIE_AQ_RC_EBADMAN = 27 , /* Manifest hash mismatch */
LIBIE_AQ_RC_EBADBUF = 28 , /* Buffer hash mismatches manifest */
};
static inline void *libie_aq_raw(struct libie_aq_desc *desc)
{
return &desc->params.raw;
}
const char *libie_aq_str(enum libie_aq_err err);
#endif /* __LIBIE_ADMINQ_H */
Messung V0.5 in Prozent C=87 H=100 G=93
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-10-04)
¤
*© Formatika GbR, Deutschland