xref: /openbmc/qemu/include/hw/arm/npcm7xx.h (revision 2d8f048c25ab2b701ea8e14ba5b02d3a8a5c9044)
1*2d8f048cSHavard Skinnemoen /*
2*2d8f048cSHavard Skinnemoen  * Nuvoton NPCM7xx SoC family.
3*2d8f048cSHavard Skinnemoen  *
4*2d8f048cSHavard Skinnemoen  * Copyright 2020 Google LLC
5*2d8f048cSHavard Skinnemoen  *
6*2d8f048cSHavard Skinnemoen  * This program is free software; you can redistribute it and/or modify it
7*2d8f048cSHavard Skinnemoen  * under the terms of the GNU General Public License as published by the
8*2d8f048cSHavard Skinnemoen  * Free Software Foundation; either version 2 of the License, or
9*2d8f048cSHavard Skinnemoen  * (at your option) any later version.
10*2d8f048cSHavard Skinnemoen  *
11*2d8f048cSHavard Skinnemoen  * This program is distributed in the hope that it will be useful, but WITHOUT
12*2d8f048cSHavard Skinnemoen  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*2d8f048cSHavard Skinnemoen  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14*2d8f048cSHavard Skinnemoen  * for more details.
15*2d8f048cSHavard Skinnemoen  */
16*2d8f048cSHavard Skinnemoen #ifndef NPCM7XX_H
17*2d8f048cSHavard Skinnemoen #define NPCM7XX_H
18*2d8f048cSHavard Skinnemoen 
19*2d8f048cSHavard Skinnemoen #include "hw/boards.h"
20*2d8f048cSHavard Skinnemoen #include "hw/cpu/a9mpcore.h"
21*2d8f048cSHavard Skinnemoen #include "hw/misc/npcm7xx_clk.h"
22*2d8f048cSHavard Skinnemoen #include "hw/misc/npcm7xx_gcr.h"
23*2d8f048cSHavard Skinnemoen #include "hw/timer/npcm7xx_timer.h"
24*2d8f048cSHavard Skinnemoen #include "target/arm/cpu.h"
25*2d8f048cSHavard Skinnemoen 
26*2d8f048cSHavard Skinnemoen #define NPCM7XX_MAX_NUM_CPUS    (2)
27*2d8f048cSHavard Skinnemoen 
28*2d8f048cSHavard Skinnemoen /* The first half of the address space is reserved for DDR4 DRAM. */
29*2d8f048cSHavard Skinnemoen #define NPCM7XX_DRAM_BA         (0x00000000)
30*2d8f048cSHavard Skinnemoen #define NPCM7XX_DRAM_SZ         (2 * GiB)
31*2d8f048cSHavard Skinnemoen 
32*2d8f048cSHavard Skinnemoen /* Magic addresses for setting up direct kernel booting and SMP boot stubs. */
33*2d8f048cSHavard Skinnemoen #define NPCM7XX_LOADER_START            (0x00000000)  /* Start of SDRAM */
34*2d8f048cSHavard Skinnemoen #define NPCM7XX_SMP_LOADER_START        (0xffff0000)  /* Boot ROM */
35*2d8f048cSHavard Skinnemoen #define NPCM7XX_SMP_BOOTREG_ADDR        (0xf080013c)  /* GCR.SCRPAD */
36*2d8f048cSHavard Skinnemoen #define NPCM7XX_GIC_CPU_IF_ADDR         (0xf03fe100)  /* GIC within A9 */
37*2d8f048cSHavard Skinnemoen 
38*2d8f048cSHavard Skinnemoen typedef struct NPCM7xxState {
39*2d8f048cSHavard Skinnemoen     DeviceState         parent;
40*2d8f048cSHavard Skinnemoen 
41*2d8f048cSHavard Skinnemoen     ARMCPU              cpu[NPCM7XX_MAX_NUM_CPUS];
42*2d8f048cSHavard Skinnemoen     A9MPPrivState       a9mpcore;
43*2d8f048cSHavard Skinnemoen 
44*2d8f048cSHavard Skinnemoen     MemoryRegion        sram;
45*2d8f048cSHavard Skinnemoen     MemoryRegion        irom;
46*2d8f048cSHavard Skinnemoen     MemoryRegion        ram3;
47*2d8f048cSHavard Skinnemoen     MemoryRegion        *dram;
48*2d8f048cSHavard Skinnemoen 
49*2d8f048cSHavard Skinnemoen     NPCM7xxGCRState     gcr;
50*2d8f048cSHavard Skinnemoen     NPCM7xxCLKState     clk;
51*2d8f048cSHavard Skinnemoen     NPCM7xxTimerCtrlState tim[3];
52*2d8f048cSHavard Skinnemoen } NPCM7xxState;
53*2d8f048cSHavard Skinnemoen 
54*2d8f048cSHavard Skinnemoen #define TYPE_NPCM7XX    "npcm7xx"
55*2d8f048cSHavard Skinnemoen #define NPCM7XX(obj)    OBJECT_CHECK(NPCM7xxState, (obj), TYPE_NPCM7XX)
56*2d8f048cSHavard Skinnemoen 
57*2d8f048cSHavard Skinnemoen #define TYPE_NPCM730    "npcm730"
58*2d8f048cSHavard Skinnemoen #define TYPE_NPCM750    "npcm750"
59*2d8f048cSHavard Skinnemoen 
60*2d8f048cSHavard Skinnemoen typedef struct NPCM7xxClass {
61*2d8f048cSHavard Skinnemoen     DeviceClass         parent;
62*2d8f048cSHavard Skinnemoen 
63*2d8f048cSHavard Skinnemoen     /* Bitmask of modules that are permanently disabled on this chip. */
64*2d8f048cSHavard Skinnemoen     uint32_t            disabled_modules;
65*2d8f048cSHavard Skinnemoen     /* Number of CPU cores enabled in this SoC class (may be 1 or 2). */
66*2d8f048cSHavard Skinnemoen     uint32_t            num_cpus;
67*2d8f048cSHavard Skinnemoen } NPCM7xxClass;
68*2d8f048cSHavard Skinnemoen 
69*2d8f048cSHavard Skinnemoen #define NPCM7XX_CLASS(klass)                                            \
70*2d8f048cSHavard Skinnemoen     OBJECT_CLASS_CHECK(NPCM7xxClass, (klass), TYPE_NPCM7XX)
71*2d8f048cSHavard Skinnemoen #define NPCM7XX_GET_CLASS(obj)                                          \
72*2d8f048cSHavard Skinnemoen     OBJECT_GET_CLASS(NPCM7xxClass, (obj), TYPE_NPCM7XX)
73*2d8f048cSHavard Skinnemoen 
74*2d8f048cSHavard Skinnemoen /**
75*2d8f048cSHavard Skinnemoen  * npcm7xx_load_kernel - Loads memory with everything needed to boot
76*2d8f048cSHavard Skinnemoen  * @machine - The machine containing the SoC to be booted.
77*2d8f048cSHavard Skinnemoen  * @soc - The SoC containing the CPU to be booted.
78*2d8f048cSHavard Skinnemoen  *
79*2d8f048cSHavard Skinnemoen  * This will set up the ARM boot info structure for the specific NPCM7xx
80*2d8f048cSHavard Skinnemoen  * derivative and call arm_load_kernel() to set up loading of the kernel, etc.
81*2d8f048cSHavard Skinnemoen  * into memory, if requested by the user.
82*2d8f048cSHavard Skinnemoen  */
83*2d8f048cSHavard Skinnemoen void npcm7xx_load_kernel(MachineState *machine, NPCM7xxState *soc);
84*2d8f048cSHavard Skinnemoen 
85*2d8f048cSHavard Skinnemoen #endif /* NPCM7XX_H */
86