Implement am ICommonStateGetter::SetCpuBoostMode (#743)

- Implement am ICommonStateGetter::SetCpuBoostMode according to the RE:

```
signed __int64 __fastcall nn::ICommonStateGetter::SetCpuBoostModeImpl(__int64 this, unsigned int cpu_boost_mode)
{
  if ( cpu_boost_mode > 1 )
  {
    return 0x3F480LL;
  }

  __int64 v2 = *(_QWORD *)(this + 0x38);
  __int64 v3 = *(_QWORD *)(*(_QWORD *)(v2 + 8) + 0x298LL);

  nnLock((_DWORD *)(v3 + 0x104));

  __int64 v5 = *(_QWORD *)(v2 + 0x18);
  bool unk_bool = *(unsigned __int8 *)(v5 + 0x7C);

  *(_DWORD *)(v5 + 0x80) = cpu_boost_mode;

  if (!unk_bool)
  {
    *(_BYTE *)(v5 + 0x7C) = 1;
  }

  wait_condvar(v3 + 0xA8);
  nnUnlock((_DWORD *)(v3 + 0x104));

  return 0LL;
}
```

- Add enum for apm CpuBoostMode
- Add missing values in apm PerformanceConfiguration with some comments.
This commit is contained in:
Ac_K 2019-08-28 13:02:50 +02:00 committed by Thomas Guillemard
parent 5c44c9600f
commit 6b8fb8a4e3
4 changed files with 50 additions and 15 deletions

View file

@ -10,6 +10,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
{ {
private KEvent _displayResolutionChangeEvent; private KEvent _displayResolutionChangeEvent;
private Apm.CpuBoostMode _cpuBoostMode = Apm.CpuBoostMode.Disabled;
public ICommonStateGetter(Horizon system) public ICommonStateGetter(Horizon system)
{ {
_displayResolutionChangeEvent = new KEvent(system); _displayResolutionChangeEvent = new KEvent(system);
@ -116,5 +118,24 @@ namespace Ryujinx.HLE.HOS.Services.Am
return ResultCode.Success; return ResultCode.Success;
} }
[Command(66)] // 6.0.0+
// SetCpuBoostMode(u32 cpu_boost_mode)
public ResultCode SetCpuBoostMode(ServiceCtx context)
{
uint cpuBoostMode = context.RequestData.ReadUInt32();
if (cpuBoostMode > 1)
{
return ResultCode.CpuBoostModeInvalid;
}
_cpuBoostMode = (Apm.CpuBoostMode)cpuBoostMode;
// NOTE: There is a condition variable after the assignment, probably waiting something with apm:sys service (SetCpuBoostMode call?).
// Since we will probably never support CPU boost things, it's not needed to implement more.
return ResultCode.Success;
}
} }
} }

View file

@ -7,6 +7,7 @@ namespace Ryujinx.HLE.HOS.Services.Am
Success = 0, Success = 0,
NoMessages = (3 << ErrorCodeShift) | ModuleId NoMessages = (3 << ErrorCodeShift) | ModuleId,
CpuBoostModeInvalid = (506 << ErrorCodeShift) | ModuleId
} }
} }

View file

@ -0,0 +1,9 @@
namespace Ryujinx.HLE.HOS.Services.Apm
{
enum CpuBoostMode
{
Disabled = 0,
Mode1 = 1, // Use PerformanceConfiguration13 and PerformanceConfiguration14, or PerformanceConfiguration15 and PerformanceConfiguration16
Mode2 = 2 // Use PerformanceConfiguration15 and PerformanceConfiguration16.
}
}

View file

@ -1,18 +1,22 @@
namespace Ryujinx.HLE.HOS.Services.Apm namespace Ryujinx.HLE.HOS.Services.Apm
{ {
enum PerformanceConfiguration : uint enum PerformanceConfiguration : uint // Clocks are all in MHz.
{ { // CPU | GPU | RAM | NOTE
PerformanceConfiguration1 = 0x00010000, PerformanceConfiguration1 = 0x00010000, // 1020 | 384 | 1600 | Only available while docked.
PerformanceConfiguration2 = 0x00010001, PerformanceConfiguration2 = 0x00010001, // 1020 | 768 | 1600 | Only available while docked.
PerformanceConfiguration3 = 0x00010002, PerformanceConfiguration3 = 0x00010002, // 1224 | 691.2 | 1600 | Only available for SDEV units.
PerformanceConfiguration4 = 0x00020000, PerformanceConfiguration4 = 0x00020000, // 1020 | 230.4 | 1600 | Only available for SDEV units.
PerformanceConfiguration5 = 0x00020001, PerformanceConfiguration5 = 0x00020001, // 1020 | 307.2 | 1600 |
PerformanceConfiguration6 = 0x00020002, PerformanceConfiguration6 = 0x00020002, // 1224 | 230.4 | 1600 |
PerformanceConfiguration7 = 0x00020003, PerformanceConfiguration7 = 0x00020003, // 1020 | 307 | 1331.2 |
PerformanceConfiguration8 = 0x00020004, PerformanceConfiguration8 = 0x00020004, // 1020 | 384 | 1331.2 |
PerformanceConfiguration9 = 0x00020005, PerformanceConfiguration9 = 0x00020005, // 1020 | 307.2 | 1065.6 |
PerformanceConfiguration10 = 0x00020006, PerformanceConfiguration10 = 0x00020006, // 1020 | 384 | 1065.6 |
PerformanceConfiguration11 = 0x92220007, PerformanceConfiguration11 = 0x92220007, // 1020 | 460.8 | 1600 |
PerformanceConfiguration12 = 0x92220008 PerformanceConfiguration12 = 0x92220008, // 1020 | 460.8 | 1331.2 |
PerformanceConfiguration13 = 0x92220009, // 1785 | 768 | 1600 | 7.0.0+
PerformanceConfiguration14 = 0x9222000A, // 1785 | 768 | 1331.2 | 7.0.0+
PerformanceConfiguration15 = 0x9222000B, // 1020 | 768 | 1600 | 7.0.0+
PerformanceConfiguration16 = 0x9222000C // 1020 | 768 | 1331.2 | 7.0.0+
} }
} }