mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #8794 from vonchenplus/clkrst_service
core: implement clkrst service
This commit is contained in:
		@@ -3,6 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "core/hle/ipc_helpers.h"
 | 
				
			||||||
#include "core/hle/service/pcv/pcv.h"
 | 
					#include "core/hle/service/pcv/pcv.h"
 | 
				
			||||||
#include "core/hle/service/service.h"
 | 
					#include "core/hle/service/service.h"
 | 
				
			||||||
#include "core/hle/service/sm/sm.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) {
 | 
					void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
 | 
				
			||||||
    std::make_shared<PCV>(system)->InstallAsService(sm);
 | 
					    std::make_shared<PCV>(system)->InstallAsService(sm);
 | 
				
			||||||
    std::make_shared<PCV_ARB>(system)->InstallAsService(sm);
 | 
					    std::make_shared<PCV_ARB>(system)->InstallAsService(sm);
 | 
				
			||||||
    std::make_shared<PCV_IMM>(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
 | 
					} // namespace Service::PCV
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,97 @@ class ServiceManager;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace Service::PCV {
 | 
					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);
 | 
					void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace Service::PCV
 | 
					} // namespace Service::PCV
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user