@@ -45,17 +45,8 @@ static struct {
phys_addr_t start;
phys_size_t size;
} prevbl_ddr_banks[CONFIG_NR_DRAM_BANKS] __section(".data") = { 0 };
-int dram_init(void)
-{
- /*
- * gd->ram_base / ram_size have been setup already
- * in qcom_parse_memory().
- */
- return 0;
-}
-
static int ddr_bank_cmp(const void *v1, const void *v2)
{
const struct {
phys_addr_t start;
@@ -69,42 +60,22 @@ static int ddr_bank_cmp(const void *v1, const void *v2)
return (res1->start >> 24) - (res2->start >> 24);
}
-/* This has to be done post-relocation since gd->bd isn't preserved */
-static void qcom_configure_bi_dram(void)
-{
- int i;
-
- for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
- gd->bd->bi_dram[i].start = prevbl_ddr_banks[i].start;
- gd->bd->bi_dram[i].size = prevbl_ddr_banks[i].size;
- }
-}
-
-int dram_init_banksize(void)
-{
- qcom_configure_bi_dram();
-
- return 0;
-}
-
static void qcom_parse_memory(void)
{
ofnode node;
- const fdt64_t *memory;
+ const fdt64_t *memory = NULL;
int memsize;
phys_addr_t ram_end = 0;
int i, j, banks;
node = ofnode_path("/memory");
- if (!ofnode_valid(node)) {
- log_err("No memory node found in device tree!\n");
- return;
- }
- memory = ofnode_read_prop(node, "reg", &memsize);
- if (!memory) {
- log_err("No memory configuration was provided by the previous bootloader!\n");
+ if (ofnode_valid(node))
+ memory = ofnode_read_prop(node, "reg", &memsize);
+
+ if (!memory || !ofnode_valid(node)) {
+ panic("No memory configuration was provided by the previous bootloader!\n");
return;
}
banks = min(memsize / (2 * sizeof(u64)), (ulong)CONFIG_NR_DRAM_BANKS);
@@ -134,8 +105,32 @@ static void qcom_parse_memory(void)
debug("ram_base = %#011lx, ram_size = %#011llx, ram_end = %#011llx\n",
gd->ram_base, gd->ram_size, ram_end);
}
+int dram_init(void)
+{
+ qcom_parse_memory();
+ return 0;
+}
+
+/* This has to be done post-relocation since gd->bd isn't preserved */
+static void qcom_configure_bi_dram(void)
+{
+ int i;
+
+ for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+ gd->bd->bi_dram[i].start = prevbl_ddr_banks[i].start;
+ gd->bd->bi_dram[i].size = prevbl_ddr_banks[i].size;
+ }
+}
+
+int dram_init_banksize(void)
+{
+ qcom_configure_bi_dram();
+
+ return 0;
+}
+
static void show_psci_version(void)
{
struct arm_smccc_res res;
@@ -173,9 +168,9 @@ int board_fdt_blob_setup(void **fdtp)
ret = -EEXIST;
} else {
debug("Using external FDT\n");
/* So we can use it before returning */
- *fdtp = fdt;
+ gd->fdt_blob = *fdtp = fdt;
}
/*
* Parse the /memory node while we're here,
In fc37a73e6679 (fdt: Swap the signature for board_fdt_blob_setup()) there was a subtle change to the Snapdragon implementation, removing the assignment to gd->fdt_blob partway through the function. This breaks qcom_parse_memory() which was also called during board_fdt_blob_setup(). Since this was a strange (and seemingly unnecessary choice), take the chance to move this to the more typical dram_init() phase so that we don't depend on gd->fdt_blob being correct until after board_fdt_blob_setup() has finished. Fixes: fc37a73e6679 (fdt: Swap the signature for board_fdt_blob_setup()) Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org> --- arch/arm/mach-snapdragon/board.c | 67 +++++++++++++++----------------- 1 file changed, 31 insertions(+), 36 deletions(-)