apm_controller.cpp 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <algorithm>
  4. #include <array>
  5. #include <utility>
  6. #include "common/logging/log.h"
  7. #include "common/settings.h"
  8. #include "core/core_timing.h"
  9. #include "core/hle/service/apm/apm_controller.h"
  10. namespace Service::APM {
  11. constexpr auto DEFAULT_PERFORMANCE_CONFIGURATION = PerformanceConfiguration::Config7;
  12. Controller::Controller(Core::Timing::CoreTiming& core_timing_)
  13. : core_timing{core_timing_}, configs{
  14. {PerformanceMode::Normal, DEFAULT_PERFORMANCE_CONFIGURATION},
  15. {PerformanceMode::Boost, DEFAULT_PERFORMANCE_CONFIGURATION},
  16. } {}
  17. Controller::~Controller() = default;
  18. void Controller::SetPerformanceConfiguration(PerformanceMode mode,
  19. PerformanceConfiguration config) {
  20. static constexpr std::array<std::pair<PerformanceConfiguration, u32>, 16> config_to_speed{{
  21. {PerformanceConfiguration::Config1, 1020},
  22. {PerformanceConfiguration::Config2, 1020},
  23. {PerformanceConfiguration::Config3, 1224},
  24. {PerformanceConfiguration::Config4, 1020},
  25. {PerformanceConfiguration::Config5, 1020},
  26. {PerformanceConfiguration::Config6, 1224},
  27. {PerformanceConfiguration::Config7, 1020},
  28. {PerformanceConfiguration::Config8, 1020},
  29. {PerformanceConfiguration::Config9, 1020},
  30. {PerformanceConfiguration::Config10, 1020},
  31. {PerformanceConfiguration::Config11, 1020},
  32. {PerformanceConfiguration::Config12, 1020},
  33. {PerformanceConfiguration::Config13, 1785},
  34. {PerformanceConfiguration::Config14, 1785},
  35. {PerformanceConfiguration::Config15, 1020},
  36. {PerformanceConfiguration::Config16, 1020},
  37. }};
  38. const auto iter = std::find_if(config_to_speed.cbegin(), config_to_speed.cend(),
  39. [config](const auto& entry) { return entry.first == config; });
  40. if (iter == config_to_speed.cend()) {
  41. LOG_ERROR(Service_APM, "Invalid performance configuration value provided: {}", config);
  42. return;
  43. }
  44. SetClockSpeed(iter->second);
  45. configs.insert_or_assign(mode, config);
  46. }
  47. void Controller::SetFromCpuBoostMode(CpuBoostMode mode) {
  48. constexpr std::array<PerformanceConfiguration, 3> BOOST_MODE_TO_CONFIG_MAP{{
  49. PerformanceConfiguration::Config7,
  50. PerformanceConfiguration::Config13,
  51. PerformanceConfiguration::Config15,
  52. }};
  53. SetPerformanceConfiguration(PerformanceMode::Boost,
  54. BOOST_MODE_TO_CONFIG_MAP.at(static_cast<u32>(mode)));
  55. }
  56. PerformanceMode Controller::GetCurrentPerformanceMode() const {
  57. return Settings::values.use_docked_mode.GetValue() ? PerformanceMode::Boost
  58. : PerformanceMode::Normal;
  59. }
  60. PerformanceConfiguration Controller::GetCurrentPerformanceConfiguration(PerformanceMode mode) {
  61. if (configs.find(mode) == configs.end()) {
  62. configs.insert_or_assign(mode, DEFAULT_PERFORMANCE_CONFIGURATION);
  63. }
  64. return configs[mode];
  65. }
  66. void Controller::SetClockSpeed(u32 mhz) {
  67. LOG_DEBUG(Service_APM, "called, mhz={:08X}", mhz);
  68. // TODO(DarkLordZach): Actually signal core_timing to change clock speed.
  69. // TODO(Rodrigo): Remove [[maybe_unused]] when core_timing is used.
  70. }
  71. } // namespace Service::APM