summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaleb Connolly <[email protected]>2024-02-26 17:26:25 +0000
committerCaleb Connolly <[email protected]>2024-03-01 14:44:37 +0000
commita2364d97ffaef6b708b0e7098c5cb5de98f5b6e1 (patch)
tree522adb70bc0576697ddb92e9b2ee19b38331f4a8
parent059d526af3123935c1fb525d12953d570d392f7c (diff)
mach-snapdragon: dynamic load addresses
Heavily inspired by Apple board code. Use the LMB allocator to configure load addresses at runtime, and implement a lookup table for selecting a devicetree. As some Qualcomm RBx boards have different RAM capacities and base addresses, it isn't possible to hardcode these regions. Reviewed-by: Neil Armstrong <[email protected]> Reviewed-by: Sumit Garg <[email protected]> Tested-by: Sumit Garg <[email protected]> #qcs404 Signed-off-by: Caleb Connolly <[email protected]>
-rw-r--r--arch/arm/Kconfig1
-rw-r--r--arch/arm/mach-snapdragon/board.c34
-rw-r--r--board/qualcomm/dragonboard410c/dragonboard410c.c2
3 files changed, 36 insertions, 1 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 0c78c1b8e6b..c7c236bada7 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1096,6 +1096,7 @@ config ARCH_SNAPDRAGON
select OF_SEPARATE
select SMEM
select SPMI
+ select BOARD_LATE_INIT
select OF_BOARD
select SAVE_PREV_BL_FDT_ADDR
select LINUX_KERNEL_IMAGE_HEADER
diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index a1867852bcc..f445bed3af0 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -22,6 +22,7 @@
#include <linux/bug.h>
#include <linux/psci.h>
#include <linux/sizes.h>
+#include <lmb.h>
#include <malloc.h>
#include <usb.h>
@@ -159,6 +160,39 @@ int board_init(void)
return 0;
}
+void __weak qcom_late_init(void)
+{
+}
+
+#define KERNEL_COMP_SIZE SZ_64M
+
+#define addr_alloc(lmb, size) lmb_alloc(lmb, size, SZ_2M)
+
+/* Stolen from arch/arm/mach-apple/board.c */
+int board_late_init(void)
+{
+ struct lmb lmb;
+ u32 status = 0;
+
+ lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
+
+ /* We need to be fairly conservative here as we support boards with just 1G of TOTAL RAM */
+ status |= env_set_hex("kernel_addr_r", addr_alloc(&lmb, SZ_128M));
+ status |= env_set_hex("ramdisk_addr_r", addr_alloc(&lmb, SZ_128M));
+ status |= env_set_hex("kernel_comp_addr_r", addr_alloc(&lmb, KERNEL_COMP_SIZE));
+ status |= env_set_hex("kernel_comp_size", KERNEL_COMP_SIZE);
+ status |= env_set_hex("scriptaddr", addr_alloc(&lmb, SZ_4M));
+ status |= env_set_hex("pxefile_addr_r", addr_alloc(&lmb, SZ_4M));
+ status |= env_set_hex("fdt_addr_r", addr_alloc(&lmb, SZ_2M));
+
+ if (status)
+ log_warning("%s: Failed to set run time variables\n", __func__);
+
+ qcom_late_init();
+
+ return 0;
+}
+
static void build_mem_map(void)
{
int i;
diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
index 0136cc2237d..fbbfc0e65e2 100644
--- a/board/qualcomm/dragonboard410c/dragonboard410c.c
+++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
@@ -88,7 +88,7 @@ int misc_init_r(void)
return 0;
}
-int board_late_init(void)
+int qcom_late_init(void)
{
char serial[16];