mirror of
https://github.com/ipxe/ipxe
synced 2026-05-18 10:00:30 +03:00
adcaaf9b93
Some past security reviews carried out for UEFI Secure Boot signing submissions have covered specific drivers or functional areas of iPXE. Mark all of the files comprising these areas as permitted for UEFI Secure Boot. Signed-off-by: Michael Brown <mcb30@ipxe.org>
423 lines
11 KiB
C
423 lines
11 KiB
C
#ifndef _INTELXLVF_H
|
|
#define _INTELXLVF_H
|
|
|
|
/** @file
|
|
*
|
|
* Intel 40 Gigabit Ethernet virtual function network card driver
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
FILE_SECBOOT ( PERMITTED );
|
|
|
|
#include "intelxl.h"
|
|
|
|
/** BAR size */
|
|
#define INTELXLVF_BAR_SIZE 0x10000
|
|
|
|
/** MSI-X vector
|
|
*
|
|
* The 100 Gigabit physical function driver requires a virtual
|
|
* function driver to request that transmit and receive queues are
|
|
* mapped to MSI-X vector 1 or higher.
|
|
*/
|
|
#define INTELXLVF_MSIX_VECTOR 1
|
|
|
|
/** Transmit Queue Tail Register */
|
|
#define INTELXLVF_QTX_TAIL 0x00000
|
|
|
|
/** Receive Queue Tail Register */
|
|
#define INTELXLVF_QRX_TAIL 0x02000
|
|
|
|
/** VF Interrupt N Dynamic Control Register */
|
|
#define INTELXLVF_VFINT_DYN_CTLN( x ) ( 0x3800 + ( 0x4 * ( (x) - 1 ) ) )
|
|
|
|
/** VF Interrupt Zero Dynamic Control Register */
|
|
#define INTELXLVF_VFINT_DYN_CTL0 0x5c00
|
|
|
|
/** VF Admin Queue register block */
|
|
#define INTELXLVF_ADMIN 0x6000
|
|
|
|
/** Admin Command Queue Base Address Low Register (offset) */
|
|
#define INTELXLVF_ADMIN_CMD_BAL 0x1c00
|
|
|
|
/** Admin Command Queue Base Address High Register (offset) */
|
|
#define INTELXLVF_ADMIN_CMD_BAH 0x1800
|
|
|
|
/** Admin Command Queue Length Register (offset) */
|
|
#define INTELXLVF_ADMIN_CMD_LEN 0x0800
|
|
|
|
/** Admin Command Queue Head Register (offset) */
|
|
#define INTELXLVF_ADMIN_CMD_HEAD 0x0400
|
|
|
|
/** Admin Command Queue Tail Register (offset) */
|
|
#define INTELXLVF_ADMIN_CMD_TAIL 0x2400
|
|
|
|
/** Admin Event Queue Base Address Low Register (offset) */
|
|
#define INTELXLVF_ADMIN_EVT_BAL 0x0c00
|
|
|
|
/** Admin Event Queue Base Address High Register (offset) */
|
|
#define INTELXLVF_ADMIN_EVT_BAH 0x0000
|
|
|
|
/** Admin Event Queue Length Register (offset) */
|
|
#define INTELXLVF_ADMIN_EVT_LEN 0x2000
|
|
|
|
/** Admin Event Queue Head Register (offset) */
|
|
#define INTELXLVF_ADMIN_EVT_HEAD 0x1400
|
|
|
|
/** Admin Event Queue Tail Register (offset) */
|
|
#define INTELXLVF_ADMIN_EVT_TAIL 0x1000
|
|
|
|
/** Maximum time to wait for a VF admin request to complete */
|
|
#define INTELXLVF_ADMIN_MAX_WAIT_MS 2000
|
|
|
|
/** Admin queue Send Message to PF command */
|
|
#define INTELXLVF_ADMIN_SEND_TO_PF 0x0801
|
|
|
|
/** Admin queue Send Message to VF command */
|
|
#define INTELXLVF_ADMIN_SEND_TO_VF 0x0802
|
|
|
|
/** Admin Queue VF Version opcode */
|
|
#define INTELXLVF_ADMIN_VERSION 0x00000001
|
|
|
|
/** Admin Queue VF Version data buffer */
|
|
struct intelxlvf_admin_version_buffer {
|
|
/** Major version */
|
|
uint32_t major;
|
|
/** Minor version */
|
|
uint32_t minor;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin queue VF API major version */
|
|
#define INTELXLVF_ADMIN_API_MAJOR 1
|
|
|
|
/** Admin queue VF API minor version */
|
|
#define INTELXLVF_ADMIN_API_MINOR 1
|
|
|
|
/** Admin Queue VF Reset opcode */
|
|
#define INTELXLVF_ADMIN_RESET 0x00000002
|
|
|
|
/** Admin Queue VF Get Resources opcode */
|
|
#define INTELXLVF_ADMIN_GET_RESOURCES 0x00000003
|
|
|
|
/** Admin Queue VF Capabilities data buffer */
|
|
struct intelxlvf_admin_capabilities_buffer {
|
|
/** Capabilities */
|
|
uint32_t caps;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Get Resources data buffer */
|
|
struct intelxlvf_admin_get_resources_buffer {
|
|
/** Number of VSIs */
|
|
uint16_t vsis;
|
|
/** Number of queue pairs */
|
|
uint16_t qps;
|
|
/** Number of MSI-X vectors */
|
|
uint16_t vectors;
|
|
/** Maximum MTU */
|
|
uint16_t mtu;
|
|
/** Capabilities */
|
|
uint32_t caps;
|
|
/** Reserved */
|
|
uint8_t reserved_a[8];
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Reserved */
|
|
uint8_t reserved_b[8];
|
|
/** MAC address */
|
|
uint8_t mac[ETH_ALEN];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Layer 2 capabilities (add/remove MAC, configure promiscuous mode) */
|
|
#define INTELXLVF_ADMIN_CAP_L2 0x00000001
|
|
|
|
/** Request Queues capabilities */
|
|
#define INTELXLVF_ADMIN_CAP_RQPS 0x00000040
|
|
|
|
/** Admin Queue VF Status Change Event opcode */
|
|
#define INTELXLVF_ADMIN_STATUS 0x00000011
|
|
|
|
/** Link status change event type */
|
|
#define INTELXLVF_ADMIN_STATUS_LINK 0x00000001
|
|
|
|
/** Link status change event data */
|
|
struct intelxlvf_admin_status_link {
|
|
/** Link speed */
|
|
uint32_t speed;
|
|
/** Link status */
|
|
uint8_t status;
|
|
/** Reserved */
|
|
uint8_t reserved[3];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Status Change Event data buffer */
|
|
struct intelxlvf_admin_status_buffer {
|
|
/** Event type */
|
|
uint32_t event;
|
|
/** Event data */
|
|
union {
|
|
/** Link change event data */
|
|
struct intelxlvf_admin_status_link link;
|
|
} data;
|
|
/** Reserved */
|
|
uint8_t reserved[4];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Configure Queues opcode */
|
|
#define INTELXLVF_ADMIN_CONFIGURE 0x00000006
|
|
|
|
/** Admin Queue VF Configure Queues data buffer */
|
|
struct intelxlvf_admin_configure_buffer {
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Number of queue pairs */
|
|
uint16_t count;
|
|
/** Reserved */
|
|
uint8_t reserved_a[4];
|
|
/** Transmit queue */
|
|
struct {
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Queue ID */
|
|
uint16_t id;
|
|
/** Queue count */
|
|
uint16_t count;
|
|
/** Reserved */
|
|
uint8_t reserved_a[2];
|
|
/** Base address */
|
|
uint64_t base;
|
|
/** Reserved */
|
|
uint8_t reserved_b[8];
|
|
} __attribute__ (( packed )) tx;
|
|
/** Receive queue */
|
|
struct {
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Queue ID */
|
|
uint16_t id;
|
|
/** Queue count */
|
|
uint32_t count;
|
|
/** Reserved */
|
|
uint8_t reserved_a[4];
|
|
/** Data buffer length */
|
|
uint32_t len;
|
|
/** Maximum frame size */
|
|
uint32_t mfs;
|
|
/** Reserved */
|
|
uint8_t reserved_b[4];
|
|
/** Base address */
|
|
uint64_t base;
|
|
/** Reserved */
|
|
uint8_t reserved_c[8];
|
|
} __attribute__ (( packed )) rx;
|
|
/** Reserved
|
|
*
|
|
* This field exists only due to a bug in the PF driver's
|
|
* message validation logic, which causes it to miscalculate
|
|
* the expected message length.
|
|
*/
|
|
uint8_t reserved_b[64];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF IRQ Map opcode */
|
|
#define INTELXLVF_ADMIN_IRQ_MAP 0x00000007
|
|
|
|
/** Admin Queue VF IRQ Map data buffer */
|
|
struct intelxlvf_admin_irq_map_buffer {
|
|
/** Number of interrupt vectors */
|
|
uint16_t count;
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Interrupt vector ID */
|
|
uint16_t vec;
|
|
/** Receive queue bitmap */
|
|
uint16_t rxmap;
|
|
/** Transmit queue bitmap */
|
|
uint16_t txmap;
|
|
/** Receive interrupt throttling index */
|
|
uint16_t rxitr;
|
|
/** Transmit interrupt throttling index */
|
|
uint16_t txitr;
|
|
/** Reserved
|
|
*
|
|
* This field exists only due to a bug in the PF driver's
|
|
* message validation logic, which causes it to miscalculate
|
|
* the expected message length.
|
|
*/
|
|
uint8_t reserved[12];
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Enable Queues opcode */
|
|
#define INTELXLVF_ADMIN_ENABLE 0x00000008
|
|
|
|
/** Admin Queue VF Disable Queues opcode */
|
|
#define INTELXLVF_ADMIN_DISABLE 0x00000009
|
|
|
|
/** Admin Queue VF Enable/Disable Queues data buffer */
|
|
struct intelxlvf_admin_queues_buffer {
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Reserved */
|
|
uint8_t reserved[2];
|
|
/** Receive queue bitmask */
|
|
uint32_t rx;
|
|
/** Transmit queue bitmask */
|
|
uint32_t tx;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Configure Promiscuous Mode opcode */
|
|
#define INTELXLVF_ADMIN_PROMISC 0x0000000e
|
|
|
|
/** Admin Queue VF Configure Promiscuous Mode data buffer */
|
|
struct intelxlvf_admin_promisc_buffer {
|
|
/** VSI switching element ID */
|
|
uint16_t vsi;
|
|
/** Flags */
|
|
uint16_t flags;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Get Statistics opcode */
|
|
#define INTELXLVF_ADMIN_GET_STATS 0x0000000f
|
|
|
|
/** VF statistics */
|
|
struct intelxlvf_admin_stats {
|
|
/** Bytes */
|
|
uint64_t bytes;
|
|
/** Unicast packets */
|
|
uint64_t unicasts;
|
|
/** Multicast packets */
|
|
uint64_t multicasts;
|
|
/** Broadcast packets */
|
|
uint64_t broadcasts;
|
|
/** Discarded packets */
|
|
uint64_t discards;
|
|
/** Errors */
|
|
uint64_t errors;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Get Statistics data buffer */
|
|
struct intelxlvf_admin_stats_buffer {
|
|
/** Receive statistics */
|
|
struct intelxlvf_admin_stats rx;
|
|
/** Transmit statistics */
|
|
struct intelxlvf_admin_stats tx;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin Queue VF Request Queues opcode */
|
|
#define INTELXLVF_ADMIN_REQUEST_QPS 0x0000001d
|
|
|
|
/** Admin Queue VF Request Queues data buffer */
|
|
struct intelxlvf_admin_request_qps_buffer {
|
|
/** Number of queue pairs */
|
|
uint16_t count;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin queue data buffer */
|
|
union intelxlvf_admin_buffer {
|
|
/** Original 40 Gigabit Ethernet data buffer */
|
|
union intelxl_admin_buffer xl;
|
|
/** VF Version data buffer */
|
|
struct intelxlvf_admin_version_buffer ver;
|
|
/** VF Capabilities data buffer */
|
|
struct intelxlvf_admin_capabilities_buffer caps;
|
|
/** VF Get Resources data buffer */
|
|
struct intelxlvf_admin_get_resources_buffer res;
|
|
/** VF Status Change Event data buffer */
|
|
struct intelxlvf_admin_status_buffer stat;
|
|
/** VF Configure Queues data buffer */
|
|
struct intelxlvf_admin_configure_buffer cfg;
|
|
/** VF Enable/Disable Queues data buffer */
|
|
struct intelxlvf_admin_queues_buffer queues;
|
|
/** VF Configure Promiscuous Mode data buffer */
|
|
struct intelxlvf_admin_promisc_buffer promisc;
|
|
/** VF IRQ Map data buffer */
|
|
struct intelxlvf_admin_irq_map_buffer irq;
|
|
/** VF Get Statistics data buffer */
|
|
struct intelxlvf_admin_stats_buffer stats;
|
|
/** VF Request Queues data buffer */
|
|
struct intelxlvf_admin_request_qps_buffer rqps;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Admin queue descriptor */
|
|
struct intelxlvf_admin_descriptor {
|
|
/** Transparent union */
|
|
union {
|
|
/** Original 40 Gigabit Ethernet descriptor */
|
|
struct intelxl_admin_descriptor xl;
|
|
/** Transparent struct */
|
|
struct {
|
|
/** Flags */
|
|
uint16_t flags;
|
|
/** Opcode */
|
|
uint16_t opcode;
|
|
/** Data length */
|
|
uint16_t len;
|
|
/** Return value */
|
|
uint16_t ret;
|
|
/** VF opcode */
|
|
uint32_t vopcode;
|
|
/** VF return value */
|
|
int32_t vret;
|
|
/** Parameters */
|
|
union intelxl_admin_params params;
|
|
} __attribute__ (( packed ));
|
|
} __attribute__ (( packed ));
|
|
} __attribute__ (( packed ));
|
|
|
|
/**
|
|
* Get next admin command queue descriptor
|
|
*
|
|
* @v intelxl Intel device
|
|
* @ret cmd Command descriptor
|
|
*/
|
|
struct intelxlvf_admin_descriptor *
|
|
intelxlvf_admin_command_descriptor ( struct intelxl_nic *intelxl ) {
|
|
struct intelxl_admin_descriptor *xlcmd =
|
|
intelxl_admin_command_descriptor ( intelxl );
|
|
|
|
return container_of ( xlcmd, struct intelxlvf_admin_descriptor, xl );
|
|
}
|
|
|
|
/**
|
|
* Get next admin command queue data buffer
|
|
*
|
|
* @v intelxl Intel device
|
|
* @ret buf Data buffer
|
|
*/
|
|
static inline __attribute__ (( always_inline )) union intelxlvf_admin_buffer *
|
|
intelxlvf_admin_command_buffer ( struct intelxl_nic *intelxl ) {
|
|
union intelxl_admin_buffer *xlbuf =
|
|
intelxl_admin_command_buffer ( intelxl );
|
|
|
|
return container_of ( xlbuf, union intelxlvf_admin_buffer, xl );
|
|
}
|
|
|
|
/** VF Reset Status Register */
|
|
#define INTELXLVF_VFGEN_RSTAT 0x8800
|
|
#define INTELXLVF_VFGEN_RSTAT_VFR_STATE(x) ( (x) & 0x3 )
|
|
#define INTELXLVF_VFGEN_RSTAT_VFR_STATE_ACTIVE 0x2
|
|
|
|
/** Minimum time to wait for reset to complete */
|
|
#define INTELXLVF_RESET_DELAY_MS 100
|
|
|
|
/** Maximum time to wait for reset to complete */
|
|
#define INTELXLVF_RESET_MAX_WAIT_MS 1000
|
|
|
|
/**
|
|
* Initialise descriptor ring
|
|
*
|
|
* @v ring Descriptor ring
|
|
* @v count Number of descriptors
|
|
* @v len Length of a single descriptor
|
|
* @v tail Tail register offset
|
|
*/
|
|
static inline __attribute__ (( always_inline)) void
|
|
intelxlvf_init_ring ( struct intelxl_ring *ring, unsigned int count,
|
|
size_t len, unsigned int tail ) {
|
|
|
|
ring->len = ( count * len );
|
|
ring->tail = tail;
|
|
}
|
|
|
|
#endif /* _INTELXLVF_H */
|