This patch adds one new API to get dcb related info.
  rte_eth_dev_get_dcb_info

Signed-off-by: Jingjing Wu <jingjing.wu at intel.com>
---
 lib/librte_ether/rte_ethdev.c | 18 ++++++++++++++++
 lib/librte_ether/rte_ethdev.h | 50 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index f4bbca6..44a2d55 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3371,3 +3371,21 @@ rte_eth_dev_set_eeprom(uint8_t port_id, struct 
rte_dev_eeprom_info *info)
        FUNC_PTR_OR_ERR_RET(*dev->dev_ops->set_eeprom, -ENOTSUP);
        return (*dev->dev_ops->set_eeprom)(dev, info);
 }
+
+void
+rte_eth_dev_get_dcb_info(uint8_t port_id,
+                            struct rte_eth_dcb_info *dcb_info)
+{
+       struct rte_eth_dev *dev;
+
+       if (!rte_eth_dev_is_valid_port(port_id)) {
+               PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+               return;
+       }
+
+       dev = &rte_eth_devices[port_id];
+       memset(dcb_info, 0, sizeof(struct rte_eth_dcb_info));
+
+       FUNC_PTR_OR_RET(*dev->dev_ops->get_dcb_info);
+       (*dev->dev_ops->get_dcb_info)(dev, dcb_info);
+}
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 0aa00a6..e6b7271 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -962,6 +962,38 @@ struct rte_eth_xstats {
        uint64_t value;
 };

+#define ETH_DCB_NUM_TCS    8
+#define ETH_MAX_VMDQ_POOL  64
+
+/**
+ * A structure used to get the information of queue and
+ * TC mapping on both TX and RX paths.
+ */
+struct rte_eth_dcb_tc_queue_mapping {
+       /** rx queues assigned to tc per Pool */
+       struct {
+               uint8_t base;
+               uint8_t nb_queue;
+       } tc_rxq[ETH_MAX_VMDQ_POOL][ETH_DCB_NUM_TCS];
+       /** rx queues assigned to tc per Pool */
+       struct {
+               uint8_t base;
+               uint8_t nb_queue;
+       } tc_txq[ETH_MAX_VMDQ_POOL][ETH_DCB_NUM_TCS];
+};
+
+/**
+ * A structure used to get the information of DCB.
+ * It includes TC UP mapping and queue TC mapping.
+ */
+struct rte_eth_dcb_info {
+       uint8_t nb_tcs;        /**< number of TCs */
+       uint8_t prio_tc[ETH_DCB_NUM_USER_PRIORITIES]; /**< Priority to tc */
+       uint8_t tc_bws[ETH_DCB_NUM_TCS]; /**< TX BW percentage for each TC */
+       /** rx queues assigned to tc */
+       struct rte_eth_dcb_tc_queue_mapping tc_queue;
+};
+
 struct rte_eth_dev;

 struct rte_eth_dev_callback;
@@ -1354,6 +1386,10 @@ typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
                                 void *arg);
 /**< @internal Take operations to assigned filter type on an Ethernet device */

+typedef void (*eth_get_dcb_info)(struct rte_eth_dev *dev,
+                                struct rte_eth_dcb_info *dcb_info);
+/**< @internal Get dcb information on an Ethernet device */
+
 /**
  * @internal A structure containing the functions exported by an Ethernet 
driver.
  */
@@ -1476,6 +1512,9 @@ struct eth_dev_ops {
        eth_timesync_read_rx_timestamp_t timesync_read_rx_timestamp;
        /** Read the IEEE1588/802.1AS TX timestamp. */
        eth_timesync_read_tx_timestamp_t timesync_read_tx_timestamp;
+
+       /** Get DCB information */
+       eth_get_dcb_info get_dcb_info;
 };

 /**
@@ -3701,6 +3740,17 @@ int rte_eth_dev_filter_ctrl(uint8_t port_id, enum 
rte_filter_type filter_type,
                        enum rte_filter_op filter_op, void *arg);

 /**
+ * Get DCB information on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param dcb_info
+ *   dcb information.
+ */
+void rte_eth_dev_get_dcb_info(uint8_t port_id,
+                            struct rte_eth_dcb_info *dcb_info);
+
+/**
  * Add a callback to be called on packet RX on a given port and queue.
  *
  * This API configures a function to be called for each burst of
-- 
2.4.0

Reply via email to