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
merge-requests/60/head
David 2018-05-22 14:41:19 +07:00 committed by bunnei
parent 58857b9f46
commit 58d9078742
2 changed files with 20 additions and 1 deletions

@ -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(&params, 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(), &params, 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;
}; };