From 78dd26aecba50d0cfebf1447295b86026ca620cb Mon Sep 17 00:00:00 2001 From: Gitanjali Krishna Date: Tue, 25 Jun 2019 13:45:05 -0700 Subject: [PATCH] u-boot-2016: Handle invalidated crashdump TLVs This change adds support to ignore invalidated TLVs in crashdump buffer Change-Id: Ic8513fb4155755f421f94683fe739ba73d55aa21 Signed-off-by: Gitanjali Krishna --- board/qca/arm/common/crashdump.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/board/qca/arm/common/crashdump.c b/board/qca/arm/common/crashdump.c index d9a689135d..5d29ab5b6c 100644 --- a/board/qca/arm/common/crashdump.c +++ b/board/qca/arm/common/crashdump.c @@ -51,6 +51,7 @@ DECLARE_GLOBAL_DATA_PTR; static qca_smem_flash_info_t *sfi = &qca_smem_flash_info; /* USB device id and part index used by usbdump */ static int usb_dev_indx, usb_dev_part; +int crashdump_tlv_count=0; enum { /*Basic DDR segments */ @@ -61,6 +62,7 @@ enum { /* Module structures are in highmem zone*/ QCA_WDT_LOG_DUMP_TYPE_WLAN_MOD, QCA_WDT_LOG_DUMP_TYPE_WLAN_MOD_INFO, + QCA_WDT_LOG_DUMP_TYPE_EMPTY, }; /* This will be used for parsing the TLV data */ struct qca_wdt_scm_tlv_msg { @@ -260,6 +262,7 @@ static int qca_wdt_extract_crashdump_data( crashdump_data->uname_length = cur_size; ret_val = qca_wdt_scm_extract_tlv_data(scm_tlv_msg, crashdump_data->uname, cur_size); + crashdump_tlv_count++; }else if (!ret_val && cur_type == QCA_WDT_LOG_DUMP_TYPE_DMESG){ ret_val = qca_wdt_scm_extract_tlv_data(scm_tlv_msg, (unsigned char *)&tlv_info, @@ -268,12 +271,14 @@ static int qca_wdt_extract_crashdump_data( crashdump_data->log_buf =(unsigned char *)(uintptr_t)tlv_info.start; crashdump_data->log_buf_len = *(uint32_t *)(uintptr_t)tlv_info.size; } + crashdump_tlv_count++; }else if (!ret_val && cur_type == QCA_WDT_LOG_DUMP_TYPE_LEVEL1_PT){ ret_val = qca_wdt_scm_extract_tlv_data(scm_tlv_msg,(unsigned char *)&tlv_info,cur_size); if (!ret_val) { crashdump_data->pt_start =(unsigned char *)(uintptr_t)tlv_info.start; crashdump_data->pt_len = tlv_info.size; } + crashdump_tlv_count++; } } return ret_val; @@ -312,7 +317,7 @@ static int dump_wlan_segments(struct dumpinfo_t *dumpinfo, int indx) struct qca_wdt_scm_tlv_msg *scm_tlv_msg = &tlv_msg; unsigned char cur_type = QCA_WDT_LOG_DUMP_TYPE_WLAN_MOD; unsigned int cur_size; - int ret_val; + int ret_val,tlv_size; struct st_tlv_info tlv_info; uint32_t wlan_tlv_size; char wlan_segment_name[32]; @@ -324,6 +329,20 @@ static int dump_wlan_segments(struct dumpinfo_t *dumpinfo, int indx) do { ret_val = qca_wdt_scm_extract_tlv_info(scm_tlv_msg, &cur_type, &cur_size); + + /* Each Dump segment is represented by a TLV tuple comprising of + three TLVs representing the type,size and physical addresses of + the data segments and corresponding PMD and PTE entries. + QCA_WDT_LOG_DUMP_TYPE_EMPTY type indicates that the TLV tuple has + been invalidated. When type QCA_WDT_LOG_DUMP_TYPE_EMPTY is encountered, + we skip over the TLV touple by moving the current massage buffer pointer + ahead by three TLVs */ + + if(cur_type == QCA_WDT_LOG_DUMP_TYPE_EMPTY) { + tlv_size = (cur_size + QCA_WDT_SCM_TLV_TYPE_LEN_SIZE); + scm_tlv_msg->cur_msg_buffer_pos += (3 * tlv_size); + } + if (!ret_val && ( cur_type == QCA_WDT_LOG_DUMP_TYPE_WLAN_MOD || cur_type == QCA_WDT_LOG_DUMP_TYPE_WLAN_MOD_INFO )) { ret_val = qca_wdt_scm_extract_tlv_data(scm_tlv_msg, @@ -342,11 +361,14 @@ static int dump_wlan_segments(struct dumpinfo_t *dumpinfo, int indx) ret_val = dump_to_dst (dumpinfo[indx].is_aligned_access,memaddr, wlan_tlv_size, wlan_segment_name); + crashdump_tlv_count++; udelay(10000); /* give some delay for server */ if (ret_val == CMD_RET_FAILURE) return CMD_RET_FAILURE; } }while (cur_type != QCA_WDT_LOG_DUMP_TYPE_INVALID); + + printf("\nMinidump: Dumped %d TLVs\n",crashdump_tlv_count); return CMD_RET_SUCCESS; };