#ifndef _ENA_HW_H
#define _ENA_HW_H
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/types.h>
#include <sys/debug.h>
#include <sys/ethernet.h>
#define ENAHW_MAX_NUM_IO_QUEUES 128
#define GENMASK(h, l) (((~0U) - (1U << (l)) + 1) & (~0U >> (32 - 1 - (h))))
#define BIT(b) (1UL << (b))
#define ENAHW_DMA_ADMINQ_ALIGNMENT 8
#define ENAHW_ADMIN_CQ_DESC_BUF_ALIGNMENT 8
#define ENAHW_ADMIN_SQ_DESC_BUF_ALIGNMENT 8
#define ENAHW_AENQ_DESC_BUF_ALIGNMENT 8
#define ENAHW_HOST_INFO_ALIGNMENT 8
#define ENAHW_HOST_INFO_ALLOC_SZ 4096
#define ENAHW_IO_CQ_DESC_BUF_ALIGNMENT 4096
#define ENAHW_IO_SQ_DESC_BUF_ALIGNMENT 8
#define ENAHW_REG_VERSION 0x0
#define ENAHW_REG_CONTROLLER_VERSION 0x4
#define ENAHW_REG_CAPS 0x8
#define ENAHW_REG_CAPS_EXT 0xc
#define ENAHW_REG_ASQ_BASE_LO 0x10
#define ENAHW_REG_ASQ_BASE_HI 0x14
#define ENAHW_REG_ASQ_CAPS 0x18
#define ENAHW_REG_GAP_1C 0x1c
#define ENAHW_REG_ACQ_BASE_LO 0x20
#define ENAHW_REG_ACQ_BASE_HI 0x24
#define ENAHW_REG_ACQ_CAPS 0x28
#define ENAHW_REG_ASQ_DB 0x2c
#define ENAHW_REG_ACQ_TAIL 0x30
#define ENAHW_REG_AENQ_CAPS 0x34
#define ENAHW_REG_AENQ_BASE_LO 0x38
#define ENAHW_REG_AENQ_BASE_HI 0x3c
#define ENAHW_REG_AENQ_HEAD_DB 0x40
#define ENAHW_REG_AENQ_TAIL 0x44
#define ENAHW_REG_GAP_48 0x48
#define ENAHW_REG_INTERRUPT_MASK 0x4c
#define ENAHW_REG_GAP_50 0x50
#define ENAHW_REG_DEV_CTL 0x54
#define ENAHW_REG_DEV_STS 0x58
#define ENAHW_REG_MMIO_REG_READ 0x5c
#define ENAHW_REG_MMIO_RESP_LO 0x60
#define ENAHW_REG_MMIO_RESP_HI 0x64
#define ENAHW_REG_RSS_IND_ENTRY_UPDATE 0x68
#define ENAHW_NUM_REGS ((ENAHW_REG_RSS_IND_ENTRY_UPDATE / 4) + 1)
#define ENAHW_DEV_MINOR_VSN_MASK 0xff
#define ENAHW_DEV_MAJOR_VSN_SHIFT 8
#define ENAHW_DEV_MAJOR_VSN_MASK 0xff00
#define ENAHW_DEV_MAJOR_VSN(vsn) \
(((vsn) & ENAHW_DEV_MAJOR_VSN_MASK) >> ENAHW_DEV_MAJOR_VSN_SHIFT)
#define ENAHW_DEV_MINOR_VSN(vsn) \
((vsn) & ENAHW_DEV_MINOR_VSN_MASK)
#define ENAHW_CTRL_SUBMINOR_VSN_MASK 0xff
#define ENAHW_CTRL_MINOR_VSN_SHIFT 8
#define ENAHW_CTRL_MINOR_VSN_MASK 0xff00
#define ENAHW_CTRL_MAJOR_VSN_SHIFT 16
#define ENAHW_CTRL_MAJOR_VSN_MASK 0xff0000
#define ENAHW_CTRL_IMPL_ID_SHIFT 24
#define ENAHW_CTRL_IMPL_ID_MASK 0xff000000
#define ENAHW_CTRL_MAJOR_VSN(vsn) \
(((vsn) & ENAHW_CTRL_MAJOR_VSN_MASK) >> ENAHW_CTRL_MAJOR_VSN_SHIFT)
#define ENAHW_CTRL_MINOR_VSN(vsn) \
(((vsn) & ENAHW_CTRL_MINOR_VSN_MASK) >> ENAHW_CTRL_MINOR_VSN_SHIFT)
#define ENAHW_CTRL_SUBMINOR_VSN(vsn) \
((vsn) & ENAHW_CTRL_SUBMINOR_VSN_MASK)
#define ENAHW_CTRL_IMPL_ID(vsn) \
(((vsn) & ENAHW_CTRL_IMPL_ID_MASK) >> ENAHW_CTRL_IMPL_ID_SHIFT)
#define ENAHW_CAPS_CONTIGUOUS_QUEUE_REQUIRED_MASK 0x1
#define ENAHW_CAPS_RESET_TIMEOUT_SHIFT 1
#define ENAHW_CAPS_RESET_TIMEOUT_MASK 0x3e
#define ENAHW_CAPS_RESET_TIMEOUT(v) \
(((v) & ENAHW_CAPS_RESET_TIMEOUT_MASK) >> \
ENAHW_CAPS_RESET_TIMEOUT_SHIFT)
#define ENAHW_CAPS_DMA_ADDR_WIDTH_SHIFT 8
#define ENAHW_CAPS_DMA_ADDR_WIDTH_MASK 0xff00
#define ENAHW_CAPS_DMA_ADDR_WIDTH(v) \
(((v) & ENAHW_CAPS_DMA_ADDR_WIDTH_MASK) >> \
ENAHW_CAPS_DMA_ADDR_WIDTH_SHIFT)
#define ENAHW_CAPS_ADMIN_CMD_TIMEOUT_SHIFT 16
#define ENAHW_CAPS_ADMIN_CMD_TIMEOUT_MASK 0xf0000
#define ENAHW_CAPS_ADMIN_CMD_TIMEOUT(v) \
(((v) & ENAHW_CAPS_ADMIN_CMD_TIMEOUT_MASK) >> \
ENAHW_CAPS_ADMIN_CMD_TIMEOUT_SHIFT)
typedef enum enahw_reset_reason_types {
ENAHW_RESET_NORMAL = 0,
ENAHW_RESET_KEEP_ALIVE_TO = 1,
ENAHW_RESET_ADMIN_TO = 2,
ENAHW_RESET_MISS_TX_CMPL = 3,
ENAHW_RESET_INV_RX_REQ_ID = 4,
ENAHW_RESET_INV_TX_REQ_ID = 5,
ENAHW_RESET_TOO_MANY_RX_DESCS = 6,
ENAHW_RESET_INIT_ERR = 7,
ENAHW_RESET_DRIVER_INVALID_STATE = 8,
ENAHW_RESET_OS_TRIGGER = 9,
ENAHW_RESET_OS_NETDEV_WD = 10,
ENAHW_RESET_SHUTDOWN = 11,
ENAHW_RESET_USER_TRIGGER = 12,
ENAHW_RESET_GENERIC = 13,
ENAHW_RESET_MISS_INTERRUPT = 14,
ENAHW_RESET_SUSPECTED_POLL_STARVATION = 15,
ENAHW_RESET_RX_DESCRIPTOR_MALFORMED = 16,
ENAHW_RESET_TX_DESCRIPTOR_MALFORMED = 17,
ENAHW_RESET_MISSING_ADMIN_INTERRUPT = 18,
ENAHW_RESET_DEVICE_REQUEST = 19,
ENAHW_RESET_LAST,
} enahw_reset_reason_t;
#define ENAHW_RESET_REASON_LSB_SHIFT 0
#define ENAHW_RESET_REASON_LSB_MASK 0xf
#define ENAHW_RESET_REASON_MSB_SHIFT 4
#define ENAHW_RESET_REASON_MSB_MASK 0xf0
#define ENAHW_RESET_REASON_LSB(v) \
(((v) & ENAHW_RESET_REASON_LSB_MASK) >> ENAHW_RESET_REASON_LSB_SHIFT)
#define ENAHW_RESET_REASON_MSB(v) \
(((v) & ENAHW_RESET_REASON_MSB_MASK) >> ENAHW_RESET_REASON_MSB_SHIFT)
#define ENAHW_ASQ_CAPS_DEPTH_MASK 0xffff
#define ENAHW_ASQ_CAPS_ENTRY_SIZE_SHIFT 16
#define ENAHW_ASQ_CAPS_ENTRY_SIZE_MASK 0xffff0000
#define ENAHW_ASQ_CAPS_DEPTH(x) ((x) & ENAHW_ASQ_CAPS_DEPTH_MASK)
#define ENAHW_ASQ_CAPS_ENTRY_SIZE(x) \
(((x) << ENAHW_ASQ_CAPS_ENTRY_SIZE_SHIFT) & \
ENAHW_ASQ_CAPS_ENTRY_SIZE_MASK)
#define ENAHW_ACQ_CAPS_DEPTH_MASK 0xffff
#define ENAHW_ACQ_CAPS_ENTRY_SIZE_SHIFT 16
#define ENAHW_ACQ_CAPS_ENTRY_SIZE_MASK 0xffff0000
#define ENAHW_ACQ_CAPS_DEPTH(x) ((x) & ENAHW_ACQ_CAPS_DEPTH_MASK)
#define ENAHW_ACQ_CAPS_ENTRY_SIZE(x) \
(((x) << ENAHW_ACQ_CAPS_ENTRY_SIZE_SHIFT) & \
ENAHW_ACQ_CAPS_ENTRY_SIZE_MASK)
#define ENAHW_AENQ_CAPS_DEPTH_MASK 0xffff
#define ENAHW_AENQ_CAPS_ENTRY_SIZE_SHIFT 16
#define ENAHW_AENQ_CAPS_ENTRY_SIZE_MASK 0xffff0000
#define ENAHW_AENQ_CAPS_DEPTH(x) ((x) & ENAHW_AENQ_CAPS_DEPTH_MASK)
#define ENAHW_AENQ_CAPS_ENTRY_SIZE(x) \
(((x) << ENAHW_AENQ_CAPS_ENTRY_SIZE_SHIFT) & \
ENAHW_AENQ_CAPS_ENTRY_SIZE_MASK)
#define ENAHW_INTR_UNMASK 0x0
#define ENAHW_INTR_MASK 0x1
#define ENAHW_DEV_CTL_DEV_RESET_MASK 0x1
#define ENAHW_DEV_CTL_AQ_RESTART_SHIFT 1
#define ENAHW_DEV_CTL_AQ_RESTART_MASK 0x2
#define ENAHW_DEV_CTL_QUIESCENT_SHIFT 2
#define ENAHW_DEV_CTL_QUIESCENT_MASK 0x4
#define ENAHW_DEV_CTL_IO_RESUME_SHIFT 3
#define ENAHW_DEV_CTL_IO_RESUME_MASK 0x8
#define ENAHW_DEV_CTL_RESET_REASON_EXT_SHIFT 24
#define ENAHW_DEV_CTL_RESET_REASON_EXT_MASK 0xf000000
#define ENAHW_DEV_CTL_RESET_REASON_SHIFT 28
#define ENAHW_DEV_CTL_RESET_REASON_MASK 0xf0000000
#define ENAHW_DEV_STS_READY_MASK 0x1
#define ENAHW_DEV_STS_AQ_RESTART_IN_PROGRESS_SHIFT 1
#define ENAHW_DEV_STS_AQ_RESTART_IN_PROGRESS_MASK 0x2
#define ENAHW_DEV_STS_AQ_RESTART_FINISHED_SHIFT 2
#define ENAHW_DEV_STS_AQ_RESTART_FINISHED_MASK 0x4
#define ENAHW_DEV_STS_RESET_IN_PROGRESS_SHIFT 3
#define ENAHW_DEV_STS_RESET_IN_PROGRESS_MASK 0x8
#define ENAHW_DEV_STS_RESET_FINISHED_SHIFT 4
#define ENAHW_DEV_STS_RESET_FINISHED_MASK 0x10
#define ENAHW_DEV_STS_FATAL_ERROR_SHIFT 5
#define ENAHW_DEV_STS_FATAL_ERROR_MASK 0x20
#define ENAHW_DEV_STS_QUIESCENT_STATE_IN_PROGRESS_SHIFT 6
#define ENAHW_DEV_STS_QUIESCENT_STATE_IN_PROGRESS_MASK 0x40
#define ENAHW_DEV_STS_QUIESCENT_STATE_ACHIEVED_SHIFT 7
#define ENAHW_DEV_STS_QUIESCENT_STATE_ACHIEVED_MASK 0x80
typedef struct enahw_aenq_desc {
uint16_t ead_group;
uint16_t ead_syndrome;
uint8_t ead_flags;
uint8_t ead_rsvd1[3];
uint32_t ead_ts_low;
uint32_t ead_ts_high;
union {
uint32_t raw[12];
struct {
uint32_t flags;
} link_change;
struct {
uint32_t rx_drops_low;
uint32_t rx_drops_high;
uint32_t tx_drops_low;
uint32_t tx_drops_high;
uint32_t rx_overruns_low;
uint32_t rx_overruns_high;
} keep_alive;
} ead_payload;
} enahw_aenq_desc_t;
#define ENAHW_AENQ_DESC_PHASE_MASK BIT(0)
#define ENAHW_AENQ_DESC_PHASE(desc) \
((desc)->ead_flags & ENAHW_AENQ_DESC_PHASE_MASK)
#define ENAHW_AENQ_LINK_CHANGE_LINK_STATUS_MASK BIT(0)
typedef enum enahw_aenq_groups {
ENAHW_AENQ_GROUP_LINK_CHANGE = 0,
ENAHW_AENQ_GROUP_FATAL_ERROR = 1,
ENAHW_AENQ_GROUP_WARNING = 2,
ENAHW_AENQ_GROUP_NOTIFICATION = 3,
ENAHW_AENQ_GROUP_KEEP_ALIVE = 4,
ENAHW_AENQ_GROUP_REFRESH_CAPABILITIES = 5,
ENAHW_AENQ_GROUP_CONF_NOTIFICATIONS = 6,
ENAHW_AENQ_GROUP_DEVICE_REQUEST_RESET = 7,
ENAHW_AENQ_GROUPS_ARR_NUM = 8,
} enahw_aenq_groups_t;
typedef enum enahw_aenq_syndrome {
ENAHW_AENQ_SYNDROME_UPDATE_HINTS = 2,
} enahw_aenq_syndrome_t;
typedef struct enahw_addr {
uint32_t ea_low;
uint16_t ea_high;
uint16_t ea_rsvd;
} enahw_addr_t;
struct enahw_ctrl_buff {
uint32_t ecb_length;
enahw_addr_t ecb_addr;
};
struct enahw_feat_common {
uint8_t efc_flags;
uint8_t efc_id;
uint8_t efc_version;
uint8_t efc_rsvd;
};
typedef struct enahw_cmd_get_feat {
struct enahw_ctrl_buff ecgf_ctrl_buf;
struct enahw_feat_common ecgf_comm;
uint32_t egcf_unused[11];
} enahw_cmd_get_feat_t;
#define ENAHW_GET_FEAT_FLAGS_GET_CURR_VAL(desc) \
((desc)->ecgf_comm.efc_flags) |= 0x1
#define ENAHW_GET_FEAT_FLAGS_GET_DEF_VAL(desc) \
((desc)->ecgf_comm.efc_flags) |= 0x3
typedef struct enahw_feat_mtu {
uint32_t efm_mtu;
} enahw_feat_mtu_t;
typedef struct enahw_feat_host_attr {
enahw_addr_t efha_os_addr;
enahw_addr_t efha_debug_addr;
uint32_t efha_debug_sz;
} enahw_feat_host_attr_t;
typedef struct enahw_feat_aenq {
uint32_t efa_supported_groups;
uint32_t efa_enabled_groups;
} enahw_feat_aenq_t;
typedef struct enahw_feat_hw_timestamp {
uint8_t efhwts_version;
uint8_t efhwts_tx;
uint8_t efhwts_rx;
} enahw_feat_hw_timestamp_t;
#define ENAHW_HW_TIMESTAMP_NONE 0
#define ENAHW_HW_TIMESTAMP_ALL_QUEUES 1
typedef enum enahw_llq_header_location {
ENAHW_LLQ_HEADER_INLINE = BIT(0),
ENAHW_LLQ_HEADER_SEPARATE_RING = BIT(1),
} enahw_llq_header_location_t;
typedef enum enahw_llq_ring_entry_size {
ENAHW_LLQ_ENTRY_SIZE_128B = BIT(0),
ENAHW_LLQ_ENTRY_SIZE_192B = BIT(1),
ENAHW_LLQ_ENTRY_SIZE_256B = BIT(2),
} enahw_llq_ring_entry_size_t;
typedef enum enahw_llq_num_descs_before_header {
ENAHW_LLQ_NUM_DESCS_BEFORE_HEADER_0 = 0,
ENAHW_LLQ_NUM_DESCS_BEFORE_HEADER_1 = BIT(0),
ENAHW_LLQ_NUM_DESCS_BEFORE_HEADER_2 = BIT(1),
ENAHW_LLQ_NUM_DESCS_BEFORE_HEADER_4 = BIT(2),
ENAHW_LLQ_NUM_DESCS_BEFORE_HEADER_8 = BIT(3),
} enahw_llq_num_descs_before_header_t;
typedef enum enahw_llq_stride_ctrl {
ENAHW_LLQ_SINGLE_DESC_PER_ENTRY = BIT(0),
ENAHW_LLQ_MULTIPLE_DESCS_PER_ENTRY = BIT(1),
} enahw_llq_stride_ctrl_t;
typedef enum enahw_llq_accel_mode_feat {
ENAHW_LLQ_ACCEL_MODE_DISABLE_META_CACHING = BIT(0),
ENAHW_LLQ_ACCEL_MODE_LIMIT_TX_BURST = BIT(1),
} enahw_llq_accel_mode_feat_t;
typedef struct enahw_llq_accel_mode_get {
uint16_t eamg_supported_flags;
uint16_t eamg_max_tx_burst_size;
} enahw_llq_accel_mode_get_t;
typedef struct enahw_llq_accel_mode_set {
uint16_t eams_enabled_flags;
uint16_t eams_rsvd;
} enahw_llq_accel_mode_set_t;
typedef union enahw_llq_accel_mode {
uint32_t eam_raw[2];
enahw_llq_accel_mode_get_t eam_get;
enahw_llq_accel_mode_set_t eam_set;
} enahw_llq_accel_mode_t;
typedef struct enahw_feat_llq {
uint32_t efllq_max_llq_num;
uint32_t efllq_max_llq_depth;
uint16_t efllq_header_location_ctrl_supported;
uint16_t efllq_header_location_ctrl_enabled;
uint16_t efllq_entry_size_ctrl_supported;
uint16_t efllq_entry_size_ctrl_enabled;
uint16_t efllq_desc_num_before_header_supported;
uint16_t efllq_desc_num_before_header_enabled;
uint16_t efllq_descs_stride_ctrl_supported;
uint16_t efllq_descs_stride_ctrl_enabled;
uint8_t efllq_feature_version;
uint8_t efllq_entry_size_recommended;
uint16_t efllq_max_wide_llq_depth;
enahw_llq_accel_mode_t efllq_accel_mode;
} enahw_feat_llq_t;
typedef struct enahw_cmd_set_feat {
struct enahw_ctrl_buff ecsf_ctrl_buf;
struct enahw_feat_common ecsf_comm;
union {
uint32_t ecsf_raw[11];
enahw_feat_host_attr_t ecsf_host_attr;
enahw_feat_mtu_t ecsf_mtu;
enahw_feat_aenq_t ecsf_aenq;
enahw_feat_hw_timestamp_t ecsf_hw_timestamp;
enahw_feat_llq_t ecsf_llq;
} ecsf_feat;
} enahw_cmd_set_feat_t;
typedef struct enahw_host_info {
uint32_t ehi_os_type;
uint8_t ehi_os_dist_str[128];
uint32_t ehi_os_dist;
uint8_t ehi_kernel_ver_str[32];
uint32_t ehi_kernel_ver;
uint32_t ehi_driver_ver;
uint32_t ehi_supported_net_features[2];
uint16_t ehi_ena_spec_version;
uint16_t ehi_bdf;
uint16_t ehi_num_cpus;
uint16_t ehi_rsvd;
uint32_t ehi_driver_supported_features;
} enahw_host_info_t;
#define ENAHW_HOST_INFO_MAJOR_MASK GENMASK(7, 0)
#define ENAHW_HOST_INFO_MINOR_SHIFT 8
#define ENAHW_HOST_INFO_MINOR_MASK GENMASK(15, 8)
#define ENAHW_HOST_INFO_SUB_MINOR_SHIFT 16
#define ENAHW_HOST_INFO_SUB_MINOR_MASK GENMASK(23, 16)
#define ENAHW_HOST_INFO_SPEC_MAJOR_SHIFT 8
#define ENAHW_HOST_INFO_MODULE_TYPE_SHIFT 24
#define ENAHW_HOST_INFO_MODULE_TYPE_MASK GENMASK(31, 24)
#define ENAHW_HOST_INFO_FUNCTION_MASK GENMASK(2, 0)
#define ENAHW_HOST_INFO_DEVICE_SHIFT 3
#define ENAHW_HOST_INFO_DEVICE_MASK GENMASK(7, 3)
#define ENAHW_HOST_INFO_BUS_SHIFT 8
#define ENAHW_HOST_INFO_BUS_MASK GENMASK(15, 8)
#define ENAHW_HOST_INFO_RX_OFFSET_SHIFT 1
#define ENAHW_HOST_INFO_RX_OFFSET_MASK BIT(1)
#define ENAHW_HOST_INFO_INTERRUPT_MODERATION_SHIFT 2
#define ENAHW_HOST_INFO_INTERRUPT_MODERATION_MASK BIT(2)
#define ENAHW_HOST_INFO_RX_BUF_MIRRORING_SHIFT 3
#define ENAHW_HOST_INFO_RX_BUF_MIRRORING_MASK BIT(3)
#define ENAHW_HOST_INFO_RSS_CONFIGURABLE_FUNCTION_KEY_SHIFT 4
#define ENAHW_HOST_INFO_RSS_CONFIGURABLE_FUNCTION_KEY_MASK BIT(4)
#define ENAHW_HOST_INFO_RX_PAGE_REUSE_SHIFT 6
#define ENAHW_HOST_INFO_RX_PAGE_REUSE_MASK BIT(6)
#define ENAHW_HOST_INFO_TX_IPV6_CSUM_OFFLOAD_SHIFT 7
#define ENAHW_HOST_INFO_TX_IPV6_CSUM_OFFLOAD_MASK BIT(7)
#define ENAHW_HOST_INFO_INFO_PHC_SHIFT 8
#define ENAHW_HOST_INFO_INFO_PHC_MASK BIT(8)
enum enahw_os_type {
ENAHW_OS_LINUX = 1,
ENAHW_OS_WIN = 2,
ENAHW_OS_DPDK = 3,
ENAHW_OS_FREEBSD = 4,
ENAHW_OS_IPXE = 5,
ENAHW_OS_ESXI = 6,
ENAHW_OS_MACOS = 7,
ENAHW_OS_GROUPS_NUM = 7,
};
typedef struct enahw_cmd_create_cq {
uint8_t ecq_caps_1;
uint8_t ecq_caps_2;
uint16_t ecq_num_descs;
uint32_t ecq_msix_vector;
enahw_addr_t ecq_addr;
} enahw_cmd_create_cq_t;
#define ENAHW_CMD_CREATE_CQ_INTERRUPT_MODE_ENABLED_SHIFT 5
#define ENAHW_CMD_CREATE_CQ_INTERRUPT_MODE_ENABLED_MASK (BIT(5))
#define ENAHW_CMD_CREATE_CQ_DESC_SIZE_WORDS_MASK (GENMASK(4, 0))
#define ENAHW_CMD_CREATE_CQ_INTERRUPT_MODE_ENABLE(cmd) \
((cmd)->ecq_caps_1 |= ENAHW_CMD_CREATE_CQ_INTERRUPT_MODE_ENABLED_MASK)
#define ENAHW_CMD_CREATE_CQ_DESC_SIZE_WORDS(cmd, val) \
(((cmd)->ecq_caps_2) |= \
((val) & ENAHW_CMD_CREATE_CQ_DESC_SIZE_WORDS_MASK))
typedef struct enahw_cmd_destroy_cq {
uint16_t edcq_idx;
uint16_t edcq_rsvd;
} enahw_cmd_destroy_cq_t;
typedef struct enahw_cmd_create_sq {
uint8_t ecsq_dir;
uint8_t ecsq_rsvd1;
uint8_t ecsq_caps_2;
uint8_t ecsq_caps_3;
uint16_t ecsq_cq_idx;
uint16_t ecsq_num_descs;
enahw_addr_t ecsq_base;
enahw_addr_t ecsq_head_wb;
uint32_t ecsq_rsvdw2;
uint32_t ecsq_rsvdw3;
} enahw_cmd_create_sq_t;
typedef enum enahw_sq_direction {
ENAHW_SQ_DIRECTION_TX = 1,
ENAHW_SQ_DIRECTION_RX = 2,
} enahw_sq_direction_t;
typedef enum enahw_placement_policy {
ENAHW_PLACEMENT_POLICY_HOST = 1,
ENAHW_PLACEMENT_POLICY_DEV = 3,
} enahw_placement_policy_t;
typedef enum enahw_completion_policy_type {
ENAHW_COMPLETION_POLICY_DESC = 0,
ENAHW_COMPLETION_POLICY_DESC_ON_DEMAND = 1,
ENAHW_COMPLETION_POLICY_HEAD_ON_DEMAND = 2,
ENAHW_COMPLETION_POLICY_HEAD = 3,
} enahw_completion_policy_type_t;
#define ENAHW_CMD_CREATE_SQ_DIR_SHIFT 5
#define ENAHW_CMD_CREATE_SQ_DIR_MASK GENMASK(7, 5)
#define ENAHW_CMD_CREATE_SQ_PLACEMENT_POLICY_MASK GENMASK(3, 0)
#define ENAHW_CMD_CREATE_SQ_COMPLETION_POLICY_SHIFT 4
#define ENAHW_CMD_CREATE_SQ_COMPLETION_POLICY_MASK GENMASK(6, 4)
#define ENAHW_CMD_CREATE_SQ_PHYSMEM_CONTIG_MASK BIT(0)
#define ENAHW_CMD_CREATE_SQ_DIR(cmd, val) \
(((cmd)->ecsq_dir) |= (((val) << ENAHW_CMD_CREATE_SQ_DIR_SHIFT) & \
ENAHW_CMD_CREATE_SQ_DIR_MASK))
#define ENAHW_CMD_CREATE_SQ_PLACEMENT_POLICY(cmd, val) \
(((cmd)->ecsq_caps_2) |= \
((val) & ENAHW_CMD_CREATE_SQ_PLACEMENT_POLICY_MASK))
#define ENAHW_CMD_CREATE_SQ_COMPLETION_POLICY(cmd, val) \
(((cmd)->ecsq_caps_2) |= \
(((val) << ENAHW_CMD_CREATE_SQ_COMPLETION_POLICY_SHIFT) & \
ENAHW_CMD_CREATE_SQ_COMPLETION_POLICY_MASK))
#define ENAHW_CMD_CREATE_SQ_PHYSMEM_CONTIG(cmd) \
((cmd)->ecsq_caps_3 |= ENAHW_CMD_CREATE_SQ_PHYSMEM_CONTIG_MASK)
typedef struct enahw_cmd_destroy_sq {
uint16_t edsq_idx;
uint8_t edsq_dir;
uint8_t edsq_rsvd;
} enahw_cmd_destroy_sq_t;
#define ENAHW_CMD_DESTROY_SQ_DIR_SHIFT 5
#define ENAHW_CMD_DESTROY_SQ_DIR_MASK GENMASK(7, 5)
#define ENAHW_CMD_DESTROY_SQ_DIR(cmd, val) \
(((cmd)->edsq_dir) |= (((val) << ENAHW_CMD_DESTROY_SQ_DIR_SHIFT) & \
ENAHW_CMD_DESTROY_SQ_DIR_MASK))
typedef struct enahw_cmd_get_stats {
struct enahw_ctrl_buff ecgs_ctrl_buf;
uint8_t ecgs_type;
uint8_t ecgs_scope;
uint16_t ecgs_rsvd;
uint16_t ecgs_queue_idx;
uint16_t ecgs_device_id;
} enahw_cmd_get_stats_t;
#define ENAHW_CMD_GET_STATS_MY_DEVICE_ID 0xFFFF
typedef enum enahw_get_stats_type {
ENAHW_GET_STATS_TYPE_BASIC = 0,
ENAHW_GET_STATS_TYPE_EXTENDED = 1,
ENAHW_GET_STATS_TYPE_ENI = 2,
} enahw_get_stats_type_t;
typedef enum enahw_get_stats_scope {
ENAHW_GET_STATS_SCOPE_QUEUE = 0,
ENAHW_GET_STATS_SCOPE_ETH = 1,
} enahw_get_stats_scope_t;
typedef struct enahw_cmd_desc {
uint16_t ecd_cmd_id;
uint8_t ecd_opcode;
uint8_t ecd_flags;
union {
uint32_t ecd_raw[15];
enahw_cmd_get_feat_t ecd_get_feat;
enahw_cmd_set_feat_t ecd_set_feat;
enahw_cmd_create_cq_t ecd_create_cq;
enahw_cmd_destroy_cq_t ecd_destroy_cq;
enahw_cmd_create_sq_t ecd_create_sq;
enahw_cmd_destroy_sq_t ecd_destroy_sq;
enahw_cmd_get_stats_t ecd_get_stats;
} ecd_cmd;
} enahw_cmd_desc_t;
typedef enum ena_cmd_opcode {
ENAHW_CMD_NONE = 0,
ENAHW_CMD_CREATE_SQ = 1,
ENAHW_CMD_DESTROY_SQ = 2,
ENAHW_CMD_CREATE_CQ = 3,
ENAHW_CMD_DESTROY_CQ = 4,
ENAHW_CMD_GET_FEATURE = 8,
ENAHW_CMD_SET_FEATURE = 9,
ENAHW_CMD_GET_STATS = 11,
} enahw_cmd_opcode_t;
#define ENAHW_CMD_ID_MASK GENMASK(11, 0)
#define ENAHW_CMD_PHASE_MASK BIT(0)
#define ENAHW_CMD_ID(desc, id) \
(((desc)->ecd_cmd_id) |= ((id) & ENAHW_CMD_ID_MASK))
typedef enum enahw_feature_id {
ENAHW_FEAT_DEVICE_ATTRIBUTES = 1,
ENAHW_FEAT_MAX_QUEUES_NUM = 2,
ENAHW_FEAT_HW_HINTS = 3,
ENAHW_FEAT_LLQ = 4,
ENAHW_FEAT_EXTRA_PROPERTIES_STRINGS = 5,
ENAHW_FEAT_EXTRA_PROPERTIES_FLAGS = 6,
ENAHW_FEAT_MAX_QUEUES_EXT = 7,
ENAHW_FEAT_RSS_HASH_FUNCTION = 10,
ENAHW_FEAT_STATELESS_OFFLOAD_CONFIG = 11,
ENAHW_FEAT_RSS_INDIRECTION_TABLE_CONFIG = 12,
ENAHW_FEAT_MTU = 14,
ENAHW_FEAT_RSS_HASH_INPUT = 18,
ENAHW_FEAT_INTERRUPT_MODERATION = 20,
ENAHW_FEAT_AENQ_CONFIG = 26,
ENAHW_FEAT_LINK_CONFIG = 27,
ENAHW_FEAT_HOST_ATTR_CONFIG = 28,
ENAHW_FEAT_PHC_CONFIG = 29,
ENAHW_FEAT_FLOW_STEERING_CONFIG = 30,
ENAHW_FEAT_HW_TIMESTAMP = 31,
ENAHW_FEAT_NUM = 32,
} enahw_feature_id_t;
typedef enum enahw_capability_id {
ENAHW_CAP_ENI_STATS = 0,
ENAHW_CAP_ENA_SRD_INFO = 1,
ENAHW_CAP_CUSTOMER_METRICS = 2,
ENAHW_CAP_EXTENDED_RESET_REASONS = 3,
ENAHW_CAP_CDESC_MBZ = 4,
ENAHW_CAP_NUM
} enahw_capability_id_t;
#define ENAHW_FEAT_DEVICE_ATTRIBUTES_VER 0
#define ENAHW_FEAT_MAX_QUEUES_NUM_VER 0
#define ENAHW_FEAT_HW_HINTS_VER 0
#define ENAHW_FEAT_LLQ_VER 1
#define ENAHW_FEAT_EXTRA_PROPERTIES_STRINGS_VER 0
#define ENAHW_FEAT_EXTRA_PROPERTIES_FLAGS_VER 0
#define ENAHW_FEAT_MAX_QUEUES_EXT_VER 1
#define ENAHW_FEAT_RSS_HASH_FUNCTION_VER 0
#define ENAHW_FEAT_STATELESS_OFFLOAD_CONFIG_VER 0
#define ENAHW_FEAT_RSS_INDIRECTION_TABLE_CONFIG_VER 0
#define ENAHW_FEAT_MTU_VER 0
#define ENAHW_FEAT_RSS_HASH_INPUT_VER 0
#define ENAHW_FEAT_INTERRUPT_MODERATION_VER 0
#define ENAHW_FEAT_AENQ_CONFIG_VER 0
#define ENAHW_FEAT_LINK_CONFIG_VER 0
#define ENAHW_FEAT_HOST_ATTR_CONFIG_VER 0
#define ENAHW_FEAT_HW_TIMESTAMP_VER 0
typedef enum enahw_link_speeds {
ENAHW_LINK_SPEED_1G = 0x1,
ENAHW_LINK_SPEED_2_HALF_G = 0x2,
ENAHW_LINK_SPEED_5G = 0x4,
ENAHW_LINK_SPEED_10G = 0x8,
ENAHW_LINK_SPEED_25G = 0x10,
ENAHW_LINK_SPEED_40G = 0x20,
ENAHW_LINK_SPEED_50G = 0x40,
ENAHW_LINK_SPEED_100G = 0x80,
ENAHW_LINK_SPEED_200G = 0x100,
ENAHW_LINK_SPEED_400G = 0x200,
} enahw_link_speeds_t;
#define ENAHW_HINTS_NO_TIMEOUT 0xffff
typedef struct enahw_device_hints {
uint16_t edh_mmio_read_timeout;
uint16_t edh_keep_alive_timeout;
uint16_t edh_tx_comp_timeout;
uint16_t edh_missed_tx_reset_threshold;
uint16_t edh_admin_comp_timeout;
uint16_t edh_net_wd_timeout;
uint16_t edh_max_tx_sgl;
uint16_t edh_max_rx_sgl;
uint16_t reserved[8];
} enahw_device_hints_t;
typedef struct enahw_feat_dev_attr {
uint32_t efda_impl_id;
uint32_t efda_device_version;
uint32_t efda_supported_features;
uint32_t efda_capabilities;
uint32_t efda_phys_addr_width;
uint32_t efda_virt_addr_with;
uint8_t efda_mac_addr[6];
uint8_t efda_rsvd2[2];
uint32_t efda_max_mtu;
} enahw_feat_dev_attr_t;
typedef struct enahw_feat_max_queue {
uint32_t efmq_max_sq_num;
uint32_t efmq_max_sq_depth;
uint32_t efmq_max_cq_num;
uint32_t efmq_max_cq_depth;
uint32_t efmq_max_legacy_llq_num;
uint32_t efmq_max_legacy_llq_depth;
uint32_t efmq_max_header_size;
uint16_t efmq_max_per_packet_tx_descs;
uint16_t efmq_max_per_packet_rx_descs;
} enahw_feat_max_queue_t;
typedef struct enahw_feat_max_queue_ext {
uint8_t efmqe_version;
uint8_t efmqe_rsvd[3];
uint32_t efmqe_max_tx_sq_num;
uint32_t efmqe_max_tx_cq_num;
uint32_t efmqe_max_rx_sq_num;
uint32_t efmqe_max_rx_cq_num;
uint32_t efmqe_max_tx_sq_depth;
uint32_t efmqe_max_tx_cq_depth;
uint32_t efmqe_max_rx_sq_depth;
uint32_t efmqe_max_rx_cq_depth;
uint32_t efmqe_max_tx_header_size;
uint16_t efmqe_max_per_packet_tx_descs;
uint16_t efmqe_max_per_packet_rx_descs;
} enahw_feat_max_queue_ext_t;
typedef struct enahw_feat_link_conf {
uint32_t eflc_speed;
uint32_t eflc_supported;
uint32_t eflc_flags;
} enahw_feat_link_conf_t;
#define ENAHW_FEAT_LINK_CONF_AUTONEG_MASK BIT(0)
#define ENAHW_FEAT_LINK_CONF_DUPLEX_SHIFT 1
#define ENAHW_FEAT_LINK_CONF_DUPLEX_MASK BIT(1)
#define ENAHW_FEAT_LINK_CONF_AUTONEG(f) \
((f)->eflc_flags & ENAHW_FEAT_LINK_CONF_AUTONEG_MASK)
#define ENAHW_FEAT_LINK_CONF_FULL_DUPLEX(f) \
((((f)->eflc_flags & ENAHW_FEAT_LINK_CONF_DUPLEX_MASK) >> \
ENAHW_FEAT_LINK_CONF_DUPLEX_SHIFT) == 1)
typedef struct enahw_feat_offload {
uint32_t efo_tx;
uint32_t efo_rx_supported;
uint32_t efo_rx_enabled;
} enahw_feat_offload_t;
#define ENAHW_FEAT_OFFLOAD_TX_L3_IPV4_CSUM_MASK BIT(0)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_PART_SHIFT 1
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_PART_MASK BIT(1)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_FULL_SHIFT 2
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_FULL_MASK BIT(2)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_PART_SHIFT 3
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_PART_MASK BIT(3)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_FULL_SHIFT 4
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_FULL_MASK BIT(4)
#define ENAHW_FEAT_OFFLOAD_TSO_IPV4_SHIFT 5
#define ENAHW_FEAT_OFFLOAD_TSO_IPV4_MASK BIT(5)
#define ENAHW_FEAT_OFFLOAD_TSO_IPV6_SHIFT 6
#define ENAHW_FEAT_OFFLOAD_TSO_IPV6_MASK BIT(6)
#define ENAHW_FEAT_OFFLOAD_TSO_ECN_SHIFT 7
#define ENAHW_FEAT_OFFLOAD_TSO_ECN_MASK BIT(7)
#define ENAHW_FEAT_OFFLOAD_RX_L3_IPV4_CSUM_MASK BIT(0)
#define ENAHW_FEAT_OFFLOAD_RX_L4_IPV4_CSUM_SHIFT 1
#define ENAHW_FEAT_OFFLOAD_RX_L4_IPV4_CSUM_MASK BIT(1)
#define ENAHW_FEAT_OFFLOAD_RX_L4_IPV6_CSUM_SHIFT 2
#define ENAHW_FEAT_OFFLOAD_RX_L4_IPV6_CSUM_MASK BIT(2)
#define ENAHW_FEAT_OFFLOAD_RX_HASH_SHIFT 3
#define ENAHW_FEAT_OFFLOAD_RX_HASH_MASK BIT(3)
#define ENAHW_FEAT_OFFLOAD_TX_L3_IPV4_CSUM(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TX_L3_IPV4_CSUM_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_PART(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_PART_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_FULL(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TX_L4_IPV4_CSUM_FULL_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_TSO_IPV4(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TSO_IPV4_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_PART(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_PART_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_FULL(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TX_L4_IPV6_CSUM_FULL_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_TSO_IPV6(f) \
(((f)->efo_tx & ENAHW_FEAT_OFFLOAD_TSO_IPV6_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_RX_L3_IPV4_CSUM(f) \
(((f)->efo_rx_supported & ENAHW_FEAT_OFFLOAD_RX_L3_IPV4_CSUM_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_RX_L4_IPV4_CSUM(f) \
(((f)->efo_rx_supported & ENAHW_FEAT_OFFLOAD_RX_L4_IPV4_CSUM_MASK) != 0)
#define ENAHW_FEAT_OFFLOAD_RX_L4_IPV6_CSUM(f) \
(((f)->efo_rx_supported & ENAHW_FEAT_OFFLOAD_RX_L4_IPV6_CSUM_MASK) != 0)
typedef union enahw_resp_get_feat {
uint32_t ergf_raw[14];
enahw_feat_dev_attr_t ergf_dev_attr;
enahw_feat_max_queue_t ergf_max_queue;
enahw_feat_max_queue_ext_t ergf_max_queue_ext;
enahw_feat_aenq_t ergf_aenq;
enahw_feat_link_conf_t ergf_link_conf;
enahw_feat_offload_t ergf_offload;
enahw_device_hints_t ergf_hints;
enahw_feat_llq_t ergf_llq;
} enahw_resp_get_feat_u;
typedef struct enahw_resp_create_cq {
uint16_t ercq_idx;
uint16_t ercq_actual_num_descs;
uint32_t ercq_numa_node_reg_offset;
uint32_t ercq_head_db_reg_offset;
uint32_t ercq_interrupt_mask_reg_offset;
} enahw_resp_create_cq_t;
typedef struct enahw_resp_create_sq {
uint16_t ersq_idx;
uint16_t ersq_rsvdw1;
uint32_t ersq_db_reg_offset;
uint32_t ersq_llq_descs_reg_offset;
uint32_t ersq_llq_headers_reg_offset;
} enahw_resp_create_sq_t;
typedef struct enahw_resp_basic_stats {
uint32_t erbs_tx_bytes_low;
uint32_t erbs_tx_bytes_high;
uint32_t erbs_tx_pkts_low;
uint32_t erbs_tx_pkts_high;
uint32_t erbs_rx_bytes_low;
uint32_t erbs_rx_bytes_high;
uint32_t erbs_rx_pkts_low;
uint32_t erbs_rx_pkts_high;
uint32_t erbs_rx_drops_low;
uint32_t erbs_rx_drops_high;
uint32_t erbs_tx_drops_low;
uint32_t erbs_tx_drops_high;
uint32_t erbs_rx_overruns_low;
uint32_t erbs_rx_overruns_high;
} enahw_resp_basic_stats_t;
typedef struct enahw_resp_eni_stats {
uint64_t eres_bw_in_exceeded;
uint64_t eres_bw_out_exceeded;
uint64_t eres_pps_exceeded;
uint64_t eres_conns_exceeded;
uint64_t eres_linklocal_exceeded;
} enahw_resp_eni_stats_t;
typedef struct enahw_resp_desc {
uint16_t erd_cmd_id;
uint8_t erd_status;
uint8_t erd_flags;
uint16_t erd_ext_status;
uint16_t erd_sq_head_idx;
union {
uint32_t raw[14];
enahw_resp_get_feat_u erd_get_feat;
enahw_resp_create_cq_t erd_create_cq;
enahw_resp_create_sq_t erd_create_sq;
enahw_resp_basic_stats_t erd_basic_stats;
enahw_resp_eni_stats_t erd_eni_stats;
} erd_resp;
} enahw_resp_desc_t;
#define ENAHW_RESP_CMD_ID_MASK GENMASK(11, 0)
#define ENAHW_RESP_PHASE_MASK 0x1
#define ENAHW_RESP_CMD_ID(desc) \
(((desc)->erd_cmd_id) & ENAHW_RESP_CMD_ID_MASK)
typedef enum enahw_resp_status {
ENAHW_RESP_SUCCESS = 0,
ENAHW_RESP_RESOURCE_ALLOCATION_FAILURE = 1,
ENAHW_RESP_BAD_OPCODE = 2,
ENAHW_RESP_UNSUPPORTED_OPCODE = 3,
ENAHW_RESP_MALFORMED_REQUEST = 4,
ENAHW_RESP_ILLEGAL_PARAMETER = 5,
ENAHW_RESP_UNKNOWN_ERROR = 6,
ENAHW_RESP_RESOURCE_BUSY = 7,
} enahw_resp_status_t;
typedef enum enahw_io_l3_proto {
ENAHW_IO_L3_PROTO_UNKNOWN = 0,
ENAHW_IO_L3_PROTO_IPV4 = 8,
ENAHW_IO_L3_PROTO_IPV6 = 11,
ENAHW_IO_L3_PROTO_FCOE = 21,
ENAHW_IO_L3_PROTO_ROCE = 22,
} enahw_io_l3_proto_t;
typedef enum enahw_io_l4_proto {
ENAHW_IO_L4_PROTO_UNKNOWN = 0,
ENAHW_IO_L4_PROTO_TCP = 12,
ENAHW_IO_L4_PROTO_UDP = 13,
ENAHW_IO_L4_PROTO_ROUTEABLE_ROCE = 23,
} enahw_io_l4_proto_t;
typedef struct enahw_tx_data_desc {
uint32_t etd_len_ctrl;
uint32_t etd_meta_ctrl;
uint32_t etd_buff_addr_lo;
uint32_t etd_buff_addr_hi_hdr_sz;
} enahw_tx_data_desc_t;
#define ENAHW_TX_DESC_LENGTH_MASK GENMASK(15, 0)
#define ENAHW_TX_DESC_REQ_ID_HI_SHIFT 16
#define ENAHW_TX_DESC_REQ_ID_HI_MASK GENMASK(21, 16)
#define ENAHW_TX_DESC_META_DESC_SHIFT 23
#define ENAHW_TX_DESC_META_DESC_MASK BIT(23)
#define ENAHW_TX_DESC_PHASE_SHIFT 24
#define ENAHW_TX_DESC_PHASE_MASK BIT(24)
#define ENAHW_TX_DESC_FIRST_SHIFT 26
#define ENAHW_TX_DESC_FIRST_MASK BIT(26)
#define ENAHW_TX_DESC_LAST_SHIFT 27
#define ENAHW_TX_DESC_LAST_MASK BIT(27)
#define ENAHW_TX_DESC_COMP_REQ_SHIFT 28
#define ENAHW_TX_DESC_COMP_REQ_MASK BIT(28)
#define ENAHW_TX_DESC_L3_PROTO_IDX_MASK GENMASK(3, 0)
#define ENAHW_TX_DESC_DF_SHIFT 4
#define ENAHW_TX_DESC_DF_MASK BIT(4)
#define ENAHW_TX_DESC_TSO_EN_SHIFT 7
#define ENAHW_TX_DESC_TSO_EN_MASK BIT(7)
#define ENAHW_TX_DESC_L4_PROTO_IDX_SHIFT 8
#define ENAHW_TX_DESC_L4_PROTO_IDX_MASK GENMASK(12, 8)
#define ENAHW_TX_DESC_L3_CSUM_EN_SHIFT 13
#define ENAHW_TX_DESC_L3_CSUM_EN_MASK BIT(13)
#define ENAHW_TX_DESC_L4_CSUM_EN_SHIFT 14
#define ENAHW_TX_DESC_L4_CSUM_EN_MASK BIT(14)
#define ENAHW_TX_DESC_ETHERNET_FCS_DIS_SHIFT 15
#define ENAHW_TX_DESC_ETHERNET_FCS_DIS_MASK BIT(15)
#define ENAHW_TX_DESC_L4_CSUM_PARTIAL_SHIFT 17
#define ENAHW_TX_DESC_L4_CSUM_PARTIAL_MASK BIT(17)
#define ENAHW_TX_DESC_REQ_ID_LO_SHIFT 22
#define ENAHW_TX_DESC_REQ_ID_LO_MASK GENMASK(31, 22)
#define ENAHW_TX_DESC_ADDR_HI_MASK GENMASK(15, 0)
#define ENAHW_TX_DESC_HEADER_LENGTH_SHIFT 24
#define ENAHW_TX_DESC_HEADER_LENGTH_MASK GENMASK(31, 24)
#define ENAHW_TX_DESC_LENGTH(desc, len) \
(((desc)->etd_len_ctrl) |= ((len) & ENAHW_TX_DESC_LENGTH_MASK))
#define ENAHW_TX_DESC_FIRST_ON(desc) \
(((desc)->etd_len_ctrl) |= ENAHW_TX_DESC_FIRST_MASK)
#define ENAHW_TX_DESC_FIRST_OFF(desc) \
(((desc)->etd_len_ctrl) &= ~ENAHW_TX_DESC_FIRST_MASK)
#define ENAHW_TX_DESC_REQID_HI(desc, reqid) \
(((desc)->etd_len_ctrl) |= \
((((reqid) >> 10) << ENAHW_TX_DESC_REQ_ID_HI_SHIFT) & \
ENAHW_TX_DESC_REQ_ID_HI_MASK))
#define ENAHW_TX_DESC_REQID_LO(desc, reqid) \
(((desc)->etd_meta_ctrl) |= \
(((reqid) << ENAHW_TX_DESC_REQ_ID_LO_SHIFT) & \
ENAHW_TX_DESC_REQ_ID_LO_MASK))
#define ENAHW_TX_DESC_PHASE(desc, phase) \
(((desc)->etd_len_ctrl) |= (((phase) << ENAHW_TX_DESC_PHASE_SHIFT) & \
ENAHW_TX_DESC_PHASE_MASK))
#define ENAHW_TX_DESC_LAST_ON(desc) \
(((desc)->etd_len_ctrl) |= ENAHW_TX_DESC_LAST_MASK)
#define ENAHW_TX_DESC_LAST_OFF(desc) \
(((desc)->etd_len_ctrl) &= ~ENAHW_TX_DESC_LAST_MASK)
#define ENAHW_TX_DESC_COMP_REQ_ON(desc) \
(((desc)->etd_len_ctrl) |= ENAHW_TX_DESC_COMP_REQ_MASK)
#define ENAHW_TX_DESC_COMP_REQ_OFF(desc) \
(((desc)->etd_len_ctrl) &= ~ENAHW_TX_DESC_COMP_REQ_MASK)
#define ENAHW_TX_DESC_META_DESC_ON(desc) \
(((desc)->etd_len_ctrl) |= ENAHW_TX_DESC_META_DESC_MASK)
#define ENAHW_TX_DESC_META_DESC_OFF(desc) \
(((desc)->etd_len_ctrl) &= ~ENAHW_TX_DESC_META_DESC_MASK)
#define ENAHW_TX_DESC_ADDR_LO(desc, addr) \
(((desc)->etd_buff_addr_lo) = (addr))
#define ENAHW_TX_DESC_ADDR_HI(desc, addr) \
(((desc)->etd_buff_addr_hi_hdr_sz) |= \
(((addr) >> 32) & ENAHW_TX_DESC_ADDR_HI_MASK))
#define ENAHW_TX_DESC_HEADER_LENGTH(desc, len) \
(((desc)->etd_buff_addr_hi_hdr_sz) |= \
(((len) << ENAHW_TX_DESC_HEADER_LENGTH_SHIFT) & \
ENAHW_TX_DESC_HEADER_LENGTH_MASK))
#define ENAHW_TX_DESC_DF_ON(desc) \
((desc)->etd_meta_ctrl |= ENAHW_TX_DESC_DF_MASK)
#define ENAHW_TX_DESC_TSO_OFF(desc) \
(((desc)->etd_meta_ctrl) &= ~ENAHW_TX_DESC_TSO_EN_MASK)
#define ENAHW_TX_DESC_L3_CSUM_OFF(desc) \
(((desc)->etd_meta_ctrl) &= ~ENAHW_TX_DESC_L3_CSUM_EN_MASK)
#define ENAHW_TX_DESC_L4_CSUM_OFF(desc) \
(((desc)->etd_meta_ctrl) &= ~ENAHW_TX_DESC_L4_CSUM_EN_MASK)
#define ENAHW_TX_DESC_L4_CSUM_PARTIAL_ON(desc) \
(((desc)->etd_meta_ctrl) &= ~ENAHW_TX_DESC_L4_CSUM_PARTIAL_MASK)
typedef struct enahw_tx_meta_desc {
uint32_t etmd_len_ctrl;
uint32_t etmd_word1;
uint32_t etmd_word2;
uint32_t etmd_reserved;
} enahw_tx_meta_desc_t;
#define ENAHW_TX_META_DESC_REQ_ID_LO_MASK GENMASK(9, 0)
#define ENAHW_TX_META_DESC_EXT_VALID_SHIFT 14
#define ENAHW_TX_META_DESC_EXT_VALID_MASK BIT(14)
#define ENAHW_TX_META_DESC_MSS_HI_SHIFT 16
#define ENAHW_TX_META_DESC_MSS_HI_MASK GENMASK(19, 16)
#define ENAHW_TX_META_DESC_ETH_META_TYPE_SHIFT 20
#define ENAHW_TX_META_DESC_ETH_META_TYPE_MASK BIT(20)
#define ENAHW_TX_META_DESC_META_STORE_SHIFT 21
#define ENAHW_TX_META_DESC_META_STORE_MASK BIT(21)
#define ENAHW_TX_META_DESC_META_DESC_MASK BIT(23)
#define ENAHW_TX_META_DESC_PHASE_SHIFT 24
#define ENAHW_TX_META_DESC_PHASE_MASK BIT(24)
#define ENAHW_TX_META_DESC_FIRST_MASK BIT(26)
#define ENAHW_TX_META_DESC_LAST_MASK BIT(27)
#define ENAHW_TX_META_DESC_COMP_REQ_MASK BIT(28)
#define ENAHW_TX_META_DESC_REQ_ID_HI_MASK GENMASK(5, 0)
#define ENAHW_TX_META_DESC_L3_HDR_LEN_MASK GENMASK(7, 0)
#define ENAHW_TX_META_DESC_L3_HDR_OFF_SHIFT 8
#define ENAHW_TX_META_DESC_L3_HDR_OFF_MASK GENMASK(15, 8)
#define ENAHW_TX_META_DESC_L4_HDR_LEN_SHIFT 16
#define ENAHW_TX_META_DESC_L4_HDR_LEN_MASK GENMASK(21, 16)
#define ENAHW_TX_META_DESC_MSS_LO_SHIFT 22
#define ENAHW_TX_META_DESC_MSS_LO_MASK GENMASK(31, 22)
#define ENAHW_TX_META_DESC_META_DESC_ON(desc) \
((desc)->etmd_len_ctrl |= ENAHW_TX_META_DESC_META_DESC_MASK)
#define ENAHW_TX_META_DESC_EXT_VALID_ON(desc) \
((desc)->etmd_len_ctrl |= ENAHW_TX_META_DESC_EXT_VALID_MASK)
#define ENAHW_TX_META_DESC_ETH_META_TYPE_ON(desc) \
((desc)->etmd_len_ctrl |= ENAHW_TX_META_DESC_ETH_META_TYPE_MASK)
#define ENAHW_TX_META_DESC_META_STORE_ON(desc) \
((desc)->etmd_len_ctrl |= ENAHW_TX_META_DESC_META_STORE_MASK)
#define ENAHW_TX_META_DESC_PHASE(desc, phase) \
((desc)->etmd_len_ctrl |= \
(((phase) << ENAHW_TX_META_DESC_PHASE_SHIFT) & \
ENAHW_TX_META_DESC_PHASE_MASK))
#define ENAHW_TX_META_DESC_FIRST_ON(desc) \
((desc)->etmd_len_ctrl |= ENAHW_TX_META_DESC_FIRST_MASK)
#define ENAHW_TX_META_DESC_COMP_REQ_ON(desc) \
((desc)->etmd_len_ctrl |= ENAHW_TX_META_DESC_COMP_REQ_MASK)
#define ENAHW_TX_META_DESC_L3_HDR_OFF(desc, off) \
((desc)->etmd_word2 |= \
(((off) << ENAHW_TX_META_DESC_L3_HDR_OFF_SHIFT) & \
ENAHW_TX_META_DESC_L3_HDR_OFF_MASK))
typedef union enahw_tx_desc {
enahw_tx_data_desc_t etd_data;
enahw_tx_meta_desc_t etd_meta;
} enahw_tx_desc_t;
typedef struct enahw_tx_cdesc {
uint16_t etc_req_id;
uint8_t etc_status;
uint8_t etc_flags;
uint16_t etc_sub_qid;
uint16_t etc_sq_head_idx;
} enahw_tx_cdesc_t;
#define ENAHW_TX_CDESC_PHASE_SHIFT 0
#define ENAHW_TX_CDESC_PHASE_MASK BIT(0)
#define ENAHW_TX_CDESC_GET_PHASE(cdesc) \
((cdesc)->etc_flags & ENAHW_TX_CDESC_PHASE_MASK)
typedef struct enahw_rx_desc {
uint16_t erd_length;
uint8_t erd_reserved1;
uint8_t erd_ctrl;
uint16_t erd_req_id;
uint16_t erd_reserved2;
uint32_t erd_buff_addr_lo;
uint16_t erd_buff_addr_hi;
uint16_t erd_reserved3;
} enahw_rx_desc_t;
#define ENAHW_RX_DESC_PHASE_MASK BIT(0)
#define ENAHW_RX_DESC_FIRST_SHIFT 2
#define ENAHW_RX_DESC_FIRST_MASK BIT(2)
#define ENAHW_RX_DESC_LAST_SHIFT 3
#define ENAHW_RX_DESC_LAST_MASK BIT(3)
#define ENAHW_RX_DESC_COMP_REQ_SHIFT 4
#define ENAHW_RX_DESC_COMP_REQ_MASK BIT(4)
#define ENAHW_RX_DESC_CLEAR_CTRL(desc) ((desc)->erd_ctrl = 0)
#define ENAHW_RX_DESC_SET_PHASE(desc, val) \
((desc)->erd_ctrl |= ((val) & ENAHW_RX_DESC_PHASE_MASK))
#define ENAHW_RX_DESC_SET_FIRST(desc) \
((desc)->erd_ctrl |= ENAHW_RX_DESC_FIRST_MASK)
#define ENAHW_RX_DESC_SET_LAST(desc) \
((desc)->erd_ctrl |= ENAHW_RX_DESC_LAST_MASK)
#define ENAHW_RX_DESC_SET_COMP_REQ(desc) \
((desc)->erd_ctrl |= ENAHW_RX_DESC_COMP_REQ_MASK)
typedef struct enahw_rx_cdesc {
uint32_t erc_status;
uint16_t erc_length;
uint16_t erc_req_id;
uint32_t erc_hash;
uint16_t erc_sub_qid;
uint8_t erc_offset;
uint8_t erc_reserved;
} enahw_rx_cdesc_t;
#define ENAHW_RX_CDESC_L3_PROTO_MASK GENMASK(4, 0)
#define ENAHW_RX_CDESC_SRC_VLAN_CNT_SHIFT 5
#define ENAHW_RX_CDESC_SRC_VLAN_CNT_MASK GENMASK(6, 5)
#define ENAHW_RX_CDESC_L4_PROTO_SHIFT 8
#define ENAHW_RX_CDESC_L4_PROTO_MASK GENMASK(12, 8)
#define ENAHW_RX_CDESC_L3_CSUM_ERR_SHIFT 13
#define ENAHW_RX_CDESC_L3_CSUM_ERR_MASK BIT(13)
#define ENAHW_RX_CDESC_L4_CSUM_ERR_SHIFT 14
#define ENAHW_RX_CDESC_L4_CSUM_ERR_MASK BIT(14)
#define ENAHW_RX_CDESC_IPV4_FRAG_SHIFT 15
#define ENAHW_RX_CDESC_IPV4_FRAG_MASK BIT(15)
#define ENAHW_RX_CDESC_L4_CSUM_CHECKED_SHIFT 16
#define ENAHW_RX_CDESC_L4_CSUM_CHECKED_MASK BIT(16)
#define ENAHW_RX_CDESC_PHASE_SHIFT 24
#define ENAHW_RX_CDESC_PHASE_MASK BIT(24)
#define ENAHW_RX_CDESC_L3_CSUM2_SHIFT 25
#define ENAHW_RX_CDESC_L3_CSUM2_MASK BIT(25)
#define ENAHW_RX_CDESC_FIRST_SHIFT 26
#define ENAHW_RX_CDESC_FIRST_MASK BIT(26)
#define ENAHW_RX_CDESC_LAST_SHIFT 27
#define ENAHW_RX_CDESC_LAST_MASK BIT(27)
#define ENAHW_RX_CDESC_BUFFER_SHIFT 30
#define ENAHW_RX_CDESC_BUFFER_MASK BIT(30)
#define ENAHW_RX_CDESC_L3_PROTO(desc) \
((desc)->erc_status & ENAHW_RX_CDESC_L3_PROTO_MASK)
#define ENAHW_RX_CDESC_L3_CSUM_ERR(desc) \
((((desc)->erc_status & ENAHW_RX_CDESC_L3_CSUM_ERR_MASK) >> \
ENAHW_RX_CDESC_L3_CSUM_ERR_SHIFT) != 0)
#define ENAHW_RX_CDESC_L4_PROTO(desc) \
(((desc)->erc_status & ENAHW_RX_CDESC_L4_PROTO_MASK) >> \
ENAHW_RX_CDESC_L4_PROTO_SHIFT)
#define ENAHW_RX_CDESC_L4_CSUM_CHECKED(desc) \
((((desc)->erc_status & ENAHW_RX_CDESC_L4_CSUM_CHECKED_MASK) >> \
ENAHW_RX_CDESC_L4_CSUM_CHECKED_SHIFT) != 0)
#define ENAHW_RX_CDESC_L4_CSUM_ERR(desc) \
((((desc)->erc_status & ENAHW_RX_CDESC_L4_CSUM_ERR_MASK) >> \
ENAHW_RX_CDESC_L4_CSUM_ERR_SHIFT) != 0)
#define ENAHW_RX_CDESC_PHASE(desc) \
(((desc)->erc_status & ENAHW_RX_CDESC_PHASE_MASK) >> \
ENAHW_RX_CDESC_PHASE_SHIFT)
#define ENAHW_RX_CDESC_FIRST(desc) \
((((desc)->erc_status & ENAHW_RX_CDESC_FIRST_MASK) >> \
ENAHW_RX_CDESC_FIRST_SHIFT) == 1)
#define ENAHW_RX_CDESC_LAST(desc) \
((((desc)->erc_status & ENAHW_RX_CDESC_LAST_MASK) >> \
ENAHW_RX_CDESC_LAST_SHIFT) == 1)
#define ENAHW_REG_INTR_RX_DELAY_MASK GENMASK(14, 0)
#define ENAHW_REG_INTR_TX_DELAY_SHIFT 15
#define ENAHW_REG_INTR_TX_DELAY_MASK GENMASK(29, 15)
#define ENAHW_REG_INTR_UNMASK_SHIFT 30
#define ENAHW_REG_INTR_UNMASK_MASK BIT(30)
#define ENAHW_REG_INTR_UNMASK(val) \
((val) |= ENAHW_REG_INTR_UNMASK_MASK)
#define ENAHW_REG_INTR_MASK(val) \
((val) &= ~ENAHW_REG_INTR_UNMASK_MASK)
#endif