All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos
       [not found] <CGME20230721112842eucas1p2071651599fd2b86792b84aa3770fba67@eucas1p2.samsung.com>
@ 2023-07-21 11:28 ` Marek Szyprowski
  2023-07-21 19:23   ` Marek Vasut
  2023-07-21 20:46   ` Fabio Estevam
  0 siblings, 2 replies; 5+ messages in thread
From: Marek Szyprowski @ 2023-07-21 11:28 UTC (permalink / raw)
  To: dri-devel
  Cc: Marek Vasut, Neil Armstrong, Robert Foss, Jonas Karlman,
	Laurent Pinchart, Jernej Skrabec, Tomasz Figa, Jagan Teki,
	Andrzej Hajda, Marek Szyprowski

Samsung DSIM used in older Exynos SoCs (like Exynos 4210, 4x12, 3250)
doesn't report empty level of packer header FIFO. In case of those SoCs,
use the old way of waiting for empty command tranfsfer FIFO, removed
recently by commit 14806c641582 ("Drain command transfer FIFO before
transfer").

Fixes: 14806c641582 ("Drain command transfer FIFO before transfer")
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
v2:
- added additional delay when workaround is used as suggested by Marek Vasut

v1: https://lore.kernel.org/all/20230718131859.3114135-1-m.szyprowski@samsung.com/
---
 drivers/gpu/drm/bridge/samsung-dsim.c | 18 ++++++++++++++++--
 include/drm/bridge/samsung-dsim.h     |  1 +
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 9b7a00bafeaa..d06401de637c 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -412,6 +412,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
 	.m_min = 41,
 	.m_max = 125,
 	.min_freq = 500,
+	.has_broken_fifoctrl_emptyhdr = 1,
 };
 
 static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
@@ -428,6 +429,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
 	.m_min = 41,
 	.m_max = 125,
 	.min_freq = 500,
+	.has_broken_fifoctrl_emptyhdr = 1,
 };
 
 static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
@@ -1009,8 +1011,20 @@ static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi)
 	do {
 		u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG);
 
-		if (reg & DSIM_SFR_HEADER_EMPTY)
-			return 0;
+		if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) {
+			if (reg & DSIM_SFR_HEADER_EMPTY)
+				return 0;
+		} else {
+			if (!(reg & DSIM_SFR_HEADER_FULL)) {
+				/*
+				 * Wait a little bit, so the pending data can
+				 * actually leave the FIFO to avoid overflow.
+				 */
+				if (!cond_resched())
+					usleep_range(950, 1050);
+				return 0;
+			}
+		}
 
 		if (!cond_resched())
 			usleep_range(950, 1050);
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 05100e91ecb9..18017b3e5d9e 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -62,6 +62,7 @@ struct samsung_dsim_driver_data {
 	const unsigned int *reg_values;
 	u16 m_min;
 	u16 m_max;
+	unsigned int has_broken_fifoctrl_emptyhdr;
 };
 
 struct samsung_dsim_host_ops {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos
  2023-07-21 11:28 ` [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos Marek Szyprowski
@ 2023-07-21 19:23   ` Marek Vasut
  2023-07-21 20:46   ` Fabio Estevam
  1 sibling, 0 replies; 5+ messages in thread
From: Marek Vasut @ 2023-07-21 19:23 UTC (permalink / raw)
  To: Marek Szyprowski, dri-devel
  Cc: Neil Armstrong, Robert Foss, Jonas Karlman, Jernej Skrabec,
	Tomasz Figa, Jagan Teki, Andrzej Hajda, Laurent Pinchart

On 7/21/23 13:28, Marek Szyprowski wrote:
> Samsung DSIM used in older Exynos SoCs (like Exynos 4210, 4x12, 3250)
> doesn't report empty level of packer header FIFO. In case of those SoCs,
> use the old way of waiting for empty command tranfsfer FIFO, removed
> recently by commit 14806c641582 ("Drain command transfer FIFO before
> transfer").
> 
> Fixes: 14806c641582 ("Drain command transfer FIFO before transfer")
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>

Reviewed-by: Marek Vasut <marex@denx.de>

Thanks !

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos
  2023-07-21 11:28 ` [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos Marek Szyprowski
  2023-07-21 19:23   ` Marek Vasut
@ 2023-07-21 20:46   ` Fabio Estevam
  1 sibling, 0 replies; 5+ messages in thread
From: Fabio Estevam @ 2023-07-21 20:46 UTC (permalink / raw)
  To: Marek Szyprowski
  Cc: Marek Vasut, Neil Armstrong, Jernej Skrabec, Robert Foss,
	Jonas Karlman, dri-devel, Tomasz Figa, Laurent Pinchart,
	Andrzej Hajda, Jagan Teki

On Fri, Jul 21, 2023 at 8:28 AM Marek Szyprowski
<m.szyprowski@samsung.com> wrote:
>
> Samsung DSIM used in older Exynos SoCs (like Exynos 4210, 4x12, 3250)
> doesn't report empty level of packer header FIFO. In case of those SoCs,
> use the old way of waiting for empty command tranfsfer FIFO, removed
> recently by commit 14806c641582 ("Drain command transfer FIFO before
> transfer").
>
> Fixes: 14806c641582 ("Drain command transfer FIFO before transfer")

Nitpick: the Subject of the commit log is not complete.

Fixes: 14806c641582 ("drm: bridge: samsung-dsim: Drain command
transfer FIFO before transfer")



> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
> v2:
> - added additional delay when workaround is used as suggested by Marek Vasut
>
> v1: https://lore.kernel.org/all/20230718131859.3114135-1-m.szyprowski@samsung.com/
> ---
>  drivers/gpu/drm/bridge/samsung-dsim.c | 18 ++++++++++++++++--
>  include/drm/bridge/samsung-dsim.h     |  1 +
>  2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
> index 9b7a00bafeaa..d06401de637c 100644
> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> @@ -412,6 +412,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
>         .m_min = 41,
>         .m_max = 125,
>         .min_freq = 500,
> +       .has_broken_fifoctrl_emptyhdr = 1,
>  };
>
>  static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
> @@ -428,6 +429,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
>         .m_min = 41,
>         .m_max = 125,
>         .min_freq = 500,
> +       .has_broken_fifoctrl_emptyhdr = 1,
>  };
>
>  static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
> @@ -1009,8 +1011,20 @@ static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi)
>         do {
>                 u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG);
>
> -               if (reg & DSIM_SFR_HEADER_EMPTY)
> -                       return 0;
> +               if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) {
> +                       if (reg & DSIM_SFR_HEADER_EMPTY)
> +                               return 0;
> +               } else {
> +                       if (!(reg & DSIM_SFR_HEADER_FULL)) {
> +                               /*
> +                                * Wait a little bit, so the pending data can
> +                                * actually leave the FIFO to avoid overflow.
> +                                */
> +                               if (!cond_resched())
> +                                       usleep_range(950, 1050);
> +                               return 0;
> +                       }
> +               }
>
>                 if (!cond_resched())
>                         usleep_range(950, 1050);
> diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
> index 05100e91ecb9..18017b3e5d9e 100644
> --- a/include/drm/bridge/samsung-dsim.h
> +++ b/include/drm/bridge/samsung-dsim.h
> @@ -62,6 +62,7 @@ struct samsung_dsim_driver_data {
>         const unsigned int *reg_values;
>         u16 m_min;
>         u16 m_max;
> +       unsigned int has_broken_fifoctrl_emptyhdr;
>  };
>
>  struct samsung_dsim_host_ops {
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos
  2023-08-07 13:00 ` Marek Szyprowski
@ 2023-08-07 14:07   ` Marek Vasut
  0 siblings, 0 replies; 5+ messages in thread
From: Marek Vasut @ 2023-08-07 14:07 UTC (permalink / raw)
  To: Marek Szyprowski, dri-devel
  Cc: Neil Armstrong, Robert Foss, Jonas Karlman, Jernej Skrabec,
	Tomasz Figa, Jagan Teki, Andrzej Hajda, Laurent Pinchart

On 8/7/23 15:00, Marek Szyprowski wrote:

Hi,

> diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
> index 05100e91ecb9..18017b3e5d9e 100644
> --- a/include/drm/bridge/samsung-dsim.h
> +++ b/include/drm/bridge/samsung-dsim.h
> @@ -62,6 +62,7 @@ struct samsung_dsim_driver_data {
>   	const unsigned int *reg_values;
>   	u16 m_min;
>   	u16 m_max;
> +	unsigned int has_broken_fifoctrl_emptyhdr;

Do we want to do :1 here to allow more flags in the future ?

Like this:
unsigned int has_broken_fifoctrl_emptyhdr:1;
unsigned int another_flag:1;
...

I didn't realize this before, sorry.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos
       [not found] <CGME20230807130041eucas1p1bf8380490bcf76a34d2c09bfcbdb757b@eucas1p1.samsung.com>
@ 2023-08-07 13:00 ` Marek Szyprowski
  2023-08-07 14:07   ` Marek Vasut
  0 siblings, 1 reply; 5+ messages in thread
From: Marek Szyprowski @ 2023-08-07 13:00 UTC (permalink / raw)
  To: dri-devel
  Cc: Marek Vasut, Neil Armstrong, Robert Foss, Jonas Karlman,
	Laurent Pinchart, Jernej Skrabec, Tomasz Figa, Jagan Teki,
	Andrzej Hajda, Marek Szyprowski

Samsung DSIM used in older Exynos SoCs (like Exynos 4210, 4x12, 3250)
doesn't report empty level of packer header FIFO. In case of those SoCs,
use the old way of waiting for empty command tranfsfer FIFO, removed
recently by commit 14806c641582 ("Drain command transfer FIFO before
transfer").

Fixes: 14806c641582 ("drm: bridge: samsung-dsim: Drain command transfer FIFO before transfer")
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Marek Vasut <marex@denx.de>
---
v3:
- fixed 'fixes' tag, added reviewed-by

v2:
- added additional delay when workaround is used as suggested by Marek Vasut

v1: https://lore.kernel.org/all/20230718131859.3114135-1-m.szyprowski@samsung.com/
---
 drivers/gpu/drm/bridge/samsung-dsim.c | 18 ++++++++++++++++--
 include/drm/bridge/samsung-dsim.h     |  1 +
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index 9b7a00bafeaa..d06401de637c 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -412,6 +412,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
 	.m_min = 41,
 	.m_max = 125,
 	.min_freq = 500,
+	.has_broken_fifoctrl_emptyhdr = 1,
 };
 
 static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
@@ -428,6 +429,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
 	.m_min = 41,
 	.m_max = 125,
 	.min_freq = 500,
+	.has_broken_fifoctrl_emptyhdr = 1,
 };
 
 static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
@@ -1009,8 +1011,20 @@ static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi)
 	do {
 		u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG);
 
-		if (reg & DSIM_SFR_HEADER_EMPTY)
-			return 0;
+		if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) {
+			if (reg & DSIM_SFR_HEADER_EMPTY)
+				return 0;
+		} else {
+			if (!(reg & DSIM_SFR_HEADER_FULL)) {
+				/*
+				 * Wait a little bit, so the pending data can
+				 * actually leave the FIFO to avoid overflow.
+				 */
+				if (!cond_resched())
+					usleep_range(950, 1050);
+				return 0;
+			}
+		}
 
 		if (!cond_resched())
 			usleep_range(950, 1050);
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 05100e91ecb9..18017b3e5d9e 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -62,6 +62,7 @@ struct samsung_dsim_driver_data {
 	const unsigned int *reg_values;
 	u16 m_min;
 	u16 m_max;
+	unsigned int has_broken_fifoctrl_emptyhdr;
 };
 
 struct samsung_dsim_host_ops {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-08-07 15:54 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20230721112842eucas1p2071651599fd2b86792b84aa3770fba67@eucas1p2.samsung.com>
2023-07-21 11:28 ` [PATCH v2] drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older Exynos Marek Szyprowski
2023-07-21 19:23   ` Marek Vasut
2023-07-21 20:46   ` Fabio Estevam
     [not found] <CGME20230807130041eucas1p1bf8380490bcf76a34d2c09bfcbdb757b@eucas1p1.samsung.com>
2023-08-07 13:00 ` Marek Szyprowski
2023-08-07 14:07   ` Marek Vasut

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.