diff options
| author | Eric Anholt <eric@anholt.net> | 2009-08-03 19:09:16 -0400 |
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2009-08-05 14:20:53 -0400 |
| commit | 9c9fe1f841745184bbc5460c6f3909fded3b929b (patch) | |
| tree | 7633580a02803cbe32e5ebda4a834f436ebba5c0 /drivers/gpu | |
| parent | 0c2e39525b3b53a97a0202c5f35058147e53977e (diff) | |
drm/i915: Use our own workqueue to avoid wedging the system along with the GPU.
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 5 |
4 files changed, 19 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 8c4783180bf6..50d1f782768c 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1186,6 +1186,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1186 | if (ret) | 1186 | if (ret) |
| 1187 | goto out_iomapfree; | 1187 | goto out_iomapfree; |
| 1188 | 1188 | ||
| 1189 | dev_priv->wq = create_workqueue("i915"); | ||
| 1190 | if (dev_priv->wq == NULL) { | ||
| 1191 | DRM_ERROR("Failed to create our workqueue.\n"); | ||
| 1192 | ret = -ENOMEM; | ||
| 1193 | goto out_iomapfree; | ||
| 1194 | } | ||
| 1195 | |||
| 1189 | /* enable GEM by default */ | 1196 | /* enable GEM by default */ |
| 1190 | dev_priv->has_gem = 1; | 1197 | dev_priv->has_gem = 1; |
| 1191 | 1198 | ||
| @@ -1211,7 +1218,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1211 | if (!I915_NEED_GFX_HWS(dev)) { | 1218 | if (!I915_NEED_GFX_HWS(dev)) { |
| 1212 | ret = i915_init_phys_hws(dev); | 1219 | ret = i915_init_phys_hws(dev); |
| 1213 | if (ret != 0) | 1220 | if (ret != 0) |
| 1214 | goto out_iomapfree; | 1221 | goto out_workqueue_free; |
| 1215 | } | 1222 | } |
| 1216 | 1223 | ||
| 1217 | i915_get_mem_freq(dev); | 1224 | i915_get_mem_freq(dev); |
| @@ -1245,7 +1252,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1245 | ret = i915_load_modeset_init(dev, prealloc_size, agp_size); | 1252 | ret = i915_load_modeset_init(dev, prealloc_size, agp_size); |
| 1246 | if (ret < 0) { | 1253 | if (ret < 0) { |
| 1247 | DRM_ERROR("failed to init modeset\n"); | 1254 | DRM_ERROR("failed to init modeset\n"); |
| 1248 | goto out_rmmap; | 1255 | goto out_workqueue_free; |
| 1249 | } | 1256 | } |
| 1250 | } | 1257 | } |
| 1251 | 1258 | ||
| @@ -1256,6 +1263,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1256 | 1263 | ||
| 1257 | return 0; | 1264 | return 0; |
| 1258 | 1265 | ||
| 1266 | out_workqueue_free: | ||
| 1267 | destroy_workqueue(dev_priv->wq); | ||
| 1259 | out_iomapfree: | 1268 | out_iomapfree: |
| 1260 | io_mapping_free(dev_priv->mm.gtt_mapping); | 1269 | io_mapping_free(dev_priv->mm.gtt_mapping); |
| 1261 | out_rmmap: | 1270 | out_rmmap: |
| @@ -1269,6 +1278,8 @@ int i915_driver_unload(struct drm_device *dev) | |||
| 1269 | { | 1278 | { |
| 1270 | struct drm_i915_private *dev_priv = dev->dev_private; | 1279 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 1271 | 1280 | ||
| 1281 | destroy_workqueue(dev_priv->wq); | ||
| 1282 | |||
| 1272 | io_mapping_free(dev_priv->mm.gtt_mapping); | 1283 | io_mapping_free(dev_priv->mm.gtt_mapping); |
| 1273 | if (dev_priv->mm.gtt_mtrr >= 0) { | 1284 | if (dev_priv->mm.gtt_mtrr >= 0) { |
| 1274 | mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base, | 1285 | mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base, |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5f3a259d95e9..7537f57d8a87 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -231,6 +231,7 @@ typedef struct drm_i915_private { | |||
| 231 | spinlock_t error_lock; | 231 | spinlock_t error_lock; |
| 232 | struct drm_i915_error_state *first_error; | 232 | struct drm_i915_error_state *first_error; |
| 233 | struct work_struct error_work; | 233 | struct work_struct error_work; |
| 234 | struct workqueue_struct *wq; | ||
| 234 | 235 | ||
| 235 | /* Register state */ | 236 | /* Register state */ |
| 236 | u8 saveLBB; | 237 | u8 saveLBB; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5bf420378b6d..140bee142fc2 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1570,7 +1570,7 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv, | |||
| 1570 | } | 1570 | } |
| 1571 | 1571 | ||
| 1572 | if (was_empty && !dev_priv->mm.suspended) | 1572 | if (was_empty && !dev_priv->mm.suspended) |
| 1573 | schedule_delayed_work(&dev_priv->mm.retire_work, HZ); | 1573 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); |
| 1574 | return seqno; | 1574 | return seqno; |
| 1575 | } | 1575 | } |
| 1576 | 1576 | ||
| @@ -1719,7 +1719,7 @@ i915_gem_retire_work_handler(struct work_struct *work) | |||
| 1719 | i915_gem_retire_requests(dev); | 1719 | i915_gem_retire_requests(dev); |
| 1720 | if (!dev_priv->mm.suspended && | 1720 | if (!dev_priv->mm.suspended && |
| 1721 | !list_empty(&dev_priv->mm.request_list)) | 1721 | !list_empty(&dev_priv->mm.request_list)) |
| 1722 | schedule_delayed_work(&dev_priv->mm.retire_work, HZ); | 1722 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); |
| 1723 | mutex_unlock(&dev->struct_mutex); | 1723 | mutex_unlock(&dev->struct_mutex); |
| 1724 | } | 1724 | } |
| 1725 | 1725 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index f340b3fd54e6..83aee80e77a6 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -482,7 +482,7 @@ static void i915_handle_error(struct drm_device *dev) | |||
| 482 | I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | 482 | I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); |
| 483 | } | 483 | } |
| 484 | 484 | ||
| 485 | schedule_work(&dev_priv->error_work); | 485 | queue_work(dev_priv->wq, &dev_priv->error_work); |
| 486 | } | 486 | } |
| 487 | 487 | ||
| 488 | irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | 488 | irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) |
| @@ -560,7 +560,8 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
| 560 | DRM_DEBUG("hotplug event received, stat 0x%08x\n", | 560 | DRM_DEBUG("hotplug event received, stat 0x%08x\n", |
| 561 | hotplug_status); | 561 | hotplug_status); |
| 562 | if (hotplug_status & dev_priv->hotplug_supported_mask) | 562 | if (hotplug_status & dev_priv->hotplug_supported_mask) |
| 563 | schedule_work(&dev_priv->hotplug_work); | 563 | queue_work(dev_priv->wq, |
| 564 | &dev_priv->hotplug_work); | ||
| 564 | 565 | ||
| 565 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); | 566 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
| 566 | I915_READ(PORT_HOTPLUG_STAT); | 567 | I915_READ(PORT_HOTPLUG_STAT); |
