aboot: Add dtree support for flash targets.
Change-Id: I320a66851dbdb9b842f2e15894082480a257b7ef
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