drm/radeon/kms: avoid corner case issue with unmappable vram V2

We should not allocate any object into unmappable vram if we
have no means to access them which on all GPU means having the
CP running and on newer GPU having the blit utility working.

This patch limit the vram allocation to visible vram until
we have acceleration up and running.

Note that it's more than unlikely that we run into any issue
related to that as when acceleration is not woring userspace
should allocate any object in vram beside front buffer which
should fit in visible vram.

V2 use real_vram_size as mc_vram_size could be bigger than
the actual amount of vram

[airlied: fixup r700_cp_stop case]

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by Jerome Glisse and committed by Dave Airlie c919b371 85a33188

+14 -1
+1
drivers/gpu/drm/radeon/evergreen.c
··· 1407 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 1408 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 1409 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1410 r600_vram_gtt_location(rdev, &rdev->mc); 1411 radeon_update_bandwidth_info(rdev); 1412
··· 1407 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 1408 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 1409 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1410 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1411 r600_vram_gtt_location(rdev, &rdev->mc); 1412 radeon_update_bandwidth_info(rdev); 1413
+3
drivers/gpu/drm/radeon/r100.c
··· 1030 return r; 1031 } 1032 rdev->cp.ready = true; 1033 return 0; 1034 } 1035 ··· 1048 void r100_cp_disable(struct radeon_device *rdev) 1049 { 1050 /* Disable ring */ 1051 rdev->cp.ready = false; 1052 WREG32(RADEON_CP_CSQ_MODE, 0); 1053 WREG32(RADEON_CP_CSQ_CNTL, 0); ··· 2297 /* FIXME we don't use the second aperture yet when we could use it */ 2298 if (rdev->mc.visible_vram_size > rdev->mc.aper_size) 2299 rdev->mc.visible_vram_size = rdev->mc.aper_size; 2300 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); 2301 if (rdev->flags & RADEON_IS_IGP) { 2302 uint32_t tom;
··· 1030 return r; 1031 } 1032 rdev->cp.ready = true; 1033 + rdev->mc.active_vram_size = rdev->mc.real_vram_size; 1034 return 0; 1035 } 1036 ··· 1047 void r100_cp_disable(struct radeon_device *rdev) 1048 { 1049 /* Disable ring */ 1050 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1051 rdev->cp.ready = false; 1052 WREG32(RADEON_CP_CSQ_MODE, 0); 1053 WREG32(RADEON_CP_CSQ_CNTL, 0); ··· 2295 /* FIXME we don't use the second aperture yet when we could use it */ 2296 if (rdev->mc.visible_vram_size > rdev->mc.aper_size) 2297 rdev->mc.visible_vram_size = rdev->mc.aper_size; 2298 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 2299 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); 2300 if (rdev->flags & RADEON_IS_IGP) { 2301 uint32_t tom;
+2
drivers/gpu/drm/radeon/r600.c
··· 1248 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1249 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1250 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1251 r600_vram_gtt_location(rdev, &rdev->mc); 1252 1253 if (rdev->flags & RADEON_IS_IGP) { ··· 1918 */ 1919 void r600_cp_stop(struct radeon_device *rdev) 1920 { 1921 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1922 } 1923
··· 1248 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1249 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1250 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1251 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1252 r600_vram_gtt_location(rdev, &rdev->mc); 1253 1254 if (rdev->flags & RADEON_IS_IGP) { ··· 1917 */ 1918 void r600_cp_stop(struct radeon_device *rdev) 1919 { 1920 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1921 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1922 } 1923
+2
drivers/gpu/drm/radeon/r600_blit_kms.c
··· 532 memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4); 533 radeon_bo_kunmap(rdev->r600_blit.shader_obj); 534 radeon_bo_unreserve(rdev->r600_blit.shader_obj); 535 return 0; 536 } 537 ··· 540 { 541 int r; 542 543 if (rdev->r600_blit.shader_obj == NULL) 544 return; 545 /* If we can't reserve the bo, unref should be enough to destroy
··· 532 memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4); 533 radeon_bo_kunmap(rdev->r600_blit.shader_obj); 534 radeon_bo_unreserve(rdev->r600_blit.shader_obj); 535 + rdev->mc.active_vram_size = rdev->mc.real_vram_size; 536 return 0; 537 } 538 ··· 539 { 540 int r; 541 542 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 543 if (rdev->r600_blit.shader_obj == NULL) 544 return; 545 /* If we can't reserve the bo, unref should be enough to destroy
+1
drivers/gpu/drm/radeon/radeon.h
··· 344 * about vram size near mc fb location */ 345 u64 mc_vram_size; 346 u64 visible_vram_size; 347 u64 gtt_size; 348 u64 gtt_start; 349 u64 gtt_end;
··· 344 * about vram size near mc fb location */ 345 u64 mc_vram_size; 346 u64 visible_vram_size; 347 + u64 active_vram_size; 348 u64 gtt_size; 349 u64 gtt_start; 350 u64 gtt_end;
+1 -1
drivers/gpu/drm/radeon/radeon_object.c
··· 69 u32 c = 0; 70 71 rbo->placement.fpfn = 0; 72 - rbo->placement.lpfn = 0; 73 rbo->placement.placement = rbo->placements; 74 rbo->placement.busy_placement = rbo->placements; 75 if (domain & RADEON_GEM_DOMAIN_VRAM)
··· 69 u32 c = 0; 70 71 rbo->placement.fpfn = 0; 72 + rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT; 73 rbo->placement.placement = rbo->placements; 74 rbo->placement.busy_placement = rbo->placements; 75 if (domain & RADEON_GEM_DOMAIN_VRAM)
+1
drivers/gpu/drm/radeon/rs600.c
··· 693 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); 694 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 695 rdev->mc.visible_vram_size = rdev->mc.aper_size; 696 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 697 base = RREG32_MC(R_000004_MC_FB_LOCATION); 698 base = G_000004_MC_FB_START(base) << 16;
··· 693 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); 694 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 695 rdev->mc.visible_vram_size = rdev->mc.aper_size; 696 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 697 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 698 base = RREG32_MC(R_000004_MC_FB_LOCATION); 699 base = G_000004_MC_FB_START(base) << 16;
+1
drivers/gpu/drm/radeon/rs690.c
··· 157 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 158 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 159 rdev->mc.visible_vram_size = rdev->mc.aper_size; 160 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); 161 base = G_000100_MC_FB_START(base) << 16; 162 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
··· 157 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 158 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 159 rdev->mc.visible_vram_size = rdev->mc.aper_size; 160 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 161 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); 162 base = G_000100_MC_FB_START(base) << 16; 163 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
+2
drivers/gpu/drm/radeon/rv770.c
··· 267 */ 268 void r700_cp_stop(struct radeon_device *rdev) 269 { 270 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 271 } 272 ··· 993 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 994 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 995 rdev->mc.visible_vram_size = rdev->mc.aper_size; 996 r600_vram_gtt_location(rdev, &rdev->mc); 997 radeon_update_bandwidth_info(rdev); 998
··· 267 */ 268 void r700_cp_stop(struct radeon_device *rdev) 269 { 270 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 271 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 272 } 273 ··· 992 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 993 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 994 rdev->mc.visible_vram_size = rdev->mc.aper_size; 995 + rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 996 r600_vram_gtt_location(rdev, &rdev->mc); 997 radeon_update_bandwidth_info(rdev); 998