On 9/1/2020 12:51 PM, Jiawen Wu wrote:
> Add queue stats mapping set, complete receive and transmit unit with DMA and 
> sec path.
> 
> Signed-off-by: Jiawen Wu <jiawe...@trustnetic.com>

<...>

> +static int
> +txgbe_dev_queue_stats_mapping_set(struct rte_eth_dev *eth_dev,
> +                               uint16_t queue_id,
> +                               uint8_t stat_idx,
> +                               uint8_t is_rx)
> +{
> +     struct txgbe_hw *hw = TXGBE_DEV_HW(eth_dev);
> +     struct txgbe_stat_mappings *stat_mappings =
> +             TXGBE_DEV_STAT_MAPPINGS(eth_dev);
> +     uint32_t qsmr_mask = 0;
> +     uint32_t clearing_mask = QMAP_FIELD_RESERVED_BITS_MASK;
> +     uint32_t q_map;
> +     uint8_t n, offset;
> +
> +     if (hw->mac.type != txgbe_mac_raptor)
> +             return -ENOSYS;
> +
> +     PMD_INIT_LOG(DEBUG, "Setting port %d, %s queue_id %d to stat index %d",
> +                  (int)(eth_dev->data->port_id), is_rx ? "RX" : "TX",
> +                  queue_id, stat_idx);
> +
> +     n = (uint8_t)(queue_id / NB_QMAP_FIELDS_PER_QSM_REG);
> +     if (n >= TXGBE_NB_STAT_MAPPING) {
> +             PMD_INIT_LOG(ERR, "Nb of stat mapping registers exceeded");
> +             return -EIO;
> +     }
> +     offset = (uint8_t)(queue_id % NB_QMAP_FIELDS_PER_QSM_REG);
> +
> +     /* Now clear any previous stat_idx set */
> +     clearing_mask <<= (QSM_REG_NB_BITS_PER_QMAP_FIELD * offset);
> +     if (!is_rx)
> +             stat_mappings->tqsm[n] &= ~clearing_mask;
> +     else
> +             stat_mappings->rqsm[n] &= ~clearing_mask;
> +
> +     q_map = (uint32_t)stat_idx;
> +     q_map &= QMAP_FIELD_RESERVED_BITS_MASK;

A check for "'stat_idx' > QMAP_FIELD_RESERVED_BITS_MASK" can be good, although
it is masked out, it will give different stat than user requested.

Reply via email to