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 >