diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/service/pcv/pcv.cpp | 93 | ||||
| -rw-r--r-- | src/core/hle/service/pcv/pcv.h | 91 | 
2 files changed, 184 insertions, 0 deletions
| diff --git a/src/core/hle/service/pcv/pcv.cpp b/src/core/hle/service/pcv/pcv.cpp index 0989474be..f7a497a14 100644 --- a/src/core/hle/service/pcv/pcv.cpp +++ b/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 diff --git a/src/core/hle/service/pcv/pcv.h b/src/core/hle/service/pcv/pcv.h index a42e6f8f6..6b26b6fa7 100644 --- a/src/core/hle/service/pcv/pcv.h +++ b/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 | 
