Commit | Line | Data |
---|---|---|
8207d4a8 LC |
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() |