> 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...@intel.com> > Signed-off-by: Anatoly Burakov <anatoly.bura...@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