aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>2018-04-06 15:54:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-05-15 14:43:16 -0400
commit6f752ec2c20c6a575da29d5b297980f376830e6b (patch)
tree4c3f79a2a3312faa3ca8df5329a3bd71429a85eb /drivers/gpu/drm/amd
parentebdef28ebbcf767d9fa687acb1d02d97d834c628 (diff)
drm/amdgpu: Free VGA stolen memory as soon as possible.
Reserved VRAM is used to avoid overriding pre OS FB. Once our display stack takes over we don't need the reserved VRAM anymore. v2: Remove comment, we know actually why we need to reserve the stolen VRAM. Fix return type for amdgpu_ttm_late_init. v3: Return 0 in amdgpu_bo_late_init, rebase on changes to previous patch v4: rebase v5: For GMC9 reserve always just 9M and keep the stolem memory around until GART table curruption on S3 resume is resolved. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c26
8 files changed, 46 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 9e23d6f6f3f3..a160ef0332d6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -852,6 +852,13 @@ int amdgpu_bo_init(struct amdgpu_device *adev)
852 return amdgpu_ttm_init(adev); 852 return amdgpu_ttm_init(adev);
853} 853}
854 854
855int amdgpu_bo_late_init(struct amdgpu_device *adev)
856{
857 amdgpu_ttm_late_init(adev);
858
859 return 0;
860}
861
855void amdgpu_bo_fini(struct amdgpu_device *adev) 862void amdgpu_bo_fini(struct amdgpu_device *adev)
856{ 863{
857 amdgpu_ttm_fini(adev); 864 amdgpu_ttm_fini(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 3bee13344065..1e9fe85abcbb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -251,6 +251,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
251int amdgpu_bo_unpin(struct amdgpu_bo *bo); 251int amdgpu_bo_unpin(struct amdgpu_bo *bo);
252int amdgpu_bo_evict_vram(struct amdgpu_device *adev); 252int amdgpu_bo_evict_vram(struct amdgpu_device *adev);
253int amdgpu_bo_init(struct amdgpu_device *adev); 253int amdgpu_bo_init(struct amdgpu_device *adev);
254int amdgpu_bo_late_init(struct amdgpu_device *adev);
254void amdgpu_bo_fini(struct amdgpu_device *adev); 255void amdgpu_bo_fini(struct amdgpu_device *adev);
255int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo, 256int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
256 struct vm_area_struct *vma); 257 struct vm_area_struct *vma);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 2be04acf4efb..29efaac6e3ed 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1517,13 +1517,17 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
1517 return 0; 1517 return 0;
1518} 1518}
1519 1519
1520void amdgpu_ttm_late_init(struct amdgpu_device *adev)
1521{
1522 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
1523}
1524
1520void amdgpu_ttm_fini(struct amdgpu_device *adev) 1525void amdgpu_ttm_fini(struct amdgpu_device *adev)
1521{ 1526{
1522 if (!adev->mman.initialized) 1527 if (!adev->mman.initialized)
1523 return; 1528 return;
1524 1529
1525 amdgpu_ttm_debugfs_fini(adev); 1530 amdgpu_ttm_debugfs_fini(adev);
1526 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
1527 amdgpu_ttm_fw_reserve_vram_fini(adev); 1531 amdgpu_ttm_fw_reserve_vram_fini(adev);
1528 if (adev->mman.aper_base_kaddr) 1532 if (adev->mman.aper_base_kaddr)
1529 iounmap(adev->mman.aper_base_kaddr); 1533 iounmap(adev->mman.aper_base_kaddr);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index 6ea7de863041..e969c879d87e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -77,6 +77,7 @@ uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man);
77uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man); 77uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man);
78 78
79int amdgpu_ttm_init(struct amdgpu_device *adev); 79int amdgpu_ttm_init(struct amdgpu_device *adev);
80void amdgpu_ttm_late_init(struct amdgpu_device *adev);
80void amdgpu_ttm_fini(struct amdgpu_device *adev); 81void amdgpu_ttm_fini(struct amdgpu_device *adev);
81void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, 82void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev,
82 bool enable); 83 bool enable);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index 24e1ea36b454..79f9ac29019b 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -819,6 +819,8 @@ static int gmc_v6_0_late_init(void *handle)
819{ 819{
820 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 820 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
821 821
822 amdgpu_bo_late_init(adev);
823
822 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS) 824 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
823 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); 825 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
824 else 826 else
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 93861f9c7773..7147bfe25a23 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -958,6 +958,8 @@ static int gmc_v7_0_late_init(void *handle)
958{ 958{
959 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 959 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
960 960
961 amdgpu_bo_late_init(adev);
962
961 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS) 963 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
962 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); 964 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
963 else 965 else
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index fbd8f56c70f3..4d970daa65f4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -1049,6 +1049,8 @@ static int gmc_v8_0_late_init(void *handle)
1049{ 1049{
1050 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1050 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1051 1051
1052 amdgpu_bo_late_init(adev);
1053
1052 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS) 1054 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
1053 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); 1055 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
1054 else 1056 else
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 3071f51d6ca6..e6b00b507d4d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -665,6 +665,11 @@ static int gmc_v9_0_late_init(void *handle)
665 unsigned i; 665 unsigned i;
666 int r; 666 int r;
667 667
668 /*
669 * TODO - Uncomment once GART corruption issue is fixed.
670 */
671 /* amdgpu_bo_late_init(adev); */
672
668 for(i = 0; i < adev->num_rings; ++i) { 673 for(i = 0; i < adev->num_rings; ++i) {
669 struct amdgpu_ring *ring = adev->rings[i]; 674 struct amdgpu_ring *ring = adev->rings[i];
670 unsigned vmhub = ring->funcs->vmhub; 675 unsigned vmhub = ring->funcs->vmhub;
@@ -806,6 +811,13 @@ static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)
806#endif 811#endif
807 unsigned size; 812 unsigned size;
808 813
814 /*
815 * TODO Remove once GART corruption is resolved
816 * Check related code in gmc_v9_0_sw_fini
817 * */
818 size = 9 * 1024 * 1024;
819
820#if 0
809 if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) { 821 if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
810 size = 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */ 822 size = 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */
811 } else { 823 } else {
@@ -833,6 +845,8 @@ static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)
833 /* return 0 if the pre-OS buffer uses up most of vram */ 845 /* return 0 if the pre-OS buffer uses up most of vram */
834 if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024)) 846 if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
835 return 0; 847 return 0;
848
849#endif
836 return size; 850 return size;
837} 851}
838 852
@@ -956,6 +970,18 @@ static int gmc_v9_0_sw_fini(void *handle)
956 amdgpu_gem_force_release(adev); 970 amdgpu_gem_force_release(adev);
957 amdgpu_vm_manager_fini(adev); 971 amdgpu_vm_manager_fini(adev);
958 gmc_v9_0_gart_fini(adev); 972 gmc_v9_0_gart_fini(adev);
973
974 /*
975 * TODO:
976 * Currently there is a bug where some memory client outside
977 * of the driver writes to first 8M of VRAM on S3 resume,
978 * this overrides GART which by default gets placed in first 8M and
979 * causes VM_FAULTS once GTT is accessed.
980 * Keep the stolen memory reservation until the while this is not solved.
981 * Also check code in gmc_v9_0_get_vbios_fb_size and gmc_v9_0_late_init
982 */
983 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
984
959 amdgpu_bo_fini(adev); 985 amdgpu_bo_fini(adev);
960 986
961 return 0; 987 return 0;