All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/10] Cadence GEM Fixes
@ 2020-05-02 17:53 Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 01/10] net: cadence_gem: Fix debug statements Sai Pavan Boddu
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Hi,

Following patch series fixes issues with priority queues,
Adds JUMBO Frame support,
Makes Debug statements compilable &
Fixes related to multicast frames.

Sai Pavan Boddu (9):
  net: cadence_gem: Fix debug statements
  net: cadence_gem: Fix the queue address update during wrap around
  net: cadence_gem: Fix irq update w.r.t queue
  net: cadence_gem: Define access permission for interrupt registers
  net: cadence_gem: Set ISR according to queue in use
  net: cadence_gem: Add support for jumbo frames
  net: cadnece_gem: Update irq_read_clear field of designcfg_debug1 reg
  net: cadence_gem: Update the reset value for interrupt mask register
  net: cadence_gem: TX_LAST bit should be set by guest

Tong Ho (1):
  net: cadence_gem: Fix RX address filtering

 hw/net/cadence_gem.c | 164 +++++++++++++++++++++++++++++----------------------
 1 file changed, 92 insertions(+), 72 deletions(-)

-- 
2.7.4



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 01/10] net: cadence_gem: Fix debug statements
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 02/10] net: cadence_gem: Fix the queue address update during wrap around Sai Pavan Boddu
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Enabling debug breaks the build, Fix them and make debug statements
always compilable.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 22a0b1b..92fcbe5 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -35,14 +35,13 @@
 #include "sysemu/dma.h"
 #include "net/checksum.h"
 
-#ifdef CADENCE_GEM_ERR_DEBUG
-#define DB_PRINT(...) do { \
-    fprintf(stderr,  ": %s: ", __func__); \
-    fprintf(stderr, ## __VA_ARGS__); \
-    } while (0)
-#else
-    #define DB_PRINT(...)
-#endif
+#define CADENCE_GEM_ERR_DEBUG 0
+#define DB_PRINT(...) do {\
+    if (CADENCE_GEM_ERR_DEBUG) {   \
+        qemu_log(": %s: ", __func__); \
+        qemu_log(__VA_ARGS__); \
+    } \
+} while (0)
 
 #define GEM_NWCTRL        (0x00000000/4) /* Network Control reg */
 #define GEM_NWCFG         (0x00000004/4) /* Network Config reg */
@@ -992,9 +991,9 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
             return -1;
         }
 
-        DB_PRINT("copy %u bytes to 0x%" PRIx64 "\n",
-                 MIN(bytes_to_copy, rxbufsize),
-                 rx_desc_get_buffer(s, s->rx_desc[q]));
+        DB_PRINT("copy %" PRIu32 " bytes to 0x%" PRIx64 "\n",
+                MIN(bytes_to_copy, rxbufsize),
+                rx_desc_get_buffer(s, s->rx_desc[q] + rxbuf_offset));
 
         /* Copy packet data to emulated DMA buffer */
         address_space_write(&s->dma_as, rx_desc_get_buffer(s, s->rx_desc[q]) +
@@ -1160,8 +1159,8 @@ static void gem_transmit(CadenceGEMState *s)
              */
             if ((tx_desc_get_buffer(s, desc) == 0) ||
                 (tx_desc_get_length(desc) == 0)) {
-                DB_PRINT("Invalid TX descriptor @ 0x%x\n",
-                         (unsigned)packet_desc_addr);
+                DB_PRINT("Invalid TX descriptor @ 0x%" HWADDR_PRIx "\n",
+                         packet_desc_addr);
                 break;
             }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 02/10] net: cadence_gem: Fix the queue address update during wrap around
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 01/10] net: cadence_gem: Fix debug statements Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 03/10] net: cadence_gem: Fix irq update w.r.t queue Sai Pavan Boddu
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

During wrap around and reset, queues are pointing to initial base
address of queue 0, irrespective of what queue we are dealing with.
Fix it by assigning proper base address every time.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 92fcbe5..074aaa8 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -845,6 +845,25 @@ static int get_queue_from_screen(CadenceGEMState *s, uint8_t *rxbuf_ptr,
     return 0;
 }
 
+static uint32_t gem_get_queue_base_addr(CadenceGEMState *s, bool tx, int q)
+{
+    uint32_t base_addr = 0;
+
+    switch (q) {
+    case 0:
+        base_addr = s->regs[tx ? GEM_TXQBASE : GEM_RXQBASE];
+        break;
+    case 1 ... (MAX_PRIORITY_QUEUES - 1):
+        base_addr = s->regs[(tx ? GEM_TRANSMIT_Q1_PTR :
+                                 GEM_RECEIVE_Q1_PTR) + q - 1];
+        break;
+    default:
+        g_assert_not_reached();
+    };
+
+    return base_addr;
+}
+
 static hwaddr gem_get_desc_addr(CadenceGEMState *s, bool tx, int q)
 {
     hwaddr desc_addr = 0;
@@ -1043,7 +1062,7 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
         /* Next descriptor */
         if (rx_desc_get_wrap(s->rx_desc[q])) {
             DB_PRINT("wrapping RX descriptor list\n");
-            s->rx_desc_addr[q] = s->regs[GEM_RXQBASE];
+            s->rx_desc_addr[q] = gem_get_queue_base_addr(s, false, q);
         } else {
             DB_PRINT("incrementing RX descriptor list\n");
             s->rx_desc_addr[q] += 4 * gem_get_desc_len(s, true);
@@ -1199,7 +1218,8 @@ static void gem_transmit(CadenceGEMState *s)
                                     sizeof(desc_first));
                 /* Advance the hardware current descriptor past this packet */
                 if (tx_desc_get_wrap(desc)) {
-                    s->tx_desc_addr[q] = s->regs[GEM_TXQBASE];
+                    s->tx_desc_addr[q] = gem_get_queue_base_addr(s,
+                                         true, q);
                 } else {
                     s->tx_desc_addr[q] = packet_desc_addr +
                                          4 * gem_get_desc_len(s, false);
@@ -1251,7 +1271,8 @@ static void gem_transmit(CadenceGEMState *s)
                 } else {
                     packet_desc_addr = 0;
                 }
-                packet_desc_addr |= s->regs[GEM_TXQBASE];
+                packet_desc_addr |= gem_get_queue_base_addr(s,
+                                    true, q);
             } else {
                 packet_desc_addr += 4 * gem_get_desc_len(s, false);
             }
@@ -1457,7 +1478,7 @@ static void gem_write(void *opaque, hwaddr offset, uint64_t val,
         if (!(val & GEM_NWCTRL_TXENA)) {
             /* Reset to start of Q when transmit disabled. */
             for (i = 0; i < s->num_priority_queues; i++) {
-                s->tx_desc_addr[i] = s->regs[GEM_TXQBASE];
+                s->tx_desc_addr[i] = gem_get_queue_base_addr(s, true, i);
             }
         }
         if (gem_can_receive(qemu_get_queue(s->nic))) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 03/10] net: cadence_gem: Fix irq update w.r.t queue
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 01/10] net: cadence_gem: Fix debug statements Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 02/10] net: cadence_gem: Fix the queue address update during wrap around Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 04/10] net: cadence_gem: Define access permission for interrupt registers Sai Pavan Boddu
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Set irq's specific to a queue, present implementation is setting q1 irq
based on q0 status.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 25 +++----------------------
 1 file changed, 3 insertions(+), 22 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 074aaa8..7782d6d 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -554,29 +554,10 @@ static void gem_update_int_status(CadenceGEMState *s)
 {
     int i;
 
-    if (!s->regs[GEM_ISR]) {
-        /* ISR isn't set, clear all the interrupts */
-        for (i = 0; i < s->num_priority_queues; ++i) {
-            qemu_set_irq(s->irq[i], 0);
-        }
-        return;
-    }
+    qemu_set_irq(s->irq[0], !!s->regs[GEM_ISR]);
 
-    /* If we get here we know s->regs[GEM_ISR] is set, so we don't need to
-     * check it again.
-     */
-    if (s->num_priority_queues == 1) {
-        /* No priority queues, just trigger the interrupt */
-        DB_PRINT("asserting int.\n");
-        qemu_set_irq(s->irq[0], 1);
-        return;
-    }
-
-    for (i = 0; i < s->num_priority_queues; ++i) {
-        if (s->regs[GEM_INT_Q1_STATUS + i]) {
-            DB_PRINT("asserting int. (q=%d)\n", i);
-            qemu_set_irq(s->irq[i], 1);
-        }
+    for (i = 1; i < s->num_priority_queues; ++i) {
+        qemu_set_irq(s->irq[i], !!s->regs[GEM_INT_Q1_STATUS + i - 1]);
     }
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 04/10] net: cadence_gem: Define access permission for interrupt registers
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (2 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 03/10] net: cadence_gem: Fix irq update w.r.t queue Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 05/10] net: cadence_gem: Set ISR according to queue in use Sai Pavan Boddu
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Q1 to Q7 ISR's are clear-on-read, IER/IDR registers
are write-only, mask reg are read-only.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 7782d6d..e745d60 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -458,6 +458,7 @@ static const uint8_t broadcast_addr[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
  */
 static void gem_init_register_masks(CadenceGEMState *s)
 {
+    unsigned int i;
     /* Mask of register bits which are read only */
     memset(&s->regs_ro[0], 0, sizeof(s->regs_ro));
     s->regs_ro[GEM_NWCTRL]   = 0xFFF80000;
@@ -470,10 +471,19 @@ static void gem_init_register_masks(CadenceGEMState *s)
     s->regs_ro[GEM_ISR]      = 0xFFFFFFFF;
     s->regs_ro[GEM_IMR]      = 0xFFFFFFFF;
     s->regs_ro[GEM_MODID]    = 0xFFFFFFFF;
+    for (i = 0; i < s->num_priority_queues; i++) {
+        s->regs_ro[GEM_INT_Q1_STATUS + i] = 0xFFFFFFFF;
+        s->regs_ro[GEM_INT_Q1_ENABLE + i] = 0xFFFFE319;
+        s->regs_ro[GEM_INT_Q1_DISABLE + i] = 0xFFFFE319;
+        s->regs_ro[GEM_INT_Q1_MASK + i] = 0xFFFFFFFF;
+    }
 
     /* Mask of register bits which are clear on read */
     memset(&s->regs_rtc[0], 0, sizeof(s->regs_rtc));
     s->regs_rtc[GEM_ISR]      = 0xFFFFFFFF;
+    for (i = 0; i < s->num_priority_queues; i++) {
+        s->regs_rtc[GEM_INT_Q1_STATUS + i] = 0x00000CE6;
+    }
 
     /* Mask of register bits which are write 1 to clear */
     memset(&s->regs_w1c[0], 0, sizeof(s->regs_w1c));
@@ -485,6 +495,10 @@ static void gem_init_register_masks(CadenceGEMState *s)
     s->regs_wo[GEM_NWCTRL]   = 0x00073E60;
     s->regs_wo[GEM_IER]      = 0x07FFFFFF;
     s->regs_wo[GEM_IDR]      = 0x07FFFFFF;
+    for (i = 0; i < s->num_priority_queues; i++) {
+        s->regs_wo[GEM_INT_Q1_ENABLE + i] = 0x00000CE6;
+        s->regs_wo[GEM_INT_Q1_DISABLE + i] = 0x00000CE6;
+    }
 }
 
 /*
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 05/10] net: cadence_gem: Set ISR according to queue in use
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (3 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 04/10] net: cadence_gem: Define access permission for interrupt registers Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 06/10] net: cadence_gem: Add support for jumbo frames Sai Pavan Boddu
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Set ISR according to queue in use, added interrupt support for
all queues.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 31 ++++++++++++++++++++++---------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index e745d60..cc9e735 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -896,7 +896,13 @@ static void gem_get_rx_desc(CadenceGEMState *s, int q)
     if (rx_desc_get_ownership(s->rx_desc[q]) == 1) {
         DB_PRINT("descriptor 0x%" HWADDR_PRIx " owned by sw.\n", desc_addr);
         s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
-        s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
+        if (q == 0) {
+            s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
+        } else {
+            s->regs[GEM_INT_Q1_STATUS + q - 1] |= GEM_INT_RXUSED &
+                                          ~(s->regs[GEM_INT_Q1_MASK + q - 1]);
+        }
+
         /* Handle interrupt consequences */
         gem_update_int_status(s);
     }
@@ -1070,8 +1076,12 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
     gem_receive_updatestats(s, buf, size);
 
     s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_FRMRCVD;
-    s->regs[GEM_ISR] |= GEM_INT_RXCMPL & ~(s->regs[GEM_IMR]);
-
+    if (q == 0) {
+        s->regs[GEM_ISR] |= GEM_INT_RXCMPL & ~(s->regs[GEM_IMR]);
+    } else {
+        s->regs[GEM_INT_Q1_STATUS + q - 1] |= GEM_INT_RXCMPL &
+                                      ~(s->regs[GEM_INT_Q1_MASK + q - 1]);
+    }
     /* Handle interrupt consequences */
     gem_update_int_status(s);
 
@@ -1222,12 +1232,12 @@ static void gem_transmit(CadenceGEMState *s)
                 DB_PRINT("TX descriptor next: 0x%08x\n", s->tx_desc_addr[q]);
 
                 s->regs[GEM_TXSTATUS] |= GEM_TXSTATUS_TXCMPL;
-                s->regs[GEM_ISR] |= GEM_INT_TXCMPL & ~(s->regs[GEM_IMR]);
-
+                if (q == 0) {
+                    s->regs[GEM_ISR] |= GEM_INT_TXCMPL & ~(s->regs[GEM_IMR]);
+                } else {
                 /* Update queue interrupt status */
-                if (s->num_priority_queues > 1) {
-                    s->regs[GEM_INT_Q1_STATUS + q] |=
-                            GEM_INT_TXCMPL & ~(s->regs[GEM_INT_Q1_MASK + q]);
+                    s->regs[GEM_INT_Q1_STATUS + q - 1] |=
+                            GEM_INT_TXCMPL & ~s->regs[GEM_INT_Q1_MASK + q - 1];
                 }
 
                 /* Handle interrupt consequences */
@@ -1279,7 +1289,10 @@ static void gem_transmit(CadenceGEMState *s)
 
         if (tx_desc_get_used(desc)) {
             s->regs[GEM_TXSTATUS] |= GEM_TXSTATUS_USED;
-            s->regs[GEM_ISR] |= GEM_INT_TXUSED & ~(s->regs[GEM_IMR]);
+            /* IRQ TXUSED is defined only for queue 0 */
+            if (q == 0) {
+                s->regs[GEM_ISR] |= GEM_INT_TXUSED & ~(s->regs[GEM_IMR]);
+            }
             gem_update_int_status(s);
         }
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 06/10] net: cadence_gem: Add support for jumbo frames
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (4 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 05/10] net: cadence_gem: Set ISR according to queue in use Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 07/10] net: cadnece_gem: Update irq_read_clear field of designcfg_debug1 reg Sai Pavan Boddu
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Jumbo frames of size 10240 bytes is added.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index cc9e735..75fdb00 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -313,6 +313,7 @@
 #define DESC_1_RX_EOF 0x00008000
 
 #define GEM_MODID_VALUE 0x00020118
+#define MAX_TX_FRAME_SIZE 10240
 
 static inline uint64_t tx_desc_get_buffer(CadenceGEMState *s, uint32_t *desc)
 {
@@ -1142,7 +1143,7 @@ static void gem_transmit(CadenceGEMState *s)
 {
     uint32_t desc[DESC_MAX_NUM_WORDS];
     hwaddr packet_desc_addr;
-    uint8_t     tx_packet[2048];
+    uint8_t     tx_packet[MAX_TX_FRAME_SIZE];
     uint8_t     *p;
     unsigned    total_bytes;
     int q = 0;
@@ -1343,7 +1344,7 @@ static void gem_reset(DeviceState *d)
     s->regs[GEM_RXPARTIALSF] = 0x000003ff;
     s->regs[GEM_MODID] = s->revision;
     s->regs[GEM_DESCONF] = 0x02500111;
-    s->regs[GEM_DESCONF2] = 0x2ab13fff;
+    s->regs[GEM_DESCONF2] = 0x2ab12800;
     s->regs[GEM_DESCONF5] = 0x002f2045;
     s->regs[GEM_DESCONF6] = GEM_DESCONF6_64B_MASK;
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 07/10] net: cadnece_gem: Update irq_read_clear field of designcfg_debug1 reg
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (5 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 06/10] net: cadence_gem: Add support for jumbo frames Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 08/10] net: cadence_gem: Update the reset value for interrupt mask register Sai Pavan Boddu
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Advertise support of clear-on-read for ISR registers.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 75fdb00..e6a3d6c 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -1343,7 +1343,7 @@ static void gem_reset(DeviceState *d)
     s->regs[GEM_TXPARTIALSF] = 0x000003ff;
     s->regs[GEM_RXPARTIALSF] = 0x000003ff;
     s->regs[GEM_MODID] = s->revision;
-    s->regs[GEM_DESCONF] = 0x02500111;
+    s->regs[GEM_DESCONF] = 0x02D00111;
     s->regs[GEM_DESCONF2] = 0x2ab12800;
     s->regs[GEM_DESCONF5] = 0x002f2045;
     s->regs[GEM_DESCONF6] = GEM_DESCONF6_64B_MASK;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 08/10] net: cadence_gem: Update the reset value for interrupt mask register
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (6 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 07/10] net: cadnece_gem: Update irq_read_clear field of designcfg_debug1 reg Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 09/10] net: cadence_gem: TX_LAST bit should be set by guest Sai Pavan Boddu
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

Mask all interrupt on reset.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index e6a3d6c..68df92d 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -1347,6 +1347,7 @@ static void gem_reset(DeviceState *d)
     s->regs[GEM_DESCONF2] = 0x2ab12800;
     s->regs[GEM_DESCONF5] = 0x002f2045;
     s->regs[GEM_DESCONF6] = GEM_DESCONF6_64B_MASK;
+    s->regs[GEM_INT_Q1_MASK] = 0x00000CE6;
 
     if (s->num_priority_queues > 1) {
         queues_mask = MAKE_64BIT_MASK(1, s->num_priority_queues - 1);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 09/10] net: cadence_gem: TX_LAST bit should be set by guest
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (7 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 08/10] net: cadence_gem: Update the reset value for interrupt mask register Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 17:53 ` [PATCH 10/10] net: cadence_gem: Fix RX address filtering Sai Pavan Boddu
  2020-05-02 19:08 ` [PATCH 00/10] Cadence GEM Fixes no-reply
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

TX_LAST bit should not be set by hardware, its set by guest to inform
the last bd of the frame.

Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 hw/net/cadence_gem.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 68df92d..06128c2 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -345,11 +345,6 @@ static inline unsigned tx_desc_get_last(uint32_t *desc)
     return (desc[1] & DESC_1_TX_LAST) ? 1 : 0;
 }
 
-static inline void tx_desc_set_last(uint32_t *desc)
-{
-    desc[1] |= DESC_1_TX_LAST;
-}
-
 static inline unsigned tx_desc_get_length(uint32_t *desc)
 {
     return desc[1] & DESC_1_LENGTH;
@@ -1269,7 +1264,6 @@ static void gem_transmit(CadenceGEMState *s)
 
             /* read next descriptor */
             if (tx_desc_get_wrap(desc)) {
-                tx_desc_set_last(desc);
 
                 if (s->regs[GEM_DMACFG] & GEM_DMACFG_ADDR_64B) {
                     packet_desc_addr = s->regs[GEM_TBQPH];
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 10/10] net: cadence_gem: Fix RX address filtering
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (8 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 09/10] net: cadence_gem: TX_LAST bit should be set by guest Sai Pavan Boddu
@ 2020-05-02 17:53 ` Sai Pavan Boddu
  2020-05-02 19:08 ` [PATCH 00/10] Cadence GEM Fixes no-reply
  10 siblings, 0 replies; 12+ messages in thread
From: Sai Pavan Boddu @ 2020-05-02 17:53 UTC (permalink / raw)
  To: Edgar E. Iglesias, Alistair Francis, Peter Maydell, Jason Wang,
	Markus Armbruster, Philippe Mathieu-Daudé,
	Tong Ho, Ramon Fried
  Cc: qemu-arm, qemu-devel

From: Tong Ho <tong.ho@xilinx.com>

Two defects are fixed:

1/ Detection of multicast frames
2/ Treating drop of mis-addressed frames as non-error

Signed-off-by: Tong Ho <tong.ho@xilinx.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
---
 hw/net/cadence_gem.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 06128c2..10a7cb2 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -34,6 +34,7 @@
 #include "qemu/module.h"
 #include "sysemu/dma.h"
 #include "net/checksum.h"
+#include "net/eth.h"
 
 #define CADENCE_GEM_ERR_DEBUG 0
 #define DB_PRINT(...) do {\
@@ -669,7 +670,7 @@ static unsigned calc_mac_hash(const uint8_t *mac)
 static int gem_mac_address_filter(CadenceGEMState *s, const uint8_t *packet)
 {
     uint8_t *gem_spaddr;
-    int i;
+    int i, is_mc;
 
     /* Promiscuous mode? */
     if (s->regs[GEM_NWCFG] & GEM_NWCFG_PROMISC) {
@@ -685,22 +686,17 @@ static int gem_mac_address_filter(CadenceGEMState *s, const uint8_t *packet)
     }
 
     /* Accept packets -w- hash match? */
-    if ((packet[0] == 0x01 && (s->regs[GEM_NWCFG] & GEM_NWCFG_MCAST_HASH)) ||
-        (packet[0] != 0x01 && (s->regs[GEM_NWCFG] & GEM_NWCFG_UCAST_HASH))) {
+    is_mc = is_multicast_ether_addr(packet);
+    if ((is_mc && (s->regs[GEM_NWCFG] & GEM_NWCFG_MCAST_HASH)) ||
+        (!is_mc && (s->regs[GEM_NWCFG] & GEM_NWCFG_UCAST_HASH))) {
+        uint64_t buckets;
         unsigned hash_index;
 
         hash_index = calc_mac_hash(packet);
-        if (hash_index < 32) {
-            if (s->regs[GEM_HASHLO] & (1<<hash_index)) {
-                return packet[0] == 0x01 ? GEM_RX_MULTICAST_HASH_ACCEPT :
-                                           GEM_RX_UNICAST_HASH_ACCEPT;
-            }
-        } else {
-            hash_index -= 32;
-            if (s->regs[GEM_HASHHI] & (1<<hash_index)) {
-                return packet[0] == 0x01 ? GEM_RX_MULTICAST_HASH_ACCEPT :
-                                           GEM_RX_UNICAST_HASH_ACCEPT;
-            }
+        buckets = ((uint64_t)s->regs[GEM_HASHHI] << 32) | s->regs[GEM_HASHLO];
+        if ((buckets >> hash_index) & 1) {
+            return is_mc ? GEM_RX_MULTICAST_HASH_ACCEPT
+                         : GEM_RX_UNICAST_HASH_ACCEPT;
         }
     }
 
@@ -924,7 +920,7 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
     /* Is this destination MAC address "for us" ? */
     maf = gem_mac_address_filter(s, buf);
     if (maf == GEM_RX_REJECT) {
-        return -1;
+        return size;  /* no, drop siliently b/c it's not an error */
     }
 
     /* Discard packets with receive length error enabled ? */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 00/10] Cadence GEM Fixes
  2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
                   ` (9 preceding siblings ...)
  2020-05-02 17:53 ` [PATCH 10/10] net: cadence_gem: Fix RX address filtering Sai Pavan Boddu
@ 2020-05-02 19:08 ` no-reply
  10 siblings, 0 replies; 12+ messages in thread
From: no-reply @ 2020-05-02 19:08 UTC (permalink / raw)
  To: sai.pavan.boddu
  Cc: peter.maydell, jasowang, armbru, qemu-devel, qemu-arm,
	Alistair.Francis, edgar.iglesias, tong.ho, philmd, rfried.dev

Patchew URL: https://patchew.org/QEMU/1588441994-21447-1-git-send-email-sai.pavan.boddu@xilinx.com/



Hi,

This series failed the docker-mingw@fedora build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

=== TEST SCRIPT BEGIN ===
#! /bin/bash
export ARCH=x86_64
make docker-image-fedora V=1 NETWORK=1
time make docker-test-mingw@fedora J=14 NETWORK=1
=== TEST SCRIPT END ===

  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
/tmp/qemu-test/src/hw/net/cadence_gem.c: In function 'gem_receive':
/tmp/qemu-test/src/hw/net/cadence_gem.c:993:14: error: format '%ld' expects argument of type 'long int', but argument 3 has type 'size_t' {aka 'long long unsigned int'} [-Werror=format=]
     DB_PRINT("config bufsize: %d packet size: %ld\n", rxbufsize, size);
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~             ~~~~
/tmp/qemu-test/src/hw/net/cadence_gem.c:43:18: note: in definition of macro 'DB_PRINT'
         qemu_log(__VA_ARGS__); \
                  ^~~~~~~~~~~
cc1: all warnings being treated as errors
make: *** [/tmp/qemu-test/src/rules.mak:69: hw/net/cadence_gem.o] Error 1
make: *** Waiting for unfinished jobs....
Traceback (most recent call last):
  File "./tests/docker/docker.py", line 664, in <module>
---
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=6948e658f0b04675a3e601cf0311d3ce', '-u', '1001', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-92g5hr_7/src/docker-src.2020-05-02-15.05.32.21125:/var/tmp/qemu:z,ro', 'qemu:fedora', '/var/tmp/qemu/run', 'test-mingw']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=6948e658f0b04675a3e601cf0311d3ce
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-92g5hr_7/src'
make: *** [docker-run-test-mingw@fedora] Error 2

real    2m50.819s
user    0m8.687s


The full log is available at
http://patchew.org/logs/1588441994-21447-1-git-send-email-sai.pavan.boddu@xilinx.com/testing.docker-mingw@fedora/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2020-05-02 19:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-02 17:53 [PATCH 00/10] Cadence GEM Fixes Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 01/10] net: cadence_gem: Fix debug statements Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 02/10] net: cadence_gem: Fix the queue address update during wrap around Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 03/10] net: cadence_gem: Fix irq update w.r.t queue Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 04/10] net: cadence_gem: Define access permission for interrupt registers Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 05/10] net: cadence_gem: Set ISR according to queue in use Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 06/10] net: cadence_gem: Add support for jumbo frames Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 07/10] net: cadnece_gem: Update irq_read_clear field of designcfg_debug1 reg Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 08/10] net: cadence_gem: Update the reset value for interrupt mask register Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 09/10] net: cadence_gem: TX_LAST bit should be set by guest Sai Pavan Boddu
2020-05-02 17:53 ` [PATCH 10/10] net: cadence_gem: Fix RX address filtering Sai Pavan Boddu
2020-05-02 19:08 ` [PATCH 00/10] Cadence GEM Fixes no-reply

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.