Implement SubmitGPFIFOEx
This commit is contained in:
@@ -46,13 +46,15 @@ u32 nvhost_gpu::ioctl(Ioctl command, const std::vector<u8>& input, const std::ve
|
|||||||
return ChannelSetTimeout(input, output);
|
return ChannelSetTimeout(input, output);
|
||||||
case IoctlCommand::IocChannelSetTimeslice:
|
case IoctlCommand::IocChannelSetTimeslice:
|
||||||
return ChannelSetTimeslice(input, output);
|
return ChannelSetTimeslice(input, output);
|
||||||
|
case IoctlCommand::IocSubmitGPFIFOExCommand:
|
||||||
|
return SubmitGPFIFO(input, output, input2, version);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command.group == NVGPU_IOCTL_MAGIC) {
|
if (command.group == NVGPU_IOCTL_MAGIC) {
|
||||||
if (command.cmd == NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO) {
|
if (command.cmd == NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO) {
|
||||||
return SubmitGPFIFO(input, output);
|
return SubmitGPFIFO(input, output, input2, version);
|
||||||
}
|
}
|
||||||
if (command.cmd == NVGPU_IOCTL_CHANNEL_KICKOFF_PB) {
|
if (command.cmd == NVGPU_IOCTL_CHANNEL_KICKOFF_PB) {
|
||||||
return KickoffPB(input, output, input2, version);
|
return KickoffPB(input, output, input2, version);
|
||||||
@@ -145,23 +147,34 @@ u32 nvhost_gpu::AllocateObjectContext(const std::vector<u8>& input, std::vector<
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 nvhost_gpu::SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& output) {
|
u32 nvhost_gpu::SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& output,
|
||||||
|
const std::vector<u8>& input2, IoctlVersion version) {
|
||||||
if (input.size() < sizeof(IoctlSubmitGpfifo)) {
|
if (input.size() < sizeof(IoctlSubmitGpfifo)) {
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
}
|
}
|
||||||
IoctlSubmitGpfifo params{};
|
IoctlSubmitGpfifo params{};
|
||||||
|
|
||||||
std::memcpy(¶ms, input.data(), sizeof(IoctlSubmitGpfifo));
|
std::memcpy(¶ms, input.data(), sizeof(IoctlSubmitGpfifo));
|
||||||
LOG_TRACE(Service_NVDRV, "called, gpfifo={:X}, num_entries={:X}, flags={:X}", params.address,
|
LOG_TRACE(Service_NVDRV, "called, gpfifo={:X}, num_entries={:X}, flags={:X}", params.address,
|
||||||
params.num_entries, params.flags.raw);
|
params.num_entries, params.flags.raw);
|
||||||
|
|
||||||
ASSERT_MSG(input.size() == sizeof(IoctlSubmitGpfifo) +
|
|
||||||
params.num_entries * sizeof(Tegra::CommandListHeader),
|
|
||||||
"Incorrect input size");
|
|
||||||
|
|
||||||
Tegra::CommandList entries(params.num_entries);
|
Tegra::CommandList entries(params.num_entries);
|
||||||
std::memcpy(entries.data(), &input[sizeof(IoctlSubmitGpfifo)],
|
|
||||||
params.num_entries * sizeof(Tegra::CommandListHeader));
|
|
||||||
|
|
||||||
|
if (version == IoctlVersion::Version2) {
|
||||||
|
ASSERT_MSG((input.size() + input2.size()) ==
|
||||||
|
sizeof(IoctlSubmitGpfifo) +
|
||||||
|
params.num_entries * sizeof(Tegra::CommandListHeader),
|
||||||
|
"Incorrect input size");
|
||||||
|
std::memcpy(entries.data(), input2,
|
||||||
|
params.num_entries * sizeof(Tegra::CommandListHeader));
|
||||||
|
} else {
|
||||||
|
ASSERT_MSG(input.size() == sizeof(IoctlSubmitGpfifo) +
|
||||||
|
params.num_entries * sizeof(Tegra::CommandListHeader),
|
||||||
|
"Incorrect input size");
|
||||||
|
std::memcpy(entries.data(), &input[sizeof(IoctlSubmitGpfifo)],
|
||||||
|
params.num_entries * sizeof(Tegra::CommandListHeader));
|
||||||
|
}
|
||||||
|
|
||||||
UNIMPLEMENTED_IF(params.flags.add_wait.Value() != 0);
|
UNIMPLEMENTED_IF(params.flags.add_wait.Value() != 0);
|
||||||
UNIMPLEMENTED_IF(params.flags.add_increment.Value() != 0);
|
UNIMPLEMENTED_IF(params.flags.add_increment.Value() != 0);
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ private:
|
|||||||
IocChannelGetWaitbaseCommand = 0xC0080003,
|
IocChannelGetWaitbaseCommand = 0xC0080003,
|
||||||
IocChannelSetTimeoutCommand = 0x40044803,
|
IocChannelSetTimeoutCommand = 0x40044803,
|
||||||
IocChannelSetTimeslice = 0xC004481D,
|
IocChannelSetTimeslice = 0xC004481D,
|
||||||
|
IocSubmitGPFIFOExCommand = 0xC018481B,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class CtxObjects : u32_le {
|
enum class CtxObjects : u32_le {
|
||||||
@@ -190,7 +191,8 @@ private:
|
|||||||
u32 SetChannelPriority(const std::vector<u8>& input, std::vector<u8>& output);
|
u32 SetChannelPriority(const std::vector<u8>& input, std::vector<u8>& output);
|
||||||
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,
|
||||||
|
const std::vector<u8>& input2, IoctlVersion version);
|
||||||
u32 KickoffPB(const std::vector<u8>& input, std::vector<u8>& output,
|
u32 KickoffPB(const std::vector<u8>& input, std::vector<u8>& output,
|
||||||
const std::vector<u8>& input2, IoctlVersion version);
|
const std::vector<u8>& input2, IoctlVersion version);
|
||||||
u32 GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output);
|
u32 GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output);
|
||||||
|
|||||||
Reference in New Issue
Block a user