2010/11/22 Michel Dänzer <michel@xxxxxxxxxxx>: > On Fre, 2010-11-19 at 16:34 -0500, jglisse@xxxxxxxxxx wrote: >> From: Jerome Glisse <jglisse@xxxxxxxxxx> >> >> Forbid allocating buffer bigger than visible VRAM or GTT, also >> properly set lpfn field. >> >> v2 - use max macro >> - silence warning >> >> Signed-off-by: Jerome Glisse <jglisse@xxxxxxxxxx> >> --- >> drivers/gpu/drm/radeon/radeon_object.c | 34 ++++++++++++++++++++++++++----- >> 1 files changed, 28 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c >> index 1d06774..c2fa64c 100644 >> --- a/drivers/gpu/drm/radeon/radeon_object.c >> +++ b/drivers/gpu/drm/radeon/radeon_object.c >> @@ -69,18 +69,28 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain) >> u32 c = 0; >> >> rbo->placement.fpfn = 0; >> - rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT; >> + rbo->placement.lpfn = 0; >> rbo->placement.placement = rbo->placements; >> rbo->placement.busy_placement = rbo->placements; >> - if (domain & RADEON_GEM_DOMAIN_VRAM) >> + if (domain & RADEON_GEM_DOMAIN_VRAM) { >> + rbo->placement.lpfn = max((unsigned)rbo->placement.lpfn, (unsigned)rbo->rdev->mc.active_vram_size >> PAGE_SHIFT); >> rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | >> TTM_PL_FLAG_VRAM; >> - if (domain & RADEON_GEM_DOMAIN_GTT) >> + } >> + if (domain & RADEON_GEM_DOMAIN_GTT) { >> + rbo->placement.lpfn = max((unsigned)rbo->placement.lpfn, (unsigned)rbo->rdev->mc.gtt_size >> PAGE_SHIFT); >> rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT; >> - if (domain & RADEON_GEM_DOMAIN_CPU) >> + } >> + if (domain & RADEON_GEM_DOMAIN_CPU) { >> + /* 4G limit for CPU domain */ >> + rbo->placement.lpfn = max(rbo->placement.lpfn, 0xFFFFFFFF >> PAGE_SHIFT); >> rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; >> - if (!c) >> + } >> + if (!c) { >> + /* 4G limit for CPU domain */ >> + rbo->placement.lpfn = max(rbo->placement.lpfn, 0xFFFFFFFF >> PAGE_SHIFT); >> rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; >> + } > > I don't think taxing the maximum is the right thing to do: If domain is > (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT) and VRAM doesn't happen > to be the same size as GTT, lpfn will end up larger than one of them. > > AFAICT radeon_ttm_placement_from_domain() should just set lpfn to 0 > (i.e. unrestricted), the callers that need it to be non-0 already set it > afterwards. > > Out of curiosity, where does the 4G limit come from? > > >From my hat, but iirc ttm limit things to 1G anyway (vm size for mapping object in drm file and iirc we will report error if we can't find a mapping for userspace object). I guess at one point we should start thinking about what we want to do on that front. Doing a v3. Cheers, Jerome _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel