Implemented NVHOST_IOCTL_CHANNEL_GET_WAITBASE (#440)
* Implemented NVHOST_IOCTL_CHANNEL_GET_WAITBASE struct + 4 seems to be hard coded at 0 and struct + 0 seems to be ignored? * IocGetWaitbase -> IocChannelGetWaitbaseCommand * Added super late fixes
This commit is contained in:
parent
58857b9f46
commit
58d9078742
|
@ -32,6 +32,8 @@ u32 nvhost_gpu::ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u
|
||||||
return AllocGPFIFOEx2(input, output);
|
return AllocGPFIFOEx2(input, output);
|
||||||
case IoctlCommand::IocAllocObjCtxCommand:
|
case IoctlCommand::IocAllocObjCtxCommand:
|
||||||
return AllocateObjectContext(input, output);
|
return AllocateObjectContext(input, output);
|
||||||
|
case IoctlCommand::IocChannelGetWaitbaseCommand:
|
||||||
|
return GetWaitbase(input, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command.group == NVGPU_IOCTL_MAGIC) {
|
if (command.group == NVGPU_IOCTL_MAGIC) {
|
||||||
|
@ -138,4 +140,13 @@ u32 nvhost_gpu::SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& outp
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 nvhost_gpu::GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output) {
|
||||||
|
IoctlGetWaitbase params{};
|
||||||
|
std::memcpy(¶ms, input.data(), sizeof(IoctlGetWaitbase));
|
||||||
|
NGLOG_INFO(Service_NVDRV, "called, unknown=0x{:X}", params.unknown);
|
||||||
|
params.value = 0; // Seems to be hard coded at 0
|
||||||
|
std::memcpy(output.data(), ¶ms, output.size());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::Nvidia::Devices
|
} // namespace Service::Nvidia::Devices
|
||||||
|
|
|
@ -33,6 +33,7 @@ private:
|
||||||
IocChannelSetPriorityCommand = 0x4004480D,
|
IocChannelSetPriorityCommand = 0x4004480D,
|
||||||
IocAllocGPFIFOEx2Command = 0xC020481A,
|
IocAllocGPFIFOEx2Command = 0xC020481A,
|
||||||
IocAllocObjCtxCommand = 0xC0104809,
|
IocAllocObjCtxCommand = 0xC0104809,
|
||||||
|
IocChannelGetWaitbaseCommand = 0xC0080003,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class CtxObjects : u32_le {
|
enum class CtxObjects : u32_le {
|
||||||
|
@ -117,7 +118,13 @@ private:
|
||||||
IoctlFence fence_out; // returned new fence object for others to wait on
|
IoctlFence fence_out; // returned new fence object for others to wait on
|
||||||
};
|
};
|
||||||
static_assert(sizeof(IoctlSubmitGpfifo) == 16 + sizeof(IoctlFence),
|
static_assert(sizeof(IoctlSubmitGpfifo) == 16 + sizeof(IoctlFence),
|
||||||
"submit_gpfifo is incorrect size");
|
"IoctlSubmitGpfifo is incorrect size");
|
||||||
|
|
||||||
|
struct IoctlGetWaitbase {
|
||||||
|
u32 unknown; // seems to be ignored? Nintendo added this
|
||||||
|
u32 value;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(IoctlGetWaitbase) == 8, "IoctlGetWaitbase is incorrect size");
|
||||||
|
|
||||||
u32_le nvmap_fd{};
|
u32_le nvmap_fd{};
|
||||||
u64_le user_data{};
|
u64_le user_data{};
|
||||||
|
@ -133,6 +140,7 @@ private:
|
||||||
u32 AllocGPFIFOEx2(const std::vector<u8>& input, std::vector<u8>& output);
|
u32 AllocGPFIFOEx2(const std::vector<u8>& input, std::vector<u8>& output);
|
||||||
u32 AllocateObjectContext(const std::vector<u8>& input, std::vector<u8>& output);
|
u32 AllocateObjectContext(const std::vector<u8>& input, std::vector<u8>& output);
|
||||||
u32 SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& output);
|
u32 SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& output);
|
||||||
|
u32 GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output);
|
||||||
|
|
||||||
std::shared_ptr<nvmap> nvmap_dev;
|
std::shared_ptr<nvmap> nvmap_dev;
|
||||||
};
|
};
|
||||||
|
|
Reference in New Issue