From c58dcab081b270c8b56d10de72b859728d237dd1 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 30 May 2023 12:20:52 +0300 Subject: [PATCH 1/5] drm: rcar-du: Replace DRM_INFO() with drm_info() drm_info() adds proper context to the kernel log message, as it receives the drm_device pointer. It is thus preferred over DRM_INFO(). Replace the latter with the former. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c index 1dd722fe8631..ec3cf233d6ae 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c @@ -710,7 +710,7 @@ static int rcar_du_probe(struct platform_device *pdev) if (ret) goto error; - DRM_INFO("Device %s probed\n", dev_name(&pdev->dev)); + drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev)); drm_fbdev_generic_setup(&rcdu->ddev, 32); From f3651bc0b7fc4361a351fd01d99ba739f67769e4 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 30 May 2023 12:19:58 +0300 Subject: [PATCH 2/5] drm: rcar-du: Use dev_err_probe() to record cause of KMS init errors The (large) rcar_du_modeset_init() function can fail for many reasons, two of two involving probe deferral. Use dev_err_probe() in those code paths to record the cause of the probe deferral, in order to help debugging probe issues. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 ++++ drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c index ec3cf233d6ae..dee530e4c8b2 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c @@ -696,6 +696,10 @@ static int rcar_du_probe(struct platform_device *pdev) /* DRM/KMS objects */ ret = rcar_du_modeset_init(rcdu); if (ret < 0) { + /* + * Don't use dev_err_probe(), as it would overwrite the probe + * deferral reason recorded in rcar_du_modeset_init(). + */ if (ret != -EPROBE_DEFER) dev_err(&pdev->dev, "failed to initialize DRM/KMS (%d)\n", ret); diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c index 9ff4537c26c8..70d8ad065bfa 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c @@ -935,7 +935,8 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu) /* Initialize the Color Management Modules. */ ret = rcar_du_cmm_init(rcdu); if (ret) - return ret; + return dev_err_probe(rcdu->dev, ret, + "failed to initialize CMM\n"); /* Create the CRTCs. */ for (swindex = 0, hwindex = 0; swindex < rcdu->num_crtcs; ++hwindex) { @@ -955,7 +956,8 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu) /* Initialize the encoders. */ ret = rcar_du_encoders_init(rcdu); if (ret < 0) - return ret; + return dev_err_probe(rcdu->dev, ret, + "failed to initialize encoders\n"); if (ret == 0) { dev_err(rcdu->dev, "error: no encoder could be initialized\n"); From 6e6c74a4def2de26feea680311aa482a07839c2a Mon Sep 17 00:00:00 2001 From: Yangtao Li Date: Fri, 7 Jul 2023 15:20:17 +0800 Subject: [PATCH 3/5] drm/renesas: Convert to devm_platform_ioremap_resource() Use devm_platform_ioremap_resource() to simplify code. Signed-off-by: Yangtao Li Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c index 586c5c4ebb14..2dba7c5ffd2c 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c @@ -1001,7 +1001,6 @@ static int rcar_mipi_dsi_get_clocks(struct rcar_mipi_dsi *dsi) static int rcar_mipi_dsi_probe(struct platform_device *pdev) { struct rcar_mipi_dsi *dsi; - struct resource *mem; int ret; dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL); @@ -1018,8 +1017,7 @@ static int rcar_mipi_dsi_probe(struct platform_device *pdev) return ret; /* Acquire resources. */ - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - dsi->mmio = devm_ioremap_resource(dsi->dev, mem); + dsi->mmio = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(dsi->mmio)) return PTR_ERR(dsi->mmio); From 0dfcf80d41a20d83e41b63dab11eb17d3de69503 Mon Sep 17 00:00:00 2001 From: Damian Hobson-Garcia Date: Fri, 28 Jul 2023 16:07:13 -0400 Subject: [PATCH 4/5] drm: rcar-du: Add more formats to DRM_MODE_BLEND_PIXEL_NONE support Add additional pixel formats for which blending is disabled when DRM_MODE_BLEND_PIXEL_NONE is set. Refactor the fourcc selection into a separate function to handle the increased number of formats. Signed-off-by: Damian Hobson-Garcia Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c index 9cbb5e6e2cba..c006bdf14aba 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c @@ -177,6 +177,37 @@ static const u32 rcar_du_vsp_formats_gen4[] = { DRM_FORMAT_Y212, }; +static u32 rcar_du_vsp_state_get_format(struct rcar_du_vsp_plane_state *state) +{ + u32 fourcc = state->format->fourcc; + + if (state->state.pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) { + switch (fourcc) { + case DRM_FORMAT_ARGB1555: + fourcc = DRM_FORMAT_XRGB1555; + break; + + case DRM_FORMAT_ARGB4444: + fourcc = DRM_FORMAT_XRGB4444; + break; + + case DRM_FORMAT_ARGB8888: + fourcc = DRM_FORMAT_XRGB8888; + break; + + case DRM_FORMAT_BGRA8888: + fourcc = DRM_FORMAT_BGRX8888; + break; + + case DRM_FORMAT_RGBA1010102: + fourcc = DRM_FORMAT_RGBX1010102; + break; + } + } + + return fourcc; +} + static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane) { struct rcar_du_vsp_plane_state *state = @@ -190,7 +221,7 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane) .alpha = state->state.alpha >> 8, .zpos = state->state.zpos, }; - u32 fourcc = state->format->fourcc; + u32 fourcc = rcar_du_vsp_state_get_format(state); unsigned int i; cfg.src.left = state->state.src.x1 >> 16; @@ -207,22 +238,6 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane) cfg.mem[i] = sg_dma_address(state->sg_tables[i].sgl) + fb->offsets[i]; - if (state->state.pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) { - switch (fourcc) { - case DRM_FORMAT_ARGB1555: - fourcc = DRM_FORMAT_XRGB1555; - break; - - case DRM_FORMAT_ARGB4444: - fourcc = DRM_FORMAT_XRGB4444; - break; - - case DRM_FORMAT_ARGB8888: - fourcc = DRM_FORMAT_XRGB8888; - break; - } - } - format = rcar_du_format_info(fourcc); cfg.pixelformat = format->v4l2; From 97018453946bbca869640d92c19400b17e61b94b Mon Sep 17 00:00:00 2001 From: Damian Hobson-Garcia Date: Fri, 28 Jul 2023 16:07:14 -0400 Subject: [PATCH 5/5] drm:rcar-du: Enable ABGR and XBGR formats These formats are used by Android so having them available allows the DU to be used for composition operations. Signed-off-by: Damian Hobson-Garcia Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c index c006bdf14aba..7aa0373563a4 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c @@ -123,6 +123,8 @@ static const u32 rcar_du_vsp_formats[] = { DRM_FORMAT_RGB888, DRM_FORMAT_BGRA8888, DRM_FORMAT_BGRX8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_XBGR8888, DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888, DRM_FORMAT_UYVY, @@ -155,6 +157,8 @@ static const u32 rcar_du_vsp_formats_gen4[] = { DRM_FORMAT_RGB888, DRM_FORMAT_BGRA8888, DRM_FORMAT_BGRX8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_XBGR8888, DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888, DRM_FORMAT_RGBX1010102, @@ -195,6 +199,10 @@ static u32 rcar_du_vsp_state_get_format(struct rcar_du_vsp_plane_state *state) fourcc = DRM_FORMAT_XRGB8888; break; + case DRM_FORMAT_ABGR8888: + fourcc = DRM_FORMAT_XBGR8888; + break; + case DRM_FORMAT_BGRA8888: fourcc = DRM_FORMAT_BGRX8888; break;