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 */