[dpdk-dev] [PATCH v3 2/6] ethdev: add simple power management API
Ananyev, Konstantin
konstantin.ananyev at intel.com
Fri Sep 4 22:54:49 CEST 2020
> Add a simple API allow ethdev get the last
> available queue descriptor address from PMD.
> Also include internal structure update.
>
> Signed-off-by: Liang Ma <liang.j.ma at intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
> ---
> lib/librte_ethdev/rte_ethdev.h | 22 ++++++++++++++
> lib/librte_ethdev/rte_ethdev_core.h | 46 +++++++++++++++++++++++++++--
> 2 files changed, 66 insertions(+), 2 deletions(-)
>
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index 70295d7ab7..d9312d3e11 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -157,6 +157,7 @@ extern "C" {
> #include <rte_common.h>
> #include <rte_config.h>
> #include <rte_ether.h>
> +#include <rte_power_intrinsics.h>
>
> #include "rte_ethdev_trace_fp.h"
> #include "rte_dev_info.h"
> @@ -775,6 +776,7 @@ rte_eth_rss_hf_refine(uint64_t rss_hf)
> /** Maximum nb. of vlan per mirror rule */
> #define ETH_MIRROR_MAX_VLANS 64
>
> +#define ETH_EMPTYPOLL_MAX 512 /**< Empty poll number threshlold */
> #define ETH_MIRROR_VIRTUAL_POOL_UP 0x01 /**< Virtual Pool uplink Mirroring. */
> #define ETH_MIRROR_UPLINK_PORT 0x02 /**< Uplink Port Mirroring. */
> #define ETH_MIRROR_DOWNLINK_PORT 0x04 /**< Downlink Port Mirroring. */
> @@ -1602,6 +1604,26 @@ enum rte_eth_dev_state {
> RTE_ETH_DEV_REMOVED,
> };
>
> +#define RTE_ETH_PAUSE_NUM 64 /* How many times to pause */
> +/**
> + * Possible power management states of an ethdev port.
> + */
> +enum rte_eth_dev_power_mgmt_state {
> + /** Device power management is disabled. */
> + RTE_ETH_DEV_POWER_MGMT_DISABLED = 0,
> + /** Device power management is enabled. */
> + RTE_ETH_DEV_POWER_MGMT_ENABLED,
> +};
> +
> +enum rte_eth_dev_power_mgmt_cb_mode {
> + /** WAIT callback mode. */
> + RTE_ETH_DEV_POWER_MGMT_CB_WAIT = 1,
> + /** PAUSE callback mode. */
> + RTE_ETH_DEV_POWER_MGMT_CB_PAUSE,
> + /** Freq Scaling callback mode. */
> + RTE_ETH_DEV_POWER_MGMT_CB_SCALE,
> +};
> +
I don't think we need to put all these power related
staff into rte_ethdev library.
rte_power or so, seems like much better place for it.
> struct rte_eth_dev_sriov {
> uint8_t active; /**< SRIOV is active with 16, 32 or 64 pools */
> uint8_t nb_q_per_pool; /**< rx queue number per pool */
> diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h
> index 32407dd418..16e54bb4e4 100644
> --- a/lib/librte_ethdev/rte_ethdev_core.h
> +++ b/lib/librte_ethdev/rte_ethdev_core.h
> @@ -603,6 +603,30 @@ typedef int (*eth_tx_hairpin_queue_setup_t)
> uint16_t nb_tx_desc,
> const struct rte_eth_hairpin_conf *hairpin_conf);
>
> +/**
> + * @internal
> + * Get the next RX ring descriptor address.
> + *
> + * @param rxq
> + * ethdev queue pointer.
> + * @param tail_desc_addr
> + * the pointer point to descriptor address var.
> + * @param expected
> + * the pointer point to value to be expected when descriptor is set.
> + * @param mask
> + * the pointer point to comparison bitmask for the expected value.
> + * @return
> + * Negative errno value on error, 0 on success.
> + *
> + * @retval 0
> + * Success.
> + * @retval -EINVAL
> + * Failed to get descriptor address.
> + */
> +typedef int (*eth_next_rx_desc_t)
> + (void *rxq, volatile void **tail_desc_addr,
> + uint64_t *expected, uint64_t *mask);
> +
In theory it could be anything: next RXD, doorbell,
even some global variable.
So I think function name needs to be more neutral:
eth_rx_wait_addr() or so.
Also I think you need a new rte_eth_ wrapper function
for that dev op.
> /**
> * @internal A structure containing the functions exported by an Ethernet driver.
> */
> @@ -752,6 +776,8 @@ struct eth_dev_ops {
> /**< Set up device RX hairpin queue. */
> eth_tx_hairpin_queue_setup_t tx_hairpin_queue_setup;
> /**< Set up device TX hairpin queue. */
> + eth_next_rx_desc_t next_rx_desc;
> + /**< Get next RX ring descriptor address. */
> };
>
> /**
> @@ -768,6 +794,14 @@ struct rte_eth_rxtx_callback {
> void *param;
> };
>
> +/**
> + * @internal
> + * Structure used to hold counters for empty poll
> + */
> +struct rte_eth_ep_stat {
> + uint64_t num;
> +} __rte_cache_aligned;
> +
> /**
> * @internal
> * The generic data structure associated with each ethernet device.
> @@ -807,8 +841,16 @@ struct rte_eth_dev {
> enum rte_eth_dev_state state; /**< Flag indicating the port state */
> void *security_ctx; /**< Context for security ops */
>
> - uint64_t reserved_64s[4]; /**< Reserved for future fields */
> - void *reserved_ptrs[4]; /**< Reserved for future fields */
> + /**< Empty poll number */
> + enum rte_eth_dev_power_mgmt_state pwr_mgmt_state;
> + /**< Power mgmt Callback mode */
> + enum rte_eth_dev_power_mgmt_cb_mode cb_mode;
> + uint64_t reserved_64s[3]; /**< Reserved for future fields */
> +
> + /**< Flag indicating the port power state */
> + struct rte_eth_ep_stat *empty_poll_stats;
> + const struct rte_eth_rxtx_callback *cur_pwr_cb;
> + void *reserved_ptrs[2]; /**< Reserved for future fields */
> } __rte_cache_aligned;
>
> struct rte_eth_dev_sriov;
> --
> 2.17.1
More information about the dev
mailing list