[v3,2/6] ethdev: add simple power management API
Checks
Commit Message
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@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
lib/librte_ethdev/rte_ethdev.h | 22 ++++++++++++++
lib/librte_ethdev/rte_ethdev_core.h | 46 +++++++++++++++++++++++++++--
2 files changed, 66 insertions(+), 2 deletions(-)
Comments
On Fri, 4 Sep 2020 11:18:56 +0100
Liang Ma <liang.j.ma@intel.com> wrote:
> +#define ETH_EMPTYPOLL_MAX 512 /**< Empty poll number threshlold */
Spelling here.
Also, shouldn't this be a per-device (or per-queue) configuration value.
> 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@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@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
agree, will be addressed
On 04 Sep 09:37, Stephen Hemminger wrote:
> On Fri, 4 Sep 2020 11:18:56 +0100
> Liang Ma <liang.j.ma@intel.com> wrote:
>
>
>
> > +#define ETH_EMPTYPOLL_MAX 512 /**< Empty poll number threshlold */
>
> Spelling here.
>
> Also, shouldn't this be a per-device (or per-queue) configuration value.
@@ -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,
+};
+
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 */
@@ -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);
+
/**
* @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;