Skip to contentSkip to conversation

ARM: arch-meson: build memory banks using reported memory from registers

PATCH New Neil Armstrong 3 participants 3 messages Nov 27, 2017 – Dec 4, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 ARM: arch-meson: build memory banks using reported memory from registers

As discussed at [1], the Amlogic Meson GX SoCs can embed a BL31 firmware and a secondary BL32 firmware.
Since mid-2017, the reserved memory address of the BL31 firmware was moved and grown for security reasons.

But mainline U-Boot and Linux has the old address and size fixed.

These SoCs have a register interface to get the two firmware reserved memory start and sizes.

This patch adds a dynamic reservation of the memory zones in the device tree bootmem reserved memory zone used by the kernel in early boot.
To be complete, the memory zones are also added to the EFI reserved zones.

Depends on patchset "Add support for Amlogic GXL Based SBCs" at [2].

[1] http://lists.infradead.org/pipermail/linux-amlogic/2017-October/004860.html
[2] http://lists.infradead.org/pipermail/linux-amlogic/2017-November/005410.html

Changes since v1:
- switched the #if to if(IS_ENABLED()) to compile all code paths
- renamed function to meson_board_add_reserved_memory()
- added a mem.h header with comment
- updated all boards ft_board_setup()

Changes since RFC v2:
- reduced preprocessor load
- kept Odroid-C2 static memory mapping as exception

Changes since RFC v1:
- switch to fdt rsv mem table and efi reserve memory
- replaced in_le32 by readl()

---
 arch/arm/include/asm/arch-meson/gxbb.h    | 17 +++++++
 arch/arm/include/asm/arch-meson/mem.h     | 16 +++++++
 arch/arm/mach-meson/board.c               | 74 +++++++++++++++++++++++++++----
 board/amlogic/khadas-vim/khadas-vim.c     |  7 +++
 board/amlogic/libretech-cc/libretech-cc.c |  8 ++++
 board/amlogic/odroid-c2/odroid-c2.c       |  8 ++++
 board/amlogic/p212/p212.c                 |  8 ++++
 configs/khadas-vim_defconfig              |  1 +
 configs/libretech-cc_defconfig            |  1 +
 configs/odroid-c2_defconfig               |  1 +
 configs/p212_defconfig                    |  1 +
 include/configs/meson-gxbb-common.h       |  2 +-
 12 files changed, 135 insertions(+), 9 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-meson/mem.h
arch/arm/include/asm/arch-meson/gxbb.h +17 -0
index 95a6fe6..ef63dea 100644
@@ -7,10 +7,27 @@
 #ifndef __GXBB_H__
 #define __GXBB_H__
 
+#define GXBB_FIRMWARE_MEM_SIZE	0x1000000
+
+#define GXBB_AOBUS_BASE		0xc8100000
 #define GXBB_PERIPHS_BASE	0xc8834400
 #define GXBB_HIU_BASE		0xc883c000
 #define GXBB_ETH_BASE		0xc9410000
 
+/* Always-On Peripherals registers */
+#define GXBB_AO_ADDR(off)	(GXBB_AOBUS_BASE + ((off) << 2))
+
+#define GXBB_AO_SEC_GP_CFG0	GXBB_AO_ADDR(0x90)
+#define GXBB_AO_SEC_GP_CFG3	GXBB_AO_ADDR(0x93)
+#define GXBB_AO_SEC_GP_CFG4	GXBB_AO_ADDR(0x94)
+#define GXBB_AO_SEC_GP_CFG5	GXBB_AO_ADDR(0x95)
+
+#define GXBB_AO_MEM_SIZE_MASK	0xFFFF0000
+#define GXBB_AO_MEM_SIZE_SHIFT	16
+#define GXBB_AO_BL31_RSVMEM_SIZE_MASK	0xFFFF0000
+#define GXBB_AO_BL31_RSVMEM_SIZE_SHIFT	16
+#define GXBB_AO_BL32_RSVMEM_SIZE_MASK	0xFFFF
+
 /* Peripherals registers */
 #define GXBB_PERIPHS_ADDR(off)	(GXBB_PERIPHS_BASE + ((off) << 2))
 
arch/arm/include/asm/arch-meson/mem.h new file +16 -0
new file mode 100644
index 0000000..86a8417
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2016 BayLibre, SAS
+ * Author: Neil Armstrong <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __MESON_MEM_H__
+#define __MESON_MEM_H__
+
+/* Configure the reserved memory zones exported by the secure registers
+ * into EFI and DTB reserved memory entries.
+ */
+void meson_gx_init_reserved_memory(void *fdt);
+
+#endif /* __MESON_MEM_H__ */
arch/arm/mach-meson/board.c +66 -8

87 lines not on this page · raw message

board/amlogic/khadas-vim/khadas-vim.c +7 -0
index db9c292..6baf322 100644
@@ -47,3 +47,10 @@ int misc_init_r(void)
 
 	return 0;
 }
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+	meson_gx_init_reserved_memory(blob);
+
+	return 0;
+}
board/amlogic/libretech-cc/libretech-cc.c +8 -0
index 26c0e78..6be6e2a 100644
@@ -11,6 +11,7 @@
 #include <asm/arch/gxbb.h>
 #include <asm/arch/sm.h>
 #include <asm/arch/eth.h>
+#include <asm/arch/mem.h>
 
 #define EFUSE_SN_OFFSET		20
 #define EFUSE_SN_SIZE		16
@@ -51,3 +52,10 @@ int misc_init_r(void)
 
 	return 0;
 }
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+	meson_gx_init_reserved_memory(blob);
+
+	return 0;
+}
board/amlogic/odroid-c2/odroid-c2.c +8 -0
index d68d0f1..0cb5714 100644
@@ -10,6 +10,7 @@
 #include <asm/arch/gxbb.h>
 #include <asm/arch/sm.h>
 #include <asm/arch/eth.h>
+#include <asm/arch/mem.h>
 
 #define EFUSE_SN_OFFSET		20
 #define EFUSE_SN_SIZE		16
@@ -54,3 +55,10 @@ int misc_init_r(void)
 
 	return 0;
 }
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+	meson_gx_init_reserved_memory(blob);
+
+	return 0;
+}
board/amlogic/p212/p212.c +8 -0
index 2b6d88a..5fde534 100644
@@ -11,6 +11,7 @@
 #include <asm/arch/gxbb.h>
 #include <asm/arch/sm.h>
 #include <asm/arch/eth.h>
+#include <asm/arch/mem.h>
 
 #define EFUSE_SN_OFFSET		20
 #define EFUSE_SN_SIZE		16
@@ -46,3 +47,10 @@ int misc_init_r(void)
 
 	return 0;
 }
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+	meson_gx_init_reserved_memory(blob);
+
+	return 0;
+}
configs/khadas-vim_defconfig +1 -0
index dcccc69..f2a30a8 100644
@@ -17,6 +17,7 @@ CONFIG_CMD_MMC=y
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_MESON_GX=y
configs/libretech-cc_defconfig +1 -0
index a63e940..6583c43 100644
@@ -17,6 +17,7 @@ CONFIG_CMD_MMC=y
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_MESON_GX=y
configs/odroid-c2_defconfig +1 -0
index 1afd2fc..18d2b68 100644
@@ -16,6 +16,7 @@ CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
configs/p212_defconfig +1 -0
index d4b5349..b6e788b 100644
@@ -17,6 +17,7 @@ CONFIG_CMD_MMC=y
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_MESON_GX=y
include/configs/meson-gxbb-common.h +1 -1
index d88d42d..c2b306a 100644
@@ -10,7 +10,7 @@
 
 #define CONFIG_CPU_ARMV8
 #define CONFIG_REMAKE_ELF
-#define CONFIG_NR_DRAM_BANKS		2
+#define CONFIG_NR_DRAM_BANKS		1
 #define CONFIG_ENV_SIZE			0x2000
 #define CONFIG_SYS_MAXARGS		32
 #define CONFIG_SYS_MALLOC_LEN		(32 << 20)
Signature · 1 line
2.7.4
#1 lore raw

PATCH v2 1/1 ARM: arch-meson: build memory banks using reported memory from registers

Quoted 35 lines · Neil Armstrong

As discussed at [1], the Amlogic Meson GX SoCs can embed a BL31 firmware and a secondary BL32 firmware.
Since mid-2017, the reserved memory address of the BL31 firmware was moved and grown for security reasons.

But mainline U-Boot and Linux has the old address and size fixed.

These SoCs have a register interface to get the two firmware reserved memory start and sizes.

This patch adds a dynamic reservation of the memory zones in the device tree bootmem reserved memory zone used by the kernel in early boot.
To be complete, the memory zones are also added to the EFI reserved zones.

Depends on patchset "Add support for Amlogic GXL Based SBCs" at [2].

[1] http://lists.infradead.org/pipermail/linux-amlogic/2017-October/004860.html
[2] http://lists.infradead.org/pipermail/linux-amlogic/2017-November/005410.html

Changes since v1:
- switched the #if to if(IS_ENABLED()) to compile all code paths
- renamed function to meson_board_add_reserved_memory()
- added a mem.h header with comment
- updated all boards ft_board_setup()

Changes since RFC v2:
- reduced preprocessor load
- kept Odroid-C2 static memory mapping as exception

Changes since RFC v1:
- switch to fdt rsv mem table and efi reserve memory
- replaced in_le32 by readl()

Quoted 15 lines
---
 arch/arm/include/asm/arch-meson/gxbb.h    | 17 +++++++
 arch/arm/include/asm/arch-meson/mem.h     | 16 +++++++
 arch/arm/mach-meson/board.c               | 74 +++++++++++++++++++++++++++----
 board/amlogic/khadas-vim/khadas-vim.c     |  7 +++
 board/amlogic/libretech-cc/libretech-cc.c |  8 ++++
 board/amlogic/odroid-c2/odroid-c2.c       |  8 ++++
 board/amlogic/p212/p212.c                 |  8 ++++
 configs/khadas-vim_defconfig              |  1 +
 configs/libretech-cc_defconfig            |  1 +
 configs/odroid-c2_defconfig               |  1 +
 configs/p212_defconfig                    |  1 +
 include/configs/meson-gxbb-common.h       |  2 +-
 12 files changed, 135 insertions(+), 9 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-meson/mem.h

Seems good, so far as I understand it.

#2 lore raw

PATCH v2 1/1 ARM: arch-meson: build memory banks using reported memory from registers

In reply to Neil Armstrong
Quoted 29 lines · Neil Armstrong

As discussed at [1], the Amlogic Meson GX SoCs can embed a BL31 firmware and a secondary BL32 firmware.
Since mid-2017, the reserved memory address of the BL31 firmware was moved and grown for security reasons.

But mainline U-Boot and Linux has the old address and size fixed.

These SoCs have a register interface to get the two firmware reserved memory start and sizes.

This patch adds a dynamic reservation of the memory zones in the device tree bootmem reserved memory zone used by the kernel in early boot.
To be complete, the memory zones are also added to the EFI reserved zones.

Depends on patchset "Add support for Amlogic GXL Based SBCs" at [2].

[1] http://lists.infradead.org/pipermail/linux-amlogic/2017-October/004860.html
[2] http://lists.infradead.org/pipermail/linux-amlogic/2017-November/005410.html

Changes since v1:
- switched the #if to if(IS_ENABLED()) to compile all code paths
- renamed function to meson_board_add_reserved_memory()
- added a mem.h header with comment
- updated all boards ft_board_setup()

Changes since RFC v2:
- reduced preprocessor load
- kept Odroid-C2 static memory mapping as exception

Quoted 7 lines

Changes since RFC v1:
- switch to fdt rsv mem table and efi reserve memory
- replaced in_le32 by readl()

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20171204/ed560e94/attachment.sig>