X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Ftxgbe%2Ftxgbe_tm.c;h=3171be73d05d1b8a71531ebd351fbf481edb5241;hb=5b634932410ca41c2071a8d015180fd464df2fa5;hp=6dd593e54e075d8cacedc9ac0a7b9affc0c9b041;hpb=0611a69bb7af827dc553c466e78f37e900372551;p=dpdk.git diff --git a/drivers/net/txgbe/txgbe_tm.c b/drivers/net/txgbe/txgbe_tm.c index 6dd593e54e..3171be73d0 100644 --- a/drivers/net/txgbe/txgbe_tm.c +++ b/drivers/net/txgbe/txgbe_tm.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2015-2020 + * Copyright(c) 2015-2020 Beijing WangXun Technology Co., Ltd. + * Copyright(c) 2010-2017 Intel Corporation */ #include @@ -33,6 +34,9 @@ static int txgbe_node_capabilities_get(struct rte_eth_dev *dev, uint32_t node_id, struct rte_tm_node_capabilities *cap, struct rte_tm_error *error); +static int txgbe_hierarchy_commit(struct rte_eth_dev *dev, + int clear_on_fail, + struct rte_tm_error *error); const struct rte_tm_ops txgbe_tm_ops = { .capabilities_get = txgbe_tm_capabilities_get, @@ -43,6 +47,7 @@ const struct rte_tm_ops txgbe_tm_ops = { .node_type_get = txgbe_node_type_get, .level_capabilities_get = txgbe_level_capabilities_get, .node_capabilities_get = txgbe_node_capabilities_get, + .hierarchy_commit = txgbe_hierarchy_commit, }; int @@ -113,14 +118,14 @@ txgbe_tc_nb_get(struct rte_eth_dev *dev) uint8_t nb_tcs = 0; eth_conf = &dev->data->dev_conf; - if (eth_conf->txmode.mq_mode == ETH_MQ_TX_DCB) { + if (eth_conf->txmode.mq_mode == RTE_ETH_MQ_TX_DCB) { nb_tcs = eth_conf->tx_adv_conf.dcb_tx_conf.nb_tcs; - } else if (eth_conf->txmode.mq_mode == ETH_MQ_TX_VMDQ_DCB) { + } else if (eth_conf->txmode.mq_mode == RTE_ETH_MQ_TX_VMDQ_DCB) { if (eth_conf->tx_adv_conf.vmdq_dcb_tx_conf.nb_queue_pools == - ETH_32_POOLS) - nb_tcs = ETH_4_TCS; + RTE_ETH_32_POOLS) + nb_tcs = RTE_ETH_4_TCS; else - nb_tcs = ETH_8_TCS; + nb_tcs = RTE_ETH_8_TCS; } else { nb_tcs = 1; } @@ -359,10 +364,10 @@ txgbe_queue_base_nb_get(struct rte_eth_dev *dev, uint16_t tc_node_no, if (vf_num) { /* no DCB */ if (nb_tcs == 1) { - if (vf_num >= ETH_32_POOLS) { + if (vf_num >= RTE_ETH_32_POOLS) { *nb = 2; *base = vf_num * 2; - } else if (vf_num >= ETH_16_POOLS) { + } else if (vf_num >= RTE_ETH_16_POOLS) { *nb = 4; *base = vf_num * 4; } else { @@ -376,7 +381,7 @@ txgbe_queue_base_nb_get(struct rte_eth_dev *dev, uint16_t tc_node_no, } } else { /* VT off */ - if (nb_tcs == ETH_8_TCS) { + if (nb_tcs == RTE_ETH_8_TCS) { switch (tc_node_no) { case 0: *base = 0; @@ -950,3 +955,69 @@ txgbe_node_capabilities_get(struct rte_eth_dev *dev, return 0; } +static int +txgbe_hierarchy_commit(struct rte_eth_dev *dev, + int clear_on_fail, + struct rte_tm_error *error) +{ + struct txgbe_tm_conf *tm_conf = TXGBE_DEV_TM_CONF(dev); + struct txgbe_tm_node *tm_node; + uint64_t bw; + int ret; + + if (!error) + return -EINVAL; + + /* check the setting */ + if (!tm_conf->root) + goto done; + + /* not support port max bandwidth yet */ + if (tm_conf->root->shaper_profile && + tm_conf->root->shaper_profile->profile.peak.rate) { + error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE; + error->message = "no port max bandwidth"; + goto fail_clear; + } + + /* HW not support TC max bandwidth */ + TAILQ_FOREACH(tm_node, &tm_conf->tc_list, node) { + if (tm_node->shaper_profile && + tm_node->shaper_profile->profile.peak.rate) { + error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE; + error->message = "no TC max bandwidth"; + goto fail_clear; + } + } + + /* queue max bandwidth */ + TAILQ_FOREACH(tm_node, &tm_conf->queue_list, node) { + if (tm_node->shaper_profile) + bw = tm_node->shaper_profile->profile.peak.rate; + else + bw = 0; + if (bw) { + /* interpret Bps to Mbps */ + bw = bw * 8 / 1000 / 1000; + ret = txgbe_set_queue_rate_limit(dev, tm_node->no, bw); + if (ret) { + error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE; + error->message = + "failed to set queue max bandwidth"; + goto fail_clear; + } + } + } + +done: + tm_conf->committed = true; + return 0; + +fail_clear: + /* clear all the traffic manager configuration */ + if (clear_on_fail) { + txgbe_tm_conf_uninit(dev); + txgbe_tm_conf_init(dev); + } + return -EINVAL; +}