From: Sam Ravnborg <sam@ravnborg.org>
To: Paul Cercueil <paul@crapouillou.net>
Cc: David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
od@zcrc.me, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 5/7] drm/ingenic: Add support for paletted 8bpp
Date: Sat, 26 Sep 2020 20:23:22 +0200 [thread overview]
Message-ID: <20200926182322.GA91317@ravnborg.org> (raw)
In-Reply-To: <20200926170501.1109197-6-paul@crapouillou.net>
Hi Paul.
On Sat, Sep 26, 2020 at 07:04:59PM +0200, Paul Cercueil wrote:
> On JZ4725B and newer, the F0 plane supports paletted 8bpp with a
> 256-entry palette. Add support for it.
>
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> ---
> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 60 +++++++++++++++++++++--
> 1 file changed, 56 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index 567facfb7217..48e88827f332 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -21,6 +21,7 @@
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_bridge.h>
> +#include <drm/drm_color_mgmt.h>
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> #include <drm/drm_damage_helper.h>
> @@ -50,6 +51,8 @@ struct ingenic_dma_hwdesc {
> struct ingenic_dma_hwdescs {
> struct ingenic_dma_hwdesc hwdesc_f0;
> struct ingenic_dma_hwdesc hwdesc_f1;
> + struct ingenic_dma_hwdesc hwdesc_pal;
> + u16 palette[256] __aligned(16);
> };
>
> struct jz_soc_info {
> @@ -464,6 +467,9 @@ void ingenic_drm_plane_config(struct device *dev,
> JZ_LCD_OSDCTRL_BPP_MASK, ctrl);
> } else {
> switch (fourcc) {
> + case DRM_FORMAT_C8:
> + ctrl |= JZ_LCD_CTRL_BPP_8;
> + break;
> case DRM_FORMAT_XRGB1555:
> ctrl |= JZ_LCD_CTRL_RGB555;
> fallthrough;
> @@ -529,16 +535,34 @@ void ingenic_drm_sync_data(struct device *dev,
> }
> }
>
> +static void ingenic_drm_update_palette(struct ingenic_drm *priv,
> + const struct drm_color_lut *lut)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < ARRAY_SIZE(priv->dma_hwdescs->palette); i++) {
> + u16 color = drm_color_lut_extract(lut[i].red, 5) << 11
> + | drm_color_lut_extract(lut[i].green, 6) << 5
> + | drm_color_lut_extract(lut[i].blue, 5);
> +
> + priv->dma_hwdescs->palette[i] = color;
> + }
> +}
> +
> static void ingenic_drm_plane_atomic_update(struct drm_plane *plane,
> struct drm_plane_state *oldstate)
> {
> struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
> struct drm_plane_state *state = plane->state;
> + struct drm_crtc_state *crtc_state;
> struct ingenic_dma_hwdesc *hwdesc;
> - unsigned int width, height, cpp;
> + unsigned int width, height, cpp, offset;
> dma_addr_t addr;
> + u32 fourcc;
>
> if (state && state->fb) {
> + crtc_state = state->crtc->state;
> +
> ingenic_drm_sync_data(priv->dev, oldstate, state);
>
> addr = drm_fb_cma_get_gem_addr(state->fb, state, 0);
> @@ -554,9 +578,23 @@ static void ingenic_drm_plane_atomic_update(struct drm_plane *plane,
> hwdesc->addr = addr;
> hwdesc->cmd = JZ_LCD_CMD_EOF_IRQ | (width * height * cpp / 4);
>
> - if (drm_atomic_crtc_needs_modeset(state->crtc->state))
> - ingenic_drm_plane_config(priv->dev, plane,
> - state->fb->format->format);
> + if (drm_atomic_crtc_needs_modeset(crtc_state)) {
> + fourcc = state->fb->format->format;
> +
> + ingenic_drm_plane_config(priv->dev, plane, fourcc);
> +
> + if (fourcc == DRM_FORMAT_C8)
> + offset = offsetof(struct ingenic_dma_hwdescs, hwdesc_pal);
> + else
> + offset = offsetof(struct ingenic_dma_hwdescs, hwdesc_f0);
> +
> + priv->dma_hwdescs->hwdesc_f0.next = priv->dma_hwdescs_phys + offset;
> +
> + crtc_state->color_mgmt_changed = fourcc == DRM_FORMAT_C8;
> + }
> +
> + if (crtc_state->color_mgmt_changed)
> + ingenic_drm_update_palette(priv, crtc_state->gamma_lut->data);
What guarantee the size of gamma_lut->data?
In other word - should drm_color_lut_size() be checked here?
Maybe only accept a fully populated palette?
This is what I can see rcar-du and armada does.
Sam
> }
> }
>
> @@ -952,6 +990,15 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
> priv->dma_hwdescs->hwdesc_f1.next = dma_hwdesc_phys_f1;
> priv->dma_hwdescs->hwdesc_f1.id = 0xf1;
>
> + /* Configure DMA hwdesc for palette */
> + priv->dma_hwdescs->hwdesc_pal.next = priv->dma_hwdescs_phys
> + + offsetof(struct ingenic_dma_hwdescs, hwdesc_f0);
> + priv->dma_hwdescs->hwdesc_pal.id = 0xc0;
> + priv->dma_hwdescs->hwdesc_pal.addr = priv->dma_hwdescs_phys
> + + offsetof(struct ingenic_dma_hwdescs, palette);
> + priv->dma_hwdescs->hwdesc_pal.cmd = JZ_LCD_CMD_ENABLE_PAL
> + | (sizeof(priv->dma_hwdescs->palette) / 4);
> +
> if (soc_info->has_osd)
> priv->ipu_plane = drm_plane_from_index(drm, 0);
>
> @@ -978,6 +1025,9 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
> return ret;
> }
>
> + drm_crtc_enable_color_mgmt(&priv->crtc, 0, false,
> + ARRAY_SIZE(priv->dma_hwdescs->palette));
> +
> if (soc_info->has_osd) {
> drm_plane_helper_add(&priv->f0,
> &ingenic_drm_plane_helper_funcs);
> @@ -1213,6 +1263,7 @@ static const u32 jz4725b_formats_f1[] = {
> };
>
> static const u32 jz4725b_formats_f0[] = {
> + DRM_FORMAT_C8,
> DRM_FORMAT_XRGB1555,
> DRM_FORMAT_RGB565,
> DRM_FORMAT_XRGB8888,
> @@ -1225,6 +1276,7 @@ static const u32 jz4770_formats_f1[] = {
> };
>
> static const u32 jz4770_formats_f0[] = {
> + DRM_FORMAT_C8,
> DRM_FORMAT_XRGB1555,
> DRM_FORMAT_RGB565,
> DRM_FORMAT_XRGB8888,
> --
> 2.28.0
next prev parent reply other threads:[~2020-09-26 18:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-26 17:04 [PATCH v2 0/7] Ingenic-drm improvements + new pixel formats Paul Cercueil
2020-09-26 17:04 ` [PATCH v2 1/7] drm/ingenic: Reset pixclock rate when parent clock rate changes Paul Cercueil
2020-09-26 17:04 ` [PATCH v2 2/7] drm/ingenic: Add support for reserved memory Paul Cercueil
2020-09-26 17:04 ` [PATCH v2 3/7] drm/ingenic: Alloc F0 and F1 DMA descriptors at once Paul Cercueil
2020-09-26 17:04 ` [PATCH v2 4/7] drm/ingenic: Support handling different pixel formats in F0/F1 planes Paul Cercueil
2020-09-26 17:04 ` [PATCH v2 5/7] drm/ingenic: Add support for paletted 8bpp Paul Cercueil
2020-09-26 18:23 ` Sam Ravnborg [this message]
2020-09-26 17:05 ` [PATCH v2 6/7] drm/ingenic: Add support for 30-bit modes Paul Cercueil
2020-09-26 17:05 ` [PATCH v2 7/7] drm/ingenic: Add support for 24-bit modes Paul Cercueil
2020-09-26 18:25 ` [PATCH v2 0/7] Ingenic-drm improvements + new pixel formats Sam Ravnborg
2020-09-26 19:52 ` Paul Cercueil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200926182322.GA91317@ravnborg.org \
--to=sam@ravnborg.org \
--cc=airlied@linux.ie \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=od@zcrc.me \
--cc=paul@crapouillou.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox