diff --git a/linux-ramdump-parser-v2/parsers/clockdump.py b/linux-ramdump-parser-v2/parsers/clockdump.py index fd7eedccb4e152f6a97ef6c7d439b6a29e14dead..d9d04eadc0adfe280eea87edfbd53b5664a5e01b 100644 --- a/linux-ramdump-parser-v2/parsers/clockdump.py +++ b/linux-ramdump-parser-v2/parsers/clockdump.py @@ -29,12 +29,16 @@ class ClockDumps(RamParser): self.output_file.write("--------------------------------------------\n") self.output_file.write("{0} from of_clk_providers list\n".format(title)) self.output_file.write("--------------------------------------------\n") - self.output_file.write(" {0:40} {1:21} {2:25} {3:10} {4:40}\n".format('CLOCK NAME', 'COUNT/PREPARE_COUNT', 'RATE', 'CUR_LEVEL', 'CLOCK STRUCTURE')) + str = " {0:40} {1:21} {2:25} {3:20} {4:45} {5:40}\n" + self.output_file.write(str.format('CLOCK NAME', + 'COUNT/PREPARE_COUNT', + 'RATE', 'CUR_LEVEL', + 'CLOCK STRUCTURE', 'CLOCK_OPS')) elif type == 'CLOCKS': self.output_file.write("----------------------------------\n") self.output_file.write("{0} from clocks list\n".format(title)) self.output_file.write("----------------------------------\n") - self.output_file.write(" {0:40} {1:25} {2:20} {3:21} {4:25} {5:10} {6:40}\n".format('CLOCK NAME', 'DEVID', 'CONID', 'COUNT/PREPARE_COUNT', 'RATE', 'CUR_LEVEL', 'CLOCK STRUCTURE')) + self.output_file.write(" {0:40} {1:25} {2:20} {3:21} {4:25} {5:20} {6:40}\n".format('CLOCK NAME', 'DEVID', 'CONID', 'COUNT/PREPARE_COUNT', 'RATE', 'CUR_LEVEL', 'CLOCK STRUCTURE')) def printclocks(self, type): if len(self.disabled_clocks): @@ -157,6 +161,42 @@ class ClockDumps(RamParser): counter = counter + 1 table = table + self.ramdump.sizeof('struct clk_lookup') + def dump_clock(self,clk_core,clk_name): + offset_vdd_cur_level = self.ramdump.field_offset( + 'struct clk_vdd_class', 'cur_level') + clk_prepare_count = self.ramdump.read_structure_field( + clk_core, 'struct clk_core', 'prepare_count') + clk_enable_count = self.ramdump.read_structure_field( + clk_core, 'struct clk_core', 'enable_count') + clk_rate = self.ramdump.read_structure_field( + clk_core, 'struct clk_core', 'rate') + clk_vdd_class_addr = self.ramdump.read_structure_field( + clk_core,'struct clk_core','vdd_class') + clk_ops = self.ramdump.read_structure_field( + clk_core,'struct clk_core','ops') + clk_ops = self.ramdump.unwind_lookup(clk_ops) + vdd_class = self.ramdump.read_word(clk_vdd_class_addr) + cur_level = 0 + if vdd_class != 0 and vdd_class is not None: + cur_level_address = (vdd_class + offset_vdd_cur_level) + cur_level = self.ramdump.read_word(cur_level_address, True) + formatStr = "{0:40} {1:<2}/ {2:<17} {3:<25} {4:<20} " \ + "v.v (struct clk_core *)0x{5:<20x} {6:<40}\n" + output = formatStr.format( + clk_name, + clk_enable_count, + clk_prepare_count, + clk_rate, cur_level, + clk_core,clk_ops[0]) + + if clk_enable_count > 0: + self.enabled_clocks.append(output) + elif clk_prepare_count > 0: + self.prepared_clocks.append(output) + else: + self.disabled_clocks.append(output) + + def print_clk_onecell_data(self, data): offset_clk_onecell_data_clks = ( self.ramdump.field_offset('struct clk_onecell_data', 'clks')) @@ -164,6 +204,8 @@ class ClockDumps(RamParser): self.ramdump.field_offset( 'struct clk_onecell_data', 'clk_num')) clks = self.ramdump.read_word(data + offset_clk_onecell_data_clks) + if (clks == 0 or clks == None): + return size = self.ramdump.read_int(data + offset_clk_onecell_data_clknum) sizeof_clk_pointer = self.ramdump.sizeof('struct clk *') offset_vdd_cur_level = self.ramdump.field_offset( @@ -183,35 +225,41 @@ class ClockDumps(RamParser): clk_name_addr = self.ramdump.read_structure_field( clk_core, 'struct clk_core', 'name') clk_name = self.ramdump.read_cstring(clk_name_addr, 48) - clk_prepare_count = self.ramdump.read_structure_field( - clk_core, 'struct clk_core', 'prepare_count') - clk_enable_count = self.ramdump.read_structure_field( - clk_core, 'struct clk_core', 'enable_count') - clk_rate = self.ramdump.read_structure_field( - clk_core, 'struct clk_core', 'rate') - clk_vdd_class_addr = ( - self.ramdump.read_structure_field( - clk_core, 'struct clk_core', 'vdd_class')) - vdd_class = self.ramdump.read_word(clk_vdd_class_addr) - cur_level = 0 - if vdd_class != 0 and vdd_class is not None: - cur_level_address = (vdd_class + offset_vdd_cur_level) - cur_level = self.ramdump.read_word(cur_level_address, True) - formatStr = "{0:40} {1:<2}/ {2:<17} {3:<25} {4:<10} v.v (struct clk_core *)0x{5:<20x}\n" - output = formatStr.format( - clk_name, - clk_enable_count, - clk_prepare_count, - clk_rate, cur_level, - clk_core) - if clk_enable_count > 0: - self.enabled_clocks.append(output) - elif clk_prepare_count > 0: - self.prepared_clocks.append(output) - else: - self.disabled_clocks.append(output) + if (clk_name == 0 or clk_name == None): + break + self.dump_clock(clk_core,clk_name) counter = counter + 1 + def print_clk_qcom_cc_data(self, data, node): + getfunchw = self.ramdump.read_structure_field( + node,'struct of_clk_provider','get_hw') + getfunchw = self.ramdump.unwind_lookup(getfunchw) + + if "qcom_cc_clk_hw_get" in getfunchw: + size = self.ramdump.read_structure_field( + data,'struct qcom_cc','num_rclks') + clks = self.ramdump.read_structure_field( + data,'struct qcom_cc','rclks') + sizeof_clk_regmap = self.ramdump.sizeof('struct clk_regmap *') + offset_vdd_cur_level = self.ramdump.field_offset( + 'struct clk_vdd_class', 'cur_level') + counter = 0 + while counter < size: + clk = self.ramdump.read_word(clks + + (sizeof_clk_regmap * counter)) + clk_core = self.ramdump.read_structure_field( + clk,'struct clk_regmap','hw.core') + if clk_core == 0 or clk_core is None: + counter = counter + 1 + continue + clk_name_addr = self.ramdump.read_structure_field( + clk_core, 'struct clk_core', 'name') + clk_name = self.ramdump.read_cstring(clk_name_addr, 48) + if (clk_name == 0 or clk_name == None): + break + self.dump_clock(clk_core,clk_name) + counter = counter + 1 + def clk_providers_walker(self, node): if node == self.head: return @@ -224,11 +272,16 @@ class ClockDumps(RamParser): else: self.print_clk_onecell_data(data) + getfunc = self.ramdump.read_structure_field( + node,'struct of_clk_provider','get') + if getfunc == 0: + self.print_clk_qcom_cc_data(data,node) + def parse(self): self.output_file = self.ramdump.open_file('ClockDumps.txt') - - self.get_clocks() - self.printclocks('CLOCKS') + if (self.ramdump.kernel_version < (4, 9, 0)): + self.get_clocks() + self.printclocks('CLOCKS') self.get_clk_providers() self.printclocks('CLK_PROVIDERS')