On Thu, Jul 16, 2026 at 09:24:22PM +0800, Junze Cao wrote:
> Replace the unimplemented K230 DDR configuration region with the DDRC
> model and map the PHY model at 0x9a000000.
> 
> Connect the controller to the PHY so DFI status reflects PHY training and
> initialization state.
> 
> Signed-off-by: Junze Cao <[email protected]>
Suggested-by: Chao Liu <[email protected]>

Thanks,
Chao

> ---
>  docs/system/riscv/k230.rst |  4 ++++
>  hw/riscv/k230.c            | 19 ++++++++++++++++---
>  include/hw/riscv/k230.h    |  4 ++++
>  3 files changed, 24 insertions(+), 3 deletions(-)
> 
> diff --git a/docs/system/riscv/k230.rst b/docs/system/riscv/k230.rst
> index cea8202e55..06a819fbdb 100644
> --- a/docs/system/riscv/k230.rst
> +++ b/docs/system/riscv/k230.rst
> @@ -20,12 +20,16 @@ The ``k230`` machine supports the following devices:
>  * Platform-Level Interrupt Controller (PLIC)
>  * 2 K230 Watchdog Timer
>  * 5 UART
> +* K230 DDRC CFG and DDR PHY
>  
>  Boot options
>  ------------
>  The ``k230`` machine supports K230 SDK boot through M-mode U-Boot, which then
>  starts OpenSBI/Linux with ``bootm``. It also supports direct Linux boot.
>  
> +The DDRC CFG and DDR PHY models allow the K230 SDK U-Boot SPL to complete DDR
> +initialization before loading the next boot stage.
> +
>  K230 SDK Linux kernels use T-HEAD C9xx private MAEE page table attributes. 
> QEMU
>  does not implement MAEE in the generic RISC-V MMU, so such kernels need to be
>  built with standard RISC-V PTE bits before they can boot under QEMU.
> diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c
> index 656f28190c..627150b463 100644
> --- a/hw/riscv/k230.c
> +++ b/hw/riscv/k230.c
> @@ -97,6 +97,7 @@ static const MemMapEntry memmap[] = {
>      [K230_DEV_SPI] =          { 0x91584000,  0x00001000 },
>      [K230_DEV_HI_SYS_CFG] =   { 0x91585000,  0x00000400 },
>      [K230_DEV_DDRC_CFG] =     { 0x98000000,  0x02000000 },
> +    [K230_DEV_DDR_PHY] =      { 0x9A000000,  0x00400000 },
>      [K230_DEV_FLASH] =        { 0xC0000000,  0x08000000 },
>      [K230_DEV_PLIC] =         { 0xF00000000, 0x00400000 },
>      [K230_DEV_CLINT] =        { 0xF04000000, 0x00400000 },
> @@ -108,6 +109,11 @@ static void k230_soc_init(Object *obj)
>      RISCVHartArrayState *cpu0 = &s->c908_cpu;
>  
>      object_initialize_child(obj, "c908-cpu", cpu0, TYPE_RISCV_HART_ARRAY);
> +    object_initialize_child(obj, "ddr-cfg", &s->ddr_cfg,
> +                            TYPE_K230_DDR_CFG);
> +    object_initialize_child(obj, "ddr-phy", &s->ddr_phy,
> +                            TYPE_K230_DDR_PHY);
> +    s->ddr_cfg.phy = &s->ddr_phy;
>      object_initialize_child(obj, "k230-wdt0", &s->wdt[0], TYPE_K230_WDT);
>      object_initialize_child(obj, "k230-wdt1", &s->wdt[1], TYPE_K230_WDT);
>  
> @@ -158,6 +164,16 @@ static void k230_soc_realize(DeviceState *dev, Error 
> **errp)
>      int c908_cpus;
>  
>      sysbus_realize(SYS_BUS_DEVICE(&s->c908_cpu), &error_fatal);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ddr_cfg), errp)) {
> +        return;
> +    }
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ddr_phy), errp)) {
> +        return;
> +    }
> +    sysbus_mmio_map(SYS_BUS_DEVICE(&s->ddr_cfg), 0,
> +                    memmap[K230_DEV_DDRC_CFG].base);
> +    sysbus_mmio_map(SYS_BUS_DEVICE(&s->ddr_phy), 0,
> +                    memmap[K230_DEV_DDR_PHY].base);
>  
>      c908_cpus = s->c908_cpu.num_harts;
>  
> @@ -361,9 +377,6 @@ static void k230_soc_realize(DeviceState *dev, Error 
> **errp)
>      create_unimplemented_device("hi_sys_cfg", 
> memmap[K230_DEV_HI_SYS_CFG].base,
>                                  memmap[K230_DEV_HI_SYS_CFG].size);
>  
> -    create_unimplemented_device("ddrc_cfg", memmap[K230_DEV_DDRC_CFG].base,
> -                                memmap[K230_DEV_DDRC_CFG].size);
> -
>      create_unimplemented_device("flash", memmap[K230_DEV_FLASH].base,
>                                  memmap[K230_DEV_FLASH].size);
>  }
> diff --git a/include/hw/riscv/k230.h b/include/hw/riscv/k230.h
> index 592e1c26bf..80ca16338c 100644
> --- a/include/hw/riscv/k230.h
> +++ b/include/hw/riscv/k230.h
> @@ -16,6 +16,7 @@
>  #define HW_K230_H
>  
>  #include "hw/core/boards.h"
> +#include "hw/misc/k230_ddr.h"
>  #include "hw/riscv/riscv_hart.h"
>  #include "hw/watchdog/k230_wdt.h"
>  
> @@ -32,6 +33,8 @@ typedef struct K230SoCState {
>      /*< public >*/
>      RISCVHartArrayState c908_cpu; /* Small core */
>  
> +    K230DDRCfgState ddr_cfg;
> +    K230DDRPhyState ddr_phy;
>      K230WdtState wdt[2];
>      MemoryRegion sram;
>      MemoryRegion bootrom;
> @@ -112,6 +115,7 @@ enum {
>      K230_DEV_SPI,
>      K230_DEV_HI_SYS_CFG,
>      K230_DEV_DDRC_CFG,
> +    K230_DEV_DDR_PHY,
>      K230_DEV_FLASH,
>      K230_DEV_PLIC,
>      K230_DEV_CLINT,
> -- 
> 2.53.0
> 

Reply via email to