|
@@ -1409,6 +1409,11 @@ void intel_setup_overlay(struct drm_device *dev)
|
|
|
overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL);
|
|
|
if (!overlay)
|
|
|
return;
|
|
|
+
|
|
|
+ mutex_lock(&dev->struct_mutex);
|
|
|
+ if (WARN_ON(dev_priv->overlay))
|
|
|
+ goto out_free;
|
|
|
+
|
|
|
overlay->dev = dev;
|
|
|
|
|
|
reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE);
|
|
@@ -1416,8 +1421,6 @@ void intel_setup_overlay(struct drm_device *dev)
|
|
|
goto out_free;
|
|
|
overlay->reg_bo = reg_bo;
|
|
|
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
-
|
|
|
if (OVERLAY_NEEDS_PHYSICAL(dev)) {
|
|
|
ret = i915_gem_attach_phys_object(dev, reg_bo,
|
|
|
I915_GEM_PHYS_OVERLAY_REGS,
|
|
@@ -1442,8 +1445,6 @@ void intel_setup_overlay(struct drm_device *dev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
-
|
|
|
/* init all values */
|
|
|
overlay->color_key = 0x0101fe;
|
|
|
overlay->brightness = -19;
|
|
@@ -1452,7 +1453,7 @@ void intel_setup_overlay(struct drm_device *dev)
|
|
|
|
|
|
regs = intel_overlay_map_regs(overlay);
|
|
|
if (!regs)
|
|
|
- goto out_free_bo;
|
|
|
+ goto out_unpin_bo;
|
|
|
|
|
|
memset(regs, 0, sizeof(struct overlay_registers));
|
|
|
update_polyphase_filter(regs);
|
|
@@ -1461,15 +1462,17 @@ void intel_setup_overlay(struct drm_device *dev)
|
|
|
intel_overlay_unmap_regs(overlay, regs);
|
|
|
|
|
|
dev_priv->overlay = overlay;
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
DRM_INFO("initialized overlay support\n");
|
|
|
return;
|
|
|
|
|
|
out_unpin_bo:
|
|
|
- i915_gem_object_unpin(reg_bo);
|
|
|
+ if (!OVERLAY_NEEDS_PHYSICAL(dev))
|
|
|
+ i915_gem_object_unpin(reg_bo);
|
|
|
out_free_bo:
|
|
|
drm_gem_object_unreference(®_bo->base);
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
out_free:
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
kfree(overlay);
|
|
|
return;
|
|
|
}
|