[PATCH] drm/radeon/kms: avoid corner case issue with unmappable vram V2
Alex Deucher
alexdeucher at gmail.com
Tue Aug 10 15:03:58 PDT 2010
On Tue, Aug 10, 2010 at 5:41 PM, <glisse at freedesktop.org> wrote:
> From: Jerome Glisse <jglisse at redhat.com>
>
> 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
>
> Signed-off-by: Jerome Glisse <jglisse at redhat.com>
> ---
> drivers/gpu/drm/radeon/evergreen.c | 1 +
> drivers/gpu/drm/radeon/r100.c | 3 +++
> drivers/gpu/drm/radeon/r600.c | 2 ++
> drivers/gpu/drm/radeon/r600_blit_kms.c | 2 ++
> drivers/gpu/drm/radeon/radeon.h | 1 +
> drivers/gpu/drm/radeon/radeon_object.c | 2 +-
> drivers/gpu/drm/radeon/rs600.c | 1 +
> drivers/gpu/drm/radeon/rs690.c | 1 +
> drivers/gpu/drm/radeon/rv770.c | 1 +
> 9 files changed, 13 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index 957d506..4243344 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -1359,6 +1359,7 @@ int evergreen_mc_init(struct radeon_device *rdev)
> rdev->mc.mc_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.active_vram_size = rdev->mc.visible_vram_size;
> r600_vram_gtt_location(rdev, &rdev->mc);
> radeon_update_bandwidth_info(rdev);
>
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index e817a0b..566c1e5 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -1030,6 +1030,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
> return r;
> }
> rdev->cp.ready = true;
> + rdev->mc.active_vram_size = rdev->mc.real_vram_size;
> return 0;
> }
>
> @@ -1047,6 +1048,7 @@ void r100_cp_fini(struct radeon_device *rdev)
> void r100_cp_disable(struct radeon_device *rdev)
> {
> /* Disable ring */
> + rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
> rdev->cp.ready = false;
> WREG32(RADEON_CP_CSQ_MODE, 0);
> WREG32(RADEON_CP_CSQ_CNTL, 0);
> @@ -2306,6 +2308,7 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
> /* FIXME we don't use the second aperture yet when we could use it */
> if (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);
> if (rdev->flags & RADEON_IS_IGP) {
> uint32_t tom;
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index d0ebae9..acc71f2 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -1248,6 +1248,7 @@ int r600_mc_init(struct radeon_device *rdev)
> rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
> rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
> 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);
>
> if (rdev->flags & RADEON_IS_IGP) {
> @@ -1917,6 +1918,7 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
> */
> void r600_cp_stop(struct radeon_device *rdev)
> {
> + rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
> WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
> }
>
r700_cp_stop needs to be updated as well. Other than that looks good.
Alex
> diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
> index d13622a..968ff3a 100644
> --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
> @@ -507,6 +507,7 @@ int r600_blit_init(struct radeon_device *rdev)
> memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4);
> radeon_bo_kunmap(rdev->r600_blit.shader_obj);
> radeon_bo_unreserve(rdev->r600_blit.shader_obj);
> + rdev->mc.active_vram_size = rdev->mc.real_vram_size;
> return 0;
> }
>
> @@ -514,6 +515,7 @@ void r600_blit_fini(struct radeon_device *rdev)
> {
> int r;
>
> + rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
> if (rdev->r600_blit.shader_obj == NULL)
> return;
> /* If we can't reserve the bo, unref should be enough to destroy
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 3cd1c47..feeac20 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -344,6 +344,7 @@ struct radeon_mc {
> * about vram size near mc fb location */
> u64 mc_vram_size;
> u64 visible_vram_size;
> + u64 active_vram_size;
> u64 gtt_size;
> u64 gtt_start;
> u64 gtt_end;
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 0afd1e6..b3b5306 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -69,7 +69,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
> u32 c = 0;
>
> rbo->placement.fpfn = 0;
> - rbo->placement.lpfn = 0;
> + rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT;
> rbo->placement.placement = rbo->placements;
> rbo->placement.busy_placement = rbo->placements;
> if (domain & RADEON_GEM_DOMAIN_VRAM)
> diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
> index cc05b23..51d5f7b 100644
> --- a/drivers/gpu/drm/radeon/rs600.c
> +++ b/drivers/gpu/drm/radeon/rs600.c
> @@ -693,6 +693,7 @@ void rs600_mc_init(struct radeon_device *rdev)
> rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
> rdev->mc.mc_vram_size = rdev->mc.real_vram_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);
> base = RREG32_MC(R_000004_MC_FB_LOCATION);
> base = G_000004_MC_FB_START(base) << 16;
> diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
> index 3e3f757..4dc2a87 100644
> --- a/drivers/gpu/drm/radeon/rs690.c
> +++ b/drivers/gpu/drm/radeon/rs690.c
> @@ -157,6 +157,7 @@ void rs690_mc_init(struct radeon_device *rdev)
> rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
> rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
> 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 = G_000100_MC_FB_START(base) << 16;
> rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
> diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
> index f1c79681..3e6293e 100644
> --- a/drivers/gpu/drm/radeon/rv770.c
> +++ b/drivers/gpu/drm/radeon/rv770.c
> @@ -944,6 +944,7 @@ int rv770_mc_init(struct radeon_device *rdev)
> rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
> rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
> 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);
> radeon_update_bandwidth_info(rdev);
>
> --
> 1.7.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
More information about the dri-devel
mailing list