From fd3bc2af471a3f9a73064cb28818fdd3485cffc7 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 4 Jul 2011 16:31:20 +0100 Subject: [PATCH] sna: Clamp object size to the min of 1/4 of the whole GTT or 1/2 the mappable ... for those pesky early devices whose GTT was no larger than the AGP aperture. Signed-off-by: Chris Wilson --- src/sna/kgem.c | 14 ++++++++++---- src/sna/kgem.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index b2468981..9509dbe3 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -365,11 +365,17 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen) kgem->aperture_high, kgem->aperture_high / (1024*1024))); kgem->aperture_mappable = agp_aperture_size(dev, gen); - if (kgem->aperture_mappable == 0) + if (kgem->aperture_mappable == 0 || + kgem->aperture_mappable > aperture.aper_size) kgem->aperture_mappable = aperture.aper_size; DBG(("%s: aperture mappable=%d [%d]\n", __FUNCTION__, kgem->aperture_mappable, kgem->aperture_mappable / (1024*1024))); + kgem->max_object_size = kgem->aperture_mappable / 2; + if (kgem->max_object_size > kgem->aperture_low) + kgem->max_object_size = kgem->aperture_low; + DBG(("%s: max object size %d\n", __FUNCTION__, kgem->max_object_size)); + i = 8; gp.param = I915_PARAM_NUM_FENCES_AVAIL; gp.value = &i; @@ -1207,9 +1213,9 @@ static bool _kgem_can_create_2d(struct kgem *kgem, tiling = -tiling; size = kgem_surface_size(kgem, width, height, bpp, tiling, &pitch); - if (size == 0 || size > kgem->aperture_mappable/2) + if (size == 0 || size > kgem->max_object_size) size = kgem_surface_size(kgem, width, height, bpp, I915_TILING_NONE, &pitch); - return size > 0 && size <= kgem->aperture_mappable/2; + return size > 0 && size <= kgem->max_object_size; } #if DEBUG_KGEM @@ -1269,7 +1275,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem, assert(_kgem_can_create_2d(kgem, width, height, bpp, tiling)); size = kgem_surface_size(kgem, width, height, bpp, tiling, &pitch); - assert(size && size <= kgem->aperture_mappable/2); + assert(size && size <= kgem->max_object_size); if (flags & CREATE_INACTIVE) goto skip_active_search; diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 013809c8..0ee63bd7 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -107,6 +107,7 @@ struct kgem { uint16_t fence_max; uint32_t aperture_high, aperture_low, aperture; uint32_t aperture_fenced, aperture_mappable; + uint32_t max_object_size; void (*context_switch)(struct kgem *kgem, int new_mode); uint32_t batch[4*1024];