[PATCH 4/8] drm/i915: Add support to identify the SCDC Interrupt from IIR
Shankar, Uma
uma.shankar at intel.com
Sun Mar 6 23:45:58 UTC 2022
> -----Original Message-----
> From: Intel-gfx-trybot <intel-gfx-trybot-bounces at lists.freedesktop.org> On Behalf
> Of Ankit Nautiyal
> Sent: Friday, March 4, 2022 12:22 PM
> To: intel-gfx-trybot at lists.freedesktop.org
> Subject: [PATCH 4/8] drm/i915: Add support to identify the SCDC Interrupt from IIR
>
> This patch identifies the SCDC Interrupt and schedules the bottomhalf by adding scdc
> work function in the system work queue.
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_hdmi.c | 28 ++++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_hdmi.h | 1 +
> drivers/gpu/drm/i915/i915_irq.c | 32 +++++++++++++++++++++++
> 3 files changed, 61 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c
> b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 1aa5bdc7b0dc..bbbc2b63aa62 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -3213,3 +3213,31 @@ intel_hdmi_dsc_get_bpp(int src_fractional_bpp, int
> slice_width, int num_slices,
>
> return 0;
> }
> +
> +enum scdc_pin intel_hdmi_get_scdc_pin(struct intel_encoder *encoder) {
> + switch (encoder->hpd_pin) {
> + case HPD_PORT_A:
> + return SCDC_PORT_A;
> + case HPD_PORT_B:
> + return SCDC_PORT_B;
> + case HPD_PORT_C:
> + return SCDC_PORT_C;
> + case HPD_PORT_TC1:
> + return SCDC_PORT_TC1;
> + case HPD_PORT_TC2:
> + return SCDC_PORT_TC2;
> + case HPD_PORT_TC3:
> + return SCDC_PORT_TC3;
> + case HPD_PORT_TC4:
> + return SCDC_PORT_TC4;
> + case HPD_PORT_TC5:
> + return SCDC_PORT_TC5;
> + case HPD_PORT_TC6:
> + return SCDC_PORT_TC6;
> + default:
> + break;
> + }
> +
> + return SCDC_PORT_NONE;
Is this defined, I feel you have been using SCDC_NUM_PINS here in your github branch.
May be define Einval case there. You may have handled this already, just confirm and get
this updated in the series.
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.h
> b/drivers/gpu/drm/i915/display/intel_hdmi.h
> index 93f65a917c36..49da11b30632 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.h
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.h
> @@ -54,5 +54,6 @@ int intel_hdmi_dsc_get_num_slices(const struct
> intel_crtc_state *crtc_state,
> int src_max_slices, int src_max_slice_width,
> int hdmi_max_slices, int hdmi_throughput); int
> intel_hdmi_dsc_get_slice_height(int vactive);
> +enum scdc_pin intel_hdmi_get_scdc_pin(struct intel_encoder *encoder);
>
> #endif /* __INTEL_HDMI_H__ */
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index
> 4dc2542146cd..dad32edab874 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -40,6 +40,7 @@
> #include "display/intel_display_types.h"
> #include "display/intel_fifo_underrun.h"
> #include "display/intel_hotplug.h"
> +#include "display/intel_hdmi.h"
> #include "display/intel_lpe_audio.h"
> #include "display/intel_psr.h"
>
> @@ -1993,6 +1994,34 @@ static void cpt_irq_handler(struct drm_i915_private
> *dev_priv, u32 pch_iir)
> cpt_serr_int_handler(dev_priv);
> }
>
> +static void scdc_irq_handler(struct drm_i915_private *dev_priv, u32
> +pch_iir) {
> + struct intel_encoder *encoder;
> + enum scdc_pin pin;
> + bool scdc_interrupt = false;
> +
> + /*
> + * Identify the port on which scdc interrupt received
> + * #TODO Check if spin lock be used here before this loop to avoid
> + * race condition for event_bits?
> + */
> + for_each_intel_encoder(&dev_priv->drm, encoder) {
> + if (encoder->type != INTEL_OUTPUT_HDMI)
> + continue;
Leave a line gap
> + pin = intel_hdmi_get_scdc_pin(encoder);
> + if (pin == SCDC_PORT_NONE)
> + continue;
Same here
> + if (pch_iir & dev_priv->scdc_rr.scdc[pin] ||
> + pch_iir & dev_priv->scdc_rr.scdc[pin]) {
This got repeated, you missed TC here.
> + dev_priv->scdc_rr.event_bits |= pin;
> + scdc_interrupt = true;
> + break;
> + }
> + }
Leave a line gap
> + if (scdc_interrupt)
> + queue_work(system_wq, &dev_priv->scdc_rr.scdc_rr_work); }
> +
> static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) {
> u32 ddi_hotplug_trigger = pch_iir & SDE_DDI_HOTPLUG_MASK_ICP; @@ -
> 2028,6 +2057,9 @@ static void icp_irq_handler(struct drm_i915_private *dev_priv,
> u32 pch_iir)
>
> if (pch_iir & SDE_GMBUS_ICP)
> gmbus_irq_handler(dev_priv);
> +
> + if (pch_iir & SDE_DDI_SCDC_MASK_ICP || pch_iir &
> SDE_TC_SCDC_MASK_ICP)
> + scdc_irq_handler(dev_priv, pch_iir);
> }
>
> static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
> --
> 2.25.1
More information about the Intel-gfx-trybot
mailing list