linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found
@ 2023-08-29 13:19 Michael Walle
  2023-08-29 13:19 ` [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation Michael Walle
  2023-08-29 16:00 ` [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found Nícolas F. R. A. Prado
  0 siblings, 2 replies; 5+ messages in thread
From: Michael Walle @ 2023-08-29 13:19 UTC (permalink / raw)
  To: Nícolas F . R . A . Prado, Chun-Kuang Hu, Philipp Zabel,
	David Airlie, Daniel Vetter, Matthias Brugger,
	AngeloGioacchino Del Regno
  Cc: Nancy . Lin, Frank Wunderlich, Jitao Shi, Stu Hsieh, dri-devel,
	linux-mediatek, linux-kernel, linux-arm-kernel, Michael Walle

drm_crtc_from_index(0) might return NULL if there are not CRTCs
registered at all which will lead to a kernel oops in
mtk_drm_crtc_dma_dev_get(). Add the missing return value check.

Fixes: 0d9eee9118b7 ("drm/mediatek: Add drm ovl_adaptor sub driver for MT8195")
Signed-off-by: Michael Walle <mwalle@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_drm_drv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 93552d76b6e7..2c582498817e 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -420,6 +420,7 @@ static int mtk_drm_kms_init(struct drm_device *drm)
 	struct mtk_drm_private *private = drm->dev_private;
 	struct mtk_drm_private *priv_n;
 	struct device *dma_dev = NULL;
+	struct drm_crtc *crtc;
 	int ret, i, j;
 
 	if (drm_firmware_drivers_only())
@@ -494,7 +495,9 @@ static int mtk_drm_kms_init(struct drm_device *drm)
 	}
 
 	/* Use OVL device for all DMA memory allocations */
-	dma_dev = mtk_drm_crtc_dma_dev_get(drm_crtc_from_index(drm, 0));
+	crtc = drm_crtc_from_index(drm, 0);
+	if (crtc)
+		dma_dev = mtk_drm_crtc_dma_dev_get(crtc);
 	if (!dma_dev) {
 		ret = -ENODEV;
 		dev_err(drm->dev, "Need at least one OVL device\n");
-- 
2.39.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation
  2023-08-29 13:19 [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found Michael Walle
@ 2023-08-29 13:19 ` Michael Walle
  2023-08-29 17:50   ` Nícolas F. R. A. Prado
  2023-08-29 16:00 ` [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found Nícolas F. R. A. Prado
  1 sibling, 1 reply; 5+ messages in thread
From: Michael Walle @ 2023-08-29 13:19 UTC (permalink / raw)
  To: Nícolas F . R . A . Prado, Chun-Kuang Hu, Philipp Zabel,
	David Airlie, Daniel Vetter, Matthias Brugger,
	AngeloGioacchino Del Regno
  Cc: Nancy . Lin, Frank Wunderlich, Jitao Shi, Stu Hsieh, dri-devel,
	linux-mediatek, linux-kernel, linux-arm-kernel, Michael Walle

mtk_drm_find_possible_crtc_by_comp() assumed that the main path will
always have the CRTC with id 0, the ext id 1 and the third id 2. This
is only true if the paths are all available. But paths are optional (see
also comment in mtk_drm_kms_init()), e.g. the main path might not be
enabled or available at all. Then the CRTC IDs will shift one up, e.g.
ext will be 1 and the third path will be 2.

To fix that, dynamically calculate the IDs by the precence of the paths.

Fixes: 5aa8e7647676 ("drm/mediatek: dpi/dsi: Change the getting possible_crtc way")
Suggested-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
Signed-off-by: Michael Walle <mwalle@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 41 ++++++++++++++-------
 1 file changed, 27 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
index 771f4e173353..f3064bff64e8 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
@@ -526,21 +526,34 @@ unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
 						struct device *dev)
 {
 	struct mtk_drm_private *private = drm->dev_private;
-	unsigned int ret = 0;
-
-	if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path, private->data->main_len,
-				     private->ddp_comp))
-		ret = BIT(0);
-	else if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path,
-					  private->data->ext_len, private->ddp_comp))
-		ret = BIT(1);
-	else if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path,
-					  private->data->third_len, private->ddp_comp))
-		ret = BIT(2);
-	else
-		DRM_INFO("Failed to find comp in ddp table\n");
+	int i = 0;
+
+	if (private->data->main_path) {
+		if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path,
+					     private->data->main_len,
+					     private->ddp_comp))
+			return BIT(i);
+		i++;
+	}
+
+	if (private->data->ext_path) {
+		if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path,
+					     private->data->ext_len,
+					     private->ddp_comp))
+			return BIT(i);
+		i++;
+	}
 
-	return ret;
+	if (private->data->third_path) {
+		if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path,
+					     private->data->third_len,
+					     private->ddp_comp))
+			return BIT(i);
+		i++;
+	}
+
+	DRM_INFO("Failed to find comp in ddp table\n");
+	return 0;
 }
 
 int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp,
-- 
2.39.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found
  2023-08-29 13:19 [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found Michael Walle
  2023-08-29 13:19 ` [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation Michael Walle
@ 2023-08-29 16:00 ` Nícolas F. R. A. Prado
  1 sibling, 0 replies; 5+ messages in thread
From: Nícolas F. R. A. Prado @ 2023-08-29 16:00 UTC (permalink / raw)
  To: Michael Walle
  Cc: Chun-Kuang Hu, Philipp Zabel, David Airlie, Daniel Vetter,
	Matthias Brugger, AngeloGioacchino Del Regno, Nancy . Lin,
	Frank Wunderlich, Jitao Shi, Stu Hsieh, dri-devel, linux-mediatek,
	linux-kernel, linux-arm-kernel

On Tue, Aug 29, 2023 at 03:19:40PM +0200, Michael Walle wrote:
> drm_crtc_from_index(0) might return NULL if there are not CRTCs

Typo: not -> no

> registered at all which will lead to a kernel oops in
> mtk_drm_crtc_dma_dev_get(). Add the missing return value check.
> 
> Fixes: 0d9eee9118b7 ("drm/mediatek: Add drm ovl_adaptor sub driver for MT8195")
> Signed-off-by: Michael Walle <mwalle@kernel.org>

There's also a typo in the commit subject: mediathek -> mediatek. But
regardless,

Reviewed-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
Tested-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>

(tested that the patch fixes the oops on mt8195-cherry-tomato when no display
pipeline is available)

Thanks,
Nícolas

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation
  2023-08-29 13:19 ` [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation Michael Walle
@ 2023-08-29 17:50   ` Nícolas F. R. A. Prado
  2023-08-30 10:55     ` Michael Walle
  0 siblings, 1 reply; 5+ messages in thread
From: Nícolas F. R. A. Prado @ 2023-08-29 17:50 UTC (permalink / raw)
  To: Michael Walle
  Cc: Chun-Kuang Hu, Philipp Zabel, David Airlie, Daniel Vetter,
	Matthias Brugger, AngeloGioacchino Del Regno, Nancy . Lin,
	Frank Wunderlich, Jitao Shi, Stu Hsieh, dri-devel, linux-mediatek,
	linux-kernel, linux-arm-kernel

On Tue, Aug 29, 2023 at 03:19:41PM +0200, Michael Walle wrote:
> mtk_drm_find_possible_crtc_by_comp() assumed that the main path will
> always have the CRTC with id 0, the ext id 1 and the third id 2. This
> is only true if the paths are all available. But paths are optional (see
> also comment in mtk_drm_kms_init()), e.g. the main path might not be
> enabled or available at all. Then the CRTC IDs will shift one up, e.g.
> ext will be 1 and the third path will be 2.
> 
> To fix that, dynamically calculate the IDs by the precence of the paths.
> 
> Fixes: 5aa8e7647676 ("drm/mediatek: dpi/dsi: Change the getting possible_crtc way")
> Suggested-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
> Signed-off-by: Michael Walle <mwalle@kernel.org>
> ---
>  drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 41 ++++++++++++++-------
>  1 file changed, 27 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> index 771f4e173353..f3064bff64e8 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> @@ -526,21 +526,34 @@ unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
>  						struct device *dev)
>  {
>  	struct mtk_drm_private *private = drm->dev_private;
> -	unsigned int ret = 0;
> -
> -	if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path, private->data->main_len,
> -				     private->ddp_comp))
> -		ret = BIT(0);
> -	else if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path,
> -					  private->data->ext_len, private->ddp_comp))
> -		ret = BIT(1);
> -	else if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path,
> -					  private->data->third_len, private->ddp_comp))
> -		ret = BIT(2);
> -	else
> -		DRM_INFO("Failed to find comp in ddp table\n");
> +	int i = 0;
> +
> +	if (private->data->main_path) {
> +		if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path,
> +					     private->data->main_len,
> +					     private->ddp_comp))
> +			return BIT(i);
> +		i++;
> +	}
> +
> +	if (private->data->ext_path) {
> +		if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path,
> +					     private->data->ext_len,
> +					     private->ddp_comp))
> +			return BIT(i);
> +		i++;

This won't work. On MT8195 there are two display IPs, vdosys0 and vdosys1,
vdosys0 only has the main path while vdosys1 only has the external path. So you
need to loop over each one in all_drm_private[j] to get the right crtc ID for
MT8195.

Thanks,
Nícolas

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation
  2023-08-29 17:50   ` Nícolas F. R. A. Prado
@ 2023-08-30 10:55     ` Michael Walle
  0 siblings, 0 replies; 5+ messages in thread
From: Michael Walle @ 2023-08-30 10:55 UTC (permalink / raw)
  To: Nícolas F. R. A. Prado
  Cc: Chun-Kuang Hu, Philipp Zabel, David Airlie, Daniel Vetter,
	Matthias Brugger, AngeloGioacchino Del Regno, Nancy . Lin,
	Frank Wunderlich, Jitao Shi, Stu Hsieh, dri-devel, linux-mediatek,
	linux-kernel, linux-arm-kernel

> This won't work. On MT8195 there are two display IPs, vdosys0 and 
> vdosys1,
> vdosys0 only has the main path while vdosys1 only has the external 
> path. So you
> need to loop over each one in all_drm_private[j] to get the right crtc 
> ID for
> MT8195.

Ahh thanks, got it.

-michael

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

end of thread, other threads:[~2023-08-30 10:56 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-29 13:19 [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found Michael Walle
2023-08-29 13:19 ` [PATCH 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation Michael Walle
2023-08-29 17:50   ` Nícolas F. R. A. Prado
2023-08-30 10:55     ` Michael Walle
2023-08-29 16:00 ` [PATCH 1/2] drm/mediathek: fix kernel oops if no crtc is found Nícolas F. R. A. Prado

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).