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.timerlist | ||||
|     import linux.clk | ||||
|     import linux.genpd | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Leonard Crestez
						Leonard Crestez