On Fri, Apr 13, 2018 at 11:03 AM, Andrey Grodzovsky <andrey.grodzovsky at amd.com> wrote: > 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. > Rebase. > > Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com> > Signed-off-by: Alex Deucher <alexander.deucher at amd.com> Series is: Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 7 +++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++++- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + > drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 2 ++ > drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 2 ++ > drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 2 ++ > drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 26 ++++++++++++++++++++++++++ > 8 files changed, 46 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > index 9e23d6f..a160ef0 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) > return amdgpu_ttm_init(adev); > } > > +int amdgpu_bo_late_init(struct amdgpu_device *adev) > +{ > + amdgpu_ttm_late_init(adev); > + > + return 0; > +} > + > void amdgpu_bo_fini(struct amdgpu_device *adev) > { > 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 3bee133..1e9fe85 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, > int amdgpu_bo_unpin(struct amdgpu_bo *bo); > int amdgpu_bo_evict_vram(struct amdgpu_device *adev); > int amdgpu_bo_init(struct amdgpu_device *adev); > +int amdgpu_bo_late_init(struct amdgpu_device *adev); > void amdgpu_bo_fini(struct amdgpu_device *adev); > int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo, > 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 2be04ac..29efaac 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) > return 0; > } > > +void amdgpu_ttm_late_init(struct amdgpu_device *adev) > +{ > + amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); > +} > + > void amdgpu_ttm_fini(struct amdgpu_device *adev) > { > if (!adev->mman.initialized) > return; > > amdgpu_ttm_debugfs_fini(adev); > - amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); > amdgpu_ttm_fw_reserve_vram_fini(adev); > if (adev->mman.aper_base_kaddr) > 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 6ea7de8..e969c87 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); > uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man); > > int amdgpu_ttm_init(struct amdgpu_device *adev); > +void amdgpu_ttm_late_init(struct amdgpu_device *adev); > void amdgpu_ttm_fini(struct amdgpu_device *adev); > void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, > 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 24e1ea3..79f9ac2 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) > { > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > > + amdgpu_bo_late_init(adev); > + > if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS) > return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); > else > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c > index 93861f9..7147bfe 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) > { > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > > + amdgpu_bo_late_init(adev); > + > if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS) > return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); > else > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c > index fbd8f56..4d970da 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) > { > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > > + amdgpu_bo_late_init(adev); > + > if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS) > return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); > else > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > index a2b39a8..72fac1f 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) > unsigned i; > int r; > > + /* > + * TODO - Uncomment once GART corruption issue is fixed. > + */ > + /* amdgpu_bo_late_init(adev); */ > + > for(i = 0; i < adev->num_rings; ++i) { > struct amdgpu_ring *ring = adev->rings[i]; > unsigned vmhub = ring->funcs->vmhub; > @@ -804,6 +809,13 @@ static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev) > u32 d1vga_control = RREG32_SOC15(DCE, 0, mmD1VGA_CONTROL); > unsigned size; > > + /* > + * TODO Remove once GART corruption is resolved > + * Check related code in gmc_v9_0_sw_fini > + * */ > + size = 9 * 1024 * 1024; > + > +#if 0 > if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) { > size = 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */ > } else { > @@ -831,6 +843,8 @@ static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev) > /* return 0 if the pre-OS buffer uses up most of vram */ > if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024)) > return 0; > + > +#endif > return size; > } > > @@ -954,6 +968,18 @@ static int gmc_v9_0_sw_fini(void *handle) > amdgpu_gem_force_release(adev); > amdgpu_vm_manager_fini(adev); > gmc_v9_0_gart_fini(adev); > + > + /* > + * TODO: > + * Currently there is a bug where some memory client outside > + * of the driver writes to first 8M of VRAM on S3 resume, > + * this overrides GART which by default gets placed in first 8M and > + * causes VM_FAULTS once GTT is accessed. > + * Keep the stolen memory reservation until the while this is not solved. > + * Also check code in gmc_v9_0_get_vbios_fb_size and gmc_v9_0_late_init > + */ > + amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); > + > amdgpu_bo_fini(adev); > > return 0; > -- > 2.7.4 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx