mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	scripts/gdb: add lx-genpd-summary command
This is like /sys/kernel/debug/pm/pm_genpd_summary except it's accessible through a debugger. This can be useful if the target crashes or hangs because power domains were not properly enabled. Link: http://lkml.kernel.org/r/f9ee627a0d4f94b894aa202fee8a98444049bed8.1561492937.git.leonard.crestez@nxp.com Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com> Reviewed-by: Stephen Boyd <sboyd@kernel.org> Cc: Kieran Bingham <kbingham@kernel.org> Cc: Jan Kiszka <jan.kiszka@siemens.com> Cc: "Rafael J. Wysocki" <rafael@kernel.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									5515e9a627
								
							
						
					
					
						commit
						8207d4a88e
					
				
					 2 changed files with 84 additions and 0 deletions
				
			
		
							
								
								
									
										83
									
								
								scripts/gdb/linux/genpd.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								scripts/gdb/linux/genpd.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,83 @@ | ||||||
|  | # SPDX-License-Identifier: GPL-2.0 | ||||||
|  | # | ||||||
|  | # Copyright (c) NXP 2019 | ||||||
|  | 
 | ||||||
|  | import gdb | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from linux.utils import CachedType | ||||||
|  | from linux.lists import list_for_each_entry | ||||||
|  | 
 | ||||||
|  | generic_pm_domain_type = CachedType('struct generic_pm_domain') | ||||||
|  | pm_domain_data_type = CachedType('struct pm_domain_data') | ||||||
|  | device_link_type = CachedType('struct device_link') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def kobject_get_path(kobj): | ||||||
|  |     path = kobj['name'].string() | ||||||
|  |     parent = kobj['parent'] | ||||||
|  |     if parent: | ||||||
|  |         path = kobject_get_path(parent) + '/' + path | ||||||
|  |     return path | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def rtpm_status_str(dev): | ||||||
|  |     if dev['power']['runtime_error']: | ||||||
|  |         return 'error' | ||||||
|  |     if dev['power']['disable_depth']: | ||||||
|  |         return 'unsupported' | ||||||
|  |     _RPM_STATUS_LOOKUP = [ | ||||||
|  |         "active", | ||||||
|  |         "resuming", | ||||||
|  |         "suspended", | ||||||
|  |         "suspending" | ||||||
|  |     ] | ||||||
|  |     return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class LxGenPDSummary(gdb.Command): | ||||||
|  |     '''Print genpd summary | ||||||
|  | 
 | ||||||
|  | Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary''' | ||||||
|  | 
 | ||||||
|  |     def __init__(self): | ||||||
|  |         super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA) | ||||||
|  | 
 | ||||||
|  |     def summary_one(self, genpd): | ||||||
|  |         if genpd['status'] == 0: | ||||||
|  |             status_string = 'on' | ||||||
|  |         else: | ||||||
|  |             status_string = 'off-{}'.format(genpd['state_idx']) | ||||||
|  | 
 | ||||||
|  |         slave_names = [] | ||||||
|  |         for link in list_for_each_entry( | ||||||
|  |                 genpd['master_links'], | ||||||
|  |                 device_link_type.get_type().pointer(), | ||||||
|  |                 'master_node'): | ||||||
|  |             slave_names.apend(link['slave']['name']) | ||||||
|  | 
 | ||||||
|  |         gdb.write('%-30s  %-15s %s\n' % ( | ||||||
|  |                 genpd['name'].string(), | ||||||
|  |                 status_string, | ||||||
|  |                 ', '.join(slave_names))) | ||||||
|  | 
 | ||||||
|  |         # Print devices in domain | ||||||
|  |         for pm_data in list_for_each_entry(genpd['dev_list'], | ||||||
|  |                         pm_domain_data_type.get_type().pointer(), | ||||||
|  |                         'list_node'): | ||||||
|  |             dev = pm_data['dev'] | ||||||
|  |             kobj_path = kobject_get_path(dev['kobj']) | ||||||
|  |             gdb.write('    %-50s  %s\n' % (kobj_path, rtpm_status_str(dev))) | ||||||
|  | 
 | ||||||
|  |     def invoke(self, arg, from_tty): | ||||||
|  |         gdb.write('domain                          status          slaves\n'); | ||||||
|  |         gdb.write('    /device                                             runtime status\n'); | ||||||
|  |         gdb.write('----------------------------------------------------------------------\n'); | ||||||
|  |         for genpd in list_for_each_entry( | ||||||
|  |                 gdb.parse_and_eval('&gpd_list'), | ||||||
|  |                 generic_pm_domain_type.get_type().pointer(), | ||||||
|  |                 'gpd_list_node'): | ||||||
|  |             self.summary_one(genpd) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | LxGenPDSummary() | ||||||
|  | @ -35,3 +35,4 @@ else: | ||||||
|     import linux.constants |     import linux.constants | ||||||
|     import linux.timerlist |     import linux.timerlist | ||||||
|     import linux.clk |     import linux.clk | ||||||
|  |     import linux.genpd | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Leonard Crestez
						Leonard Crestez