Commit 1c0a80f1 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov

Revert "drm/atomic: Loosen FB atomic checks"

This reverts commit f1e75da5.

Although the Solid Fill planes patchset got all reviews and
acknowledgements, it doesn't fulfill requirements for the new uABI. It
has neither corresponding open-source userspace implementation nor the
IGT tests coverage. Reverting this patchset until userspace obligations
are fulfilled.
Acked-by: default avatarSimon Ser <contact@emersion.fr>
Acked-by: default avatarMaxime Ripard <mripard@kernel.org>
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20231204131455.19023-2-dmitry.baryshkov@linaro.org
parent d0b3c318
...@@ -674,16 +674,17 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state, ...@@ -674,16 +674,17 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
{ {
struct drm_plane *plane = new_plane_state->plane; struct drm_plane *plane = new_plane_state->plane;
struct drm_crtc *crtc = new_plane_state->crtc; struct drm_crtc *crtc = new_plane_state->crtc;
const struct drm_framebuffer *fb = new_plane_state->fb;
int ret; int ret;
/* either *both* CRTC and pixel source must be set, or neither */ /* either *both* CRTC and FB must be set, or neither */
if (crtc && !drm_plane_has_visible_data(new_plane_state)) { if (crtc && !fb) {
drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] CRTC set but no visible data\n", drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] CRTC set but no FB\n",
plane->base.id, plane->name); plane->base.id, plane->name);
return -EINVAL; return -EINVAL;
} else if (drm_plane_has_visible_data(new_plane_state) && !crtc) { } else if (fb && !crtc) {
drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] Source %d has visible data but no CRTC\n", drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] FB set but no CRTC\n",
plane->base.id, plane->name, new_plane_state->pixel_source); plane->base.id, plane->name);
return -EINVAL; return -EINVAL;
} }
...@@ -714,11 +715,9 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state, ...@@ -714,11 +715,9 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
} }
if (new_plane_state->pixel_source == DRM_PLANE_PIXEL_SOURCE_FB && new_plane_state->fb) {
ret = drm_atomic_plane_check_fb(new_plane_state); ret = drm_atomic_plane_check_fb(new_plane_state);
if (ret) if (ret)
return ret; return ret;
}
if (plane_switching_crtc(old_plane_state, new_plane_state)) { if (plane_switching_crtc(old_plane_state, new_plane_state)) {
drm_dbg_atomic(plane->dev, drm_dbg_atomic(plane->dev,
......
...@@ -861,6 +861,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, ...@@ -861,6 +861,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
bool can_position, bool can_position,
bool can_update_disabled) bool can_update_disabled)
{ {
struct drm_framebuffer *fb = plane_state->fb;
struct drm_rect *src = &plane_state->src; struct drm_rect *src = &plane_state->src;
struct drm_rect *dst = &plane_state->dst; struct drm_rect *dst = &plane_state->dst;
unsigned int rotation = plane_state->rotation; unsigned int rotation = plane_state->rotation;
...@@ -872,7 +873,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, ...@@ -872,7 +873,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
*src = drm_plane_state_src(plane_state); *src = drm_plane_state_src(plane_state);
*dst = drm_plane_state_dest(plane_state); *dst = drm_plane_state_dest(plane_state);
if (!drm_plane_has_visible_data(plane_state)) { if (!fb) {
plane_state->visible = false; plane_state->visible = false;
return 0; return 0;
} }
...@@ -889,15 +890,11 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, ...@@ -889,15 +890,11 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
return -EINVAL; return -EINVAL;
} }
/* Check that selected pixel source is valid */
if (plane_state->pixel_source == DRM_PLANE_PIXEL_SOURCE_FB && plane_state->fb) {
struct drm_framebuffer *fb = plane_state->fb;
drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation); drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
/* Check scaling */ /* Check scaling */
hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale); hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale); vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
if (hscale < 0 || vscale < 0) { if (hscale < 0 || vscale < 0) {
drm_dbg_kms(plane_state->plane->dev, drm_dbg_kms(plane_state->plane->dev,
"Invalid scaling of plane\n"); "Invalid scaling of plane\n");
...@@ -910,10 +907,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, ...@@ -910,10 +907,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2); drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
plane_state->visible = drm_rect_clip_scaled(src, dst, &clip); plane_state->visible = drm_rect_clip_scaled(src, dst, &clip);
drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation); drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
} else if (drm_plane_solid_fill_enabled(plane_state)) {
plane_state->visible = true;
}
if (!plane_state->visible) if (!plane_state->visible)
/* /*
......
...@@ -256,8 +256,8 @@ drm_atomic_plane_disabling(struct drm_plane_state *old_plane_state, ...@@ -256,8 +256,8 @@ drm_atomic_plane_disabling(struct drm_plane_state *old_plane_state,
* Anything else should be considered a bug in the atomic core, so we * Anything else should be considered a bug in the atomic core, so we
* gently warn about it. * gently warn about it.
*/ */
WARN_ON((new_plane_state->crtc == NULL && drm_plane_has_visible_data(new_plane_state)) || WARN_ON((new_plane_state->crtc == NULL && new_plane_state->fb != NULL) ||
(new_plane_state->crtc != NULL && !drm_plane_has_visible_data(new_plane_state))); (new_plane_state->crtc != NULL && new_plane_state->fb == NULL));
return old_plane_state->crtc && !new_plane_state->crtc; return old_plane_state->crtc && !new_plane_state->crtc;
} }
......
...@@ -1016,35 +1016,6 @@ static inline struct drm_plane *drm_plane_find(struct drm_device *dev, ...@@ -1016,35 +1016,6 @@ static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
#define drm_for_each_plane(plane, dev) \ #define drm_for_each_plane(plane, dev) \
list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)
/**
* drm_plane_solid_fill_enabled - Check if solid fill is enabled on plane
* @state: plane state
*
* Returns:
* Whether the plane has been assigned a solid_fill_blob
*/
static inline bool drm_plane_solid_fill_enabled(struct drm_plane_state *state)
{
if (!state)
return false;
return state->pixel_source == DRM_PLANE_PIXEL_SOURCE_SOLID_FILL && state->solid_fill_blob;
}
static inline bool drm_plane_has_visible_data(const struct drm_plane_state *state)
{
switch (state->pixel_source) {
case DRM_PLANE_PIXEL_SOURCE_NONE:
return false;
case DRM_PLANE_PIXEL_SOURCE_SOLID_FILL:
return state->solid_fill_blob != NULL;
case DRM_PLANE_PIXEL_SOURCE_FB:
default:
WARN_ON(state->pixel_source != DRM_PLANE_PIXEL_SOURCE_FB);
}
return state->fb != NULL;
}
bool drm_any_plane_has_format(struct drm_device *dev, bool drm_any_plane_has_format(struct drm_device *dev,
u32 format, u64 modifier); u32 format, u64 modifier);
......
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