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