Re: [PATCH 2/5] hw/riscv: instantiate K230 I2C controllers
Daniel Henrique Barboza <[email protected]>
| Newsgroups | org.nongnu.qemu-riscv,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On 8/7/2026 12:28 PM, Wang Zhongyu wrote: > 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]> > --- Reviewed-by: Daniel Henrique Barboza <[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, > };