Re: [PATCH v6 3/8] drm: rcar-du: Add support for CMM
Hi Jacopo, On Thu, Oct 17, 2019 at 02:43:49PM +0200, Jacopo Mondi wrote: > On Wed, Oct 16, 2019 at 04:45:26PM +0300, Laurent Pinchart wrote: > > On Wed, Oct 16, 2019 at 10:55:43AM +0200, Jacopo Mondi wrote: > > > Add a driver for the R-Car Display Unit Color Correction Module. > > > > > > In most of Gen3 SoCs, each DU output channel is provided with a CMM unit > > > to perform image enhancement and color correction. > > > > > > Add support for CMM through a driver that supports configuration of > > > the 1-dimensional LUT table. More advanced CMM features will be > > > implemented on top of this initial one. > > > > > > Reviewed-by: Laurent Pinchart > > > Reviewed-by: Kieran Bingham > > > Signed-off-by: Jacopo Mondi > > > --- > > > drivers/gpu/drm/rcar-du/Kconfig| 7 + > > > drivers/gpu/drm/rcar-du/Makefile | 1 + > > > drivers/gpu/drm/rcar-du/rcar_cmm.c | 212 + > > > drivers/gpu/drm/rcar-du/rcar_cmm.h | 58 > > > 4 files changed, 278 insertions(+) > > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.c > > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.h > > > > > > diff --git a/drivers/gpu/drm/rcar-du/Kconfig > > > b/drivers/gpu/drm/rcar-du/Kconfig > > > index 1529849e217e..539d232790d1 100644 > > > --- a/drivers/gpu/drm/rcar-du/Kconfig > > > +++ b/drivers/gpu/drm/rcar-du/Kconfig > > > @@ -13,6 +13,13 @@ config DRM_RCAR_DU > > > Choose this option if you have an R-Car chipset. > > > If M is selected the module will be called rcar-du-drm. > > > > > > +config DRM_RCAR_CMM > > > + bool "R-Car DU Color Management Module (CMM) Support" > > > + depends on DRM && OF > > > + depends on DRM_RCAR_DU > > > + help > > > + Enable support for R-Car Color Management Module (CMM). > > > + > > > config DRM_RCAR_DW_HDMI > > > tristate "R-Car DU Gen3 HDMI Encoder Support" > > > depends on DRM && OF > > > diff --git a/drivers/gpu/drm/rcar-du/Makefile > > > b/drivers/gpu/drm/rcar-du/Makefile > > > index 6c2ed9c46467..4d1187ccc3e5 100644 > > > --- a/drivers/gpu/drm/rcar-du/Makefile > > > +++ b/drivers/gpu/drm/rcar-du/Makefile > > > @@ -15,6 +15,7 @@ rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_of.o > > > \ > > > rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o > > > rcar-du-drm-$(CONFIG_DRM_RCAR_WRITEBACK) += rcar_du_writeback.o > > > > > > +obj-$(CONFIG_DRM_RCAR_CMM) += rcar_cmm.o > > > obj-$(CONFIG_DRM_RCAR_DU)+= rcar-du-drm.o > > > obj-$(CONFIG_DRM_RCAR_DW_HDMI) += rcar_dw_hdmi.o > > > obj-$(CONFIG_DRM_RCAR_LVDS) += rcar_lvds.o > > > diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.c > > > b/drivers/gpu/drm/rcar-du/rcar_cmm.c > > > new file mode 100644 > > > index ..4170626208cf > > > --- /dev/null > > > +++ b/drivers/gpu/drm/rcar-du/rcar_cmm.c > > > @@ -0,0 +1,212 @@ > > > +// SPDX-License-Identifier: GPL-2.0+ > > > +/* > > > + * rcar_cmm.c -- R-Car Display Unit Color Management Module > > > + * > > > + * Copyright (C) 2019 Jacopo Mondi > > > + */ > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#include > > > + > > > +#include "rcar_cmm.h" > > > + > > > +#define CM2_LUT_CTRL 0x > > > +#define CM2_LUT_CTRL_LUT_EN BIT(0) > > > +#define CM2_LUT_TBL_BASE 0x0600 > > > +#define CM2_LUT_TBL(__i) (CM2_LUT_TBL_BASE + (__i) * 4) > > > + > > > +struct rcar_cmm { > > > + void __iomem *base; > > > + > > > + /* > > > + * @lut:1D-LUT state > > > + * @lut.enabled:1D-LUT enabled flag > > > + */ > > > + struct { > > > + bool enabled; > > > + } lut; > > > +}; > > > + > > > +static inline int rcar_cmm_read(struct rcar_cmm *rcmm, u32 reg) > > > +{ > > > + return ioread32(rcmm->base + reg); > > > +} > > > + > > > +static inline void rcar_cmm_write(struct rcar_cmm *rcmm, u32 reg, u32 > > > data) > > > +{ > > > + iowrite32(data, rcmm->base + reg); > > > +} > > > + > > > +/* > > > + * rcar_cmm_lut_write() - Scale the DRM LUT table entries to hardware > > > precision > > > + * and write to the CMM registers > > > + * @rcmm: Pointer to the CMM device > > > + * @drm_lut: Pointer to the DRM LUT table > > > + */ > > > +static void rcar_cmm_lut_write(struct rcar_cmm *rcmm, > > > +const struct drm_color_lut *drm_lut) > > > +{ > > > + unsigned int i; > > > + > > > + for (i = 0; i < CM2_LUT_SIZE; ++i) { > > > + u32 entry = drm_color_lut_extract(drm_lut[i].red, 8) << 16 > > > + | drm_color_lut_extract(drm_lut[i].green, 8) << 8 > > > + | drm_color_lut_extract(drm_lut[i].blue, 8); > > > + > > > + rcar_cmm_write(rcmm, CM2_LUT_TBL(i), entry); > > > + } > > > +} > > > + > > > +/* > > > + * rcar_cmm_setup() - Configure the CMM unit > > > + * @pdev: The platform device associated with the CMM instance > > > + * @config: The CMM unit configuration > > > + * > > > + * Configure the
Re: [PATCH v6 3/8] drm: rcar-du: Add support for CMM
Hi Laurent, On Wed, Oct 16, 2019 at 04:45:26PM +0300, Laurent Pinchart wrote: > Hi Jacopo, > > Thank you for the patch. > > On Wed, Oct 16, 2019 at 10:55:43AM +0200, Jacopo Mondi wrote: > > Add a driver for the R-Car Display Unit Color Correction Module. > > > > In most of Gen3 SoCs, each DU output channel is provided with a CMM unit > > to perform image enhancement and color correction. > > > > Add support for CMM through a driver that supports configuration of > > the 1-dimensional LUT table. More advanced CMM features will be > > implemented on top of this initial one. > > > > Reviewed-by: Laurent Pinchart > > Reviewed-by: Kieran Bingham > > Signed-off-by: Jacopo Mondi > > --- > > drivers/gpu/drm/rcar-du/Kconfig| 7 + > > drivers/gpu/drm/rcar-du/Makefile | 1 + > > drivers/gpu/drm/rcar-du/rcar_cmm.c | 212 + > > drivers/gpu/drm/rcar-du/rcar_cmm.h | 58 > > 4 files changed, 278 insertions(+) > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.c > > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.h > > > > diff --git a/drivers/gpu/drm/rcar-du/Kconfig > > b/drivers/gpu/drm/rcar-du/Kconfig > > index 1529849e217e..539d232790d1 100644 > > --- a/drivers/gpu/drm/rcar-du/Kconfig > > +++ b/drivers/gpu/drm/rcar-du/Kconfig > > @@ -13,6 +13,13 @@ config DRM_RCAR_DU > > Choose this option if you have an R-Car chipset. > > If M is selected the module will be called rcar-du-drm. > > > > +config DRM_RCAR_CMM > > + bool "R-Car DU Color Management Module (CMM) Support" > > + depends on DRM && OF > > + depends on DRM_RCAR_DU > > + help > > + Enable support for R-Car Color Management Module (CMM). > > + > > config DRM_RCAR_DW_HDMI > > tristate "R-Car DU Gen3 HDMI Encoder Support" > > depends on DRM && OF > > diff --git a/drivers/gpu/drm/rcar-du/Makefile > > b/drivers/gpu/drm/rcar-du/Makefile > > index 6c2ed9c46467..4d1187ccc3e5 100644 > > --- a/drivers/gpu/drm/rcar-du/Makefile > > +++ b/drivers/gpu/drm/rcar-du/Makefile > > @@ -15,6 +15,7 @@ rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_of.o > > \ > > rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o > > rcar-du-drm-$(CONFIG_DRM_RCAR_WRITEBACK) += rcar_du_writeback.o > > > > +obj-$(CONFIG_DRM_RCAR_CMM) += rcar_cmm.o > > obj-$(CONFIG_DRM_RCAR_DU) += rcar-du-drm.o > > obj-$(CONFIG_DRM_RCAR_DW_HDMI) += rcar_dw_hdmi.o > > obj-$(CONFIG_DRM_RCAR_LVDS)+= rcar_lvds.o > > diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.c > > b/drivers/gpu/drm/rcar-du/rcar_cmm.c > > new file mode 100644 > > index ..4170626208cf > > --- /dev/null > > +++ b/drivers/gpu/drm/rcar-du/rcar_cmm.c > > @@ -0,0 +1,212 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * rcar_cmm.c -- R-Car Display Unit Color Management Module > > + * > > + * Copyright (C) 2019 Jacopo Mondi > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > + > > +#include "rcar_cmm.h" > > + > > +#define CM2_LUT_CTRL 0x > > +#define CM2_LUT_CTRL_LUT_ENBIT(0) > > +#define CM2_LUT_TBL_BASE 0x0600 > > +#define CM2_LUT_TBL(__i) (CM2_LUT_TBL_BASE + (__i) * 4) > > + > > +struct rcar_cmm { > > + void __iomem *base; > > + > > + /* > > +* @lut:1D-LUT state > > +* @lut.enabled:1D-LUT enabled flag > > +*/ > > + struct { > > + bool enabled; > > + } lut; > > +}; > > + > > +static inline int rcar_cmm_read(struct rcar_cmm *rcmm, u32 reg) > > +{ > > + return ioread32(rcmm->base + reg); > > +} > > + > > +static inline void rcar_cmm_write(struct rcar_cmm *rcmm, u32 reg, u32 data) > > +{ > > + iowrite32(data, rcmm->base + reg); > > +} > > + > > +/* > > + * rcar_cmm_lut_write() - Scale the DRM LUT table entries to hardware > > precision > > + * and write to the CMM registers > > + * @rcmm: Pointer to the CMM device > > + * @drm_lut: Pointer to the DRM LUT table > > + */ > > +static void rcar_cmm_lut_write(struct rcar_cmm *rcmm, > > + const struct drm_color_lut *drm_lut) > > +{ > > + unsigned int i; > > + > > + for (i = 0; i < CM2_LUT_SIZE; ++i) { > > + u32 entry = drm_color_lut_extract(drm_lut[i].red, 8) << 16 > > + | drm_color_lut_extract(drm_lut[i].green, 8) << 8 > > + | drm_color_lut_extract(drm_lut[i].blue, 8); > > + > > + rcar_cmm_write(rcmm, CM2_LUT_TBL(i), entry); > > + } > > +} > > + > > +/* > > + * rcar_cmm_setup() - Configure the CMM unit > > + * @pdev: The platform device associated with the CMM instance > > + * @config: The CMM unit configuration > > + * > > + * Configure the CMM unit with the given configuration. Currently enabling, > > + * disabling and programming of the 1-D LUT unit is supported. > > Did you miss the comment in the previous version about explaining when > rcar_cmm_setup() can be called (basically
Re: [PATCH v6 3/8] drm: rcar-du: Add support for CMM
Hi Jacopo, Thank you for the patch. On Wed, Oct 16, 2019 at 10:55:43AM +0200, Jacopo Mondi wrote: > Add a driver for the R-Car Display Unit Color Correction Module. > > In most of Gen3 SoCs, each DU output channel is provided with a CMM unit > to perform image enhancement and color correction. > > Add support for CMM through a driver that supports configuration of > the 1-dimensional LUT table. More advanced CMM features will be > implemented on top of this initial one. > > Reviewed-by: Laurent Pinchart > Reviewed-by: Kieran Bingham > Signed-off-by: Jacopo Mondi > --- > drivers/gpu/drm/rcar-du/Kconfig| 7 + > drivers/gpu/drm/rcar-du/Makefile | 1 + > drivers/gpu/drm/rcar-du/rcar_cmm.c | 212 + > drivers/gpu/drm/rcar-du/rcar_cmm.h | 58 > 4 files changed, 278 insertions(+) > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.c > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.h > > diff --git a/drivers/gpu/drm/rcar-du/Kconfig b/drivers/gpu/drm/rcar-du/Kconfig > index 1529849e217e..539d232790d1 100644 > --- a/drivers/gpu/drm/rcar-du/Kconfig > +++ b/drivers/gpu/drm/rcar-du/Kconfig > @@ -13,6 +13,13 @@ config DRM_RCAR_DU > Choose this option if you have an R-Car chipset. > If M is selected the module will be called rcar-du-drm. > > +config DRM_RCAR_CMM > + bool "R-Car DU Color Management Module (CMM) Support" > + depends on DRM && OF > + depends on DRM_RCAR_DU > + help > + Enable support for R-Car Color Management Module (CMM). > + > config DRM_RCAR_DW_HDMI > tristate "R-Car DU Gen3 HDMI Encoder Support" > depends on DRM && OF > diff --git a/drivers/gpu/drm/rcar-du/Makefile > b/drivers/gpu/drm/rcar-du/Makefile > index 6c2ed9c46467..4d1187ccc3e5 100644 > --- a/drivers/gpu/drm/rcar-du/Makefile > +++ b/drivers/gpu/drm/rcar-du/Makefile > @@ -15,6 +15,7 @@ rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_of.o \ > rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o > rcar-du-drm-$(CONFIG_DRM_RCAR_WRITEBACK) += rcar_du_writeback.o > > +obj-$(CONFIG_DRM_RCAR_CMM) += rcar_cmm.o > obj-$(CONFIG_DRM_RCAR_DU)+= rcar-du-drm.o > obj-$(CONFIG_DRM_RCAR_DW_HDMI) += rcar_dw_hdmi.o > obj-$(CONFIG_DRM_RCAR_LVDS) += rcar_lvds.o > diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.c > b/drivers/gpu/drm/rcar-du/rcar_cmm.c > new file mode 100644 > index ..4170626208cf > --- /dev/null > +++ b/drivers/gpu/drm/rcar-du/rcar_cmm.c > @@ -0,0 +1,212 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * rcar_cmm.c -- R-Car Display Unit Color Management Module > + * > + * Copyright (C) 2019 Jacopo Mondi > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include "rcar_cmm.h" > + > +#define CM2_LUT_CTRL 0x > +#define CM2_LUT_CTRL_LUT_EN BIT(0) > +#define CM2_LUT_TBL_BASE 0x0600 > +#define CM2_LUT_TBL(__i) (CM2_LUT_TBL_BASE + (__i) * 4) > + > +struct rcar_cmm { > + void __iomem *base; > + > + /* > + * @lut:1D-LUT state > + * @lut.enabled:1D-LUT enabled flag > + */ > + struct { > + bool enabled; > + } lut; > +}; > + > +static inline int rcar_cmm_read(struct rcar_cmm *rcmm, u32 reg) > +{ > + return ioread32(rcmm->base + reg); > +} > + > +static inline void rcar_cmm_write(struct rcar_cmm *rcmm, u32 reg, u32 data) > +{ > + iowrite32(data, rcmm->base + reg); > +} > + > +/* > + * rcar_cmm_lut_write() - Scale the DRM LUT table entries to hardware > precision > + * and write to the CMM registers > + * @rcmm: Pointer to the CMM device > + * @drm_lut: Pointer to the DRM LUT table > + */ > +static void rcar_cmm_lut_write(struct rcar_cmm *rcmm, > +const struct drm_color_lut *drm_lut) > +{ > + unsigned int i; > + > + for (i = 0; i < CM2_LUT_SIZE; ++i) { > + u32 entry = drm_color_lut_extract(drm_lut[i].red, 8) << 16 > + | drm_color_lut_extract(drm_lut[i].green, 8) << 8 > + | drm_color_lut_extract(drm_lut[i].blue, 8); > + > + rcar_cmm_write(rcmm, CM2_LUT_TBL(i), entry); > + } > +} > + > +/* > + * rcar_cmm_setup() - Configure the CMM unit > + * @pdev: The platform device associated with the CMM instance > + * @config: The CMM unit configuration > + * > + * Configure the CMM unit with the given configuration. Currently enabling, > + * disabling and programming of the 1-D LUT unit is supported. Did you miss the comment in the previous version about explaining when rcar_cmm_setup() can be called (basically requiring the CMM to be enabled) ? I can fix this when applying if you tell me what I should write. > + * > + * TODO: Add support for LUT double buffer operations to avoid updating the > + * LUT table entries while a frame is being displayed. > + */ > +int rcar_cmm_setup(struct platform_device *pdev, > +