xref: /linux-6.15/scripts/gdb/linux/genpd.py (revision f19c3c29)
18207d4a8SLeonard Crestez# SPDX-License-Identifier: GPL-2.0
28207d4a8SLeonard Crestez#
38207d4a8SLeonard Crestez# Copyright (c) NXP 2019
48207d4a8SLeonard Crestez
58207d4a8SLeonard Crestezimport gdb
68207d4a8SLeonard Crestezimport sys
78207d4a8SLeonard Crestez
8*f19c3c29SFlorian Fainellifrom linux.utils import CachedType, gdb_eval_or_none
98207d4a8SLeonard Crestezfrom linux.lists import list_for_each_entry
108207d4a8SLeonard Crestez
118207d4a8SLeonard Crestezgeneric_pm_domain_type = CachedType('struct generic_pm_domain')
128207d4a8SLeonard Crestezpm_domain_data_type = CachedType('struct pm_domain_data')
138207d4a8SLeonard Crestezdevice_link_type = CachedType('struct device_link')
148207d4a8SLeonard Crestez
158207d4a8SLeonard Crestez
168207d4a8SLeonard Crestezdef kobject_get_path(kobj):
178207d4a8SLeonard Crestez    path = kobj['name'].string()
188207d4a8SLeonard Crestez    parent = kobj['parent']
198207d4a8SLeonard Crestez    if parent:
208207d4a8SLeonard Crestez        path = kobject_get_path(parent) + '/' + path
218207d4a8SLeonard Crestez    return path
228207d4a8SLeonard Crestez
238207d4a8SLeonard Crestez
248207d4a8SLeonard Crestezdef rtpm_status_str(dev):
258207d4a8SLeonard Crestez    if dev['power']['runtime_error']:
268207d4a8SLeonard Crestez        return 'error'
278207d4a8SLeonard Crestez    if dev['power']['disable_depth']:
288207d4a8SLeonard Crestez        return 'unsupported'
298207d4a8SLeonard Crestez    _RPM_STATUS_LOOKUP = [
308207d4a8SLeonard Crestez        "active",
318207d4a8SLeonard Crestez        "resuming",
328207d4a8SLeonard Crestez        "suspended",
338207d4a8SLeonard Crestez        "suspending"
348207d4a8SLeonard Crestez    ]
358207d4a8SLeonard Crestez    return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
368207d4a8SLeonard Crestez
378207d4a8SLeonard Crestez
388207d4a8SLeonard Crestezclass LxGenPDSummary(gdb.Command):
398207d4a8SLeonard Crestez    '''Print genpd summary
408207d4a8SLeonard Crestez
418207d4a8SLeonard CrestezOutput is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
428207d4a8SLeonard Crestez
438207d4a8SLeonard Crestez    def __init__(self):
448207d4a8SLeonard Crestez        super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
458207d4a8SLeonard Crestez
468207d4a8SLeonard Crestez    def summary_one(self, genpd):
478207d4a8SLeonard Crestez        if genpd['status'] == 0:
488207d4a8SLeonard Crestez            status_string = 'on'
498207d4a8SLeonard Crestez        else:
508207d4a8SLeonard Crestez            status_string = 'off-{}'.format(genpd['state_idx'])
518207d4a8SLeonard Crestez
528d87ae48SKees Cook        child_names = []
538207d4a8SLeonard Crestez        for link in list_for_each_entry(
548d87ae48SKees Cook                genpd['parent_links'],
558207d4a8SLeonard Crestez                device_link_type.get_type().pointer(),
568d87ae48SKees Cook                'parent_node'):
578d87ae48SKees Cook            child_names.append(link['child']['name'])
588207d4a8SLeonard Crestez
598207d4a8SLeonard Crestez        gdb.write('%-30s  %-15s %s\n' % (
608207d4a8SLeonard Crestez                genpd['name'].string(),
618207d4a8SLeonard Crestez                status_string,
628d87ae48SKees Cook                ', '.join(child_names)))
638207d4a8SLeonard Crestez
648207d4a8SLeonard Crestez        # Print devices in domain
658207d4a8SLeonard Crestez        for pm_data in list_for_each_entry(genpd['dev_list'],
668207d4a8SLeonard Crestez                        pm_domain_data_type.get_type().pointer(),
678207d4a8SLeonard Crestez                        'list_node'):
688207d4a8SLeonard Crestez            dev = pm_data['dev']
698207d4a8SLeonard Crestez            kobj_path = kobject_get_path(dev['kobj'])
708207d4a8SLeonard Crestez            gdb.write('    %-50s  %s\n' % (kobj_path, rtpm_status_str(dev)))
718207d4a8SLeonard Crestez
728207d4a8SLeonard Crestez    def invoke(self, arg, from_tty):
73*f19c3c29SFlorian Fainelli        if gdb_eval_or_none("&gpd_list") is None:
74*f19c3c29SFlorian Fainelli            raise gdb.GdbError("No power domain(s) registered")
758d87ae48SKees Cook        gdb.write('domain                          status          children\n');
768207d4a8SLeonard Crestez        gdb.write('    /device                                             runtime status\n');
778207d4a8SLeonard Crestez        gdb.write('----------------------------------------------------------------------\n');
788207d4a8SLeonard Crestez        for genpd in list_for_each_entry(
798207d4a8SLeonard Crestez                gdb.parse_and_eval('&gpd_list'),
808207d4a8SLeonard Crestez                generic_pm_domain_type.get_type().pointer(),
818207d4a8SLeonard Crestez                'gpd_list_node'):
828207d4a8SLeonard Crestez            self.summary_one(genpd)
838207d4a8SLeonard Crestez
848207d4a8SLeonard Crestez
858207d4a8SLeonard CrestezLxGenPDSummary()
86