cpuidle-set.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <stdlib.h>
  5. #include <limits.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <getopt.h>
  9. #include "cpufreq.h"
  10. #include "helpers/helpers.h"
  11. #include "helpers/sysfs.h"
  12. static struct option info_opts[] = {
  13. { .name = "disable", .has_arg = required_argument, .flag = NULL, .val = 'd'},
  14. { .name = "enable", .has_arg = required_argument, .flag = NULL, .val = 'e'},
  15. { },
  16. };
  17. int cmd_idle_set(int argc, char **argv)
  18. {
  19. extern char *optarg;
  20. extern int optind, opterr, optopt;
  21. int ret = 0, cont = 1, param = 0, idlestate = 0;
  22. unsigned int cpu = 0;
  23. do {
  24. ret = getopt_long(argc, argv, "d:e:", info_opts, NULL);
  25. if (ret == -1)
  26. break;
  27. switch (ret) {
  28. case '?':
  29. param = '?';
  30. cont = 0;
  31. break;
  32. case 'd':
  33. if (param) {
  34. param = -1;
  35. cont = 0;
  36. break;
  37. }
  38. param = ret;
  39. idlestate = atoi(optarg);
  40. break;
  41. case 'e':
  42. if (param) {
  43. param = -1;
  44. cont = 0;
  45. break;
  46. }
  47. param = ret;
  48. idlestate = atoi(optarg);
  49. break;
  50. case -1:
  51. cont = 0;
  52. break;
  53. }
  54. } while (cont);
  55. switch (param) {
  56. case -1:
  57. printf(_("You can't specify more than one "
  58. "output-specific argument\n"));
  59. exit(EXIT_FAILURE);
  60. case '?':
  61. printf(_("invalid or unknown argument\n"));
  62. exit(EXIT_FAILURE);
  63. }
  64. /* Default is: set all CPUs */
  65. if (bitmask_isallclear(cpus_chosen))
  66. bitmask_setall(cpus_chosen);
  67. for (cpu = bitmask_first(cpus_chosen);
  68. cpu <= bitmask_last(cpus_chosen); cpu++) {
  69. if (!bitmask_isbitset(cpus_chosen, cpu))
  70. continue;
  71. switch (param) {
  72. case 'd':
  73. ret = sysfs_idlestate_disable(cpu, idlestate, 1);
  74. if (ret == 0)
  75. printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);
  76. else if (ret == -1)
  77. printf(_("Idlestate %u not available on CPU %u\n"),
  78. idlestate, cpu);
  79. else if (ret == -2)
  80. printf(_("Idlestate disabling not supported by kernel\n"));
  81. else
  82. printf(_("Idlestate %u not disabled on CPU %u\n"),
  83. idlestate, cpu);
  84. break;
  85. case 'e':
  86. ret = sysfs_idlestate_disable(cpu, idlestate, 0);
  87. if (ret == 0)
  88. printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);
  89. else if (ret == -1)
  90. printf(_("Idlestate %u not available on CPU %u\n"),
  91. idlestate, cpu);
  92. else if (ret == -2)
  93. printf(_("Idlestate enabling not supported by kernel\n"));
  94. else
  95. printf(_("Idlestate %u not enabled on CPU %u\n"),
  96. idlestate, cpu);
  97. break;
  98. default:
  99. /* Not reachable with proper args checking */
  100. printf(_("Invalid or unknown argument\n"));
  101. exit(EXIT_FAILURE);
  102. break;
  103. }
  104. }
  105. return EXIT_SUCCESS;
  106. }