|
@@ -549,16 +549,33 @@ int drm_mode_getplane(struct drm_device *dev, void *data,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int drm_plane_check_pixel_format(const struct drm_plane *plane, u32 format)
|
|
|
+int drm_plane_check_pixel_format(struct drm_plane *plane,
|
|
|
+ u32 format, u64 modifier)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
|
|
|
for (i = 0; i < plane->format_count; i++) {
|
|
|
if (format == plane->format_types[i])
|
|
|
- return 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (i == plane->format_count)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (!plane->modifier_count)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ for (i = 0; i < plane->modifier_count; i++) {
|
|
|
+ if (modifier == plane->modifiers[i])
|
|
|
+ break;
|
|
|
}
|
|
|
+ if (i == plane->modifier_count)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- return -EINVAL;
|
|
|
+ if (plane->funcs->format_mod_supported &&
|
|
|
+ !plane->funcs->format_mod_supported(plane, format, modifier))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -602,12 +619,14 @@ static int __setplane_internal(struct drm_plane *plane,
|
|
|
}
|
|
|
|
|
|
/* Check whether this plane supports the fb pixel format. */
|
|
|
- ret = drm_plane_check_pixel_format(plane, fb->format->format);
|
|
|
+ ret = drm_plane_check_pixel_format(plane, fb->format->format,
|
|
|
+ fb->modifier);
|
|
|
if (ret) {
|
|
|
struct drm_format_name_buf format_name;
|
|
|
- DRM_DEBUG_KMS("Invalid pixel format %s\n",
|
|
|
- drm_get_format_name(fb->format->format,
|
|
|
- &format_name));
|
|
|
+ DRM_DEBUG_KMS("Invalid pixel format %s, modifier 0x%llx\n",
|
|
|
+ drm_get_format_name(fb->format->format,
|
|
|
+ &format_name),
|
|
|
+ fb->modifier);
|
|
|
goto out;
|
|
|
}
|
|
|
|