Skip to content

Commit 6ae3001

Browse files
committed
Merge branch 'main' into feat/tda4vm_plat_support
2 parents c6769ab + e71c2f7 commit 6ae3001

17 files changed

Lines changed: 144 additions & 6 deletions

File tree

scripts/arch/riscv/platform_defs_gen.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ void arch_platform_defs() {
1414

1515
if (IRQC == AIA) {
1616
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));
1728
}
1829

1930
}

src/arch/armv8/aarch32/inc/arch/subarch/sysregs.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ SYSREG_GEN_ACCESSORS(clidr_el1, 1, c0, c0, 1)
7171
SYSREG_GEN_ACCESSORS(csselr_el1, 2, c0, c0, 0)
7272
SYSREG_GEN_ACCESSORS(ctr_el0, 0, c0, c0, 1)
7373
SYSREG_GEN_ACCESSORS(mpidr_el1, 0, c0, c0, 5)
74+
SYSREG_GEN_ACCESSORS(midr_el1, 0, c0, c0, 0)
7475
SYSREG_GEN_ACCESSORS(vmpidr_el2, 4, c0, c0, 5)
7576
SYSREG_GEN_ACCESSORS_64(cntvoff_el2, 4, c14)
7677
SYSREG_GEN_ACCESSORS(sctlr_el1, 0, c1, c0, 0)
@@ -117,6 +118,10 @@ SYSREG_GEN_ACCESSORS_64(icc_sgi1r_el1, 0, c12)
117118
SYSREG_GEN_ACCESSORS(vsctlr_el2, 4, c2, c0, 0)
118119
SYSREG_GEN_ACCESSORS(sctlr_el2, 4, c1, c0, 0)
119120

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+
120125
#define SYSREG_GEN_GIC_LR(n, crn1, crn2, op2) \
121126
SYSREG_GEN_ACCESSORS(ich_lr##n, 4, c12, crn1, op2) \
122127
SYSREG_GEN_ACCESSORS(ich_lrc##n, 4, c12, crn2, op2) \

src/arch/armv8/aarch64/inc/arch/subarch/sysregs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ SYSREG_GEN_ACCESSORS(csselr_el1)
6969
SYSREG_GEN_ACCESSORS(ccsidr_el1)
7070
SYSREG_GEN_ACCESSORS(ccsidr2_el1)
7171
SYSREG_GEN_ACCESSORS(ctr_el0)
72+
SYSREG_GEN_ACCESSORS(midr_el1)
7273
SYSREG_GEN_ACCESSORS(mpidr_el1)
7374
SYSREG_GEN_ACCESSORS(vmpidr_el2)
7475
SYSREG_GEN_ACCESSORS(cntvoff_el2)

src/arch/armv8/arch.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ arch_profile_dir:=$(cpu_arch_dir)/$(ARCH_PROFILE)
1111
include $(arch_profile_dir)/profile.mk
1212
src_dirs+=$(arch_profile_dir)
1313

14+
src_dirs+=$(arch_profile_dir)/cpus
15+
1416
arch_profile_sub_dir:=$(arch_profile_dir)/$(ARCH_SUB)
1517
src_dirs+=$(arch_profile_sub_dir)
1618

@@ -20,3 +22,4 @@ arch-cflags+=-mgeneral-regs-only
2022
endif
2123
arch-asflags+=
2224
arch-ldflags+=
25+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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) { }
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## SPDX-License-Identifier: Apache-2.0
2+
## Copyright (c) Bao Project and Contributors. All rights reserved.
3+
4+
cpu-objs-y+=$(ARCH_PROFILE)/cpus/core_impl.o
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright (c) Bao Project and Contributors. All rights reserved.
4+
*/
5+
6+
#include <arch/sysregs.h>
7+
#include <arch/core_impl.h>
8+
9+
#define ARMV8R_R52_PARTNUMBER 0xD13
10+
11+
/* Weak references to CPU implementation init functions */
12+
extern void cortex_r52_impl_init(void) __attribute__((weak));
13+
14+
void cpu_arch_core_impl_init(void)
15+
{
16+
/* Read MIDR to identify core implementation */
17+
unsigned long midr = sysreg_midr_el1_read();
18+
uint32_t part_num = MIDR_EL1_PARTNUM(midr);
19+
20+
switch (part_num) {
21+
case ARMV8R_R52_PARTNUMBER: /* Cortex-R52 */
22+
if (cortex_r52_impl_init != NULL) {
23+
cortex_r52_impl_init();
24+
}
25+
break;
26+
default:
27+
break;
28+
}
29+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright (c) Bao Project and Contributors. All rights reserved.
4+
*/
5+
6+
#include <arch/sysregs.h>
7+
#include <arch/fences.h>
8+
9+
/* HACTLR: Enable EL1 access to IMP DEF registers */
10+
#define HACTLR_PERIPHPREGIONR (1 << 8)
11+
#define HACTLR_QOSR (1 << 9)
12+
#define HACTLR_ERR (1 << 13)
13+
14+
/* IMP_PERIPHREGIONR (LLPP) */
15+
#define PERIPHREGIONR_EL1_EL0_ENABLE (1 << 0)
16+
#define PERIPHREGIONR_EL2_ENABLE (1 << 1)
17+
18+
/* FLASHIFREGIONR */
19+
#define FLASHIFREGIONR_ENABLE (1 << 0)
20+
21+
void cortex_r52_impl_init(void);
22+
23+
static void cortex_r52_enable_hactlr(void)
24+
{
25+
unsigned long val = sysreg_hactlr_read();
26+
val |= (HACTLR_PERIPHPREGIONR | HACTLR_QOSR | HACTLR_ERR);
27+
sysreg_hactlr_write(val);
28+
}
29+
30+
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+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
## SPDX-License-Identifier: Apache-2.0
2+
## Copyright (c) Bao Project and Contributors. All rights reserved.
3+
4+
cpu-objs-y+=$(ARCH_PROFILE)/cpus/core_impl.o
5+
6+
# CPU-specific implementations based on platform configuration
7+
cpu-objs-y+=$(foreach cpu, $(PLAT_CPUS), $(ARCH_PROFILE)/cpus/$(cpu).o)

src/arch/armv8/cpu.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <cpu.h>
88
#include <platform.h>
99
#include <arch/sysregs.h>
10+
#include <arch/core_impl.h>
1011

1112
cpuid_t CPU_MASTER __attribute__((section(".datanocopy")));
1213

@@ -15,6 +16,7 @@ void cpu_arch_init(cpuid_t cpuid, paddr_t load_addr)
1516
{
1617
cpu()->arch.mpidr = sysreg_mpidr_el1_read();
1718
cpu_arch_profile_init(cpuid, load_addr);
19+
cpu_arch_core_impl_init();
1820
}
1921

2022
unsigned long cpu_id_to_mpidr(cpuid_t id)

0 commit comments

Comments
 (0)