1 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) NXP 2019
8 from linux.utils import CachedType, gdb_eval_or_none
9 from linux.lists import list_for_each_entry
11 generic_pm_domain_type = CachedType('struct generic_pm_domain')
12 pm_domain_data_type = CachedType('struct pm_domain_data')
13 device_link_type = CachedType('struct device_link')
16 def kobject_get_path(kobj):
17 path = kobj['name'].string()
18 parent = kobj['parent']
20 path = kobject_get_path(parent) + '/' + path
24 def rtpm_status_str(dev):
25 if dev['power']['runtime_error']:
27 if dev['power']['disable_depth']:
29 _RPM_STATUS_LOOKUP = [
35 return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
38 class LxGenPDSummary(gdb.Command):
39 '''Print genpd summary
41 Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
44 super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
46 def summary_one(self, genpd):
47 if genpd['status'] == 0:
50 status_string = 'off-{}'.format(genpd['state_idx'])
53 for link in list_for_each_entry(
54 genpd['parent_links'],
55 device_link_type.get_type().pointer(),
57 child_names.append(link['child']['name'])
59 gdb.write('%-30s %-15s %s\n' % (
60 genpd['name'].string(),
62 ', '.join(child_names)))
64 # Print devices in domain
65 for pm_data in list_for_each_entry(genpd['dev_list'],
66 pm_domain_data_type.get_type().pointer(),
69 kobj_path = kobject_get_path(dev['kobj'])
70 gdb.write(' %-50s %s\n' % (kobj_path, rtpm_status_str(dev)))
72 def invoke(self, arg, from_tty):
73 if gdb_eval_or_none("&gpd_list") is None:
74 raise gdb.GdbError("No power domain(s) registered")
75 gdb.write('domain status children\n');
76 gdb.write(' /device runtime status\n');
77 gdb.write('----------------------------------------------------------------------\n');
78 for genpd in list_for_each_entry(
79 gdb.parse_and_eval('&gpd_list'),
80 generic_pm_domain_type.get_type().pointer(),
82 self.summary_one(genpd)