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
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