Merge "target: msm8952: add delay time after panel init for r69006" into lk.lnx.1.0-dev.1.0
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index c25f3b3..5ef7764 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -727,7 +727,7 @@
 
 	void (*entry)(unsigned, unsigned, unsigned*) = (entry_func_ptr*)(PA((addr_t)kernel));
 	uint32_t tags_phys = PA((addr_t)tags);
-	struct kernel64_hdr *kptr = (struct kernel64_hdr*)kernel;
+	struct kernel64_hdr *kptr = ((struct kernel64_hdr*)(PA((addr_t)kernel)));
 
 	ramdisk = (void *)PA((addr_t)ramdisk);
 
diff --git a/dev/gcdb/display/fastboot_oem_display.h b/dev/gcdb/display/fastboot_oem_display.h
index b0a1371..26873ed 100644
--- a/dev/gcdb/display/fastboot_oem_display.h
+++ b/dev/gcdb/display/fastboot_oem_display.h
@@ -104,6 +104,10 @@
 	{"truly_wvga_video", "qcom,mdss_dsi_truly_wvga_video", false},
 	{"adv16", "qcom,mdss_dsi_adv7533_1080p", false},
 	{"adv4", "qcom,mdss_dsi_adv7533_720p", false},
+	{"nt35950_4k_dsc_cmd", "qcom,mdss_dsi_nt35950_4k_dsc_cmd", true},
+	{"sharp_1080p_cmd", "qcom,mdss_dsi_sharp_1080p_cmd", false},
+	{"sharp_120hz_1080p_cmd", "qcom,mdss_dual_sharp_1080p_120hz_cmd",
+		true},
 };
 
 struct sim_lookup_list lookup_sim[] = {
diff --git a/platform/mdmfermium/platform.c b/platform/mdmfermium/platform.c
index 2c38ec7..457274c 100644
--- a/platform/mdmfermium/platform.c
+++ b/platform/mdmfermium/platform.c
@@ -50,7 +50,12 @@
 /* Peripherals - shared device */
 #define IOMAP_MEMORY                          (MMU_MEMORY_TYPE_DEVICE_SHARED | \
                                                                  MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
+#define SCRATCH_REGION1_VIRT_START_128            0x88000000
+#define SCRATCH_REGION2_VIRT_START_128            (SCRATCH_REGION1_VIRT_START_128 + SCRATCH_REGION1_SIZE_128)
 
+static void ddr_based_mmu_mappings(mmu_section_t *table, uint32_t table_size);
+static uint64_t ddr_size;
+static void board_ddr_detect();
 
 /* Map all the accesssible memory according to the following rules:
  * 1. Map 1MB from MSM_SHARED_BASE with 1 -1 mapping.
@@ -67,10 +72,28 @@
 	{MSM_IOMAP_BASE,          MSM_IOMAP_BASE,                 MSM_IOMAP_SIZE,                 IOMAP_MEMORY},
 	{A7_SS_BASE,              A7_SS_BASE,                     A7_SS_SIZE,                     IOMAP_MEMORY},
 	{MSM_SHARED_IMEM_BASE,    MSM_SHARED_IMEM_BASE,           1,                              IOMAP_MEMORY},
-	{SCRATCH_REGION1,         SCRATCH_REGION1,                SCRATCH_REGION1_SIZE / MB,      SCRATCH_MEMORY},
-	{KERNEL_REGION,           KERNEL_REGION,                  KERNEL_REGION_SIZE / MB,        SCRATCH_MEMORY},
 };
 
+mmu_section_t mmu_section_table_128[] = {
+	{SCRATCH_REGION1_128,         SCRATCH_REGION1_VIRT_START_128,     SCRATCH_REGION1_SIZE_128/ MB,      SCRATCH_MEMORY},
+	{SCRATCH_REGION2_128,         SCRATCH_REGION2_VIRT_START_128,     SCRATCH_REGION2_SIZE_128/ MB,      SCRATCH_MEMORY},
+};
+
+mmu_section_t mmu_section_table_256[] = {
+	{SCRATCH_REGION_256,         SCRATCH_REGION_256,          SCRATCH_REGION_SIZE_256/ MB,      SCRATCH_MEMORY},
+	{KERNEL_REGION,              KERNEL_REGION,               KERNEL_REGION_SIZE/ MB,           SCRATCH_MEMORY},
+};
+
+static void board_ddr_detect()
+{
+	ddr_size = smem_get_ddr_size();
+	/*128MB DDR*/
+	if(ddr_size == 0x8000000)
+		ddr_based_mmu_mappings(mmu_section_table_128, ARRAY_SIZE(mmu_section_table_128));
+	else
+		ddr_based_mmu_mappings(mmu_section_table_256, ARRAY_SIZE(mmu_section_table_256));
+}
+
 void platform_early_init(void)
 {
 	board_init();
@@ -78,6 +101,7 @@
 	qgic_init();
 	qtimer_init();
 	scm_init();
+	board_ddr_detect();
 }
 
 void platform_init(void)
@@ -103,14 +127,115 @@
 
 addr_t platform_get_virt_to_phys_mapping(addr_t virt_addr)
 {
-	/* Fixed 1-1 mapping */
-	return virt_addr;
+	uint32_t paddr;
+	uint32_t table_size = ARRAY_SIZE(mmu_section_table);
+	uint32_t limit;
+
+	for (uint32_t i = 0; i < table_size; i++)
+	{
+		limit = (mmu_section_table[i].num_of_sections * MB) - 0x1;
+
+		if (virt_addr >= mmu_section_table[i].vaddress &&
+			virt_addr <= (mmu_section_table[i].vaddress + limit))
+		{
+				paddr = mmu_section_table[i].paddress + (virt_addr - mmu_section_table[i].vaddress);
+				return paddr;
+		}
+	}
+	if(ddr_size == 0x8000000)
+	{
+		table_size = ARRAY_SIZE(mmu_section_table_128);
+		for (uint32_t i = 0; i < table_size; i++)
+		{
+			limit = (mmu_section_table_128[i].num_of_sections * MB) - 0x1;
+
+			if (virt_addr >= mmu_section_table_128[i].vaddress &&
+				virt_addr <= (mmu_section_table_128[i].vaddress + limit))
+			{
+				paddr = mmu_section_table_128[i].paddress + (virt_addr - mmu_section_table_128[i].vaddress);
+				return paddr;
+			}
+		}
+	}
+	else
+	{
+		/* Any DDR > 256MB would be mapped here & LK would use only first 256 MB */
+		table_size = ARRAY_SIZE(mmu_section_table_256);
+		for (uint32_t i = 0; i < table_size; i++)
+		{
+			limit = (mmu_section_table_256[i].num_of_sections * MB) - 0x1;
+
+			if (virt_addr >= mmu_section_table_256[i].vaddress &&
+				virt_addr <= (mmu_section_table_256[i].vaddress + limit))
+			{
+				paddr = mmu_section_table_256[i].paddress + (virt_addr - mmu_section_table_256[i].vaddress);
+				return paddr;
+			}
+		}
+	}
+	/* No special mapping found.
+	 * Assume 1-1 mapping.
+	 */
+	 paddr = virt_addr;
+	return paddr;
+
 }
 
 addr_t platform_get_phys_to_virt_mapping(addr_t phys_addr)
 {
-        /* Fixed 1-1 mapping */
-	return phys_addr;
+	uint32_t vaddr;
+	uint32_t table_size = ARRAY_SIZE(mmu_section_table);
+	uint32_t limit;
+
+	for (uint32_t i = 0; i < table_size; i++)
+	{
+		limit = (mmu_section_table[i].num_of_sections * MB) - 0x1;
+
+		if (phys_addr >= mmu_section_table[i].paddress &&
+			phys_addr <= (mmu_section_table[i].paddress + limit))
+		{
+				vaddr = mmu_section_table[i].vaddress + (phys_addr - mmu_section_table[i].paddress);
+				return vaddr;
+		}
+	}
+	if(ddr_size == 0x8000000)
+	{
+		table_size = ARRAY_SIZE(mmu_section_table_128);
+		for (uint32_t i = 0; i < table_size; i++)
+		{
+			limit = (mmu_section_table_128[i].num_of_sections * MB) - 0x1;
+
+			if (phys_addr >= mmu_section_table_128[i].paddress &&
+				phys_addr <= (mmu_section_table_128[i].paddress + limit))
+			{
+				vaddr = mmu_section_table_128[i].vaddress + (phys_addr - mmu_section_table_128[i].paddress);
+				return vaddr;
+			}
+		}
+	}
+	else
+	{
+		/* Any DDR > 256MB would be mapped here & LK would use only first 256 MB */
+		table_size = ARRAY_SIZE(mmu_section_table_256);
+		for (uint32_t i = 0; i < table_size; i++)
+		{
+			limit = (mmu_section_table_256[i].num_of_sections * MB) - 0x1;
+
+			if (phys_addr >= mmu_section_table_256[i].paddress &&
+				phys_addr <= (mmu_section_table_256[i].paddress + limit))
+			{
+				vaddr = mmu_section_table_256[i].vaddress + (phys_addr - mmu_section_table_256[i].paddress);
+				return vaddr;
+			}
+		}
+	}
+
+	/* No special mapping found.
+	 * Assume 1-1 mapping.
+	 */
+	 vaddr = phys_addr;
+
+	return vaddr;
 }
 
 /* Setup memory for this platform */
@@ -136,6 +261,31 @@
 		}
 	}
 }
+
+/* Setup memory for this platform */
+static void ddr_based_mmu_mappings(mmu_section_t *table,uint32_t table_size)
+{
+	uint32_t i;
+	uint32_t sections;
+
+	/* Configure the MMU page entries for memory read from the
+		 mmu_section_table */
+	for (i = 0; i < table_size; i++)
+	{
+		sections = table->num_of_sections;
+
+		while (sections--)
+		{
+			arm_mmu_map_section(table->paddress +
+								sections * MB,
+								table->vaddress +
+								sections * MB,
+								table->flags);
+		}
+	table++;
+	}
+}
+
 int platform_use_identity_mmu_mappings(void)
 {
 	/* Use only the mappings specified in this file. */
diff --git a/platform/msm8952/include/platform/iomap.h b/platform/msm8952/include/platform/iomap.h
index 5a92c58..8409272 100644
--- a/platform/msm8952/include/platform/iomap.h
+++ b/platform/msm8952/include/platform/iomap.h
@@ -37,8 +37,8 @@
 #define DDR_START                          get_ddr_start()
 #define ABOOT_FORCE_KERNEL_ADDR            DDR_START + 0x8000
 #define ABOOT_FORCE_KERNEL64_ADDR          DDR_START + 0x80000
-#define ABOOT_FORCE_RAMDISK_ADDR           DDR_START + 0x2000000
-#define ABOOT_FORCE_TAGS_ADDR              DDR_START + 0x1E00000
+#define ABOOT_FORCE_TAGS_ADDR              DDR_START + 0x3400000
+#define ABOOT_FORCE_RAMDISK_ADDR           DDR_START + 0x3600000
 
 #define MSM_SHARED_BASE                    0x86300000
 #define MSM_SHARED_IMEM_BASE               0x08600000
diff --git a/platform/msm8952/msm8952-clock.c b/platform/msm8952/msm8952-clock.c
index df6b056..bf87489 100644
--- a/platform/msm8952/msm8952-clock.c
+++ b/platform/msm8952/msm8952-clock.c
@@ -399,10 +399,15 @@
 };
 
 static struct clk_freq_tbl ftbl_mdp_clk[] = {
-	F( 80000000,  gpll0,   10,    0,    0),
-	F( 100000000, gpll0,    8,    0,    0),
-	F( 200000000, gpll0,    4,    0,    0),
-	F( 320000000, gpll0,  2.5,    0,    0),
+	F( 50000000,    gpll0,  16,     0,      0),
+	F( 80000000,    gpll0,  10,     0,      0),
+	F( 100000000,   gpll0,  8,      0,      0),
+	F( 145450000,   gpll0,  5.5,    0,      0),
+	F( 160000000,   gpll0,  5,      0,      0),
+	F( 177780000,   gpll0,  4.5,    0,      0),
+	F( 200000000,   gpll0,  4,      0,      0),
+	F( 266670000,   gpll0,  3,      0,      0),
+	F( 320000000,   gpll0,  2.5,    0,      0),
 	F_END
 };
 
diff --git a/platform/msm8952/platform.c b/platform/msm8952/platform.c
index e3e8948..5eaa241 100644
--- a/platform/msm8952/platform.c
+++ b/platform/msm8952/platform.c
@@ -67,7 +67,7 @@
 	{    APPS_SS_BASE,          APPS_SS_BASE,            APPS_SS_SIZE,           IOMAP_MEMORY},
 	{    MSM_SHARED_IMEM_BASE,  MSM_SHARED_IMEM_BASE,    1,                      COMMON_MEMORY},
 	{    SCRATCH_ADDR,          SCRATCH_ADDR,            512,                    SCRATCH_MEMORY},
-	{    MIPI_FB_ADDR,          MIPI_FB_ADDR,            42,                     COMMON_MEMORY},
+	{    MIPI_FB_ADDR,          MIPI_FB_ADDR,            20,                     COMMON_MEMORY},
 	{    RPMB_SND_RCV_BUF,      RPMB_SND_RCV_BUF,        RPMB_SND_RCV_BUF_SZ,    IOMAP_MEMORY},
 };
 
diff --git a/platform/msm_shared/include/mdp5.h b/platform/msm_shared/include/mdp5.h
index 5a61f17..14e84b3 100644
--- a/platform/msm_shared/include/mdp5.h
+++ b/platform/msm_shared/include/mdp5.h
@@ -93,6 +93,7 @@
 #define MDSS_MDP_HW_REV_110    MDSS_MDP_REV(1, 10, 0) /* 8992 v1.0 */
 #define MDSS_MDP_HW_REV_111    MDSS_MDP_REV(1, 11, 0) /* 8956 v1.0 */
 #define MDSS_MDP_HW_REV_112    MDSS_MDP_REV(1, 12, 0) /* 8952 v1.0 */
+#define MDSS_MDP_HW_REV_114    MDSS_MDP_REV(1, 14, 0) /* 8937 v1.0 */
 #define MDSS_MDP_HW_REV_200    MDSS_MDP_REV(2, 0, 0) /* 8092 v1.0 */
 
 #define MDSS_MAX_LINE_BUF_WIDTH 2048
diff --git a/platform/msm_shared/mdp5.c b/platform/msm_shared/mdp5.c
index 19317ac..72ca46a 100755
--- a/platform/msm_shared/mdp5.c
+++ b/platform/msm_shared/mdp5.c
@@ -58,14 +58,16 @@
 
 static inline bool is_software_pixel_ext_config_needed()
 {
-	return MDSS_IS_MAJOR_MINOR_MATCHING(readl(MDP_HW_REV),
-		MDSS_MDP_HW_REV_107);
+	return (MDSS_IS_MAJOR_MINOR_MATCHING(readl(MDP_HW_REV),
+		MDSS_MDP_HW_REV_107) || MDSS_IS_MAJOR_MINOR_MATCHING(readl(MDP_HW_REV),
+		MDSS_MDP_HW_REV_114));
 }
 
 static inline bool has_fixed_size_smp()
 {
-	return MDSS_IS_MAJOR_MINOR_MATCHING(readl(MDP_HW_REV),
-		MDSS_MDP_HW_REV_107);
+	return (MDSS_IS_MAJOR_MINOR_MATCHING(readl(MDP_HW_REV),
+		MDSS_MDP_HW_REV_107) || MDSS_IS_MAJOR_MINOR_MATCHING(readl(MDP_HW_REV),
+		MDSS_MDP_HW_REV_114));
 }
 
 uint32_t mdss_mdp_intf_offset()
@@ -76,7 +78,8 @@
 	if ((mdss_mdp_rev == MDSS_MDP_HW_REV_106) ||
 		(mdss_mdp_rev == MDSS_MDP_HW_REV_108) ||
 		(mdss_mdp_rev == MDSS_MDP_HW_REV_111) ||
-		(mdss_mdp_rev == MDSS_MDP_HW_REV_112))
+		(mdss_mdp_rev == MDSS_MDP_HW_REV_112) ||
+		(mdss_mdp_rev == MDSS_MDP_HW_REV_114))
 		mdss_mdp_intf_off = 0x59100;
 	else if (mdss_mdp_rev >= MDSS_MDP_HW_REV_102)
 		mdss_mdp_intf_off = 0;
@@ -110,7 +113,8 @@
 	uint32_t mdss_mdp_rev = readl(MDP_HW_REV);
 
 	if ((mdss_mdp_rev == MDSS_MDP_HW_REV_110) ||
-		(mdss_mdp_rev == MDSS_MDP_HW_REV_111))
+		(mdss_mdp_rev == MDSS_MDP_HW_REV_111) ||
+		(mdss_mdp_rev == MDSS_MDP_HW_REV_114))
 		return 0xB0020;
 	else if (MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_107))
 		return 0xB0000;
@@ -207,6 +211,7 @@
 		(mdss_mdp_rev == MDSS_MDP_HW_REV_109) ||
 		MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev,
 			MDSS_MDP_HW_REV_107) ||
+		(mdss_mdp_rev == MDSS_MDP_HW_REV_114) ||
 		(mdss_mdp_rev == MDSS_MDP_HW_REV_110)) {
 		if (pinfo->dest == DISPLAY_2) {
 			*ctl0_reg_val |= BIT(29);
@@ -1155,7 +1160,8 @@
 
 	mdp_select_pipe_type(pinfo, &left_pipe, &right_pipe);
 	mdss_vbif_setup();
-	mdss_smp_setup(pinfo, left_pipe, right_pipe);
+	if (!has_fixed_size_smp())
+		mdss_smp_setup(pinfo, left_pipe, right_pipe);
 	mdss_qos_remapper_setup();
 	mdss_vbif_qos_remapper_setup(pinfo);
 
diff --git a/platform/msm_shared/mipi_dsi.c b/platform/msm_shared/mipi_dsi.c
index d336f8b..1e768ad 100644
--- a/platform/msm_shared/mipi_dsi.c
+++ b/platform/msm_shared/mipi_dsi.c
@@ -833,7 +833,7 @@
 	{
 		mdss_dsi_panel_shutdown(pinfo);
 		writel(0, pinfo->mipi.ctl_base + CLK_CTRL);
-		writel(0x1F1, pinfo->mipi.ctl_base + CTRL);
+		writel(0, pinfo->mipi.ctl_base + CTRL);
 	}
 
 	writel(0x1115501, pinfo->mipi.ctl_base + INT_CTRL);
diff --git a/platform/msm_shared/qpic_nand.c b/platform/msm_shared/qpic_nand.c
index d2b6044..baba30d 100644
--- a/platform/msm_shared/qpic_nand.c
+++ b/platform/msm_shared/qpic_nand.c
@@ -71,7 +71,7 @@
 	/* Flash ID  Flash ID2 ID Mask     ID Mask2  Density(MB)    Wid Pgsz    Blksz              oobsz   8-bit ECCf */
 	{0x1590AC2C, 0x56,     0xFFFFFFFF, 0xFF,     0x20000000,    0,  2048,   0x00020000,        0x40,   0},
 	{0x1590AC2C, 0x57,     0xFFFFFFFF, 0xFF,     0x20000000,    0,  2048,   0x00020000,        0x40,   1},
-	{0x1590AA2C, 0x06,     0xFFFFFFFF, 0x0,      0x10000000,    0,  2048,   0x00020000,        0xE0,   1},
+	{0x1590AA2C, 0x06,     0xFFFFFFFF, 0x0,      0x10000000,    0,  2048,   0x00020000,        0xE0,   0},
 	{0x2690AC2C, 0x54,     0xFFFFFFFF, 0x0,      0x20000000,    0,  4096,   0x00040000,        0xE0,   1},
 	{0x1590ACAD, 0,        0xFFFFFFFF, 0x0,      0x20000000,    0,  2048,   0x00020000,        0x80,   0},
 	{0x9590DC2C, 0x56,     0xFFFFFFFF, 0x0,      0x10000000,    0,  2048,   0x00020000,        0x40,   0},
diff --git a/target/mdmfermium/meminfo.c b/target/mdmfermium/meminfo.c
index acaaa14..31eea83 100644
--- a/target/mdmfermium/meminfo.c
+++ b/target/mdmfermium/meminfo.c
@@ -85,10 +85,23 @@
 
 void *target_get_scratch_address(void)
 {
-	return ((void *)SCRATCH_ADDR);
+	uint64_t ddr_size = smem_get_ddr_size();
+	if (ddr_size == 0x8000000)
+		/*128MB DDR scratch address*/
+		return ((void *)VA((addr_t)SCRATCH_ADDR_128));
+	else
+		/*256MB DDR scratch address*/
+		return ((void *)VA((addr_t)SCRATCH_ADDR_256));
 }
-
+/*this function is to know max flashable size through fastboot*/
 unsigned target_get_max_flash_size(void)
 {
-	return (SCRATCH_REGION1_SIZE + SCRATCH_REGION2_SIZE);
+	uint64_t ddr_size = smem_get_ddr_size();
+
+	if (ddr_size == 0x8000000)
+		/*128MB DDR scratch size*/
+		return (SCRATCH_REGION1_SIZE_128 + SCRATCH_REGION2_SIZE_128);
+	else
+		/*256MB DDR scratch size*/
+		return (SCRATCH_REGION_SIZE_256);
 }
diff --git a/target/mdmfermium/rules.mk b/target/mdmfermium/rules.mk
index b614ea5..0bee605 100644
--- a/target/mdmfermium/rules.mk
+++ b/target/mdmfermium/rules.mk
@@ -7,16 +7,21 @@
 MEMBASE := 0x82900000 # SDRAM
 MEMSIZE := 0x00100000 # 1MB
 
-SCRATCH_ADDR                        := 0x88000000
-SCRATCH_REGION1                     := 0x88000000
-SCRATCH_REGION1_SIZE                := 0x08000000 # 128MB
-SCRATCH_REGION2                     := 0x0
-SCRATCH_REGION2_SIZE                := 0x0
+SCRATCH_ADDR                            := 0 # keeping for successful compilation
+SCRATCH_ADDR_128                        := 0x86000000
+SCRATCH_REGION1_128                     := 0x86000000
+SCRATCH_REGION1_SIZE_128                := 0x01c00000  # 28MB
+SCRATCH_REGION2_128                     := 0x80000000
+SCRATCH_REGION2_SIZE_128                := 0x02900000   # 41M
 
-KERNEL_REGION                       := 0x80000000
-KERNEL_REGION_SIZE                  := 0x2000000 # 20MB
+KERNEL_REGION                           := 0x80000000
+KERNEL_REGION_SIZE                      := 0x2000000 # 20MB
 
-BASE_ADDR                           := 0x80000000
+SCRATCH_ADDR_256                        := 0x88000000
+SCRATCH_REGION_256                      := 0x88000000
+SCRATCH_REGION_SIZE_256                 := 0x08000000  # 128MB
+
+BASE_ADDR                               := 0x80000000
 
 
 MODULES += \
@@ -31,9 +36,14 @@
 	MEMBASE=$(MEMBASE) \
 	BASE_ADDR=$(BASE_ADDR) \
 	SCRATCH_ADDR=$(SCRATCH_ADDR) \
-	SCRATCH_REGION1=$(SCRATCH_REGION1) \
-	SCRATCH_REGION1_SIZE=$(SCRATCH_REGION1_SIZE) \
-	SCRATCH_REGION2_SIZE=$(SCRATCH_REGION2_SIZE) \
+	SCRATCH_ADDR_128=$(SCRATCH_ADDR_128) \
+	SCRATCH_ADDR_256=$(SCRATCH_ADDR_256) \
+	SCRATCH_REGION_256=$(SCRATCH_REGION_256) \
+	SCRATCH_REGION1_128=$(SCRATCH_REGION1_128) \
+	SCRATCH_REGION2_128=$(SCRATCH_REGION2_128) \
+	SCRATCH_REGION1_SIZE_128=$(SCRATCH_REGION1_SIZE_128) \
+	SCRATCH_REGION2_SIZE_128=$(SCRATCH_REGION2_SIZE_128) \
+	SCRATCH_REGION_SIZE_256=$(SCRATCH_REGION_SIZE_256) \
 	KERNEL_REGION=$(KERNEL_REGION) \
 	KERNEL_REGION_SIZE=$(KERNEL_REGION_SIZE)
 
diff --git a/target/msm8952/include/target/display.h b/target/msm8952/include/target/display.h
index 87cbc3a..65f689a 100644
--- a/target/msm8952/include/target/display.h
+++ b/target/msm8952/include/target/display.h
@@ -81,7 +81,7 @@
 /*---------------------------------------------------------------------------*/
 #define DISPLAY_CMDLINE_PREFIX " mdss_mdp.panel="
 
-#define MIPI_FB_ADDR 0x83200000
+#define MIPI_FB_ADDR 0x8DD00000
 
 #define MIPI_HSYNC_PULSE_WIDTH       12
 #define MIPI_HSYNC_BACK_PORCH_DCLK   32
diff --git a/target/msm8952/rules.mk b/target/msm8952/rules.mk
index 3eaf841..c199e56 100644
--- a/target/msm8952/rules.mk
+++ b/target/msm8952/rules.mk
@@ -14,6 +14,7 @@
 BASE_ADDR        := 0x80000000
 SCRATCH_ADDR     := 0x90100000
 
+DEFINES += DISPLAY_SPLASH_SCREEN=1
 DEFINES += DISPLAY_TYPE_MIPI=1
 DEFINES += DISPLAY_TYPE_DSI6G=1
 
diff --git a/target/msm8952/target_display.c b/target/msm8952/target_display.c
index f3c3c32..f202509 100644
--- a/target/msm8952/target_display.c
+++ b/target/msm8952/target_display.c
@@ -360,6 +360,10 @@
 	if (platform_is_msm8956()) {
 		reset_gpio.pin_id = 25;
 		bkl_gpio.pin_id = 66;
+	} else if (platform_is_msm8937()) {
+		reset_gpio.pin_id = 60;
+		bkl_gpio.pin_id = 98;
+		enable_gpio.pin_id = 99;
 	} else if ((hw_id == HW_PLATFORM_QRD) &&
 		   (hw_subtype == HW_PLATFORM_SUBTYPE_POLARIS)) {
 		enable_gpio.pin_id = 19;
@@ -484,7 +488,7 @@
 
 int target_display_get_base_offset(uint32_t base)
 {
-	if(platform_is_msm8956()) {
+	if(platform_is_msm8956() || platform_is_msm8937()) {
 		if (base == MIPI_DSI0_BASE)
 			return DSI0_BASE_ADJUST;
 		else if (base == DSI0_PHY_BASE)