Commit 23163a7d authored by Ville Syrjälä's avatar Ville Syrjälä

drm: Check that the plane supports the request format+modifier combo

Currently we only check that the plane supports the pixel format of the
fb we're about to feed to it. Extend it to check also the modifier, and
more specifically that the combination of the format and modifier is
supported.

Cc: dri-devel@lists.freedesktop.org
Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Daniel Stone <daniels@collabora.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171222192231.17981-8-ville.syrjala@linux.intel.comReviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent a22f1d80
...@@ -882,12 +882,14 @@ static int drm_atomic_plane_check(struct drm_plane *plane, ...@@ -882,12 +882,14 @@ static int drm_atomic_plane_check(struct drm_plane *plane,
} }
/* Check whether this plane supports the fb pixel format. */ /* Check whether this plane supports the fb pixel format. */
ret = drm_plane_check_pixel_format(plane, state->fb->format->format); ret = drm_plane_check_pixel_format(plane, state->fb->format->format,
state->fb->modifier);
if (ret) { if (ret) {
struct drm_format_name_buf format_name; struct drm_format_name_buf format_name;
DRM_DEBUG_ATOMIC("Invalid pixel format %s\n", DRM_DEBUG_ATOMIC("Invalid pixel format %s, modifier 0x%llx\n",
drm_get_format_name(state->fb->format->format, drm_get_format_name(state->fb->format->format,
&format_name)); &format_name),
state->fb->modifier);
return ret; return ret;
} }
......
...@@ -629,12 +629,14 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -629,12 +629,14 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
*/ */
if (!crtc->primary->format_default) { if (!crtc->primary->format_default) {
ret = drm_plane_check_pixel_format(crtc->primary, ret = drm_plane_check_pixel_format(crtc->primary,
fb->format->format); fb->format->format,
fb->modifier);
if (ret) { if (ret) {
struct drm_format_name_buf format_name; struct drm_format_name_buf format_name;
DRM_DEBUG_KMS("Invalid pixel format %s\n", DRM_DEBUG_KMS("Invalid pixel format %s, modifier 0x%llx\n",
drm_get_format_name(fb->format->format, drm_get_format_name(fb->format->format,
&format_name)); &format_name),
fb->modifier);
goto out; goto out;
} }
} }
......
...@@ -196,8 +196,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, ...@@ -196,8 +196,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
/* drm_plane.c */ /* drm_plane.c */
int drm_plane_register_all(struct drm_device *dev); int drm_plane_register_all(struct drm_device *dev);
void drm_plane_unregister_all(struct drm_device *dev); void drm_plane_unregister_all(struct drm_device *dev);
int drm_plane_check_pixel_format(const struct drm_plane *plane, int drm_plane_check_pixel_format(struct drm_plane *plane,
u32 format); u32 format, u64 modifier);
/* drm_bridge.c */ /* drm_bridge.c */
void drm_bridge_detach(struct drm_bridge *bridge); void drm_bridge_detach(struct drm_bridge *bridge);
......
...@@ -549,16 +549,33 @@ int drm_mode_getplane(struct drm_device *dev, void *data, ...@@ -549,16 +549,33 @@ int drm_mode_getplane(struct drm_device *dev, void *data,
return 0; 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; unsigned int i;
for (i = 0; i < plane->format_count; i++) { for (i = 0; i < plane->format_count; i++) {
if (format == plane->format_types[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, ...@@ -602,12 +619,14 @@ static int __setplane_internal(struct drm_plane *plane,
} }
/* Check whether this plane supports the fb pixel format. */ /* 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) { if (ret) {
struct drm_format_name_buf format_name; struct drm_format_name_buf format_name;
DRM_DEBUG_KMS("Invalid pixel format %s\n", DRM_DEBUG_KMS("Invalid pixel format %s, modifier 0x%llx\n",
drm_get_format_name(fb->format->format, drm_get_format_name(fb->format->format,
&format_name)); &format_name),
fb->modifier);
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment