genpd.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # SPDX-License-Identifier: GPL-2.0
  2. #
  3. # Copyright (c) NXP 2019
  4. import gdb
  5. import sys
  6. from linux.utils import CachedType, gdb_eval_or_none
  7. from linux.lists import list_for_each_entry
  8. generic_pm_domain_type = CachedType('struct generic_pm_domain')
  9. pm_domain_data_type = CachedType('struct pm_domain_data')
  10. device_link_type = CachedType('struct device_link')
  11. def kobject_get_path(kobj):
  12. path = kobj['name'].string()
  13. parent = kobj['parent']
  14. if parent:
  15. path = kobject_get_path(parent) + '/' + path
  16. return path
  17. def rtpm_status_str(dev):
  18. if dev['power']['runtime_error']:
  19. return 'error'
  20. if dev['power']['disable_depth']:
  21. return 'unsupported'
  22. _RPM_STATUS_LOOKUP = [
  23. "active",
  24. "resuming",
  25. "suspended",
  26. "suspending"
  27. ]
  28. return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
  29. class LxGenPDSummary(gdb.Command):
  30. '''Print genpd summary
  31. Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
  32. def __init__(self):
  33. super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
  34. def summary_one(self, genpd):
  35. if genpd['status'] == 0:
  36. status_string = 'on'
  37. else:
  38. status_string = 'off-{}'.format(genpd['state_idx'])
  39. child_names = []
  40. for link in list_for_each_entry(
  41. genpd['parent_links'],
  42. device_link_type.get_type().pointer(),
  43. 'parent_node'):
  44. child_names.append(link['child']['name'])
  45. gdb.write('%-30s %-15s %s\n' % (
  46. genpd['name'].string(),
  47. status_string,
  48. ', '.join(child_names)))
  49. # Print devices in domain
  50. for pm_data in list_for_each_entry(genpd['dev_list'],
  51. pm_domain_data_type.get_type().pointer(),
  52. 'list_node'):
  53. dev = pm_data['dev']
  54. kobj_path = kobject_get_path(dev['kobj'])
  55. gdb.write(' %-50s %s\n' % (kobj_path, rtpm_status_str(dev)))
  56. def invoke(self, arg, from_tty):
  57. if gdb_eval_or_none("&gpd_list") is None:
  58. raise gdb.GdbError("No power domain(s) registered")
  59. gdb.write('domain status children\n');
  60. gdb.write(' /device runtime status\n');
  61. gdb.write('----------------------------------------------------------------------\n');
  62. for genpd in list_for_each_entry(
  63. gdb.parse_and_eval('&gpd_list'),
  64. generic_pm_domain_type.get_type().pointer(),
  65. 'gpd_list_node'):
  66. self.summary_one(genpd)
  67. LxGenPDSummary()