Hello,
This small patch series fixes format switching for the primary plane, and adds support for the RGB888 format. There's not much else to tell, please see individual patches for details.
Laurent Pinchart (2): drm: mxsfb: Fix format changes for primary plane drm: mxsfb: Add RGB888 support on the primary plane
drivers/gpu/drm/mxsfb/mxsfb_drv.c | 5 +++++ drivers/gpu/drm/mxsfb/mxsfb_kms.c | 29 +++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-)
The primary plane's format is configured in registers that have no shadow support for live updates. They require the display to be fully reconfigured in order to be updated. Force a mode set when the primary plane format changes to ensure this.
Signed-off-by: Laurent Pinchart laurent.pinchart@ideasonboard.com --- drivers/gpu/drm/mxsfb/mxsfb_kms.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c index 6d512f346918..7a69d9f3a875 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c @@ -407,14 +407,28 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane, { struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev); struct drm_crtc_state *crtc_state; + int ret;
crtc_state = drm_atomic_get_new_crtc_state(plane_state->state, &mxsfb->crtc);
- return drm_atomic_helper_check_plane_state(plane_state, crtc_state, - DRM_PLANE_HELPER_NO_SCALING, - DRM_PLANE_HELPER_NO_SCALING, - false, true); + ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state, + DRM_PLANE_HELPER_NO_SCALING, + DRM_PLANE_HELPER_NO_SCALING, + false, true); + if (ret < 0) + return ret; + + /* + * Changing the primary plane format requires stopping the display + * controller first. Force a full mode set to do so. + */ + if (plane == mxsfb->crtc.primary && + plane_state->visible && plane->state->visible && + plane_state->fb->format != plane->state->fb->format) + crtc_state->mode_changed = true; + + return 0; }
static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
The primary plane can support the packed 24-bit RGB888 format. Enable it.
Signed-off-by: Laurent Pinchart laurent.pinchart@ideasonboard.com --- drivers/gpu/drm/mxsfb/mxsfb_drv.c | 5 +++++ drivers/gpu/drm/mxsfb/mxsfb_kms.c | 7 +++++++ 2 files changed, 12 insertions(+)
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c index d52cf8a506a5..5ec10f0f6508 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c @@ -97,6 +97,11 @@ mxsfb_fb_create(struct drm_device *dev, struct drm_file *file_priv, return ERR_PTR(-EINVAL); }
+ if (info->cpp[0] == 3 && mode_cmd->width % 4) { + dev_dbg(dev->dev, "24-bit RGB format requires a width aligned to 4\n"); + return ERR_PTR(-EINVAL); + } + return drm_gem_fb_create(dev, file_priv, mode_cmd); }
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c index 7a69d9f3a875..7a0d6bc58be0 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c @@ -75,6 +75,12 @@ static void mxsfb_set_formats(struct mxsfb_drm_private *mxsfb) ctrl |= CTRL_WORD_LENGTH_16; ctrl1 |= CTRL1_SET_BYTE_PACKAGING(0xf); break; + case DRM_FORMAT_RGB888: + dev_dbg(drm->dev, "Setting up RGB888 mode\n"); + ctrl |= CTRL_WORD_LENGTH_24; + /* Enable pixel packing, 4 pixels in 3 bytes. */ + ctrl1 |= CTRL1_SET_BYTE_PACKAGING(0xf); + break; case DRM_FORMAT_XRGB8888: dev_dbg(drm->dev, "Setting up XRGB8888 mode\n"); ctrl |= CTRL_WORD_LENGTH_24; @@ -523,6 +529,7 @@ static const struct drm_plane_funcs mxsfb_plane_funcs = {
static const uint32_t mxsfb_primary_plane_formats[] = { DRM_FORMAT_RGB565, + DRM_FORMAT_RGB888, DRM_FORMAT_XRGB8888, };
dri-devel@lists.freedesktop.org