Define remaining ioctls

This commit is contained in:
Stephen Miller 2025-04-21 23:27:16 -05:00
parent 23883bd42b
commit 4abc2dea49
2 changed files with 62 additions and 3 deletions

View file

@ -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<s32*>(&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<SetGsRingSizesArgs>(&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<MapComputeQueueArgs>(&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<MapComputeQueueArgs>(&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;
}

View file

@ -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,
};