Skip to content

Commit

Permalink
Add rx
Browse files Browse the repository at this point in the history
  • Loading branch information
kreudom committed Nov 13, 2024
1 parent 79359b3 commit ee1fe91
Showing 1 changed file with 87 additions and 10 deletions.
97 changes: 87 additions & 10 deletions drivers/net/ice/vdpdk.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,12 +219,17 @@ enum VDPDK_CONSTS {
REGION_SIZE = 0x1000,
PKT_SIGNAL_OFF = REGION_SIZE - 0x40,
MAX_PKT_LEN = PKT_SIGNAL_OFF,
MAX_RX_DESCS = 256,
};

struct vdpdk_regions {
struct vdpdk_private_data {
unsigned char *signal;
unsigned char *tx;
unsigned char *rx;

struct rte_mempool *rx_pool;
struct rte_mbuf *rx_bufs[MAX_RX_DESCS];
unsigned rx_buf_count;
};

static const struct rte_pci_id pci_id_ice_map[] = {
Expand Down Expand Up @@ -2159,7 +2164,7 @@ ice_dev_init(struct rte_eth_dev *dev)
if (c == '\0') break;
}

struct vdpdk_regions *regs = dev->data->dev_private;
struct vdpdk_private_data *regs = dev->data->dev_private;
regs->signal = pci_dev->mem_resource[0].addr;
regs->tx = pci_dev->mem_resource[1].addr;
regs->rx = pci_dev->mem_resource[2].addr;
Expand Down Expand Up @@ -3748,11 +3753,11 @@ ice_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
// .offloads = 0,
// };

// dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
// .nb_max = ICE_MAX_RING_DESC,
// .nb_min = ICE_MIN_RING_DESC,
// .nb_align = ICE_ALIGN_RING_DESC,
// };
dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
.nb_max = MAX_RX_DESCS,
.nb_min = ICE_MIN_RING_DESC,
.nb_align = ICE_ALIGN_RING_DESC,
};

// dev_info->tx_desc_lim = (struct rte_eth_desc_lim) {
// .nb_max = ICE_MAX_RING_DESC,
Expand Down Expand Up @@ -6381,7 +6386,17 @@ vdpdk_rx_queue_setup(struct rte_eth_dev *dev,
unsigned int socket_id,
const struct rte_eth_rxconf *rx_conf,
struct rte_mempool *mp) {
if (queue_idx != 0) return -EINVAL;
dev->data->rx_queues[0] = dev->data->dev_private;
struct vdpdk_private_data *data = dev->data->dev_private;
data->rx_pool = mp;
if (nb_desc < ICE_MIN_RING_DESC || nb_desc > MAX_RX_DESCS) {
return -EINVAL;
}
if (rte_pktmbuf_alloc_bulk(mp, data->rx_bufs, nb_desc) != 0) {
return -ENOMEM;
}
data->rx_buf_count = nb_desc;
return 0;
}

Expand All @@ -6391,6 +6406,7 @@ vdpdk_tx_queue_setup(struct rte_eth_dev *dev,
uint16_t nb_desc,
unsigned int socket_id,
const struct rte_eth_txconf *tx_conf) {
if (queue_idx != 0) return -EINVAL;
dev->data->tx_queues[0] = dev->data->dev_private;
return 0;
}
Expand All @@ -6399,12 +6415,73 @@ static uint16_t
vdpdk_recv_pkts(void *rx_queue,
struct rte_mbuf **rx_pkts,
uint16_t nb_pkts) {
return 0;
struct vdpdk_private_data *regs = rx_queue;
uint8_t *lock = regs->rx + PKT_SIGNAL_OFF;

unsigned char *ptr = regs->rx;
unsigned char *end = ptr + MAX_PKT_LEN;
const size_t addr_size = sizeof(uintptr_t);

if (nb_pkts > regs->rx_buf_count) {
nb_pkts = regs->rx_buf_count;
}

while (rte_read8(lock) != 1);

for (unsigned i = 0; i < nb_pkts; i++) {
if (ptr + 2 + addr_size > end) {
break;
}

struct rte_mbuf *buf = regs->rx_bufs[i];

uint16_t max_len = rte_pktmbuf_tailroom(buf);
ptr[0] = max_len;
ptr[1] = max_len >> 8;
ptr += 2;

uintptr_t dma_addr = rte_pktmbuf_iova(buf);
rte_memcpy(ptr, &dma_addr, addr_size);
ptr += addr_size;
}

if (ptr + 2 + addr_size <= end) {
ptr[0] = 0;
ptr[1] = 0;
}

rte_write8(0, lock);
while (rte_read8(lock) != 1);

ptr = regs->rx;
unsigned i;
for (i = 0; i < nb_pkts; i++) {
if (ptr + 2 + addr_size > end) {
break;
}

uint16_t pkt_len = ptr[0] | ((uint16_t)ptr[1] << 8);
ptr += 2 + addr_size;

if (pkt_len == 0) {
break;
}

struct rte_mbuf *new_buf = rte_pktmbuf_alloc(regs->rx_pool);
if (!new_buf) {
break;
}

rx_pkts[i] = regs->rx_bufs[i];
regs->rx_bufs[i] = new_buf;
}

return i;
}

static uint16_t
vdpdk_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) {
struct vdpdk_regions *regs = tx_queue;
struct vdpdk_private_data *regs = tx_queue;
uint8_t *lock = regs->tx + PKT_SIGNAL_OFF;

unsigned char *ptr = regs->tx;
Expand Down Expand Up @@ -6466,7 +6543,7 @@ ice_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
struct rte_pci_device *pci_dev)
{
return rte_eth_dev_pci_generic_probe(pci_dev,
sizeof(struct vdpdk_regions),
sizeof(struct vdpdk_private_data),
ice_dev_init);
}

Expand Down

0 comments on commit ee1fe91

Please sign in to comment.