[PATCH] drm/komeda: Fix off-by-1 when with readback conn due to rounding

James Qian Wang james.qian.wang at arm.com
Tue Mar 16 03:17:56 UTC 2021


On Fri, Mar 12, 2021 at 10:55:21AM +0000, Brian Starkey wrote:
> (Adding back James again - did you use get_maintainer.pl?)
> 
> On Thu, Mar 11, 2021 at 12:08:46PM +0000, carsten.haitzler at foss.arm.com wrote:
> > From: Carsten Haitzler <carsten.haitzler at arm.com>
> > 
> > When setting up a readback connector that writes data back to memory
> > rather than to an actual output device (HDMI etc.), rounding was set
> > to round. As the DPU uses a higher internal number of bits when generating
> > a color value, this round-down back to 8bit ended up with everything
> > being off-by one. e.g. #fefefe became #ffffff. This sets
> 
> Perhaps overly pedantic, but now we've tracked down what was actually
> happening I think we can be more precise here. Not _everything_ is
> off-by-one, it's just rounding in the standard sense - if the most
> significant bit-to-be-discarded is set, the value is rounded up to
> minimise the absolute error introduced by bit-depth reduction.
> 
> > rounding to "round-down" so things end up correct by turning on the LW_TRC
> > round down flag.
> 
> Can we call it "truncate" rather than round down? I think it makes
> "TRC" a bit more understandable.
> 
> > 
> > Signed-off-by: Carsten Haitzler <carsten.haitzler at arm.com>
> > ---
> >  drivers/gpu/drm/arm/display/komeda/d71/d71_component.c | 7 ++++++-
> >  drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h      | 1 +
> >  2 files changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > index 8a02ade369db..e97acc5519d1 100644
> > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > @@ -468,7 +468,12 @@ static void d71_wb_layer_update(struct komeda_component *c,
> >  	struct komeda_layer_state *st = to_layer_st(state);
> >  	struct drm_connector_state *conn_st = state->wb_conn->state;
> >  	struct komeda_fb *kfb = to_kfb(conn_st->writeback_job->fb);
> > -	u32 ctrl = L_EN | LW_OFM, mask = L_EN | LW_OFM | LW_TBU_EN;
> > +	/* LW_TRC sets rounding to truncate not round which is needed for
> > +	 * the output of writeback to match the input in the most common
> > +	 * use cases like RGB888 -> RGB888, so set this bit by default
> > +	 */
> 
> Hm, not sure why this file uses "net/" style comments, but as you
> said, this is in-keeping with the rest of the file, so meh :-)
> 
> > +	u32 ctrl = LW_TRC | L_EN | LW_OFM;
> > +	u32 mask = LW_TRC | L_EN | LW_OFM | LW_TBU_EN;
> 
> If you were aiming for matching register order, this should be:
> 
>     L_EN | LW_TRC | LW_OFM | LW_TBU_EN
> 
> 
> I think it'd be nice to have the exact behaviour in the commit
> message, but either way this seems OK as a pragmatic fix so:
> 
> Reviewed-by: Brian Starkey <brian.starkey at arm.com>
> 
> Thanks,
> -Brian
> 
> >  	u32 __iomem *reg = c->reg;
> >  
> >  	d71_layer_update_fb(c, kfb, st->addr);
> > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> > index e80172a0b320..a8036689d721 100644
> > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> > @@ -321,6 +321,7 @@
> >  #define LAYER_WR_FORMAT		0x0D8
> >  
> >  /* Layer_WR control bits */
> > +#define LW_TRC			BIT(1)
> >  #define LW_OFM			BIT(4)
> >  #define LW_LALPHA(x)		(((x) & 0xFF) << 8)
> >  #define LW_A_WCACHE(x)		(((x) & 0xF) << 28)
> > -- 
> > 2.30.0
> > 

Acked-by: James Qian Wang <james.qian.wang at arm.com>

Thanks
James

> > _______________________________________________
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list