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