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

Daniel Henrique Barboza <[email protected]>
Newsgroups gmane.comp.emulators.qemu
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,
>   };
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.