mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	drm/amdgpu: introduce a stolen reserved buffer to protect specific buffer region (v2)
Some ASICs such as Yellow Carp needs to reserve a region of video memory to avoid access from driver. So this patch is to introduce a stolen reserved buffer to protect specific buffer region. v2: free this buffer in amdgpu_ttm_fini. Signed-off-by: Huang Rui <ray.huang@amd.com> Acked-and-Tested-by: Aaron Liu <aaron.liu@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									cba00ce82d
								
							
						
					
					
						commit
						e15a5fb9b6
					
				
					 5 changed files with 32 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -785,3 +785,19 @@ uint64_t amdgpu_gmc_vram_cpu_pa(struct amdgpu_device *adev, struct amdgpu_bo *bo
 | 
			
		|||
{
 | 
			
		||||
	return amdgpu_bo_gpu_offset(bo) - adev->gmc.vram_start + adev->gmc.aper_base;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void amdgpu_gmc_get_reserved_allocation(struct amdgpu_device *adev)
 | 
			
		||||
{
 | 
			
		||||
	/* Some ASICs need to reserve a region of video memory to avoid access
 | 
			
		||||
	 * from driver */
 | 
			
		||||
	switch (adev->asic_type) {
 | 
			
		||||
	case CHIP_YELLOW_CARP:
 | 
			
		||||
		adev->mman.stolen_reserved_offset = 0x1ffb0000;
 | 
			
		||||
		adev->mman.stolen_reserved_size = 64 * PAGE_SIZE;
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		adev->mman.stolen_reserved_offset = 0;
 | 
			
		||||
		adev->mman.stolen_reserved_size = 0;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -332,6 +332,7 @@ amdgpu_gmc_set_vm_fault_masks(struct amdgpu_device *adev, int hub_type,
 | 
			
		|||
			      bool enable);
 | 
			
		||||
 | 
			
		||||
void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev);
 | 
			
		||||
void amdgpu_gmc_get_reserved_allocation(struct amdgpu_device *adev);
 | 
			
		||||
 | 
			
		||||
void amdgpu_gmc_init_pdb0(struct amdgpu_device *adev);
 | 
			
		||||
uint64_t amdgpu_gmc_vram_mc2pa(struct amdgpu_device *adev, uint64_t mc_addr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1718,6 +1718,13 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
 | 
			
		|||
				       NULL);
 | 
			
		||||
	if (r)
 | 
			
		||||
		return r;
 | 
			
		||||
	r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_reserved_offset,
 | 
			
		||||
				       adev->mman.stolen_reserved_size,
 | 
			
		||||
				       AMDGPU_GEM_DOMAIN_VRAM,
 | 
			
		||||
				       &adev->mman.stolen_reserved_memory,
 | 
			
		||||
				       NULL);
 | 
			
		||||
	if (r)
 | 
			
		||||
		return r;
 | 
			
		||||
 | 
			
		||||
	DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
 | 
			
		||||
		 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
 | 
			
		||||
| 
						 | 
				
			
			@ -1787,6 +1794,9 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
 | 
			
		|||
	amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL);
 | 
			
		||||
	/* return the IP Discovery TMR memory back to VRAM */
 | 
			
		||||
	amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
 | 
			
		||||
	if (adev->mman.stolen_reserved_size)
 | 
			
		||||
		amdgpu_bo_free_kernel(&adev->mman.stolen_reserved_memory,
 | 
			
		||||
				      NULL, NULL);
 | 
			
		||||
	amdgpu_ttm_fw_reserve_vram_fini(adev);
 | 
			
		||||
 | 
			
		||||
	amdgpu_vram_mgr_fini(adev);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,6 +84,10 @@ struct amdgpu_mman {
 | 
			
		|||
	struct amdgpu_bo	*stolen_extended_memory;
 | 
			
		||||
	bool			keep_stolen_vga_memory;
 | 
			
		||||
 | 
			
		||||
	struct amdgpu_bo	*stolen_reserved_memory;
 | 
			
		||||
	uint64_t		stolen_reserved_offset;
 | 
			
		||||
	uint64_t		stolen_reserved_size;
 | 
			
		||||
 | 
			
		||||
	/* discovery */
 | 
			
		||||
	uint8_t				*discovery_bin;
 | 
			
		||||
	uint32_t			discovery_tmr_size;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -936,6 +936,7 @@ static int gmc_v10_0_sw_init(void *handle)
 | 
			
		|||
		return r;
 | 
			
		||||
 | 
			
		||||
	amdgpu_gmc_get_vbios_allocations(adev);
 | 
			
		||||
	amdgpu_gmc_get_reserved_allocation(adev);
 | 
			
		||||
 | 
			
		||||
	/* Memory manager */
 | 
			
		||||
	r = amdgpu_bo_init(adev);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue