Merge tag 'drm-misc-fixes-2022-12-08' of git://anongit.freedesktop.org/drm/drm-misc...
authorDave Airlie <airlied@redhat.com>
Fri, 9 Dec 2022 00:11:05 +0000 (10:11 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 9 Dec 2022 00:11:06 +0000 (10:11 +1000)
drm-misc-fixes for v6.1 final?:
- Fix polarity bug in bridge/ti-sn65dsi86.
- Prefer 8-bit RGB fallback before any YUV mode in dw-hdmi, since some
  panels lie about YUV support.
- Fixes to shmem-helper error paths.
- Small vmwgfx to stop using screen objects when SEV is active.

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/8110f02d-d155-926e-8674-c88b806c3a3a@linux.intel.com
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
drivers/gpu/drm/bridge/ti-sn65dsi86.c
drivers/gpu/drm/drm_gem_shmem_helper.c
drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c

index 40d8ca3..aa51c61 100644 (file)
@@ -2720,6 +2720,9 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
         * if supported. In any case the default RGB888 format is added
         */
 
+       /* Default 8bit RGB fallback */
+       output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24;
+
        if (max_bpc >= 16 && info->bpc == 16) {
                if (info->color_formats & DRM_COLOR_FORMAT_YCBCR444)
                        output_fmts[i++] = MEDIA_BUS_FMT_YUV16_1X48;
@@ -2753,9 +2756,6 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
        if (info->color_formats & DRM_COLOR_FORMAT_YCBCR444)
                output_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24;
 
-       /* Default 8bit RGB fallback */
-       output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24;
-
        *num_output_fmts = i;
 
        return output_fmts;
index 3c35619..eb24322 100644 (file)
@@ -931,9 +931,9 @@ static void ti_sn_bridge_set_video_timings(struct ti_sn65dsi86 *pdata)
                &pdata->bridge.encoder->crtc->state->adjusted_mode;
        u8 hsync_polarity = 0, vsync_polarity = 0;
 
-       if (mode->flags & DRM_MODE_FLAG_PHSYNC)
+       if (mode->flags & DRM_MODE_FLAG_NHSYNC)
                hsync_polarity = CHA_HSYNC_POLARITY;
-       if (mode->flags & DRM_MODE_FLAG_PVSYNC)
+       if (mode->flags & DRM_MODE_FLAG_NVSYNC)
                vsync_polarity = CHA_VSYNC_POLARITY;
 
        ti_sn65dsi86_write_u16(pdata, SN_CHA_ACTIVE_LINE_LENGTH_LOW_REG,
index 35138f8..b602cd7 100644 (file)
@@ -571,12 +571,20 @@ static void drm_gem_shmem_vm_open(struct vm_area_struct *vma)
 {
        struct drm_gem_object *obj = vma->vm_private_data;
        struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-       int ret;
 
        WARN_ON(shmem->base.import_attach);
 
-       ret = drm_gem_shmem_get_pages(shmem);
-       WARN_ON_ONCE(ret != 0);
+       mutex_lock(&shmem->pages_lock);
+
+       /*
+        * We should have already pinned the pages when the buffer was first
+        * mmap'd, vm_open() just grabs an additional reference for the new
+        * mm the vma is getting copied into (ie. on fork()).
+        */
+       if (!WARN_ON_ONCE(!shmem->pages_use_count))
+               shmem->pages_use_count++;
+
+       mutex_unlock(&shmem->pages_lock);
 
        drm_gem_vm_open(vma);
 }
@@ -622,10 +630,8 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct
        }
 
        ret = drm_gem_shmem_get_pages(shmem);
-       if (ret) {
-               drm_gem_vm_close(vma);
+       if (ret)
                return ret;
-       }
 
        vma->vm_flags |= VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
        vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
index 089046f..50fa3df 100644 (file)
@@ -1085,21 +1085,21 @@ int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,
        reset_ppn_array(pdesc->strsPPNs, ARRAY_SIZE(pdesc->strsPPNs));
 
        /* Pin mksGuestStat user pages and store those in the instance descriptor */
-       nr_pinned_stat = pin_user_pages(arg->stat, num_pages_stat, FOLL_LONGTERM, pages_stat, NULL);
+       nr_pinned_stat = pin_user_pages_fast(arg->stat, num_pages_stat, FOLL_LONGTERM, pages_stat);
        if (num_pages_stat != nr_pinned_stat)
                goto err_pin_stat;
 
        for (i = 0; i < num_pages_stat; ++i)
                pdesc->statPPNs[i] = page_to_pfn(pages_stat[i]);
 
-       nr_pinned_info = pin_user_pages(arg->info, num_pages_info, FOLL_LONGTERM, pages_info, NULL);
+       nr_pinned_info = pin_user_pages_fast(arg->info, num_pages_info, FOLL_LONGTERM, pages_info);
        if (num_pages_info != nr_pinned_info)
                goto err_pin_info;
 
        for (i = 0; i < num_pages_info; ++i)
                pdesc->infoPPNs[i] = page_to_pfn(pages_info[i]);
 
-       nr_pinned_strs = pin_user_pages(arg->strs, num_pages_strs, FOLL_LONGTERM, pages_strs, NULL);
+       nr_pinned_strs = pin_user_pages_fast(arg->strs, num_pages_strs, FOLL_LONGTERM, pages_strs);
        if (num_pages_strs != nr_pinned_strs)
                goto err_pin_strs;
 
index ecd3c2f..9c79873 100644 (file)
@@ -949,6 +949,10 @@ int vmw_kms_sou_init_display(struct vmw_private *dev_priv)
        struct drm_device *dev = &dev_priv->drm;
        int i, ret;
 
+       /* Screen objects won't work if GMR's aren't available */
+       if (!dev_priv->has_gmr)
+               return -ENOSYS;
+
        if (!(dev_priv->capabilities & SVGA_CAP_SCREEN_OBJECT_2)) {
                return -ENOSYS;
        }