Merge branch 'topic/xehp-dg2-definitions-2021-07-21' into drm-intel-gt-next
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_plane.c
index 0dd4388..b373958 100644 (file)
  *     pairs supported by this plane. The blob is a struct
  *     drm_format_modifier_blob. Without this property the plane doesn't
  *     support buffers with modifiers. Userspace cannot change this property.
+ *
+ *     Note that userspace can check the &DRM_CAP_ADDFB2_MODIFIERS driver
+ *     capability for general modifier support. If this flag is set then every
+ *     plane will have the IN_FORMATS property, even when it only supports
+ *     DRM_FORMAT_MOD_LINEAR. Before linux kernel release v5.1 there have been
+ *     various bugs in this area with inconsistencies between the capability
+ *     flag and per-plane properties.
  */
 
 static unsigned int drm_num_planes(struct drm_device *dev)
@@ -277,8 +284,14 @@ static int __drm_universal_plane_init(struct drm_device *dev,
                        format_modifier_count++;
        }
 
-       if (format_modifier_count)
+       /* autoset the cap and check for consistency across all planes */
+       if (format_modifier_count) {
+               drm_WARN_ON(dev, !config->allow_fb_modifiers &&
+                           !list_empty(&config->plane_list));
                config->allow_fb_modifiers = true;
+       } else {
+               drm_WARN_ON(dev, config->allow_fb_modifiers);
+       }
 
        plane->modifier_count = format_modifier_count;
        plane->modifiers = kmalloc_array(format_modifier_count,
@@ -360,6 +373,9 @@ static int __drm_universal_plane_init(struct drm_device *dev,
  * drm_universal_plane_init() to let the DRM managed resource infrastructure
  * take care of cleanup and deallocation.
  *
+ * Drivers supporting modifiers must set @format_modifiers on all their planes,
+ * even those that only support DRM_FORMAT_MOD_LINEAR.
+ *
  * Returns:
  * Zero on success, error code on failure.
  */