X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fcnxk%2Fcn9k_ethdev.c;h=6b049b28979789f5ce56ab1c2f94ce411da39cb1;hb=68c48ab31875299e17c963db1b3a56c3ca4cd3c6;hp=2fdc10a2c9cb64e472ec8aa8d442559b6fd3860c;hpb=daa02b5cddbb8e11b31d41e2bf7bb1ae64dcae2f;p=dpdk.git diff --git a/drivers/net/cnxk/cn9k_ethdev.c b/drivers/net/cnxk/cn9k_ethdev.c index 2fdc10a2c9..6b049b2897 100644 --- a/drivers/net/cnxk/cn9k_ethdev.c +++ b/drivers/net/cnxk/cn9k_ethdev.c @@ -2,7 +2,7 @@ * Copyright(C) 2021 Marvell. */ #include "cn9k_ethdev.h" -#include "cn9k_rte_flow.h" +#include "cn9k_flow.h" #include "cn9k_rx.h" #include "cn9k_tx.h" @@ -39,6 +39,9 @@ nix_rx_offload_flags(struct rte_eth_dev *eth_dev) if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SECURITY) flags |= NIX_RX_OFFLOAD_SECURITY_F; + if (dev->rx_mark_update) + flags |= NIX_RX_OFFLOAD_MARK_UPDATE_F; + return flags; } @@ -131,51 +134,31 @@ static void nix_form_default_desc(struct cnxk_eth_dev *dev, struct cn9k_eth_txq *txq, uint16_t qid) { - struct nix_send_ext_s *send_hdr_ext; - struct nix_send_hdr_s *send_hdr; - struct nix_send_mem_s *send_mem; - union nix_send_sg_s *sg; + union nix_send_hdr_w0_u send_hdr_w0; /* Initialize the fields based on basic single segment packet */ - memset(&txq->cmd, 0, sizeof(txq->cmd)); - + send_hdr_w0.u = 0; if (dev->tx_offload_flags & NIX_TX_NEED_EXT_HDR) { - send_hdr = (struct nix_send_hdr_s *)&txq->cmd[0]; /* 2(HDR) + 2(EXT_HDR) + 1(SG) + 1(IOVA) = 6/2 - 1 = 2 */ - send_hdr->w0.sizem1 = 2; - - send_hdr_ext = (struct nix_send_ext_s *)&txq->cmd[2]; - send_hdr_ext->w0.subdc = NIX_SUBDC_EXT; + send_hdr_w0.sizem1 = 2; if (dev->tx_offload_flags & NIX_TX_OFFLOAD_TSTAMP_F) { /* Default: one seg packet would have: * 2(HDR) + 2(EXT) + 1(SG) + 1(IOVA) + 2(MEM) * => 8/2 - 1 = 3 */ - send_hdr->w0.sizem1 = 3; - send_hdr_ext->w0.tstmp = 1; + send_hdr_w0.sizem1 = 3; /* To calculate the offset for send_mem, * send_hdr->w0.sizem1 * 2 */ - send_mem = (struct nix_send_mem_s *) - (txq->cmd + (send_hdr->w0.sizem1 << 1)); - send_mem->w0.cn9k.subdc = NIX_SUBDC_MEM; - send_mem->w0.cn9k.alg = NIX_SENDMEMALG_SETTSTMP; - send_mem->addr = dev->tstamp.tx_tstamp_iova; + txq->ts_mem = dev->tstamp.tx_tstamp_iova; } - sg = (union nix_send_sg_s *)&txq->cmd[4]; } else { - send_hdr = (struct nix_send_hdr_s *)&txq->cmd[0]; /* 2(HDR) + 1(SG) + 1(IOVA) = 4/2 - 1 = 1 */ - send_hdr->w0.sizem1 = 1; - sg = (union nix_send_sg_s *)&txq->cmd[2]; + send_hdr_w0.sizem1 = 1; } - - send_hdr->w0.sq = qid; - sg->subdc = NIX_SUBDC_SG; - sg->segs = 1; - sg->ld_type = NIX_SENDLDTYPE_LDD; - + send_hdr_w0.sq = qid; + txq->send_hdr_w0 = send_hdr_w0.u; rte_wmb(); } @@ -467,6 +450,46 @@ cn9k_nix_dev_start(struct rte_eth_dev *eth_dev) return 0; } +static int +cn9k_nix_timesync_read_tx_timestamp(struct rte_eth_dev *eth_dev, + struct timespec *timestamp) +{ + struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct cnxk_timesync_info *tstamp = &dev->tstamp; + uint64_t ns; + + if (*tstamp->tx_tstamp == 0) + return -EINVAL; + + ns = rte_timecounter_update(&dev->tx_tstamp_tc, *tstamp->tx_tstamp); + *timestamp = rte_ns_to_timespec(ns); + *tstamp->tx_tstamp = 0; + rte_wmb(); + + return 0; +} + +static int +cn9k_nix_rx_metadata_negotiate(struct rte_eth_dev *eth_dev, uint64_t *features) +{ + struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + + *features &= + (RTE_ETH_RX_METADATA_USER_FLAG | RTE_ETH_RX_METADATA_USER_MARK); + + if (*features) { + dev->rx_offload_flags |= NIX_RX_OFFLOAD_MARK_UPDATE_F; + dev->rx_mark_update = true; + } else { + dev->rx_offload_flags &= ~NIX_RX_OFFLOAD_MARK_UPDATE_F; + dev->rx_mark_update = false; + } + + cn9k_eth_set_rx_function(eth_dev); + + return 0; +} + /* Update platform specific eth dev ops */ static void nix_eth_dev_ops_override(void) @@ -486,6 +509,10 @@ nix_eth_dev_ops_override(void) cnxk_eth_dev_ops.dev_ptypes_set = cn9k_nix_ptypes_set; cnxk_eth_dev_ops.timesync_enable = cn9k_nix_timesync_enable; cnxk_eth_dev_ops.timesync_disable = cn9k_nix_timesync_disable; + cnxk_eth_dev_ops.mtr_ops_get = NULL; + cnxk_eth_dev_ops.rx_metadata_negotiate = cn9k_nix_rx_metadata_negotiate; + cnxk_eth_dev_ops.timesync_read_tx_timestamp = + cn9k_nix_timesync_read_tx_timestamp; } static void @@ -578,6 +605,21 @@ cn9k_nix_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) } static const struct rte_pci_id cn9k_pci_nix_map[] = { + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_PF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_PF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_PF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_PF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_PF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_AF_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_AF_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_AF_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_AF_VF), + CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_AF_VF), { .vendor_id = 0, },