On 12-Oct-20 9:09 AM, Wang, Haiyue wrote:
Hi Liang,

-----Original Message-----
From: Burakov, Anatoly <anatoly.bura...@intel.com>
Sent: Saturday, October 10, 2020 00:02
To: dev@dpdk.org
Cc: Ma, Liang J <liang.j...@intel.com>; Guo, Jia <jia....@intel.com>; Wang, 
Haiyue
<haiyue.w...@intel.com>; Hunt, David <david.h...@intel.com>; Ananyev, Konstantin
<konstantin.anan...@intel.com>; jerinjac...@gmail.com; Richardson, Bruce 
<bruce.richard...@intel.com>;
tho...@monjalon.net; McDaniel, Timothy <timothy.mcdan...@intel.com>; Eads, Gage 
<gage.e...@intel.com>;
Macnamara, Chris <chris.macnam...@intel.com>
Subject: [PATCH v5 06/10] net/ixgbe: implement power management API

From: Liang Ma <liang.j...@intel.com>

Implement support for the power management API by implementing a
`get_wake_addr` function that will return an address of an RX ring's
status bit.

Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
Signed-off-by: Liang Ma <liang.j...@intel.com>
---
  drivers/net/ixgbe/ixgbe_ethdev.c |  1 +
  drivers/net/ixgbe/ixgbe_rxtx.c   | 22 ++++++++++++++++++++++
  drivers/net/ixgbe/ixgbe_rxtx.h   |  2 ++
  3 files changed, 25 insertions(+)




+int ixgbe_get_wake_addr(void *rx_queue, volatile void **tail_desc_addr,
+uint64_t *expected, uint64_t *mask)
+{
+volatile union ixgbe_adv_rx_desc *rxdp;
+struct ixgbe_rx_queue *rxq = rx_queue;
+uint16_t desc;
+
+desc = rxq->rx_tail;
+rxdp = &rxq->rx_ring[desc];
+/* watch for changes in status bit */
+*tail_desc_addr = &rxdp->wb.upper.status_error;
+
+/*
+ * we expect the DD bit to be set to 1 if this descriptor was already
+ * written to.
+ */
+*expected = rte_cpu_to_le_32(IXGBE_RXDADV_STAT_DD);
+*mask = rte_cpu_to_le_32(IXGBE_RXDADV_STAT_DD);
+

Seems have one issue about the byte endian:
Like for BIG endian:
          *expected = rte_bswap32(IXGBE_RXDADV_STAT_DD)
              !=
          *expected = rte_bswap64(IXGBE_RXDADV_STAT_DD)

And in API 'rte_power_monitor', use uint64_t type to access the wake up
data:

static inline void rte_power_monitor(const volatile void *p,
const uint64_t expected_value, const uint64_t value_mask,
const uint64_t tsc_timestamp)
{
if (value_mask) {
const uint64_t cur_value = *(const volatile uint64_t *)p;
const uint64_t masked = cur_value & value_mask;
/* if the masked value is already matching, abort */
if (masked == expected_value)
return;
}


So that we need the wake up address type like 16/32/64b ?

Endian differences strike again! You're right of course.

I suspect casting everything to CPU endinanness would fix it, would it not?


--
2.17.1


--
Thanks,
Anatoly

Reply via email to