diff --git a/linux-ramdump-parser-v2/parsers/thermal_data.py b/linux-ramdump-parser-v2/parsers/thermal_data.py new file mode 100755 index 0000000000000000000000000000000000000000..b789fbffe639a9e82364ad5e5dfe78190e44208d --- /dev/null +++ b/linux-ramdump-parser-v2/parsers/thermal_data.py @@ -0,0 +1,84 @@ +# Copyright (c) 2015, 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 print_out import print_out_str +from parser_util import register_parser, RamParser + + +@register_parser( + '--thermal-info', 'Useful information from thermal data structures') +class Thermal_info(RamParser): + + def print_thermal_info( + self, sensor_dbg_info_start_address, ram_dump, + time_stamp, sensor_mapping): + for ncpu in ram_dump.iter_cpus(): + self.output_file.write( + "------------------------------------------------\n") + self.output_file.write( + " TEMPERATURE ENTRIES FOR CPU:{0} \n".format( + int(ncpu))) + self.output_file.write( + "------------------------------------------------\n") + cpu_sensor_addr = sensor_dbg_info_start_address + \ + sensor_mapping[ncpu] + for i in range(0, 10): + temp = self.ramdump.read_word(cpu_sensor_addr + (i * 8), True) + time = self.ramdump.read_word( + cpu_sensor_addr + time_stamp + (i * 8), True) + self.output_file.write( + "Temperature reading - {0} ".format(int(temp))) + self.output_file.write("TimeStamp - {0}\n".format(long(time))) + + def tmdev_data(self, ram_dump): + sensor_mapping = [] + self.output_file.write("Thermal sensor data \n") + + tmdev = self.ramdump.addr_lookup('tmdev') + tmdev_address = self.ramdump.read_word(tmdev, True) + sensor_dbg_info_size = ram_dump.sizeof('struct tsens_sensor_dbg_info') + sensor_dbg_info = self.ramdump.field_offset( + 'struct tsens_tm_device', + 'sensor_dbg_info') + time_stamp = self.ramdump.field_offset( + 'struct tsens_sensor_dbg_info', + 'time_stmp') + cpus_sensor = self.ramdump.addr_lookup('cpus') + cpus_sensor_size = ram_dump.sizeof('struct cpu_info') + sensor_id_offset = self.ramdump.field_offset( + 'struct cpu_info', + 'sensor_id') + + if not all((tmdev, sensor_dbg_info_size, sensor_dbg_info, + time_stamp, cpus_sensor, cpus_sensor_size, + sensor_id_offset)): + self.output_file.write("Not supported for this target yet :-( \n") + return + + for i in ram_dump.iter_cpus(): + cpu_sensor_id_address = cpus_sensor + sensor_id_offset + sensor_id = self.ramdump.read_u32(cpu_sensor_id_address, True) + cpus_sensor = cpus_sensor + cpus_sensor_size + sensor_mapping.append((sensor_id - 1) * sensor_dbg_info_size) + + self.print_thermal_info( + (tmdev_address + sensor_dbg_info), + ram_dump, + time_stamp, + sensor_mapping) + + def parse(self): + self.output_file = self.ramdump.open_file('thermal_info.txt') + + self.tmdev_data(self.ramdump) + + self.output_file.close() + print_out_str("--- Wrote the output to thermal_info.txt")