|
@@ -45,6 +45,14 @@
|
|
|
#include <drm/i915_drm.h>
|
|
|
#include "i915_drv.h"
|
|
|
|
|
|
+static void intel_fbdev_invalidate(struct intel_fbdev *ifbdev)
|
|
|
+{
|
|
|
+ struct drm_i915_gem_object *obj = ifbdev->fb->obj;
|
|
|
+ unsigned int origin = ifbdev->vma->fence ? ORIGIN_GTT : ORIGIN_CPU;
|
|
|
+
|
|
|
+ intel_fb_obj_invalidate(obj, origin);
|
|
|
+}
|
|
|
+
|
|
|
static int intel_fbdev_set_par(struct fb_info *info)
|
|
|
{
|
|
|
struct drm_fb_helper *fb_helper = info->par;
|
|
@@ -53,12 +61,8 @@ static int intel_fbdev_set_par(struct fb_info *info)
|
|
|
int ret;
|
|
|
|
|
|
ret = drm_fb_helper_set_par(info);
|
|
|
-
|
|
|
- if (ret == 0) {
|
|
|
- mutex_lock(&fb_helper->dev->struct_mutex);
|
|
|
- intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
|
|
|
- mutex_unlock(&fb_helper->dev->struct_mutex);
|
|
|
- }
|
|
|
+ if (ret == 0)
|
|
|
+ intel_fbdev_invalidate(ifbdev);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -71,12 +75,8 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
|
|
|
int ret;
|
|
|
|
|
|
ret = drm_fb_helper_blank(blank, info);
|
|
|
-
|
|
|
- if (ret == 0) {
|
|
|
- mutex_lock(&fb_helper->dev->struct_mutex);
|
|
|
- intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
|
|
|
- mutex_unlock(&fb_helper->dev->struct_mutex);
|
|
|
- }
|
|
|
+ if (ret == 0)
|
|
|
+ intel_fbdev_invalidate(ifbdev);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -87,15 +87,11 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
|
|
|
struct drm_fb_helper *fb_helper = info->par;
|
|
|
struct intel_fbdev *ifbdev =
|
|
|
container_of(fb_helper, struct intel_fbdev, helper);
|
|
|
-
|
|
|
int ret;
|
|
|
- ret = drm_fb_helper_pan_display(var, info);
|
|
|
|
|
|
- if (ret == 0) {
|
|
|
- mutex_lock(&fb_helper->dev->struct_mutex);
|
|
|
- intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
|
|
|
- mutex_unlock(&fb_helper->dev->struct_mutex);
|
|
|
- }
|
|
|
+ ret = drm_fb_helper_pan_display(var, info);
|
|
|
+ if (ret == 0)
|
|
|
+ intel_fbdev_invalidate(ifbdev);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -838,11 +834,6 @@ void intel_fbdev_restore_mode(struct drm_device *dev)
|
|
|
if (!ifbdev->fb)
|
|
|
return;
|
|
|
|
|
|
- if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper)) {
|
|
|
- DRM_DEBUG("failed to restore crtc mode\n");
|
|
|
- } else {
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
- intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
- }
|
|
|
+ if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper) == 0)
|
|
|
+ intel_fbdev_invalidate(ifbdev);
|
|
|
}
|