0001
0002
0003
0004
0005 import gdb
0006 import sys
0007
0008 from linux.utils import CachedType
0009 from linux.lists import list_for_each_entry
0010
0011 generic_pm_domain_type = CachedType('struct generic_pm_domain')
0012 pm_domain_data_type = CachedType('struct pm_domain_data')
0013 device_link_type = CachedType('struct device_link')
0014
0015
0016 def kobject_get_path(kobj):
0017 path = kobj['name'].string()
0018 parent = kobj['parent']
0019 if parent:
0020 path = kobject_get_path(parent) + '/' + path
0021 return path
0022
0023
0024 def rtpm_status_str(dev):
0025 if dev['power']['runtime_error']:
0026 return 'error'
0027 if dev['power']['disable_depth']:
0028 return 'unsupported'
0029 _RPM_STATUS_LOOKUP = [
0030 "active",
0031 "resuming",
0032 "suspended",
0033 "suspending"
0034 ]
0035 return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
0036
0037
0038 class LxGenPDSummary(gdb.Command):
0039 '''Print genpd summary
0040
0041 Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
0042
0043 def __init__(self):
0044 super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
0045
0046 def summary_one(self, genpd):
0047 if genpd['status'] == 0:
0048 status_string = 'on'
0049 else:
0050 status_string = 'off-{}'.format(genpd['state_idx'])
0051
0052 child_names = []
0053 for link in list_for_each_entry(
0054 genpd['parent_links'],
0055 device_link_type.get_type().pointer(),
0056 'parent_node'):
0057 child_names.append(link['child']['name'])
0058
0059 gdb.write('%-30s %-15s %s\n' % (
0060 genpd['name'].string(),
0061 status_string,
0062 ', '.join(child_names)))
0063
0064
0065 for pm_data in list_for_each_entry(genpd['dev_list'],
0066 pm_domain_data_type.get_type().pointer(),
0067 'list_node'):
0068 dev = pm_data['dev']
0069 kobj_path = kobject_get_path(dev['kobj'])
0070 gdb.write(' %-50s %s\n' % (kobj_path, rtpm_status_str(dev)))
0071
0072 def invoke(self, arg, from_tty):
0073 gdb.write('domain status children\n');
0074 gdb.write(' /device runtime status\n');
0075 gdb.write('----------------------------------------------------------------------\n');
0076 for genpd in list_for_each_entry(
0077 gdb.parse_and_eval('&gpd_list'),
0078 generic_pm_domain_type.get_type().pointer(),
0079 'gpd_list_node'):
0080 self.summary_one(genpd)
0081
0082
0083 LxGenPDSummary()