On Sat, Jun 17, 2017 at 07:48:04PM +0200, Peter Rosin wrote: > The clut is not synchronized with the drm gamma_lut state. > > Signed-off-by: Peter Rosin <peda@xxxxxxxxxx> This needs to be done in the fbdev helper, not like this. Yes it's an old issue, but forcing every driver to duplicate code like this isn't cool. Thanks, Daniel > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 53 ++++++++++++++++++++++++++ > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 12 +++++- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h | 4 ++ > 3 files changed, 67 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > index 694adcc..4bee26e 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > @@ -140,6 +140,58 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) > cfg); > } > > +static void > +atmel_hlcdc_crtc_load_lut(struct drm_crtc *c) > +{ > + struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c); > + struct atmel_hlcdc_dc *dc = crtc->dc; > + uint16_t *red = c->gamma_store; > + uint16_t *green = red + c->gamma_size; > + uint16_t *blue = green + c->gamma_size; > + int layer; > + int idx; > + > + for (layer = 0; layer < ATMEL_HLCDC_MAX_LAYERS; layer++) { > + if (!dc->layers[layer]) > + continue; > + > + for (idx = 0; idx < ATMEL_HLCDC_CLUT_SIZE; idx++) { > + u32 val = ((red[idx] << 8) & 0xff0000) | > + (green[idx] & 0xff00) | > + (blue[idx] >> 8); > + > + atmel_hlcdc_layer_write_clut(dc->layers[layer], > + idx, val); > + } > + } > +} > + > +void atmel_hlcdc_gamma_set(struct drm_crtc *c, > + u16 r, u16 g, u16 b, int idx) > +{ > + if (idx < 0 || idx >= c->gamma_size) > + return; > + > + c->gamma_store[idx] = r; > + idx += c->gamma_size; > + c->gamma_store[idx] = g; > + idx += c->gamma_size; > + c->gamma_store[idx] = b; > +} > + > +void atmel_hlcdc_gamma_get(struct drm_crtc *c, > + u16 *r, u16 *g, u16 *b, int idx) > +{ > + if (idx < 0 || idx >= c->gamma_size) > + return; > + > + *r = c->gamma_store[idx]; > + idx += c->gamma_size; > + *g = c->gamma_store[idx]; > + idx += c->gamma_size; > + *b = c->gamma_store[idx]; > +} > + > static enum drm_mode_status > atmel_hlcdc_crtc_mode_valid(struct drm_crtc *c, > const struct drm_display_mode *mode) > @@ -319,6 +371,7 @@ static const struct drm_crtc_helper_funcs lcdc_crtc_helper_funcs = { > .mode_set = drm_helper_crtc_mode_set, > .mode_set_nofb = atmel_hlcdc_crtc_mode_set_nofb, > .mode_set_base = drm_helper_crtc_mode_set_base, > + .load_lut = atmel_hlcdc_crtc_load_lut, > .disable = atmel_hlcdc_crtc_disable, > .enable = atmel_hlcdc_crtc_enable, > .atomic_check = atmel_hlcdc_crtc_atomic_check, > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > index 4f6ef07..9a09c73 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > @@ -601,6 +601,12 @@ static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev) > return 0; > } > > +static const struct drm_fb_helper_funcs atmel_hlcdc_fb_cma_helper_funcs = { > + .gamma_set = atmel_hlcdc_gamma_set, > + .gamma_get = atmel_hlcdc_gamma_get, > + .fb_probe = drm_fbdev_cma_create, > +}; > + > static int atmel_hlcdc_dc_load(struct drm_device *dev) > { > struct platform_device *pdev = to_platform_device(dev->dev); > @@ -664,8 +670,10 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > > platform_set_drvdata(pdev, dev); > > - dc->fbdev = drm_fbdev_cma_init(dev, 24, > - dev->mode_config.num_connector); > + dc->fbdev = drm_fbdev_cma_init_with_funcs2(dev, 24, > + dev->mode_config.num_connector, > + NULL, > + &atmel_hlcdc_fb_cma_helper_funcs); > if (IS_ERR(dc->fbdev)) > dc->fbdev = NULL; > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > index 709f7b9..1b13224 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > @@ -32,6 +32,7 @@ > #include <drm/drm_atomic_helper.h> > #include <drm/drm_crtc.h> > #include <drm/drm_crtc_helper.h> > +#include <drm/drm_fb_helper.h> > #include <drm/drm_fb_cma_helper.h> > #include <drm/drm_gem_cma_helper.h> > #include <drm/drm_panel.h> > @@ -448,6 +449,9 @@ void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane); > int atmel_hlcdc_plane_prepare_disc_area(struct drm_crtc_state *c_state); > int atmel_hlcdc_plane_prepare_ahb_routing(struct drm_crtc_state *c_state); > > +void atmel_hlcdc_gamma_set(struct drm_crtc *c, u16 r, u16 g, u16 b, int idx); > +void atmel_hlcdc_gamma_get(struct drm_crtc *c, u16 *r, u16 *g, u16 *b, int idx); > + > void atmel_hlcdc_crtc_irq(struct drm_crtc *c); > > int atmel_hlcdc_crtc_create(struct drm_device *dev); > -- > 2.1.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel