net/octeontx2: add remaining PTP operations
[dpdk.git] / drivers / net / octeontx2 / otx2_ethdev.c
index 909aad6..834b052 100644 (file)
@@ -47,6 +47,7 @@ nix_get_tx_offload_capa(struct otx2_eth_dev *dev)
 
 static const struct otx2_dev_ops otx2_dev_ops = {
        .link_status_update = otx2_eth_dev_link_status_update,
+       .ptp_info_update = otx2_eth_dev_ptp_info_update
 };
 
 static int
@@ -216,6 +217,14 @@ nix_cq_rq_init(struct rte_eth_dev *eth_dev, struct otx2_eth_dev *dev,
        aq->cq.cq_err_int_ena = BIT(NIX_CQERRINT_CQE_FAULT);
        aq->cq.cq_err_int_ena |= BIT(NIX_CQERRINT_DOOR_ERR);
 
+       /* TX pause frames enable flowctrl on RX side */
+       if (dev->fc_info.tx_pause) {
+               /* Single bpid is allocated for all rx channels for now */
+               aq->cq.bpid = dev->fc_info.bpid[0];
+               aq->cq.bp = NIX_CQ_BP_LEVEL;
+               aq->cq.bp_ena = 1;
+       }
+
        /* Many to one reduction */
        aq->cq.qint_idx = qid % dev->qints;
 
@@ -328,9 +337,7 @@ nix_cq_rq_uninit(struct rte_eth_dev *eth_dev, struct otx2_eth_rxq *rxq)
 static inline int
 nix_get_data_off(struct otx2_eth_dev *dev)
 {
-       RTE_SET_USED(dev);
-
-       return 0;
+       return otx2_ethdev_is_ptp_en(dev) ? NIX_TIMESYNC_RX_OFFSET : 0;
 }
 
 uint64_t
@@ -442,6 +449,7 @@ otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq,
        rxq->qlen = nix_qsize_to_val(qsize);
        rxq->qsize = qsize;
        rxq->lookup_mem = otx2_nix_fastpath_lookup_mem_get();
+       rxq->tstamp = &dev->tstamp;
 
        /* Alloc completion queue */
        rc = nix_cq_rq_init(eth_dev, dev, rq, rxq, mp);
@@ -728,6 +736,7 @@ otx2_nix_form_default_desc(struct otx2_eth_txq *txq)
                        send_mem->dsz = 0x0;
                        send_mem->wmem = 0x1;
                        send_mem->alg = NIX_SENDMEMALG_SETTSTMP;
+                       send_mem->addr = txq->dev->tstamp.tx_tstamp_iova;
                }
                sg = (union nix_send_sg_s *)&txq->cmd[4];
        } else {
@@ -1092,6 +1101,7 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
 
        /* Free the resources allocated from the previous configure */
        if (dev->configured == 1) {
+               otx2_nix_rxchan_bpid_cfg(eth_dev, false);
                oxt2_nix_unregister_queue_irqs(eth_dev);
                nix_set_nop_rxtx_function(eth_dev);
                rc = nix_store_queue_cfg_and_then_release(eth_dev);
@@ -1145,6 +1155,22 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                goto free_nix_lf;
        }
 
+       rc = otx2_nix_rxchan_bpid_cfg(eth_dev, true);
+       if (rc) {
+               otx2_err("Failed to configure nix rx chan bpid cfg rc=%d", rc);
+               goto free_nix_lf;
+       }
+
+       /* Enable PTP if it was requested by the app or if it is already
+        * enabled in PF owning this VF
+        */
+       memset(&dev->tstamp, 0, sizeof(struct otx2_timesync_info));
+       if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP) ||
+           otx2_ethdev_is_ptp_en(dev))
+               otx2_nix_timesync_enable(eth_dev);
+       else
+               otx2_nix_timesync_disable(eth_dev);
+
        /*
         * Restore queue config when reconfigure followed by
         * reconfigure and no queue configure invoked from application case.
@@ -1319,6 +1345,17 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {
        .rx_descriptor_status     = otx2_nix_rx_descriptor_status,
        .tx_done_cleanup          = otx2_nix_tx_done_cleanup,
        .pool_ops_supported       = otx2_nix_pool_ops_supported,
+       .get_module_info          = otx2_nix_get_module_info,
+       .get_module_eeprom        = otx2_nix_get_module_eeprom,
+       .flow_ctrl_get            = otx2_nix_flow_ctrl_get,
+       .flow_ctrl_set            = otx2_nix_flow_ctrl_set,
+       .timesync_enable          = otx2_nix_timesync_enable,
+       .timesync_disable         = otx2_nix_timesync_disable,
+       .timesync_read_rx_timestamp = otx2_nix_timesync_read_rx_timestamp,
+       .timesync_read_tx_timestamp = otx2_nix_timesync_read_tx_timestamp,
+       .timesync_adjust_time     = otx2_nix_timesync_adjust_time,
+       .timesync_read_time       = otx2_nix_timesync_read_time,
+       .timesync_write_time      = otx2_nix_timesync_write_time,
 };
 
 static inline int
@@ -1520,6 +1557,13 @@ otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return 0;
 
+       /* Disable nix bpid config */
+       otx2_nix_rxchan_bpid_cfg(eth_dev, false);
+
+       /* Disable PTP if already enabled */
+       if (otx2_ethdev_is_ptp_en(dev))
+               otx2_nix_timesync_disable(eth_dev);
+
        /* Free up SQs */
        for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
                otx2_nix_tx_queue_release(eth_dev->data->tx_queues[i]);