Commit e15a5fb9 authored by Huang Rui's avatar Huang Rui Committed by Alex Deucher
Browse files

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: default avatarHuang Rui <ray.huang@amd.com>
Acked-and-Tested-by: default avatarAaron Liu <aaron.liu@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent cba00ce8
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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;
	}
}
+1 −0
Original line number Diff line number Diff line
@@ -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);
+10 −0
Original line number Diff line number Diff line
@@ -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);
+4 −0
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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);