diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp | 93 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_gpu.h | 32 |
2 files changed, 49 insertions, 76 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index 804157ce3..3abba25de 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "core/hle/service/nvdrv/core/container.h" | 8 | #include "core/hle/service/nvdrv/core/container.h" |
| 9 | #include "core/hle/service/nvdrv/core/nvmap.h" | 9 | #include "core/hle/service/nvdrv/core/nvmap.h" |
| 10 | #include "core/hle/service/nvdrv/core/syncpoint_manager.h" | 10 | #include "core/hle/service/nvdrv/core/syncpoint_manager.h" |
| 11 | #include "core/hle/service/nvdrv/devices/ioctl_serialization.h" | ||
| 11 | #include "core/hle/service/nvdrv/devices/nvhost_gpu.h" | 12 | #include "core/hle/service/nvdrv/devices/nvhost_gpu.h" |
| 12 | #include "core/hle/service/nvdrv/nvdrv.h" | 13 | #include "core/hle/service/nvdrv/nvdrv.h" |
| 13 | #include "core/memory.h" | 14 | #include "core/memory.h" |
| @@ -52,7 +53,7 @@ NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu | |||
| 52 | case 0x0: | 53 | case 0x0: |
| 53 | switch (command.cmd) { | 54 | switch (command.cmd) { |
| 54 | case 0x3: | 55 | case 0x3: |
| 55 | return GetWaitbase(input, output); | 56 | return Wrap1(&nvhost_gpu::GetWaitbase, input, output); |
| 56 | default: | 57 | default: |
| 57 | break; | 58 | break; |
| 58 | } | 59 | } |
| @@ -60,25 +61,25 @@ NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu | |||
| 60 | case 'H': | 61 | case 'H': |
| 61 | switch (command.cmd) { | 62 | switch (command.cmd) { |
| 62 | case 0x1: | 63 | case 0x1: |
| 63 | return SetNVMAPfd(input, output); | 64 | return Wrap1(&nvhost_gpu::SetNVMAPfd, input, output); |
| 64 | case 0x3: | 65 | case 0x3: |
| 65 | return ChannelSetTimeout(input, output); | 66 | return Wrap1(&nvhost_gpu::ChannelSetTimeout, input, output); |
| 66 | case 0x8: | 67 | case 0x8: |
| 67 | return SubmitGPFIFOBase(input, output, false); | 68 | return SubmitGPFIFOBase1(input, output, false); |
| 68 | case 0x9: | 69 | case 0x9: |
| 69 | return AllocateObjectContext(input, output); | 70 | return Wrap1(&nvhost_gpu::AllocateObjectContext, input, output); |
| 70 | case 0xb: | 71 | case 0xb: |
| 71 | return ZCullBind(input, output); | 72 | return Wrap1(&nvhost_gpu::ZCullBind, input, output); |
| 72 | case 0xc: | 73 | case 0xc: |
| 73 | return SetErrorNotifier(input, output); | 74 | return Wrap1(&nvhost_gpu::SetErrorNotifier, input, output); |
| 74 | case 0xd: | 75 | case 0xd: |
| 75 | return SetChannelPriority(input, output); | 76 | return Wrap1(&nvhost_gpu::SetChannelPriority, input, output); |
| 76 | case 0x1a: | 77 | case 0x1a: |
| 77 | return AllocGPFIFOEx2(input, output); | 78 | return Wrap1(&nvhost_gpu::AllocGPFIFOEx2, input, output); |
| 78 | case 0x1b: | 79 | case 0x1b: |
| 79 | return SubmitGPFIFOBase(input, output, true); | 80 | return SubmitGPFIFOBase1(input, output, true); |
| 80 | case 0x1d: | 81 | case 0x1d: |
| 81 | return ChannelSetTimeslice(input, output); | 82 | return Wrap1(&nvhost_gpu::ChannelSetTimeslice, input, output); |
| 82 | default: | 83 | default: |
| 83 | break; | 84 | break; |
| 84 | } | 85 | } |
| @@ -86,9 +87,9 @@ NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu | |||
| 86 | case 'G': | 87 | case 'G': |
| 87 | switch (command.cmd) { | 88 | switch (command.cmd) { |
| 88 | case 0x14: | 89 | case 0x14: |
| 89 | return SetClientData(input, output); | 90 | return Wrap1(&nvhost_gpu::SetClientData, input, output); |
| 90 | case 0x15: | 91 | case 0x15: |
| 91 | return GetClientData(input, output); | 92 | return Wrap1(&nvhost_gpu::GetClientData, input, output); |
| 92 | default: | 93 | default: |
| 93 | break; | 94 | break; |
| 94 | } | 95 | } |
| @@ -104,7 +105,7 @@ NvResult nvhost_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> inpu | |||
| 104 | case 'H': | 105 | case 'H': |
| 105 | switch (command.cmd) { | 106 | switch (command.cmd) { |
| 106 | case 0x1b: | 107 | case 0x1b: |
| 107 | return SubmitGPFIFOBase(input, inline_input, output); | 108 | return SubmitGPFIFOBase2(input, inline_input, output); |
| 108 | } | 109 | } |
| 109 | break; | 110 | break; |
| 110 | } | 111 | } |
| @@ -121,63 +122,45 @@ NvResult nvhost_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> inpu | |||
| 121 | void nvhost_gpu::OnOpen(DeviceFD fd) {} | 122 | void nvhost_gpu::OnOpen(DeviceFD fd) {} |
| 122 | void nvhost_gpu::OnClose(DeviceFD fd) {} | 123 | void nvhost_gpu::OnClose(DeviceFD fd) {} |
| 123 | 124 | ||
| 124 | NvResult nvhost_gpu::SetNVMAPfd(std::span<const u8> input, std::span<u8> output) { | 125 | NvResult nvhost_gpu::SetNVMAPfd(IoctlSetNvmapFD& params) { |
| 125 | IoctlSetNvmapFD params{}; | ||
| 126 | std::memcpy(¶ms, input.data(), input.size()); | ||
| 127 | LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); | 126 | LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); |
| 128 | 127 | ||
| 129 | nvmap_fd = params.nvmap_fd; | 128 | nvmap_fd = params.nvmap_fd; |
| 130 | return NvResult::Success; | 129 | return NvResult::Success; |
| 131 | } | 130 | } |
| 132 | 131 | ||
| 133 | NvResult nvhost_gpu::SetClientData(std::span<const u8> input, std::span<u8> output) { | 132 | NvResult nvhost_gpu::SetClientData(IoctlClientData& params) { |
| 134 | LOG_DEBUG(Service_NVDRV, "called"); | 133 | LOG_DEBUG(Service_NVDRV, "called"); |
| 135 | |||
| 136 | IoctlClientData params{}; | ||
| 137 | std::memcpy(¶ms, input.data(), std::min(sizeof(IoctlClientData), input.size())); | ||
| 138 | user_data = params.data; | 134 | user_data = params.data; |
| 139 | return NvResult::Success; | 135 | return NvResult::Success; |
| 140 | } | 136 | } |
| 141 | 137 | ||
| 142 | NvResult nvhost_gpu::GetClientData(std::span<const u8> input, std::span<u8> output) { | 138 | NvResult nvhost_gpu::GetClientData(IoctlClientData& params) { |
| 143 | LOG_DEBUG(Service_NVDRV, "called"); | 139 | LOG_DEBUG(Service_NVDRV, "called"); |
| 144 | |||
| 145 | IoctlClientData params{}; | ||
| 146 | std::memcpy(¶ms, input.data(), std::min(sizeof(IoctlClientData), input.size())); | ||
| 147 | params.data = user_data; | 140 | params.data = user_data; |
| 148 | std::memcpy(output.data(), ¶ms, std::min(sizeof(IoctlClientData), output.size())); | ||
| 149 | return NvResult::Success; | 141 | return NvResult::Success; |
| 150 | } | 142 | } |
| 151 | 143 | ||
| 152 | NvResult nvhost_gpu::ZCullBind(std::span<const u8> input, std::span<u8> output) { | 144 | NvResult nvhost_gpu::ZCullBind(IoctlZCullBind& params) { |
| 153 | std::memcpy(&zcull_params, input.data(), input.size()); | 145 | zcull_params = params; |
| 154 | LOG_DEBUG(Service_NVDRV, "called, gpu_va={:X}, mode={:X}", zcull_params.gpu_va, | 146 | LOG_DEBUG(Service_NVDRV, "called, gpu_va={:X}, mode={:X}", zcull_params.gpu_va, |
| 155 | zcull_params.mode); | 147 | zcull_params.mode); |
| 156 | |||
| 157 | std::memcpy(output.data(), &zcull_params, output.size()); | ||
| 158 | return NvResult::Success; | 148 | return NvResult::Success; |
| 159 | } | 149 | } |
| 160 | 150 | ||
| 161 | NvResult nvhost_gpu::SetErrorNotifier(std::span<const u8> input, std::span<u8> output) { | 151 | NvResult nvhost_gpu::SetErrorNotifier(IoctlSetErrorNotifier& params) { |
| 162 | IoctlSetErrorNotifier params{}; | ||
| 163 | std::memcpy(¶ms, input.data(), input.size()); | ||
| 164 | LOG_WARNING(Service_NVDRV, "(STUBBED) called, offset={:X}, size={:X}, mem={:X}", params.offset, | 152 | LOG_WARNING(Service_NVDRV, "(STUBBED) called, offset={:X}, size={:X}, mem={:X}", params.offset, |
| 165 | params.size, params.mem); | 153 | params.size, params.mem); |
| 166 | |||
| 167 | std::memcpy(output.data(), ¶ms, output.size()); | ||
| 168 | return NvResult::Success; | 154 | return NvResult::Success; |
| 169 | } | 155 | } |
| 170 | 156 | ||
| 171 | NvResult nvhost_gpu::SetChannelPriority(std::span<const u8> input, std::span<u8> output) { | 157 | NvResult nvhost_gpu::SetChannelPriority(IoctlChannelSetPriority& params) { |
| 172 | std::memcpy(&channel_priority, input.data(), input.size()); | 158 | channel_priority = params.priority; |
| 173 | LOG_DEBUG(Service_NVDRV, "(STUBBED) called, priority={:X}", channel_priority); | 159 | LOG_DEBUG(Service_NVDRV, "(STUBBED) called, priority={:X}", channel_priority); |
| 174 | |||
| 175 | return NvResult::Success; | 160 | return NvResult::Success; |
| 176 | } | 161 | } |
| 177 | 162 | ||
| 178 | NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::span<u8> output) { | 163 | NvResult nvhost_gpu::AllocGPFIFOEx2(IoctlAllocGpfifoEx2& params) { |
| 179 | IoctlAllocGpfifoEx2 params{}; | ||
| 180 | std::memcpy(¶ms, input.data(), input.size()); | ||
| 181 | LOG_WARNING(Service_NVDRV, | 164 | LOG_WARNING(Service_NVDRV, |
| 182 | "(STUBBED) called, num_entries={:X}, flags={:X}, unk0={:X}, " | 165 | "(STUBBED) called, num_entries={:X}, flags={:X}, unk0={:X}, " |
| 183 | "unk1={:X}, unk2={:X}, unk3={:X}", | 166 | "unk1={:X}, unk2={:X}, unk3={:X}", |
| @@ -193,18 +176,14 @@ NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::span<u8> out | |||
| 193 | 176 | ||
| 194 | params.fence_out = syncpoint_manager.GetSyncpointFence(channel_syncpoint); | 177 | params.fence_out = syncpoint_manager.GetSyncpointFence(channel_syncpoint); |
| 195 | 178 | ||
| 196 | std::memcpy(output.data(), ¶ms, output.size()); | ||
| 197 | return NvResult::Success; | 179 | return NvResult::Success; |
| 198 | } | 180 | } |
| 199 | 181 | ||
| 200 | NvResult nvhost_gpu::AllocateObjectContext(std::span<const u8> input, std::span<u8> output) { | 182 | NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) { |
| 201 | IoctlAllocObjCtx params{}; | ||
| 202 | std::memcpy(¶ms, input.data(), input.size()); | ||
| 203 | LOG_WARNING(Service_NVDRV, "(STUBBED) called, class_num={:X}, flags={:X}", params.class_num, | 183 | LOG_WARNING(Service_NVDRV, "(STUBBED) called, class_num={:X}, flags={:X}", params.class_num, |
| 204 | params.flags); | 184 | params.flags); |
| 205 | 185 | ||
| 206 | params.obj_id = 0x0; | 186 | params.obj_id = 0x0; |
| 207 | std::memcpy(output.data(), ¶ms, output.size()); | ||
| 208 | return NvResult::Success; | 187 | return NvResult::Success; |
| 209 | } | 188 | } |
| 210 | 189 | ||
| @@ -290,12 +269,11 @@ NvResult nvhost_gpu::SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::span<u8> o | |||
| 290 | 269 | ||
| 291 | flags.raw = 0; | 270 | flags.raw = 0; |
| 292 | 271 | ||
| 293 | std::memcpy(output.data(), ¶ms, sizeof(IoctlSubmitGpfifo)); | ||
| 294 | return NvResult::Success; | 272 | return NvResult::Success; |
| 295 | } | 273 | } |
| 296 | 274 | ||
| 297 | NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<u8> output, | 275 | NvResult nvhost_gpu::SubmitGPFIFOBase1(std::span<const u8> input, std::span<u8> output, |
| 298 | bool kickoff) { | 276 | bool kickoff) { |
| 299 | if (input.size() < sizeof(IoctlSubmitGpfifo)) { | 277 | if (input.size() < sizeof(IoctlSubmitGpfifo)) { |
| 300 | UNIMPLEMENTED(); | 278 | UNIMPLEMENTED(); |
| 301 | return NvResult::InvalidSize; | 279 | return NvResult::InvalidSize; |
| @@ -315,8 +293,8 @@ NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<u8> o | |||
| 315 | return SubmitGPFIFOImpl(params, output, std::move(entries)); | 293 | return SubmitGPFIFOImpl(params, output, std::move(entries)); |
| 316 | } | 294 | } |
| 317 | 295 | ||
| 318 | NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<const u8> input_inline, | 296 | NvResult nvhost_gpu::SubmitGPFIFOBase2(std::span<const u8> input, std::span<const u8> input_inline, |
| 319 | std::span<u8> output) { | 297 | std::span<u8> output) { |
| 320 | if (input.size() < sizeof(IoctlSubmitGpfifo)) { | 298 | if (input.size() < sizeof(IoctlSubmitGpfifo)) { |
| 321 | UNIMPLEMENTED(); | 299 | UNIMPLEMENTED(); |
| 322 | return NvResult::InvalidSize; | 300 | return NvResult::InvalidSize; |
| @@ -328,27 +306,20 @@ NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<const | |||
| 328 | return SubmitGPFIFOImpl(params, output, std::move(entries)); | 306 | return SubmitGPFIFOImpl(params, output, std::move(entries)); |
| 329 | } | 307 | } |
| 330 | 308 | ||
| 331 | NvResult nvhost_gpu::GetWaitbase(std::span<const u8> input, std::span<u8> output) { | 309 | NvResult nvhost_gpu::GetWaitbase(IoctlGetWaitbase& params) { |
| 332 | IoctlGetWaitbase params{}; | ||
| 333 | std::memcpy(¶ms, input.data(), sizeof(IoctlGetWaitbase)); | ||
| 334 | LOG_INFO(Service_NVDRV, "called, unknown=0x{:X}", params.unknown); | 310 | LOG_INFO(Service_NVDRV, "called, unknown=0x{:X}", params.unknown); |
| 335 | 311 | ||
| 336 | params.value = 0; // Seems to be hard coded at 0 | 312 | params.value = 0; // Seems to be hard coded at 0 |
| 337 | std::memcpy(output.data(), ¶ms, output.size()); | ||
| 338 | return NvResult::Success; | 313 | return NvResult::Success; |
| 339 | } | 314 | } |
| 340 | 315 | ||
| 341 | NvResult nvhost_gpu::ChannelSetTimeout(std::span<const u8> input, std::span<u8> output) { | 316 | NvResult nvhost_gpu::ChannelSetTimeout(IoctlChannelSetTimeout& params) { |
| 342 | IoctlChannelSetTimeout params{}; | ||
| 343 | std::memcpy(¶ms, input.data(), sizeof(IoctlChannelSetTimeout)); | ||
| 344 | LOG_INFO(Service_NVDRV, "called, timeout=0x{:X}", params.timeout); | 317 | LOG_INFO(Service_NVDRV, "called, timeout=0x{:X}", params.timeout); |
| 345 | 318 | ||
| 346 | return NvResult::Success; | 319 | return NvResult::Success; |
| 347 | } | 320 | } |
| 348 | 321 | ||
| 349 | NvResult nvhost_gpu::ChannelSetTimeslice(std::span<const u8> input, std::span<u8> output) { | 322 | NvResult nvhost_gpu::ChannelSetTimeslice(IoctlSetTimeslice& params) { |
| 350 | IoctlSetTimeslice params{}; | ||
| 351 | std::memcpy(¶ms, input.data(), sizeof(IoctlSetTimeslice)); | ||
| 352 | LOG_INFO(Service_NVDRV, "called, timeslice=0x{:X}", params.timeslice); | 323 | LOG_INFO(Service_NVDRV, "called, timeslice=0x{:X}", params.timeslice); |
| 353 | 324 | ||
| 354 | channel_timeslice = params.timeslice; | 325 | channel_timeslice = params.timeslice; |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index 529c20526..fba4232c4 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h | |||
| @@ -186,23 +186,25 @@ private: | |||
| 186 | u32_le channel_priority{}; | 186 | u32_le channel_priority{}; |
| 187 | u32_le channel_timeslice{}; | 187 | u32_le channel_timeslice{}; |
| 188 | 188 | ||
| 189 | NvResult SetNVMAPfd(std::span<const u8> input, std::span<u8> output); | 189 | NvResult SetNVMAPfd(IoctlSetNvmapFD& params); |
| 190 | NvResult SetClientData(std::span<const u8> input, std::span<u8> output); | 190 | NvResult SetClientData(IoctlClientData& params); |
| 191 | NvResult GetClientData(std::span<const u8> input, std::span<u8> output); | 191 | NvResult GetClientData(IoctlClientData& params); |
| 192 | NvResult ZCullBind(std::span<const u8> input, std::span<u8> output); | 192 | NvResult ZCullBind(IoctlZCullBind& params); |
| 193 | NvResult SetErrorNotifier(std::span<const u8> input, std::span<u8> output); | 193 | NvResult SetErrorNotifier(IoctlSetErrorNotifier& params); |
| 194 | NvResult SetChannelPriority(std::span<const u8> input, std::span<u8> output); | 194 | NvResult SetChannelPriority(IoctlChannelSetPriority& params); |
| 195 | NvResult AllocGPFIFOEx2(std::span<const u8> input, std::span<u8> output); | 195 | NvResult AllocGPFIFOEx2(IoctlAllocGpfifoEx2& params); |
| 196 | NvResult AllocateObjectContext(std::span<const u8> input, std::span<u8> output); | 196 | NvResult AllocateObjectContext(IoctlAllocObjCtx& params); |
| 197 | |||
| 197 | NvResult SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::span<u8> output, | 198 | NvResult SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::span<u8> output, |
| 198 | Tegra::CommandList&& entries); | 199 | Tegra::CommandList&& entries); |
| 199 | NvResult SubmitGPFIFOBase(std::span<const u8> input, std::span<u8> output, | 200 | NvResult SubmitGPFIFOBase1(std::span<const u8> input, std::span<u8> output, |
| 200 | bool kickoff = false); | 201 | bool kickoff = false); |
| 201 | NvResult SubmitGPFIFOBase(std::span<const u8> input, std::span<const u8> input_inline, | 202 | NvResult SubmitGPFIFOBase2(std::span<const u8> input, std::span<const u8> input_inline, |
| 202 | std::span<u8> output); | 203 | std::span<u8> output); |
| 203 | NvResult GetWaitbase(std::span<const u8> input, std::span<u8> output); | 204 | |
| 204 | NvResult ChannelSetTimeout(std::span<const u8> input, std::span<u8> output); | 205 | NvResult GetWaitbase(IoctlGetWaitbase& params); |
| 205 | NvResult ChannelSetTimeslice(std::span<const u8> input, std::span<u8> output); | 206 | NvResult ChannelSetTimeout(IoctlChannelSetTimeout& params); |
| 207 | NvResult ChannelSetTimeslice(IoctlSetTimeslice& params); | ||
| 206 | 208 | ||
| 207 | EventInterface& events_interface; | 209 | EventInterface& events_interface; |
| 208 | NvCore::Container& core; | 210 | NvCore::Container& core; |