diff --git a/linux-ramdump-parser-v2/parsers/clockdump.py b/linux-ramdump-parser-v2/parsers/clockdump.py index 0891f00ad5eb50d6eb6b6ca55e9cfb26d77995c6..d2b894d3349ae37ac59e747d7363f378a4f425fb 100644 --- a/linux-ramdump-parser-v2/parsers/clockdump.py +++ b/linux-ramdump-parser-v2/parsers/clockdump.py @@ -29,7 +29,7 @@ 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") - str = " {0:40} {1:21} {2:25} {3:20} {4:45} {5:40}\n" + str = " {0:40} {1:21} {2:25} {3:10} {4:45} {5:40}\n" self.output_file.write(str.format('CLOCK NAME', 'COUNT/PREPARE_COUNT', 'RATE', 'CUR_LEVEL', @@ -170,17 +170,16 @@ class ClockDumps(RamParser): 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( + vdd_class = 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} " \ + formatStr = "{0:40} {1:<2}/ {2:<17} {3:<25} {4:<10} " \ "v.v (struct clk_core *)0x{5:<20x} {6:<40}\n" output = formatStr.format( clk_name, @@ -230,35 +229,57 @@ class ClockDumps(RamParser): 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) + # qcom_cc_clk_hw_get clk is added in kernel 4.9 + def print_clk_qcom_cc_data(self, data): + 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 + + # spmi_pmic_div_clk_hw_get clk is added kernel 4.14 + def print_clk_spmi_pmic_data(self, data): + size = self.ramdump.read_structure_field( + data,'struct spmi_pmic_div_clk_cc','nclks') + clks = self.ramdump.field_offset( + 'struct spmi_pmic_div_clk_cc','clks') + clks = data + clks + sizeof_clk_regmap = self.ramdump.sizeof('struct clkdiv') + offset_vdd_cur_level = self.ramdump.field_offset( + 'struct clk_vdd_class', 'cur_level') + counter = 0 + while counter < size: + clk = clks + (sizeof_clk_regmap * counter) + clk_core = self.ramdump.read_structure_field( + clk,'struct clkdiv','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: @@ -267,15 +288,27 @@ class ClockDumps(RamParser): 'struct of_clk_provider', 'data') data = self.ramdump.read_word(data_address, True) + getfunc = self.ramdump.read_structure_field( + node,'struct of_clk_provider','get') + if getfunc == 0: + getfunchw = self.ramdump.read_structure_field( + node,'struct of_clk_provider','get_hw') + getfunchw = self.ramdump.unwind_lookup(getfunchw) + if "spmi_pmic_div_clk_hw_get" in getfunchw: + self.print_clk_spmi_pmic_data(data) + return + elif "qcom_cc_clk_hw_get" in getfunchw: + self.print_clk_qcom_cc_data(data) + return + else: + return + if (self.ramdump.is_config_defined('CONFIG_COMMON_CLK_MSM')): self.print_clk_of_msm_provider_data(data) 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')