xref: /qemu/include/hw/riscv/xiangshan_kmh.h (revision 29abd3d112c380b8019a77ebad65f61addfb812d)
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