From 054f8deb29071cdfa37293c81ee756f68dc852c0a35f692f9352b8733ff652f0 Mon Sep 17 00:00:00 2001 From: Matthias Brugger Date: Fri, 22 Nov 2019 12:06:37 +0000 Subject: [PATCH] Accepting request 750139 from hardware:boot:staging - enable build for one U-Boot image for RPi3/4 (rpiarm64) implements (jsc#59185) Patch queue updated from git://github.com/openSUSE/u-boot.git tumbleweed-2019.10 * Patches added: 0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch 0015-arm-dts-bcm283x-Rename-U-Boot-file.patch 0016-drivers-bcm283x-Set-pre-location-fl.patch 0017-pinctrl-bcm283x-Add-compatible-for-.patch 0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch 0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch 0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch 0021-ARM-bcm283x-Set-memory-map-at-run-t.patch 0022-ARM-defconfig-add-unified-config-fo.patch - RPi3 delete text base hack in spec file OBS-URL: https://build.opensuse.org/request/show/750139 OBS-URL: https://build.opensuse.org/package/show/hardware:boot/u-boot?expand=0&rev=62 --- ...-fdt-fix-bcm283x-dm-pre-reloc-defini.patch | 33 +++ 0015-arm-dts-bcm283x-Rename-U-Boot-file.patch | 33 +++ ...-drivers-bcm283x-Set-pre-location-fl.patch | 60 +++++ ...-pinctrl-bcm283x-Add-compatible-for-.patch | 26 ++ ...-rpi-push-fw_dtb_pointer-in-the-.dat.patch | 68 +++++ ...-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch | 232 ++++++++++++++++++ ...-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch | 71 ++++++ ...-ARM-bcm283x-Set-memory-map-at-run-t.patch | 181 ++++++++++++++ ...-ARM-defconfig-add-unified-config-fo.patch | 86 +++++++ _multibuild | 1 + u-boot.changes | 26 ++ u-boot.spec | 28 ++- 12 files changed, 835 insertions(+), 10 deletions(-) create mode 100644 0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch create mode 100644 0015-arm-dts-bcm283x-Rename-U-Boot-file.patch create mode 100644 0016-drivers-bcm283x-Set-pre-location-fl.patch create mode 100644 0017-pinctrl-bcm283x-Add-compatible-for-.patch create mode 100644 0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch create mode 100644 0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch create mode 100644 0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch create mode 100644 0021-ARM-bcm283x-Set-memory-map-at-run-t.patch create mode 100644 0022-ARM-defconfig-add-unified-config-fo.patch diff --git a/0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch b/0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch new file mode 100644 index 0000000..411ff83 --- /dev/null +++ b/0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch @@ -0,0 +1,33 @@ +From 9526bad11cfe6be9e542360ae2db0f51e82d66e7 Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Fri, 8 Nov 2019 14:49:46 +0100 +Subject: [PATCH] fdt: fix bcm283x dm-pre-reloc definitions + +In commmit +143256b353 ("fdt: update bcm283x device tree sources to Linux 5.1-rc6 state") +we deleted the label for the node soc from bcm283x.dtsi + +As we don't need to add the property dm-pre-reloc to the soc node, +we can delete it from bcm283x-uboot.dtsi + +Tested-by: Tom Rini [RPi 3, 32b and 64b modes] +Signed-off-by: Matthias Brugger +--- + arch/arm/dts/bcm283x-uboot.dtsi | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/arch/arm/dts/bcm283x-uboot.dtsi b/arch/arm/dts/bcm283x-uboot.dtsi +index 6cc1aa3f93..36548dad62 100644 +--- a/arch/arm/dts/bcm283x-uboot.dtsi ++++ b/arch/arm/dts/bcm283x-uboot.dtsi +@@ -6,10 +6,6 @@ + * (C) Copyright 2016 Fabian Vogt + */ + +-&soc { +- u-boot,dm-pre-reloc; +-}; +- + &uart0 { + skip-init; + u-boot,dm-pre-reloc; diff --git a/0015-arm-dts-bcm283x-Rename-U-Boot-file.patch b/0015-arm-dts-bcm283x-Rename-U-Boot-file.patch new file mode 100644 index 0000000..5a5c3b3 --- /dev/null +++ b/0015-arm-dts-bcm283x-Rename-U-Boot-file.patch @@ -0,0 +1,33 @@ +From f23fa9de638a899bd26b4a7d95fd0cc4fb63ec2c Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Fri, 8 Nov 2019 14:49:47 +0100 +Subject: [PATCH] arm: dts: bcm283x: Rename U-Boot file + +Rename the file bcm283x-uboot.dtsi so that it get +automatically include through the scripts/Makefile.lib +using $(CONFIG_SYS_SOC))-u-boot.dtsi + +Without this uarts and pincontroller miss the property dm-pre-reloc +and the first call to bcm283x_mu_serial_ofdata_to_platdata() fails +as the pins are not set correctly. +As a result the U-Boot banner isn't shown on boot. + +Before commmit +143256b353 ("fdt: update bcm283x device tree sources to Linux 5.1-rc6 state") +we included bcm283x-uboot.dtsi directly in the device-tree file. +Which got deleted by the metioned commit. +This is a much robuster solution. + +Reported-by: Tom Rini +Reported-by: Heinrich Schuchardt +Tested-by: Tom Rini [RPi 3, 32b and 64b modes] +Signed-off-by: Matthias Brugger +--- + arch/arm/dts/{bcm283x-uboot.dtsi => bcm283x-u-boot.dtsi} | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + rename arch/arm/dts/{bcm283x-uboot.dtsi => bcm283x-u-boot.dtsi} (100%) + +diff --git a/arch/arm/dts/bcm283x-uboot.dtsi b/arch/arm/dts/bcm283x-u-boot.dtsi +similarity index 100% +rename from arch/arm/dts/bcm283x-uboot.dtsi +rename to arch/arm/dts/bcm283x-u-boot.dtsi diff --git a/0016-drivers-bcm283x-Set-pre-location-fl.patch b/0016-drivers-bcm283x-Set-pre-location-fl.patch new file mode 100644 index 0000000..2e64b9a --- /dev/null +++ b/0016-drivers-bcm283x-Set-pre-location-fl.patch @@ -0,0 +1,60 @@ +From 0b0820f5ed04171d9b73a149ea0d3470fcea71d1 Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Fri, 8 Nov 2019 14:49:48 +0100 +Subject: [PATCH] drivers: bcm283x: Set pre-location flag for OF_BOARD + +U-Boot support on Raspberry Pi 4 relies on the device-tree +provided by the firmware. The blob does not contain the +U-Boot specific pre-loc-rel properties. The result is, that +the U-Boot banner is not printed. + +We fix this by setting the DM_FLAG_PRE_RELOC flag in the driver, +if we rely on a device-tree provided by the firmware. + +Reported-by: Heinrich Schuchardt +Signed-off-by: Matthias Brugger +--- + drivers/pinctrl/broadcom/pinctrl-bcm283x.c | 2 +- + drivers/serial/serial_bcm283x_mu.c | 2 +- + drivers/serial/serial_bcm283x_pl011.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/pinctrl/broadcom/pinctrl-bcm283x.c b/drivers/pinctrl/broadcom/pinctrl-bcm283x.c +index 3be080d29e..1bb91d6eed 100644 +--- a/drivers/pinctrl/broadcom/pinctrl-bcm283x.c ++++ b/drivers/pinctrl/broadcom/pinctrl-bcm283x.c +@@ -148,7 +148,7 @@ U_BOOT_DRIVER(pinctrl_bcm283x) = { + .priv_auto_alloc_size = sizeof(struct bcm283x_pinctrl_priv), + .ops = &bcm283x_pinctrl_ops, + .probe = bcm283x_pinctl_probe, +-#if !CONFIG_IS_ENABLED(OF_CONTROL) ++#if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD) + .flags = DM_FLAG_PRE_RELOC, + #endif + }; +diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c +index bd1d89ec83..a6ffc84b96 100644 +--- a/drivers/serial/serial_bcm283x_mu.c ++++ b/drivers/serial/serial_bcm283x_mu.c +@@ -199,7 +199,7 @@ U_BOOT_DRIVER(serial_bcm283x_mu) = { + .platdata_auto_alloc_size = sizeof(struct bcm283x_mu_serial_platdata), + .probe = bcm283x_mu_serial_probe, + .ops = &bcm283x_mu_serial_ops, +-#if !CONFIG_IS_ENABLED(OF_CONTROL) ++#if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD) + .flags = DM_FLAG_PRE_RELOC, + #endif + .priv_auto_alloc_size = sizeof(struct bcm283x_mu_priv), +diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c +index 2527bb8b1c..7d8ab7b716 100644 +--- a/drivers/serial/serial_bcm283x_pl011.c ++++ b/drivers/serial/serial_bcm283x_pl011.c +@@ -90,7 +90,7 @@ U_BOOT_DRIVER(bcm283x_pl011_uart) = { + .platdata_auto_alloc_size = sizeof(struct pl01x_serial_platdata), + .probe = pl01x_serial_probe, + .ops = &bcm283x_pl011_serial_ops, +-#if !CONFIG_IS_ENABLED(OF_CONTROL) ++#if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD) + .flags = DM_FLAG_PRE_RELOC, + #endif + .priv_auto_alloc_size = sizeof(struct pl01x_priv), diff --git a/0017-pinctrl-bcm283x-Add-compatible-for-.patch b/0017-pinctrl-bcm283x-Add-compatible-for-.patch new file mode 100644 index 0000000..a920115 --- /dev/null +++ b/0017-pinctrl-bcm283x-Add-compatible-for-.patch @@ -0,0 +1,26 @@ +From 54f64870ec3aa2ed8d0b5694f1f3f8df5853ee95 Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Wed, 6 Nov 2019 15:28:25 +0100 +Subject: [PATCH] pinctrl: bcm283x: Add compatible for RPi4 + +The Raspberry Pi 4 upstream kernel device tree instroduces +a new compatible for the pinctroller. Add this to the driver +so that we can boot with the upstream kernel DT. + +Signed-off-by: Matthias Brugger +--- + drivers/pinctrl/broadcom/pinctrl-bcm283x.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pinctrl/broadcom/pinctrl-bcm283x.c b/drivers/pinctrl/broadcom/pinctrl-bcm283x.c +index 1bb91d6eed..eb720f09f8 100644 +--- a/drivers/pinctrl/broadcom/pinctrl-bcm283x.c ++++ b/drivers/pinctrl/broadcom/pinctrl-bcm283x.c +@@ -99,6 +99,7 @@ static int bcm283x_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, + + static const struct udevice_id bcm2835_pinctrl_id[] = { + {.compatible = "brcm,bcm2835-gpio"}, ++ {.compatible = "brcm,bcm2711-gpio"}, + {} + }; + diff --git a/0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch b/0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch new file mode 100644 index 0000000..4faed15 --- /dev/null +++ b/0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch @@ -0,0 +1,68 @@ +From 9dfd6a0669ac5e299229b90baaa27efe8cc8e927 Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Tue, 19 Nov 2019 16:01:02 +0100 +Subject: [PATCH] rpi: push fw_dtb_pointer in the .data section + +The fw_dtb_pointer was defined in the assembly code, which makes him +live in section .text_rest +Put that's not necessary, we can push the variable in the .data section. + +This will prevent relocation errors like: +board/raspberrypi/rpi/rpi.c:317:(.text.board_get_usable_ram_top+0x8): +relocation truncated to fit: R_AARCH64_LDST64_ABS_LO12_NC against symbol +`fw_dtb_pointer' defined in .text section in board/raspberrypi/rpi/built-in.o + +Signed-off-by: Matthias Brugger +--- + board/raspberrypi/rpi/lowlevel_init.S | 12 ++---------- + board/raspberrypi/rpi/rpi.c | 7 +++++-- + 2 files changed, 7 insertions(+), 12 deletions(-) + +diff --git a/board/raspberrypi/rpi/lowlevel_init.S b/board/raspberrypi/rpi/lowlevel_init.S +index 435eed521f..8c39b3e12e 100644 +--- a/board/raspberrypi/rpi/lowlevel_init.S ++++ b/board/raspberrypi/rpi/lowlevel_init.S +@@ -6,15 +6,6 @@ + + #include + +-.align 8 +-.global fw_dtb_pointer +-fw_dtb_pointer: +-#ifdef CONFIG_ARM64 +- .dword 0x0 +-#else +- .word 0x0 +-#endif +- + /* + * Routine: save_boot_params (called after reset from start.S) + * Description: save ATAG/FDT address provided by the firmware at boot time +@@ -28,7 +19,8 @@ save_boot_params: + adr x8, fw_dtb_pointer + str x0, [x8] + #else +- str r2, fw_dtb_pointer ++ ldr r8, =fw_dtb_pointer ++ str r2, [r8] + #endif + + /* Returns */ +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index 9e0abdda31..e84a1db14a 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -27,8 +27,11 @@ + + DECLARE_GLOBAL_DATA_PTR; + +-/* From lowlevel_init.S */ +-extern unsigned long fw_dtb_pointer; ++/* Assigned in lowlevel_init.S ++ * Push the variable into the .data section so that it ++ * does not get cleared later. ++ */ ++unsigned long __section(".data") fw_dtb_pointer; + + /* TODO(sjg@chromium.org): Move these to the msg.c file */ + struct msg_get_arm_mem { diff --git a/0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch b/0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch new file mode 100644 index 0000000..a6d824e --- /dev/null +++ b/0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch @@ -0,0 +1,232 @@ +From 3f5c91a5809b13ee0f2f75bda107398fede7536a Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Tue, 19 Nov 2019 16:01:03 +0100 +Subject: [PATCH] ARM: bcm283x: Move BCM283x_BASE to a global variable + +We move the per SOC define BCM283x_BASE to a global variable. +This is a first step to provide a single binary for several bcm283x +SoCs. + +Signed-off-by: Matthias Brugger +--- + arch/arm/mach-bcm283x/include/mach/base.h | 11 +++++++++++ + arch/arm/mach-bcm283x/include/mach/mbox.h | 4 +++- + arch/arm/mach-bcm283x/include/mach/sdhci.h | 5 ++++- + arch/arm/mach-bcm283x/include/mach/timer.h | 7 ++++++- + arch/arm/mach-bcm283x/include/mach/wdog.h | 5 ++++- + arch/arm/mach-bcm283x/init.c | 8 ++++++++ + arch/arm/mach-bcm283x/mbox.c | 1 + + arch/arm/mach-bcm283x/reset.c | 20 +++++++++++++++----- + include/configs/rpi.h | 4 ++++ + 9 files changed, 56 insertions(+), 9 deletions(-) + create mode 100644 arch/arm/mach-bcm283x/include/mach/base.h + +diff --git a/arch/arm/mach-bcm283x/include/mach/base.h b/arch/arm/mach-bcm283x/include/mach/base.h +new file mode 100644 +index 0000000000..c4ae39852f +--- /dev/null ++++ b/arch/arm/mach-bcm283x/include/mach/base.h +@@ -0,0 +1,11 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * (C) Copyright 2019 Matthias Brugger ++ */ ++ ++#ifndef _BCM283x_BASE_H_ ++#define _BCM283x_BASE_H_ ++ ++extern unsigned long rpi_bcm283x_base; ++ ++#endif +diff --git a/arch/arm/mach-bcm283x/include/mach/mbox.h b/arch/arm/mach-bcm283x/include/mach/mbox.h +index 0b6c2543d5..60e226ce1d 100644 +--- a/arch/arm/mach-bcm283x/include/mach/mbox.h ++++ b/arch/arm/mach-bcm283x/include/mach/mbox.h +@@ -7,6 +7,7 @@ + #define _BCM2835_MBOX_H + + #include ++#include + + /* + * The BCM2835 SoC contains (at least) two CPUs; the VideoCore (a/k/a "GPU") +@@ -37,7 +38,8 @@ + + /* Raw mailbox HW */ + +-#define BCM2835_MBOX_PHYSADDR (CONFIG_BCM283x_BASE + 0x0000b880) ++#define BCM2835_MBOX_PHYSADDR ({ BUG_ON(!rpi_bcm283x_base); \ ++ rpi_bcm283x_base + 0x0000b880; }) + + struct bcm2835_mbox_regs { + u32 read; +diff --git a/arch/arm/mach-bcm283x/include/mach/sdhci.h b/arch/arm/mach-bcm283x/include/mach/sdhci.h +index b443c379d8..7323690687 100644 +--- a/arch/arm/mach-bcm283x/include/mach/sdhci.h ++++ b/arch/arm/mach-bcm283x/include/mach/sdhci.h +@@ -6,7 +6,10 @@ + #ifndef _BCM2835_SDHCI_H_ + #define _BCM2835_SDHCI_H_ + +-#define BCM2835_SDHCI_BASE (CONFIG_BCM283x_BASE + 0x00300000) ++#include ++ ++#define BCM2835_SDHCI_PHYSADDR ({ BUG_ON(!rpi_bcm283x_base); \ ++ rpi_bcm283x_base + 0x00300000; }) + + int bcm2835_sdhci_init(u32 regbase, u32 emmc_freq); + +diff --git a/arch/arm/mach-bcm283x/include/mach/timer.h b/arch/arm/mach-bcm283x/include/mach/timer.h +index 014355e759..54f733a956 100644 +--- a/arch/arm/mach-bcm283x/include/mach/timer.h ++++ b/arch/arm/mach-bcm283x/include/mach/timer.h +@@ -6,7 +6,12 @@ + #ifndef _BCM2835_TIMER_H + #define _BCM2835_TIMER_H + +-#define BCM2835_TIMER_PHYSADDR (CONFIG_BCM283x_BASE + 0x00003000) ++#ifndef __ASSEMBLY__ ++#include ++#endif ++ ++#define BCM2835_TIMER_PHYSADDR ({ BUG_ON(!rpi_bcm283x_base); \ ++ rpi_bcm283x_base + 0x00003000; }) + + #define BCM2835_TIMER_CS_M3 (1 << 3) + #define BCM2835_TIMER_CS_M2 (1 << 2) +diff --git a/arch/arm/mach-bcm283x/include/mach/wdog.h b/arch/arm/mach-bcm283x/include/mach/wdog.h +index 8292b3cf1f..9942666720 100644 +--- a/arch/arm/mach-bcm283x/include/mach/wdog.h ++++ b/arch/arm/mach-bcm283x/include/mach/wdog.h +@@ -6,7 +6,10 @@ + #ifndef _BCM2835_WDOG_H + #define _BCM2835_WDOG_H + +-#define BCM2835_WDOG_PHYSADDR (CONFIG_BCM283x_BASE + 0x00100000) ++#include ++ ++#define BCM2835_WDOG_PHYSADDR ({ BUG_ON(!rpi_bcm283x_base); \ ++ rpi_bcm283x_base + 0x00100000; }) + + struct bcm2835_wdog_regs { + u32 unknown0[7]; +diff --git a/arch/arm/mach-bcm283x/init.c b/arch/arm/mach-bcm283x/init.c +index 97414415a6..d36017e823 100644 +--- a/arch/arm/mach-bcm283x/init.c ++++ b/arch/arm/mach-bcm283x/init.c +@@ -8,6 +8,8 @@ + + #include + ++unsigned long rpi_bcm283x_base; ++ + int arch_cpu_init(void) + { + icache_enable(); +@@ -15,6 +17,12 @@ int arch_cpu_init(void) + return 0; + } + ++int mach_cpu_init(void) ++{ ++ rpi_bcm283x_base = CONFIG_BCM283x_BASE; ++ ++ return 0; ++} + #ifdef CONFIG_ARMV7_LPAE + void enable_caches(void) + { +diff --git a/arch/arm/mach-bcm283x/mbox.c b/arch/arm/mach-bcm283x/mbox.c +index 3c67f68c17..467d0d5fba 100644 +--- a/arch/arm/mach-bcm283x/mbox.c ++++ b/arch/arm/mach-bcm283x/mbox.c +@@ -5,6 +5,7 @@ + + #include + #include ++#include + #include + #include + +diff --git a/arch/arm/mach-bcm283x/reset.c b/arch/arm/mach-bcm283x/reset.c +index b3da0c7cd6..cd8138d702 100644 +--- a/arch/arm/mach-bcm283x/reset.c ++++ b/arch/arm/mach-bcm283x/reset.c +@@ -8,6 +8,7 @@ + + #include + #include ++#include + #include + #include + +@@ -25,10 +26,10 @@ + + void hw_watchdog_disable(void) {} + +-__efi_runtime_data struct bcm2835_wdog_regs *wdog_regs = +- (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR; ++__efi_runtime_data struct bcm2835_wdog_regs *wdog_regs; + +-void __efi_runtime reset_cpu(ulong ticks) ++static void __efi_runtime ++__reset_cpu(struct bcm2835_wdog_regs *wdog_regs, ulong ticks) + { + uint32_t rstc, timeout; + +@@ -46,6 +47,14 @@ void __efi_runtime reset_cpu(ulong ticks) + writel(BCM2835_WDOG_PASSWORD | rstc, &wdog_regs->rstc); + } + ++void reset_cpu(ulong ticks) ++{ ++ struct bcm2835_wdog_regs *regs = ++ (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR; ++ ++ __reset_cpu(regs, 0); ++} ++ + #ifdef CONFIG_EFI_LOADER + + void __efi_runtime EFIAPI efi_reset_system( +@@ -58,7 +67,7 @@ void __efi_runtime EFIAPI efi_reset_system( + if (reset_type == EFI_RESET_COLD || + reset_type == EFI_RESET_WARM || + reset_type == EFI_RESET_PLATFORM_SPECIFIC) { +- reset_cpu(0); ++ __reset_cpu(wdog_regs, 0); + } else if (reset_type == EFI_RESET_SHUTDOWN) { + /* + * We set the watchdog hard reset bit here to distinguish this reset +@@ -69,7 +78,7 @@ void __efi_runtime EFIAPI efi_reset_system( + val |= BCM2835_WDOG_PASSWORD; + val |= BCM2835_WDOG_RSTS_RASPBERRYPI_HALT; + writel(val, &wdog_regs->rsts); +- reset_cpu(0); ++ __reset_cpu(wdog_regs, 0); + } + + while (1) { } +@@ -77,6 +86,7 @@ void __efi_runtime EFIAPI efi_reset_system( + + efi_status_t efi_reset_system_init(void) + { ++ wdog_regs = (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR; + return efi_add_runtime_mmio(&wdog_regs, sizeof(*wdog_regs)); + } + +diff --git a/include/configs/rpi.h b/include/configs/rpi.h +index 77d2d5458a..69b09f3f72 100644 +--- a/include/configs/rpi.h ++++ b/include/configs/rpi.h +@@ -9,6 +9,10 @@ + #include + #include + ++#ifndef __ASSEMBLY__ ++#include ++#endif ++ + #if defined(CONFIG_TARGET_RPI_2) || defined(CONFIG_TARGET_RPI_3_32B) + #define CONFIG_SKIP_LOWLEVEL_INIT + #endif diff --git a/0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch b/0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch new file mode 100644 index 0000000..98ec1bd --- /dev/null +++ b/0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch @@ -0,0 +1,71 @@ +From 068815ca7495a41e28b62e119e54e956eb7bc8d7 Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Tue, 19 Nov 2019 16:01:04 +0100 +Subject: [PATCH] ARM: bcm283x: Set rpi_bcm283x_base at run-time + +As part of the effort to create one binary for several bcm83x SoCs +we read the IO base address from device-tree. + +Signed-off-by: Matthias Brugger +--- + arch/arm/mach-bcm283x/Kconfig | 6 ------ + arch/arm/mach-bcm283x/init.c | 20 ++++++++++++++++++-- + 2 files changed, 18 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/mach-bcm283x/Kconfig b/arch/arm/mach-bcm283x/Kconfig +index b08275f598..e8e0ff0eb4 100644 +--- a/arch/arm/mach-bcm283x/Kconfig ++++ b/arch/arm/mach-bcm283x/Kconfig +@@ -202,10 +202,4 @@ config SYS_SOC + config SYS_CONFIG_NAME + default "rpi" + +-config BCM283x_BASE +- hex +- default "0x20000000" if BCM2835 +- default "0x3f000000" if BCM2836 || BCM2837 +- default "0xfe000000" if BCM2711 +- + endmenu +diff --git a/arch/arm/mach-bcm283x/init.c b/arch/arm/mach-bcm283x/init.c +index d36017e823..b3f3dfabea 100644 +--- a/arch/arm/mach-bcm283x/init.c ++++ b/arch/arm/mach-bcm283x/init.c +@@ -7,8 +7,10 @@ + */ + + #include ++#include ++#include + +-unsigned long rpi_bcm283x_base; ++unsigned long rpi_bcm283x_base = 0x3f000000; + + int arch_cpu_init(void) + { +@@ -19,10 +21,24 @@ int arch_cpu_init(void) + + int mach_cpu_init(void) + { +- rpi_bcm283x_base = CONFIG_BCM283x_BASE; ++ int ret, soc_offset; ++ u64 io_base, size; ++ ++ /* Get IO base from device tree */ ++ soc_offset = fdt_path_offset(gd->fdt_blob, "/soc"); ++ if (soc_offset < 0) ++ return soc_offset; ++ ++ ret = fdt_read_range((void *)gd->fdt_blob, soc_offset, 0, NULL, ++ &io_base, &size); ++ if (ret) ++ return ret; ++ ++ rpi_bcm283x_base = io_base; + + return 0; + } ++ + #ifdef CONFIG_ARMV7_LPAE + void enable_caches(void) + { diff --git a/0021-ARM-bcm283x-Set-memory-map-at-run-t.patch b/0021-ARM-bcm283x-Set-memory-map-at-run-t.patch new file mode 100644 index 0000000..b131043 --- /dev/null +++ b/0021-ARM-bcm283x-Set-memory-map-at-run-t.patch @@ -0,0 +1,181 @@ +From 2954695f440f60b19f379e83b950031fcbacfb2f Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Tue, 19 Nov 2019 16:01:05 +0100 +Subject: [PATCH] ARM: bcm283x: Set memory map at run-time + +For bcm283x based on arm64 we also have to change the mm_region. +Add assign this in mach_cpu_init() so we can create now one binary +for RPi3 and RPi4. + +Signed-off-by: Matthias Brugger +--- + arch/arm/mach-bcm283x/init.c | 92 ++++++++++++++++++++++++++++++++++++ + board/raspberrypi/rpi/rpi.c | 45 ------------------ + 2 files changed, 92 insertions(+), 45 deletions(-) + +diff --git a/arch/arm/mach-bcm283x/init.c b/arch/arm/mach-bcm283x/init.c +index b3f3dfabea..6fb41a99b2 100644 +--- a/arch/arm/mach-bcm283x/init.c ++++ b/arch/arm/mach-bcm283x/init.c +@@ -10,6 +10,96 @@ + #include + #include + ++#ifdef CONFIG_ARM64 ++#include ++ ++static struct mm_region bcm283x_mem_map[] = { ++ { ++ .virt = 0x00000000UL, ++ .phys = 0x00000000UL, ++ .size = 0x3f000000UL, ++ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | ++ PTE_BLOCK_INNER_SHARE ++ }, { ++ .virt = 0x3f000000UL, ++ .phys = 0x3f000000UL, ++ .size = 0x01000000UL, ++ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | ++ PTE_BLOCK_NON_SHARE | ++ PTE_BLOCK_PXN | PTE_BLOCK_UXN ++ }, { ++ /* List terminator */ ++ 0, ++ } ++}; ++ ++static struct mm_region bcm2711_mem_map[] = { ++ { ++ .virt = 0x00000000UL, ++ .phys = 0x00000000UL, ++ .size = 0xfe000000UL, ++ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | ++ PTE_BLOCK_INNER_SHARE ++ }, { ++ .virt = 0xfe000000UL, ++ .phys = 0xfe000000UL, ++ .size = 0x01800000UL, ++ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | ++ PTE_BLOCK_NON_SHARE | ++ PTE_BLOCK_PXN | PTE_BLOCK_UXN ++ }, { ++ /* List terminator */ ++ 0, ++ } ++}; ++ ++struct mm_region *mem_map = bcm283x_mem_map; ++ ++/* ++ * I/O address space varies on different chip versions. ++ * We set the base address by inspecting the DTB. ++ */ ++static const struct udevice_id board_ids[] = { ++ { .compatible = "brcm,bcm2837", .data = (ulong)&bcm283x_mem_map}, ++ { .compatible = "brcm,bcm2838", .data = (ulong)&bcm2711_mem_map}, ++ { .compatible = "brcm,bcm2711", .data = (ulong)&bcm2711_mem_map}, ++ { }, ++}; ++ ++static void _rpi_update_mem_map(struct mm_region *pd) ++{ ++ int i; ++ ++ for (i = 0; i < 2; i++) { ++ mem_map[i].virt = pd[i].virt; ++ mem_map[i].phys = pd[i].phys; ++ mem_map[i].size = pd[i].size; ++ mem_map[i].attrs = pd[i].attrs; ++ } ++} ++ ++static void rpi_update_mem_map(void) ++{ ++ int ret; ++ struct mm_region *mm; ++ const struct udevice_id *of_match = board_ids; ++ ++ while (of_match->compatible) { ++ ret = fdt_node_check_compatible(gd->fdt_blob, 0, ++ of_match->compatible); ++ if (!ret) { ++ mm = (struct mm_region *)of_match->data; ++ _rpi_update_mem_map(mm); ++ break; ++ } ++ ++ of_match++; ++ } ++} ++#else ++static void rpi_update_mem_map(void) {} ++#endif ++ + unsigned long rpi_bcm283x_base = 0x3f000000; + + int arch_cpu_init(void) +@@ -24,6 +114,8 @@ int mach_cpu_init(void) + int ret, soc_offset; + u64 io_base, size; + ++ rpi_update_mem_map(); ++ + /* Get IO base from device tree */ + soc_offset = fdt_path_offset(gd->fdt_blob, "/soc"); + if (soc_offset < 0) +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index e84a1db14a..3d4afaf653 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -251,51 +251,6 @@ static uint32_t rev_scheme; + static uint32_t rev_type; + static const struct rpi_model *model; + +-#ifdef CONFIG_ARM64 +-#ifndef CONFIG_BCM2711 +-static struct mm_region bcm283x_mem_map[] = { +- { +- .virt = 0x00000000UL, +- .phys = 0x00000000UL, +- .size = 0x3f000000UL, +- .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | +- PTE_BLOCK_INNER_SHARE +- }, { +- .virt = 0x3f000000UL, +- .phys = 0x3f000000UL, +- .size = 0x01000000UL, +- .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | +- PTE_BLOCK_NON_SHARE | +- PTE_BLOCK_PXN | PTE_BLOCK_UXN +- }, { +- /* List terminator */ +- 0, +- } +-}; +-#else +-static struct mm_region bcm283x_mem_map[] = { +- { +- .virt = 0x00000000UL, +- .phys = 0x00000000UL, +- .size = 0xfe000000UL, +- .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | +- PTE_BLOCK_INNER_SHARE +- }, { +- .virt = 0xfe000000UL, +- .phys = 0xfe000000UL, +- .size = 0x01800000UL, +- .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | +- PTE_BLOCK_NON_SHARE | +- PTE_BLOCK_PXN | PTE_BLOCK_UXN +- }, { +- /* List terminator */ +- 0, +- } +-}; +-#endif +-struct mm_region *mem_map = bcm283x_mem_map; +-#endif +- + int dram_init(void) + { + ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1); diff --git a/0022-ARM-defconfig-add-unified-config-fo.patch b/0022-ARM-defconfig-add-unified-config-fo.patch new file mode 100644 index 0000000..ab3b7d7 --- /dev/null +++ b/0022-ARM-defconfig-add-unified-config-fo.patch @@ -0,0 +1,86 @@ +From 51b57e87c48f5a75971817ae80a2fd113f26da74 Mon Sep 17 00:00:00 2001 +From: Matthias Brugger +Date: Wed, 6 Nov 2019 15:41:03 +0100 +Subject: [PATCH] ARM: defconfig: add unified config for RPi3 and RPi4 + +Provide a defconfig which allows us to boot Raspberrry Pi 4 +and Raspberry Pi 3 Model B/B+ +Instead of using the embedded DTB as done in RPi3 we use the +devicetree provided by the firmware. + +Signed-off-by: Matthias Brugger +--- + arch/arm/mach-bcm283x/Kconfig | 7 ++++++ + configs/rpi_arm64_defconfig | 45 +++++++++++++++++++++++++++++++++++ + 2 files changed, 52 insertions(+) + create mode 100644 configs/rpi_arm64_defconfig + +diff --git a/arch/arm/mach-bcm283x/Kconfig b/arch/arm/mach-bcm283x/Kconfig +index e8e0ff0eb4..00419bf254 100644 +--- a/arch/arm/mach-bcm283x/Kconfig ++++ b/arch/arm/mach-bcm283x/Kconfig +@@ -188,6 +188,13 @@ config TARGET_RPI_4 + This option creates a build targeting the ARMv8/AArch64 ISA. + select BCM2711_64B + ++config TARGET_RPI_ARM64 ++ bool "Raspberry Pi one binary 64-bit build" ++ help ++ Support for all armv8 based Raspberry Pi variants, such as ++ the RPi 4 model B, in AArch64 (64-bit) mode. ++ select ARM64 ++ + endchoice + + config SYS_BOARD +diff --git a/configs/rpi_arm64_defconfig b/configs/rpi_arm64_defconfig +new file mode 100644 +index 0000000000..f4e113f58c +--- /dev/null ++++ b/configs/rpi_arm64_defconfig +@@ -0,0 +1,45 @@ ++CONFIG_ARM=y ++CONFIG_ARM64=y ++CONFIG_TARGET_RPI_ARM64=y ++CONFIG_ARCH_BCM283X=y ++CONFIG_SYS_TEXT_BASE=0x00080000 ++CONFIG_SYS_MALLOC_F_LEN=0x2000 ++CONFIG_DISTRO_DEFAULTS=y ++CONFIG_NR_DRAM_BANKS=2 ++CONFIG_OF_BOARD_SETUP=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="usb start" ++CONFIG_MISC_INIT_R=y ++# CONFIG_DISPLAY_CPUINFO is not set ++# CONFIG_DISPLAY_BOARDINFO is not set ++CONFIG_SYS_PROMPT="U-Boot> " ++# CONFIG_CMD_FLASH is not set ++CONFIG_CMD_GPIO=y ++CONFIG_CMD_MMC=y ++CONFIG_CMD_USB=y ++CONFIG_CMD_FS_UUID=y ++CONFIG_OF_BOARD=y ++CONFIG_ENV_FAT_INTERFACE="mmc" ++CONFIG_ENV_FAT_DEVICE_AND_PART="0:1" ++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y ++CONFIG_DM_KEYBOARD=y ++CONFIG_DM_MMC=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_BCM2835=y ++CONFIG_PHYLIB=y ++CONFIG_DM_ETH=y ++CONFIG_PINCTRL=y ++# CONFIG_PINCTRL_GENERIC is not set ++# CONFIG_REQUIRE_SERIAL_CONSOLE is not set ++CONFIG_USB=y ++CONFIG_DM_USB=y ++CONFIG_USB_DWC2=y ++CONFIG_USB_KEYBOARD=y ++CONFIG_USB_HOST_ETHER=y ++CONFIG_USB_ETHER_LAN78XX=y ++CONFIG_USB_ETHER_SMSC95XX=y ++CONFIG_DM_VIDEO=y ++CONFIG_SYS_WHITE_ON_BLACK=y ++CONFIG_CONSOLE_SCROLL_LINES=10 ++CONFIG_PHYS_TO_BUS=y ++CONFIG_OF_LIBFDT_OVERLAY=y diff --git a/_multibuild b/_multibuild index ac2866e..b770d94 100644 --- a/_multibuild +++ b/_multibuild @@ -71,6 +71,7 @@ rpi2 rpi3 rpi4 + rpiarm64 sifivefu540 snow socfpgade0nanosoc diff --git a/u-boot.changes b/u-boot.changes index 220bdbc..11145f3 100644 --- a/u-boot.changes +++ b/u-boot.changes @@ -1,3 +1,29 @@ +------------------------------------------------------------------- +Wed Nov 20 14:16:24 UTC 2019 - Matthias Brugger + +- enable build for one U-Boot image for RPi3/4 (rpiarm64) + implements (jsc#59185) + +------------------------------------------------------------------- +Wed Nov 20 14:16:11 UTC 2019 - Matthias Brugger + +Patch queue updated from git://github.com/openSUSE/u-boot.git tumbleweed-2019.10 +* Patches added: + 0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch + 0015-arm-dts-bcm283x-Rename-U-Boot-file.patch + 0016-drivers-bcm283x-Set-pre-location-fl.patch + 0017-pinctrl-bcm283x-Add-compatible-for-.patch + 0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch + 0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch + 0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch + 0021-ARM-bcm283x-Set-memory-map-at-run-t.patch + 0022-ARM-defconfig-add-unified-config-fo.patch + +------------------------------------------------------------------- +Wed Nov 20 13:20:15 UTC 2019 - Matthias Brugger + +- RPi3 delete text base hack in spec file + ------------------------------------------------------------------- Tue Nov 19 16:23:31 UTC 2019 - Andreas Schwab diff --git a/u-boot.spec b/u-boot.spec index bfa0696..be93ddc 100644 --- a/u-boot.spec +++ b/u-boot.spec @@ -74,7 +74,7 @@ BuildRequires: %prjconf_multibuild_selection %define is_riscv64 0 %define tools_only 0 -%if "%target" == "rpi" || "%target" == "rpi2" || "%target" == "rpi3" || "%target" == "rpi4" +%if "%target" == "rpi" || "%target" == "rpi2" || "%target" == "rpi3" || "%target" == "rpi4" || "%target" == "rpiarm64" %define is_rpi 1 %if "%target" == "rpi" %define is_armv6 1 @@ -82,7 +82,7 @@ BuildRequires: %prjconf_multibuild_selection %if "%target" == "rpi2" %define is_armv7 1 %endif -%if "%target" == "rpi3" || "%target" == "rpi4" +%if "%target" == "rpi3" || "%target" == "rpi4" || "%target" == "rpiarm64" %define is_armv8 1 %endif %endif @@ -235,6 +235,15 @@ Patch0010: 0010-libfdt-return-correct-value-if-size.patch Patch0011: 0011-libfdt-Allow-size-cells-of-0.patch Patch0012: 0012-dm-Fix-default-address-cells-return.patch Patch0013: 0013-arm-arm11-allow-unaligned-memory-ac.patch +Patch0014: 0014-fdt-fix-bcm283x-dm-pre-reloc-defini.patch +Patch0015: 0015-arm-dts-bcm283x-Rename-U-Boot-file.patch +Patch0016: 0016-drivers-bcm283x-Set-pre-location-fl.patch +Patch0017: 0017-pinctrl-bcm283x-Add-compatible-for-.patch +Patch0018: 0018-rpi-push-fw_dtb_pointer-in-the-.dat.patch +Patch0019: 0019-ARM-bcm283x-Move-BCM283x_BASE-to-a-.patch +Patch0020: 0020-ARM-bcm283x-Set-rpi_bcm283x_base-at.patch +Patch0021: 0021-ARM-bcm283x-Set-memory-map-at-run-t.patch +Patch0022: 0022-ARM-defconfig-add-unified-config-fo.patch # Patches: end BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: pkgconfig(sdl) @@ -298,6 +307,13 @@ Provides: am335x_boneblack Obsoletes: Sinovoip_BPI_M2_Plus Provides: Sinovoip_BPI_M2_Plus %endif +%if "%{name}" == "u-boot-rpiarm64" +# Provides one u-boot image for both RPi3 and RPi4 +Obsoletes: u-boot-rpi3 < %{version} +Provides: u-boot-rpi3 = %{version} +Obsoletes: u-boot-rpi4 < %{version} +Provides: u-boot-rpi4 = %{version} +%endif %if "%{target}" == "" ExclusiveArch: do_not_build @@ -390,10 +406,6 @@ confname=$(ls configs | perl -ne '$l=lc; $l=~ s,_,,g; $l eq "%{target}defconfig\ make %{?_smp_mflags} CROSS_COMPILE= HOSTCFLAGS="$RPM_OPT_FLAGS" $confname echo "Attempting to enable fdt apply command (.dtbo) support." echo "CONFIG_OF_LIBFDT_OVERLAY=y" >> .config -%if "%target" == "rpi3" -echo "Tweaking text base for TF-A." -echo "CONFIG_SYS_TEXT_BASE=0x11000000" >> .config -%endif make %{?_smp_mflags} CROSS_COMPILE= HOSTCFLAGS="$RPM_OPT_FLAGS" \ %if ("%{name}" == "u-boot-rock64-rk3328" || "%{name}" == "u-boot-evb-rk3399" || "%{name}" == "u-boot-firefly-rk3399" || "%{name}" == "u-boot-rock-pi-4-rk3399") && %{with uboot_atf} all u-boot.itb @@ -492,10 +504,6 @@ install -D -m 0644 u-boot-with-spl.sfp %{buildroot}%{uboot_dir}/u-boot-with-spl. %if "%{name}" == "u-boot-zynqzturn" install -D -m 0644 spl/boot.bin %{buildroot}%{uboot_dir}/boot.bin %endif -%if "%{name}" == "u-boot-rpi3" -echo -e "# Boot in AArch64 mode\narm_control=0x200" > %{buildroot}%{uboot_dir}/ubootconfig.txt -echo -e "\nkernel_address=0x11000000" >> %{buildroot}%{uboot_dir}/ubootconfig.txt -%endif %if 0%{?is_rpi} %post