drivers/net/ethernet/intel/idpf/xdp.h

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/intel/idpf/xdp.h

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/intel/idpf/xdp.h
Extension
.h
Size
6046 bytes
Lines
196
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct idpf_xdp_rx_desc {
	aligned_u64		qw0;
#define IDPF_XDP_RX_BUFQ	BIT_ULL(47)
#define IDPF_XDP_RX_GEN		BIT_ULL(46)
#define IDPF_XDP_RX_LEN		GENMASK_ULL(45, 32)
#define IDPF_XDP_RX_PT		GENMASK_ULL(25, 16)

	aligned_u64		qw1;
#define IDPF_XDP_RX_BUF		GENMASK_ULL(47, 32)
#define IDPF_XDP_RX_EOP		BIT_ULL(1)
#define IDPF_XDP_RX_TS_LOW	GENMASK_ULL(31, 24)

	aligned_u64		qw2;
#define IDPF_XDP_RX_HASH	GENMASK_ULL(31, 0)

	aligned_u64		qw3;
#define IDPF_XDP_RX_TS_HIGH	GENMASK_ULL(63, 32)
} __aligned(4 * sizeof(u64));
static_assert(sizeof(struct idpf_xdp_rx_desc) ==
	      sizeof(struct virtchnl2_rx_flex_desc_adv_nic_3));

#define idpf_xdp_rx_bufq(desc)	!!((desc)->qw0 & IDPF_XDP_RX_BUFQ)
#define idpf_xdp_rx_gen(desc)	!!((desc)->qw0 & IDPF_XDP_RX_GEN)
#define idpf_xdp_rx_len(desc)	FIELD_GET(IDPF_XDP_RX_LEN, (desc)->qw0)
#define idpf_xdp_rx_pt(desc)	FIELD_GET(IDPF_XDP_RX_PT, (desc)->qw0)
#define idpf_xdp_rx_buf(desc)	FIELD_GET(IDPF_XDP_RX_BUF, (desc)->qw1)
#define idpf_xdp_rx_eop(desc)	!!((desc)->qw1 & IDPF_XDP_RX_EOP)
#define idpf_xdp_rx_hash(desc)	FIELD_GET(IDPF_XDP_RX_HASH, (desc)->qw2)
#define idpf_xdp_rx_ts_low(desc)	FIELD_GET(IDPF_XDP_RX_TS_LOW, (desc)->qw1)
#define idpf_xdp_rx_ts_high(desc)	FIELD_GET(IDPF_XDP_RX_TS_HIGH, (desc)->qw3)

static inline void
idpf_xdp_get_qw0(struct idpf_xdp_rx_desc *desc,
		 const struct virtchnl2_rx_flex_desc_adv_nic_3 *rxd)
{
#ifdef __LIBETH_WORD_ACCESS
	desc->qw0 = ((const typeof(desc))rxd)->qw0;
#else
	desc->qw0 = ((u64)le16_to_cpu(rxd->pktlen_gen_bufq_id) << 32) |
		    ((u64)le16_to_cpu(rxd->ptype_err_fflags0) << 16);
#endif
}

static inline void
idpf_xdp_get_qw1(struct idpf_xdp_rx_desc *desc,
		 const struct virtchnl2_rx_flex_desc_adv_nic_3 *rxd)
{
#ifdef __LIBETH_WORD_ACCESS
	desc->qw1 = ((const typeof(desc))rxd)->qw1;
#else
	desc->qw1 = ((u64)le16_to_cpu(rxd->buf_id) << 32) |
		    ((u64)rxd->ts_low << 24) |
		    ((u64)rxd->fflags1 << 16) |
		    ((u64)rxd->status_err1 << 8) |
		    rxd->status_err0_qw1;
#endif
}

static inline void
idpf_xdp_get_qw2(struct idpf_xdp_rx_desc *desc,
		 const struct virtchnl2_rx_flex_desc_adv_nic_3 *rxd)
{
#ifdef __LIBETH_WORD_ACCESS
	desc->qw2 = ((const typeof(desc))rxd)->qw2;
#else
	desc->qw2 = ((u64)rxd->hash3 << 24) |
		    ((u64)rxd->ff2_mirrid_hash2.hash2 << 16) |
		    le16_to_cpu(rxd->hash1);
#endif
}

static inline void
idpf_xdp_get_qw3(struct idpf_xdp_rx_desc *desc,
		 const struct virtchnl2_rx_flex_desc_adv_nic_3 *rxd)
{
#ifdef __LIBETH_WORD_ACCESS
	desc->qw3 = ((const typeof(desc))rxd)->qw3;
#else
	desc->qw3 = ((u64)le32_to_cpu(rxd->ts_high) << 32) |
		    ((u64)le16_to_cpu(rxd->fmd6) << 16) |
		    le16_to_cpu(rxd->l2tag1);
#endif
}

void idpf_xdp_set_features(const struct idpf_vport *vport);

int idpf_xdp(struct net_device *dev, struct netdev_bpf *xdp);
int idpf_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
		  u32 flags);

Annotation

Implementation Notes