mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-03 17:40:04 +00:00
![Florian Fainelli](/assets/img/avatar_default.png)
Avoid generating an exception if there are no generic power domain(s)
registered:
(gdb) lx-genpd-summary
domain status children
/device runtime status
----------------------------------------------------------------------
Python Exception <class 'gdb.error'>: No symbol "gpd_list" in current context.
Error occurred in Python: No symbol "gpd_list" in current context.
(gdb) quit
[f.fainelli@gmail.com: correctly invoke gdb_eval_or_none]
Link: https://lkml.kernel.org/r/20230327185746.3856407-1-f.fainelli@gmail.com
Link: https://lkml.kernel.org/r/20230323231659.3319941-1-f.fainelli@gmail.com
Fixes: 8207d4a88e
("scripts/gdb: add lx-genpd-summary command")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Kieran Bingham <kbingham@kernel.org>
Cc: Leonard Crestez <leonard.crestez@nxp.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Copyright (c) NXP 2019
|
|
|
|
import gdb
|
|
import sys
|
|
|
|
from linux.utils import CachedType, gdb_eval_or_none
|
|
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'])
|
|
|
|
child_names = []
|
|
for link in list_for_each_entry(
|
|
genpd['parent_links'],
|
|
device_link_type.get_type().pointer(),
|
|
'parent_node'):
|
|
child_names.append(link['child']['name'])
|
|
|
|
gdb.write('%-30s %-15s %s\n' % (
|
|
genpd['name'].string(),
|
|
status_string,
|
|
', '.join(child_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):
|
|
if gdb_eval_or_none("&gpd_list") is None:
|
|
raise gdb.GdbError("No power domain(s) registered")
|
|
gdb.write('domain status children\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()
|