diff options
Diffstat (limited to 'scripts/gdb/linux/genpd.py')
-rw-r--r-- | scripts/gdb/linux/genpd.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/scripts/gdb/linux/genpd.py b/scripts/gdb/linux/genpd.py new file mode 100644 index 000000000000..6ca93bd2949e --- /dev/null +++ b/scripts/gdb/linux/genpd.py | |||
@@ -0,0 +1,83 @@ | |||
1 | # SPDX-License-Identifier: GPL-2.0 | ||
2 | # | ||
3 | # Copyright (c) NXP 2019 | ||
4 | |||
5 | import gdb | ||
6 | import sys | ||
7 | |||
8 | from linux.utils import CachedType | ||
9 | from linux.lists import list_for_each_entry | ||
10 | |||
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') | ||
14 | |||
15 | |||
16 | def kobject_get_path(kobj): | ||
17 | path = kobj['name'].string() | ||
18 | parent = kobj['parent'] | ||
19 | if parent: | ||
20 | path = kobject_get_path(parent) + '/' + path | ||
21 | return path | ||
22 | |||
23 | |||
24 | def rtpm_status_str(dev): | ||
25 | if dev['power']['runtime_error']: | ||
26 | return 'error' | ||
27 | if dev['power']['disable_depth']: | ||
28 | return 'unsupported' | ||
29 | _RPM_STATUS_LOOKUP = [ | ||
30 | "active", | ||
31 | "resuming", | ||
32 | "suspended", | ||
33 | "suspending" | ||
34 | ] | ||
35 | return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']] | ||
36 | |||
37 | |||
38 | class LxGenPDSummary(gdb.Command): | ||
39 | '''Print genpd summary | ||
40 | |||
41 | Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary''' | ||
42 | |||
43 | def __init__(self): | ||
44 | super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA) | ||
45 | |||
46 | def summary_one(self, genpd): | ||
47 | if genpd['status'] == 0: | ||
48 | status_string = 'on' | ||
49 | else: | ||
50 | status_string = 'off-{}'.format(genpd['state_idx']) | ||
51 | |||
52 | slave_names = [] | ||
53 | for link in list_for_each_entry( | ||
54 | genpd['master_links'], | ||
55 | device_link_type.get_type().pointer(), | ||
56 | 'master_node'): | ||
57 | slave_names.apend(link['slave']['name']) | ||
58 | |||
59 | gdb.write('%-30s %-15s %s\n' % ( | ||
60 | genpd['name'].string(), | ||
61 | status_string, | ||
62 | ', '.join(slave_names))) | ||
63 | |||
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(), | ||
67 | 'list_node'): | ||
68 | dev = pm_data['dev'] | ||
69 | kobj_path = kobject_get_path(dev['kobj']) | ||
70 | gdb.write(' %-50s %s\n' % (kobj_path, rtpm_status_str(dev))) | ||
71 | |||
72 | def invoke(self, arg, from_tty): | ||
73 | gdb.write('domain status slaves\n'); | ||
74 | gdb.write(' /device runtime status\n'); | ||
75 | gdb.write('----------------------------------------------------------------------\n'); | ||
76 | for genpd in list_for_each_entry( | ||
77 | gdb.parse_and_eval('&gpd_list'), | ||
78 | generic_pm_domain_type.get_type().pointer(), | ||
79 | 'gpd_list_node'): | ||
80 | self.summary_one(genpd) | ||
81 | |||
82 | |||
83 | LxGenPDSummary() | ||