From 4c5b36ee73359b92355394adbd722823bf66806f Mon Sep 17 00:00:00 2001 From: Eugeniy Paltsev Date: Tue, 19 Nov 2019 17:41:44 +0300 Subject: [PATCH 1/4] DRM: ARC: PGU: fix framebuffer format switching Current implementation don't switch to RGB565 format if BGR888 was previously used. Fix that. Signed-off-by: Eugeniy Paltsev Signed-off-by: Alexey Brodkin --- drivers/gpu/drm/arc/arcpgu_crtc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c b/drivers/gpu/drm/arc/arcpgu_crtc.c index dfaddbb7da0db..31d9824c46cc1 100644 --- a/drivers/gpu/drm/arc/arcpgu_crtc.c +++ b/drivers/gpu/drm/arc/arcpgu_crtc.c @@ -32,6 +32,7 @@ static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc) uint32_t pixel_format = fb->format->format; struct simplefb_format *format = NULL; int i; + u32 reg_ctrl; for (i = 0; i < ARRAY_SIZE(supported_formats); i++) { if (supported_formats[i].fourcc == pixel_format) @@ -41,11 +42,12 @@ static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc) if (WARN_ON(!format)) return; - if (format->fourcc == DRM_FORMAT_RGB888) - arc_pgu_write(arcpgu, ARCPGU_REG_CTRL, - arc_pgu_read(arcpgu, ARCPGU_REG_CTRL) | - ARCPGU_MODE_RGB888_MASK); - + reg_ctrl = arc_pgu_read(arcpgu, ARCPGU_REG_CTRL); + if (format->fourcc == DRM_FORMAT_RGB565) + reg_ctrl &= ~ARCPGU_MODE_RGB888_MASK; + else + reg_ctrl |= ARCPGU_MODE_RGB888_MASK; + arc_pgu_write(arcpgu, ARCPGU_REG_CTRL, reg_ctrl); } static const struct drm_crtc_funcs arc_pgu_crtc_funcs = { From 491b14b9ba92e006a8b9d3c973809872b01dd095 Mon Sep 17 00:00:00 2001 From: Eugeniy Paltsev Date: Tue, 19 Nov 2019 17:41:45 +0300 Subject: [PATCH 2/4] DRM: ARC: PGU: cleanup supported format list code Get rid of 'simplefb_format' structure usage as we only use its 'fourcc' field. Signed-off-by: Eugeniy Paltsev Signed-off-by: Alexey Brodkin --- drivers/gpu/drm/arc/arcpgu_crtc.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c b/drivers/gpu/drm/arc/arcpgu_crtc.c index 31d9824c46cc1..5473b19a52eec 100644 --- a/drivers/gpu/drm/arc/arcpgu_crtc.c +++ b/drivers/gpu/drm/arc/arcpgu_crtc.c @@ -20,9 +20,9 @@ #define ENCODE_PGU_XY(x, y) ((((x) - 1) << 16) | ((y) - 1)) -static struct simplefb_format supported_formats[] = { - { "r5g6b5", 16, {11, 5}, {5, 6}, {0, 5}, {0, 0}, DRM_FORMAT_RGB565 }, - { "r8g8b8", 24, {16, 8}, {8, 8}, {0, 8}, {0, 0}, DRM_FORMAT_RGB888 }, +static const u32 arc_pgu_supported_formats[] = { + DRM_FORMAT_RGB565, + DRM_FORMAT_RGB888, }; static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc) @@ -30,20 +30,20 @@ static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc) struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc); const struct drm_framebuffer *fb = crtc->primary->state->fb; uint32_t pixel_format = fb->format->format; - struct simplefb_format *format = NULL; + u32 format = DRM_FORMAT_INVALID; int i; u32 reg_ctrl; - for (i = 0; i < ARRAY_SIZE(supported_formats); i++) { - if (supported_formats[i].fourcc == pixel_format) - format = &supported_formats[i]; + for (i = 0; i < ARRAY_SIZE(arc_pgu_supported_formats); i++) { + if (arc_pgu_supported_formats[i] == pixel_format) + format = arc_pgu_supported_formats[i]; } - if (WARN_ON(!format)) + if (WARN_ON(format == DRM_FORMAT_INVALID)) return; reg_ctrl = arc_pgu_read(arcpgu, ARCPGU_REG_CTRL); - if (format->fourcc == DRM_FORMAT_RGB565) + if (format == DRM_FORMAT_RGB565) reg_ctrl &= ~ARCPGU_MODE_RGB888_MASK; else reg_ctrl |= ARCPGU_MODE_RGB888_MASK; @@ -195,18 +195,15 @@ static struct drm_plane *arc_pgu_plane_init(struct drm_device *drm) { struct arcpgu_drm_private *arcpgu = drm->dev_private; struct drm_plane *plane = NULL; - u32 formats[ARRAY_SIZE(supported_formats)], i; int ret; plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL); if (!plane) return ERR_PTR(-ENOMEM); - for (i = 0; i < ARRAY_SIZE(supported_formats); i++) - formats[i] = supported_formats[i].fourcc; - ret = drm_universal_plane_init(drm, plane, 0xff, &arc_pgu_plane_funcs, - formats, ARRAY_SIZE(formats), + arc_pgu_supported_formats, + ARRAY_SIZE(arc_pgu_supported_formats), NULL, DRM_PLANE_TYPE_PRIMARY, NULL); if (ret) From 5908a3bd175d42df5c9946e78cee2d0221787bd4 Mon Sep 17 00:00:00 2001 From: Eugeniy Paltsev Date: Tue, 19 Nov 2019 17:41:46 +0300 Subject: [PATCH 3/4] DRM: ARC: PGU: replace unsupported by HW RGB888 format by XRGB888 ARC PGU doesn't support RGB888 (24 bit) format but supports XRGB888 (32 bit) format. Fix incorrect format list in a driver. Signed-off-by: Eugeniy Paltsev Signed-off-by: Alexey Brodkin --- drivers/gpu/drm/arc/arcpgu_crtc.c | 6 +++--- drivers/gpu/drm/arc/arcpgu_regs.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c b/drivers/gpu/drm/arc/arcpgu_crtc.c index 5473b19a52eec..980e00180e6fe 100644 --- a/drivers/gpu/drm/arc/arcpgu_crtc.c +++ b/drivers/gpu/drm/arc/arcpgu_crtc.c @@ -22,7 +22,7 @@ static const u32 arc_pgu_supported_formats[] = { DRM_FORMAT_RGB565, - DRM_FORMAT_RGB888, + DRM_FORMAT_XRGB8888, }; static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc) @@ -44,9 +44,9 @@ static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc) reg_ctrl = arc_pgu_read(arcpgu, ARCPGU_REG_CTRL); if (format == DRM_FORMAT_RGB565) - reg_ctrl &= ~ARCPGU_MODE_RGB888_MASK; + reg_ctrl &= ~ARCPGU_MODE_XRGB8888; else - reg_ctrl |= ARCPGU_MODE_RGB888_MASK; + reg_ctrl |= ARCPGU_MODE_XRGB8888; arc_pgu_write(arcpgu, ARCPGU_REG_CTRL, reg_ctrl); } diff --git a/drivers/gpu/drm/arc/arcpgu_regs.h b/drivers/gpu/drm/arc/arcpgu_regs.h index dab2c380f7f38..b689a382d556c 100644 --- a/drivers/gpu/drm/arc/arcpgu_regs.h +++ b/drivers/gpu/drm/arc/arcpgu_regs.h @@ -25,7 +25,7 @@ #define ARCPGU_CTRL_VS_POL_OFST 0x3 #define ARCPGU_CTRL_HS_POL_MASK 0x1 #define ARCPGU_CTRL_HS_POL_OFST 0x4 -#define ARCPGU_MODE_RGB888_MASK 0x04 +#define ARCPGU_MODE_XRGB8888 BIT(2) #define ARCPGU_STAT_BUSY_MASK 0x02 #endif From 0ff916e2ef6fb742e4906aac26c470314b59bae8 Mon Sep 17 00:00:00 2001 From: Eugeniy Paltsev Date: Tue, 19 Nov 2019 17:41:47 +0300 Subject: [PATCH 4/4] DRM: ARC: PGU: add ARGB8888 format to supported format list As we ignore first 8 bit of 32 bit pixel value we can add ARGB8888 format as alias of XRGB8888. Signed-off-by: Eugeniy Paltsev Signed-off-by: Alexey Brodkin --- drivers/gpu/drm/arc/arcpgu_crtc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c b/drivers/gpu/drm/arc/arcpgu_crtc.c index 980e00180e6fe..8ae1e1f97a735 100644 --- a/drivers/gpu/drm/arc/arcpgu_crtc.c +++ b/drivers/gpu/drm/arc/arcpgu_crtc.c @@ -23,6 +23,7 @@ static const u32 arc_pgu_supported_formats[] = { DRM_FORMAT_RGB565, DRM_FORMAT_XRGB8888, + DRM_FORMAT_ARGB8888, }; static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc)