summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-08-02 19:18:29 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-08-02 19:19:57 +0100
commitaf60a104acfcc64a63987f93bb77ffa21be1ead1 (patch)
tree0525cad8998934258a9850c18b4595be2b18206c
parentd11512406daeaabf2549831505811725e1375e5e (diff)
sna: Restrict fencing to only use the low 256MiB
Somce early machines have 512MiB apertures, but we can still only use the low 256MiB for fencing. Separate out the mappable restriction checks from the fencing in order to further constrain those devices. Reported-by: Matti Hämäläinen <ccr@tnsp.org> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c35
-rw-r--r--src/sna/kgem.h2
2 files changed, 22 insertions, 15 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 628fa3c7..17c69658 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1421,6 +1421,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
DBG(("%s: aperture mappable=%d [%d MiB]\n", __FUNCTION__,
kgem->aperture_mappable, kgem->aperture_mappable / (1024*1024)));
+ kgem->aperture_fenceable = MIN(256*1024*1024, kgem->aperture_mappable);
+ DBG(("%s: aperture fenceable=%d [%d MiB]\n", __FUNCTION__,
+ kgem->aperture_fenceable, kgem->aperture_fenceable / (1024*1024)));
+
kgem->buffer_size = 64 * 1024;
while (kgem->buffer_size < kgem->aperture_mappable >> 10)
kgem->buffer_size *= 2;
@@ -1466,7 +1470,7 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
if (kgem->has_llc)
kgem->max_upload_tile_size = kgem->max_copy_tile_size;
else
- kgem->max_upload_tile_size = kgem->aperture_mappable / 4;
+ kgem->max_upload_tile_size = kgem->aperture_fenceable / 4;
if (kgem->max_upload_tile_size > half_gpu_max)
kgem->max_upload_tile_size = half_gpu_max;
if (kgem->max_upload_tile_size > kgem->aperture_high/2)
@@ -1505,6 +1509,7 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
/* Convert the aperture thresholds to pages */
kgem->aperture_mappable /= PAGE_SIZE;
+ kgem->aperture_fenceable /= PAGE_SIZE;
kgem->aperture_low /= PAGE_SIZE;
kgem->aperture_high /= PAGE_SIZE;
kgem->aperture_total /= PAGE_SIZE;
@@ -4319,7 +4324,7 @@ unsigned kgem_can_create_2d(struct kgem *kgem,
fence_size <<= 1;
if (fence_size > kgem->max_gpu_size)
flags &= ~KGEM_CAN_CREATE_GPU;
- if (fence_size > PAGE_SIZE*kgem->aperture_mappable/4)
+ if (fence_size > PAGE_SIZE*kgem->aperture_fenceable/4)
flags &= ~KGEM_CAN_CREATE_GTT;
}
}
@@ -5325,6 +5330,8 @@ static bool aperture_check(struct kgem *kgem, unsigned num_pages)
DBG(("%s: num_pages=%d, holding %d pages in reserve, total aperture %d\n",
__FUNCTION__, num_pages, reserve, kgem->aperture_total));
num_pages += reserve;
+ if (kgem->gen < 040 && num_pages > kgem->aperture_fenceable)
+ return false;
VG_CLEAR(aperture);
aperture.aper_available_size = kgem->aperture_total;
@@ -5433,7 +5440,7 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
size = 3*kgem->aperture_fenced;
if (kgem->aperture_total == kgem->aperture_mappable)
size += kgem->aperture;
- if (size > kgem->aperture_mappable &&
+ if (size > kgem->aperture_fenceable &&
kgem_ring_is_idle(kgem, kgem->ring)) {
DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
return false;
@@ -5448,9 +5455,9 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
size = 2 * kgem->aperture_max_fence;
if (kgem->aperture_total == kgem->aperture_mappable)
size += kgem->aperture;
- if (size > kgem->aperture_mappable) {
- DBG(("%s: estimated fence space required %d (fenced=%d, max_fence=%d, aperture=%d) exceeds aperture %d\n",
- __FUNCTION__, size, kgem->aperture_fenced, kgem->aperture_max_fence, kgem->aperture, kgem->aperture_mappable));
+ if (size > kgem->aperture_fenceable) {
+ DBG(("%s: estimated fence space required %d (fenced=%d, max_fence=%d, aperture=%d) exceeds fenceable aperture %d\n",
+ __FUNCTION__, size, kgem->aperture_fenced, kgem->aperture_max_fence, kgem->aperture, kgem->aperture_fenceable));
return false;
}
}
@@ -5477,7 +5484,7 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
size = 3*kgem->aperture_fenced;
if (kgem->aperture_total == kgem->aperture_mappable)
size += kgem->aperture;
- if (size > kgem->aperture_mappable &&
+ if (size > kgem->aperture_fenceable &&
kgem_ring_is_idle(kgem, kgem->ring)) {
DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
return false;
@@ -5492,9 +5499,9 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
size = 2 * kgem->aperture_max_fence;
if (kgem->aperture_total == kgem->aperture_mappable)
size += kgem->aperture;
- if (size > kgem->aperture_mappable) {
- DBG(("%s: estimated fence space required %d (fenced=%d, max_fence=%d, aperture=%d) exceeds aperture %d\n",
- __FUNCTION__, size, kgem->aperture_fenced, kgem->aperture_max_fence, kgem->aperture, kgem->aperture_mappable));
+ if (size > kgem->aperture_fenceable) {
+ DBG(("%s: estimated fence space required %d (fenced=%d, max_fence=%d, aperture=%d) exceeds fenceable aperture %d\n",
+ __FUNCTION__, size, kgem->aperture_fenced, kgem->aperture_max_fence, kgem->aperture, kgem->aperture_fenceable));
return false;
}
}
@@ -5571,7 +5578,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
size = 3*kgem->aperture_fenced;
if (kgem->aperture_total == kgem->aperture_mappable)
size += kgem->aperture;
- if (size > kgem->aperture_mappable &&
+ if (size > kgem->aperture_fenceable &&
kgem_ring_is_idle(kgem, kgem->ring)) {
DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
return false;
@@ -5584,9 +5591,9 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
size = 2 * kgem->aperture_max_fence;
if (kgem->aperture_total == kgem->aperture_mappable)
size += kgem->aperture;
- if (size > kgem->aperture_mappable) {
- DBG(("%s: estimated fence space required %d (fenced=%d, max_fence=%d, aperture=%d) exceeds aperture %d\n",
- __FUNCTION__, size, kgem->aperture_fenced, kgem->aperture_max_fence, kgem->aperture, kgem->aperture_mappable));
+ if (size > kgem->aperture_fenceable) {
+ DBG(("%s: estimated fence space required %d (fenced=%d, max_fence=%d, aperture=%d) exceeds fenceable aperture %d\n",
+ __FUNCTION__, size, kgem->aperture_fenced, kgem->aperture_max_fence, kgem->aperture, kgem->aperture_fenceable));
return false;
}
}
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 8cf596c1..a5ee2ef5 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -195,7 +195,7 @@ struct kgem {
uint16_t fence_max;
uint16_t half_cpu_cache_pages;
- uint32_t aperture_total, aperture_high, aperture_low, aperture_mappable;
+ uint32_t aperture_total, aperture_high, aperture_low, aperture_mappable, aperture_fenceable;
uint32_t aperture, aperture_fenced, aperture_max_fence;
uint32_t max_upload_tile_size, max_copy_tile_size;
uint32_t max_gpu_size, max_cpu_size;