msm7630: Update for new memory map
New memory map for msm7630 with apps bootloader starting at
0x00100000 (1MB) and shared memory at 0x0.
Add new command "loadaddr:" to nandwrite for querying
the load address of images for flashing. This allows the
target to respond with the second/larger memory segment
in order to accommodate larger images.
diff --git a/app/nandwrite/nandwrite.c b/app/nandwrite/nandwrite.c
index 3173a56..d040ff6 100644
--- a/app/nandwrite/nandwrite.c
+++ b/app/nandwrite/nandwrite.c
@@ -35,6 +35,7 @@
#include <string.h>
#include <jtag.h>
#include <kernel/thread.h>
+#include <smem.h>
#include "bootimg.h"
#define FLASH_PAGE_SIZE 2048
@@ -43,6 +44,8 @@
unsigned page_size = 0;
unsigned page_mask = 0;
+static unsigned load_addr = 0xffffffff;
+
#define ROUND_TO_PAGE(x,y) (((x) + (y)) & (~(y)))
void acpu_clock_init(void);
@@ -56,6 +59,45 @@
return 1;
}
+unsigned set_load_address(unsigned addr)
+{
+ if (load_addr != 0xffffffff)
+ {
+ /* Already assigned */
+ return load_addr;
+ }
+
+ load_addr = addr;
+
+#ifdef PLATFORM_MSM7X30
+ /* For 7x30, override the destination RAM address based on memory type */
+ /* so the image is loaded to the larger memory segment. */
+ struct smem_board_info board_info;
+ unsigned int board_info_struct_len = sizeof(board_info);
+ unsigned smem_status;
+ char *build_type;
+
+ smem_status = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
+ &board_info, board_info_struct_len );
+ if(!smem_status)
+ {
+ build_type = (char *)(board_info.build_id) + 8;
+ if (*build_type == 'A')
+ {
+ /* LPDDR2 configuration */
+ load_addr = 0x40000000;
+ }
+ else
+ {
+ /* LPDDR1 configuration */
+ load_addr = 0x08000000;
+ }
+ }
+#endif
+
+ return load_addr;
+}
+
/* XXX */
void verify_flash(struct ptentry *p, void *addr, unsigned len, int extra)
{
@@ -114,6 +156,9 @@
else
sz = ROUND_TO_PAGE(sz, page_mask);
+ /* Override load address if needed */
+ data = (void *)set_load_address(addr);
+
dprintf(INFO, "writing %d bytes to '%s'\n", sz, ptn->name);
if (flash_write(ptn, extra, data, sz)) {
jtag_fail("flash write failure");
@@ -175,6 +220,16 @@
}
}
+void handle_query_load_address(unsigned addr)
+{
+ unsigned *return_addr = (unsigned *)addr;
+
+ if (return_addr)
+ *return_addr = set_load_address(addr);
+
+ jtag_okay("done");
+}
+
void handle_command(const char *cmd, unsigned a0, unsigned a1, unsigned a2)
{
if(startswith(cmd,"flash:")){
@@ -187,6 +242,11 @@
return;
}
+ if(startswith(cmd,"loadaddr:")){
+ handle_query_load_address(a0);
+ return;
+ }
+
jtag_fail("unknown command");
}
diff --git a/dev/keys/gpio_keypad.c b/dev/keys/gpio_keypad.c
index bb95f77..4c61079 100644
--- a/dev/keys/gpio_keypad.c
+++ b/dev/keys/gpio_keypad.c
@@ -41,6 +41,7 @@
#include <kernel/event.h>
#include <kernel/timer.h>
#include <reg.h>
+#include <platform/iomap.h>
struct gpio_kp {
struct gpio_keypad_info *keypad_info;
@@ -455,7 +456,7 @@
void ssbi_keypad_init(struct qwerty_keypad_info *qwerty_kp)
{
- int *modem_stat_check = (SMEM_BASE + 0x14);
+ int *modem_stat_check = (MSM_SHARED_BASE + 0x14);
int len;
/* Wait for modem to be ready before keypad init */
diff --git a/include/dev/gpio_keypad.h b/include/dev/gpio_keypad.h
index 8c006d3..77990ba 100644
--- a/include/dev/gpio_keypad.h
+++ b/include/dev/gpio_keypad.h
@@ -59,7 +59,6 @@
/* SSBI 2.0 controller registers */
#define MSM_SSBI_BASE 0xAD900000
-#define SMEM_BASE 0x100000
#define SSBI_TIMEOUT_US 100
diff --git a/platform/msm7x30/include/platform/iomap.h b/platform/msm7x30/include/platform/iomap.h
index fd107b3..9388cf4 100644
--- a/platform/msm7x30/include/platform/iomap.h
+++ b/platform/msm7x30/include/platform/iomap.h
@@ -44,7 +44,7 @@
#define MSM_GCC_BASE 0xC0182000
#if defined(PLATFORM_MSM7X30)
-#define MSM_SHARED_BASE 0x00100000
+#define MSM_SHARED_BASE 0x00000000
#define HW_REVISION_NUMBER 0xABC00270
#else
#define MSM_SHARED_BASE 0x01F00000
diff --git a/platform/msm7x30/rules.mk b/platform/msm7x30/rules.mk
index 7a1d434..bc38e84 100644
--- a/platform/msm7x30/rules.mk
+++ b/platform/msm7x30/rules.mk
@@ -5,7 +5,7 @@
#arm1136j-s
CPU := generic
-DEFINES += WITH_CPU_EARLY_INIT=1 WITH_CPU_WARM_BOOT=1 MEMBASE=0
+DEFINES += WITH_CPU_EARLY_INIT=1 WITH_CPU_WARM_BOOT=1
INCLUDES += -I$(LOCAL_DIR)/include
diff --git a/target/msm7630_surf/atags.c b/target/msm7630_surf/atags.c
index 29d5d23..84c5bd1 100644
--- a/target/msm7630_surf/atags.c
+++ b/target/msm7630_surf/atags.c
@@ -30,11 +30,11 @@
#include <debug.h>
#include <smem.h>
-#define EBI1_SIZE_190M 0x0BE00000
-#define EBI1_SIZE_123M 0x07B00000
-#define EBI1_SIZE_67M 0x04300000
-#define EBI1_ADDR1 0x00200000
-#define EBI1_ADDR2 0x40000000
+#define EBI1_SIZE_51M 0x03300000
+#define EBI1_SIZE_128M 0x08000000
+#define EBI1_ADDR_2M 0x00200000
+#define EBI1_ADDR_128M 0x08000000
+#define EBI1_ADDR_1G 0x40000000
unsigned* target_atag_mem(unsigned* ptr)
{
@@ -57,28 +57,18 @@
enable_lpddr2 = 1;
}
- if(enable_lpddr2)
- {
- /* ATAG_MEM for 123MB + 67MB setup */
- *ptr++ = 4;
- *ptr++ = 0x54410002;
- *ptr++ = EBI1_SIZE_123M;
- *ptr++ = EBI1_ADDR1;
+ /* ATAG_MEM for 51MB + 128MB setup */
+ *ptr++ = 4;
+ *ptr++ = 0x54410002;
+ *ptr++ = EBI1_SIZE_51M;
+ *ptr++ = EBI1_ADDR_2M;
- /* ATAG_MEM */
- *ptr++ = 4;
- *ptr++ = 0x54410002;
- *ptr++ = EBI1_SIZE_67M;
- *ptr++ = EBI1_ADDR2;
- }
- else
- {
- /* ATAG_MEM for 190MB setup*/
- *ptr++ = 4;
- *ptr++ = 0x54410002;
- *ptr++ = EBI1_SIZE_190M;
- *ptr++ = EBI1_ADDR1;
- }
+ /* ATAG_MEM */
+ *ptr++ = 4;
+ *ptr++ = 0x54410002;
+ *ptr++ = EBI1_SIZE_128M;
+ *ptr++ = (enable_lpddr2) ? EBI1_ADDR_1G : EBI1_ADDR_128M;
+
return ptr;
}
diff --git a/target/msm7630_surf/rules.mk b/target/msm7630_surf/rules.mk
index 9cc017d..c6c8ab9 100644
--- a/target/msm7630_surf/rules.mk
+++ b/target/msm7630_surf/rules.mk
@@ -4,7 +4,7 @@
PLATFORM := msm7x30
-MEMBASE := 0x00000000 # SMI
+MEMBASE := 0x00100000 # SMI
MEMSIZE := 0x00100000 # 1MB
BASE_ADDR := 0x00200000
@@ -12,7 +12,7 @@
TAGS_ADDR := BASE_ADDR+0x00000100
KERNEL_ADDR := BASE_ADDR+0x00008000
RAMDISK_ADDR := BASE_ADDR+0x01000000
-SCRATCH_ADDR := BASE_ADDR+0x00008000
+SCRATCH_ADDR := 0x08008000
KEYS_USE_GPIO_KEYPAD := 1
@@ -24,6 +24,7 @@
DEFINES += \
SDRAM_SIZE=$(MEMSIZE) \
+ MEMBASE=$(MEMBASE) \
BASE_ADDR=$(BASE_ADDR) \
TAGS_ADDR=$(TAGS_ADDR) \
KERNEL_ADDR=$(KERNEL_ADDR) \
diff --git a/target/msm7630_surf/tools/makefile b/target/msm7630_surf/tools/makefile
index 6cadf14..bb2d4e4 100644
--- a/target/msm7630_surf/tools/makefile
+++ b/target/msm7630_surf/tools/makefile
@@ -37,5 +37,5 @@
$(SRC_DIR)/mkheader $(OUTBIN) $(APPSBOOTHEADER_DIR)/emmc_appsboothd.mbn unified-boot
mkheader: $(SRC_DIR)/mkheader.c
- ${COMPILER} $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+ ${COMPILER} -DMEMBASE=$(MEMBASE) $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
diff --git a/target/msm7630_surf/tools/mkheader.c b/target/msm7630_surf/tools/mkheader.c
index 9b03907..8701007 100644
--- a/target/msm7630_surf/tools/mkheader.c
+++ b/target/msm7630_surf/tools/mkheader.c
@@ -43,7 +43,11 @@
}
size = s.st_size;
+#if MEMBASE
+ base = MEMBASE;
+#else
base = 0;
+#endif
magic[0] = 0x00000005; /* appsbl */
magic[1] = 0x00000002; /* nand */