drm/amdgpu: introduce a stolen reserved buffer to protect specific buffer region...
authorHuang Rui <ray.huang@amd.com>
Wed, 16 Dec 2020 09:21:27 +0000 (17:21 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 4 Jun 2021 20:03:12 +0000 (16:03 -0400)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c

index 7061c4a..86d28dc 100644 (file)
@@ -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;
+       }
+}
index 6aa1d52..e552011 100644 (file)
@@ -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);
index 832970c..1189110 100644 (file)
@@ -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);
index 74a7021..e69f3e8 100644 (file)
@@ -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;
index 719a7dc..439513e 100644 (file)
@@ -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);