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

-----Original Message-----
From: Burakov, Anatoly <[email protected]>
Sent: Saturday, October 10, 2020 00:02
To: [email protected]
Cc: Ma, Liang J <[email protected]>; Guo, Jia <[email protected]>; Wang, 
Haiyue
<[email protected]>; Hunt, David <[email protected]>; Ananyev, Konstantin
<[email protected]>; [email protected]; Richardson, Bruce 
<[email protected]>;
[email protected]; McDaniel, Timothy <[email protected]>; Eads, Gage 
<[email protected]>;
Macnamara, Chris <[email protected]>
Subject: [PATCH v5 06/10] net/ixgbe: implement power management API

From: Liang Ma <[email protected]>

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 <[email protected]>
Signed-off-by: Liang Ma <[email protected]>
---
  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