Merge "platform: msm_shared: Update tune2 parameters from fuse"
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 575e8e4..86b1f92 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -1084,7 +1084,16 @@
 	 */
 	if (is_gzip_package((unsigned char *)(image_addr + page_size), hdr->kernel_size))
 	{
+#ifdef ABOOT_IGNORE_BOOT_HEADER_ADDRS
+		/* Set default kernel decompression output address to be ABOOT_FORCE_KERNEL64_ADDR.
+		 * Most likely gzip compressed kernel is used by arm64 kernel,
+		 * and it is using ABOOT_FORCE_KERNEL64_ADDR for kernel start address.
+		 * It can avoid an unnecessary memmove afterwords.
+		 */
+		out_addr = (unsigned char *) ABOOT_FORCE_KERNEL64_ADDR;
+#else
 		out_addr = (unsigned char *)(image_addr + imagesize_actual + page_size);
+#endif
 		out_avai_len = target_get_max_flash_size() - imagesize_actual - page_size;
 		dprintf(INFO, "decompressing kernel image: start\n");
 		rc = decompress((unsigned char *)(image_addr + page_size),
@@ -1978,8 +1987,17 @@
 	 */
 	if (is_gzip_package((unsigned char *)(data + page_size), hdr->kernel_size))
 	{
+#ifdef ABOOT_IGNORE_BOOT_HEADER_ADDRS
+		/* Set default kernel decompression output address to be ABOOT_FORCE_KERNEL64_ADDR.
+		 * Most likely gzip compressed kernel is used by arm64 kernel,
+		 * and it is using ABOOT_FORCE_KERNEL64_ADDR for kernel start address.
+		 * It can avoid an unnecessary memmove afterwords.
+		 */
+		out_addr = (unsigned char *) ABOOT_FORCE_KERNEL64_ADDR;
+#else
 		out_addr = (unsigned char *)target_get_scratch_address();
 		out_addr = (unsigned char *)(out_addr + image_actual + page_size);
+#endif
 		out_avai_len = target_get_max_flash_size() - image_actual - page_size;
 		dprintf(INFO, "decompressing kernel image: start\n");
 		ret = decompress((unsigned char *)(ptr + page_size),
diff --git a/app/aboot/mdtp.c b/app/aboot/mdtp.c
index 8ed312b..578f4de 100644
--- a/app/aboot/mdtp.c
+++ b/app/aboot/mdtp.c
@@ -752,7 +752,6 @@
 static int mdtp_tzbsp_dec_verify_DIP(DIP_t *enc_dip, DIP_t *dec_dip, uint32_t *verified)
 {
 	unsigned char hash[HASH_LEN];
-	unsigned char buf[HASH_LEN], digest[HASH_LEN];
 	SHA256_CTX sha256_ctx;
 	int ret;
 
@@ -763,9 +762,6 @@
 	arch_clean_invalidate_cache_range((addr_t)enc_dip, sizeof(DIP_t));
 	arch_invalidate_cache_range((addr_t)dec_dip, sizeof(DIP_t));
 
-	/* workaround: Dummy call to hash_find prevents a boot loop when using the CE from TZ */
-	hash_find(buf, HASH_LEN, digest, CRYPTO_AUTH_ALG_SHA1);
-
 	ret = mdtp_cipher_dip_cmd((uint8_t*)enc_dip, sizeof(DIP_t),
 								(uint8_t*)dec_dip, sizeof(DIP_t),
 								DIP_DECRYPT);
@@ -799,7 +795,6 @@
 /* Encrypt a given DIP and calculate its integrity information */
 static int mdtp_tzbsp_enc_hash_DIP(DIP_t *dec_dip, DIP_t *enc_dip)
 {
-	unsigned char buf[HASH_LEN], digest[HASH_LEN];
 	SHA256_CTX sha256_ctx;
 	int ret;
 
@@ -813,9 +808,6 @@
 	arch_clean_invalidate_cache_range((addr_t)dec_dip, sizeof(DIP_t));
 	arch_invalidate_cache_range((addr_t)enc_dip, sizeof(DIP_t));
 
-	/* workaround: Dummy call to hash_find prevents a boot loop when using the CE from TZ */
-	hash_find(buf, HASH_LEN, digest, CRYPTO_AUTH_ALG_SHA1);
-
 	ret = mdtp_cipher_dip_cmd((uint8_t*)dec_dip, sizeof(DIP_t),
 								(uint8_t*)enc_dip, sizeof(DIP_t),
 								DIP_ENCRYPT);
diff --git a/app/aboot/mdtp_fuse.c b/app/aboot/mdtp_fuse.c
index 81351f4..a66f87b 100644
--- a/app/aboot/mdtp_fuse.c
+++ b/app/aboot/mdtp_fuse.c
@@ -32,12 +32,11 @@
 #include <partition_parser.h>
 #include <string.h>
 #include <stdlib.h>
-
+#include <reg.h>
 #include "mdtp.h"
 #include "scm.h"
 
 #define MAX_METADATA_SIZE       (0x1000)
-#define QFPROM_ADDR_SPACE_RAW   (0)
 
 /********************************************************************************/
 
@@ -156,21 +155,12 @@
  */
 static int read_QFPROM_fuse(uint8_t *mask)
 {
-	static const uint32_t row_address = MDTP_EFUSE_ADDRESS;
-	uint32_t addr_type = QFPROM_ADDR_SPACE_RAW;
-	uint32_t row_data[2] = {0};
-	uint32_t qfprom_api_status = 0;
+	uint32_t val = 0;
 
-	/* Read the current row where the eFuse is located */
-	(void) qfprom_read_row_cmd(row_address, addr_type, row_data, &qfprom_api_status);
-	if (qfprom_api_status)
-	{
-			dprintf(CRITICAL, "mdtp: write_QFPROM_fuse: qsee_fuse_read failed. qfprom_api_status=%d", qfprom_api_status);
-			return -1;
-	}
+	val = readl(MDTP_EFUSE_ADDRESS);
 
 	/* Shift the read data to be reflected in mask */
-	*mask = (uint8_t)(row_data[0] >> MDTP_EFUSE_START);
+	*mask = (uint8_t)(val >> MDTP_EFUSE_START);
 
 	return 0;
 }
diff --git a/app/aboot/mdtp_ui.c b/app/aboot/mdtp_ui.c
index fcf7259..dcdf75f 100644
--- a/app/aboot/mdtp_ui.c
+++ b/app/aboot/mdtp_ui.c
@@ -34,33 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "mdtp.h"
-
-// Image dimensions
-#define MDTP_ERROR_MSG_WIDTH                (1412)
-#define MDTP_ERROR_MSG_HEIGHT               (212)
-#define MDTP_MAIN_TEXT_WIDTH                (1364)
-#define MDTP_MAIN_TEXT_HEIGHT               (288)
-#define MDTP_PIN_DIGIT_WIDTH                (180)
-#define MDTP_PIN_DIGIT_HEIGHT               (180)
-#define MDTP_OK_BUTTON_WIDTH                (644)
-#define MDTP_OK_BUTTON_HEIGHT               (158)
-#define MDTP_DIGITS_INSTRUCTIONS_WIDTH      (1384)
-#define MDTP_DIGITS_INSTRUCTIONS_HEIGHT     (166)
-#define MDTP_PIN_INSTRUCTIONS_WIDTH         (920)
-#define MDTP_PIN_INSTRUCTIONS_HEIGHT        (204)
-
-// Image offsets
-#define MDTP_ERROR_MSG_OFFSET               (0x1000)
-#define MDTP_INITIAL_DELAY_OFFSET           (0xDD000)
-#define MDTP_ENTER_PIN_OFFSET               (0x1FD000)
-#define MDTP_INVALID_PIN_OFFSET             (0x31D000)
-#define MDTP_PIN_DIGIT_0_OFFSET             (0x43D000)
-#define MDTP_PIN_DIGITS_OFFSET              (0x18000)
-#define MDTP_PIN_SELECTED_DIGIT_0_OFFSET    (MDTP_PIN_DIGIT_0_OFFSET + 10*MDTP_PIN_DIGITS_OFFSET)  // (0x52D000)
-#define MDTP_OK_BUTTON_OFFSET               (0x61D000)
-#define MDTP_SELECTED_OK_BUTTON_OFFSET      (0x668000)
-#define MDTP_DIGITS_INSTRUCTIONS_OFFSET     (0x6B3000)
-#define MDTP_PIN_INSTRUCTIONS_OFFSET        (0x75C000)
+#include "mdtp_ui_defs.h"
 
 // Image releative locations
 #define ERROR_MESSAGE_RELATIVE_Y_LOCATION   (0.18)
@@ -70,8 +44,6 @@
 #define OK_BUTTON_RELATIVE_Y_LOCATION       (0.75)
 #define OK_TEXT_RELATIVE_Y_LOCATION         (0.82)
 
-#define DIGIT_SPACE                         (12)
-
 #define MDTP_PRESSING_DELAY_MSEC            (400)
 #define MDTP_MAX_IMAGE_SIZE                 (1183000)  //size in bytes, includes some extra bytes since we round up to block size in read
 #define RGB888_BLACK                        (0x000000)
@@ -90,6 +62,8 @@
     uint8_t image[MDTP_MAX_IMAGE_SIZE];
 };
 
+struct mdtp_ui_defs mdtp_ui_defs_data;
+
 /*----------------------------------------------------------------------------
  * Global Variables
  * -------------------------------------------------------------------------*/
@@ -286,10 +260,10 @@
 
     if (fb_config)
 	{
-        uint32_t x = CENTER_IMAGE_ON_X_AXIS(MDTP_ERROR_MSG_WIDTH,fb_config->width);
+        uint32_t x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.error_msg_width,fb_config->width);
 		uint32_t y = ((fb_config->height)*ERROR_MESSAGE_RELATIVE_Y_LOCATION);
 
-        fbimg = mdtp_read_mmc_image(MDTP_ERROR_MSG_OFFSET, MDTP_ERROR_MSG_WIDTH, MDTP_ERROR_MSG_HEIGHT);
+        fbimg = mdtp_read_mmc_image(mdtp_ui_defs_data.error_msg_offset, mdtp_ui_defs_data.error_msg_width, mdtp_ui_defs_data.error_msg_height);
         if (NULL == fbimg)
         {
             dprintf(CRITICAL,"ERROR: failed to read error image from mmc\n");
@@ -338,10 +312,10 @@
  */
 static void display_initial_delay()
 {
-    uint32_t x = CENTER_IMAGE_ON_X_AXIS(MDTP_MAIN_TEXT_WIDTH,fb_config->width);
+    uint32_t x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.main_text_width,fb_config->width);
 	uint32_t y = (fb_config->height)*MAIN_TEXT_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_INITIAL_DELAY_OFFSET, MDTP_MAIN_TEXT_WIDTH, MDTP_MAIN_TEXT_HEIGHT, x, y);
+	display_image(mdtp_ui_defs_data.initial_delay_offset, mdtp_ui_defs_data.main_text_width, mdtp_ui_defs_data.main_text_height, x, y);
 }
 
 /**
@@ -349,10 +323,10 @@
  */
 static void display_enter_pin()
 {
-    uint32_t x = CENTER_IMAGE_ON_X_AXIS(MDTP_MAIN_TEXT_WIDTH,fb_config->width);
+    uint32_t x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.main_text_width,fb_config->width);
 	uint32_t y = (fb_config->height)*MAIN_TEXT_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_ENTER_PIN_OFFSET, MDTP_MAIN_TEXT_WIDTH, MDTP_MAIN_TEXT_HEIGHT, x, y);
+	display_image(mdtp_ui_defs_data.enter_pin_offset, mdtp_ui_defs_data.main_text_width, mdtp_ui_defs_data.main_text_height, x, y);
 }
 
 /**
@@ -360,10 +334,10 @@
  */
 static void display_invalid_pin()
 {
-    uint32_t x = CENTER_IMAGE_ON_X_AXIS(MDTP_MAIN_TEXT_WIDTH,fb_config->width);
+    uint32_t x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.main_text_width,fb_config->width);
 	uint32_t y = (fb_config->height)*MAIN_TEXT_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_INVALID_PIN_OFFSET, MDTP_MAIN_TEXT_WIDTH, MDTP_MAIN_TEXT_HEIGHT, x, y);
+	display_image(mdtp_ui_defs_data.invalid_pin_offset, mdtp_ui_defs_data.main_text_width, mdtp_ui_defs_data.main_text_height, x, y);
 }
 
 /**
@@ -371,10 +345,10 @@
  */
 static void display_digits_instructions()
 {
-    uint32_t x = CENTER_IMAGE_ON_X_AXIS(MDTP_DIGITS_INSTRUCTIONS_WIDTH,fb_config->width);
+    uint32_t x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.digits_instructions_width,fb_config->width);
 	uint32_t y = (fb_config->height)*PIN_TEXT_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_DIGITS_INSTRUCTIONS_OFFSET, MDTP_DIGITS_INSTRUCTIONS_WIDTH, MDTP_DIGITS_INSTRUCTIONS_HEIGHT, x, y);
+	display_image(mdtp_ui_defs_data.digits_instructions_offset, mdtp_ui_defs_data.digits_instructions_width, mdtp_ui_defs_data.digits_instructions_height, x, y);
 }
 
 /**
@@ -384,7 +358,7 @@
 {
     uint32_t y = (fb_config->height)*PIN_TEXT_RELATIVE_Y_LOCATION;
 
-    fbcon_clear_section(y, MDTP_DIGITS_INSTRUCTIONS_HEIGHT);
+    fbcon_clear_section(y, mdtp_ui_defs_data.digits_instructions_height);
 }
 
 /**
@@ -392,8 +366,8 @@
  */
 static void display_digit(uint32_t x, uint32_t y, uint32_t digit)
 {
-    display_image(MDTP_PIN_DIGIT_0_OFFSET + digit*MDTP_PIN_DIGITS_OFFSET,
-            MDTP_PIN_DIGIT_WIDTH, MDTP_PIN_DIGIT_HEIGHT, x, y);
+    display_image(mdtp_ui_defs_data.pin_digit_0_offset + digit*mdtp_ui_defs_data.pin_digits_offset,
+            mdtp_ui_defs_data.pin_digit_width, mdtp_ui_defs_data.pin_digit_height, x, y);
 }
 
 /**
@@ -401,8 +375,8 @@
  */
 static void display_selected_digit(uint32_t x, uint32_t y, uint32_t digit)
 {
-    display_image(MDTP_PIN_SELECTED_DIGIT_0_OFFSET + digit*MDTP_PIN_DIGITS_OFFSET,
-			MDTP_PIN_DIGIT_WIDTH, MDTP_PIN_DIGIT_HEIGHT, x, y);
+    display_image(mdtp_ui_defs_data.pin_selected_digit_0_offset + digit*mdtp_ui_defs_data.pin_digits_offset,
+			mdtp_ui_defs_data.pin_digit_width, mdtp_ui_defs_data.pin_digit_height, x, y);
 }
 
 /**
@@ -410,10 +384,10 @@
  */
 static void display_ok_button()
 {
-    uint32_t ok_x = CENTER_IMAGE_ON_X_AXIS(MDTP_OK_BUTTON_WIDTH,fb_config->width);
+    uint32_t ok_x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.ok_button_width,fb_config->width);
 	uint32_t ok_y = (fb_config->height)*OK_BUTTON_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_OK_BUTTON_OFFSET, MDTP_OK_BUTTON_WIDTH, MDTP_OK_BUTTON_HEIGHT, ok_x, ok_y);
+	display_image(mdtp_ui_defs_data.ok_button_offset, mdtp_ui_defs_data.ok_button_width, mdtp_ui_defs_data.ok_button_height, ok_x, ok_y);
 }
 
 /**
@@ -421,10 +395,10 @@
  */
 static void display_selected_ok_button()
 {
-    uint32_t ok_x = CENTER_IMAGE_ON_X_AXIS(MDTP_OK_BUTTON_WIDTH,fb_config->width);
+    uint32_t ok_x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.ok_button_width,fb_config->width);
 	uint32_t ok_y = (fb_config->height)*OK_BUTTON_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_SELECTED_OK_BUTTON_OFFSET, MDTP_OK_BUTTON_WIDTH, MDTP_OK_BUTTON_HEIGHT,  ok_x, ok_y);
+	display_image(mdtp_ui_defs_data.selected_ok_button_offset, mdtp_ui_defs_data.ok_button_width, mdtp_ui_defs_data.ok_button_height,  ok_x, ok_y);
 }
 
 /**
@@ -432,10 +406,10 @@
  */
 static void display_pin_instructions()
 {
-    uint32_t x = CENTER_IMAGE_ON_X_AXIS(MDTP_PIN_INSTRUCTIONS_WIDTH,fb_config->width);
+    uint32_t x = CENTER_IMAGE_ON_X_AXIS(mdtp_ui_defs_data.pin_instructions_width,fb_config->width);
 	uint32_t y = (fb_config->height)*OK_TEXT_RELATIVE_Y_LOCATION;
 
-	display_image(MDTP_PIN_INSTRUCTIONS_OFFSET, MDTP_PIN_INSTRUCTIONS_WIDTH, MDTP_PIN_INSTRUCTIONS_HEIGHT, x, y);
+	display_image(mdtp_ui_defs_data.pin_instructions_offset, mdtp_ui_defs_data.pin_instructions_width, mdtp_ui_defs_data.pin_instructions_height, x, y);
 }
 
 /**
@@ -445,7 +419,17 @@
 {
     uint32_t y = (fb_config->height)*OK_TEXT_RELATIVE_Y_LOCATION;
 
-	fbcon_clear_section(y, MDTP_PIN_INSTRUCTIONS_HEIGHT);
+	fbcon_clear_section(y, mdtp_ui_defs_data.pin_instructions_height);
+}
+
+/**
+ * Initialize data structures required for MDTP UI.
+ */
+static void init_mdtp_ui_data()
+{
+	fb_config = fbcon_display();
+	alloc_mdtp_image();
+	mdtp_ui_defs_data = mdtp_get_target_ui_defs();
 }
 
 /**
@@ -456,8 +440,7 @@
 	if (g_initial_screen_displayed == true)
 		return;
 
-	fb_config = fbcon_display();
-	alloc_mdtp_image();
+	init_mdtp_ui_data();
 
 	if (fb_config)
 	{
@@ -471,12 +454,12 @@
 
 		g_pin_frames_y_location = ((fb_config->height)*PIN_RELATIVE_Y_LOCATION);
 
-		uint32_t total_pin_length = pin_length*MDTP_PIN_DIGIT_WIDTH + DIGIT_SPACE*(pin_length - 1);
+		uint32_t total_pin_length = pin_length*mdtp_ui_defs_data.pin_digit_width + mdtp_ui_defs_data.digit_space*(pin_length - 1);
 		uint32_t complete_pin_centered = (fb_config->width - total_pin_length)/2;
 
 		for (uint32_t i=0; i<pin_length; i++)
 		{
-			g_pin_frames_x_location[i] = complete_pin_centered + i*(DIGIT_SPACE+MDTP_PIN_DIGIT_WIDTH);
+			g_pin_frames_x_location[i] = complete_pin_centered + i*(mdtp_ui_defs_data.digit_space+mdtp_ui_defs_data.pin_digit_width);
 		}
 
 		for (uint32_t i=0; i<pin_length; i++)
@@ -609,8 +592,7 @@
  */
 void display_error_msg()
 {
-	fb_config = fbcon_display();
-	alloc_mdtp_image();
+	init_mdtp_ui_data();
 
 	if (fb_config)
 	{
diff --git a/app/aboot/mdtp_ui_defs.c b/app/aboot/mdtp_ui_defs.c
new file mode 100644
index 0000000..2c9fbb0
--- /dev/null
+++ b/app/aboot/mdtp_ui_defs.c
@@ -0,0 +1,68 @@
+/* Copyright (c) 2015, 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, Inc. 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 <compiler.h>
+#include "mdtp_ui_defs.h"
+
+struct mdtp_ui_defs mdtp_ui_defs_default = {
+        // Image dimensions
+        1412,     // error_msg_width;
+        212,      // error_msg_height;
+        1364,     // main_text_width;
+        288,      // main_text_height;
+        180,      // pin_digit_width;
+        180,      // pin_digit_height;
+        644,      // ok_button_width;
+        158,      // ok_button_height;
+        1384,     // digits_instructions_width;
+        166,      // digits_instructions_height;
+        920,      // pin_instructions_width;
+        204,      // pin_instructions_height;
+
+        // Image offsets
+        0x1000,   // error_msg_offset;
+        0xDD000,  // initial_delay_offset;
+        0x1FD000, // enter_pin_offset;
+        0x31D000, // invalid_pin_offset;
+        0x43D000, // pin_digit_0_offset;
+        0x18000,  // pin_digits_offset;
+        0x52D000, // pin_selected_digit_0_offset;
+        0x61D000, // ok_button_offset;
+        0x668000, // selected_ok_button_offset;
+        0x6B3000, // digits_instructions_offset;
+        0x75C000, // pin_instructions_offset;
+
+        //Display settings
+        12        // mdtp_digit_space;
+};
+
+__WEAK struct mdtp_ui_defs mdtp_get_target_ui_defs()
+{
+    return mdtp_ui_defs_default;
+}
diff --git a/app/aboot/mdtp_ui_defs.h b/app/aboot/mdtp_ui_defs.h
new file mode 100644
index 0000000..15e3b51
--- /dev/null
+++ b/app/aboot/mdtp_ui_defs.h
@@ -0,0 +1,65 @@
+/* Copyright (c) 2015, 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, Inc. 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 <stdlib.h>
+
+struct mdtp_ui_defs {
+
+    // Image dimensions
+    uint32_t error_msg_width;
+    uint32_t error_msg_height;
+    uint32_t main_text_width;
+    uint32_t main_text_height;
+    uint32_t pin_digit_width;
+    uint32_t pin_digit_height;
+    uint32_t ok_button_width;
+    uint32_t ok_button_height;
+    uint32_t digits_instructions_width;
+    uint32_t digits_instructions_height;
+    uint32_t pin_instructions_width;
+    uint32_t pin_instructions_height;
+
+    // Image offsets
+    uint32_t error_msg_offset;
+    uint32_t initial_delay_offset;
+    uint32_t enter_pin_offset;
+    uint32_t invalid_pin_offset;
+    uint32_t pin_digit_0_offset;
+    uint32_t pin_digits_offset;
+    uint32_t pin_selected_digit_0_offset;
+    uint32_t ok_button_offset;
+    uint32_t selected_ok_button_offset;
+    uint32_t digits_instructions_offset;
+    uint32_t pin_instructions_offset;
+
+    //Display settings
+    uint32_t digit_space;
+};
+
+struct mdtp_ui_defs mdtp_get_target_ui_defs();
diff --git a/app/aboot/rules.mk b/app/aboot/rules.mk
index 7774788..cbc053a 100644
--- a/app/aboot/rules.mk
+++ b/app/aboot/rules.mk
@@ -15,5 +15,6 @@
 OBJS += \
 	$(LOCAL_DIR)/mdtp.o \
 	$(LOCAL_DIR)/mdtp_ui.o \
-	$(LOCAL_DIR)/mdtp_fuse.o
+	$(LOCAL_DIR)/mdtp_fuse.o \
+	$(LOCAL_DIR)/mdtp_ui_defs.o
 endif
diff --git a/dev/gcdb/display/include/panel_fl10802_fwvga_video.h b/dev/gcdb/display/include/panel_fl10802_fwvga_video.h
index 8e30f57..80c64bd 100644
--- a/dev/gcdb/display/include/panel_fl10802_fwvga_video.h
+++ b/dev/gcdb/display/include/panel_fl10802_fwvga_video.h
@@ -210,7 +210,7 @@
 
 static char fl10802_fwvga_video_on_cmd17[] = {
 	0x02, 0x00, 0x39, 0xC0,
-	0x53, 0x2C, 0xFF, 0xFF,
+	0x53, 0x24, 0xFF, 0xFF,
 };
 
 static char fl10802_fwvga_video_on_cmd18[] = {
@@ -220,7 +220,7 @@
 
 static char fl10802_fwvga_video_on_cmd19[] = {
 	0x02, 0x00, 0x39, 0xC0,
-	0x51, 0xFF, 0xFF, 0xFF,
+	0x51, 0x00, 0xFF, 0xFF,
 };
 
 static char fl10802_fwvga_video_on_cmd20[] = {
@@ -231,6 +231,11 @@
 	0x29, 0x00, 0x05, 0x80
 };
 
+static char fl10802_fwvga_video_on_cmd22[] = {
+	0x02, 0x00, 0x39, 0xC0,
+	0x51, 0xFF, 0xFF, 0xFF,
+};
+
 static struct mipi_dsi_cmd fl10802_fwvga_video_on_command[] = {
 	{0x8, fl10802_fwvga_video_on_cmd0, 0x00},
 	{0xc, fl10802_fwvga_video_on_cmd1, 0x00},
@@ -253,10 +258,11 @@
 	{0x8, fl10802_fwvga_video_on_cmd18, 0x00},
 	{0x8, fl10802_fwvga_video_on_cmd19, 0x00},
 	{0x4, fl10802_fwvga_video_on_cmd20, 0x78},
-	{0x4, fl10802_fwvga_video_on_cmd21, 0x78}
+	{0x4, fl10802_fwvga_video_on_cmd21, 0x78},
+	{0x8, fl10802_fwvga_video_on_cmd22, 0x00}
 };
 
-#define FL10802_FWVGA_VIDEO_ON_COMMAND 22
+#define FL10802_FWVGA_VIDEO_ON_COMMAND 23
 
 
 static char fl10802_fwvga_videooff_cmd0[] = {
diff --git a/dev/pmic/pmi8994/pm_app_smbchg.c b/dev/pmic/pmi8994/pm_app_smbchg.c
index 4d8a2db..d3d1d6b 100644
--- a/dev/pmic/pmi8994/pm_app_smbchg.c
+++ b/dev/pmic/pmi8994/pm_app_smbchg.c
@@ -203,8 +203,8 @@
       {
           //Ensure that Charging is enabled
           err_flag |= pm_smbchg_chgr_enable_src(device_index, FALSE);
-          err_flag |= pm_smbchg_chgr_set_chg_polarity_low(device_index, FALSE);
-          err_flag |= pm_smbchg_bat_if_config_chg_cmd(device_index, PM_SMBCHG_BAT_IF_CMD__EN_BAT_CHG, TRUE);
+          err_flag |= pm_smbchg_chgr_set_chg_polarity_low(device_index, TRUE);
+          err_flag |= pm_smbchg_bat_if_config_chg_cmd(device_index, PM_SMBCHG_BAT_IF_CMD__EN_BAT_CHG, FALSE);
           udelay(PM_WEAK_BATTERY_CHARGING_DELAY);
       }
 
diff --git a/dev/pmic/pmi8994/pm_smbchg_chgr.c b/dev/pmic/pmi8994/pm_smbchg_chgr.c
index 2179772..629ba15 100644
--- a/dev/pmic/pmi8994/pm_smbchg_chgr.c
+++ b/dev/pmic/pmi8994/pm_smbchg_chgr.c
@@ -1084,7 +1084,7 @@
       pm_register_address_type chgr_cfg2 = smbchg_ptr->smbchg_register->chgr_register->base_address + smbchg_ptr->smbchg_register->chgr_register->chgr_cfg2;
 
       err_flag = pm_smbchg_chgr_unlock_perph_write(smbchg_ptr);
-      err_flag |= pm_comm_write_byte_mask(smbchg_ptr->comm_ptr->slave_id, chgr_cfg2, 0x40, chg_pol_low, 0);
+      err_flag |= pm_comm_write_byte_mask(smbchg_ptr->comm_ptr->slave_id, chgr_cfg2, 0x40, (chg_pol_low ? 0x40 : 0), 0);
    }
 
    return err_flag;
diff --git a/platform/msm8952/platform.c b/platform/msm8952/platform.c
index af4f279..ec5a1d8 100644
--- a/platform/msm8952/platform.c
+++ b/platform/msm8952/platform.c
@@ -117,7 +117,7 @@
 	sections = 90;
 	while(sections--)
 	{
-		arm_mmu_map_section(ddr_start + sections * MB, ddr_start + sections* MB, COMMON_MEMORY);
+		arm_mmu_map_section(ddr_start + sections * MB, ddr_start + sections* MB, SCRATCH_MEMORY);
 	}
 
 
diff --git a/project/msm8952.mk b/project/msm8952.mk
index 23bff86..54d4fa8 100644
--- a/project/msm8952.mk
+++ b/project/msm8952.mk
@@ -64,7 +64,7 @@
 
 ifeq ($(ENABLE_MDTP_SUPPORT),1)
 DEFINES += MDTP_SUPPORT=1
-DEFINES += MDTP_EFUSE_ADDRESS=0x0C858250 # QFPROM_RAW_QC_SPARE_REG_LSB_ADDR
+DEFINES += MDTP_EFUSE_ADDRESS=0x0005C250 # QFPROM_CORR_QC_SPARE_REG_LSB_ADDR
 DEFINES += MDTP_EFUSE_START=0
 endif
 
diff --git a/target/msm8909/oem_panel.c b/target/msm8909/oem_panel.c
index 6d84eef..7b6e473 100644
--- a/target/msm8909/oem_panel.c
+++ b/target/msm8909/oem_panel.c
@@ -319,6 +319,7 @@
 		memcpy(phy_db->timing,
 				fl10802_fwvga_video_timings, TIMING_SIZE);
 		pinfo->mipi.signature = FL10802_FWVGA_VIDEO_SIGNATURE;
+		pinfo->mipi.cmds_post_tg = 1;
 		break;
 	case UNKNOWN_PANEL:
 	default:
diff --git a/target/msm8952/mdtp_ui_defs.c b/target/msm8952/mdtp_ui_defs.c
new file mode 100644
index 0000000..7091f15
--- /dev/null
+++ b/target/msm8952/mdtp_ui_defs.c
@@ -0,0 +1,67 @@
+/* Copyright (c) 2015, 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, Inc. 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 "mdtp_ui_defs.h"
+
+struct mdtp_ui_defs mdtp_ui_defs_msm8952 = {
+        // Image dimensions
+        952,      // error_msg_width;
+        143,      // error_msg_height;
+        920,      // main_text_width;
+        194,      // main_text_height;
+        120,      // pin_digit_width;
+        120,      // pin_digit_height;
+        432,      // ok_button_width;
+        106,      // ok_button_height;
+        932,      // digits_instructions_width;
+        112,      // digits_instructions_height;
+        620,      // pin_instructions_width;
+        137,      // pin_instructions_height;
+
+        // Image offsets
+        0x1000,   // error_msg_offset;
+        0x65000,  // initial_delay_offset;
+        0xE8000,  // enter_pin_offset;
+        0x16B000, // invalid_pin_offset;
+        0x1EE000, // pin_digit_0_offset;
+        0xB000,   // pin_digits_offset;
+        0x25C000, // pin_selected_digit_0_offset;
+        0x2CA000, // ok_button_offset;
+        0x2EC000, // selected_ok_button_offset;
+        0x30E000, // digits_instructions_offset;
+        0x35B000, // pin_instructions_offset;
+
+        //Display settings
+        8         // digit_space;
+};
+
+struct mdtp_ui_defs mdtp_get_target_ui_defs()
+{
+    return mdtp_ui_defs_msm8952;
+}
diff --git a/target/msm8952/rules.mk b/target/msm8952/rules.mk
index c488c21..142cd88 100644
--- a/target/msm8952/rules.mk
+++ b/target/msm8952/rules.mk
@@ -2,6 +2,9 @@
 
 INCLUDES += -I$(LOCAL_DIR)/include -I$(LK_TOP_DIR)/platform/msm_shared
 INCLUDES += -I$(LK_TOP_DIR)/dev/gcdb/display -I$(LK_TOP_DIR)/dev/gcdb/display/include
+ifeq ($(ENABLE_MDTP_SUPPORT),1)
+INCLUDES += -I$(LK_TOP_DIR)/app/aboot
+endif
 
 PLATFORM := msm8952
 
@@ -43,3 +46,7 @@
 OBJS += \
 	$(LOCAL_DIR)/regulator.o
 endif
+ifeq ($(ENABLE_MDTP_SUPPORT),1)
+OBJS += \
+	$(LOCAL_DIR)/mdtp_ui_defs.o
+endif
diff --git a/target/msm8952/target_display.c b/target/msm8952/target_display.c
index abe8937..f4664ec 100644
--- a/target/msm8952/target_display.c
+++ b/target/msm8952/target_display.c
@@ -55,8 +55,8 @@
 #define DSC_VID_PANEL "dsc_vid_panel"
 #define DSC_VID_PANEL_ADV7533_1080P "dsc_vid_panel_adv7533_1080p"
 #define DSC_CMD_PANEL_ADV7533_1080P "dsc_cmd_panel_adv7533_1080p"
-#define DSC_CMD_PANEL_STRING "1:dsi:0:none:1:qcom,mdss_dsi_nt35597_dsc_wqxga_cmd"
-#define DSC_VID_PANEL_STRING "1:dsi:0:none:1:qcom,mdss_dsi_nt35597_dsc_wqxga_video"
+#define DSC_CMD_PANEL_STRING "1:dsi:0:none:1:qcom,mdss_dsi_nt35597_dsc_wqxga_cmd:cfg:single_dsi"
+#define DSC_VID_PANEL_STRING "1:dsi:0:none:1:qcom,mdss_dsi_nt35597_dsc_wqxga_video:cfg:single_dsi"
 #define DSC_CMD_PANEL_ADV7533_1080P_STRING "1:dsi:0:qcom,mdss_dsi_adv7533_1080p:1:qcom,mdss_dsi_nt35597_dsc_wqxga_cmd:cfg:dual_dsi"
 #define DSC_VID_PANEL_ADV7533_1080P_STRING "1:dsi:0:qcom,mdss_dsi_adv7533_1080p:1:qcom,mdss_dsi_nt35597_dsc_wqxga_video:cfg:dual_dsi"
 
diff --git a/target/msm8996/init.c b/target/msm8996/init.c
index e6cfeed..017b8d2 100644
--- a/target/msm8996/init.c
+++ b/target/msm8996/init.c
@@ -63,7 +63,7 @@
 #endif
 
 #define CE_INSTANCE             1
-#define CE_EE                   1
+#define CE_EE                   0
 #define CE_FIFO_SIZE            64
 #define CE_READ_PIPE            3
 #define CE_WRITE_PIPE           2
@@ -155,6 +155,13 @@
 		pm_appsbl_set_dcin_suspend(1);
 #endif
 
+
+	if (crypto_initialized())
+	{
+		crypto_eng_cleanup();
+		clock_ce_disable(CE_INSTANCE);
+	}
+
 	/* Tear down glink channels */
 	rpm_glink_uninit();
 
@@ -405,7 +412,7 @@
 
 crypto_engine_type board_ce_type(void)
 {
-	return CRYPTO_ENGINE_TYPE_SW;
+	return CRYPTO_ENGINE_TYPE_HW;
 }
 
 /* Set up params for h/w CE. */