[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