All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 42/45] hw/arm: Add npcm7xx emc model
Date: Thu, 11 Feb 2021 12:58:57 +0000	[thread overview]
Message-ID: <20210211125900.22777-43-peter.maydell@linaro.org> (raw)
In-Reply-To: <20210211125900.22777-1-peter.maydell@linaro.org>

From: Doug Evans <dje@google.com>

This is a 10/100 ethernet device that has several features.
Only the ones needed by the Linux driver have been implemented.
See npcm7xx_emc.c for a list of unimplemented features.

Reviewed-by: Hao Wu <wuhaotsh@google.com>
Reviewed-by: Avi Fishman <avi.fishman@nuvoton.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Doug Evans <dje@google.com>
Message-id: 20210209015541.778833-3-dje@google.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 docs/system/arm/nuvoton.rst |  3 ++-
 include/hw/arm/npcm7xx.h    |  2 ++
 hw/arm/npcm7xx.c            | 50 +++++++++++++++++++++++++++++++++++--
 3 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/docs/system/arm/nuvoton.rst b/docs/system/arm/nuvoton.rst
index a1786342e21..c6e9a4c17e4 100644
--- a/docs/system/arm/nuvoton.rst
+++ b/docs/system/arm/nuvoton.rst
@@ -43,6 +43,7 @@ Supported devices
  * GPIO controller
  * Analog to Digital Converter (ADC)
  * Pulse Width Modulation (PWM)
+ * Ethernet controller (EMC)
 
 Missing devices
 ---------------
@@ -56,7 +57,7 @@ Missing devices
    * Shared memory (SHM)
    * eSPI slave interface
 
- * Ethernet controllers (GMAC and EMC)
+ * Ethernet controller (GMAC)
  * USB device (USBD)
  * SMBus controller (SMBF)
  * Peripheral SPI controller (PSPI)
diff --git a/include/hw/arm/npcm7xx.h b/include/hw/arm/npcm7xx.h
index f6227aa8aa8..3bfc75aafed 100644
--- a/include/hw/arm/npcm7xx.h
+++ b/include/hw/arm/npcm7xx.h
@@ -25,6 +25,7 @@
 #include "hw/misc/npcm7xx_gcr.h"
 #include "hw/misc/npcm7xx_pwm.h"
 #include "hw/misc/npcm7xx_rng.h"
+#include "hw/net/npcm7xx_emc.h"
 #include "hw/nvram/npcm7xx_otp.h"
 #include "hw/timer/npcm7xx_timer.h"
 #include "hw/ssi/npcm7xx_fiu.h"
@@ -88,6 +89,7 @@ typedef struct NPCM7xxState {
     EHCISysBusState     ehci;
     OHCISysBusState     ohci;
     NPCM7xxFIUState     fiu[2];
+    NPCM7xxEMCState     emc[2];
 } NPCM7xxState;
 
 #define TYPE_NPCM7XX    "npcm7xx"
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
index d1fe9bd1df6..6186ac52772 100644
--- a/hw/arm/npcm7xx.c
+++ b/hw/arm/npcm7xx.c
@@ -82,6 +82,8 @@ enum NPCM7xxInterrupt {
     NPCM7XX_UART1_IRQ,
     NPCM7XX_UART2_IRQ,
     NPCM7XX_UART3_IRQ,
+    NPCM7XX_EMC1RX_IRQ          = 15,
+    NPCM7XX_EMC1TX_IRQ,
     NPCM7XX_TIMER0_IRQ          = 32,   /* Timer Module 0 */
     NPCM7XX_TIMER1_IRQ,
     NPCM7XX_TIMER2_IRQ,
@@ -104,6 +106,8 @@ enum NPCM7xxInterrupt {
     NPCM7XX_OHCI_IRQ            = 62,
     NPCM7XX_PWM0_IRQ            = 93,   /* PWM module 0 */
     NPCM7XX_PWM1_IRQ,                   /* PWM module 1 */
+    NPCM7XX_EMC2RX_IRQ          = 114,
+    NPCM7XX_EMC2TX_IRQ,
     NPCM7XX_GPIO0_IRQ           = 116,
     NPCM7XX_GPIO1_IRQ,
     NPCM7XX_GPIO2_IRQ,
@@ -152,6 +156,12 @@ static const hwaddr npcm7xx_pwm_addr[] = {
     0xf0104000,
 };
 
+/* Register base address for each EMC Module */
+static const hwaddr npcm7xx_emc_addr[] = {
+    0xf0825000,
+    0xf0826000,
+};
+
 static const struct {
     hwaddr regs_addr;
     uint32_t unconnected_pins;
@@ -365,6 +375,10 @@ static void npcm7xx_init(Object *obj)
     for (i = 0; i < ARRAY_SIZE(s->pwm); i++) {
         object_initialize_child(obj, "pwm[*]", &s->pwm[i], TYPE_NPCM7XX_PWM);
     }
+
+    for (i = 0; i < ARRAY_SIZE(s->emc); i++) {
+        object_initialize_child(obj, "emc[*]", &s->emc[i], TYPE_NPCM7XX_EMC);
+    }
 }
 
 static void npcm7xx_realize(DeviceState *dev, Error **errp)
@@ -537,6 +551,40 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
         sysbus_connect_irq(sbd, i, npcm7xx_irq(s, NPCM7XX_PWM0_IRQ + i));
     }
 
+    /*
+     * EMC Modules. Cannot fail.
+     * The mapping of the device to its netdev backend works as follows:
+     * emc[i] = nd_table[i]
+     * This works around the inability to specify the netdev property for the
+     * emc device: it's not pluggable and thus the -device option can't be
+     * used.
+     */
+    QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_emc_addr) != ARRAY_SIZE(s->emc));
+    QEMU_BUILD_BUG_ON(ARRAY_SIZE(s->emc) != 2);
+    for (i = 0; i < ARRAY_SIZE(s->emc); i++) {
+        s->emc[i].emc_num = i;
+        SysBusDevice *sbd = SYS_BUS_DEVICE(&s->emc[i]);
+        if (nd_table[i].used) {
+            qemu_check_nic_model(&nd_table[i], TYPE_NPCM7XX_EMC);
+            qdev_set_nic_properties(DEVICE(sbd), &nd_table[i]);
+        }
+        /*
+         * The device exists regardless of whether it's connected to a QEMU
+         * netdev backend. So always instantiate it even if there is no
+         * backend.
+         */
+        sysbus_realize(sbd, &error_abort);
+        sysbus_mmio_map(sbd, 0, npcm7xx_emc_addr[i]);
+        int tx_irq = i == 0 ? NPCM7XX_EMC1TX_IRQ : NPCM7XX_EMC2TX_IRQ;
+        int rx_irq = i == 0 ? NPCM7XX_EMC1RX_IRQ : NPCM7XX_EMC2RX_IRQ;
+        /*
+         * N.B. The values for the second argument sysbus_connect_irq are
+         * chosen to match the registration order in npcm7xx_emc_realize.
+         */
+        sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, tx_irq));
+        sysbus_connect_irq(sbd, 1, npcm7xx_irq(s, rx_irq));
+    }
+
     /*
      * Flash Interface Unit (FIU). Can fail if incorrect number of chip selects
      * specified, but this is a programming error.
@@ -613,8 +661,6 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
     create_unimplemented_device("npcm7xx.vcd",          0xf0810000,  64 * KiB);
     create_unimplemented_device("npcm7xx.ece",          0xf0820000,   8 * KiB);
     create_unimplemented_device("npcm7xx.vdma",         0xf0822000,   8 * KiB);
-    create_unimplemented_device("npcm7xx.emc1",         0xf0825000,   4 * KiB);
-    create_unimplemented_device("npcm7xx.emc2",         0xf0826000,   4 * KiB);
     create_unimplemented_device("npcm7xx.usbd[0]",      0xf0830000,   4 * KiB);
     create_unimplemented_device("npcm7xx.usbd[1]",      0xf0831000,   4 * KiB);
     create_unimplemented_device("npcm7xx.usbd[2]",      0xf0832000,   4 * KiB);
-- 
2.20.1



  parent reply	other threads:[~2021-02-11 13:40 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-11 12:58 [PULL 00/45] target-arm queue Peter Maydell
2021-02-11 12:58 ` [PULL 01/45] target/arm: Don't migrate CPUARMState.features Peter Maydell
2021-02-11 12:58 ` [PULL 02/45] target/arm: Fix SCR RES1 handling Peter Maydell
2021-02-11 12:58 ` [PULL 03/45] hw/arm: Remove GPIO from unimplemented NPCM7XX Peter Maydell
2021-02-11 12:58 ` [PULL 04/45] target/arm: Add support for FEAT_DIT, Data Independent Timing Peter Maydell
2021-02-11 12:58 ` [PULL 05/45] target/arm: Support AA32 DIT by moving PSTATE_SS from cpsr into env->pstate Peter Maydell
2021-02-11 12:58 ` [PULL 06/45] target/arm: Set ID_AA64PFR0.DIT and ID_PFR0.DIT to 1 for "max" AA64 CPU Peter Maydell
2021-02-11 12:58 ` [PULL 07/45] target/arm: Set ID_PFR0.DIT to 1 for "max" 32-bit CPU Peter Maydell
2021-02-11 12:58 ` [PULL 08/45] arm: Update infocenter.arm.com URLs Peter Maydell
2021-02-11 12:58 ` [PULL 09/45] accel/tcg: Add URL of clang bug to comment about our workaround Peter Maydell
2021-02-11 12:58 ` [PULL 10/45] tcg: Introduce target-specific page data for user-only Peter Maydell
2021-02-11 12:58 ` [PULL 11/45] linux-user: Introduce PAGE_ANON Peter Maydell
2021-02-11 12:58 ` [PULL 12/45] exec: Use uintptr_t for guest_base Peter Maydell
2021-02-11 12:58 ` [PULL 13/45] exec: Use uintptr_t in cpu_ldst.h Peter Maydell
2021-02-11 13:51   ` Philippe Mathieu-Daudé
2021-02-11 12:58 ` [PULL 14/45] exec: Improve types for guest_addr_valid Peter Maydell
2021-02-11 12:58 ` [PULL 15/45] linux-user: Check for overflow in access_ok Peter Maydell
2021-02-11 12:58 ` [PULL 16/45] linux-user: Tidy VERIFY_READ/VERIFY_WRITE Peter Maydell
2021-02-11 12:58 ` [PULL 17/45] bsd-user: " Peter Maydell
2021-02-11 12:58 ` [PULL 18/45] linux-user: Do not use guest_addr_valid for h2g_valid Peter Maydell
2021-02-11 12:58 ` [PULL 19/45] linux-user: Fix guest_addr_valid vs reserved_va Peter Maydell
2021-02-11 12:58 ` [PULL 20/45] exec: Introduce cpu_untagged_addr Peter Maydell
2021-02-11 12:58 ` [PULL 21/45] exec: Use cpu_untagged_addr in g2h; split out g2h_untagged Peter Maydell
2021-02-11 12:58 ` [PULL 22/45] linux-user: Explicitly untag memory management syscalls Peter Maydell
2021-02-11 12:58 ` [PULL 23/45] linux-user: Use guest_range_valid in access_ok Peter Maydell
2021-02-11 12:58 ` [PULL 24/45] exec: Rename guest_{addr,range}_valid to *_untagged Peter Maydell
2021-02-11 12:58 ` [PULL 25/45] linux-user: Use cpu_untagged_addr in access_ok; split out *_untagged Peter Maydell
2021-02-11 12:58 ` [PULL 26/45] linux-user: Move lock_user et al out of line Peter Maydell
2021-02-11 12:58 ` [PULL 27/45] linux-user: Fix types in uaccess.c Peter Maydell
2021-02-11 12:58 ` [PULL 28/45] linux-user: Handle tags in lock_user/unlock_user Peter Maydell
2021-02-11 12:58 ` [PULL 29/45] linux-user/aarch64: Implement PR_TAGGED_ADDR_ENABLE Peter Maydell
2021-02-11 12:58 ` [PULL 30/45] target/arm: Improve gen_top_byte_ignore Peter Maydell
2021-02-11 12:58 ` [PULL 31/45] target/arm: Use the proper TBI settings for linux-user Peter Maydell
2021-02-11 12:58 ` [PULL 32/45] linux-user/aarch64: Implement PR_MTE_TCF and PR_MTE_TAG Peter Maydell
2021-02-11 12:58 ` [PULL 33/45] linux-user/aarch64: Implement PROT_MTE Peter Maydell
2021-02-11 12:58 ` [PULL 34/45] target/arm: Split out syndrome.h from internals.h Peter Maydell
2021-02-11 12:58 ` [PULL 35/45] linux-user/aarch64: Pass syndrome to EXC_*_ABORT Peter Maydell
2021-02-11 12:58 ` [PULL 36/45] linux-user/aarch64: Signal SEGV_MTESERR for sync tag check fault Peter Maydell
2021-02-11 12:58 ` [PULL 37/45] linux-user/aarch64: Signal SEGV_MTEAERR for async tag check error Peter Maydell
2021-02-11 12:58 ` [PULL 38/45] target/arm: Add allocation tag storage for user mode Peter Maydell
2021-02-11 12:58 ` [PULL 39/45] target/arm: Enable MTE for user-only Peter Maydell
2021-02-11 12:58 ` [PULL 40/45] tests/tcg/aarch64: Add mte smoke tests Peter Maydell
2021-02-11 12:58 ` [PULL 41/45] hw/net: Add npcm7xx emc model Peter Maydell
2021-02-11 12:58 ` Peter Maydell [this message]
2021-02-11 12:58 ` [PULL 43/45] tests/qtests: Add npcm7xx emc model test Peter Maydell
2021-02-11 12:58 ` [PULL 44/45] hw/arm: versal: Use nr_apu_cpus in favor of hard coding 2 Peter Maydell
2021-02-11 12:59 ` [PULL 45/45] target/arm: Correctly initialize MDCR_EL2.HPMN Peter Maydell
2021-02-11 13:58 ` [PULL 00/45] target-arm queue no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210211125900.22777-43-peter.maydell@linaro.org \
    --to=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.