From: Alex Deucher <alexander.deucher@xxxxxxx> The vbios uses memory from the start of vram for the pre-OS framebuffer. Reserve this at driver load time to prevent the driver from using it for other things which may cause atrifacts on screen before the console has kicked in. v2: Add common helper function to decide on amount of stolen VRAM. Signed-off-by: Alex Deucher <alexander.deucher at amd.com> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 9 +++++++++ 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 | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h index 893c249..c5a3dd2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h @@ -109,4 +109,13 @@ struct amdgpu_gmc { const struct amdgpu_gmc_funcs *gmc_funcs; }; +static inline uint64_t gmc_stolen_mem_size(struct amdgpu_gmc *gmc) +{ + /* Some systems might have very little VRAM */ + if(gmc->real_vram_size <= 64 * 1024 * 1024) + return 256 * 1024; + else + return 32 * 1024 * 1024; +} + #endif diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index 5617cf6..378ef65 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c @@ -851,7 +851,7 @@ static int gmc_v6_0_sw_init(void *handle) adev->gmc.mc_mask = 0xffffffffffULL; - adev->gmc.stolen_size = 256 * 1024; + adev->gmc.stolen_size = gmc_stolen_mem_size(&adev->gmc); adev->need_dma32 = false; dma_bits = adev->need_dma32 ? 32 : 40; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 80054f3..2cb1b13 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c @@ -998,7 +998,7 @@ static int gmc_v7_0_sw_init(void *handle) */ adev->gmc.mc_mask = 0xffffffffffULL; /* 40 bit MC */ - adev->gmc.stolen_size = 256 * 1024; + adev->gmc.stolen_size = gmc_stolen_mem_size(&adev->gmc); /* set DMA mask + need_dma32 flags. * PCIE - can handle 40-bits. diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index d71d4cb..979f73e 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -1096,7 +1096,7 @@ static int gmc_v8_0_sw_init(void *handle) */ adev->gmc.mc_mask = 0xffffffffffULL; /* 40 bit MC */ - adev->gmc.stolen_size = 256 * 1024; + adev->gmc.stolen_size = gmc_stolen_mem_size(&adev->gmc); /* set DMA mask + need_dma32 flags. * PCIE - can handle 40-bits. diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 070946e..f7c2d61 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -848,7 +848,7 @@ static int gmc_v9_0_sw_init(void *handle) * It needs to reserve 8M stolen memory for vega10 * TODO: Figure out how to avoid that... */ - adev->gmc.stolen_size = 8 * 1024 * 1024; + adev->gmc.stolen_size = gmc_stolen_mem_size(&adev->gmc); /* set DMA mask + need_dma32 flags. * PCIE - can handle 44-bits. -- 2.7.4