|
@@ -1176,11 +1176,11 @@ static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
|
|
|
return can_switch;
|
|
|
}
|
|
|
|
|
|
-static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
+static int i915_load_gem_init(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
unsigned long prealloc_size, gtt_size, mappable_size;
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
prealloc_size = dev_priv->mm.gtt->stolen_size;
|
|
|
gtt_size = dev_priv->mm.gtt->gtt_total_entries << PAGE_SHIFT;
|
|
@@ -1204,7 +1204,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
ret = i915_gem_init_ringbuffer(dev);
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
if (ret)
|
|
|
- goto out;
|
|
|
+ return ret;
|
|
|
|
|
|
/* Try to set up FBC with a reasonable compressed buffer size */
|
|
|
if (I915_HAS_FBC(dev) && i915_powersave) {
|
|
@@ -1222,6 +1222,13 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
|
|
|
/* Allow hardware batchbuffers unless told otherwise. */
|
|
|
dev_priv->allow_batchbuffer = 1;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ int ret;
|
|
|
|
|
|
ret = intel_parse_bios(dev);
|
|
|
if (ret)
|
|
@@ -1236,7 +1243,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
*/
|
|
|
ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
|
|
|
if (ret && ret != -ENODEV)
|
|
|
- goto cleanup_ringbuffer;
|
|
|
+ goto out;
|
|
|
|
|
|
intel_register_dsm_handler();
|
|
|
|
|
@@ -1253,10 +1260,16 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
|
|
|
intel_modeset_init(dev);
|
|
|
|
|
|
- ret = drm_irq_install(dev);
|
|
|
+ ret = i915_load_gem_init(dev);
|
|
|
if (ret)
|
|
|
goto cleanup_vga_switcheroo;
|
|
|
|
|
|
+ intel_modeset_gem_init(dev);
|
|
|
+
|
|
|
+ ret = drm_irq_install(dev);
|
|
|
+ if (ret)
|
|
|
+ goto cleanup_gem;
|
|
|
+
|
|
|
/* Always safe in the mode setting case. */
|
|
|
/* FIXME: do pre/post-mode set stuff in core KMS code */
|
|
|
dev->vblank_disable_allowed = 1;
|
|
@@ -1274,14 +1287,14 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
|
|
|
|
|
cleanup_irq:
|
|
|
drm_irq_uninstall(dev);
|
|
|
+cleanup_gem:
|
|
|
+ mutex_lock(&dev->struct_mutex);
|
|
|
+ i915_gem_cleanup_ringbuffer(dev);
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
cleanup_vga_switcheroo:
|
|
|
vga_switcheroo_unregister_client(dev->pdev);
|
|
|
cleanup_vga_client:
|
|
|
vga_client_register(dev->pdev, NULL, NULL, NULL);
|
|
|
-cleanup_ringbuffer:
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
- i915_gem_cleanup_ringbuffer(dev);
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
out:
|
|
|
return ret;
|
|
|
}
|