Merge pull request #4070 from ogniK5377/GetTPCMasks-fix
nvdrv: Fix GetTPCMasks for ioctl3
This commit is contained in:
		| @@ -25,7 +25,7 @@ u32 nvhost_ctrl_gpu::ioctl(Ioctl command, const std::vector<u8>& input, | |||||||
|     case IoctlCommand::IocGetCharacteristicsCommand: |     case IoctlCommand::IocGetCharacteristicsCommand: | ||||||
|         return GetCharacteristics(input, output, output2, version); |         return GetCharacteristics(input, output, output2, version); | ||||||
|     case IoctlCommand::IocGetTPCMasksCommand: |     case IoctlCommand::IocGetTPCMasksCommand: | ||||||
|         return GetTPCMasks(input, output); |         return GetTPCMasks(input, output, output2, version); | ||||||
|     case IoctlCommand::IocGetActiveSlotMaskCommand: |     case IoctlCommand::IocGetActiveSlotMaskCommand: | ||||||
|         return GetActiveSlotMask(input, output); |         return GetActiveSlotMask(input, output); | ||||||
|     case IoctlCommand::IocZcullGetCtxSizeCommand: |     case IoctlCommand::IocZcullGetCtxSizeCommand: | ||||||
| @@ -98,17 +98,22 @@ u32 nvhost_ctrl_gpu::GetCharacteristics(const std::vector<u8>& input, std::vecto | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output) { | u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, | ||||||
|  |                                  std::vector<u8>& output2, IoctlVersion version) { | ||||||
|     IoctlGpuGetTpcMasksArgs params{}; |     IoctlGpuGetTpcMasksArgs params{}; | ||||||
|     std::memcpy(¶ms, input.data(), input.size()); |     std::memcpy(¶ms, input.data(), input.size()); | ||||||
|     LOG_INFO(Service_NVDRV, "called, mask=0x{:X}, mask_buf_addr=0x{:X}", params.mask_buf_size, |     LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); | ||||||
|              params.mask_buf_addr); |     if (params.mask_buffer_size != 0) { | ||||||
|     // TODO(ogniK): Confirm value on hardware |         params.tcp_mask = 3; | ||||||
|     if (params.mask_buf_size) |     } | ||||||
|         params.tpc_mask_size = 4 * 1; // 4 * num_gpc |  | ||||||
|     else |     if (version == IoctlVersion::Version3) { | ||||||
|         params.tpc_mask_size = 0; |         std::memcpy(output.data(), input.data(), output.size()); | ||||||
|     std::memcpy(output.data(), ¶ms, sizeof(params)); |         std::memcpy(output2.data(), ¶ms.tcp_mask, output2.size()); | ||||||
|  |     } else { | ||||||
|  |         std::memcpy(output.data(), ¶ms, output.size()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -92,16 +92,11 @@ private: | |||||||
|                   "IoctlCharacteristics is incorrect size"); |                   "IoctlCharacteristics is incorrect size"); | ||||||
|  |  | ||||||
|     struct IoctlGpuGetTpcMasksArgs { |     struct IoctlGpuGetTpcMasksArgs { | ||||||
|         /// [in]  TPC mask buffer size reserved by userspace. Should be at least |         u32_le mask_buffer_size{}; | ||||||
|         /// sizeof(__u32) * fls(gpc_mask) to receive TPC mask for each GPC. |         INSERT_PADDING_WORDS(1); | ||||||
|         /// [out] full kernel buffer size |         u64_le mask_buffer_address{}; | ||||||
|         u32_le mask_buf_size; |         u32_le tcp_mask{}; | ||||||
|         u32_le reserved; |         INSERT_PADDING_WORDS(1); | ||||||
|  |  | ||||||
|         /// [in]  pointer to TPC mask buffer. It will receive one 32-bit TPC mask per GPC or 0 if |  | ||||||
|         /// GPC is not enabled or not present. This parameter is ignored if mask_buf_size is 0. |  | ||||||
|         u64_le mask_buf_addr; |  | ||||||
|         u64_le tpc_mask_size; // Nintendo add this? |  | ||||||
|     }; |     }; | ||||||
|     static_assert(sizeof(IoctlGpuGetTpcMasksArgs) == 24, |     static_assert(sizeof(IoctlGpuGetTpcMasksArgs) == 24, | ||||||
|                   "IoctlGpuGetTpcMasksArgs is incorrect size"); |                   "IoctlGpuGetTpcMasksArgs is incorrect size"); | ||||||
| @@ -166,7 +161,8 @@ private: | |||||||
|  |  | ||||||
|     u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output, |     u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output, | ||||||
|                            std::vector<u8>& output2, IoctlVersion version); |                            std::vector<u8>& output2, IoctlVersion version); | ||||||
|     u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output); |     u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, std::vector<u8>& output2, | ||||||
|  |                     IoctlVersion version); | ||||||
|     u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); |     u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); | ||||||
|     u32 ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output); |     u32 ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output); | ||||||
|     u32 ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output); |     u32 ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user