From e5440d307890f730768974f05b0b13dda96e60c4 Mon Sep 17 00:00:00 2001
From: Mulu He <muluhe@codeaurora.org>
Date: Thu, 21 Jun 2018 15:56:06 +0800
Subject: [PATCH] linux-ramdump-parser-v2: Add support for etf swao

Add ETF SWAO dump region need to parser.

Change-Id: I1792d009b667c7e7b8933c01ecaf4ccceb494ad2
Signed-off-by: Mulu He <muluhe@codeaurora.org>
---
 linux-ramdump-parser-v2/debug_image_v2.py |  7 ++++++
 linux-ramdump-parser-v2/qdss.py           | 28 +++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/linux-ramdump-parser-v2/debug_image_v2.py b/linux-ramdump-parser-v2/debug_image_v2.py
index 32e78e5..c49d4ea 100644
--- a/linux-ramdump-parser-v2/debug_image_v2.py
+++ b/linux-ramdump-parser-v2/debug_image_v2.py
@@ -51,8 +51,10 @@ class client(object):
     MSM_DUMP_DATA_MISC = 0xE8
     MSM_DUMP_DATA_VSENSE = 0xE9
     MSM_DUMP_DATA_TMC_ETF = 0xF0
+    MSM_DUMP_DATA_TMC_ETF_SWAO = 0xF1
     MSM_DUMP_DATA_TMC_ETR_REG = 0x100
     MSM_DUMP_DATA_TMC_ETF_REG = 0x101
+    MSM_DUMP_DATA_TMC_ETF_SWAO_REG = 0x102
     MSM_DUMP_DATA_LOG_BUF = 0x110
     MSM_DUMP_DATA_LOG_BUF_FIRST_IDX = 0x111
     MSM_DUMP_DATA_L2_TLB = 0x120
@@ -81,7 +83,9 @@ client_types = [
     ('MSM_DUMP_DATA_DCC_REG', 'parse_dcc_reg'),
     ('MSM_DUMP_DATA_DCC_SRAM', 'parse_dcc_sram'),
     ('MSM_DUMP_DATA_TMC_ETF', 'parse_qdss_common'),
+    ('MSM_DUMP_DATA_TMC_ETF_SWAO', 'parse_qdss_common'),
     ('MSM_DUMP_DATA_TMC_ETR_REG', 'parse_qdss_common'),
+    ('MSM_DUMP_DATA_TMC_ETF_SWAO_REG', 'parse_qdss_common'),
     ('MSM_DUMP_DATA_TMC_REG', 'parse_qdss_common'),
     ('MSM_DUMP_DATA_L2_TLB', 'parse_tlb_common'),
     ('MSM_DUMP_DATA_LLC_CACHE', 'parse_system_cache_common'),
@@ -92,6 +96,8 @@ qdss_tag_to_field_name = {
     'MSM_DUMP_DATA_TMC_ETR_REG': 'tmc_etr_start',
     'MSM_DUMP_DATA_TMC_REG': 'tmc_etr_start',
     'MSM_DUMP_DATA_TMC_ETF': 'etf_start',
+    'MSM_DUMP_DATA_TMC_ETF_SWAO': 'tmc_etf_swao_start',
+    'MSM_DUMP_DATA_TMC_ETF_SWAO_REG': 'tmc_etf_swao_reg_start',
     'MSM_DUMP_DATA_DBGUI_REG': 'dbgui_start',
 }
 
@@ -877,6 +883,7 @@ class DebugImage_v2():
         self.qdss.dump_standard(ram_dump)
         if not ram_dump.skip_qdss_bin:
             self.qdss.save_etf_bin(ram_dump)
+            self.qdss.save_etf_swao_bin(ram_dump)
             self.qdss.save_etr_bin(ram_dump)
         if ram_dump.qtf:
             self.parse_qtf(ram_dump)
diff --git a/linux-ramdump-parser-v2/qdss.py b/linux-ramdump-parser-v2/qdss.py
index a4c1e64..8ac637a 100644
--- a/linux-ramdump-parser-v2/qdss.py
+++ b/linux-ramdump-parser-v2/qdss.py
@@ -217,6 +217,8 @@ class QDSSDump():
         self.etm_regs2 = None
         self.etm_regs3 = None
         self.dbgui_start = None
+        self.tmc_etf_swao_start = None
+        self.tmc_etf_swao_reg_start = None
 
     # Assumptions: Any address given here has been checked for correct magic
     def print_tmc_etf(self, ram_dump):
@@ -306,6 +308,32 @@ class QDSSDump():
 
         tmc_etf.close()
 
+    def save_etf_swao_bin(self, ram_dump):
+        tmc_etf_swao = ram_dump.open_file('tmc-etf-swao.bin')
+        if self.tmc_etf_swao_reg_start is None or self.tmc_etf_swao_start is None:
+            print_out_str('!!! ETF SWAO was not the current sink!')
+            tmc_etf_swao.close()
+            return
+
+        ctl_offset, ctl_desc = tmc_registers['CTL']
+        mode_offset, mode_desc = tmc_registers['MODE']
+        rsz_offset, rsz_desc = tmc_registers['RSZ']
+
+        ctl = ram_dump.read_u32(self.tmc_etf_swao_reg_start + ctl_offset, False)
+        mode = ram_dump.read_u32(self.tmc_etf_swao_reg_start + mode_offset, False)
+        rsz = ram_dump.read_u32(self.tmc_etf_swao_reg_start + rsz_offset, False)
+        # rsz is given in words so convert to bytes
+        rsz = 4 * rsz
+
+        if (ctl & 0x1) == 1 and (mode == 0):
+            for i in range(0, rsz):
+                val = ram_dump.read_byte(self.tmc_etf_swao_start + i, False)
+                tmc_etf_swao.write(struct.pack('<B', val))
+        else:
+            print_out_str('!!! ETF SWAO was not the current sink!')
+
+        tmc_etf_swao.close()
+
     def read_sg_data(self, dbaddr, sts, rwpval, ram_dump, tmc_etr):
         start = dbaddr
         continue_looping = True
-- 
GitLab