cmd_cpu.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2015 Google, Inc
  3. * Written by Simon Glass <sjg@chromium.org>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <command.h>
  9. #include <cpu.h>
  10. #include <dm.h>
  11. #include <errno.h>
  12. static const char *cpu_feature_name[CPU_FEAT_COUNT] = {
  13. "L1 cache",
  14. "MMU",
  15. };
  16. static int print_cpu_list(bool detail)
  17. {
  18. struct udevice *dev;
  19. struct uclass *uc;
  20. char buf[100];
  21. int ret;
  22. ret = uclass_get(UCLASS_CPU, &uc);
  23. if (ret) {
  24. printf("Cannot find CPU uclass\n");
  25. return ret;
  26. }
  27. uclass_foreach_dev(dev, uc) {
  28. struct cpu_platdata *plat = dev_get_parent_platdata(dev);
  29. struct cpu_info info;
  30. bool first;
  31. int i;
  32. ret = cpu_get_desc(dev, buf, sizeof(buf));
  33. printf("%3d: %-10s %s\n", dev->seq, dev->name,
  34. ret ? "<no description>" : buf);
  35. if (!detail)
  36. continue;
  37. ret = cpu_get_info(dev, &info);
  38. if (ret) {
  39. printf("\t(no detail available");
  40. if (ret != -ENOSYS)
  41. printf(": err=%d\n", ret);
  42. printf(")\n");
  43. continue;
  44. }
  45. printf("\tID = %d, freq = ", plat->cpu_id);
  46. print_freq(info.cpu_freq, "");
  47. first = true;
  48. for (i = 0; i < CPU_FEAT_COUNT; i++) {
  49. if (info.features & (1 << i)) {
  50. printf("%s%s", first ? ": " : ", ",
  51. cpu_feature_name[i]);
  52. first = false;
  53. }
  54. }
  55. printf("\n");
  56. }
  57. return 0;
  58. }
  59. static int do_cpu_list(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  60. {
  61. if (print_cpu_list(false))
  62. return CMD_RET_FAILURE;
  63. return 0;
  64. }
  65. static int do_cpu_detail(cmd_tbl_t *cmdtp, int flag, int argc,
  66. char *const argv[])
  67. {
  68. if (print_cpu_list(true))
  69. return CMD_RET_FAILURE;
  70. return 0;
  71. }
  72. static cmd_tbl_t cmd_cpu_sub[] = {
  73. U_BOOT_CMD_MKENT(list, 2, 1, do_cpu_list, "", ""),
  74. U_BOOT_CMD_MKENT(detail, 4, 0, do_cpu_detail, "", ""),
  75. };
  76. /*
  77. * Process a cpu sub-command
  78. */
  79. static int do_cpu(cmd_tbl_t *cmdtp, int flag, int argc,
  80. char * const argv[])
  81. {
  82. cmd_tbl_t *c = NULL;
  83. /* Strip off leading 'cpu' command argument */
  84. argc--;
  85. argv++;
  86. if (argc)
  87. c = find_cmd_tbl(argv[0], cmd_cpu_sub, ARRAY_SIZE(cmd_cpu_sub));
  88. if (c)
  89. return c->cmd(cmdtp, flag, argc, argv);
  90. else
  91. return CMD_RET_USAGE;
  92. }
  93. U_BOOT_CMD(
  94. cpu, 2, 1, do_cpu,
  95. "display information about CPUs",
  96. "list - list available CPUs\n"
  97. "cpu detail - show CPU detail"
  98. );