#ifndef _GVE_DESC_DQO_H_
#define _GVE_DESC_DQO_H_
#include "gve_plat.h"
#define GVE_ITR_ENABLE_BIT_DQO BIT(0)
#define GVE_ITR_NO_UPDATE_DQO (3 << 3)
#define GVE_ITR_INTERVAL_DQO_SHIFT 5
#define GVE_ITR_INTERVAL_DQO_MASK ((1 << 12) - 1)
#define GVE_TX_IRQ_RATELIMIT_US_DQO 50
#define GVE_RX_IRQ_RATELIMIT_US_DQO 20
#define GVE_TX_MAX_HDR_SIZE_DQO 255
#define GVE_TX_MIN_TSO_MSS_DQO 88
#define GVE_RX_BUF_THRESH_DQO 32
#define GVE_RX_DQO_MIN_PENDING_BUFS 128
#define GVE_RX_NUM_QPL_PAGES_DQO 2048
#define GVE_TX_BUF_SHIFT_DQO 11
#define GVE_TX_BUF_SIZE_DQO BIT(GVE_TX_BUF_SHIFT_DQO)
#define GVE_TX_BUFS_PER_PAGE_DQO (PAGE_SIZE >> GVE_TX_BUF_SHIFT_DQO)
#define GVE_TX_NUM_QPL_PAGES_DQO 512
struct gve_tx_pkt_desc_dqo {
__le64 buf_addr;
uint8_t dtype:5;
uint8_t end_of_packet:1;
uint8_t checksum_offload_enable:1;
uint8_t report_event:1;
uint8_t reserved0;
__le16 reserved1;
__le16 compl_tag;
uint16_t buf_size:14;
uint16_t reserved2:2;
} __packed;
_Static_assert(sizeof(struct gve_tx_pkt_desc_dqo) == 16,
"gve: bad dqo desc struct length");
#define GVE_TX_PKT_DESC_DTYPE_DQO 0xc
#define GVE_TX_MAX_DATA_DESCS_DQO 10
#define GVE_TX_MAX_BUF_SIZE_DQO ((16 * 1024) - 1)
#define GVE_TSO_MAXSIZE_DQO IP_MAXPACKET
_Static_assert(GVE_TX_MAX_BUF_SIZE_DQO * GVE_TX_MAX_DATA_DESCS_DQO >=
GVE_TSO_MAXSIZE_DQO,
"gve: bad tso parameters");
#define GVE_TX_MIN_RE_INTERVAL 32
struct gve_tx_context_cmd_dtype {
uint8_t dtype:5;
uint8_t tso:1;
uint8_t reserved1:2;
uint8_t reserved2;
};
_Static_assert(sizeof(struct gve_tx_context_cmd_dtype) == 2,
"gve: bad dqo desc struct length");
struct gve_tx_tso_context_desc_dqo {
uint32_t tso_total_len:24;
uint32_t flex10:8;
uint16_t mss:14;
uint16_t reserved:2;
uint8_t header_len;
uint8_t flex11;
struct gve_tx_context_cmd_dtype cmd_dtype;
uint8_t flex0;
uint8_t flex5;
uint8_t flex6;
uint8_t flex7;
uint8_t flex8;
uint8_t flex9;
} __packed;
_Static_assert(sizeof(struct gve_tx_tso_context_desc_dqo) == 16,
"gve: bad dqo desc struct length");
#define GVE_TX_TSO_CTX_DESC_DTYPE_DQO 0x5
struct gve_tx_general_context_desc_dqo {
uint8_t flex4;
uint8_t flex5;
uint8_t flex6;
uint8_t flex7;
uint8_t flex8;
uint8_t flex9;
uint8_t flex10;
uint8_t flex11;
struct gve_tx_context_cmd_dtype cmd_dtype;
uint16_t reserved;
uint8_t flex0;
uint8_t flex1;
uint8_t flex2;
uint8_t flex3;
} __packed;
_Static_assert(sizeof(struct gve_tx_general_context_desc_dqo) == 16,
"gve: bad dqo desc struct length");
#define GVE_TX_GENERAL_CTX_DESC_DTYPE_DQO 0x4
struct gve_tx_metadata_dqo {
union {
struct {
uint8_t version;
uint16_t path_hash:15;
uint16_t rehash_event:1;
} __packed;
uint8_t bytes[12];
};
} __packed;
_Static_assert(sizeof(struct gve_tx_metadata_dqo) == 12,
"gve: bad dqo desc struct length");
#define GVE_TX_METADATA_VERSION_DQO 0
#define GVE_TX_DESC_DQO_GEN_BYTE_OFFSET 1
#define GVE_TX_DESC_DQO_GEN_BIT_MASK 0x80
struct gve_tx_compl_desc_dqo {
uint16_t id:11;
uint16_t type:3;
uint16_t reserved0:1;
uint16_t generation:1;
union {
__le16 tx_head;
__le16 completion_tag;
};
__le32 reserved1;
} __packed;
_Static_assert(sizeof(struct gve_tx_compl_desc_dqo) == 8,
"gve: bad dqo desc struct length");
union gve_tx_desc_dqo {
struct gve_tx_pkt_desc_dqo pkt;
struct gve_tx_tso_context_desc_dqo tso_ctx;
struct gve_tx_general_context_desc_dqo general_ctx;
};
#define GVE_COMPL_TYPE_DQO_PKT 0x2
#define GVE_COMPL_TYPE_DQO_DESC 0x4
struct gve_rx_desc_dqo {
__le16 buf_id;
__le16 reserved0;
__le32 reserved1;
__le64 buf_addr;
__le64 header_buf_addr;
__le64 reserved2;
} __packed;
_Static_assert(sizeof(struct gve_rx_desc_dqo) == 32,
"gve: bad dqo desc struct length");
#define GVE_RX_DESC_DQO_GEN_BYTE_OFFSET 5
#define GVE_RX_DESC_DQO_GEN_BIT_MASK 0x40
struct gve_rx_compl_desc_dqo {
uint8_t rxdid:4;
uint8_t reserved0:4;
uint8_t loopback:1;
uint8_t ipv6_ex_add:1;
uint8_t rx_error:1;
uint8_t reserved1:5;
uint16_t packet_type:10;
uint16_t ip_hdr_err:1;
uint16_t udp_len_err:1;
uint16_t raw_cs_invalid:1;
uint16_t reserved2:3;
uint16_t packet_len:14;
uint16_t generation:1;
uint16_t buffer_queue_id:1;
uint16_t header_len:10;
uint16_t rsc:1;
uint16_t split_header:1;
uint16_t reserved3:4;
uint8_t descriptor_done:1;
uint8_t end_of_packet:1;
uint8_t header_buffer_overflow:1;
uint8_t l3_l4_processed:1;
uint8_t csum_ip_err:1;
uint8_t csum_l4_err:1;
uint8_t csum_external_ip_err:1;
uint8_t csum_external_udp_err:1;
uint8_t status_error1;
__le16 reserved5;
__le16 buf_id;
union {
__le16 raw_cs;
__le16 rsc_seg_len;
};
__le32 hash;
__le32 reserved6;
__le64 reserved7;
} __packed;
_Static_assert(sizeof(struct gve_rx_compl_desc_dqo) == 32,
"gve: bad dqo desc struct length");
static inline uint8_t
gve_get_dq_num_frags_in_page(struct gve_priv *priv)
{
return (PAGE_SIZE / priv->rx_buf_size_dqo);
}
#endif