diff --git a/src/core/devices/gc_device.cpp b/src/core/devices/gc_device.cpp index 94a4a585a..73d486ff8 100644 --- a/src/core/devices/gc_device.cpp +++ b/src/core/devices/gc_device.cpp @@ -22,13 +22,40 @@ s32* submits_addr = 0; s32 GcDevice::ioctl(u64 cmd, Common::VaCtx* args) { auto command = GcCommands(cmd); switch(command) { + case GcCommands::FlushGarlic: { + LOG_ERROR(Lib_GnmDriver, "ioctl FlushGarlic"); + break; + } + case GcCommands::SubmitDone: { + ASSERT(true); + LOG_ERROR(Lib_GnmDriver, "ioctl SubmitDone"); + break; + } + case GcCommands::WaitIdle: { + ASSERT(true); + LOG_ERROR(Lib_GnmDriver, "ioctl WaitIdle"); + break; + } + case GcCommands::WaitFree: { + ASSERT(true); + LOG_ERROR(Lib_GnmDriver, "ioctl WaitFree"); + break; + } case GcCommands::GetNumTcaUnits: { auto data = vaArgPtr(&args->va_list); *data = 0; break; } - case GcCommands::AreSubmitsAllowed: { - LOG_INFO(Lib_GnmDriver, "ioctl AreSubmitsAllowed"); + case GcCommands::SwitchBuffer: { + ASSERT(true); + LOG_ERROR(Lib_GnmDriver, "ioctl SwitchBuffer"); + break; + } + case GcCommands::DebugHardwareStatus: { + break; + } + case GcCommands::InitializeSubmits: { + LOG_INFO(Lib_GnmDriver, "ioctl InitializeSubmits"); if (submits_addr == nullptr) { auto* memory = Core::Memory::Instance(); s32* out_addr; @@ -48,6 +75,10 @@ s32 GcDevice::ioctl(u64 cmd, Common::VaCtx* args) { *submits_addr = 0; break; } + case GcCommands::UnmapComputeQueue: { + LOG_ERROR(Lib_GnmDriver, "ioctl UnmapComputeQueue"); + break; + } case GcCommands::SetGsRingSizes: { auto data = vaArgPtr(&args->va_list); LOG_ERROR(Lib_GnmDriver, "unhandled ioctl SetGsRingSizes, esgs size = {:#x}, gsvs size = {:#x}", data->esgs_ring_size, data->gsvs_ring_size); @@ -69,6 +100,14 @@ s32 GcDevice::ioctl(u64 cmd, Common::VaCtx* args) { data[3] = 0; break; } + case GcCommands::DingDong: { + ASSERT(true); + LOG_ERROR(Lib_GnmDriver, "ioctl DingDong"); + break; + } + case GcCommands::RequiresNeoCompat: { + return POSIX_ENODEV; + } case GcCommands::SubmitEop: { ASSERT(true); LOG_ERROR(Lib_GnmDriver, "ioctl SubmitEop"); @@ -82,7 +121,17 @@ s32 GcDevice::ioctl(u64 cmd, Common::VaCtx* args) { auto data = vaArgPtr(&args->va_list); auto pipe_id = data->pipe_lo - 1; auto ring_size = pow(2, data->ring_size_dw); + data->pipe_priority = 0; LOG_ERROR(Lib_GnmDriver, "ioctl MapComputeQueue, pipe_id = {}", pipe_id); + Libraries::GnmDriver::sceGnmMapComputeQueue(pipe_id, data->queue_id, data->ring_base_addr, ring_size, data->read_ptr_addr); + break; + } + case GcCommands::MapComputeQueueWithPriority: { + ASSERT(true); + auto data = vaArgPtr(&args->va_list); + auto pipe_id = data->pipe_lo - 1; + auto ring_size = pow(2, data->ring_size_dw); + LOG_ERROR(Lib_GnmDriver, "ioctl MapComputeQueueWithPriority, pipe_id = {}", pipe_id); Libraries::GnmDriver::sceGnmMapComputeQueueWithPriority(pipe_id, data->queue_id, data->ring_base_addr, ring_size, data->read_ptr_addr, data->pipe_priority); break; } diff --git a/src/core/devices/gc_device.h b/src/core/devices/gc_device.h index 9e7e01490..4d4dd6a00 100644 --- a/src/core/devices/gc_device.h +++ b/src/core/devices/gc_device.h @@ -30,13 +30,23 @@ public: s64 pwrite(const void* buf, size_t nbytes, u64 offset) override; private: enum class GcCommands : u64 { + FlushGarlic = 0xc0048114, + SubmitDone = 0xc0048116, + WaitIdle = 0xc0048117, + WaitFree = 0xc004811d, GetNumTcaUnits = 0xc004811f, - AreSubmitsAllowed = 0xc008811b, + SwitchBuffer = 0xc0088101, + DebugHardwareStatus = 0xc0088111, + InitializeSubmits = 0xc008811b, + UnmapComputeQueue = 0xc00c810e, SetGsRingSizes = 0xc00c8110, Submit = 0xc0108102, GetCuMask = 0xc010810b, + DingDong = 0xc010811c, + RequiresNeoCompat = 0xc0108120, SubmitEop = 0xc020810c, MapComputeQueue = 0xc030810d, + MapComputeQueueWithPriority = 0xc030811a, SetWaveLimitMultipliers = 0xc030811e, MipStatsReport = 0xc0848119, };