2019-06-06 14:24:19

by Jacopo Mondi

[permalink] [raw]
Subject: [PATCH 20/20] drm: rcar-du: kms: Update CMM in atomic commit tail

Update CMM settings at in the atomic commit tail helper method.

The CMM is updated with new gamma values provided to the driver
in the GAMMA_LUT blob property.

Signed-off-by: Jacopo Mondi <[email protected]>
---
drivers/gpu/drm/rcar-du/rcar_du_kms.c | 36 +++++++++++++++++++++++++++
1 file changed, 36 insertions(+)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index 5a910a04e1d9..29a2020a46b5 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -21,6 +21,7 @@
#include <linux/of_platform.h>
#include <linux/wait.h>

+#include "rcar_cmm.h"
#include "rcar_du_crtc.h"
#include "rcar_du_drv.h"
#include "rcar_du_encoder.h"
@@ -367,6 +368,38 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
* Atomic Check and Update
*/

+static void rcar_du_atomic_commit_update_cmm(struct drm_crtc *crtc,
+ struct drm_crtc_state *old_state)
+{
+ struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
+ struct rcar_cmm_config cmm_config = {};
+
+ if (!rcrtc->cmm || !crtc->state->color_mgmt_changed)
+ return;
+
+ if (!crtc->state->gamma_lut) {
+ cmm_config.lut.enable = false;
+ rcar_cmm_setup(rcrtc->cmm, &cmm_config);
+
+ return;
+ }
+
+ cmm_config.lut.enable = true;
+ cmm_config.lut.table = (struct drm_color_lut *)
+ crtc->state->gamma_lut->data;
+
+ /* Set LUT table size to 0 if entries should not be updated. */
+ if (!old_state->gamma_lut ||
+ (old_state->gamma_lut->base.id !=
+ crtc->state->gamma_lut->base.id))
+ cmm_config.lut.size = crtc->state->gamma_lut->length
+ / sizeof(cmm_config.lut.table[0]);
+ else
+ cmm_config.lut.size = 0;
+
+ rcar_cmm_setup(rcrtc->cmm, &cmm_config);
+}
+
static int rcar_du_atomic_check(struct drm_device *dev,
struct drm_atomic_state *state)
{
@@ -409,6 +442,9 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state)
rcdu->dpad1_source = rcrtc->index;
}

+ for_each_old_crtc_in_state(old_state, crtc, crtc_state, i)
+ rcar_du_atomic_commit_update_cmm(crtc, crtc_state);
+
/* Apply the atomic update. */
drm_atomic_helper_commit_modeset_disables(dev, old_state);
drm_atomic_helper_commit_planes(dev, old_state,
--
2.21.0


2019-06-07 12:09:40

by Laurent Pinchart

[permalink] [raw]
Subject: Re: [PATCH 20/20] drm: rcar-du: kms: Update CMM in atomic commit tail

Hi Jacopo,

Thank you for the patch.

On Thu, Jun 06, 2019 at 04:22:20PM +0200, Jacopo Mondi wrote:
> Update CMM settings at in the atomic commit tail helper method.
>
> The CMM is updated with new gamma values provided to the driver
> in the GAMMA_LUT blob property.
>
> Signed-off-by: Jacopo Mondi <[email protected]>
> ---
> drivers/gpu/drm/rcar-du/rcar_du_kms.c | 36 +++++++++++++++++++++++++++
> 1 file changed, 36 insertions(+)
>
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> index 5a910a04e1d9..29a2020a46b5 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> @@ -21,6 +21,7 @@
> #include <linux/of_platform.h>
> #include <linux/wait.h>
>
> +#include "rcar_cmm.h"
> #include "rcar_du_crtc.h"
> #include "rcar_du_drv.h"
> #include "rcar_du_encoder.h"
> @@ -367,6 +368,38 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> * Atomic Check and Update
> */
>
> +static void rcar_du_atomic_commit_update_cmm(struct drm_crtc *crtc,
> + struct drm_crtc_state *old_state)
> +{
> + struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
> + struct rcar_cmm_config cmm_config = {};
> +
> + if (!rcrtc->cmm || !crtc->state->color_mgmt_changed)
> + return;
> +
> + if (!crtc->state->gamma_lut) {
> + cmm_config.lut.enable = false;
> + rcar_cmm_setup(rcrtc->cmm, &cmm_config);
> +
> + return;
> + }
> +
> + cmm_config.lut.enable = true;
> + cmm_config.lut.table = (struct drm_color_lut *)
> + crtc->state->gamma_lut->data;
> +
> + /* Set LUT table size to 0 if entries should not be updated. */
> + if (!old_state->gamma_lut ||
> + (old_state->gamma_lut->base.id !=
> + crtc->state->gamma_lut->base.id))
> + cmm_config.lut.size = crtc->state->gamma_lut->length
> + / sizeof(cmm_config.lut.table[0]);

Do you need to call rcar_cmm_setup() at all in this case ?

> + else
> + cmm_config.lut.size = 0;
> +
> + rcar_cmm_setup(rcrtc->cmm, &cmm_config);
> +}
> +
> static int rcar_du_atomic_check(struct drm_device *dev,
> struct drm_atomic_state *state)
> {
> @@ -409,6 +442,9 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state)
> rcdu->dpad1_source = rcrtc->index;
> }
>
> + for_each_old_crtc_in_state(old_state, crtc, crtc_state, i)
> + rcar_du_atomic_commit_update_cmm(crtc, crtc_state);
> +
> /* Apply the atomic update. */
> drm_atomic_helper_commit_modeset_disables(dev, old_state);
> drm_atomic_helper_commit_planes(dev, old_state,

--
Regards,

Laurent Pinchart

2019-06-14 08:18:46

by jacopo mondi

[permalink] [raw]
Subject: Re: [PATCH 20/20] drm: rcar-du: kms: Update CMM in atomic commit tail

Hi Laurent,

On Fri, Jun 07, 2019 at 03:06:33PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Thu, Jun 06, 2019 at 04:22:20PM +0200, Jacopo Mondi wrote:
> > Update CMM settings at in the atomic commit tail helper method.
> >
> > The CMM is updated with new gamma values provided to the driver
> > in the GAMMA_LUT blob property.
> >
> > Signed-off-by: Jacopo Mondi <[email protected]>
> > ---
> > drivers/gpu/drm/rcar-du/rcar_du_kms.c | 36 +++++++++++++++++++++++++++
> > 1 file changed, 36 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> > index 5a910a04e1d9..29a2020a46b5 100644
> > --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> > +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> > @@ -21,6 +21,7 @@
> > #include <linux/of_platform.h>
> > #include <linux/wait.h>
> >
> > +#include "rcar_cmm.h"
> > #include "rcar_du_crtc.h"
> > #include "rcar_du_drv.h"
> > #include "rcar_du_encoder.h"
> > @@ -367,6 +368,38 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> > * Atomic Check and Update
> > */
> >
> > +static void rcar_du_atomic_commit_update_cmm(struct drm_crtc *crtc,
> > + struct drm_crtc_state *old_state)
> > +{
> > + struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
> > + struct rcar_cmm_config cmm_config = {};
> > +
> > + if (!rcrtc->cmm || !crtc->state->color_mgmt_changed)
> > + return;
> > +
> > + if (!crtc->state->gamma_lut) {
> > + cmm_config.lut.enable = false;
> > + rcar_cmm_setup(rcrtc->cmm, &cmm_config);
> > +
> > + return;
> > + }
> > +
> > + cmm_config.lut.enable = true;
> > + cmm_config.lut.table = (struct drm_color_lut *)
> > + crtc->state->gamma_lut->data;
> > +
> > + /* Set LUT table size to 0 if entries should not be updated. */
> > + if (!old_state->gamma_lut ||
> > + (old_state->gamma_lut->base.id !=
> > + crtc->state->gamma_lut->base.id))
> > + cmm_config.lut.size = crtc->state->gamma_lut->length
> > + / sizeof(cmm_config.lut.table[0]);
>
> Do you need to call rcar_cmm_setup() at all in this case ?
>

Do you mean in case the lut.size field is set to 0 ?
I considered it useful when the CMM has to be re-enabled without
updateing the LUT table entries? It is not required in your opinion?

Thanks
j

> > + else
> > + cmm_config.lut.size = 0;
> > +
> > + rcar_cmm_setup(rcrtc->cmm, &cmm_config);
> > +}
> > +
> > static int rcar_du_atomic_check(struct drm_device *dev,
> > struct drm_atomic_state *state)
> > {
> > @@ -409,6 +442,9 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state)
> > rcdu->dpad1_source = rcrtc->index;
> > }
> >
> > + for_each_old_crtc_in_state(old_state, crtc, crtc_state, i)
> > + rcar_du_atomic_commit_update_cmm(crtc, crtc_state);
> > +
> > /* Apply the atomic update. */
> > drm_atomic_helper_commit_modeset_disables(dev, old_state);
> > drm_atomic_helper_commit_planes(dev, old_state,
>
> --
> Regards,
>
> Laurent Pinchart


Attachments:
(No filename) (3.04 kB)
signature.asc (849.00 B)
Download all attachments

2019-09-13 02:13:36

by Laurent Pinchart

[permalink] [raw]
Subject: Re: [PATCH 20/20] drm: rcar-du: kms: Update CMM in atomic commit tail

Hi Jacopo,

On Fri, Jun 14, 2019 at 10:19:13AM +0200, Jacopo Mondi wrote:
> On Fri, Jun 07, 2019 at 03:06:33PM +0300, Laurent Pinchart wrote:
> > On Thu, Jun 06, 2019 at 04:22:20PM +0200, Jacopo Mondi wrote:
> >> Update CMM settings at in the atomic commit tail helper method.
> >>
> >> The CMM is updated with new gamma values provided to the driver
> >> in the GAMMA_LUT blob property.
> >>
> >> Signed-off-by: Jacopo Mondi <[email protected]>
> >> ---
> >> drivers/gpu/drm/rcar-du/rcar_du_kms.c | 36 +++++++++++++++++++++++++++
> >> 1 file changed, 36 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> >> index 5a910a04e1d9..29a2020a46b5 100644
> >> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> >> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> >> @@ -21,6 +21,7 @@
> >> #include <linux/of_platform.h>
> >> #include <linux/wait.h>
> >>
> >> +#include "rcar_cmm.h"
> >> #include "rcar_du_crtc.h"
> >> #include "rcar_du_drv.h"
> >> #include "rcar_du_encoder.h"
> >> @@ -367,6 +368,38 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> >> * Atomic Check and Update
> >> */
> >>
> >> +static void rcar_du_atomic_commit_update_cmm(struct drm_crtc *crtc,
> >> + struct drm_crtc_state *old_state)
> >> +{
> >> + struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
> >> + struct rcar_cmm_config cmm_config = {};
> >> +
> >> + if (!rcrtc->cmm || !crtc->state->color_mgmt_changed)
> >> + return;
> >> +
> >> + if (!crtc->state->gamma_lut) {
> >> + cmm_config.lut.enable = false;
> >> + rcar_cmm_setup(rcrtc->cmm, &cmm_config);
> >> +
> >> + return;
> >> + }
> >> +
> >> + cmm_config.lut.enable = true;
> >> + cmm_config.lut.table = (struct drm_color_lut *)
> >> + crtc->state->gamma_lut->data;
> >> +
> >> + /* Set LUT table size to 0 if entries should not be updated. */
> >> + if (!old_state->gamma_lut ||
> >> + (old_state->gamma_lut->base.id !=
> >> + crtc->state->gamma_lut->base.id))
> >> + cmm_config.lut.size = crtc->state->gamma_lut->length
> >> + / sizeof(cmm_config.lut.table[0]);
> >
> > Do you need to call rcar_cmm_setup() at all in this case ?
>
> Do you mean in case the lut.size field is set to 0 ?
> I considered it useful when the CMM has to be re-enabled without
> updateing the LUT table entries? It is not required in your opinion?

You're right, I thought userspace couldn't do this, but it actually can.

> >> + else
> >> + cmm_config.lut.size = 0;
> >> +
> >> + rcar_cmm_setup(rcrtc->cmm, &cmm_config);
> >> +}
> >> +
> >> static int rcar_du_atomic_check(struct drm_device *dev,
> >> struct drm_atomic_state *state)
> >> {
> >> @@ -409,6 +442,9 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state)
> >> rcdu->dpad1_source = rcrtc->index;
> >> }
> >>
> >> + for_each_old_crtc_in_state(old_state, crtc, crtc_state, i)
> >> + rcar_du_atomic_commit_update_cmm(crtc, crtc_state);
> >> +
> >> /* Apply the atomic update. */
> >> drm_atomic_helper_commit_modeset_disables(dev, old_state);
> >> drm_atomic_helper_commit_planes(dev, old_state,

--
Regards,

Laurent Pinchart