Commit 53595338 authored by Dave Airlie's avatar Dave Airlie

drm/radeon: fix problem with changing active VRAM size. (v2)

So we used to use lpfn directly to restrict VRAM when we couldn't
access the unmappable area, however this was removed in
93225b0d as it also restricted
the gtt placements. However it was only later noticed that this
broke on some hw.

This removes the active_vram_size, and just explicitly sets it
when it changes, TTM/drm_mm will always use the real_vram_size,
and the active vram size will change the TTM size used for lpfn
setting.

We should re-work the fpfn/lpfn to per-placement at some point
I suspect, but that is too late for this kernel.

Hopefully this addresses:
https://bugs.freedesktop.org/show_bug.cgi?id=35254

v2: fix reported useful VRAM size to userspace to be correct.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent c640e8ca
...@@ -2194,7 +2194,6 @@ int evergreen_mc_init(struct radeon_device *rdev) ...@@ -2194,7 +2194,6 @@ int evergreen_mc_init(struct radeon_device *rdev)
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
} }
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
r700_vram_gtt_location(rdev, &rdev->mc); r700_vram_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
...@@ -2934,7 +2933,7 @@ static int evergreen_startup(struct radeon_device *rdev) ...@@ -2934,7 +2933,7 @@ static int evergreen_startup(struct radeon_device *rdev)
/* XXX: ontario has problems blitting to gart at the moment */ /* XXX: ontario has problems blitting to gart at the moment */
if (rdev->family == CHIP_PALM) { if (rdev->family == CHIP_PALM) {
rdev->asic->copy = NULL; rdev->asic->copy = NULL;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
} }
/* allocate wb buffer */ /* allocate wb buffer */
......
...@@ -623,7 +623,7 @@ int evergreen_blit_init(struct radeon_device *rdev) ...@@ -623,7 +623,7 @@ int evergreen_blit_init(struct radeon_device *rdev)
dev_err(rdev->dev, "(%d) pin blit object failed\n", r); dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
return r; return r;
} }
rdev->mc.active_vram_size = rdev->mc.real_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
return 0; return 0;
} }
...@@ -631,7 +631,7 @@ void evergreen_blit_fini(struct radeon_device *rdev) ...@@ -631,7 +631,7 @@ void evergreen_blit_fini(struct radeon_device *rdev)
{ {
int r; int r;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
if (rdev->r600_blit.shader_obj == NULL) if (rdev->r600_blit.shader_obj == NULL)
return; return;
/* If we can't reserve the bo, unref should be enough to destroy /* If we can't reserve the bo, unref should be enough to destroy
......
...@@ -1024,7 +1024,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) ...@@ -1024,7 +1024,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
return r; return r;
} }
rdev->cp.ready = true; rdev->cp.ready = true;
rdev->mc.active_vram_size = rdev->mc.real_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
return 0; return 0;
} }
...@@ -1042,7 +1042,7 @@ void r100_cp_fini(struct radeon_device *rdev) ...@@ -1042,7 +1042,7 @@ void r100_cp_fini(struct radeon_device *rdev)
void r100_cp_disable(struct radeon_device *rdev) void r100_cp_disable(struct radeon_device *rdev)
{ {
/* Disable ring */ /* Disable ring */
rdev->mc.active_vram_size = rdev->mc.visible_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
rdev->cp.ready = false; rdev->cp.ready = false;
WREG32(RADEON_CP_CSQ_MODE, 0); WREG32(RADEON_CP_CSQ_MODE, 0);
WREG32(RADEON_CP_CSQ_CNTL, 0); WREG32(RADEON_CP_CSQ_CNTL, 0);
...@@ -2312,7 +2312,6 @@ void r100_vram_init_sizes(struct radeon_device *rdev) ...@@ -2312,7 +2312,6 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
/* FIXME we don't use the second aperture yet when we could use it */ /* FIXME we don't use the second aperture yet when we could use it */
if (rdev->mc.visible_vram_size > rdev->mc.aper_size) if (rdev->mc.visible_vram_size > rdev->mc.aper_size)
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
if (rdev->flags & RADEON_IS_IGP) { if (rdev->flags & RADEON_IS_IGP) {
uint32_t tom; uint32_t tom;
......
...@@ -1255,7 +1255,6 @@ int r600_mc_init(struct radeon_device *rdev) ...@@ -1255,7 +1255,6 @@ int r600_mc_init(struct radeon_device *rdev)
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
r600_vram_gtt_location(rdev, &rdev->mc); r600_vram_gtt_location(rdev, &rdev->mc);
if (rdev->flags & RADEON_IS_IGP) { if (rdev->flags & RADEON_IS_IGP) {
...@@ -1937,7 +1936,7 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) ...@@ -1937,7 +1936,7 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
*/ */
void r600_cp_stop(struct radeon_device *rdev) void r600_cp_stop(struct radeon_device *rdev)
{ {
rdev->mc.active_vram_size = rdev->mc.visible_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
WREG32(SCRATCH_UMSK, 0); WREG32(SCRATCH_UMSK, 0);
} }
......
...@@ -558,7 +558,7 @@ int r600_blit_init(struct radeon_device *rdev) ...@@ -558,7 +558,7 @@ int r600_blit_init(struct radeon_device *rdev)
dev_err(rdev->dev, "(%d) pin blit object failed\n", r); dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
return r; return r;
} }
rdev->mc.active_vram_size = rdev->mc.real_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
return 0; return 0;
} }
...@@ -566,7 +566,7 @@ void r600_blit_fini(struct radeon_device *rdev) ...@@ -566,7 +566,7 @@ void r600_blit_fini(struct radeon_device *rdev)
{ {
int r; int r;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
if (rdev->r600_blit.shader_obj == NULL) if (rdev->r600_blit.shader_obj == NULL)
return; return;
/* If we can't reserve the bo, unref should be enough to destroy /* If we can't reserve the bo, unref should be enough to destroy
......
...@@ -345,7 +345,6 @@ struct radeon_mc { ...@@ -345,7 +345,6 @@ struct radeon_mc {
* about vram size near mc fb location */ * about vram size near mc fb location */
u64 mc_vram_size; u64 mc_vram_size;
u64 visible_vram_size; u64 visible_vram_size;
u64 active_vram_size;
u64 gtt_size; u64 gtt_size;
u64 gtt_start; u64 gtt_start;
u64 gtt_end; u64 gtt_end;
...@@ -1448,6 +1447,7 @@ extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *m ...@@ -1448,6 +1447,7 @@ extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *m
extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
extern int radeon_resume_kms(struct drm_device *dev); extern int radeon_resume_kms(struct drm_device *dev);
extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state);
extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size);
/* r600, rv610, rv630, rv620, rv635, rv670, rs780, rs880 */ /* r600, rv610, rv630, rv620, rv635, rv670, rs780, rs880 */
extern bool r600_card_posted(struct radeon_device *rdev); extern bool r600_card_posted(struct radeon_device *rdev);
......
...@@ -156,9 +156,12 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, ...@@ -156,9 +156,12 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
{ {
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
struct drm_radeon_gem_info *args = data; struct drm_radeon_gem_info *args = data;
struct ttm_mem_type_manager *man;
man = &rdev->mman.bdev.man[TTM_PL_VRAM];
args->vram_size = rdev->mc.real_vram_size; args->vram_size = rdev->mc.real_vram_size;
args->vram_visible = rdev->mc.real_vram_size; args->vram_visible = (u64)man->size << PAGE_SHIFT;
if (rdev->stollen_vga_memory) if (rdev->stollen_vga_memory)
args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
args->vram_visible -= radeon_fbdev_total_size(rdev); args->vram_visible -= radeon_fbdev_total_size(rdev);
......
...@@ -589,6 +589,20 @@ void radeon_ttm_fini(struct radeon_device *rdev) ...@@ -589,6 +589,20 @@ void radeon_ttm_fini(struct radeon_device *rdev)
DRM_INFO("radeon: ttm finalized\n"); DRM_INFO("radeon: ttm finalized\n");
} }
/* this should only be called at bootup or when userspace
* isn't running */
void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
{
struct ttm_mem_type_manager *man;
if (!rdev->mman.initialized)
return;
man = &rdev->mman.bdev.man[TTM_PL_VRAM];
/* this just adjusts TTM size idea, which sets lpfn to the correct value */
man->size = size >> PAGE_SHIFT;
}
static struct vm_operations_struct radeon_ttm_vm_ops; static struct vm_operations_struct radeon_ttm_vm_ops;
static const struct vm_operations_struct *ttm_vm_ops = NULL; static const struct vm_operations_struct *ttm_vm_ops = NULL;
......
...@@ -751,7 +751,6 @@ void rs600_mc_init(struct radeon_device *rdev) ...@@ -751,7 +751,6 @@ void rs600_mc_init(struct radeon_device *rdev)
rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
rdev->mc.mc_vram_size = rdev->mc.real_vram_size; rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
base = RREG32_MC(R_000004_MC_FB_LOCATION); base = RREG32_MC(R_000004_MC_FB_LOCATION);
base = G_000004_MC_FB_START(base) << 16; base = G_000004_MC_FB_START(base) << 16;
......
...@@ -157,7 +157,6 @@ void rs690_mc_init(struct radeon_device *rdev) ...@@ -157,7 +157,6 @@ void rs690_mc_init(struct radeon_device *rdev)
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
base = G_000100_MC_FB_START(base) << 16; base = G_000100_MC_FB_START(base) << 16;
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
......
...@@ -307,7 +307,7 @@ static void rv770_mc_program(struct radeon_device *rdev) ...@@ -307,7 +307,7 @@ static void rv770_mc_program(struct radeon_device *rdev)
*/ */
void r700_cp_stop(struct radeon_device *rdev) void r700_cp_stop(struct radeon_device *rdev)
{ {
rdev->mc.active_vram_size = rdev->mc.visible_vram_size; radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
WREG32(SCRATCH_UMSK, 0); WREG32(SCRATCH_UMSK, 0);
} }
...@@ -1123,7 +1123,6 @@ int rv770_mc_init(struct radeon_device *rdev) ...@@ -1123,7 +1123,6 @@ int rv770_mc_init(struct radeon_device *rdev)
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
r700_vram_gtt_location(rdev, &rdev->mc); r700_vram_gtt_location(rdev, &rdev->mc);
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment