1*29abd3d1SHuang Borong /* SPDX-License-Identifier: BSD-2-Clause */ 2*29abd3d1SHuang Borong /* 3*29abd3d1SHuang Borong * QEMU RISC-V Board Compatible with the Xiangshan Kunminghu 4*29abd3d1SHuang Borong * FPGA prototype platform 5*29abd3d1SHuang Borong * 6*29abd3d1SHuang Borong * Copyright (c) 2025 Beijing Institute of Open Source Chip (BOSC) 7*29abd3d1SHuang Borong * 8*29abd3d1SHuang Borong */ 9*29abd3d1SHuang Borong 10*29abd3d1SHuang Borong #ifndef HW_XIANGSHAN_KMH_H 11*29abd3d1SHuang Borong #define HW_XIANGSHAN_KMH_H 12*29abd3d1SHuang Borong 13*29abd3d1SHuang Borong #include "hw/boards.h" 14*29abd3d1SHuang Borong #include "hw/riscv/riscv_hart.h" 15*29abd3d1SHuang Borong 16*29abd3d1SHuang Borong #define XIANGSHAN_KMH_MAX_CPUS 16 17*29abd3d1SHuang Borong 18*29abd3d1SHuang Borong typedef struct XiangshanKmhSoCState { 19*29abd3d1SHuang Borong /*< private >*/ 20*29abd3d1SHuang Borong DeviceState parent_obj; 21*29abd3d1SHuang Borong 22*29abd3d1SHuang Borong /*< public >*/ 23*29abd3d1SHuang Borong RISCVHartArrayState cpus; 24*29abd3d1SHuang Borong DeviceState *irqchip; 25*29abd3d1SHuang Borong MemoryRegion rom; 26*29abd3d1SHuang Borong } XiangshanKmhSoCState; 27*29abd3d1SHuang Borong 28*29abd3d1SHuang Borong #define TYPE_XIANGSHAN_KMH_SOC "xiangshan.kunminghu.soc" 29*29abd3d1SHuang Borong DECLARE_INSTANCE_CHECKER(XiangshanKmhSoCState, XIANGSHAN_KMH_SOC, 30*29abd3d1SHuang Borong TYPE_XIANGSHAN_KMH_SOC) 31*29abd3d1SHuang Borong 32*29abd3d1SHuang Borong typedef struct XiangshanKmhState { 33*29abd3d1SHuang Borong /*< private >*/ 34*29abd3d1SHuang Borong MachineState parent_obj; 35*29abd3d1SHuang Borong 36*29abd3d1SHuang Borong /*< public >*/ 37*29abd3d1SHuang Borong XiangshanKmhSoCState soc; 38*29abd3d1SHuang Borong } XiangshanKmhState; 39*29abd3d1SHuang Borong 40*29abd3d1SHuang Borong #define TYPE_XIANGSHAN_KMH_MACHINE MACHINE_TYPE_NAME("xiangshan-kunminghu") 41*29abd3d1SHuang Borong DECLARE_INSTANCE_CHECKER(XiangshanKmhState, XIANGSHAN_KMH_MACHINE, 42*29abd3d1SHuang Borong TYPE_XIANGSHAN_KMH_MACHINE) 43*29abd3d1SHuang Borong 44*29abd3d1SHuang Borong enum { 45*29abd3d1SHuang Borong XIANGSHAN_KMH_ROM, 46*29abd3d1SHuang Borong XIANGSHAN_KMH_UART0, 47*29abd3d1SHuang Borong XIANGSHAN_KMH_CLINT, 48*29abd3d1SHuang Borong XIANGSHAN_KMH_APLIC_M, 49*29abd3d1SHuang Borong XIANGSHAN_KMH_APLIC_S, 50*29abd3d1SHuang Borong XIANGSHAN_KMH_IMSIC_M, 51*29abd3d1SHuang Borong XIANGSHAN_KMH_IMSIC_S, 52*29abd3d1SHuang Borong XIANGSHAN_KMH_DRAM, 53*29abd3d1SHuang Borong }; 54*29abd3d1SHuang Borong 55*29abd3d1SHuang Borong enum { 56*29abd3d1SHuang Borong XIANGSHAN_KMH_UART0_IRQ = 10, 57*29abd3d1SHuang Borong }; 58*29abd3d1SHuang Borong 59*29abd3d1SHuang Borong /* Indicating Timebase-freq (1MHZ) */ 60*29abd3d1SHuang Borong #define XIANGSHAN_KMH_CLINT_TIMEBASE_FREQ 1000000 61*29abd3d1SHuang Borong 62*29abd3d1SHuang Borong #define XIANGSHAN_KMH_IMSIC_NUM_IDS 255 63*29abd3d1SHuang Borong #define XIANGSHAN_KMH_IMSIC_NUM_GUESTS 7 64*29abd3d1SHuang Borong #define XIANGSHAN_KMH_IMSIC_GUEST_BITS 3 65*29abd3d1SHuang Borong 66*29abd3d1SHuang Borong #define XIANGSHAN_KMH_APLIC_NUM_SOURCES 96 67*29abd3d1SHuang Borong 68*29abd3d1SHuang Borong #endif 69