apm_interface.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/logging/log.h"
  4. #include "core/hle/service/apm/apm.h"
  5. #include "core/hle/service/apm/apm_controller.h"
  6. #include "core/hle/service/apm/apm_interface.h"
  7. #include "core/hle/service/ipc_helpers.h"
  8. namespace Service::APM {
  9. class ISession final : public ServiceFramework<ISession> {
  10. public:
  11. explicit ISession(Core::System& system_, Controller& controller_)
  12. : ServiceFramework{system_, "ISession"}, controller{controller_} {
  13. static const FunctionInfo functions[] = {
  14. {0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
  15. {1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
  16. {2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"},
  17. };
  18. RegisterHandlers(functions);
  19. }
  20. private:
  21. void SetPerformanceConfiguration(HLERequestContext& ctx) {
  22. IPC::RequestParser rp{ctx};
  23. const auto mode = rp.PopEnum<PerformanceMode>();
  24. const auto config = rp.PopEnum<PerformanceConfiguration>();
  25. LOG_DEBUG(Service_APM, "called mode={} config={}", mode, config);
  26. controller.SetPerformanceConfiguration(mode, config);
  27. IPC::ResponseBuilder rb{ctx, 2};
  28. rb.Push(ResultSuccess);
  29. }
  30. void GetPerformanceConfiguration(HLERequestContext& ctx) {
  31. IPC::RequestParser rp{ctx};
  32. const auto mode = rp.PopEnum<PerformanceMode>();
  33. LOG_DEBUG(Service_APM, "called mode={}", mode);
  34. IPC::ResponseBuilder rb{ctx, 3};
  35. rb.Push(ResultSuccess);
  36. rb.PushEnum(controller.GetCurrentPerformanceConfiguration(mode));
  37. }
  38. void SetCpuOverclockEnabled(HLERequestContext& ctx) {
  39. IPC::RequestParser rp{ctx};
  40. const auto cpu_overclock_enabled = rp.Pop<bool>();
  41. LOG_WARNING(Service_APM, "(STUBBED) called, cpu_overclock_enabled={}",
  42. cpu_overclock_enabled);
  43. IPC::ResponseBuilder rb{ctx, 2};
  44. rb.Push(ResultSuccess);
  45. }
  46. Controller& controller;
  47. };
  48. APM::APM(Core::System& system_, std::shared_ptr<Module> apm_, Controller& controller_,
  49. const char* name)
  50. : ServiceFramework{system_, name}, apm(std::move(apm_)), controller{controller_} {
  51. static const FunctionInfo functions[] = {
  52. {0, &APM::OpenSession, "OpenSession"},
  53. {1, &APM::GetPerformanceMode, "GetPerformanceMode"},
  54. {6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"},
  55. };
  56. RegisterHandlers(functions);
  57. }
  58. APM::~APM() = default;
  59. void APM::OpenSession(HLERequestContext& ctx) {
  60. LOG_DEBUG(Service_APM, "called");
  61. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  62. rb.Push(ResultSuccess);
  63. rb.PushIpcInterface<ISession>(system, controller);
  64. }
  65. void APM::GetPerformanceMode(HLERequestContext& ctx) {
  66. LOG_DEBUG(Service_APM, "called");
  67. IPC::ResponseBuilder rb{ctx, 2};
  68. rb.PushEnum(controller.GetCurrentPerformanceMode());
  69. }
  70. void APM::IsCpuOverclockEnabled(HLERequestContext& ctx) {
  71. LOG_WARNING(Service_APM, "(STUBBED) called");
  72. IPC::ResponseBuilder rb{ctx, 3};
  73. rb.Push(ResultSuccess);
  74. rb.Push(false);
  75. }
  76. APM_Sys::APM_Sys(Core::System& system_, Controller& controller_)
  77. : ServiceFramework{system_, "apm:sys"}, controller{controller_} {
  78. // clang-format off
  79. static const FunctionInfo functions[] = {
  80. {0, nullptr, "RequestPerformanceMode"},
  81. {1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"},
  82. {2, nullptr, "GetThrottlingState"},
  83. {3, nullptr, "GetLastThrottlingState"},
  84. {4, nullptr, "ClearLastThrottlingState"},
  85. {5, nullptr, "LoadAndApplySettings"},
  86. {6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"},
  87. {7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"},
  88. };
  89. // clang-format on
  90. RegisterHandlers(functions);
  91. }
  92. APM_Sys::~APM_Sys() = default;
  93. void APM_Sys::GetPerformanceEvent(HLERequestContext& ctx) {
  94. LOG_DEBUG(Service_APM, "called");
  95. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  96. rb.Push(ResultSuccess);
  97. rb.PushIpcInterface<ISession>(system, controller);
  98. }
  99. void APM_Sys::SetCpuBoostMode(HLERequestContext& ctx) {
  100. IPC::RequestParser rp{ctx};
  101. const auto mode = rp.PopEnum<CpuBoostMode>();
  102. LOG_DEBUG(Service_APM, "called, mode={:08X}", mode);
  103. controller.SetFromCpuBoostMode(mode);
  104. IPC::ResponseBuilder rb{ctx, 2};
  105. rb.Push(ResultSuccess);
  106. }
  107. void APM_Sys::GetCurrentPerformanceConfiguration(HLERequestContext& ctx) {
  108. LOG_DEBUG(Service_APM, "called");
  109. IPC::ResponseBuilder rb{ctx, 3};
  110. rb.Push(ResultSuccess);
  111. rb.PushEnum(
  112. controller.GetCurrentPerformanceConfiguration(controller.GetCurrentPerformanceMode()));
  113. }
  114. } // namespace Service::APM