From 16c1a87580af89be02e7e6c1898f18b36829e007 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Wed, 13 Aug 2008 17:05:59 -0400 Subject: i915: Move spinlock init / destroy to load / unload time. This resolves the panic on FreeBSD during VT switch, without attempting any of the more lofty goals for the time being. --- shared-core/i915_dma.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'shared-core/i915_dma.c') diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 5811fa3c..34d9355d 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -1073,6 +1073,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) i915_gem_load(dev); + DRM_SPININIT(&dev_priv->swaps_lock, "swap"); + DRM_SPININIT(&dev_priv->user_irq_lock, "userirq"); + #ifdef __linux__ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) intel_init_chipset_flush_compat(dev); @@ -1100,6 +1103,9 @@ int i915_driver_unload(struct drm_device *dev) drm_rmmap(dev, dev_priv->mmio_map); + DRM_SPINUNINIT(&dev_priv->swaps_lock); + DRM_SPINUNINIT(&dev_priv->user_irq_lock); + #ifdef __linux__ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25) intel_opregion_free(dev); -- cgit v1.2.3 From 1f3c4dd938a1710d762bac37dfb1b17c90af4732 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Wed, 20 Aug 2008 17:15:46 -0400 Subject: i915: Free dev->dev_private on unload. --- shared-core/i915_dma.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'shared-core/i915_dma.c') diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 34d9355d..84aafaae 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -1114,6 +1114,8 @@ int i915_driver_unload(struct drm_device *dev) drm_free(dev->dev_private, sizeof(drm_i915_private_t), DRM_MEM_DRIVER); + dev->dev_private = NULL; + #ifdef __linux__ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) intel_fini_chipset_flush_compat(dev); -- cgit v1.2.3 From 739b01dde43c40398d9b0d177e9d330e06cdc2ae Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Wed, 20 Aug 2008 17:20:31 -0400 Subject: i915: Clear sarea_priv during lastclose. sarea_priv needs to be NULL before i915_initialized is called to properly reset it. The stale value produces a panic any time something opens/closes drm without calling initialize. i.e. version checking --- shared-core/i915_dma.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'shared-core/i915_dma.c') diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 84aafaae..77b4181c 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -1142,6 +1142,8 @@ void i915_driver_lastclose(struct drm_device * dev) if (drm_getsarea(dev) && dev_priv->sarea_priv) i915_do_cleanup_pageflip(dev); + if (dev_priv->sarea_priv) + dev_priv->sarea_priv = NULL; if (dev_priv->agp_heap) i915_mem_takedown(&(dev_priv->agp_heap)); #if defined(I915_HAVE_BUFFER) -- cgit v1.2.3 From c8fd8d3a0d37dc09165ac77c7d38938ef9942011 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Sun, 24 Aug 2008 15:53:17 -0400 Subject: i915: Fix i915 build on FreeBSD ifdef out all the gem stuff for now. Also, the msi stuff isn't portable the way it is... I'll try and fix that up sometime soon. --- shared-core/i915_dma.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'shared-core/i915_dma.c') diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 77b4181c..5a69b1f3 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -63,7 +63,7 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) last_head = ring->head; last_acthd = acthd; - msleep_interruptible (10); + DRM_UDELAY(10 * 1000); } return -EBUSY; @@ -126,7 +126,9 @@ void i915_ring_validate(struct drm_device *dev, const char *func, int line) DRM_ERROR("%s:%d head sw %x, hw %x. tail sw %x hw %x\n", func, line, ring->head, head, ring->tail, tail); +#ifdef __linux__ BUG_ON(1); +#endif } } #endif @@ -1070,9 +1072,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) ret = drm_addmap(dev, base, size, _DRM_REGISTERS, _DRM_KERNEL | _DRM_DRIVER, &dev_priv->mmio_map); - +#ifdef I915_HAVE_GEM i915_gem_load(dev); - +#endif DRM_SPININIT(&dev_priv->swaps_lock, "swap"); DRM_SPININIT(&dev_priv->user_irq_lock, "userirq"); @@ -1138,8 +1140,9 @@ void i915_driver_lastclose(struct drm_device * dev) dev_priv->val_bufs = NULL; } #endif +#ifdef I915_HAVE_GEM i915_gem_lastclose(dev); - +#endif if (drm_getsarea(dev) && dev_priv->sarea_priv) i915_do_cleanup_pageflip(dev); if (dev_priv->sarea_priv) @@ -1218,6 +1221,7 @@ struct drm_ioctl_desc i915_ioctls[] = { #ifdef I915_HAVE_BUFFER DRM_IOCTL_DEF(DRM_I915_EXECBUFFER, i915_execbuffer, DRM_AUTH), #endif +#ifdef I915_HAVE_GEM DRM_IOCTL_DEF(DRM_I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH), DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH), DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY), @@ -1234,6 +1238,7 @@ struct drm_ioctl_desc i915_ioctls[] = { DRM_IOCTL_DEF(DRM_I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, 0), DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, 0), DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, 0), +#endif }; int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); -- cgit v1.2.3 From 3f915f68e8f68fe0fc3d0e1eb8a18a16f8f397da Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Fri, 5 Sep 2008 11:52:53 -0400 Subject: i915: fix i915_ring_validate() --- shared-core/i915_dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'shared-core/i915_dma.c') diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 5a69b1f3..c874ce28 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -119,8 +119,8 @@ void i915_ring_validate(struct drm_device *dev, const char *func, int line) { drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_ring_buffer_t *ring = &(dev_priv->ring); - u32 tail = I915_READ(LP_RING+RING_TAIL) & HEAD_ADDR; - u32 head = I915_READ(LP_RING+RING_HEAD) & HEAD_ADDR; + u32 tail = I915_READ(PRB0_TAIL) & HEAD_ADDR; + u32 head = I915_READ(PRB0_HEAD) & HEAD_ADDR; if (tail != ring->tail) { DRM_ERROR("%s:%d head sw %x, hw %x. tail sw %x hw %x\n", -- cgit v1.2.3 From 6f2479c67432f764bfc4e248689f1737c1935237 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Sat, 6 Sep 2008 18:37:06 -0400 Subject: [FreeBSD] Ensure that drm_pci_alloc is never called while locks are held. --- shared-core/i915_dma.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'shared-core/i915_dma.c') diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index c874ce28..619e6ac2 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -72,16 +72,24 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) int i915_init_hardware_status(struct drm_device *dev) { drm_i915_private_t *dev_priv = dev->dev_private; - /* Program Hardware Status Page */ - dev_priv->status_page_dmah = - drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff); + drm_dma_handle_t *dmah; - if (!dev_priv->status_page_dmah) { + /* Program Hardware Status Page */ +#ifdef __FreeBSD__ + DRM_UNLOCK(); +#endif + dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff); +#ifdef __FreeBSD__ + DRM_LOCK(); +#endif + if (!dmah) { DRM_ERROR("Can not allocate hardware status page\n"); return -ENOMEM; } - dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr; - dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr; + + dev_priv->status_page_dmah = dmah; + dev_priv->hw_status_page = dmah->vaddr; + dev_priv->dma_status_page = dmah->busaddr; memset(dev_priv->hw_status_page, 0, PAGE_SIZE); -- cgit v1.2.3