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); | ||||
|     case IoctlCommand::IocAllocObjCtxCommand: | ||||
|         return AllocateObjectContext(input, output); | ||||
|     case IoctlCommand::IocChannelGetWaitbaseCommand: | ||||
|         return GetWaitbase(input, output); | ||||
|     } | ||||
| 
 | ||||
|     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; | ||||
| } | ||||
| 
 | ||||
| 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
 | ||||
|  | ||||
| @ -33,6 +33,7 @@ private: | ||||
|         IocChannelSetPriorityCommand = 0x4004480D, | ||||
|         IocAllocGPFIFOEx2Command = 0xC020481A, | ||||
|         IocAllocObjCtxCommand = 0xC0104809, | ||||
|         IocChannelGetWaitbaseCommand = 0xC0080003, | ||||
|     }; | ||||
| 
 | ||||
|     enum class CtxObjects : u32_le { | ||||
| @ -117,7 +118,13 @@ private: | ||||
|         IoctlFence fence_out; // returned new fence object for others to wait on
 | ||||
|     }; | ||||
|     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{}; | ||||
|     u64_le user_data{}; | ||||
| @ -133,6 +140,7 @@ private: | ||||
|     u32 AllocGPFIFOEx2(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 GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output); | ||||
| 
 | ||||
|     std::shared_ptr<nvmap> nvmap_dev; | ||||
| }; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 David
						David