Merge "partition_parser: Update logic to access backup GPT header"
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 7c8f78b..e3946ef 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -136,6 +136,7 @@
 	int cmdline_len = 0;
 	int have_cmdline = 0;
 	int pause_at_bootup = 0;
+	unsigned char *cmdline_final = NULL;
 
 	/* CORE */
 	*ptr++ = 2;
@@ -215,6 +216,8 @@
 		*ptr++ = (n / 4) + 2;
 		*ptr++ = 0x54410009;
 		dst = (char *)ptr;
+		/* Save start ptr for debug print */
+		cmdline_final = (char *)ptr;
 		if (have_cmdline) {
 			src = cmdline;
 			while ((*dst++ = *src++));
@@ -288,8 +291,8 @@
 
 	dprintf(INFO, "booting linux @ %p, ramdisk @ %p (%d)\n",
 		kernel, ramdisk, ramdisk_size);
-	if (cmdline)
-		dprintf(INFO, "cmdline: %s\n", cmdline);
+	if (cmdline_final)
+		dprintf(INFO, "cmdline: %s\n", cmdline_final);
 
 	enter_critical_section();
 	/* do any platform specific cleanup before kernel entry */
@@ -1246,6 +1249,10 @@
 	else
 	{
 		recovery_init();
+#if USE_PCOM_SECBOOT
+	if((device.is_unlocked) || (device.is_tampered))
+		set_tamper_flag(device.is_tampered);
+#endif
 		boot_linux_from_flash();
 	}
 	dprintf(CRITICAL, "ERROR: Could not do normal boot. Reverting "
diff --git a/dev/fbcon/fbcon.c b/dev/fbcon/fbcon.c
index 7aa8c62..9538e3a 100644
--- a/dev/fbcon/fbcon.c
+++ b/dev/fbcon/fbcon.c
@@ -211,13 +211,24 @@
 void display_image_on_screen(void)
 {
     unsigned i = 0;
-    unsigned total_x = config->width;
-    unsigned total_y = config->height;
-    unsigned bytes_per_bpp = ((config->bpp) / 8);
-    unsigned image_base = ((((total_y/2) - (SPLASH_IMAGE_WIDTH / 2) - 1) *
-			    (config->width)) + (total_x/2 - (SPLASH_IMAGE_HEIGHT / 2)));
+    unsigned total_x;
+    unsigned total_y;
+    unsigned bytes_per_bpp;
+    unsigned image_base;
+
+    if (!config) {
+       dprintf(CRITICAL,"NULL configuration, image cannot be displayed\n");
+       return;
+    }
+
     fbcon_clear();
 
+    total_x = config->width;
+    total_y = config->height;
+    bytes_per_bpp = ((config->bpp) / 8);
+    image_base = ((((total_y/2) - (SPLASH_IMAGE_WIDTH / 2) - 1) *
+		    (config->width)) + (total_x/2 - (SPLASH_IMAGE_HEIGHT / 2)));
+
 #if DISPLAY_TYPE_MIPI
     if (bytes_per_bpp == 3)
     {
diff --git a/dev/keys/gpio_keypad.c b/dev/keys/gpio_keypad.c
index efe0a02..92850ac 100644
--- a/dev/keys/gpio_keypad.c
+++ b/dev/keys/gpio_keypad.c
@@ -418,9 +418,7 @@
     event_init(&qwerty_keypad->full_scan, false, EVENT_FLAG_AUTOUNSIGNAL);
     timer_initialize(&qwerty_keypad->timer);
 
-#ifdef QT_8660_KEYPAD_HW_BUG
     mach_id = board_machtype();
-#endif
     ssbi_gpio_init(mach_id);
 
     if(mach_id == LINUX_MACHTYPE_8660_QT)
diff --git a/platform/msm7x30/platform.c b/platform/msm7x30/platform.c
index 1b39264..527fc58 100755
--- a/platform/msm7x30/platform.c
+++ b/platform/msm7x30/platform.c
@@ -131,12 +131,14 @@
 #endif
 
 #if DISPLAY_TYPE_LCDC
-	struct lcdc_timing_parameters *lcd_timing;
-	mdp_lcdc_clock_init();
-	lcd_timing = get_lcd_timing();
-	fb_cfg = lcdc_init_set(lcd_timing);
-	panel_poweron();
-	fbcon_setup(fb_cfg);
+	if(!machine_is_ffa()) {
+		struct lcdc_timing_parameters *lcd_timing;
+		mdp_lcdc_clock_init();
+		lcd_timing = get_lcd_timing();
+		fb_cfg = lcdc_init_set(lcd_timing);
+		panel_poweron();
+		fbcon_setup(fb_cfg);
+	}
 #endif
 }
 
@@ -144,7 +146,9 @@
 {
 #if DISPLAY_TYPE_LCDC
 	/* Turning off LCDC */
-	lcdc_shutdown();
+	if(!machine_is_ffa()) {
+		lcdc_shutdown();
+	}
 #endif
 }
 
diff --git a/platform/msm8960/gpio.c b/platform/msm8960/gpio.c
index 9403be0..783d4c1 100644
--- a/platform/msm8960/gpio.c
+++ b/platform/msm8960/gpio.c
@@ -156,10 +156,10 @@
 /* Initial pm8038 GPIO configurations */
 static struct pm8xxx_gpio_init pm8038_keypad_gpios[] = {
 	/* keys GPIOs */
-	PM8XXX_GPIO_INPUT(PM_GPIO(3), PM_GPIO_PULL_UP_1_5),
-	PM8XXX_GPIO_INPUT(PM_GPIO(8), PM_GPIO_PULL_UP_1_5),
-	PM8XXX_GPIO_INPUT(PM_GPIO(10), PM_GPIO_PULL_UP_1_5),
-	PM8XXX_GPIO_INPUT(PM_GPIO(11), PM_GPIO_PULL_UP_1_5),
+	PM8XXX_GPIO_INPUT(PM_GPIO(3), PM_GPIO_PULL_UP_30),
+	PM8XXX_GPIO_INPUT(PM_GPIO(8), PM_GPIO_PULL_UP_30),
+	PM8XXX_GPIO_INPUT(PM_GPIO(10), PM_GPIO_PULL_UP_30),
+	PM8XXX_GPIO_INPUT(PM_GPIO(11), PM_GPIO_PULL_UP_30),
 };
 
 static struct pm8xxx_gpio_init pm8921_keypad_gpios[] = {
diff --git a/platform/msm_shared/mipi_dsi.c b/platform/msm_shared/mipi_dsi.c
index 1ffc144..3b09510 100644
--- a/platform/msm_shared/mipi_dsi.c
+++ b/platform/msm_shared/mipi_dsi.c
@@ -683,6 +683,7 @@
 
 void mipi_dsi_shutdown(void)
 {
+#if (!CONT_SPLASH_SCREEN)
 	mdp_shutdown();
 	writel(0x01010101, DSI_INT_CTRL);
 	writel(0x13FF3BFF, DSI_ERR_INT_MASK0);
@@ -700,6 +701,13 @@
 	writel(0, DSI_CLK_CTRL);
 	writel(0, DSI_CTRL);
 	writel(0, DSIPHY_PLL_CTRL(0));
+#else
+        /* To keep the splash screen displayed till kernel driver takes
+        control, do not turn off the video mode engine and clocks.
+        Only disabling the MIPI DSI IRQs */
+        writel(0x01010101, DSI_INT_CTRL);
+        writel(0x13FF3BFF, DSI_ERR_INT_MASK0);
+#endif
 }
 
 struct fbcon_config *mipi_init(void)
diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h
index a66af59..8e58653 100644
--- a/platform/msm_shared/smem.h
+++ b/platform/msm_shared/smem.h
@@ -54,13 +54,6 @@
 	unsigned reserved;
 };
 
-struct smem {
-	struct smem_proc_comm proc_comm[4];
-	unsigned version_info[32];
-	struct smem_heap_info heap_info;
-	struct smem_alloc_info alloc_info[128];
-};
-
 struct smem_board_info_v2 {
 	unsigned format;
 	unsigned msm_id;
@@ -275,6 +268,13 @@
 	APPS_MEMORY,		/* apps  usage memory */
 };
 
+struct smem {
+	struct smem_proc_comm proc_comm[4];
+	unsigned version_info[32];
+	struct smem_heap_info heap_info;
+	struct smem_alloc_info alloc_info[SMEM_LAST_VALID_TYPE];
+};
+
 struct smem_ram_ptn {
 	char name[16];
 	unsigned start;
diff --git a/target/msm7627_surf/tools/makefile b/target/msm7627_surf/tools/makefile
index 94357a2..e41f03c 100644
--- a/target/msm7627_surf/tools/makefile
+++ b/target/msm7627_surf/tools/makefile
@@ -38,4 +38,5 @@
 
 mkheader: $(SRC_DIR)/mkheader.c
 	${COMPILER} $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+	@mkdir -p $(BUILDDIR)
 	cp -f $(SRC_DIR)/mkheader $(BUILDDIR)/mkheader
diff --git a/target/msm7627a/init.c b/target/msm7627a/init.c
index 6c8f212..e40542b 100644
--- a/target/msm7627a/init.c
+++ b/target/msm7627a/init.c
@@ -54,6 +54,7 @@
 
 #define MSM8X25_SURF	4037
 #define MSM8X25_EVB	4042
+#define MSM8X25_QRD7	4095
 
 #define LINUX_MACHTYPE  MSM7X27A_SURF
 
@@ -264,6 +265,9 @@
 			case 0xC:
 				hw_platform = MSM8X25_EVB;
 				break;
+			case 0xF:
+				hw_platform = MSM8X25_QRD7;
+				break;
 			default:
 				hw_platform = MSM8X25_SURF;
 			}
@@ -299,6 +303,9 @@
 		case 0xC:
 			hw_platform = MSM7X27A_EVB;
 			break;
+		case 0xF:
+			hw_platform = MSM7X27A_QRD3;
+			break;
 		default:
 			if (target_msm_id == MSM7225A
 			    || target_msm_id == MSM7625A
@@ -465,21 +472,21 @@
 	}
 	return ret;
 }
-
-int machine_is_7x27a_qrd3()
+int machine_is_qrd()
 {
-	if (board_machtype() == MSM7X27A_QRD3)
-		return 1;
-	else
-		return 0;
-}
+	int ret = 0;
+	unsigned mach_type = board_machtype();
 
-int machine_is_7x27a_qrd1()
-{
-	if (board_machtype() == MSM7X27A_QRD1)
-		return 1;
-	else
-		return 0;
+	switch(mach_type) {
+		case MSM7X27A_QRD1:
+		case MSM7X27A_QRD3:
+		case MSM8X25_QRD7:
+			ret = 1;
+			break;
+		default:
+			ret = 0;
+	}
+	return ret;
 }
 int machine_is_8x25()
 {
@@ -489,6 +496,7 @@
 	switch(mach_type) {
 		case MSM8X25_SURF:
 		case MSM8X25_EVB:
+		case MSM8X25_QRD7:
 			ret = 1;
 			break;
 		default:
diff --git a/target/msm7627a/keypad.c b/target/msm7627a/keypad.c
index 28776a6..134ee2c 100644
--- a/target/msm7627a/keypad.c
+++ b/target/msm7627a/keypad.c
@@ -136,7 +136,7 @@
 
 void keypad_init(void)
 {
-	if (machine_is_7x27a_qrd1() || machine_is_7x27a_qrd3())
+	if (machine_is_qrd())
 		gpio_keypad_init(&halibut_keypad_info_qrd);
 	else if (machine_is_evb())
 		gpio_keypad_init(&halibut_keypad_info_evb);
diff --git a/target/msm7627a/tools/makefile b/target/msm7627a/tools/makefile
index 94357a2..e41f03c 100644
--- a/target/msm7627a/tools/makefile
+++ b/target/msm7627a/tools/makefile
@@ -38,4 +38,5 @@
 
 mkheader: $(SRC_DIR)/mkheader.c
 	${COMPILER} $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+	@mkdir -p $(BUILDDIR)
 	cp -f $(SRC_DIR)/mkheader $(BUILDDIR)/mkheader
diff --git a/target/msm7630_surf/init.c b/target/msm7630_surf/init.c
index 6f06e18..eb0c525 100644
--- a/target/msm7630_surf/init.c
+++ b/target/msm7630_surf/init.c
@@ -427,3 +427,20 @@
 {
 	return platform_ce_type;
 }
+
+int machine_is_ffa()
+{
+	unsigned mach_type;
+	int ret = 0;
+
+	mach_type = board_machtype();
+	switch(mach_type) {
+	case LINUX_MACHTYPE_8x55_FFA:
+	case LINUX_MACHTYPE_7x30_FFA:
+		ret = 1;
+		break;
+	default:
+		ret = 0;
+	}
+	return ret;
+}
diff --git a/target/msm7630_surf/tools/makefile b/target/msm7630_surf/tools/makefile
index 5a33035..62ba053 100644
--- a/target/msm7630_surf/tools/makefile
+++ b/target/msm7630_surf/tools/makefile
@@ -41,4 +41,5 @@
 
 mkheader: $(SRC_DIR)/mkheader.c
 	${COMPILER} -DMEMBASE=$(MEMBASE) $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+	@mkdir -p $(BUILDDIR)
 	cp -f $(SRC_DIR)/mkheader $(BUILDDIR)/mkheader
diff --git a/target/msm8660_surf/tools/makefile b/target/msm8660_surf/tools/makefile
index 5a33035..62ba053 100644
--- a/target/msm8660_surf/tools/makefile
+++ b/target/msm8660_surf/tools/makefile
@@ -41,4 +41,5 @@
 
 mkheader: $(SRC_DIR)/mkheader.c
 	${COMPILER} -DMEMBASE=$(MEMBASE) $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+	@mkdir -p $(BUILDDIR)
 	cp -f $(SRC_DIR)/mkheader $(BUILDDIR)/mkheader
diff --git a/target/msm8960/atags.c b/target/msm8960/atags.c
index c21634b..f7854b2 100644
--- a/target/msm8960/atags.c
+++ b/target/msm8960/atags.c
@@ -33,7 +33,7 @@
 
 #define SIZE_1M     (1024 * 1024)
 #define SIZE_2M		(2 * SIZE_1M)
-#define SIZE_141M	(141 * SIZE_1M)
+#define SIZE_140M	(140 * SIZE_1M)
 #define SIZE_256M	(256 * SIZE_1M)
 #define SIZE_512M	(512 * SIZE_1M)
 
@@ -44,7 +44,7 @@
 
 	if (smem_ram_ptable_init(&ram_ptable)) {
 		for (i = 0; i < ram_ptable.len; i++) {
-			/* Use only 141M from memory bank starting at 0x80000000 */
+			/* Use only 140M from memory bank starting at 0x80000000 */
 			if (ram_ptable.parts[i].category == SDRAM &&
 			    ram_ptable.parts[i].type == SYS_MEMORY &&
 			    ram_ptable.parts[i].start == 0x80000000) {
@@ -52,7 +52,7 @@
 
 				*ptr++ = 4;
 				*ptr++ = 0x54410002;
-				*ptr++ = SIZE_141M;
+				*ptr++ = SIZE_140M;
 				*ptr++ = ram_ptable.parts[i].start + SIZE_2M;
 
 				if (ram_ptable.parts[i].size > SIZE_256M) {
diff --git a/target/msm8960/include/target/display.h b/target/msm8960/include/target/display.h
index 5600baa..0f80546 100644
--- a/target/msm8960/include/target/display.h
+++ b/target/msm8960/include/target/display.h
@@ -29,7 +29,7 @@
 #ifndef _TARGET_MSM8960_DISPLAY_H
 #define _TARGET_MSM8960_DISPLAY_H
 
-#define MIPI_FB_ADDR  0x80B00000
+#define MIPI_FB_ADDR  0x89000000
 
 /* Toshiba MDT61 Mipi Panel */
 /* Unique to this panel, display width is 800, image is 600 */
diff --git a/target/msm8960/rules.mk b/target/msm8960/rules.mk
index 7a28bb4..7a51236 100644
--- a/target/msm8960/rules.mk
+++ b/target/msm8960/rules.mk
@@ -19,6 +19,7 @@
 DEFINES += DISPLAY_SPLASH_SCREEN=1
 DEFINES += DISPLAY_TYPE_MIPI=1
 DEFINES += DISPLAY_MIPI_PANEL_TOSHIBA_MDT61=1
+DEFINES += CONT_SPLASH_SCREEN=1
 
 MODULES += \
 	dev/keys \
diff --git a/target/msm8960/tools/makefile b/target/msm8960/tools/makefile
index 5a33035..62ba053 100644
--- a/target/msm8960/tools/makefile
+++ b/target/msm8960/tools/makefile
@@ -41,4 +41,5 @@
 
 mkheader: $(SRC_DIR)/mkheader.c
 	${COMPILER} -DMEMBASE=$(MEMBASE) $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+	@mkdir -p $(BUILDDIR)
 	cp -f $(SRC_DIR)/mkheader $(BUILDDIR)/mkheader