[PATCH 2/5] hw/riscv: instantiate K230 I2C controllers

Wang Zhongyu <[email protected]>
Newsgroups gmane.comp.emulators.qemu
Message-ID <[email protected]>
Instantiate the five K230 I2C controllers, map their MMIO regions,
and connect IRQs 21 through 25 to the PLIC.

Select the K230 I2C model in the machine configuration and update
the K230 machine documentation.

Signed-off-by: Wang Zhongyu <[email protected]>
---
 docs/system/riscv/k230.rst |  1 +
 hw/riscv/Kconfig           |  1 +
 hw/riscv/k230.c            | 36 +++++++++++++++++++++---------------
 include/hw/riscv/k230.h    |  8 ++++++++
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/docs/system/riscv/k230.rst b/docs/system/riscv/k230.rst
index cea8202e55..7a011903ab 100644
--- a/docs/system/riscv/k230.rst
+++ b/docs/system/riscv/k230.rst
@@ -19,6 +19,7 @@ The ``k230`` machine supports the following devices:
 * Core Local Interruptor (CLINT)
 * Platform-Level Interrupt Controller (PLIC)
 * 2 K230 Watchdog Timer
+* 5 K230 I2C controllers
 * 5 UART
 
 Boot options
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
index de37c08cae..d2bd41173d 100644
--- a/hw/riscv/Kconfig
+++ b/hw/riscv/Kconfig
@@ -162,3 +162,4 @@ config K230
     select SERIAL_MM
     select UNIMP
     select K230_WDT
+    select K230_I2C
diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c
index 656f28190c..a42f896c0a 100644
--- a/hw/riscv/k230.c
+++ b/hw/riscv/k230.c
@@ -110,6 +110,11 @@ static void k230_soc_init(Object *obj)
     object_initialize_child(obj, "c908-cpu", cpu0, TYPE_RISCV_HART_ARRAY);
     object_initialize_child(obj, "k230-wdt0", &s->wdt[0], TYPE_K230_WDT);
     object_initialize_child(obj, "k230-wdt1", &s->wdt[1], TYPE_K230_WDT);
+    object_initialize_child(obj, "k230-i2c0", &s->i2c[0], TYPE_K230_I2C);
+    object_initialize_child(obj, "k230-i2c1", &s->i2c[1], TYPE_K230_I2C);
+    object_initialize_child(obj, "k230-i2c2", &s->i2c[2], TYPE_K230_I2C);
+    object_initialize_child(obj, "k230-i2c3", &s->i2c[3], TYPE_K230_I2C);
+    object_initialize_child(obj, "k230-i2c4", &s->i2c[4], TYPE_K230_I2C);
 
     qdev_prop_set_uint32(DEVICE(cpu0), "hartid-base", 0);
     qdev_prop_set_string(DEVICE(cpu0), "cpu-type", TYPE_RISCV_CPU_THEAD_C908);
@@ -191,6 +196,22 @@ static void k230_soc_realize(DeviceState *dev, Error **errp)
         k230_create_uart(sys_mem, DEVICE(s->c908_plic), i);
     }
 
+    /* I2C */
+    for (int i = 0; i < K230_I2C_COUNT; i++) {
+        int i2c_dev = K230_DEV_I2C0 + i;
+
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
+            return;
+        }
+
+        sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0,
+                        memmap[i2c_dev].base);
+
+        sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c[i]), 0,
+                        qdev_get_gpio_in(DEVICE(s->c908_plic),
+                                            K230_I2C0_IRQ + i));
+    }
+
     /* Watchdog */
     for (int i = 0; i < 2; i++) {
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
@@ -304,21 +325,6 @@ static void k230_soc_realize(DeviceState *dev, Error **errp)
     create_unimplemented_device("security", memmap[K230_DEV_SECURITY].base,
                                 memmap[K230_DEV_SECURITY].size);
 
-    create_unimplemented_device("i2c0", memmap[K230_DEV_I2C0].base,
-                                memmap[K230_DEV_I2C0].size);
-
-    create_unimplemented_device("i2c1", memmap[K230_DEV_I2C1].base,
-                                memmap[K230_DEV_I2C1].size);
-
-    create_unimplemented_device("i2c2", memmap[K230_DEV_I2C2].base,
-                                memmap[K230_DEV_I2C2].size);
-
-    create_unimplemented_device("i2c3", memmap[K230_DEV_I2C3].base,
-                                memmap[K230_DEV_I2C3].size);
-
-    create_unimplemented_device("i2c4", memmap[K230_DEV_I2C4].base,
-                                memmap[K230_DEV_I2C4].size);
-
     create_unimplemented_device("pwm", memmap[K230_DEV_PWM].base,
                                 memmap[K230_DEV_PWM].size);
 
diff --git a/include/hw/riscv/k230.h b/include/hw/riscv/k230.h
index 592e1c26bf..4ea927a63b 100644
--- a/include/hw/riscv/k230.h
+++ b/include/hw/riscv/k230.h
@@ -18,8 +18,10 @@
 #include "hw/core/boards.h"
 #include "hw/riscv/riscv_hart.h"
 #include "hw/watchdog/k230_wdt.h"
+#include "hw/i2c/k230_i2c.h"
 
 #define C908_CPU_HARTID   (0)
+#define K230_I2C_COUNT    5
 
 #define TYPE_RISCV_K230_SOC "riscv.k230.soc"
 #define RISCV_K230_SOC(obj) \
@@ -33,6 +35,7 @@ typedef struct K230SoCState {
     RISCVHartArrayState c908_cpu; /* Small core */
 
     K230WdtState wdt[2];
+    K230I2CState i2c[K230_I2C_COUNT];
     MemoryRegion sram;
     MemoryRegion bootrom;
 
@@ -127,6 +130,11 @@ enum {
     K230_UART2_IRQ  = 18,
     K230_UART3_IRQ  = 19,
     K230_UART4_IRQ  = 20,
+    K230_I2C0_IRQ   = 21,
+    K230_I2C1_IRQ   = 22,
+    K230_I2C2_IRQ   = 23,
+    K230_I2C3_IRQ   = 24,
+    K230_I2C4_IRQ   = 25,
     K230_WDT0_IRQ   = 107,
     K230_WDT1_IRQ   = 108,
 };
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.