Re: [PATCH] drm/radeon/kms: avoid corner case issue with unmappable vram V2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 10, 2010 at 5:41 PM,  <glisse@xxxxxxxxxxxxxxx> wrote:
> From: Jerome Glisse <jglisse@xxxxxxxxxx>
>
> 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@xxxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxxxxxxxxxx
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux