Message ID | 1554297284-14009-8-git-send-email-VenkataRajesh.Kalakodima@in.bosch.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | v4.19.0 Added Color Management Module | expand |
Hi Kalakodima, Thank you for the patch. On Wed, Apr 03, 2019 at 06:44:43PM +0530, VenkataRajesh.Kalakodima@in.bosch.com wrote: > From: kalakodima venkata rajesh <venkatarajesh.kalakodima@in.bosch.com> > > Update gamma and ctm properties if there is a change. > > Signed-off-by: Harsha M M <harsha.manjulamallikarjun@in.bosch.com> > > - Fix compilation issues when for_each_crtc_in_state is not defined > - Resolved checkpatch errors > - Resolved merge conflicts according to latest version > > Signed-off-by: kalakodima venkata rajesh <venkatarajesh.kalakodima@in.bosch.com> > --- > drivers/gpu/drm/rcar-du/rcar_du_kms.c | 25 +++++++++++++++++++++++++ > include/drm/drm_atomic.h | 25 +++++++++++++++++++++++++ > 2 files changed, 50 insertions(+) > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c > index f0bc7cc..4d9a19c 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c > @@ -246,6 +246,10 @@ static int rcar_du_atomic_check(struct drm_device *dev, > static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state) > { > struct drm_device *dev = old_state->dev; > + struct drm_crtc *crtc; > + struct drm_crtc_state *crtc_state; > + struct rcar_du_crtc *rcrtc; > + int i; > > /* Apply the atomic update. */ > drm_atomic_helper_commit_modeset_disables(dev, old_state); > @@ -253,6 +257,27 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state) > DRM_PLANE_COMMIT_ACTIVE_ONLY); > drm_atomic_helper_commit_modeset_enables(dev, old_state); > > + /* Update gamma and ctm properties for all crtc in present > + * state. Update is done only if there is a change > + */ > + for_each_crtc_in_state(old_state, crtc, crtc_state, i) { > + rcrtc = to_rcar_crtc(crtc); > + > + if (rcrtc->lut_handle) { > + rcar_du_cmm_update_lut_and_free > + (rcrtc->lut_handle, > + (struct drm_color_lut *)crtc->state->gamma_lut->data, > + (crtc->state->gamma_lut->length / > + sizeof(struct drm_color_lut))); > + rcrtc->lut_handle = NULL; > + } > + if (rcrtc->clu_handle) { > + rcar_du_cmm_update_clu_and_free > + (rcrtc->clu_handle, > + (struct drm_color_ctm *)crtc->state->ctm->data); > + rcrtc->clu_handle = NULL; > + } > + } > drm_atomic_helper_commit_hw_done(old_state); > drm_atomic_helper_wait_for_flip_done(dev, old_state); We're in the process of reworking the commit tail handler, so I expect major changes will be needed here. > > diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h > index 1e71315..d22ccd8 100644 > --- a/include/drm/drm_atomic.h > +++ b/include/drm/drm_atomic.h > @@ -693,6 +693,31 @@ void drm_state_dump(struct drm_device *dev, struct drm_printer *p); > (new_connector_state) = (__state)->connectors[__i].new_state, 1)) > > /** > + * for_each_crtc_in_state - iterate over all connectors in an atomic update > + * @__state: &struct drm_atomic_state pointer > + * @crtc: &struct drm_crtc iteration cursor > + * @crtc_state: &struct drm_crtc_state iteration cursor > + * @__i: int iteration cursor, for macro-internal use > + * > + * This iterates over all CRTCs in an atomic update. Note that before the > + * software state is committed (by calling drm_atomic_helper_swap_state(), this > + * points to the new state, while afterwards it points to the old state. Due to > + * this tricky confusion this macro is deprecated. > + * > + * FIXME: > + * > + * Replace all usage of this with one of the explicit iterators below and then > + * remove this macro. Then don't add it :-) In general you should look at the code you want to upstream, this feels like it was a blind copy from a BSP without giving it much consideration. > + */ > +#define for_each_crtc_in_state(__state, crtc, crtc_state, __i) \ > + for ((__i) = 0; \ > + ((__i) < ((__state)->dev->mode_config.num_crtc)) && \ > + ((crtc) = ((__state)->crtcs[__i].ptr), \ > + (crtc_state) = ((__state)->crtcs[__i].state), 1); \ > + (__i)++) \ > + for_each_if(crtc_state) > + > +/** > * for_each_oldnew_crtc_in_state - iterate over all CRTCs in an atomic update > * @__state: &struct drm_atomic_state pointer > * @crtc: &struct drm_crtc iteration cursor
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index f0bc7cc..4d9a19c 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c @@ -246,6 +246,10 @@ static int rcar_du_atomic_check(struct drm_device *dev, static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state) { struct drm_device *dev = old_state->dev; + struct drm_crtc *crtc; + struct drm_crtc_state *crtc_state; + struct rcar_du_crtc *rcrtc; + int i; /* Apply the atomic update. */ drm_atomic_helper_commit_modeset_disables(dev, old_state); @@ -253,6 +257,27 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state) DRM_PLANE_COMMIT_ACTIVE_ONLY); drm_atomic_helper_commit_modeset_enables(dev, old_state); + /* Update gamma and ctm properties for all crtc in present + * state. Update is done only if there is a change + */ + for_each_crtc_in_state(old_state, crtc, crtc_state, i) { + rcrtc = to_rcar_crtc(crtc); + + if (rcrtc->lut_handle) { + rcar_du_cmm_update_lut_and_free + (rcrtc->lut_handle, + (struct drm_color_lut *)crtc->state->gamma_lut->data, + (crtc->state->gamma_lut->length / + sizeof(struct drm_color_lut))); + rcrtc->lut_handle = NULL; + } + if (rcrtc->clu_handle) { + rcar_du_cmm_update_clu_and_free + (rcrtc->clu_handle, + (struct drm_color_ctm *)crtc->state->ctm->data); + rcrtc->clu_handle = NULL; + } + } drm_atomic_helper_commit_hw_done(old_state); drm_atomic_helper_wait_for_flip_done(dev, old_state); diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index 1e71315..d22ccd8 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -693,6 +693,31 @@ void drm_state_dump(struct drm_device *dev, struct drm_printer *p); (new_connector_state) = (__state)->connectors[__i].new_state, 1)) /** + * for_each_crtc_in_state - iterate over all connectors in an atomic update + * @__state: &struct drm_atomic_state pointer + * @crtc: &struct drm_crtc iteration cursor + * @crtc_state: &struct drm_crtc_state iteration cursor + * @__i: int iteration cursor, for macro-internal use + * + * This iterates over all CRTCs in an atomic update. Note that before the + * software state is committed (by calling drm_atomic_helper_swap_state(), this + * points to the new state, while afterwards it points to the old state. Due to + * this tricky confusion this macro is deprecated. + * + * FIXME: + * + * Replace all usage of this with one of the explicit iterators below and then + * remove this macro. + */ +#define for_each_crtc_in_state(__state, crtc, crtc_state, __i) \ + for ((__i) = 0; \ + ((__i) < ((__state)->dev->mode_config.num_crtc)) && \ + ((crtc) = ((__state)->crtcs[__i].ptr), \ + (crtc_state) = ((__state)->crtcs[__i].state), 1); \ + (__i)++) \ + for_each_if(crtc_state) + +/** * for_each_oldnew_crtc_in_state - iterate over all CRTCs in an atomic update * @__state: &struct drm_atomic_state pointer * @crtc: &struct drm_crtc iteration cursor