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

2021-03-29 Thread Carsten Haitzler

On 3/12/21 10:55 AM, Brian Starkey wrote:

(Adding back James again - did you use get_maintainer.pl?)

On Thu, Mar 11, 2021 at 12:08:46PM +, carsten.haitz...@foss.arm.com wrote:

From: Carsten Haitzler 

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 #ff. 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


Well a very large number of pixels were off-by-1 ... I guess it's an 
exaggeration but a "vast number of pixels were off by 1". I guess I was 
just using common terms like "everything is expensive here" doesn't 
actually mean absolutely everything but a very vast number of things. 
You know what I mean. :) The comment as a whole describing rounding 
policies should provide more details. I just write the log as a "when 
spelunking through history, this log will give me some broader insight 
into what this change is without being war and peace and If I want to 
see more and this commit is interesting to my spelunking efforts, I'll 
git log -U to read that".



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.


That's the official name from the docs though (TRC)... makes it easier 
to match to them... So I think you can argue this both ways. The comment 
where it's used though does make it clear...




Signed-off-by: Carsten Haitzler 
---
  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 :-)


Yup. Just stick to "follow the style there" unless there is seemingly a 
good reason that what is there is horribly "broken" and needs fixing up.



+   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:


git log -U ? :)


Reviewed-by: Brian Starkey 

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_OFMBIT(4)
  #define LW_LALPHA(x)  (((x) & 0xFF) << 8)
  #define LW_A_WCACHE(x)(((x) & 0xF) << 28)
--
2.30.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


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

2021-03-15 Thread James Qian Wang
On Fri, Mar 12, 2021 at 10:55:21AM +, Brian Starkey wrote:
> (Adding back James again - did you use get_maintainer.pl?)
> 
> On Thu, Mar 11, 2021 at 12:08:46PM +, carsten.haitz...@foss.arm.com wrote:
> > From: Carsten Haitzler 
> > 
> > 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 #ff. 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 
> > ---
> >  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 
> 
> 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_FORMAT0x0D8
> >  
> >  /* 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 

Thanks
James

> > ___
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


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

2021-03-12 Thread Brian Starkey
(Adding back James again - did you use get_maintainer.pl?)

On Thu, Mar 11, 2021 at 12:08:46PM +, carsten.haitz...@foss.arm.com wrote:
> From: Carsten Haitzler 
> 
> 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 #ff. 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 
> ---
>  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 

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
> 
> ___
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


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

2021-03-11 Thread carsten . haitzler
From: Carsten Haitzler 

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 #ff. This sets
rounding to "round-down" so things end up correct by turning on the LW_TRC
round down flag.

Signed-off-by: Carsten Haitzler 
---
 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
+*/
+   u32 ctrl = LW_TRC | L_EN | LW_OFM;
+   u32 mask = LW_TRC | L_EN | LW_OFM | LW_TBU_EN;
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_FORMAT0x0D8
 
 /* 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

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


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

2021-03-11 Thread Carsten Haitzler

On 3/9/21 11:36 AM, Brian Starkey wrote:

Hi Carsten, (+James for komeda)

Thanks for typing this up.

On Fri, Mar 05, 2021 at 04:38:53PM +, carsten.haitz...@foss.arm.com wrote:

From: Carsten Haitzler 

When setting up a readback conenctor that writes data back to memory


s/readback conenctor/writeback connector/ (similar in the subject)


rather than to an actual output device (HDMI etc.), rounding was ses


s/ses/set/


I swear I re-read the log text... I must be auto-correcting in my head 
as I read. :)



to round-down. As the DPU uses a higher internal number of bits when


"round-down" isn't really accurate - the rounding mode "rounds" based
on the most-significant discarded bit - so can round-up too.

Come to think of it, I can't explain 0xff becoming 0xfe, but still,
truncation is likely fine.


Actually it was the other way - I mixed up the src/dest, but TRC does 
fix it which is the important bit.



generating a color value, this round-down back to 8bit ended up with
everything being off-by one. e.g. #ff became #fefefe. This sets
rounding to "round" so things end up correct by turning on the round
flag (LW_TRC).


LW_TRC is the truncation flag. 0: Round, 1: Truncate



Signed-off-by: Carsten Haitzler 
---
  drivers/gpu/drm/arm/display/komeda/d71/d71_component.c | 6 +-
  drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h  | 1 +
  2 files changed, 6 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..d551e79fa0f1 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,11 @@ 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 round not truncate 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 */


/*
  * Comment style should be like this
  */

Same as above though - your description is inverted. By setting the
LW_TRC bit, you're forcing the hardware to truncate instead of round.


Yeah - inverted. But the source does have mixed comment styles with some
/*
 * 
 */

and some

/*  */

and some

/* 
 */

with the last 2 most common.


+   u32 ctrl = L_EN | LW_OFM | LW_TRC;
+   u32 mask = L_EN | LW_OFM | LW_TBU_EN | LW_TRC;


Really nitpicking, but I think it'd be good to keep these in the same
order as the bits in the register: L_EN | LW_TRC | LW_OFM | LW_TBU_EN


I can do that. I'll send another with the above.


Cheers,
-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_OFMBIT(4)
  #define LW_LALPHA(x)  (((x) & 0xFF) << 8)
  #define LW_A_WCACHE(x)(((x) & 0xF) << 28)
--
2.30.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


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

2021-03-09 Thread Brian Starkey
Hi Carsten, (+James for komeda)

Thanks for typing this up.

On Fri, Mar 05, 2021 at 04:38:53PM +, carsten.haitz...@foss.arm.com wrote:
> From: Carsten Haitzler 
> 
> When setting up a readback conenctor that writes data back to memory

s/readback conenctor/writeback connector/ (similar in the subject)

> rather than to an actual output device (HDMI etc.), rounding was ses

s/ses/set/

> to round-down. As the DPU uses a higher internal number of bits when

"round-down" isn't really accurate - the rounding mode "rounds" based
on the most-significant discarded bit - so can round-up too.

Come to think of it, I can't explain 0xff becoming 0xfe, but still,
truncation is likely fine.

> generating a color value, this round-down back to 8bit ended up with
> everything being off-by one. e.g. #ff became #fefefe. This sets
> rounding to "round" so things end up correct by turning on the round
> flag (LW_TRC).

LW_TRC is the truncation flag. 0: Round, 1: Truncate

> 
> Signed-off-by: Carsten Haitzler 
> ---
>  drivers/gpu/drm/arm/display/komeda/d71/d71_component.c | 6 +-
>  drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h  | 1 +
>  2 files changed, 6 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..d551e79fa0f1 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,11 @@ 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 round not truncate 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 */

/*
 * Comment style should be like this
 */

Same as above though - your description is inverted. By setting the
LW_TRC bit, you're forcing the hardware to truncate instead of round.

> + u32 ctrl = L_EN | LW_OFM | LW_TRC;
> + u32 mask = L_EN | LW_OFM | LW_TBU_EN | LW_TRC;

Really nitpicking, but I think it'd be good to keep these in the same
order as the bits in the register: L_EN | LW_TRC | LW_OFM | LW_TBU_EN

Cheers,
-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
> 
> ___
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


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

2021-03-05 Thread carsten . haitzler
From: Carsten Haitzler 

When setting up a readback conenctor that writes data back to memory
rather than to an actual output device (HDMI etc.), rounding was ses
to round-down. 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. #ff became #fefefe. This sets
rounding to "round" so things end up correct by turning on the round
flag (LW_TRC).

Signed-off-by: Carsten Haitzler 
---
 drivers/gpu/drm/arm/display/komeda/d71/d71_component.c | 6 +-
 drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h  | 1 +
 2 files changed, 6 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..d551e79fa0f1 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,11 @@ 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 round not truncate 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 */
+   u32 ctrl = L_EN | LW_OFM | LW_TRC;
+   u32 mask = L_EN | LW_OFM | LW_TBU_EN | LW_TRC;
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_FORMAT0x0D8
 
 /* 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

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel