diff --git a/linux-ramdump-parser-v2/debug_image_v2.py b/linux-ramdump-parser-v2/debug_image_v2.py index 4d8ee114ec8b58d96d1739d73d7921a799c96c09..ff2a425b5d8906617b62b0d89b331807f4f5ece9 100755 --- a/linux-ramdump-parser-v2/debug_image_v2.py +++ b/linux-ramdump-parser-v2/debug_image_v2.py @@ -17,6 +17,7 @@ import os import platform import subprocess +from pmic import PmicRegDump from print_out import print_out_str from qdss import QDSSDump from watchdog_v2 import TZRegDump_v2 @@ -51,6 +52,7 @@ client_table = { 'MSM_DUMP_DATA_L2_CACHE': 'parse_l2_cache', 'MSM_DUMP_DATA_L3_CACHE': 'parse_l3_cache', 'MSM_DUMP_DATA_OCMEM': 'parse_ocmem', + 'MSM_DUMP_DATA_PMIC': 'parse_pmic', 'MSM_DUMP_DATA_TMC_ETF': 'parse_qdss_common', 'MSM_DUMP_DATA_TMC_REG': 'parse_qdss_common', 'MSM_DUMP_DATA_L2_TLB': 'parse_l2_tlb', @@ -82,6 +84,19 @@ class DebugImage_v2(): regs.dump_core_pc(ram_dump) regs.dump_all_regs(ram_dump) + def parse_pmic(self, version, start, end, client_id, ram_dump): + client_name = self.dump_data_id_lookup_table[client_id] + + print_out_str( + 'Parsing {0} context start {1:x} end {2:x}'.format(client_name, start, end)) + + regs = PmicRegDump(start, end) + if regs.parse_all_regs(ram_dump) is False: + print_out_str('!!! Could not get registers from PMIC dump') + return + + regs.dump_all_regs(ram_dump) + def parse_qdss_common(self, version, start, end, client_id, ram_dump): client_name = self.dump_data_id_lookup_table[client_id] diff --git a/linux-ramdump-parser-v2/pmic.py b/linux-ramdump-parser-v2/pmic.py new file mode 100644 index 0000000000000000000000000000000000000000..fddf09a0c2cf01f38fae4db3cc28930d1409b211 --- /dev/null +++ b/linux-ramdump-parser-v2/pmic.py @@ -0,0 +1,98 @@ +# Copyright (c) 2014, The Linux Foundation. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 and +# only version 2 as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +from datetime import datetime +from print_out import print_out_str +from ramparse import VERSION +from time import strftime + +class PmicRegData(): + def __init__(self, regoffs, val): + self.regoffs = regoffs + self.val = val + +class PmicRegDump(): + + def __init__(self, start, end): + self.start_addr = start + self.end_addr = end + self.num_entries = 0 + self.pmic_list = {} + + def parse_all_regs(self, ram_dump): + + if (self.start_addr + 4) > self.end_addr: + return False + + # Read number of entries + self.num_entries = ram_dump.read_u32(self.start_addr, False) + self.start_addr += 4 + + print_out_str('Dumping {0} PMIC registers'.format(self.num_entries)) + + for i in range(0, self.num_entries): + + if (self.start_addr + 12) > self.end_addr: + return False + + # Read slave ID + slaveid = ram_dump.read_u32(self.start_addr, False) + self.start_addr += 4; + + # Read register offset + regoffs = 0xFFFF & (ram_dump.read_u32(self.start_addr, False)) + self.start_addr += 4; + + # Read register value + val = ram_dump.read_u32(self.start_addr, False) + self.start_addr += 4; + + if slaveid > 0xf: + print_out_str("Maximum value of slave id is 0xF but found {0:x}. Aborting PMIC dump!".format(slaveid)) + return False; + + pmic_num = slaveid/2; + + if pmic_num not in self.pmic_list: + pmic_reg_list = [] + self.pmic_list[pmic_num] = pmic_reg_list + else: + pmic_reg_list = self.pmic_list[pmic_num] + + # For odd slave id prepend 0x10000 to offset + if slaveid % 2 != 0: + regoffs |= 0x10000 + + regData = PmicRegData(regoffs, val) + pmic_reg_list.append(regData) + + return True + + def dump_all_regs(self, ram_dump): + outfile = ram_dump.open_file('pmicdump.xml') + outfile.write('<pmicDump version=\'1\'>\n') + outfile.write('\t<timestamp>{0}</timestamp>\n'.format(datetime.now().strftime('%d. %b %Y, %H:%M:%S'))) + outfile.write('\t<generator>Linux Ram Dump Parser Version {0}</generator>\n'.format(VERSION)) + outfile.write('\t<target name=\'{0}\'>\n'.format(ram_dump.hw_id)) + for pmic in self.pmic_list.iterkeys(): + dump_pmic_reg_list = self.pmic_list[pmic] + + if not dump_pmic_reg_list: + continue + + outfile.write('\t\t<pmic>\n') + outfile.write('\t\t\t<bus type=\'spmi\' slaveid0=\'{0}\' slaveid1=\'{1}\'/>\n'.format(pmic, (pmic+1))) + for reg_data in dump_pmic_reg_list: + outfile.write('\t\t\t<register address=\'0x{0:x}\' value=\'0x{1:x}\'/>\n'.format(reg_data.regoffs, reg_data.val)) + outfile.write('\t\t</pmic>\n') + outfile.write('\t</target>\n') + outfile.write('</pmicDump>\n') + outfile.close()