Merge tag 'drm-intel-fixes-2023-02-09' of git://anongit.freedesktop.org/drm/drm-intel...
authorDave Airlie <airlied@redhat.com>
Thu, 9 Feb 2023 23:47:20 +0000 (09:47 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 9 Feb 2023 23:48:01 +0000 (09:48 +1000)
- Display watermark fix (Ville)
- fbdev fix for PSR, FBC, DRRS (Jouni)
- Move fd_install after last use of fence (Rob)
- Initialize the obj flags for shmem objects (Aravind)
- Fix VBT DSI DVO port handling (Ville)

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/Y+UZ0rh2YlhTrE4t@intel.com
drivers/gpu/drm/i915/display/intel_bios.c
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/gpu/drm/i915/display/skl_watermark.c
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
drivers/gpu/drm/i915/gem/i915_gem_shmem.c

index 572a4e3..a491e6c 100644 (file)
@@ -2466,6 +2466,22 @@ static enum port dvo_port_to_port(struct drm_i915_private *i915,
                                          dvo_port);
 }
 
+static enum port
+dsi_dvo_port_to_port(struct drm_i915_private *i915, u8 dvo_port)
+{
+       switch (dvo_port) {
+       case DVO_PORT_MIPIA:
+               return PORT_A;
+       case DVO_PORT_MIPIC:
+               if (DISPLAY_VER(i915) >= 11)
+                       return PORT_B;
+               else
+                       return PORT_C;
+       default:
+               return PORT_NONE;
+       }
+}
+
 static int parse_bdb_230_dp_max_link_rate(const int vbt_max_link_rate)
 {
        switch (vbt_max_link_rate) {
@@ -3414,19 +3430,16 @@ bool intel_bios_is_dsi_present(struct drm_i915_private *i915,
 
                dvo_port = child->dvo_port;
 
-               if (dvo_port == DVO_PORT_MIPIA ||
-                   (dvo_port == DVO_PORT_MIPIB && DISPLAY_VER(i915) >= 11) ||
-                   (dvo_port == DVO_PORT_MIPIC && DISPLAY_VER(i915) < 11)) {
-                       if (port)
-                               *port = dvo_port - DVO_PORT_MIPIA;
-                       return true;
-               } else if (dvo_port == DVO_PORT_MIPIB ||
-                          dvo_port == DVO_PORT_MIPIC ||
-                          dvo_port == DVO_PORT_MIPID) {
+               if (dsi_dvo_port_to_port(i915, dvo_port) == PORT_NONE) {
                        drm_dbg_kms(&i915->drm,
                                    "VBT has unsupported DSI port %c\n",
                                    port_name(dvo_port - DVO_PORT_MIPIA));
+                       continue;
                }
+
+               if (port)
+                       *port = dsi_dvo_port_to_port(i915, dvo_port);
+               return true;
        }
 
        return false;
@@ -3511,7 +3524,7 @@ bool intel_bios_get_dsc_params(struct intel_encoder *encoder,
                if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT))
                        continue;
 
-               if (child->dvo_port - DVO_PORT_MIPIA == encoder->port) {
+               if (dsi_dvo_port_to_port(i915, child->dvo_port) == encoder->port) {
                        if (!devdata->dsc)
                                return false;
 
index 5575d7a..f76c06b 100644 (file)
@@ -328,8 +328,20 @@ out_unlock:
        return ret;
 }
 
+static int intelfb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
+{
+       if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+               return 0;
+
+       if (helper->fb->funcs->dirty)
+               return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+
+       return 0;
+}
+
 static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
        .fb_probe = intelfb_create,
+       .fb_dirty = intelfb_dirty,
 };
 
 static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
index e0766d1..1155464 100644 (file)
@@ -1587,7 +1587,8 @@ skl_crtc_allocate_plane_ddb(struct intel_atomic_state *state,
                                skl_check_wm_level(&wm->wm[level], ddb);
 
                        if (icl_need_wm1_wa(i915, plane_id) &&
-                           level == 1 && wm->wm[0].enable) {
+                           level == 1 && !wm->wm[level].enable &&
+                           wm->wm[0].enable) {
                                wm->wm[level].blocks = wm->wm[0].blocks;
                                wm->wm[level].lines = wm->wm[0].lines;
                                wm->wm[level].ignore_lines = wm->wm[0].ignore_lines;
index f266b68..0f2e056 100644 (file)
@@ -3483,6 +3483,13 @@ err_request:
                                   eb.composite_fence :
                                   &eb.requests[0]->fence);
 
+       if (unlikely(eb.gem_context->syncobj)) {
+               drm_syncobj_replace_fence(eb.gem_context->syncobj,
+                                         eb.composite_fence ?
+                                         eb.composite_fence :
+                                         &eb.requests[0]->fence);
+       }
+
        if (out_fence) {
                if (err == 0) {
                        fd_install(out_fence_fd, out_fence->file);
@@ -3494,13 +3501,6 @@ err_request:
                }
        }
 
-       if (unlikely(eb.gem_context->syncobj)) {
-               drm_syncobj_replace_fence(eb.gem_context->syncobj,
-                                         eb.composite_fence ?
-                                         eb.composite_fence :
-                                         &eb.requests[0]->fence);
-       }
-
        if (!out_fence && eb.composite_fence)
                dma_fence_put(eb.composite_fence);
 
index 9c759df..9377288 100644 (file)
@@ -579,7 +579,7 @@ static int shmem_object_init(struct intel_memory_region *mem,
        mapping_set_gfp_mask(mapping, mask);
        GEM_BUG_ON(!(mapping_gfp_mask(mapping) & __GFP_RECLAIM));
 
-       i915_gem_object_init(obj, &i915_gem_shmem_ops, &lock_class, 0);
+       i915_gem_object_init(obj, &i915_gem_shmem_ops, &lock_class, flags);
        obj->mem_flags |= I915_BO_FLAG_STRUCT_PAGE;
        obj->write_domain = I915_GEM_DOMAIN_CPU;
        obj->read_domains = I915_GEM_DOMAIN_CPU;