RE: [PATCH v3 3/9] igb: add ICR_RXDW

2023-02-01 Thread Sriram Yagnaraman
> -Original Message-
> From: Akihiko Odaki 
> Sent: Wednesday, 1 February 2023 05:36
> To: Sriram Yagnaraman 
> Cc: qemu-devel@nongnu.org; Jason Wang ; Dmitry
> Fleytman ; Michael S . Tsirkin
> ; Marcel Apfelbaum 
> Subject: Re: [PATCH v3 3/9] igb: add ICR_RXDW
> 
> On 2023/01/31 18:42, Sriram Yagnaraman wrote:
> > IGB uses RXDW ICR bit to indicate that rx descriptor has been written
> > back. This is the same as RXT0 bit in older HW.
> >
> > Signed-off-by: Sriram Yagnaraman 
> > ---
> >   hw/net/e1000x_regs.h |  4 
> >   hw/net/igb_core.c| 46 +---
> >   2 files changed, 22 insertions(+), 28 deletions(-)
> >
> > diff --git a/hw/net/e1000x_regs.h b/hw/net/e1000x_regs.h index
> > fb5b861135..f509db73a7 100644
> > --- a/hw/net/e1000x_regs.h
> > +++ b/hw/net/e1000x_regs.h
> > @@ -335,6 +335,7 @@
> >   #define E1000_ICR_RXDMT00x0010 /* rx desc min. threshold (0)
> */
> >   #define E1000_ICR_RXO   0x0040 /* rx overrun */
> >   #define E1000_ICR_RXT0  0x0080 /* rx timer intr (ring 0) */
> > +#define E1000_ICR_RXDW  0x0080 /* rx desc written back */
> >   #define E1000_ICR_MDAC  0x0200 /* MDIO access complete */
> >   #define E1000_ICR_RXCFG 0x0400 /* RX /c/ ordered set */
> >   #define E1000_ICR_GPI_EN0   0x0800 /* GP Int 0 */
> > @@ -378,6 +379,7 @@
> >   #define E1000_ICS_RXDMT0E1000_ICR_RXDMT0/* rx desc min.
> threshold */
> >   #define E1000_ICS_RXO   E1000_ICR_RXO   /* rx overrun */
> >   #define E1000_ICS_RXT0  E1000_ICR_RXT0  /* rx timer intr */
> > +#define E1000_ICS_RXDW  E1000_ICR_RXDW  /* rx desc written back
> */
> >   #define E1000_ICS_MDAC  E1000_ICR_MDAC  /* MDIO access
> complete */
> >   #define E1000_ICS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
> >   #define E1000_ICS_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
> > @@ -407,6 +409,7 @@
> >   #define E1000_IMS_RXDMT0E1000_ICR_RXDMT0/* rx desc min.
> threshold */
> >   #define E1000_IMS_RXO   E1000_ICR_RXO   /* rx overrun */
> >   #define E1000_IMS_RXT0  E1000_ICR_RXT0  /* rx timer intr */
> > +#define E1000_IMS_RXDW  E1000_ICR_RXDW  /* rx desc written back
> */
> >   #define E1000_IMS_MDAC  E1000_ICR_MDAC  /* MDIO access
> complete */
> >   #define E1000_IMS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
> >   #define E1000_IMS_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
> > @@ -441,6 +444,7 @@
> >   #define E1000_IMC_RXDMT0E1000_ICR_RXDMT0/* rx desc min.
> threshold */
> >   #define E1000_IMC_RXO   E1000_ICR_RXO   /* rx overrun */
> >   #define E1000_IMC_RXT0  E1000_ICR_RXT0  /* rx timer intr */
> > +#define E1000_IMC_RXDW  E1000_ICR_RXDW  /* rx desc written back
> */
> >   #define E1000_IMC_MDAC  E1000_ICR_MDAC  /* MDIO access
> complete */
> >   #define E1000_IMC_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
> >   #define E1000_IMC_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
> > diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index
> > 9c32ad5e36..e78bc3611a 100644
> > --- a/hw/net/igb_core.c
> > +++ b/hw/net/igb_core.c
> > @@ -1488,7 +1488,7 @@ igb_receive_internal(IGBCore *core, const struct
> iovec *iov, int iovcnt,
> >   static const int maximum_ethernet_hdr_len = (ETH_HLEN + 4);
> >
> >   uint16_t queues = 0;
> > -uint32_t n;
> > +uint32_t icr_bits = 0;
> >   uint8_t min_buf[ETH_ZLEN];
> >   struct iovec min_iov;
> >   struct eth_header *ehdr;
> > @@ -1561,6 +1561,7 @@ igb_receive_internal(IGBCore *core, const struct
> iovec *iov, int iovcnt,
> >   e1000x_fcs_len(core->mac);
> >
> >   retval = orig_size;
> > +igb_rx_fix_l4_csum(core, core->rx_pkt);
> >
> >   for (i = 0; i < IGB_NUM_QUEUES; i++) {
> >   if (!(queues & BIT(i))) {
> > @@ -1569,43 +1570,32 @@ igb_receive_internal(IGBCore *core, const
> > struct iovec *iov, int iovcnt,
> >
> >   igb_rx_ring_init(core, , i);
> >
> > -trace_e1000e_rx_rss_dispatched_to_queue(rxr.i->idx);
> > -
> >   if (!igb_has_rxbufs(core, rxr.i, total_size)) {
> > -retval = 0;
> > +icr_bits |= E1000_ICS_RXO;
> > +continue;
> >   }
> > -}
> >
> > -if (retval) {
> > -n = E1000_ICR_RXT0;
> > -
> > -   

Re: [PATCH v3 3/9] igb: add ICR_RXDW

2023-01-31 Thread Akihiko Odaki

On 2023/01/31 18:42, Sriram Yagnaraman wrote:

IGB uses RXDW ICR bit to indicate that rx descriptor has been written
back. This is the same as RXT0 bit in older HW.

Signed-off-by: Sriram Yagnaraman 
---
  hw/net/e1000x_regs.h |  4 
  hw/net/igb_core.c| 46 +---
  2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/hw/net/e1000x_regs.h b/hw/net/e1000x_regs.h
index fb5b861135..f509db73a7 100644
--- a/hw/net/e1000x_regs.h
+++ b/hw/net/e1000x_regs.h
@@ -335,6 +335,7 @@
  #define E1000_ICR_RXDMT00x0010 /* rx desc min. threshold (0) */
  #define E1000_ICR_RXO   0x0040 /* rx overrun */
  #define E1000_ICR_RXT0  0x0080 /* rx timer intr (ring 0) */
+#define E1000_ICR_RXDW  0x0080 /* rx desc written back */
  #define E1000_ICR_MDAC  0x0200 /* MDIO access complete */
  #define E1000_ICR_RXCFG 0x0400 /* RX /c/ ordered set */
  #define E1000_ICR_GPI_EN0   0x0800 /* GP Int 0 */
@@ -378,6 +379,7 @@
  #define E1000_ICS_RXDMT0E1000_ICR_RXDMT0/* rx desc min. threshold */
  #define E1000_ICS_RXO   E1000_ICR_RXO   /* rx overrun */
  #define E1000_ICS_RXT0  E1000_ICR_RXT0  /* rx timer intr */
+#define E1000_ICS_RXDW  E1000_ICR_RXDW  /* rx desc written back */
  #define E1000_ICS_MDAC  E1000_ICR_MDAC  /* MDIO access complete */
  #define E1000_ICS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
  #define E1000_ICS_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
@@ -407,6 +409,7 @@
  #define E1000_IMS_RXDMT0E1000_ICR_RXDMT0/* rx desc min. threshold */
  #define E1000_IMS_RXO   E1000_ICR_RXO   /* rx overrun */
  #define E1000_IMS_RXT0  E1000_ICR_RXT0  /* rx timer intr */
+#define E1000_IMS_RXDW  E1000_ICR_RXDW  /* rx desc written back */
  #define E1000_IMS_MDAC  E1000_ICR_MDAC  /* MDIO access complete */
  #define E1000_IMS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
  #define E1000_IMS_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
@@ -441,6 +444,7 @@
  #define E1000_IMC_RXDMT0E1000_ICR_RXDMT0/* rx desc min. threshold */
  #define E1000_IMC_RXO   E1000_ICR_RXO   /* rx overrun */
  #define E1000_IMC_RXT0  E1000_ICR_RXT0  /* rx timer intr */
+#define E1000_IMC_RXDW  E1000_ICR_RXDW  /* rx desc written back */
  #define E1000_IMC_MDAC  E1000_ICR_MDAC  /* MDIO access complete */
  #define E1000_IMC_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
  #define E1000_IMC_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c
index 9c32ad5e36..e78bc3611a 100644
--- a/hw/net/igb_core.c
+++ b/hw/net/igb_core.c
@@ -1488,7 +1488,7 @@ igb_receive_internal(IGBCore *core, const struct iovec 
*iov, int iovcnt,
  static const int maximum_ethernet_hdr_len = (ETH_HLEN + 4);
  
  uint16_t queues = 0;

-uint32_t n;
+uint32_t icr_bits = 0;
  uint8_t min_buf[ETH_ZLEN];
  struct iovec min_iov;
  struct eth_header *ehdr;
@@ -1561,6 +1561,7 @@ igb_receive_internal(IGBCore *core, const struct iovec 
*iov, int iovcnt,
  e1000x_fcs_len(core->mac);
  
  retval = orig_size;

+igb_rx_fix_l4_csum(core, core->rx_pkt);
  
  for (i = 0; i < IGB_NUM_QUEUES; i++) {

  if (!(queues & BIT(i))) {
@@ -1569,43 +1570,32 @@ igb_receive_internal(IGBCore *core, const struct iovec 
*iov, int iovcnt,
  
  igb_rx_ring_init(core, , i);
  
-trace_e1000e_rx_rss_dispatched_to_queue(rxr.i->idx);

-
  if (!igb_has_rxbufs(core, rxr.i, total_size)) {
-retval = 0;
+icr_bits |= E1000_ICS_RXO;
+continue;
  }
-}
  
-if (retval) {

-n = E1000_ICR_RXT0;
-
-igb_rx_fix_l4_csum(core, core->rx_pkt);
-
-for (i = 0; i < IGB_NUM_QUEUES; i++) {
-if (!(queues & BIT(i))) {
-continue;
-}
-
-igb_rx_ring_init(core, , i);
+trace_e1000e_rx_rss_dispatched_to_queue(rxr.i->idx);
+igb_write_packet_to_guest(core, core->rx_pkt, , _info);
  
-igb_write_packet_to_guest(core, core->rx_pkt, , _info);

+/* Check if receive descriptor minimum threshold hit */
+if (igb_rx_descr_threshold_hit(core, rxr.i)) {
+icr_bits |= E1000_ICS_RXDMT0;
+}
  
-/* Check if receive descriptor minimum threshold hit */

-if (igb_rx_descr_threshold_hit(core, rxr.i)) {
-n |= E1000_ICS_RXDMT0;
-}
+core->mac[EICR] |= igb_rx_wb_eic(core, rxr.i->idx);
  
-core->mac[EICR] |= igb_rx_wb_eic(core, rxr.i->idx);

-}
+icr_bits |= E1000_ICR_RXDW;
+}
  
-trace_e1000e_rx_written_to_guest(n);

+if (icr_bits & E1000_ICR_RXDW) {
+trace_e1000e_rx_written_to_guest(icr_bits);
  } else {
-n = E1000_ICS_RXO;
-trace_e1000e_rx_not_written_to_guest(n);
+ 

[PATCH v3 3/9] igb: add ICR_RXDW

2023-01-31 Thread Sriram Yagnaraman
IGB uses RXDW ICR bit to indicate that rx descriptor has been written
back. This is the same as RXT0 bit in older HW.

Signed-off-by: Sriram Yagnaraman 
---
 hw/net/e1000x_regs.h |  4 
 hw/net/igb_core.c| 46 +---
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/hw/net/e1000x_regs.h b/hw/net/e1000x_regs.h
index fb5b861135..f509db73a7 100644
--- a/hw/net/e1000x_regs.h
+++ b/hw/net/e1000x_regs.h
@@ -335,6 +335,7 @@
 #define E1000_ICR_RXDMT00x0010 /* rx desc min. threshold (0) */
 #define E1000_ICR_RXO   0x0040 /* rx overrun */
 #define E1000_ICR_RXT0  0x0080 /* rx timer intr (ring 0) */
+#define E1000_ICR_RXDW  0x0080 /* rx desc written back */
 #define E1000_ICR_MDAC  0x0200 /* MDIO access complete */
 #define E1000_ICR_RXCFG 0x0400 /* RX /c/ ordered set */
 #define E1000_ICR_GPI_EN0   0x0800 /* GP Int 0 */
@@ -378,6 +379,7 @@
 #define E1000_ICS_RXDMT0E1000_ICR_RXDMT0/* rx desc min. threshold */
 #define E1000_ICS_RXO   E1000_ICR_RXO   /* rx overrun */
 #define E1000_ICS_RXT0  E1000_ICR_RXT0  /* rx timer intr */
+#define E1000_ICS_RXDW  E1000_ICR_RXDW  /* rx desc written back */
 #define E1000_ICS_MDAC  E1000_ICR_MDAC  /* MDIO access complete */
 #define E1000_ICS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
 #define E1000_ICS_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
@@ -407,6 +409,7 @@
 #define E1000_IMS_RXDMT0E1000_ICR_RXDMT0/* rx desc min. threshold */
 #define E1000_IMS_RXO   E1000_ICR_RXO   /* rx overrun */
 #define E1000_IMS_RXT0  E1000_ICR_RXT0  /* rx timer intr */
+#define E1000_IMS_RXDW  E1000_ICR_RXDW  /* rx desc written back */
 #define E1000_IMS_MDAC  E1000_ICR_MDAC  /* MDIO access complete */
 #define E1000_IMS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
 #define E1000_IMS_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
@@ -441,6 +444,7 @@
 #define E1000_IMC_RXDMT0E1000_ICR_RXDMT0/* rx desc min. threshold */
 #define E1000_IMC_RXO   E1000_ICR_RXO   /* rx overrun */
 #define E1000_IMC_RXT0  E1000_ICR_RXT0  /* rx timer intr */
+#define E1000_IMC_RXDW  E1000_ICR_RXDW  /* rx desc written back */
 #define E1000_IMC_MDAC  E1000_ICR_MDAC  /* MDIO access complete */
 #define E1000_IMC_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */
 #define E1000_IMC_GPI_EN0   E1000_ICR_GPI_EN0   /* GP Int 0 */
diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c
index 9c32ad5e36..e78bc3611a 100644
--- a/hw/net/igb_core.c
+++ b/hw/net/igb_core.c
@@ -1488,7 +1488,7 @@ igb_receive_internal(IGBCore *core, const struct iovec 
*iov, int iovcnt,
 static const int maximum_ethernet_hdr_len = (ETH_HLEN + 4);
 
 uint16_t queues = 0;
-uint32_t n;
+uint32_t icr_bits = 0;
 uint8_t min_buf[ETH_ZLEN];
 struct iovec min_iov;
 struct eth_header *ehdr;
@@ -1561,6 +1561,7 @@ igb_receive_internal(IGBCore *core, const struct iovec 
*iov, int iovcnt,
 e1000x_fcs_len(core->mac);
 
 retval = orig_size;
+igb_rx_fix_l4_csum(core, core->rx_pkt);
 
 for (i = 0; i < IGB_NUM_QUEUES; i++) {
 if (!(queues & BIT(i))) {
@@ -1569,43 +1570,32 @@ igb_receive_internal(IGBCore *core, const struct iovec 
*iov, int iovcnt,
 
 igb_rx_ring_init(core, , i);
 
-trace_e1000e_rx_rss_dispatched_to_queue(rxr.i->idx);
-
 if (!igb_has_rxbufs(core, rxr.i, total_size)) {
-retval = 0;
+icr_bits |= E1000_ICS_RXO;
+continue;
 }
-}
 
-if (retval) {
-n = E1000_ICR_RXT0;
-
-igb_rx_fix_l4_csum(core, core->rx_pkt);
-
-for (i = 0; i < IGB_NUM_QUEUES; i++) {
-if (!(queues & BIT(i))) {
-continue;
-}
-
-igb_rx_ring_init(core, , i);
+trace_e1000e_rx_rss_dispatched_to_queue(rxr.i->idx);
+igb_write_packet_to_guest(core, core->rx_pkt, , _info);
 
-igb_write_packet_to_guest(core, core->rx_pkt, , _info);
+/* Check if receive descriptor minimum threshold hit */
+if (igb_rx_descr_threshold_hit(core, rxr.i)) {
+icr_bits |= E1000_ICS_RXDMT0;
+}
 
-/* Check if receive descriptor minimum threshold hit */
-if (igb_rx_descr_threshold_hit(core, rxr.i)) {
-n |= E1000_ICS_RXDMT0;
-}
+core->mac[EICR] |= igb_rx_wb_eic(core, rxr.i->idx);
 
-core->mac[EICR] |= igb_rx_wb_eic(core, rxr.i->idx);
-}
+icr_bits |= E1000_ICR_RXDW;
+}
 
-trace_e1000e_rx_written_to_guest(n);
+if (icr_bits & E1000_ICR_RXDW) {
+trace_e1000e_rx_written_to_guest(icr_bits);
 } else {
-n = E1000_ICS_RXO;
-trace_e1000e_rx_not_written_to_guest(n);
+trace_e1000e_rx_not_written_to_guest(icr_bits);
 }
 
-trace_e1000e_rx_interrupt_set(n);
-