1# SPDX-License-Identifier: GPL-2.0 2# 3# Copyright (c) NXP 2019 4 5import gdb 6import sys 7 8from linux.utils import CachedType 9from linux.lists import list_for_each_entry 10 11generic_pm_domain_type = CachedType('struct generic_pm_domain') 12pm_domain_data_type = CachedType('struct pm_domain_data') 13device_link_type = CachedType('struct device_link') 14 15 16def 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 24def 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 38class LxGenPDSummary(gdb.Command): 39 '''Print genpd summary 40 41Output 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 child_names = [] 53 for link in list_for_each_entry( 54 genpd['parent_links'], 55 device_link_type.get_type().pointer(), 56 'parent_node'): 57 child_names.append(link['child']['name']) 58 59 gdb.write('%-30s %-15s %s\n' % ( 60 genpd['name'].string(), 61 status_string, 62 ', '.join(child_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 children\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 83LxGenPDSummary() 84