mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	scripts/gdb: initial clk support: lx-clk-summary
Add an lx-clk-summary command which prints a subset of /sys/kernel/debug/clk/clk_summary. This can be used to examine hangs caused by clk not being enabled. Link: http://lkml.kernel.org/r/Message-ID: Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com> Cc: Jan Kiszka <jan.kiszka@siemens.com> Cc: Jason Wessel <jason.wessel@windriver.com> Cc: Kieran Bingham <kbingham@kernel.org> Cc: Stephen Boyd <swboyd@chromium.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
							
								
									47d0d12855
								
							
						
					
					
						commit
						d1e9710b63
					
				
					 2 changed files with 47 additions and 0 deletions
				
			
		
							
								
								
									
										46
									
								
								scripts/gdb/linux/clk.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								scripts/gdb/linux/clk.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| # SPDX-License-Identifier: GPL-2.0 | ||||
| # | ||||
| # Copyright (c) NXP 2019 | ||||
| 
 | ||||
| import gdb | ||||
| import sys | ||||
| 
 | ||||
| from linux import utils, lists | ||||
| 
 | ||||
| clk_core_type = utils.CachedType("struct clk_core") | ||||
| 
 | ||||
| 
 | ||||
| def clk_core_for_each_child(hlist_head): | ||||
|     return lists.hlist_for_each_entry(hlist_head, | ||||
|             clk_core_type.get_type().pointer(), "child_node") | ||||
| 
 | ||||
| 
 | ||||
| class LxClkSummary(gdb.Command): | ||||
|     """Print Linux kernel log buffer.""" | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         super(LxClkSummary, self).__init__("lx-clk-summary", gdb.COMMAND_DATA) | ||||
| 
 | ||||
|     def show_subtree(self, clk, level): | ||||
|         gdb.write("%*s%-*s %7d %8d %8d\n" % ( | ||||
|                 level * 3 + 1, "", | ||||
|                 30 - level * 3, | ||||
|                 clk['name'].string(), | ||||
|                 clk['enable_count'], | ||||
|                 clk['prepare_count'], | ||||
|                 clk['protect_count'])) | ||||
| 
 | ||||
|         for child in clk_core_for_each_child(clk['children']): | ||||
|             self.show_subtree(child, level + 1) | ||||
| 
 | ||||
|     def invoke(self, arg, from_tty): | ||||
|         gdb.write("                                 enable  prepare  protect\n") | ||||
|         gdb.write("   clock                          count    count    count\n") | ||||
|         gdb.write("---------------------------------------------------------\n") | ||||
|         for clk in clk_core_for_each_child(gdb.parse_and_eval("clk_root_list")): | ||||
|             self.show_subtree(clk, 0) | ||||
|         for clk in clk_core_for_each_child(gdb.parse_and_eval("clk_orphan_list")): | ||||
|             self.show_subtree(clk, 0) | ||||
| 
 | ||||
| 
 | ||||
| LxClkSummary() | ||||
|  | @ -34,3 +34,4 @@ else: | |||
|     import linux.proc | ||||
|     import linux.constants | ||||
|     import linux.timerlist | ||||
|     import linux.clk | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Leonard Crestez
						Leonard Crestez