]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm: Add ARMv8-M aarch32 support
authorMarek Vasut <marek.vasut+renesas@mailbox.org>
Sun, 29 Mar 2026 23:14:12 +0000 (01:14 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 13 Apr 2026 23:34:02 +0000 (17:34 -0600)
Add configuration for ARMv8-M aarch32 core, which are currently
Cortex-M23/M33 cores. These cores are treated similar to ARMv7-M
cores, except the code has to be compiled with matching compiler
-march=armv8-m.main flag . These cores have no MMU, they have MPU,
which is currently not configured.

Unlike ARMv7-M, these cores have 512 interrupt vectors. While the
SYS_ARM_ARCH should be set to 8, it is set to 7 because all of the
initialization code is built from arch/arm/cpu/armv7m and not armv8.
Furthermore, CONFIG_ARM64 must be disabled, although DTs for devices
using these cores do come from arch/arm64/boot/dts.

To avoid excess duplication in Makefiles, introduce one new Kconfig
symbol, CPU_V7M_V8M. The CPU_V7M_V8M cover both ARMv7-M and ARMv8-M
cores.

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Acked-by: Udit Kumar <u-kumar1@ti.com>
15 files changed:
Makefile
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/cpu/armv7m/cpu.c
arch/arm/include/asm/armv7_mpu.h
arch/arm/include/asm/unified.h
arch/arm/lib/Makefile
arch/arm/lib/bootm.c
arch/arm/lib/crt0.S
arch/arm/lib/relocate.S
arch/arm/lib/semihosting.S
arch/arm/lib/vectors_m.S
cmd/Kconfig
dts/Makefile
lib/efi_selftest/Makefile

index 8af18668b0f5bedb4744d085e5015d598b520465..dfc95d314ddd9d48eb5835d4270b94dfbb51deca 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -531,7 +531,7 @@ UBOOTINCLUDE    := \
                -I$(srctree)/lib/mbedtls/external/mbedtls/include) \
        $(if $(CONFIG_$(PHASE_)SYS_THUMB_BUILD), \
                $(if $(CONFIG_HAS_THUMB2), \
-                       $(if $(CONFIG_CPU_V7M), \
+                       $(if $(CONFIG_CPU_V7M_V8M), \
                                -I$(srctree)/arch/arm/thumb1/include), \
                        -I$(srctree)/arch/arm/thumb1/include)) \
        -I$(srctree)/arch/$(ARCH)/include \
@@ -1050,7 +1050,7 @@ UBOOTINCLUDE    := \
                -I$(srctree)/lib/mbedtls/external/mbedtls/include) \
        $(if $(CONFIG_$(PHASE_)SYS_THUMB_BUILD), \
                $(if $(CONFIG_HAS_THUMB2), \
-                       $(if $(CONFIG_CPU_V7M), \
+                       $(if $(CONFIG_CPU_V7M_V8M), \
                                -I$(srctree)/arch/arm/thumb1/include), \
                        -I$(srctree)/arch/arm/thumb1/include)) \
        -I$(srctree)/arch/$(ARCH)/include \
@@ -1446,11 +1446,15 @@ quiet_cmd_copy = COPY    $@
       cmd_copy = cp $< $@
 
 ifeq ($(CONFIG_OF_UPSTREAM),y)
+ifeq ($(CONFIG_CPU_V8M),y)
+dt_dir := dts/upstream/src/arm64
+else
 ifeq ($(CONFIG_ARM64),y)
 dt_dir := dts/upstream/src/arm64
 else
 dt_dir := dts/upstream/src/$(ARCH)
 endif
+endif
 else
 dt_dir := arch/$(ARCH)/dts
 endif
index 03416c55265c32d5c1ec59088efc0a7298d1deb6..f624675eadf8c67b955c6dc06fcc6857540f4ce6 100644 (file)
@@ -363,7 +363,8 @@ config CPU_V7A
        select SYS_CACHE_SHIFT_6
        imply SYS_ARM_MMU
 
-config CPU_V7M
+# ARMv7-M/ARMv8-M
+config CPU_V7M_V8M
        bool
        select HAS_THUMB2
        select SYS_ARM_MPU
@@ -372,6 +373,10 @@ config CPU_V7M
        select THUMB2_KERNEL
        select NVIC
 
+config CPU_V7M
+       bool
+       select CPU_V7M_V8M
+
 config CPU_V7R
        bool
        select HAS_THUMB2
@@ -379,6 +384,10 @@ config CPU_V7R
        select SYS_ARM_MPU
        select SYS_CACHE_SHIFT_6
 
+config CPU_V8M
+       bool
+       select CPU_V7M_V8M
+
 config SYS_CPU
        default "arm720t" if CPU_ARM720T
        default "arm920t" if CPU_ARM920T
@@ -389,6 +398,7 @@ config SYS_CPU
        default "armv7" if CPU_V7A
        default "armv7" if CPU_V7R
        default "armv7m" if CPU_V7M
+       default "armv7m" if CPU_V8M
        default "armv8" if ARM64
 
 config SYS_ARM_ARCH
@@ -402,6 +412,7 @@ config SYS_ARM_ARCH
        default 7 if CPU_V7A
        default 7 if CPU_V7M
        default 7 if CPU_V7R
+       default 7 if CPU_V8M
        default 8 if ARM64
 
 choice
@@ -445,7 +456,7 @@ config ARCH_CPU_INIT
 
 config SYS_ARCH_TIMER
        bool "ARM Generic Timer support"
-       depends on CPU_V7A || CPU_V7M || ARM64
+       depends on CPU_V7A || CPU_V7M_V8M || ARM64
        default y if ARM64
        help
          The ARM Generic Timer (aka arch-timer) provides an architected
index b36b0742580984da208451c53701025883d7a19a..de975fc936867f5b90c54be4ce3d0be96860e04f 100644 (file)
@@ -16,6 +16,7 @@ arch-$(CONFIG_CPU_V7A)                =$(call cc-option, -march=armv7-a, \
                                 $(call cc-option, -march=armv7))
 arch-$(CONFIG_CPU_V7M)         =-march=armv7-m
 arch-$(CONFIG_CPU_V7R)         =-march=armv7-r
+arch-$(CONFIG_CPU_V8M)         =-march=armv8-m.main
 ifeq ($(CONFIG_ARM64_CRC32),y)
 arch-$(CONFIG_ARM64)           =-march=armv8-a+crc
 else
@@ -42,6 +43,7 @@ tune-$(CONFIG_CPU_ARM1136)    =
 tune-$(CONFIG_CPU_ARM1176)     =
 tune-$(CONFIG_CPU_V7A)         =-mtune=generic-armv7-a
 tune-$(CONFIG_CPU_V7R)         =
+tune-$(CONFIG_CPU_V8M)         =
 tune-$(CONFIG_ARM64)           =
 
 # Evaluate tune cc-option calls now
index bea0e1d3263f1be958fc6b6709aee441f6ee18dc..292730c1d7cfab65a3dafc1bd56c7f69d4cb08cf 100644 (file)
@@ -19,6 +19,9 @@
  */
 int cleanup_before_linux(void)
 {
+       if (!CONFIG_IS_ENABLED(LIB_BOOTM) && !CONFIG_IS_ENABLED(LIB_BOOTZ))
+               return 0;
+
        /*
         * this function is called just before we call linux
         * it prepares the processor for linux
@@ -45,8 +48,9 @@ int cleanup_before_linux(void)
 }
 
 /*
- * Perform the low-level reset.
+ * Perform the low-level reset. ARMv7M only.
  */
+#if IS_ENABLED(CONFIG_CPU_V7M)
 void reset_cpu(void)
 {
        /*
@@ -56,8 +60,10 @@ void reset_cpu(void)
                | (V7M_SCB->aircr & V7M_AIRCR_PRIGROUP_MSK)
                | V7M_AIRCR_SYSRESET, &V7M_SCB->aircr);
 }
+#endif
 
 void spl_perform_arch_fixups(struct spl_image_info *spl_image)
 {
-       spl_image->entry_point |= 0x1;
+       if (IS_ENABLED(CONFIG_XPL_BUILD))
+               spl_image->entry_point |= 0x1;
 }
index 16b9d0d1aeb3ad8f8146038910ec72e45e9ba820..4a6524290d320d81ac352a9a63d2b9ccfe5532c5 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/bitops.h>
 #endif
 
-#ifdef CONFIG_CPU_V7M
+#ifdef CONFIG_CPU_V7M_V8M
 #define AP_SHIFT                       24
 #define XN_SHIFT                       28
 #define TEX_SHIFT                      19
index 2fae54ebd89b9f4a3777af21fbbb261cc39b27ca..53715db42070bfa170d762b14ab2ebf7aa1f6758 100644 (file)
@@ -12,7 +12,7 @@
        .syntax unified
 #endif
 
-#ifdef CONFIG_CPU_V7M
+#ifdef CONFIG_CPU_V7M_V8M
 #define AR_CLASS(x...)
 #define M_CLASS(x...)  x
 #else
index 11cb3a7145e80dceca5474c4edadb5a4b894ff33..7b60cecbd494d3bdf09aefeb4d0fb48613faaed7 100644 (file)
@@ -11,7 +11,7 @@ obj-$(CONFIG_$(PHASE_)LIB_BOOTI) += image.o
 obj-$(CONFIG_$(PHASE_)LIB_BOOTZ) += zimage.o
 obj-$(CONFIG_$(PHASE_)LIB_BOOTM) += bootm.o
 
-ifdef CONFIG_CPU_V7M
+ifdef CONFIG_CPU_V7M_V8M
 obj-y  += vectors_m.o crt0.o
 else ifdef CONFIG_ARM64
 obj-y  += crt0_64.o
@@ -32,7 +32,7 @@ else
 obj-y  += relocate.o
 endif
 
-obj-$(CONFIG_CPU_V7M) += cmd_boot.o
+obj-$(CONFIG_CPU_V7M_V8M) += cmd_boot.o
 obj-$(CONFIG_OF_LIBFDT) += bootm-fdt.o
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
 else
@@ -62,7 +62,7 @@ obj-y += sections.o
 CFLAGS_REMOVE_sections.o := $(LTO_CFLAGS)
 
 obj-y  += stack.o
-ifdef CONFIG_CPU_V7M
+ifdef CONFIG_CPU_V7M_V8M
 obj-y  += interrupts_m.o
 else ifdef CONFIG_ARM64
 obj-$(CONFIG_FSL_LAYERSCAPE) += ccn504.o
index 727b9c5ca5b349345587e02d56cf08010edf9be8..1cde655bc80c9d3bcb2c19add6662aeed83a3a1c 100644 (file)
@@ -304,7 +304,7 @@ static void boot_jump_linux(struct bootm_headers *images, int flag)
        void (*kernel_entry)(int zero, int arch, uint params);
        unsigned long r2;
        kernel_entry = (void (*)(int, int, uint))images->ep;
-#ifdef CONFIG_CPU_V7M
+#ifdef CONFIG_CPU_V7M_V8M
        ulong addr = (ulong)kernel_entry | 1;
        kernel_entry = (void *)addr;
 #endif
index f2c5aa37a8f26d2d13ce87df864ebaab9f77eca8..a2c03f3d2f98add7ddea596ffb87137d91d113c4 100644 (file)
@@ -153,7 +153,7 @@ ENTRY(_main)
 #endif
        ldr     r0, [r9, #GD_RELOC_OFF]         /* r0 = gd->reloc_off */
        add     lr, lr, r0
-#if defined(CONFIG_CPU_V7M)
+#if defined(CONFIG_CPU_V7M_V8M)
        orr     lr, #1                          /* As required by Thumb-only */
 #endif
        ldr     r0, [r9, #GD_RELOCADDR]         /* r0 = gd->relocaddr */
index b6a648708f4a9cd08c4ad0f8b0dfef99dd629d40..21d89e49f139027e372081935b7e4a78173500e2 100644 (file)
@@ -10,7 +10,7 @@
 #include <config.h>
 #include <elf.h>
 #include <linux/linkage.h>
-#ifdef CONFIG_CPU_V7M
+#ifdef CONFIG_CPU_V7M_V8M
 #include <asm/armv7m.h>
 #endif
 
@@ -26,7 +26,7 @@
 
 WEAK(relocate_vectors)
 
-#ifdef CONFIG_CPU_V7M
+#ifdef CONFIG_CPU_V7M_V8M
        /*
         * On ARMv7-M we only have to write the new vector address
         * to VTOR register.
index 6e1691a832c1311fe2f090a7686337c92830e29e..d50c19f3f8d887d1cdfc35755829aa45998b543d 100644 (file)
@@ -13,7 +13,7 @@ ENTRY(smh_trap)
 
 #if defined(CONFIG_ARM64)
        hlt     #0xf000
-#elif defined(CONFIG_CPU_V7M)
+#elif defined(CONFIG_CPU_V7M_V8M)
        bkpt    #0xab
 #elif defined(CONFIG_SYS_THUMB_BUILD)
        svc     #0xab
index 8d88cc756fc1a867fa5ece2dc9147737e7112bf0..38b32d871523f7afa76d8d565258e73eb32e3702 100644 (file)
@@ -52,6 +52,10 @@ ENTRY(_start)
        .long   __invalid_entry                 @ 13 - Reserved
        .long   __invalid_entry                 @ 14 - PendSV
        .long   __invalid_entry                 @ 15 - SysTick
-       .rept   255 - 16
+#ifdef CONFIG_CPU_V7M
+       .rept   256 - 16
+#else /* V8M / V8R */
+       .rept   512 - 16
+#endif
        .long   __invalid_entry                 @ 16..255 - External Interrupts
        .endr
index 7bbeaad04ff4c5251b99270bce17f3a9c7fae3e7..9b8a13c34469af698bef5675da5751e8fd1fd2aa 100644 (file)
@@ -2101,7 +2101,7 @@ config BOOTP_PXE_DHCP_OPTION
 config BOOTP_VCI_STRING
        string
        depends on CMD_BOOTP
-       default "U-Boot.armv7" if CPU_V7A || CPU_V7M || CPU_V7R
+       default "U-Boot.armv7" if CPU_V7A || CPU_V7M_V8M || CPU_V7R
        default "U-Boot.armv8" if ARM64
        default "U-Boot.arm" if ARM
        default "U-Boot"
index bec6c49da2c9827cbd66c69f54bb707aeda20776..befc6de18056c7e28da6166b0bd2caa55ef43569 100644 (file)
@@ -11,11 +11,15 @@ DEVICE_TREE := unset
 endif
 
 ifeq ($(CONFIG_OF_UPSTREAM),y)
+ifeq ($(CONFIG_CPU_V8M),y)
+dt_dir := dts/upstream/src/arm64
+else
 ifeq ($(CONFIG_ARM64),y)
 dt_dir := dts/upstream/src/arm64
 else
 dt_dir := dts/upstream/src/$(ARCH)
 endif
+endif
 else
 dt_dir := arch/$(ARCH)/dts
 endif
index 842433f68aaf55e5d3e9e0102be6addac5ae9d24..67102648703325815b2a28864b6ccf20cadc3199 100644 (file)
@@ -60,7 +60,7 @@ obj-$(CONFIG_EFI_DEVICE_PATH_TO_TEXT) += efi_selftest_devicepath.o
 obj-$(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) += \
 efi_selftest_unicode_collation.o
 
-ifeq ($(CONFIG_CPU_V7A)$(CONFIG_CPU_V7M)$(CONFIG_CPU_V7R),y)
+ifeq ($(CONFIG_CPU_V7A)$(CONFIG_CPU_V7M_V8M)$(CONFIG_CPU_V7R),y)
 obj-y += efi_selftest_unaligned.o
 endif
 obj-$(CONFIG_EFI_LOADER_HII) += efi_selftest_hii.o