We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
2 parents 6bcec8a + e71c2f7 commit 3a54723Copy full SHA for 3a54723
17 files changed
scripts/arch/riscv/platform_defs_gen.c
@@ -14,6 +14,17 @@ void arch_platform_defs() {
14
15
if (IRQC == AIA) {
16
printf("#define PLAT_IMSIC_MAX_INTERRUPTS %ld\n", platform.arch.irqc.aia.imsic.num_msis);
17
+
18
+ /**
19
+ * This calculation follows the rules for the arrangement of memory regions for multiple
20
+ * interrupt files defined in section 3.6 of "The RISC-V Advanced Interrupt Architecture"
21
+ * version 1.0, with the smallest constant D as defined by the spec.
22
+ */
23
+ size_t num_addr_bits = 0;
24
+ while ((1UL << num_addr_bits) < (platform.arch.irqc.aia.imsic.num_guest_files + 1)) {
25
+ num_addr_bits += 1;
26
+ }
27
+ printf("#define PLAT_IMSIC_HART_SIZE (%ld)\n", ((1UL << (num_addr_bits)) * PAGE_SIZE));
28
}
29
30
src/arch/armv8/aarch32/inc/arch/subarch/sysregs.h
@@ -71,6 +71,7 @@ SYSREG_GEN_ACCESSORS(clidr_el1, 1, c0, c0, 1)
71
SYSREG_GEN_ACCESSORS(csselr_el1, 2, c0, c0, 0)
72
SYSREG_GEN_ACCESSORS(ctr_el0, 0, c0, c0, 1)
73
SYSREG_GEN_ACCESSORS(mpidr_el1, 0, c0, c0, 5)
74
+SYSREG_GEN_ACCESSORS(midr_el1, 0, c0, c0, 0)
75
SYSREG_GEN_ACCESSORS(vmpidr_el2, 4, c0, c0, 5)
76
SYSREG_GEN_ACCESSORS_64(cntvoff_el2, 4, c14)
77
SYSREG_GEN_ACCESSORS(sctlr_el1, 0, c1, c0, 0)
@@ -117,6 +118,10 @@ SYSREG_GEN_ACCESSORS_64(icc_sgi1r_el1, 0, c12)
117
118
SYSREG_GEN_ACCESSORS(vsctlr_el2, 4, c2, c0, 0)
119
SYSREG_GEN_ACCESSORS(sctlr_el2, 4, c1, c0, 0)
120
121
+SYSREG_GEN_ACCESSORS(hactlr, 4, c1, c0, 1)
122
+SYSREG_GEN_ACCESSORS(imp_periphregionr, 0, c15, c0, 0)
123
+SYSREG_GEN_ACCESSORS(flashifregionr, 0, c15, c0, 1)
124
125
#define SYSREG_GEN_GIC_LR(n, crn1, crn2, op2) \
126
SYSREG_GEN_ACCESSORS(ich_lr##n, 4, c12, crn1, op2) \
127
SYSREG_GEN_ACCESSORS(ich_lrc##n, 4, c12, crn2, op2) \
src/arch/armv8/aarch64/inc/arch/subarch/sysregs.h
@@ -69,6 +69,7 @@ SYSREG_GEN_ACCESSORS(csselr_el1)
69
SYSREG_GEN_ACCESSORS(ccsidr_el1)
70
SYSREG_GEN_ACCESSORS(ccsidr2_el1)
SYSREG_GEN_ACCESSORS(ctr_el0)
+SYSREG_GEN_ACCESSORS(midr_el1)
SYSREG_GEN_ACCESSORS(mpidr_el1)
SYSREG_GEN_ACCESSORS(vmpidr_el2)
SYSREG_GEN_ACCESSORS(cntvoff_el2)
src/arch/armv8/arch.mk
@@ -11,6 +11,8 @@ arch_profile_dir:=$(cpu_arch_dir)/$(ARCH_PROFILE)
11
include $(arch_profile_dir)/profile.mk
12
src_dirs+=$(arch_profile_dir)
13
+src_dirs+=$(arch_profile_dir)/cpus
arch_profile_sub_dir:=$(arch_profile_dir)/$(ARCH_SUB)
src_dirs+=$(arch_profile_sub_dir)
@@ -20,3 +22,4 @@ arch-cflags+=-mgeneral-regs-only
endif
arch-asflags+=
arch-ldflags+=
src/arch/armv8/armv8-a/cpus/core_impl.c
@@ -0,0 +1,8 @@
1
+/**
2
+ * SPDX-License-Identifier: Apache-2.0
3
+ * Copyright (c) Bao Project and Contributors. All rights reserved.
4
5
6
+#include <arch/core_impl.h>
7
8
+void cpu_arch_core_impl_init(void) { }
src/arch/armv8/armv8-a/cpus/objects.mk
@@ -0,0 +1,4 @@
+## SPDX-License-Identifier: Apache-2.0
+## Copyright (c) Bao Project and Contributors. All rights reserved.
+cpu-objs-y+=$(ARCH_PROFILE)/cpus/core_impl.o
src/arch/armv8/armv8-r/cpus/core_impl.c
@@ -0,0 +1,29 @@
+#include <arch/sysregs.h>
9
+#define ARMV8R_R52_PARTNUMBER 0xD13
10
+/* Weak references to CPU implementation init functions */
+extern void cortex_r52_impl_init(void) __attribute__((weak));
+void cpu_arch_core_impl_init(void)
+{
+ /* Read MIDR to identify core implementation */
+ unsigned long midr = sysreg_midr_el1_read();
+ uint32_t part_num = MIDR_EL1_PARTNUM(midr);
+ switch (part_num) {
+ case ARMV8R_R52_PARTNUMBER: /* Cortex-R52 */
+ if (cortex_r52_impl_init != NULL) {
+ cortex_r52_impl_init();
+ break;
+ default:
+}
src/arch/armv8/armv8-r/cpus/cortex_r52.c
@@ -0,0 +1,53 @@
+#include <arch/fences.h>
+/* HACTLR: Enable EL1 access to IMP DEF registers */
+#define HACTLR_PERIPHPREGIONR (1 << 8)
+#define HACTLR_QOSR (1 << 9)
+#define HACTLR_ERR (1 << 13)
+/* IMP_PERIPHREGIONR (LLPP) */
+#define PERIPHREGIONR_EL1_EL0_ENABLE (1 << 0)
+#define PERIPHREGIONR_EL2_ENABLE (1 << 1)
+/* FLASHIFREGIONR */
+#define FLASHIFREGIONR_ENABLE (1 << 0)
+void cortex_r52_impl_init(void);
+static void cortex_r52_enable_hactlr(void)
+ unsigned long val = sysreg_hactlr_read();
+ val |= (HACTLR_PERIPHPREGIONR | HACTLR_QOSR | HACTLR_ERR);
+ sysreg_hactlr_write(val);
+static void cortex_r52_enable_llpp(void)
31
32
+ unsigned long val = sysreg_imp_periphregionr_read();
33
+ val |= (PERIPHREGIONR_EL2_ENABLE | PERIPHREGIONR_EL1_EL0_ENABLE);
34
+ sysreg_imp_periphregionr_write(val);
35
36
37
+static void cortex_r52_enable_flash_region(void)
38
39
+ unsigned long val = sysreg_flashifregionr_read();
40
+ val |= FLASHIFREGIONR_ENABLE;
41
+ sysreg_flashifregionr_write(val);
42
43
44
+void cortex_r52_impl_init(void)
45
46
+ cortex_r52_enable_hactlr();
47
48
+ cortex_r52_enable_llpp();
49
50
+ cortex_r52_enable_flash_region();
51
52
+ ISB();
53
src/arch/armv8/armv8-r/cpus/objects.mk
@@ -0,0 +1,7 @@
+# CPU-specific implementations based on platform configuration
+cpu-objs-y+=$(foreach cpu, $(PLAT_CPUS), $(ARCH_PROFILE)/cpus/$(cpu).o)
src/arch/armv8/cpu.c
@@ -7,6 +7,7 @@
#include <cpu.h>
#include <platform.h>
#include <arch/sysregs.h>
cpuid_t CPU_MASTER __attribute__((section(".datanocopy")));
@@ -15,6 +16,7 @@ void cpu_arch_init(cpuid_t cpuid, paddr_t load_addr)
{
cpu()->arch.mpidr = sysreg_mpidr_el1_read();
cpu_arch_profile_init(cpuid, load_addr);
+ cpu_arch_core_impl_init();
unsigned long cpu_id_to_mpidr(cpuid_t id)
0 commit comments