Explorar el Código

core: implement clkrst service

vonchenplus hace 3 años
padre
commit
4bab0d07a6
Se han modificado 2 ficheros con 184 adiciones y 0 borrados
  1. 93 0
      src/core/hle/service/pcv/pcv.cpp
  2. 91 0
      src/core/hle/service/pcv/pcv.h

+ 93 - 0
src/core/hle/service/pcv/pcv.cpp

@@ -3,6 +3,7 @@
 
 #include <memory>
 
+#include "core/hle/ipc_helpers.h"
 #include "core/hle/service/pcv/pcv.h"
 #include "core/hle/service/service.h"
 #include "core/hle/service/sm/sm.h"
@@ -77,10 +78,102 @@ public:
     }
 };
 
+class IClkrstSession final : public ServiceFramework<IClkrstSession> {
+public:
+    explicit IClkrstSession(Core::System& system_, DeviceCode deivce_code_)
+        : ServiceFramework{system_, "IClkrstSession"}, deivce_code(deivce_code_) {
+        // clang-format off
+        static const FunctionInfo functions[] = {
+            {0, nullptr, "SetClockEnabled"},
+            {1, nullptr, "SetClockDisabled"},
+            {2, nullptr, "SetResetAsserted"},
+            {3, nullptr, "SetResetDeasserted"},
+            {4, nullptr, "SetPowerEnabled"},
+            {5, nullptr, "SetPowerDisabled"},
+            {6, nullptr, "GetState"},
+            {7, &IClkrstSession::SetClockRate, "SetClockRate"},
+            {8, &IClkrstSession::GetClockRate, "GetClockRate"},
+            {9, nullptr, "SetMinVClockRate"},
+            {10, nullptr, "GetPossibleClockRates"},
+            {11, nullptr, "GetDvfsTable"},
+        };
+        // clang-format on
+        RegisterHandlers(functions);
+    }
+
+private:
+    void SetClockRate(Kernel::HLERequestContext& ctx) {
+        IPC::RequestParser rp{ctx};
+        clock_rate = rp.Pop<u32>();
+        LOG_DEBUG(Service_PCV, "(STUBBED) called, clock_rate={}", clock_rate);
+
+        IPC::ResponseBuilder rb{ctx, 2};
+        rb.Push(ResultSuccess);
+    }
+
+    void GetClockRate(Kernel::HLERequestContext& ctx) {
+        LOG_DEBUG(Service_PCV, "(STUBBED) called");
+
+        IPC::ResponseBuilder rb{ctx, 3};
+        rb.Push(ResultSuccess);
+        rb.Push<u32>(clock_rate);
+    }
+
+    DeviceCode deivce_code;
+    u32 clock_rate{};
+};
+
+class CLKRST final : public ServiceFramework<CLKRST> {
+public:
+    explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
+        // clang-format off
+        static const FunctionInfo functions[] = {
+            {0, &CLKRST::OpenSession, "OpenSession"},
+            {1, nullptr, "GetTemperatureThresholds"},
+            {2, nullptr, "SetTemperature"},
+            {3, nullptr, "GetModuleStateTable"},
+            {4, nullptr, "GetModuleStateTableEvent"},
+            {5, nullptr, "GetModuleStateTableMaxCount"},
+        };
+        // clang-format on
+
+        RegisterHandlers(functions);
+    }
+
+private:
+    void OpenSession(Kernel::HLERequestContext& ctx) {
+        IPC::RequestParser rp{ctx};
+        const auto device_code = static_cast<DeviceCode>(rp.Pop<u32>());
+        const auto unkonwn_input = rp.Pop<u32>();
+
+        LOG_DEBUG(Service_PCV, "called, device_code={}, input={}", device_code, unkonwn_input);
+
+        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+        rb.Push(ResultSuccess);
+        rb.PushIpcInterface<IClkrstSession>(system, device_code);
+    }
+};
+
+class CLKRST_A final : public ServiceFramework<CLKRST_A> {
+public:
+    explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {
+        // clang-format off
+        static const FunctionInfo functions[] = {
+            {0, nullptr, "ReleaseControl"},
+        };
+        // clang-format on
+
+        RegisterHandlers(functions);
+    }
+};
+
 void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
     std::make_shared<PCV>(system)->InstallAsService(sm);
     std::make_shared<PCV_ARB>(system)->InstallAsService(sm);
     std::make_shared<PCV_IMM>(system)->InstallAsService(sm);
+    std::make_shared<CLKRST>(system, "clkrst")->InstallAsService(sm);
+    std::make_shared<CLKRST>(system, "clkrst:i")->InstallAsService(sm);
+    std::make_shared<CLKRST_A>(system)->InstallAsService(sm);
 }
 
 } // namespace Service::PCV

+ 91 - 0
src/core/hle/service/pcv/pcv.h

@@ -13,6 +13,97 @@ class ServiceManager;
 
 namespace Service::PCV {
 
+enum class DeviceCode : u32 {
+    Cpu = 0x40000001,
+    Gpu = 0x40000002,
+    I2s1 = 0x40000003,
+    I2s2 = 0x40000004,
+    I2s3 = 0x40000005,
+    Pwm = 0x40000006,
+    I2c1 = 0x02000001,
+    I2c2 = 0x02000002,
+    I2c3 = 0x02000003,
+    I2c4 = 0x02000004,
+    I2c5 = 0x02000005,
+    I2c6 = 0x02000006,
+    Spi1 = 0x07000000,
+    Spi2 = 0x07000001,
+    Spi3 = 0x07000002,
+    Spi4 = 0x07000003,
+    Disp1 = 0x40000011,
+    Disp2 = 0x40000012,
+    Isp = 0x40000013,
+    Vi = 0x40000014,
+    Sdmmc1 = 0x40000015,
+    Sdmmc2 = 0x40000016,
+    Sdmmc3 = 0x40000017,
+    Sdmmc4 = 0x40000018,
+    Owr = 0x40000019,
+    Csite = 0x4000001A,
+    Tsec = 0x4000001B,
+    Mselect = 0x4000001C,
+    Hda2codec2x = 0x4000001D,
+    Actmon = 0x4000001E,
+    I2cSlow = 0x4000001F,
+    Sor1 = 0x40000020,
+    Sata = 0x40000021,
+    Hda = 0x40000022,
+    XusbCoreHostSrc = 0x40000023,
+    XusbFalconSrc = 0x40000024,
+    XusbFsSrc = 0x40000025,
+    XusbCoreDevSrc = 0x40000026,
+    XusbSsSrc = 0x40000027,
+    UartA = 0x03000001,
+    UartB = 0x35000405,
+    UartC = 0x3500040F,
+    UartD = 0x37000001,
+    Host1x = 0x4000002C,
+    Entropy = 0x4000002D,
+    SocTherm = 0x4000002E,
+    Vic = 0x4000002F,
+    Nvenc = 0x40000030,
+    Nvjpg = 0x40000031,
+    Nvdec = 0x40000032,
+    Qspi = 0x40000033,
+    ViI2c = 0x40000034,
+    Tsecb = 0x40000035,
+    Ape = 0x40000036,
+    AudioDsp = 0x40000037,
+    AudioUart = 0x40000038,
+    Emc = 0x40000039,
+    Plle = 0x4000003A,
+    PlleHwSeq = 0x4000003B,
+    Dsi = 0x4000003C,
+    Maud = 0x4000003D,
+    Dpaux1 = 0x4000003E,
+    MipiCal = 0x4000003F,
+    UartFstMipiCal = 0x40000040,
+    Osc = 0x40000041,
+    SysBus = 0x40000042,
+    SorSafe = 0x40000043,
+    XusbSs = 0x40000044,
+    XusbHost = 0x40000045,
+    XusbDevice = 0x40000046,
+    Extperiph1 = 0x40000047,
+    Ahub = 0x40000048,
+    Hda2hdmicodec = 0x40000049,
+    Gpuaux = 0x4000004A,
+    UsbD = 0x4000004B,
+    Usb2 = 0x4000004C,
+    Pcie = 0x4000004D,
+    Afi = 0x4000004E,
+    PciExClk = 0x4000004F,
+    PExUsbPhy = 0x40000050,
+    XUsbPadCtl = 0x40000051,
+    Apbdma = 0x40000052,
+    Usb2TrkClk = 0x40000053,
+    XUsbIoPll = 0x40000054,
+    XUsbIoPllHwSeq = 0x40000055,
+    Cec = 0x40000056,
+    Extperiph2 = 0x40000057,
+    OscClk = 0x40000080
+};
+
 void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
 
 } // namespace Service::PCV