dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
@ 2024-01-31  7:57 Qiang Ma
  2024-03-13  6:18 ` Qiang Ma
  0 siblings, 1 reply; 6+ messages in thread
From: Qiang Ma @ 2024-01-31  7:57 UTC (permalink / raw)
  To: alexander.deucher, christian.koenig, Xinhui.Pan, airlied, daniel,
	srinivasan.shanmugam, sunran001
  Cc: Qiang Ma, dri-devel, amd-gfx, linux-kernel

Problem:
The computer in the bios initialization process, unplug the HDMI display,
wait until the system up, plug in the HDMI display, did not enter the
hotplug interrupt function, the display is not bright.

Fix:
After the above problem occurs, and the hpd ack interrupt bit is 1,
the interrupt should be cleared during hpd_init initialization so that
when the driver is ready, it can respond to the hpd interrupt normally.

Signed-off-by: Qiang Ma <maqianga@uniontech.com>
---
v2:
 - Remove unused variable 'tmp'
 - Fixed function spelling errors
 
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |  2 ++
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |  2 ++
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c  | 22 ++++++++++++++++++----
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c  | 22 ++++++++++++++++++----
 4 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index bb666cb7522e..12a8ba929a72 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -51,6 +51,7 @@
 
 static void dce_v10_0_set_display_funcs(struct amdgpu_device *adev);
 static void dce_v10_0_set_irq_funcs(struct amdgpu_device *adev);
+static void dce_v10_0_hpd_int_ack(struct amdgpu_device *adev, int hpd);
 
 static const u32 crtc_offsets[] = {
 	CRTC0_REGISTER_OFFSET,
@@ -363,6 +364,7 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
 				    AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
 		WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
 
+		dce_v10_0_hpd_int_ack(adev, amdgpu_connector->hpd.hpd);
 		dce_v10_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq,
 			       amdgpu_connector->hpd.hpd);
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index 7af277f61cca..745e4fdffade 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -51,6 +51,7 @@
 
 static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev);
 static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev);
+static void dce_v11_0_hpd_int_ack(struct amdgpu_device *adev, int hpd);
 
 static const u32 crtc_offsets[] =
 {
@@ -387,6 +388,7 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
 				    AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
 		WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
 
+		dce_v11_0_hpd_int_ack(adev, amdgpu_connector->hpd.hpd);
 		dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
index 143efc37a17f..28c4a735716b 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -272,6 +272,21 @@ static void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
 	WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
 }
 
+static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
+				 int hpd)
+{
+	u32 tmp;
+
+	if (hpd >= adev->mode_info.num_hpd) {
+		DRM_DEBUG("invalid hdp %d\n", hpd);
+		return;
+	}
+
+	tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
+	tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
+	WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
+}
+
 /**
  * dce_v6_0_hpd_init - hpd setup callback.
  *
@@ -311,6 +326,7 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
 			continue;
 		}
 
+		dce_v6_0_hpd_int_ack(adev, amdgpu_connector->hpd.hpd);
 		dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
@@ -3088,7 +3104,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
 			    struct amdgpu_irq_src *source,
 			    struct amdgpu_iv_entry *entry)
 {
-	uint32_t disp_int, mask, tmp;
+	uint32_t disp_int, mask;
 	unsigned hpd;
 
 	if (entry->src_data[0] >= adev->mode_info.num_hpd) {
@@ -3101,9 +3117,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
 	mask = interrupt_status_offsets[hpd].hpd;
 
 	if (disp_int & mask) {
-		tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
-		tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
-		WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
+		dce_v6_0_hpd_int_ack(adev, hpd);
 		schedule_delayed_work(&adev->hotplug_work, 0);
 		DRM_DEBUG("IH: HPD%d\n", hpd + 1);
 	}
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index adeddfb7ff12..8ff2b5adfd95 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -264,6 +264,21 @@ static void dce_v8_0_hpd_set_polarity(struct amdgpu_device *adev,
 	WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
 }
 
+static void dce_v8_0_hpd_int_ack(struct amdgpu_device *adev,
+				 int hpd)
+{
+	u32 tmp;
+
+	if (hpd >= adev->mode_info.num_hpd) {
+		DRM_DEBUG("invalid hdp %d\n", hpd);
+		return;
+	}
+
+	tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
+	tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
+	WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
+}
+
 /**
  * dce_v8_0_hpd_init - hpd setup callback.
  *
@@ -303,6 +318,7 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
 			continue;
 		}
 
+		dce_v8_0_hpd_int_ack(adev, amdgpu_connector->hpd.hpd);
 		dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
@@ -3176,7 +3192,7 @@ static int dce_v8_0_hpd_irq(struct amdgpu_device *adev,
 			    struct amdgpu_irq_src *source,
 			    struct amdgpu_iv_entry *entry)
 {
-	uint32_t disp_int, mask, tmp;
+	uint32_t disp_int, mask;
 	unsigned hpd;
 
 	if (entry->src_data[0] >= adev->mode_info.num_hpd) {
@@ -3189,9 +3205,7 @@ static int dce_v8_0_hpd_irq(struct amdgpu_device *adev,
 	mask = interrupt_status_offsets[hpd].hpd;
 
 	if (disp_int & mask) {
-		tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
-		tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
-		WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
+		dce_v8_0_hpd_int_ack(adev, hpd);
 		schedule_delayed_work(&adev->hotplug_work, 0);
 		DRM_DEBUG("IH: HPD%d\n", hpd + 1);
 	}
-- 
2.20.1


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

* Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
  2024-01-31  7:57 [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization Qiang Ma
@ 2024-03-13  6:18 ` Qiang Ma
  2024-03-14 14:40   ` Deucher, Alexander
  0 siblings, 1 reply; 6+ messages in thread
From: Qiang Ma @ 2024-03-13  6:18 UTC (permalink / raw)
  To: alexander.deucher, christian.koenig, Xinhui.Pan, airlied, daniel,
	srinivasan.shanmugam, sunran001
  Cc: amd-gfx, dri-devel, linux-kernel

On Wed, 31 Jan 2024 15:57:03 +0800
Qiang Ma <maqianga@uniontech.com> wrote:

Hello everyone, please help review this patch.

  Qiang Ma

> Problem:
> The computer in the bios initialization process, unplug the HDMI
> display, wait until the system up, plug in the HDMI display, did not
> enter the hotplug interrupt function, the display is not bright.
> 
> Fix:
> After the above problem occurs, and the hpd ack interrupt bit is 1,
> the interrupt should be cleared during hpd_init initialization so that
> when the driver is ready, it can respond to the hpd interrupt
> normally.
> 
> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> ---
> v2:
>  - Remove unused variable 'tmp'
>  - Fixed function spelling errors
>  
> drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |  2 ++
>  drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |  2 ++
>  drivers/gpu/drm/amd/amdgpu/dce_v6_0.c  | 22 ++++++++++++++++++----
>  drivers/gpu/drm/amd/amdgpu/dce_v8_0.c  | 22 ++++++++++++++++++----
>  4 files changed, 40 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index
> bb666cb7522e..12a8ba929a72 100644 ---
> a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++
> b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -51,6 +51,7 @@
>  
>  static void dce_v10_0_set_display_funcs(struct amdgpu_device *adev);
>  static void dce_v10_0_set_irq_funcs(struct amdgpu_device *adev);
> +static void dce_v10_0_hpd_int_ack(struct amdgpu_device *adev, int
> hpd); 
>  static const u32 crtc_offsets[] = {
>  	CRTC0_REGISTER_OFFSET,
> @@ -363,6 +364,7 @@ static void dce_v10_0_hpd_init(struct
> amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
>  		WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 
> +		dce_v10_0_hpd_int_ack(adev,
> amdgpu_connector->hpd.hpd); dce_v10_0_hpd_set_polarity(adev,
> amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
>  			       amdgpu_connector->hpd.hpd);
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index
> 7af277f61cca..745e4fdffade 100644 ---
> a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++
> b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -51,6 +51,7 @@
>  
>  static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev);
>  static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev);
> +static void dce_v11_0_hpd_int_ack(struct amdgpu_device *adev, int
> hpd); 
>  static const u32 crtc_offsets[] =
>  {
> @@ -387,6 +388,7 @@ static void dce_v11_0_hpd_init(struct
> amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
>  		WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 
> +		dce_v11_0_hpd_int_ack(adev,
> amdgpu_connector->hpd.hpd); dce_v11_0_hpd_set_polarity(adev,
> amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> amdgpu_connector->hpd.hpd); }
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index
> 143efc37a17f..28c4a735716b 100644 ---
> a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++
> b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c @@ -272,6 +272,21 @@ static
> void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
> WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
>  
> +static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
> +				 int hpd)
> +{
> +	u32 tmp;
> +
> +	if (hpd >= adev->mode_info.num_hpd) {
> +		DRM_DEBUG("invalid hdp %d\n", hpd);
> +		return;
> +	}
> +
> +	tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> +	tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> +	WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
> +}
> +
>  /**
>   * dce_v6_0_hpd_init - hpd setup callback.
>   *
> @@ -311,6 +326,7 @@ static void dce_v6_0_hpd_init(struct
> amdgpu_device *adev) continue;
>  		}
>  
> +		dce_v6_0_hpd_int_ack(adev,
> amdgpu_connector->hpd.hpd); dce_v6_0_hpd_set_polarity(adev,
> amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> amdgpu_connector->hpd.hpd); }
> @@ -3088,7 +3104,7 @@ static int dce_v6_0_hpd_irq(struct
> amdgpu_device *adev, struct amdgpu_irq_src *source,
>  			    struct amdgpu_iv_entry *entry)
>  {
> -	uint32_t disp_int, mask, tmp;
> +	uint32_t disp_int, mask;
>  	unsigned hpd;
>  
>  	if (entry->src_data[0] >= adev->mode_info.num_hpd) {
> @@ -3101,9 +3117,7 @@ static int dce_v6_0_hpd_irq(struct
> amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
>  
>  	if (disp_int & mask) {
> -		tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> hpd_offsets[hpd]);
> -		tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> -		WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> tmp);
> +		dce_v6_0_hpd_int_ack(adev, hpd);
>  		schedule_delayed_work(&adev->hotplug_work, 0);
>  		DRM_DEBUG("IH: HPD%d\n", hpd + 1);
>  	}
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index
> adeddfb7ff12..8ff2b5adfd95 100644 ---
> a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++
> b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c @@ -264,6 +264,21 @@ static
> void dce_v8_0_hpd_set_polarity(struct amdgpu_device *adev,
> WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
>  
> +static void dce_v8_0_hpd_int_ack(struct amdgpu_device *adev,
> +				 int hpd)
> +{
> +	u32 tmp;
> +
> +	if (hpd >= adev->mode_info.num_hpd) {
> +		DRM_DEBUG("invalid hdp %d\n", hpd);
> +		return;
> +	}
> +
> +	tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> +	tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> +	WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
> +}
> +
>  /**
>   * dce_v8_0_hpd_init - hpd setup callback.
>   *
> @@ -303,6 +318,7 @@ static void dce_v8_0_hpd_init(struct
> amdgpu_device *adev) continue;
>  		}
>  
> +		dce_v8_0_hpd_int_ack(adev,
> amdgpu_connector->hpd.hpd); dce_v8_0_hpd_set_polarity(adev,
> amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> amdgpu_connector->hpd.hpd); }
> @@ -3176,7 +3192,7 @@ static int dce_v8_0_hpd_irq(struct
> amdgpu_device *adev, struct amdgpu_irq_src *source,
>  			    struct amdgpu_iv_entry *entry)
>  {
> -	uint32_t disp_int, mask, tmp;
> +	uint32_t disp_int, mask;
>  	unsigned hpd;
>  
>  	if (entry->src_data[0] >= adev->mode_info.num_hpd) {
> @@ -3189,9 +3205,7 @@ static int dce_v8_0_hpd_irq(struct
> amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
>  
>  	if (disp_int & mask) {
> -		tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> hpd_offsets[hpd]);
> -		tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> -		WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> tmp);
> +		dce_v8_0_hpd_int_ack(adev, hpd);
>  		schedule_delayed_work(&adev->hotplug_work, 0);
>  		DRM_DEBUG("IH: HPD%d\n", hpd + 1);
>  	}


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

* RE: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
  2024-03-13  6:18 ` Qiang Ma
@ 2024-03-14 14:40   ` Deucher, Alexander
  2024-03-27  3:31     ` Qiang Ma
  0 siblings, 1 reply; 6+ messages in thread
From: Deucher, Alexander @ 2024-03-14 14:40 UTC (permalink / raw)
  To: Qiang Ma, Koenig, Christian, Pan, Xinhui, airlied, daniel,
	SHANMUGAM, SRINIVASAN, sunran001
  Cc: amd-gfx, dri-devel, linux-kernel

[Public]

> -----Original Message-----
> From: Qiang Ma <maqianga@uniontech.com>
> Sent: Wednesday, March 13, 2024 2:18 AM
> To: Deucher, Alexander <Alexander.Deucher@amd.com>; Koenig, Christian
> <Christian.Koenig@amd.com>; Pan, Xinhui <Xinhui.Pan@amd.com>;
> airlied@gmail.com; daniel@ffwll.ch; SHANMUGAM, SRINIVASAN
> <SRINIVASAN.SHANMUGAM@amd.com>; sunran001@208suo.com
> Cc: amd-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit
> before hpd initialization
>
> On Wed, 31 Jan 2024 15:57:03 +0800
> Qiang Ma <maqianga@uniontech.com> wrote:
>
> Hello everyone, please help review this patch.

This was applied back in January, sorry if I forget to reply.

Alex

>
>   Qiang Ma
>
> > Problem:
> > The computer in the bios initialization process, unplug the HDMI
> > display, wait until the system up, plug in the HDMI display, did not
> > enter the hotplug interrupt function, the display is not bright.
> >
> > Fix:
> > After the above problem occurs, and the hpd ack interrupt bit is 1,
> > the interrupt should be cleared during hpd_init initialization so that
> > when the driver is ready, it can respond to the hpd interrupt
> > normally.
> >
> > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > ---
> > v2:
> >  - Remove unused variable 'tmp'
> >  - Fixed function spelling errors
> >
> > drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |  2 ++
> > drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |  2 ++
> > drivers/gpu/drm/amd/amdgpu/dce_v6_0.c  | 22 ++++++++++++++++++---
> -
> > drivers/gpu/drm/amd/amdgpu/dce_v8_0.c  | 22 ++++++++++++++++++---
> -
> >  4 files changed, 40 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index
> > bb666cb7522e..12a8ba929a72 100644 ---
> > a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++
> > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -51,6 +51,7 @@
> >
> >  static void dce_v10_0_set_display_funcs(struct amdgpu_device *adev);
> > static void dce_v10_0_set_irq_funcs(struct amdgpu_device *adev);
> > +static void dce_v10_0_hpd_int_ack(struct amdgpu_device *adev, int
> > hpd);
> >  static const u32 crtc_offsets[] = {
> >     CRTC0_REGISTER_OFFSET,
> > @@ -363,6 +364,7 @@ static void dce_v10_0_hpd_init(struct
> > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > +           dce_v10_0_hpd_int_ack(adev,
> > amdgpu_connector->hpd.hpd); dce_v10_0_hpd_set_polarity(adev,
> > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> >                            amdgpu_connector->hpd.hpd); diff --git
> > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index
> > 7af277f61cca..745e4fdffade 100644 ---
> > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++
> > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -51,6 +51,7 @@
> >
> >  static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev);
> > static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev);
> > +static void dce_v11_0_hpd_int_ack(struct amdgpu_device *adev, int
> > hpd);
> >  static const u32 crtc_offsets[] =
> >  {
> > @@ -387,6 +388,7 @@ static void dce_v11_0_hpd_init(struct
> > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > +           dce_v11_0_hpd_int_ack(adev,
> > amdgpu_connector->hpd.hpd); dce_v11_0_hpd_set_polarity(adev,
> > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > amdgpu_connector->hpd.hpd); } diff --git
> > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index
> > 143efc37a17f..28c4a735716b 100644 ---
> > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++
> > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c @@ -272,6 +272,21 @@
> static
> > void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
> > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> >
> > +static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
> > +                            int hpd)
> > +{
> > +   u32 tmp;
> > +
> > +   if (hpd >= adev->mode_info.num_hpd) {
> > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > +           return;
> > +   }
> > +
> > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > +
> >  /**
> >   * dce_v6_0_hpd_init - hpd setup callback.
> >   *
> > @@ -311,6 +326,7 @@ static void dce_v6_0_hpd_init(struct
> amdgpu_device
> > *adev) continue;
> >             }
> >
> > +           dce_v6_0_hpd_int_ack(adev,
> > amdgpu_connector->hpd.hpd); dce_v6_0_hpd_set_polarity(adev,
> > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > amdgpu_connector->hpd.hpd); } @@ -3088,7 +3104,7 @@ static int
> > dce_v6_0_hpd_irq(struct amdgpu_device *adev, struct amdgpu_irq_src
> > *source,
> >                         struct amdgpu_iv_entry *entry)  {
> > -   uint32_t disp_int, mask, tmp;
> > +   uint32_t disp_int, mask;
> >     unsigned hpd;
> >
> >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@ -3101,9
> > +3117,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
> > mask = interrupt_status_offsets[hpd].hpd;
> >
> >     if (disp_int & mask) {
> > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > hpd_offsets[hpd]);
> > -           tmp |=
> DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > tmp);
> > +           dce_v6_0_hpd_int_ack(adev, hpd);
> >             schedule_delayed_work(&adev->hotplug_work, 0);
> >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> >     }
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index
> > adeddfb7ff12..8ff2b5adfd95 100644 ---
> > a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++
> > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c @@ -264,6 +264,21 @@
> static
> > void dce_v8_0_hpd_set_polarity(struct amdgpu_device *adev,
> > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> >
> > +static void dce_v8_0_hpd_int_ack(struct amdgpu_device *adev,
> > +                            int hpd)
> > +{
> > +   u32 tmp;
> > +
> > +   if (hpd >= adev->mode_info.num_hpd) {
> > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > +           return;
> > +   }
> > +
> > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > +
> >  /**
> >   * dce_v8_0_hpd_init - hpd setup callback.
> >   *
> > @@ -303,6 +318,7 @@ static void dce_v8_0_hpd_init(struct
> amdgpu_device
> > *adev) continue;
> >             }
> >
> > +           dce_v8_0_hpd_int_ack(adev,
> > amdgpu_connector->hpd.hpd); dce_v8_0_hpd_set_polarity(adev,
> > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > amdgpu_connector->hpd.hpd); } @@ -3176,7 +3192,7 @@ static int
> > dce_v8_0_hpd_irq(struct amdgpu_device *adev, struct amdgpu_irq_src
> > *source,
> >                         struct amdgpu_iv_entry *entry)  {
> > -   uint32_t disp_int, mask, tmp;
> > +   uint32_t disp_int, mask;
> >     unsigned hpd;
> >
> >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@ -3189,9
> > +3205,7 @@ static int dce_v8_0_hpd_irq(struct amdgpu_device *adev,
> > mask = interrupt_status_offsets[hpd].hpd;
> >
> >     if (disp_int & mask) {
> > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > hpd_offsets[hpd]);
> > -           tmp |=
> DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > tmp);
> > +           dce_v8_0_hpd_int_ack(adev, hpd);
> >             schedule_delayed_work(&adev->hotplug_work, 0);
> >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> >     }


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

* Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
  2024-03-14 14:40   ` Deucher, Alexander
@ 2024-03-27  3:31     ` Qiang Ma
  2024-03-27  3:51       ` Alex Deucher
  0 siblings, 1 reply; 6+ messages in thread
From: Qiang Ma @ 2024-03-27  3:31 UTC (permalink / raw)
  To: Deucher, Alexander
  Cc: Koenig, Christian, Pan, Xinhui, airlied, daniel, SHANMUGAM,
	SRINIVASAN, sunran001, amd-gfx, dri-devel, linux-kernel

On Thu, 14 Mar 2024 14:40:40 +0000
"Deucher, Alexander" <Alexander.Deucher@amd.com> wrote:

> [Public]
> 
> > -----Original Message-----
> > From: Qiang Ma <maqianga@uniontech.com>
> > Sent: Wednesday, March 13, 2024 2:18 AM
> > To: Deucher, Alexander <Alexander.Deucher@amd.com>; Koenig,
> > Christian <Christian.Koenig@amd.com>; Pan, Xinhui
> > <Xinhui.Pan@amd.com>; airlied@gmail.com; daniel@ffwll.ch;
> > SHANMUGAM, SRINIVASAN <SRINIVASAN.SHANMUGAM@amd.com>;
> > sunran001@208suo.com Cc: amd-gfx@lists.freedesktop.org;
> > dri-devel@lists.freedesktop.org; linux- kernel@vger.kernel.org
> > Subject: Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack
> > bit before hpd initialization
> >
> > On Wed, 31 Jan 2024 15:57:03 +0800
> > Qiang Ma <maqianga@uniontech.com> wrote:
> >
> > Hello everyone, please help review this patch.  
> 
> This was applied back in January, sorry if I forget to reply.
> 
> Alex

Hi, Alex, it doesn't matter, please take some time to help review this
patch.

This patch mainly solves the problem that after unplugging the HDMI
display during bios initialization, the display does not light up after
the system starts.

Qiang Ma
> 
> >
> >   Qiang Ma
> >  
> > > Problem:
> > > The computer in the bios initialization process, unplug the HDMI
> > > display, wait until the system up, plug in the HDMI display, did
> > > not enter the hotplug interrupt function, the display is not
> > > bright.
> > >
> > > Fix:
> > > After the above problem occurs, and the hpd ack interrupt bit is
> > > 1, the interrupt should be cleared during hpd_init initialization
> > > so that when the driver is ready, it can respond to the hpd
> > > interrupt normally.
> > >
> > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > ---
> > > v2:
> > >  - Remove unused variable 'tmp'
> > >  - Fixed function spelling errors
> > >
> > > drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |  2 ++
> > > drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |  2 ++
> > > drivers/gpu/drm/amd/amdgpu/dce_v6_0.c  | 22
> > > ++++++++++++++++++---  
> > -  
> > > drivers/gpu/drm/amd/amdgpu/dce_v8_0.c  | 22
> > > ++++++++++++++++++---  
> > -  
> > >  4 files changed, 40 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index
> > > bb666cb7522e..12a8ba929a72 100644 ---
> > > a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -51,6 +51,7 @@
> > >
> > >  static void dce_v10_0_set_display_funcs(struct amdgpu_device
> > > *adev); static void dce_v10_0_set_irq_funcs(struct amdgpu_device
> > > *adev); +static void dce_v10_0_hpd_int_ack(struct amdgpu_device
> > > *adev, int hpd);
> > >  static const u32 crtc_offsets[] = {
> > >     CRTC0_REGISTER_OFFSET,
> > > @@ -363,6 +364,7 @@ static void dce_v10_0_hpd_init(struct
> > > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> > >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > > +           dce_v10_0_hpd_int_ack(adev,
> > > amdgpu_connector->hpd.hpd); dce_v10_0_hpd_set_polarity(adev,
> > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > >                            amdgpu_connector->hpd.hpd); diff --git
> > > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index
> > > 7af277f61cca..745e4fdffade 100644 ---
> > > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -51,6 +51,7 @@
> > >
> > >  static void dce_v11_0_set_display_funcs(struct amdgpu_device
> > > *adev); static void dce_v11_0_set_irq_funcs(struct amdgpu_device
> > > *adev); +static void dce_v11_0_hpd_int_ack(struct amdgpu_device
> > > *adev, int hpd);
> > >  static const u32 crtc_offsets[] =
> > >  {
> > > @@ -387,6 +388,7 @@ static void dce_v11_0_hpd_init(struct
> > > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> > >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > > +           dce_v11_0_hpd_int_ack(adev,
> > > amdgpu_connector->hpd.hpd); dce_v11_0_hpd_set_polarity(adev,
> > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > amdgpu_connector->hpd.hpd); } diff --git
> > > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index
> > > 143efc37a17f..28c4a735716b 100644 ---
> > > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c @@ -272,6 +272,21 @@  
> > static  
> > > void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
> > > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > >
> > > +static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
> > > +                            int hpd)
> > > +{
> > > +   u32 tmp;
> > > +
> > > +   if (hpd >= adev->mode_info.num_hpd) {
> > > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > > +           return;
> > > +   }
> > > +
> > > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > +
> > >  /**
> > >   * dce_v6_0_hpd_init - hpd setup callback.
> > >   *
> > > @@ -311,6 +326,7 @@ static void dce_v6_0_hpd_init(struct  
> > amdgpu_device  
> > > *adev) continue;
> > >             }
> > >
> > > +           dce_v6_0_hpd_int_ack(adev,
> > > amdgpu_connector->hpd.hpd); dce_v6_0_hpd_set_polarity(adev,
> > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > amdgpu_connector->hpd.hpd); } @@ -3088,7 +3104,7 @@ static int
> > > dce_v6_0_hpd_irq(struct amdgpu_device *adev, struct amdgpu_irq_src
> > > *source,
> > >                         struct amdgpu_iv_entry *entry)  {
> > > -   uint32_t disp_int, mask, tmp;
> > > +   uint32_t disp_int, mask;
> > >     unsigned hpd;
> > >
> > >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@
> > > -3101,9 +3117,7 @@ static int dce_v6_0_hpd_irq(struct
> > > amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
> > >
> > >     if (disp_int & mask) {
> > > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > > hpd_offsets[hpd]);
> > > -           tmp |=  
> > DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;  
> > > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > > tmp);
> > > +           dce_v6_0_hpd_int_ack(adev, hpd);
> > >             schedule_delayed_work(&adev->hotplug_work, 0);
> > >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> > >     }
> > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index
> > > adeddfb7ff12..8ff2b5adfd95 100644 ---
> > > a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++
> > > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c @@ -264,6 +264,21 @@  
> > static  
> > > void dce_v8_0_hpd_set_polarity(struct amdgpu_device *adev,
> > > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > >
> > > +static void dce_v8_0_hpd_int_ack(struct amdgpu_device *adev,
> > > +                            int hpd)
> > > +{
> > > +   u32 tmp;
> > > +
> > > +   if (hpd >= adev->mode_info.num_hpd) {
> > > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > > +           return;
> > > +   }
> > > +
> > > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > +
> > >  /**
> > >   * dce_v8_0_hpd_init - hpd setup callback.
> > >   *
> > > @@ -303,6 +318,7 @@ static void dce_v8_0_hpd_init(struct  
> > amdgpu_device  
> > > *adev) continue;
> > >             }
> > >
> > > +           dce_v8_0_hpd_int_ack(adev,
> > > amdgpu_connector->hpd.hpd); dce_v8_0_hpd_set_polarity(adev,
> > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > amdgpu_connector->hpd.hpd); } @@ -3176,7 +3192,7 @@ static int
> > > dce_v8_0_hpd_irq(struct amdgpu_device *adev, struct amdgpu_irq_src
> > > *source,
> > >                         struct amdgpu_iv_entry *entry)  {
> > > -   uint32_t disp_int, mask, tmp;
> > > +   uint32_t disp_int, mask;
> > >     unsigned hpd;
> > >
> > >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@
> > > -3189,9 +3205,7 @@ static int dce_v8_0_hpd_irq(struct
> > > amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
> > >
> > >     if (disp_int & mask) {
> > > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > > hpd_offsets[hpd]);
> > > -           tmp |=  
> > DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;  
> > > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > > tmp);
> > > +           dce_v8_0_hpd_int_ack(adev, hpd);
> > >             schedule_delayed_work(&adev->hotplug_work, 0);
> > >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> > >     }  
> 
> 


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

* Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
  2024-03-27  3:31     ` Qiang Ma
@ 2024-03-27  3:51       ` Alex Deucher
  2024-03-27  4:37         ` Qiang Ma
  0 siblings, 1 reply; 6+ messages in thread
From: Alex Deucher @ 2024-03-27  3:51 UTC (permalink / raw)
  To: Qiang Ma
  Cc: Deucher, Alexander, Koenig, Christian, Pan, Xinhui, airlied,
	daniel, SHANMUGAM, SRINIVASAN, sunran001, amd-gfx, dri-devel,
	linux-kernel

On Tue, Mar 26, 2024 at 11:41 PM Qiang Ma <maqianga@uniontech.com> wrote:
>
> On Thu, 14 Mar 2024 14:40:40 +0000
> "Deucher, Alexander" <Alexander.Deucher@amd.com> wrote:
>
> > [Public]
> >
> > > -----Original Message-----
> > > From: Qiang Ma <maqianga@uniontech.com>
> > > Sent: Wednesday, March 13, 2024 2:18 AM
> > > To: Deucher, Alexander <Alexander.Deucher@amd.com>; Koenig,
> > > Christian <Christian.Koenig@amd.com>; Pan, Xinhui
> > > <Xinhui.Pan@amd.com>; airlied@gmail.com; daniel@ffwll.ch;
> > > SHANMUGAM, SRINIVASAN <SRINIVASAN.SHANMUGAM@amd.com>;
> > > sunran001@208suo.com Cc: amd-gfx@lists.freedesktop.org;
> > > dri-devel@lists.freedesktop.org; linux- kernel@vger.kernel.org
> > > Subject: Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack
> > > bit before hpd initialization
> > >
> > > On Wed, 31 Jan 2024 15:57:03 +0800
> > > Qiang Ma <maqianga@uniontech.com> wrote:
> > >
> > > Hello everyone, please help review this patch.
> >
> > This was applied back in January, sorry if I forget to reply.
> >
> > Alex
>
> Hi, Alex, it doesn't matter, please take some time to help review this
> patch.
>
> This patch mainly solves the problem that after unplugging the HDMI
> display during bios initialization, the display does not light up after
> the system starts.
>

I already reviewed and applied the patch.  It's in mainline:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=aeaf3e6cf84282500b6fa03621b0c225ce1af18a

Alex

> Qiang Ma
> >
> > >
> > >   Qiang Ma
> > >
> > > > Problem:
> > > > The computer in the bios initialization process, unplug the HDMI
> > > > display, wait until the system up, plug in the HDMI display, did
> > > > not enter the hotplug interrupt function, the display is not
> > > > bright.
> > > >
> > > > Fix:
> > > > After the above problem occurs, and the hpd ack interrupt bit is
> > > > 1, the interrupt should be cleared during hpd_init initialization
> > > > so that when the driver is ready, it can respond to the hpd
> > > > interrupt normally.
> > > >
> > > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > > ---
> > > > v2:
> > > >  - Remove unused variable 'tmp'
> > > >  - Fixed function spelling errors
> > > >
> > > > drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |  2 ++
> > > > drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |  2 ++
> > > > drivers/gpu/drm/amd/amdgpu/dce_v6_0.c  | 22
> > > > ++++++++++++++++++---
> > > -
> > > > drivers/gpu/drm/amd/amdgpu/dce_v8_0.c  | 22
> > > > ++++++++++++++++++---
> > > -
> > > >  4 files changed, 40 insertions(+), 8 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index
> > > > bb666cb7522e..12a8ba929a72 100644 ---
> > > > a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -51,6 +51,7 @@
> > > >
> > > >  static void dce_v10_0_set_display_funcs(struct amdgpu_device
> > > > *adev); static void dce_v10_0_set_irq_funcs(struct amdgpu_device
> > > > *adev); +static void dce_v10_0_hpd_int_ack(struct amdgpu_device
> > > > *adev, int hpd);
> > > >  static const u32 crtc_offsets[] = {
> > > >     CRTC0_REGISTER_OFFSET,
> > > > @@ -363,6 +364,7 @@ static void dce_v10_0_hpd_init(struct
> > > > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> > > >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > > > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > > > +           dce_v10_0_hpd_int_ack(adev,
> > > > amdgpu_connector->hpd.hpd); dce_v10_0_hpd_set_polarity(adev,
> > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > >                            amdgpu_connector->hpd.hpd); diff --git
> > > > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index
> > > > 7af277f61cca..745e4fdffade 100644 ---
> > > > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -51,6 +51,7 @@
> > > >
> > > >  static void dce_v11_0_set_display_funcs(struct amdgpu_device
> > > > *adev); static void dce_v11_0_set_irq_funcs(struct amdgpu_device
> > > > *adev); +static void dce_v11_0_hpd_int_ack(struct amdgpu_device
> > > > *adev, int hpd);
> > > >  static const u32 crtc_offsets[] =
> > > >  {
> > > > @@ -387,6 +388,7 @@ static void dce_v11_0_hpd_init(struct
> > > > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> > > >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > > > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > > > +           dce_v11_0_hpd_int_ack(adev,
> > > > amdgpu_connector->hpd.hpd); dce_v11_0_hpd_set_polarity(adev,
> > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > > amdgpu_connector->hpd.hpd); } diff --git
> > > > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index
> > > > 143efc37a17f..28c4a735716b 100644 ---
> > > > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c @@ -272,6 +272,21 @@
> > > static
> > > > void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
> > > > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > >
> > > > +static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
> > > > +                            int hpd)
> > > > +{
> > > > +   u32 tmp;
> > > > +
> > > > +   if (hpd >= adev->mode_info.num_hpd) {
> > > > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > > > +           return;
> > > > +   }
> > > > +
> > > > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > > > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > > +
> > > >  /**
> > > >   * dce_v6_0_hpd_init - hpd setup callback.
> > > >   *
> > > > @@ -311,6 +326,7 @@ static void dce_v6_0_hpd_init(struct
> > > amdgpu_device
> > > > *adev) continue;
> > > >             }
> > > >
> > > > +           dce_v6_0_hpd_int_ack(adev,
> > > > amdgpu_connector->hpd.hpd); dce_v6_0_hpd_set_polarity(adev,
> > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > > amdgpu_connector->hpd.hpd); } @@ -3088,7 +3104,7 @@ static int
> > > > dce_v6_0_hpd_irq(struct amdgpu_device *adev, struct amdgpu_irq_src
> > > > *source,
> > > >                         struct amdgpu_iv_entry *entry)  {
> > > > -   uint32_t disp_int, mask, tmp;
> > > > +   uint32_t disp_int, mask;
> > > >     unsigned hpd;
> > > >
> > > >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@
> > > > -3101,9 +3117,7 @@ static int dce_v6_0_hpd_irq(struct
> > > > amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
> > > >
> > > >     if (disp_int & mask) {
> > > > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > > > hpd_offsets[hpd]);
> > > > -           tmp |=
> > > DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > > > tmp);
> > > > +           dce_v6_0_hpd_int_ack(adev, hpd);
> > > >             schedule_delayed_work(&adev->hotplug_work, 0);
> > > >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> > > >     }
> > > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index
> > > > adeddfb7ff12..8ff2b5adfd95 100644 ---
> > > > a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++
> > > > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c @@ -264,6 +264,21 @@
> > > static
> > > > void dce_v8_0_hpd_set_polarity(struct amdgpu_device *adev,
> > > > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > >
> > > > +static void dce_v8_0_hpd_int_ack(struct amdgpu_device *adev,
> > > > +                            int hpd)
> > > > +{
> > > > +   u32 tmp;
> > > > +
> > > > +   if (hpd >= adev->mode_info.num_hpd) {
> > > > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > > > +           return;
> > > > +   }
> > > > +
> > > > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > > > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > > +
> > > >  /**
> > > >   * dce_v8_0_hpd_init - hpd setup callback.
> > > >   *
> > > > @@ -303,6 +318,7 @@ static void dce_v8_0_hpd_init(struct
> > > amdgpu_device
> > > > *adev) continue;
> > > >             }
> > > >
> > > > +           dce_v8_0_hpd_int_ack(adev,
> > > > amdgpu_connector->hpd.hpd); dce_v8_0_hpd_set_polarity(adev,
> > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev, &adev->hpd_irq,
> > > > amdgpu_connector->hpd.hpd); } @@ -3176,7 +3192,7 @@ static int
> > > > dce_v8_0_hpd_irq(struct amdgpu_device *adev, struct amdgpu_irq_src
> > > > *source,
> > > >                         struct amdgpu_iv_entry *entry)  {
> > > > -   uint32_t disp_int, mask, tmp;
> > > > +   uint32_t disp_int, mask;
> > > >     unsigned hpd;
> > > >
> > > >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@
> > > > -3189,9 +3205,7 @@ static int dce_v8_0_hpd_irq(struct
> > > > amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
> > > >
> > > >     if (disp_int & mask) {
> > > > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > > > hpd_offsets[hpd]);
> > > > -           tmp |=
> > > DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > > > tmp);
> > > > +           dce_v8_0_hpd_int_ack(adev, hpd);
> > > >             schedule_delayed_work(&adev->hotplug_work, 0);
> > > >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> > > >     }
> >
> >
>

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

* Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
  2024-03-27  3:51       ` Alex Deucher
@ 2024-03-27  4:37         ` Qiang Ma
  0 siblings, 0 replies; 6+ messages in thread
From: Qiang Ma @ 2024-03-27  4:37 UTC (permalink / raw)
  To: Alex Deucher
  Cc: Deucher, Alexander, Koenig, Christian, Pan, Xinhui, airlied,
	daniel, SHANMUGAM, SRINIVASAN, sunran001, amd-gfx, dri-devel,
	linux-kernel

On Tue, 26 Mar 2024 23:51:45 -0400
Alex Deucher <alexdeucher@gmail.com> wrote:

> On Tue, Mar 26, 2024 at 11:41 PM Qiang Ma <maqianga@uniontech.com>
> wrote:
> >
> > On Thu, 14 Mar 2024 14:40:40 +0000
> > "Deucher, Alexander" <Alexander.Deucher@amd.com> wrote:
> >  
> > > [Public]
> > >  
> > > > -----Original Message-----
> > > > From: Qiang Ma <maqianga@uniontech.com>
> > > > Sent: Wednesday, March 13, 2024 2:18 AM
> > > > To: Deucher, Alexander <Alexander.Deucher@amd.com>; Koenig,
> > > > Christian <Christian.Koenig@amd.com>; Pan, Xinhui
> > > > <Xinhui.Pan@amd.com>; airlied@gmail.com; daniel@ffwll.ch;
> > > > SHANMUGAM, SRINIVASAN <SRINIVASAN.SHANMUGAM@amd.com>;
> > > > sunran001@208suo.com Cc: amd-gfx@lists.freedesktop.org;
> > > > dri-devel@lists.freedesktop.org; linux- kernel@vger.kernel.org
> > > > Subject: Re: [PATCH v2] drm/amdgpu: Clear the hotplug interrupt
> > > > ack bit before hpd initialization
> > > >
> > > > On Wed, 31 Jan 2024 15:57:03 +0800
> > > > Qiang Ma <maqianga@uniontech.com> wrote:
> > > >
> > > > Hello everyone, please help review this patch.  
> > >
> > > This was applied back in January, sorry if I forget to reply.
> > >
> > > Alex  
> >
> > Hi, Alex, it doesn't matter, please take some time to help review
> > this patch.
> >
> > This patch mainly solves the problem that after unplugging the HDMI
> > display during bios initialization, the display does not light up
> > after the system starts.
> >  
> 
> I already reviewed and applied the patch.  It's in mainline:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=aeaf3e6cf84282500b6fa03621b0c225ce1af18a
> 
> Alex

Thank you.

Qiang Ma

> 
> > Qiang Ma  
> > >  
> > > >
> > > >   Qiang Ma
> > > >  
> > > > > Problem:
> > > > > The computer in the bios initialization process, unplug the
> > > > > HDMI display, wait until the system up, plug in the HDMI
> > > > > display, did not enter the hotplug interrupt function, the
> > > > > display is not bright.
> > > > >
> > > > > Fix:
> > > > > After the above problem occurs, and the hpd ack interrupt bit
> > > > > is 1, the interrupt should be cleared during hpd_init
> > > > > initialization so that when the driver is ready, it can
> > > > > respond to the hpd interrupt normally.
> > > > >
> > > > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > > > ---
> > > > > v2:
> > > > >  - Remove unused variable 'tmp'
> > > > >  - Fixed function spelling errors
> > > > >
> > > > > drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |  2 ++
> > > > > drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |  2 ++
> > > > > drivers/gpu/drm/amd/amdgpu/dce_v6_0.c  | 22
> > > > > ++++++++++++++++++---  
> > > > -  
> > > > > drivers/gpu/drm/amd/amdgpu/dce_v8_0.c  | 22
> > > > > ++++++++++++++++++---  
> > > > -  
> > > > >  4 files changed, 40 insertions(+), 8 deletions(-)
> > > > >
> > > > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index
> > > > > bb666cb7522e..12a8ba929a72 100644 ---
> > > > > a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -51,6 +51,7 @@
> > > > >
> > > > >  static void dce_v10_0_set_display_funcs(struct amdgpu_device
> > > > > *adev); static void dce_v10_0_set_irq_funcs(struct
> > > > > amdgpu_device *adev); +static void
> > > > > dce_v10_0_hpd_int_ack(struct amdgpu_device *adev, int hpd);
> > > > >  static const u32 crtc_offsets[] = {
> > > > >     CRTC0_REGISTER_OFFSET,
> > > > > @@ -363,6 +364,7 @@ static void dce_v10_0_hpd_init(struct
> > > > > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> > > > >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > > > > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > > > > +           dce_v10_0_hpd_int_ack(adev,
> > > > > amdgpu_connector->hpd.hpd); dce_v10_0_hpd_set_polarity(adev,
> > > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev,
> > > > > &adev->hpd_irq, amdgpu_connector->hpd.hpd); diff --git
> > > > > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index
> > > > > 7af277f61cca..745e4fdffade 100644 ---
> > > > > a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -51,6 +51,7 @@
> > > > >
> > > > >  static void dce_v11_0_set_display_funcs(struct amdgpu_device
> > > > > *adev); static void dce_v11_0_set_irq_funcs(struct
> > > > > amdgpu_device *adev); +static void
> > > > > dce_v11_0_hpd_int_ack(struct amdgpu_device *adev, int hpd);
> > > > >  static const u32 crtc_offsets[] =
> > > > >  {
> > > > > @@ -387,6 +388,7 @@ static void dce_v11_0_hpd_init(struct
> > > > > amdgpu_device *adev) AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
> > > > >             WREG32(mmDC_HPD_TOGGLE_FILT_CNTL +
> > > > > hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
> > > > > +           dce_v11_0_hpd_int_ack(adev,
> > > > > amdgpu_connector->hpd.hpd); dce_v11_0_hpd_set_polarity(adev,
> > > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev,
> > > > > &adev->hpd_irq, amdgpu_connector->hpd.hpd); } diff --git
> > > > > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index
> > > > > 143efc37a17f..28c4a735716b 100644 ---
> > > > > a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c @@ -272,6 +272,21 @@  
> > > > static  
> > > > > void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
> > > > > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > > >
> > > > > +static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
> > > > > +                            int hpd)
> > > > > +{
> > > > > +   u32 tmp;
> > > > > +
> > > > > +   if (hpd >= adev->mode_info.num_hpd) {
> > > > > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > > > > +           return;
> > > > > +   }
> > > > > +
> > > > > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > > > > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > > > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > > > +
> > > > >  /**
> > > > >   * dce_v6_0_hpd_init - hpd setup callback.
> > > > >   *
> > > > > @@ -311,6 +326,7 @@ static void dce_v6_0_hpd_init(struct  
> > > > amdgpu_device  
> > > > > *adev) continue;
> > > > >             }
> > > > >
> > > > > +           dce_v6_0_hpd_int_ack(adev,
> > > > > amdgpu_connector->hpd.hpd); dce_v6_0_hpd_set_polarity(adev,
> > > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev,
> > > > > &adev->hpd_irq, amdgpu_connector->hpd.hpd); } @@ -3088,7
> > > > > +3104,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device
> > > > > *adev, struct amdgpu_irq_src *source,
> > > > >                         struct amdgpu_iv_entry *entry)  {
> > > > > -   uint32_t disp_int, mask, tmp;
> > > > > +   uint32_t disp_int, mask;
> > > > >     unsigned hpd;
> > > > >
> > > > >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@
> > > > > -3101,9 +3117,7 @@ static int dce_v6_0_hpd_irq(struct
> > > > > amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
> > > > >
> > > > >     if (disp_int & mask) {
> > > > > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > > > > hpd_offsets[hpd]);
> > > > > -           tmp |=  
> > > > DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;  
> > > > > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > > > > tmp);
> > > > > +           dce_v6_0_hpd_int_ack(adev, hpd);
> > > > >             schedule_delayed_work(&adev->hotplug_work, 0);
> > > > >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> > > > >     }
> > > > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index
> > > > > adeddfb7ff12..8ff2b5adfd95 100644 ---
> > > > > a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++
> > > > > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c @@ -264,6 +264,21 @@  
> > > > static  
> > > > > void dce_v8_0_hpd_set_polarity(struct amdgpu_device *adev,
> > > > > WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > > >
> > > > > +static void dce_v8_0_hpd_int_ack(struct amdgpu_device *adev,
> > > > > +                            int hpd)
> > > > > +{
> > > > > +   u32 tmp;
> > > > > +
> > > > > +   if (hpd >= adev->mode_info.num_hpd) {
> > > > > +           DRM_DEBUG("invalid hdp %d\n", hpd);
> > > > > +           return;
> > > > > +   }
> > > > > +
> > > > > +   tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
> > > > > +   tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
> > > > > +   WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); }
> > > > > +
> > > > >  /**
> > > > >   * dce_v8_0_hpd_init - hpd setup callback.
> > > > >   *
> > > > > @@ -303,6 +318,7 @@ static void dce_v8_0_hpd_init(struct  
> > > > amdgpu_device  
> > > > > *adev) continue;
> > > > >             }
> > > > >
> > > > > +           dce_v8_0_hpd_int_ack(adev,
> > > > > amdgpu_connector->hpd.hpd); dce_v8_0_hpd_set_polarity(adev,
> > > > > amdgpu_connector->hpd.hpd); amdgpu_irq_get(adev,
> > > > > &adev->hpd_irq, amdgpu_connector->hpd.hpd); } @@ -3176,7
> > > > > +3192,7 @@ static int dce_v8_0_hpd_irq(struct amdgpu_device
> > > > > *adev, struct amdgpu_irq_src *source,
> > > > >                         struct amdgpu_iv_entry *entry)  {
> > > > > -   uint32_t disp_int, mask, tmp;
> > > > > +   uint32_t disp_int, mask;
> > > > >     unsigned hpd;
> > > > >
> > > > >     if (entry->src_data[0] >= adev->mode_info.num_hpd) { @@
> > > > > -3189,9 +3205,7 @@ static int dce_v8_0_hpd_irq(struct
> > > > > amdgpu_device *adev, mask = interrupt_status_offsets[hpd].hpd;
> > > > >
> > > > >     if (disp_int & mask) {
> > > > > -           tmp = RREG32(mmDC_HPD1_INT_CONTROL +
> > > > > hpd_offsets[hpd]);
> > > > > -           tmp |=  
> > > > DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;  
> > > > > -           WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd],
> > > > > tmp);
> > > > > +           dce_v8_0_hpd_int_ack(adev, hpd);
> > > > >             schedule_delayed_work(&adev->hotplug_work, 0);
> > > > >             DRM_DEBUG("IH: HPD%d\n", hpd + 1);
> > > > >     }  
> > >
> > >  
> >  
> 


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

end of thread, other threads:[~2024-03-27  4:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-31  7:57 [PATCH v2] drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization Qiang Ma
2024-03-13  6:18 ` Qiang Ma
2024-03-14 14:40   ` Deucher, Alexander
2024-03-27  3:31     ` Qiang Ma
2024-03-27  3:51       ` Alex Deucher
2024-03-27  4:37         ` Qiang Ma

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).