Back to home page

OSCL-LXR

 
 

    


0001 # SPDX-License-Identifier: GPL-2.0
0002 #
0003 # Copyright (c) NXP 2019
0004 
0005 import gdb
0006 import sys
0007 
0008 from linux.utils import CachedType
0009 from linux.lists import list_for_each_entry
0010 
0011 generic_pm_domain_type = CachedType('struct generic_pm_domain')
0012 pm_domain_data_type = CachedType('struct pm_domain_data')
0013 device_link_type = CachedType('struct device_link')
0014 
0015 
0016 def kobject_get_path(kobj):
0017     path = kobj['name'].string()
0018     parent = kobj['parent']
0019     if parent:
0020         path = kobject_get_path(parent) + '/' + path
0021     return path
0022 
0023 
0024 def rtpm_status_str(dev):
0025     if dev['power']['runtime_error']:
0026         return 'error'
0027     if dev['power']['disable_depth']:
0028         return 'unsupported'
0029     _RPM_STATUS_LOOKUP = [
0030         "active",
0031         "resuming",
0032         "suspended",
0033         "suspending"
0034     ]
0035     return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
0036 
0037 
0038 class LxGenPDSummary(gdb.Command):
0039     '''Print genpd summary
0040 
0041 Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
0042 
0043     def __init__(self):
0044         super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
0045 
0046     def summary_one(self, genpd):
0047         if genpd['status'] == 0:
0048             status_string = 'on'
0049         else:
0050             status_string = 'off-{}'.format(genpd['state_idx'])
0051 
0052         child_names = []
0053         for link in list_for_each_entry(
0054                 genpd['parent_links'],
0055                 device_link_type.get_type().pointer(),
0056                 'parent_node'):
0057             child_names.append(link['child']['name'])
0058 
0059         gdb.write('%-30s  %-15s %s\n' % (
0060                 genpd['name'].string(),
0061                 status_string,
0062                 ', '.join(child_names)))
0063 
0064         # Print devices in domain
0065         for pm_data in list_for_each_entry(genpd['dev_list'],
0066                         pm_domain_data_type.get_type().pointer(),
0067                         'list_node'):
0068             dev = pm_data['dev']
0069             kobj_path = kobject_get_path(dev['kobj'])
0070             gdb.write('    %-50s  %s\n' % (kobj_path, rtpm_status_str(dev)))
0071 
0072     def invoke(self, arg, from_tty):
0073         gdb.write('domain                          status          children\n');
0074         gdb.write('    /device                                             runtime status\n');
0075         gdb.write('----------------------------------------------------------------------\n');
0076         for genpd in list_for_each_entry(
0077                 gdb.parse_and_eval('&gpd_list'),
0078                 generic_pm_domain_type.get_type().pointer(),
0079                 'gpd_list_node'):
0080             self.summary_one(genpd)
0081 
0082 
0083 LxGenPDSummary()