mirror of
https://github.com/home-assistant/operating-system.git
synced 2025-07-24 13:36:31 +00:00
Update and rename 0002-rpi-add-revision-IDs-for-Pi-3-Model-B-and-Pi-Zero.patch to 0002-safely-switch-from-HYP-to-SVC-mode-if-required.patch
This commit is contained in:
parent
0a65fd2e09
commit
2be580880d
@ -1,137 +0,0 @@
|
||||
This adds basic support at the same feature level as the other
|
||||
supported raspberry pi boards.
|
||||
|
||||
Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
|
||||
Tested-by: Roland Hieber <r.hieber at pengutronix.de>
|
||||
---
|
||||
arch/arm/boards/raspberry-pi/lowlevel.c | 14 ++++++++++++--
|
||||
arch/arm/configs/rpi_defconfig | 2 ++
|
||||
arch/arm/dts/Makefile | 1 +
|
||||
arch/arm/dts/bcm2837-rpi-3.dts | 15 +++++++++++++++
|
||||
arch/arm/mach-bcm283x/Kconfig | 6 ++++++
|
||||
arch/arm/mach-bcm283x/core.c | 1 +
|
||||
images/Makefile.bcm283x | 4 ++++
|
||||
7 files changed, 41 insertions(+), 2 deletions(-)
|
||||
create mode 100644 arch/arm/dts/bcm2837-rpi-3.dts
|
||||
|
||||
diff --git a/arch/arm/boards/raspberry-pi/lowlevel.c b/arch/arm/boards/raspberry-pi/lowlevel.c
|
||||
index 4e71e29e0c0b..5ca0d3877069 100644
|
||||
--- a/arch/arm/boards/raspberry-pi/lowlevel.c
|
||||
+++ b/arch/arm/boards/raspberry-pi/lowlevel.c
|
||||
@@ -1,7 +1,7 @@
|
||||
+#include <asm/barebox-arm.h>
|
||||
+#include <asm/cache.h>
|
||||
#include <common.h>
|
||||
#include <linux/sizes.h>
|
||||
-#include <asm/barebox-arm.h>
|
||||
-#include <asm/barebox-arm-head.h>
|
||||
#include <mach/platform.h>
|
||||
|
||||
extern char __dtb_bcm2835_rpi_start[];
|
||||
@@ -23,3 +23,13 @@ ENTRY_FUNCTION(start_raspberry_pi2, r0, r1, r2)
|
||||
|
||||
barebox_arm_entry(BCM2835_SDRAM_BASE, SZ_512M, fdt);
|
||||
}
|
||||
+
|
||||
+extern char __dtb_bcm2837_rpi_3_start[];
|
||||
+ENTRY_FUNCTION(start_raspberry_pi3, r0, r1, r2)
|
||||
+{
|
||||
+ void *fdt = __dtb_bcm2837_rpi_3_start - get_runtime_offset();
|
||||
+
|
||||
+ arm_cpu_lowlevel_init();
|
||||
+
|
||||
+ barebox_arm_entry(BCM2835_SDRAM_BASE, SZ_512M, fdt);
|
||||
+}
|
||||
diff --git a/arch/arm/configs/rpi_defconfig b/arch/arm/configs/rpi_defconfig
|
||||
index f3aef4290425..cd88b4ac751c 100644
|
||||
--- a/arch/arm/configs/rpi_defconfig
|
||||
+++ b/arch/arm/configs/rpi_defconfig
|
||||
@@ -1,9 +1,11 @@
|
||||
CONFIG_ARCH_BCM283X=y
|
||||
CONFIG_MACH_RPI=y
|
||||
CONFIG_MACH_RPI2=y
|
||||
+CONFIG_MACH_RPI3=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
+CONFIG_IMAGE_COMPRESSION_NONE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_MALLOC_TLSF=y
|
||||
CONFIG_KALLSYMS=y
|
||||
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
|
||||
index 0526a6f40724..0eab313c5011 100644
|
||||
--- a/arch/arm/dts/Makefile
|
||||
+++ b/arch/arm/dts/Makefile
|
||||
@@ -66,6 +66,7 @@ pbl-dtb-$(CONFIG_MACH_PHYTEC_SOM_RK3288) += rk3288-phycore-som.dtb.o
|
||||
pbl-dtb-$(CONFIG_MACH_REALQ7) += imx6q-dmo-edmqmx6.dtb.o
|
||||
pbl-dtb-$(CONFIG_MACH_RPI) += bcm2835-rpi.dtb.o
|
||||
pbl-dtb-$(CONFIG_MACH_RPI2) += bcm2836-rpi-2.dtb.o
|
||||
+pbl-dtb-$(CONFIG_MACH_RPI3) += bcm2837-rpi-3.dtb.o
|
||||
pbl-dtb-$(CONFIG_MACH_SABRELITE) += imx6q-sabrelite.dtb.o imx6dl-sabrelite.dtb.o
|
||||
pbl-dtb-$(CONFIG_MACH_SABRESD) += imx6q-sabresd.dtb.o
|
||||
pbl-dtb-$(CONFIG_MACH_FREESCALE_IMX6SX_SABRESDB) += imx6sx-sdb.dtb.o
|
||||
diff --git a/arch/arm/dts/bcm2837-rpi-3.dts b/arch/arm/dts/bcm2837-rpi-3.dts
|
||||
new file mode 100644
|
||||
index 000000000000..f8c58c570137
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/dts/bcm2837-rpi-3.dts
|
||||
@@ -0,0 +1,15 @@
|
||||
+#include <arm64/broadcom/bcm2837-rpi-3-b.dts>
|
||||
+
|
||||
+/ {
|
||||
+ chosen {
|
||||
+ stdout-path = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x0 0x0>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
diff --git a/arch/arm/mach-bcm283x/Kconfig b/arch/arm/mach-bcm283x/Kconfig
|
||||
index 1457f114ccaa..af2f88c47acb 100644
|
||||
--- a/arch/arm/mach-bcm283x/Kconfig
|
||||
+++ b/arch/arm/mach-bcm283x/Kconfig
|
||||
@@ -19,6 +19,12 @@ config MACH_RPI2
|
||||
select CPU_V7
|
||||
select MACH_RPI_COMMON
|
||||
|
||||
+config MACH_RPI3
|
||||
+ bool "RaspberryPi 3 (BCM2837/CORTEX-A53)"
|
||||
+ select CPU_V7
|
||||
+ select MACH_RPI_COMMON
|
||||
+ select ARM_SECURE_MONITOR
|
||||
+
|
||||
endmenu
|
||||
|
||||
config MACH_RPI_DEBUG_UART_BASE
|
||||
diff --git a/arch/arm/mach-bcm283x/core.c b/arch/arm/mach-bcm283x/core.c
|
||||
index fddcb0d1a1d4..26f0996b1cb8 100644
|
||||
--- a/arch/arm/mach-bcm283x/core.c
|
||||
+++ b/arch/arm/mach-bcm283x/core.c
|
||||
@@ -41,6 +41,7 @@ static int bcm2835_clk_init(void)
|
||||
clk = clk_fixed("uart0-pl0110", 3 * 1000 * 1000);
|
||||
clk_register_clkdev(clk, NULL, "uart0-pl0110");
|
||||
clk_register_clkdev(clk, NULL, "20201000.serial");
|
||||
+ clk_register_clkdev(clk, NULL, "3f201000.serial");
|
||||
|
||||
clk = clk_fixed("bcm2835-cs", 1 * 1000 * 1000);
|
||||
clk_register_clkdev(clk, NULL, "bcm2835-cs");
|
||||
diff --git a/images/Makefile.bcm283x b/images/Makefile.bcm283x
|
||||
index d59ef043f05c..d14e648926ac 100644
|
||||
--- a/images/Makefile.bcm283x
|
||||
+++ b/images/Makefile.bcm283x
|
||||
@@ -9,3 +9,7 @@ image-$(CONFIG_MACH_RPI) += barebox-raspberry-pi-1.img
|
||||
pblx-$(CONFIG_MACH_RPI2) += start_raspberry_pi2
|
||||
FILE_barebox-raspberry-pi-2.img = start_raspberry_pi2.pblx
|
||||
image-$(CONFIG_MACH_RPI2) += barebox-raspberry-pi-2.img
|
||||
+
|
||||
+pblx-$(CONFIG_MACH_RPI3) += start_raspberry_pi3
|
||||
+FILE_barebox-raspberry-pi-3.img = start_raspberry_pi3.pblx
|
||||
+image-$(CONFIG_MACH_RPI3) += barebox-raspberry-pi-3.img
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.16.1
|
@ -0,0 +1,85 @@
|
||||
This is a port of the Linux safe_svcmode_maskall macro to
|
||||
the Barebox lowlevel init.
|
||||
|
||||
Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
|
||||
---
|
||||
arch/arm/cpu/lowlevel.S | 20 ++++++++++++++++----
|
||||
arch/arm/include/asm/system.h | 26 ++++++++++++++++++++++++++
|
||||
2 files changed, 42 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/cpu/lowlevel.S b/arch/arm/cpu/lowlevel.S
|
||||
index 7696a198e764..194ce0e7c274 100644
|
||||
--- a/arch/arm/cpu/lowlevel.S
|
||||
+++ b/arch/arm/cpu/lowlevel.S
|
||||
@@ -1,16 +1,28 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <init.h>
|
||||
#include <asm/system.h>
|
||||
+#include <asm/opcodes-virt.h>
|
||||
|
||||
.section ".text_bare_init_","ax"
|
||||
ENTRY(arm_cpu_lowlevel_init)
|
||||
/* save lr, since it may be banked away with a processor mode change */
|
||||
mov r2, lr
|
||||
+
|
||||
/* set the cpu to SVC32 mode, mask irq and fiq */
|
||||
- mrs r12, cpsr
|
||||
- bic r12, r12, #0x1f
|
||||
- orr r12, r12, #0xd3
|
||||
- msr cpsr, r12
|
||||
+ mrs r12 , cpsr
|
||||
+ eor r12, r12, #HYP_MODE
|
||||
+ tst r12, #MODE_MASK
|
||||
+ bic r12 , r12 , #MODE_MASK
|
||||
+ orr r12 , r12 , #(PSR_I_BIT | PSR_F_BIT | SVC_MODE)
|
||||
+THUMB( orr r12 , r12 , #PSR_T_BIT )
|
||||
+ bne 1f
|
||||
+ orr r12, r12, #PSR_A_BIT
|
||||
+ adr lr, 2f
|
||||
+ msr spsr_cxsf, r12
|
||||
+ __MSR_ELR_HYP(14)
|
||||
+ __ERET
|
||||
+1: msr cpsr_c, r12
|
||||
+2:
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
/*
|
||||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h
|
||||
index 57c76186b499..55e0f4090295 100644
|
||||
--- a/arch/arm/include/asm/system.h
|
||||
+++ b/arch/arm/include/asm/system.h
|
||||
@@ -60,6 +60,32 @@
|
||||
#define CR_AFE (1 << 29) /* Access flag enable */
|
||||
#define CR_TE (1 << 30) /* Thumb exception enable */
|
||||
|
||||
+/*
|
||||
+ * PSR bits
|
||||
+ */
|
||||
+#define USR_MODE 0x00000010
|
||||
+#define FIQ_MODE 0x00000011
|
||||
+#define IRQ_MODE 0x00000012
|
||||
+#define SVC_MODE 0x00000013
|
||||
+#define ABT_MODE 0x00000017
|
||||
+#define HYP_MODE 0x0000001a
|
||||
+#define UND_MODE 0x0000001b
|
||||
+#define SYSTEM_MODE 0x0000001f
|
||||
+#define MODE32_BIT 0x00000010
|
||||
+#define MODE_MASK 0x0000001f
|
||||
+
|
||||
+#define PSR_T_BIT 0x00000020
|
||||
+#define PSR_F_BIT 0x00000040
|
||||
+#define PSR_I_BIT 0x00000080
|
||||
+#define PSR_A_BIT 0x00000100
|
||||
+#define PSR_E_BIT 0x00000200
|
||||
+#define PSR_J_BIT 0x01000000
|
||||
+#define PSR_Q_BIT 0x08000000
|
||||
+#define PSR_V_BIT 0x10000000
|
||||
+#define PSR_C_BIT 0x20000000
|
||||
+#define PSR_Z_BIT 0x40000000
|
||||
+#define PSR_N_BIT 0x80000000
|
||||
+
|
||||
#ifndef __ASSEMBLY__
|
||||
#if __LINUX_ARM_ARCH__ >= 7
|
||||
static inline unsigned int current_el(void)
|
||||
--
|
||||
2.15.1
|
Loading…
x
Reference in New Issue
Block a user