Merge commit '890f592c4270df1c51de2b3ace2194aef10eb2b6' into pmhb
app: aboot: Add bootlunen test to fastboot test
platform: msm_shared: Add support for changing boot lun from LK
app: aboot: allow LK logo image to have size lesser than FB
target: msm8952: read mdtp eFuse in runtime
Change-Id: I97bd381fd9c395f4fb897724cd68f3adc99a609c
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index a20bb86..f21d9b4 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -3218,8 +3218,8 @@
return 0;
}
- if ((header->width != fb_display->width) || (header->height != fb_display->height)) {
- dprintf(CRITICAL, "Logo config doesn't match with fb config. Fall back default logo\n");
+ if ((header->width > fb_display->width) || (header->height > fb_display->height)) {
+ dprintf(CRITICAL, "Logo config greater than fb config. Fall back default logo\n");
return -1;
}
@@ -3305,8 +3305,8 @@
fbcon_extract_to_screen(header, (base + LOGO_IMG_HEADER_SIZE));
} else { /* 2 Raw BGR data */
- if ((header->width != fb_display->width) || (header->height != fb_display->height)) {
- dprintf(CRITICAL, "Logo config doesn't match with fb config. Fall back default logo\n");
+ if ((header->width > fb_display->width) || (header->height > fb_display->height)) {
+ dprintf(CRITICAL, "Logo config greater than fb config. Fall back default logo\n");
return -1;
}
diff --git a/app/aboot/fastboot_test.c b/app/aboot/fastboot_test.c
index f32435c..5cad0b5 100644
--- a/app/aboot/fastboot_test.c
+++ b/app/aboot/fastboot_test.c
@@ -33,6 +33,8 @@
#include "fastboot.h"
#include "fastboot_test.h"
#include <app/tests.h>
+#include <target.h>
+#include <boot_device.h>
#if USE_RPMB_FOR_DEVINFO
#include <rpmb.h>
#endif
@@ -40,10 +42,37 @@
extern void ramdump_table_map();
extern void kauth_test();
+extern int ufs_get_boot_lun();
+extern int ufs_set_boot_lun(uint32_t bootlunid);
+extern int fastboot_init();
void cmd_oem_runtests()
{
dprintf(INFO, "Running LK tests ... \n");
+
+ // Test boot lun enable for UFS
+ if (!platform_boot_dev_isemmc())
+ {
+ int ret = 0;
+ uint32_t set_lun = 0x2, get_lun;
+ ret = ufs_set_boot_lun(set_lun);
+ if (ret == UFS_SUCCESS)
+ {
+ get_lun = ufs_get_boot_lun();
+ if (get_lun == set_lun)
+ {
+ dprintf(INFO, "UFS Boot LUN En TEST: [ PASS ]\n");
+ set_lun = 0x1; // default is 0x1 LUN A, revert back to 0x1
+ ret = ufs_set_boot_lun(set_lun);
+ }
+ else
+ dprintf(INFO, "UFS Boot LUN En TEST: [ FAIL ]\n");
+ }
+ else
+ dprintf(INFO, "UFS Boot LUN En TEST: [ FAIL ]\n");
+ }
+
+
#if LPAE
ramdump_table_map();
#endif
diff --git a/platform/msm_shared/dme.c b/platform/msm_shared/dme.c
index f83ee93..c6d651d 100644
--- a/platform/msm_shared/dme.c
+++ b/platform/msm_shared/dme.c
@@ -96,7 +96,7 @@
}
if (resp_upiu->basic_hdr.response != UPIU_QUERY_RESP_SUCCESS)
{
- dprintf(CRITICAL, "%s:%d UPIU Response is not SUCCESS\n", __func__, __LINE__);
+ dprintf(CRITICAL, "%s:%d UPIU Response is not SUCCESS, response code: 0x%x\n", __func__, __LINE__, resp_upiu->basic_hdr.response);
return -UFS_FAILURE;
}
@@ -111,8 +111,9 @@
return -UFS_FAILURE;
}
- *((uint32_t *) buffer) = resp_upiu->flag_value;
+ *((uint32_t *) buffer) = resp_upiu->resv_1[3]; //resv_1[3] contains the data for flag
break;
+ case UPIU_QUERY_OP_WRITE_ATTRIBUTE:
case UPIU_QUERY_OP_TOGGLE_FLAG:
case UPIU_QUERY_OP_CLEAR_FLAG:
case UPIU_QUERY_OP_READ_DESCRIPTOR:
@@ -149,6 +150,9 @@
req_upiu.resp_data_len = query->buf_len;
}
+ if (query->opcode == UPIU_QUERY_OP_WRITE_ATTRIBUTE)
+ req_upiu.data_buffer_addr = query->buf; // attribute is 4 byte value
+
ret = utp_enqueue_upiu(dev, &req_upiu);
if (ret)
goto utp_send_query_upiu_err;
@@ -161,6 +165,47 @@
return ret;
}
+int dme_set_bbootlunen(struct ufs_dev *dev, uint32_t val)
+{
+ int ret = 0;
+ STACKBUF_DMA_ALIGN(value, sizeof(uint32_t));
+ memset((void *)value, 0, sizeof(uint32_t));
+ *value = val;
+ struct utp_query_req_upiu_type set_query = {UPIU_QUERY_OP_WRITE_ATTRIBUTE,
+ UFS_IDX_bBootLunEn,
+ 0,
+ 0,
+ (addr_t)value,
+ sizeof(uint32_t)};
+ if ((ret = dme_send_query_upiu(dev, &set_query)))
+ {
+ arch_invalidate_cache_range((addr_t) value, sizeof(uint32_t));
+ dprintf(CRITICAL, "%s:%d DME Set Boot Lun Query failed. Value 0x%x\n", __func__, __LINE__, *value);
+ return -UFS_FAILURE;
+ }
+ return UFS_SUCCESS;
+}
+
+int dme_get_bbootlunen(struct ufs_dev *dev)
+{
+ STACKBUF_DMA_ALIGN(value, sizeof(uint32_t));
+ memset((void *)value, 0, sizeof(uint32_t));
+ int ret = 0;
+ struct utp_query_req_upiu_type set_query = {UPIU_QUERY_OP_READ_ATTRIBUTE,
+ UFS_IDX_bBootLunEn,
+ 0,
+ 0,
+ (addr_t)value,
+ sizeof(uint32_t)};
+ if ((ret = dme_send_query_upiu(dev, &set_query)))
+ {
+ dprintf(CRITICAL, "%s:%d DME Set Boot Lun Query failed\n", __func__, __LINE__);
+ return -UFS_FAILURE;
+ }
+ arch_invalidate_cache_range((addr_t) value, sizeof(uint32_t));
+ return *value;
+}
+
int dme_set_fpurgeenable(struct ufs_dev *dev)
{
STACKBUF_DMA_ALIGN(result, sizeof(uint32_t));
@@ -551,6 +596,7 @@
req_upiu->basic_hdr.query_task_mgmt_func = UPIU_QUERY_FUNC_STD_READ_REQ;
break;
case UPIU_QUERY_OP_TOGGLE_FLAG:
+ case UPIU_QUERY_OP_WRITE_ATTRIBUTE:
case UPIU_QUERY_OP_CLEAR_FLAG:
case UPIU_QUERY_OP_SET_FLAG:
req_upiu->basic_hdr.query_task_mgmt_func = UPIU_QUERY_FUNC_STD_WRITE_REQ;
@@ -559,6 +605,13 @@
dprintf(CRITICAL, "%s:%d UPIU query opcode not supported.\n", __func__, __LINE__);
return -UFS_FAILURE;
}
+ if (upiu_data->opcode == UPIU_QUERY_OP_WRITE_ATTRIBUTE)
+ {
+ req_upiu->resv_1[0] = (*(uint32_t *)(upiu_data->data_buffer_addr) >> 24);
+ req_upiu->resv_1[1] = (*(uint32_t *)(upiu_data->data_buffer_addr) >> 16);
+ req_upiu->resv_1[2] = (*(uint32_t *)(upiu_data->data_buffer_addr) >> 8);
+ req_upiu->resv_1[3] = (*(uint32_t *)(upiu_data->data_buffer_addr) & 0xFF);
+ }
return UFS_SUCCESS;
}
diff --git a/platform/msm_shared/include/dme.h b/platform/msm_shared/include/dme.h
index aa11c54..4930024 100644
--- a/platform/msm_shared/include/dme.h
+++ b/platform/msm_shared/include/dme.h
@@ -73,6 +73,7 @@
#define UFS_IDX_bBootLunEn 0x00
#define UFS_IDX_bCurrentPowerMode 0x01
#define UFS_IDX_bActiveICCLevel 0x03
+#define UFS_IDX_bBootLunID 0x04
#define UFS_IDX_bPurgeStatus 0x06
#define UFS_IDX_bRefClkFreq 0x0a
#define UFS_IDX_bConfigDescrLock 0x0b
@@ -268,4 +269,9 @@
*/
int dme_read_geo_desc(struct ufs_dev *dev);
+/* function to return the boot lun currently booting from */
+int dme_get_bbootlunen(struct ufs_dev *dev);
+
+/* function to set the boot lun to either 0, 1 or 2 */
+int dme_set_bbootlunen(struct ufs_dev *dev, uint32_t val);
#endif
diff --git a/platform/msm_shared/include/mmc_wrapper.h b/platform/msm_shared/include/mmc_wrapper.h
index f52a117..fbae494 100644
--- a/platform/msm_shared/include/mmc_wrapper.h
+++ b/platform/msm_shared/include/mmc_wrapper.h
@@ -49,4 +49,6 @@
uint8_t mmc_get_lun(void);
void mmc_read_partition_table(uint8_t arg);
uint32_t mmc_write_protect(const char *name, int set_clr);
+int ufs_set_boot_lun(uint32_t boot_lun_id);
+int ufs_get_boot_lun();
#endif
diff --git a/platform/msm_shared/include/upiu.h b/platform/msm_shared/include/upiu.h
index e081909..2c8fee5 100644
--- a/platform/msm_shared/include/upiu.h
+++ b/platform/msm_shared/include/upiu.h
@@ -74,8 +74,8 @@
uint8_t selector;
uint8_t resv_0[2];
uint16_t resp_len;
- uint8_t resv_1[3];
- uint8_t flag_value;
+ // this structure is used for several queries. resv_1 field is reserved for some and used for others
+ uint8_t resv_1[4];
uint8_t resv_2[4];
}__PACKED;
diff --git a/platform/msm_shared/mmc_wrapper.c b/platform/msm_shared/mmc_wrapper.c
index 10e9955..495767a 100755
--- a/platform/msm_shared/mmc_wrapper.c
+++ b/platform/msm_shared/mmc_wrapper.c
@@ -534,6 +534,41 @@
}
/*
+ * Function : ufs_get_boot_lun
+ * Arg : none
+ * Return type : current boot lun
+ */
+
+int ufs_get_boot_lun()
+{
+ int ret = 0;
+ void *dev;
+ dev = target_mmc_device();
+
+ if (!(platform_boot_dev_isemmc()))
+ ret = dme_get_bbootlunen((struct ufs_dev *)dev);
+ return ret;
+}
+
+
+/*
+ * Function : ufs_set_boot_lun
+ * Arg : boot lun id
+ * Return type : status
+ */
+
+int ufs_set_boot_lun(uint32_t boot_lun_id)
+{
+ int ret = 0;
+ void *dev;
+ dev = target_mmc_device();
+
+ if (!(platform_boot_dev_isemmc()))
+ ret = dme_set_bbootlunen((struct ufs_dev *)dev, boot_lun_id);
+ return ret;
+}
+
+/*
* Function : mmc set LUN for ufs
* Arg : LUN number
* Return type : void
diff --git a/project/msm8952.mk b/project/msm8952.mk
index f6d69b4..e808597 100644
--- a/project/msm8952.mk
+++ b/project/msm8952.mk
@@ -74,8 +74,6 @@
ifeq ($(ENABLE_MDTP_SUPPORT),1)
DEFINES += MDTP_SUPPORT=1
-DEFINES += MDTP_EFUSE_ADDRESS=0x0005C250 # QFPROM_CORR_QC_SPARE_REG_LSB_ADDR
-DEFINES += MDTP_EFUSE_START=0
endif
ENABLE_WDOG_SUPPORT := 0
diff --git a/target/msm8952/mdtp_ui_defs.c b/target/msm8952/mdtp_defs.c
similarity index 77%
rename from target/msm8952/mdtp_ui_defs.c
rename to target/msm8952/mdtp_defs.c
index 668feb2..ebcdafb 100644
--- a/target/msm8952/mdtp_ui_defs.c
+++ b/target/msm8952/mdtp_defs.c
@@ -27,8 +27,15 @@
*
*/
+#include "platform.h"
#include "mdtp_defs.h"
+#define MDTP_EFUSE_ADDRESS_MSM8952 0x0005C250 // QFPROM_CORR_QC_SPARE_REG_LSB_ADDR
+#define MDTP_EFUSE_START_MSM8952 0
+
+#define MDTP_EFUSE_ADDRESS_MSM8956 0x000A4408 // QFPROM_CORR_SPARE_REG18_LSB_ADDR
+#define MDTP_EFUSE_START_MSM8956 0
+
struct mdtp_ui_defs mdtp_ui_defs_msm8952 = {
// Image dimensions
952, // error_msg_width;
@@ -65,3 +72,25 @@
{
return mdtp_ui_defs_msm8952;
}
+
+int mdtp_get_target_efuse(struct mdtp_target_efuse* target_efuse)
+{
+ if (target_efuse == NULL)
+ {
+ dprintf(CRITICAL, "mdtp: mdtp_get_target_efuse: ERROR, target_efuse is NULL\n");
+ return -1;
+ }
+
+ if (platform_is_msm8956())
+ {
+ target_efuse->address = MDTP_EFUSE_ADDRESS_MSM8956;
+ target_efuse->start = MDTP_EFUSE_START_MSM8956;
+ }
+ else
+ {
+ target_efuse->address = MDTP_EFUSE_ADDRESS_MSM8952;
+ target_efuse->start = MDTP_EFUSE_START_MSM8952;
+ }
+
+ return 0;
+}
diff --git a/target/msm8952/rules.mk b/target/msm8952/rules.mk
index 1c404d7..cedc119 100644
--- a/target/msm8952/rules.mk
+++ b/target/msm8952/rules.mk
@@ -49,5 +49,5 @@
endif
ifeq ($(ENABLE_MDTP_SUPPORT),1)
OBJS += \
- $(LOCAL_DIR)/mdtp_ui_defs.o
+ $(LOCAL_DIR)/mdtp_defs.o
endif