aboot: Add dtree support for flash targets.
Change-Id: I320a66851dbdb9b842f2e15894082480a257b7ef
diff --git a/target/copper/meminfo.c b/target/copper/meminfo.c
index fae3aea..e0feaa1 100644
--- a/target/copper/meminfo.c
+++ b/target/copper/meminfo.c
@@ -1,29 +1,29 @@
-/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * modification, are permitted provided that the following conditions are
+ * met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of Code Aurora nor
- * the names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#if DEVICE_TREE /* If using device tree */
@@ -35,6 +35,7 @@
#include <stdint.h>
#include <libfdt.h>
#include <platform/iomap.h>
+#include <dev_tree.h>
#define SIZE_1M (1024 * 1024)
@@ -43,7 +44,6 @@
uint32_t start_addr;
}mem_info;
-
mem_info copper_default_fixed_memory[] = {
{ .size = (132 * SIZE_1M),
.start_addr = SDRAM_START_ADDR
@@ -60,19 +60,13 @@
},
};
-uint32_t *target_mem_dev_tree_create(uint32_t *ptr, uint32_t size, uint32_t addr)
-{
- *ptr++ = cpu_to_fdt32(addr);
- *ptr++ = cpu_to_fdt32(size);
-
- return ptr;
-}
-
-uint32_t *target_dev_tree_create(uint32_t *ptr,
- mem_info usable_mem_map[],
- uint32_t num_regions)
+int target_add_first_mem_bank(void *fdt,
+ uint32_t offset,
+ mem_info usable_mem_map[],
+ uint32_t num_regions)
{
uint32_t i;
+ int ret;
ASSERT(num_regions);
@@ -80,96 +74,91 @@
for (i = 0; i < num_regions; i++)
{
- ptr = target_mem_dev_tree_create(ptr,
- usable_mem_map[i].size,
- usable_mem_map[i].start_addr);
+ ret = dev_tree_add_mem_info(fdt,
+ offset,
+ usable_mem_map[i].start_addr,
+ usable_mem_map[i].size);
}
- return ptr;
+ return ret;
}
-uint32_t* target_dev_tree_mem(uint32_t *num_of_entries)
+/* Funtion to add the ram partition entries into device tree.
+ * The function assumes that all the entire fixed memory regions should
+ * be listed in the first bank of the passed in ddr regions.
+ */
+uint32_t target_dev_tree_mem(void *fdt, uint32_t memory_node_offset)
{
struct smem_ram_ptable ram_ptable;
- uint32_t *meminfo_ptr;
- uint32_t num_of_sections = 0;
- uint32_t *ptr;
- uint32_t last_fixed_add;
+ uint32_t last_fixed_addr;
int n;
- int i;
- int index = 0;
- int count = 0;
- int overflow = 0;
+ unsigned int i;
+ int ret;
/* Make sure RAM partition table is initialized */
ASSERT(smem_ram_ptable_init(&ram_ptable));
n = ARRAY_SIZE(copper_default_fixed_memory);
- last_fixed_add = copper_default_fixed_memory[n-1].start_addr +
- copper_default_fixed_memory[n-1].size;
- /* Find the number of parts in ram_ptable of category SDRAM and type SYS_MEMORY */
- for(i = 0; i < ram_ptable.len; i++)
- { if((ram_ptable.parts[i].category ==SDRAM) &&
- (ram_ptable.parts[i].type == SYS_MEMORY))
- count++;
- }
+ last_fixed_addr = copper_default_fixed_memory[n-1].start_addr +
+ copper_default_fixed_memory[n-1].size;
- /* Calculating the size of the mem_info_ptr */
+ /* Calculating the size of the mem_info_ptr */
for (i = 0 ; i < ram_ptable.len; i++)
{
- if((ram_ptable.parts[i].category ==SDRAM) &&
+ if((ram_ptable.parts[i].category == SDRAM) &&
(ram_ptable.parts[i].type == SYS_MEMORY))
{
- if((ram_ptable.parts[i].start <= last_fixed_add) &&
- ((ram_ptable.parts[i].start + ram_ptable.parts[i].size) >= last_fixed_add))
+ if((ram_ptable.parts[i].start <= last_fixed_addr) &&
+ ((ram_ptable.parts[i].start + ram_ptable.parts[i].size) >= last_fixed_addr))
{
- if((ram_ptable.parts[i].start + ram_ptable.parts[i].size) == last_fixed_add)
- {
- num_of_sections = n + (count - i - 1);
+
+ /* Pass along all fixed memory regions to Linux */
+ ret = target_add_first_mem_bank(fdt,
+ memory_node_offset,
+ copper_default_fixed_memory,
+ ARRAY_SIZE(copper_default_fixed_memory));
+
+ if (ret)
+ {
+ dprintf(CRITICAL, "Failed to add first bank fixed memory addresses\n");
+ goto target_dev_tree_mem_err;
+ }
+
+ if((ram_ptable.parts[i].start + ram_ptable.parts[i].size) != last_fixed_addr)
+ {
+ /* Pass the memory beyond the fixed memory present in the partition */
+ ret = dev_tree_add_mem_info(fdt,
+ memory_node_offset,
+ ram_ptable.parts[i].start + last_fixed_addr,
+ ram_ptable.parts[i].size - last_fixed_addr);
+
+ if (ret)
+ {
+ dprintf(CRITICAL, "Failed to add first bank memory addresses\n");
+ goto target_dev_tree_mem_err;
+ }
}
- else
- {
- num_of_sections = n + (count - i );
- overflow = 1;
- }
- index = i+1;
- break;
- }
- }
+ }
+ else
+ {
+ /* Pass along all other usable memory regions to Linux */
+ ret = dev_tree_add_mem_info(fdt,
+ memory_node_offset,
+ ram_ptable.parts[i].start,
+ ram_ptable.parts[i].size);
+
+ if (ret)
+ {
+ dprintf(CRITICAL, "Failed to add secondary banks memory addresses\n");
+ goto target_dev_tree_mem_err;
+ }
+ }
+ }
}
- *num_of_entries = num_of_sections;
- meminfo_ptr = (uint32_t*) malloc(sizeof(uint32_t) * num_of_sections * 2);
- ptr = meminfo_ptr;
+target_dev_tree_mem_err:
- /* Assumption that the fixed memory region always starts from the first ram_ptable part */
- ASSERT((ram_ptable.parts[0].category ==SDRAM) &&
- (ram_ptable.parts[0].type == SYS_MEMORY) &&
- (ram_ptable.parts[0].start == SDRAM_START_ADDR));
-
- /* Pass along all fixed memory regions to Linux */
- meminfo_ptr = target_dev_tree_create(meminfo_ptr, copper_default_fixed_memory,
- ARRAY_SIZE(copper_default_fixed_memory));
-
- if(overflow)
- {
- /* Pass the memory beyond the fixed memory present in the partition */
- meminfo_ptr = target_mem_dev_tree_create(meminfo_ptr,
- ram_ptable.parts[i].size - last_fixed_add,
- ram_ptable.parts[i].start + last_fixed_add);
- }
- for( i = index ; i < ram_ptable.len ; i ++)
- {
- if((ram_ptable.parts[i].category ==SDRAM) &&
- (ram_ptable.parts[i].type == SYS_MEMORY))
- {
- /* Pass along all other usable memory regions to Linux */
- meminfo_ptr = target_mem_dev_tree_create(meminfo_ptr,
- ram_ptable.parts[i].size,
- ram_ptable.parts[i].start);
- }
- }
- return ptr;
+ return ret;
}
void *target_get_scratch_address(void)
@@ -182,4 +171,3 @@
return (512 * 1024 * 1024);
}
#endif /* DEVICE_TREE */
-
diff --git a/target/mdm9625/init.c b/target/mdm9625/init.c
index 81a1c27..d9d7e9c 100644
--- a/target/mdm9625/init.c
+++ b/target/mdm9625/init.c
@@ -1,5 +1,4 @@
-/*
- * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -10,7 +9,7 @@
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
- * * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ * * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
@@ -26,6 +25,7 @@
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <debug.h>
#include <board.h>
#include <platform.h>
@@ -34,6 +34,11 @@
#include <baseband.h>
#include <lib/ptable.h>
#include <qpic_nand.h>
+#include <ctype.h>
+#include <string.h>
+
+extern void smem_ptable_init(void);
+extern void smem_add_modem_partitions(struct ptable *flash_ptable);
static struct ptable flash_ptable;
@@ -43,6 +48,34 @@
#define CMD_PIPE 2
struct qpic_nand_init_config config;
+
+void update_ptable_names(void)
+{
+ uint32_t ptn_index;
+ struct ptentry *ptentry_ptr = flash_ptable.parts;
+ struct ptentry *boot_ptn;
+ unsigned i;
+ uint32_t len;
+
+ /* Change all names to lower case. */
+ for (ptn_index = 0; ptn_index != (uint32_t)flash_ptable.count; ptn_index++)
+ {
+ len = strlen(ptentry_ptr[ptn_index].name);
+
+ for (i = 0; i < len; i++)
+ {
+ if (isupper(ptentry_ptr[ptn_index].name[i]))
+ {
+ ptentry_ptr[ptn_index].name[i] = tolower(ptentry_ptr[ptn_index].name[i]);
+ }
+ }
+ }
+
+ /* Rename apps ptn to boot. */
+ boot_ptn = ptable_find(&flash_ptable, "apps");
+ strcpy(boot_ptn->name, "boot");
+}
+
/* init */
void target_init(void)
{
@@ -57,14 +90,15 @@
qpic_nand_init(&config);
- /* Below lines are to be removed once the bootchain is available */
-
ptable_init(&flash_ptable);
- flash_set_ptable(&flash_ptable);
+ smem_ptable_init();
- /* Add boot ptn..until the bootchain adds it */
- ptable_add(&flash_ptable, "boot", 0x347, 0x52, 0, TYPE_APPS_PARTITION, PERM_WRITEABLE);
+ smem_add_modem_partitions(&flash_ptable);
+
+ update_ptable_names();
+
+ flash_set_ptable(&flash_ptable);
}
/* reboot */
@@ -80,25 +114,25 @@
return 0;
}
-/* Create ATAGs for this target */
-unsigned* target_atag_mem(unsigned* ptr)
-{
- return ptr;
-}
-
-/* mach type */
-unsigned board_machtype(void)
-{
- //return board_target_id();
-}
-
/* Identify the current target */
void target_detect(struct board_data *board)
{
}
+unsigned board_machtype(void)
+{
+ return board_target_id();
+}
+
/* Identify the baseband being used */
void target_baseband_detect(struct board_data *board)
{
-
+ /* Check for baseband variants. Default to MSM */
+ if (board->platform_subtype == HW_PLATFORM_SUBTYPE_MDM)
+ board->baseband = BASEBAND_MDM;
+ else
+ {
+ dprintf(CRITICAL, "Could not detect baseband id\n");
+ ASSERT(0);
+ }
}
diff --git a/target/mdm9625/meminfo.c b/target/mdm9625/meminfo.c
new file mode 100644
index 0000000..96b1b5b
--- /dev/null
+++ b/target/mdm9625/meminfo.c
@@ -0,0 +1,164 @@
+/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <reg.h>
+#include <debug.h>
+#include <malloc.h>
+#include <smem.h>
+#include <stdint.h>
+#include <libfdt.h>
+#include <platform/iomap.h>
+#include <dev_tree.h>
+
+#define SIZE_1M (1024 * 1024)
+
+typedef struct {
+ uint32_t size;
+ uint32_t start_addr;
+}mem_info;
+
+mem_info mdm9625_default_fixed_memory[] = {
+ { .size = (29 * SIZE_1M),
+ .start_addr = SDRAM_START_ADDR +
+ (2 * SIZE_1M)
+ },
+ { .size = (10 * SIZE_1M),
+ .start_addr = SDRAM_START_ADDR +
+ (118 * SIZE_1M)
+ },
+};
+
+int target_add_first_mem_bank(void *fdt,
+ uint32_t offset,
+ mem_info usable_mem_map[],
+ uint32_t num_regions)
+{
+ uint32_t i;
+ int ret;
+
+ ASSERT(num_regions);
+
+ dprintf(SPEW, "Number of HLOS regions in 1st bank = %u\n", num_regions);
+
+ for (i = 0; i < num_regions; i++)
+ {
+ ret = dev_tree_add_mem_info(fdt,
+ offset,
+ usable_mem_map[i].start_addr,
+ usable_mem_map[i].size);
+ }
+ return ret;
+}
+
+/* Funtion to add the ram partition entries into device tree.
+ * The function assumes that all the entire fixed memory regions should
+ * be listed in the first bank of the passed in ddr regions.
+ */
+uint32_t target_dev_tree_mem(void *fdt, uint32_t memory_node_offset)
+{
+ struct smem_ram_ptable ram_ptable;
+ uint32_t last_fixed_addr;
+ int n;
+ unsigned int i;
+ int ret;
+
+ /* Make sure RAM partition table is initialized */
+ ASSERT(smem_ram_ptable_init(&ram_ptable));
+
+ n = ARRAY_SIZE(mdm9625_default_fixed_memory);
+
+ last_fixed_addr = mdm9625_default_fixed_memory[n-1].start_addr +
+ mdm9625_default_fixed_memory[n-1].size;
+
+ for (i = 0; i < ram_ptable.len; i++)
+ {
+ if((ram_ptable.parts[i].category == SDRAM) &&
+ (ram_ptable.parts[i].type == SYS_MEMORY))
+ {
+ if((ram_ptable.parts[i].start <= last_fixed_addr) &&
+ ((ram_ptable.parts[i].start + ram_ptable.parts[i].size) >= last_fixed_addr))
+ {
+
+ /* Pass along all fixed memory regions to Linux */
+ ret = target_add_first_mem_bank(fdt,
+ memory_node_offset,
+ mdm9625_default_fixed_memory,
+ ARRAY_SIZE(mdm9625_default_fixed_memory));
+
+ if (ret)
+ {
+ dprintf(CRITICAL, "Failed to add first bank fixed memory addresses\n");
+ goto target_dev_tree_mem_err;
+ }
+
+ if((ram_ptable.parts[i].start + ram_ptable.parts[i].size) != last_fixed_addr)
+ {
+ /* Pass the memory beyond the fixed memory present in the partition */
+ ret = dev_tree_add_mem_info(fdt,
+ memory_node_offset,
+ ram_ptable.parts[i].start + last_fixed_addr,
+ ram_ptable.parts[i].size - last_fixed_addr);
+
+ if (ret)
+ {
+ dprintf(CRITICAL, "Failed to add first bank memory addresses\n");
+ goto target_dev_tree_mem_err;
+ }
+ }
+ }
+ else
+ {
+ /* Pass along all other usable memory regions to Linux */
+ ret = dev_tree_add_mem_info(fdt,
+ memory_node_offset,
+ ram_ptable.parts[i].start,
+ ram_ptable.parts[i].size);
+
+ if (ret)
+ {
+ dprintf(CRITICAL, "Failed to add secondary banks memory addresses\n");
+ goto target_dev_tree_mem_err;
+ }
+ }
+ }
+ }
+
+target_dev_tree_mem_err:
+
+ return ret;
+}
+
+void *target_get_scratch_address(void)
+{
+ return ((void *)SCRATCH_ADDR);
+}
+
+unsigned target_get_max_flash_size(void)
+{
+ return (28 * 1024 * 1024);
+}
diff --git a/target/mdm9625/rules.mk b/target/mdm9625/rules.mk
index d577380..9e54221 100755
--- a/target/mdm9625/rules.mk
+++ b/target/mdm9625/rules.mk
@@ -12,11 +12,13 @@
MODULES += \
dev/keys \
- lib/ptable
+ lib/ptable \
+ lib/libfdt
DEFINES += \
MEMBASE=$(MEMBASE) \
SCRATCH_ADDR=$(SCRATCH_ADDR)
OBJS += \
- $(LOCAL_DIR)/init.o
+ $(LOCAL_DIR)/init.o \
+ $(LOCAL_DIR)/meminfo.o