| 
									
										
										
										
											2018-02-07 21:54:35 -05:00
										 |  |  |  | // Copyright 2018 yuzu emulator team
 | 
					
						
							|  |  |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							|  |  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #pragma once
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #include <array>
 | 
					
						
							|  |  |  |  | #include <memory>
 | 
					
						
							|  |  |  |  | #include "common/common_types.h"
 | 
					
						
							|  |  |  |  | #include "core/memory.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 23:44:12 -05:00
										 |  |  |  | namespace Tegra { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /// Virtual addresses in the GPU's memory map are 64 bit.
 | 
					
						
							|  |  |  |  | using GPUVAddr = u64; | 
					
						
							| 
									
										
										
										
											2018-02-07 21:54:35 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | class MemoryManager final { | 
					
						
							|  |  |  |  | public: | 
					
						
							|  |  |  |  |     MemoryManager() = default; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 11:16:21 -04:00
										 |  |  |  |     GPUVAddr AllocateSpace(u64 size, u64 align); | 
					
						
							|  |  |  |  |     GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align); | 
					
						
							|  |  |  |  |     GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size); | 
					
						
							|  |  |  |  |     GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size); | 
					
						
							|  |  |  |  |     VAddr GpuToCpuAddress(GPUVAddr gpu_addr); | 
					
						
							| 
									
										
										
										
											2018-02-07 21:54:35 -05:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-23 10:57:12 -05:00
										 |  |  |  |     static constexpr u64 PAGE_BITS = 16; | 
					
						
							|  |  |  |  |     static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS; | 
					
						
							|  |  |  |  |     static constexpr u64 PAGE_MASK = PAGE_SIZE - 1; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 21:54:35 -05:00
										 |  |  |  | private: | 
					
						
							| 
									
										
										
										
											2018-04-21 11:16:21 -04:00
										 |  |  |  |     boost::optional<GPUVAddr> FindFreeBlock(u64 size, u64 align = 1); | 
					
						
							|  |  |  |  |     bool IsPageMapped(GPUVAddr gpu_addr); | 
					
						
							|  |  |  |  |     VAddr& PageSlot(GPUVAddr gpu_addr); | 
					
						
							| 
									
										
										
										
											2018-02-07 21:54:35 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     enum class PageStatus : u64 { | 
					
						
							|  |  |  |  |         Unmapped = 0xFFFFFFFFFFFFFFFFULL, | 
					
						
							|  |  |  |  |         Allocated = 0xFFFFFFFFFFFFFFFEULL, | 
					
						
							|  |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     static constexpr u64 MAX_ADDRESS{0x10000000000ULL}; | 
					
						
							| 
									
										
										
										
											2018-04-23 10:57:12 -05:00
										 |  |  |  |     static constexpr u64 PAGE_TABLE_BITS{10}; | 
					
						
							| 
									
										
										
										
											2018-02-07 21:54:35 -05:00
										 |  |  |  |     static constexpr u64 PAGE_TABLE_SIZE{1 << PAGE_TABLE_BITS}; | 
					
						
							|  |  |  |  |     static constexpr u64 PAGE_TABLE_MASK{PAGE_TABLE_SIZE - 1}; | 
					
						
							|  |  |  |  |     static constexpr u64 PAGE_BLOCK_BITS{14}; | 
					
						
							|  |  |  |  |     static constexpr u64 PAGE_BLOCK_SIZE{1 << PAGE_BLOCK_BITS}; | 
					
						
							|  |  |  |  |     static constexpr u64 PAGE_BLOCK_MASK{PAGE_BLOCK_SIZE - 1}; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>; | 
					
						
							|  |  |  |  |     std::array<std::unique_ptr<PageBlock>, PAGE_TABLE_SIZE> page_table{}; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 23:44:12 -05:00
										 |  |  |  | } // namespace Tegra
 |