xref: /OK3568_Linux_fs/kernel/scripts/gdb/linux/genpd.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# Copyright (c) NXP 2019
4*4882a593Smuzhiyun
5*4882a593Smuzhiyunimport gdb
6*4882a593Smuzhiyunimport sys
7*4882a593Smuzhiyun
8*4882a593Smuzhiyunfrom linux.utils import CachedType
9*4882a593Smuzhiyunfrom linux.lists import list_for_each_entry
10*4882a593Smuzhiyun
11*4882a593Smuzhiyungeneric_pm_domain_type = CachedType('struct generic_pm_domain')
12*4882a593Smuzhiyunpm_domain_data_type = CachedType('struct pm_domain_data')
13*4882a593Smuzhiyundevice_link_type = CachedType('struct device_link')
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun
16*4882a593Smuzhiyundef kobject_get_path(kobj):
17*4882a593Smuzhiyun    path = kobj['name'].string()
18*4882a593Smuzhiyun    parent = kobj['parent']
19*4882a593Smuzhiyun    if parent:
20*4882a593Smuzhiyun        path = kobject_get_path(parent) + '/' + path
21*4882a593Smuzhiyun    return path
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun
24*4882a593Smuzhiyundef rtpm_status_str(dev):
25*4882a593Smuzhiyun    if dev['power']['runtime_error']:
26*4882a593Smuzhiyun        return 'error'
27*4882a593Smuzhiyun    if dev['power']['disable_depth']:
28*4882a593Smuzhiyun        return 'unsupported'
29*4882a593Smuzhiyun    _RPM_STATUS_LOOKUP = [
30*4882a593Smuzhiyun        "active",
31*4882a593Smuzhiyun        "resuming",
32*4882a593Smuzhiyun        "suspended",
33*4882a593Smuzhiyun        "suspending"
34*4882a593Smuzhiyun    ]
35*4882a593Smuzhiyun    return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun
38*4882a593Smuzhiyunclass LxGenPDSummary(gdb.Command):
39*4882a593Smuzhiyun    '''Print genpd summary
40*4882a593Smuzhiyun
41*4882a593SmuzhiyunOutput is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun    def __init__(self):
44*4882a593Smuzhiyun        super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun    def summary_one(self, genpd):
47*4882a593Smuzhiyun        if genpd['status'] == 0:
48*4882a593Smuzhiyun            status_string = 'on'
49*4882a593Smuzhiyun        else:
50*4882a593Smuzhiyun            status_string = 'off-{}'.format(genpd['state_idx'])
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun        child_names = []
53*4882a593Smuzhiyun        for link in list_for_each_entry(
54*4882a593Smuzhiyun                genpd['parent_links'],
55*4882a593Smuzhiyun                device_link_type.get_type().pointer(),
56*4882a593Smuzhiyun                'parent_node'):
57*4882a593Smuzhiyun            child_names.append(link['child']['name'])
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun        gdb.write('%-30s  %-15s %s\n' % (
60*4882a593Smuzhiyun                genpd['name'].string(),
61*4882a593Smuzhiyun                status_string,
62*4882a593Smuzhiyun                ', '.join(child_names)))
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun        # Print devices in domain
65*4882a593Smuzhiyun        for pm_data in list_for_each_entry(genpd['dev_list'],
66*4882a593Smuzhiyun                        pm_domain_data_type.get_type().pointer(),
67*4882a593Smuzhiyun                        'list_node'):
68*4882a593Smuzhiyun            dev = pm_data['dev']
69*4882a593Smuzhiyun            kobj_path = kobject_get_path(dev['kobj'])
70*4882a593Smuzhiyun            gdb.write('    %-50s  %s\n' % (kobj_path, rtpm_status_str(dev)))
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun    def invoke(self, arg, from_tty):
73*4882a593Smuzhiyun        gdb.write('domain                          status          children\n');
74*4882a593Smuzhiyun        gdb.write('    /device                                             runtime status\n');
75*4882a593Smuzhiyun        gdb.write('----------------------------------------------------------------------\n');
76*4882a593Smuzhiyun        for genpd in list_for_each_entry(
77*4882a593Smuzhiyun                gdb.parse_and_eval('&gpd_list'),
78*4882a593Smuzhiyun                generic_pm_domain_type.get_type().pointer(),
79*4882a593Smuzhiyun                'gpd_list_node'):
80*4882a593Smuzhiyun            self.summary_one(genpd)
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun
83*4882a593SmuzhiyunLxGenPDSummary()
84