From e3bc91842bf186ec149c852f48993235ef7ad27f Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 3 Jul 2012 10:21:06 +0100 Subject: [PATCH] sna: Allow booting on older kernels by disabling HW acceleration Signed-off-by: Chris Wilson --- src/sna/kgem.c | 16 +++++++++++++++- src/sna/sna_driver.c | 15 +-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 76f6cae1..43fa7050 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -595,6 +595,20 @@ static bool __kgem_throttle(struct kgem *kgem) return drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_THROTTLE, NULL) == -EIO; } +static bool is_hw_supported(struct kgem *kgem) +{ + if (DBG_NO_HW) + return false; + + if (kgem->gen >= 60) /* Only if the kernel supports the BLT ring */ + return gem_param(kgem, I915_PARAM_HAS_BLT) > 0; + + if (kgem->gen <= 20) /* dynamic GTT is fubar */ + return false; + + return true; +} + void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen) { struct drm_i915_gem_get_aperture aperture; @@ -607,7 +621,7 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen) kgem->fd = fd; kgem->gen = gen; kgem->wedged = __kgem_throttle(kgem); - kgem->wedged |= DBG_NO_HW; + kgem->wedged |= !is_hw_supported(kgem); kgem->batch_size = ARRAY_SIZE(kgem->batch); if (gen == 22) diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index 047b8654..f7eeca58 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -294,8 +294,7 @@ static int sna_open_drm_master(ScrnInfoPtr scrn) struct sna *sna = to_sna(scrn); struct pci_device *pci = sna->PciInfo; drmSetVersion sv; - struct drm_i915_getparam gp; - int err, val; + int err; char busid[20]; int fd; @@ -335,18 +334,6 @@ static int sna_open_drm_master(ScrnInfoPtr scrn) return -1; } - val = FALSE; - - VG_CLEAR(gp); - gp.param = I915_PARAM_HAS_BLT; - gp.value = &val; - if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp)) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Failed to detect BLT. Kernel 2.6.37 required.\n"); - drmClose(fd); - return -1; - } - dev = malloc(sizeof(*dev)); if (dev) { int flags;