diff options
author | Lloyd Atkinson <latkinso@codeaurora.org> | 2017-08-21 10:15:38 -0400 |
---|---|---|
committer | Lakshmi Narayana Kalavala <lkalaval@codeaurora.org> | 2018-03-16 17:26:58 -0700 |
commit | c9b913882d8ad8d852247b2a54fcd9a7e41c67ad (patch) | |
tree | 383f57af31424adeae86d8471b752bbd9efc6add /drivers/gpu | |
parent | 3c6964a08c97236bf9a4938cf67becae4a0c5bf5 (diff) |
drm/msm/sde: store mdss irq status in case of irq storm
Store the last MDSS IRQ status value to help identify the source
of any erroneous IRQs that might cause an IRQ storm. Also, check
return codes on IRQ mapping or handling and report any unhandled
IRQs to the IRQ system.
Change-Id: I585c97c01736216556eb389bda79548c1fda2b64
Signed-off-by: Lloyd Atkinson <latkinso@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/msm/sde/sde_irq.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_irq.c b/drivers/gpu/drm/msm/sde/sde_irq.c index eeb7a0002eab..7864b9fef87b 100644 --- a/drivers/gpu/drm/msm/sde/sde_irq.c +++ b/drivers/gpu/drm/msm/sde/sde_irq.c @@ -19,6 +19,8 @@ #include "sde_irq.h" #include "sde_core_irq.h" +static uint32_t g_sde_irq_status; + irqreturn_t sde_irq(struct msm_kms *kms) { struct sde_kms *sde_kms = to_sde_kms(kms); @@ -27,6 +29,9 @@ irqreturn_t sde_irq(struct msm_kms *kms) sde_kms->hw_intr->ops.get_interrupt_sources(sde_kms->hw_intr, &interrupts); + /* store irq status in case of irq-storm debugging */ + g_sde_irq_status = interrupts; + /* * Taking care of MDP interrupt */ @@ -40,13 +45,30 @@ irqreturn_t sde_irq(struct msm_kms *kms) */ while (interrupts) { irq_hw_number_t hwirq = fls(interrupts) - 1; + unsigned int mapping; + int rc; + + mapping = irq_find_mapping(sde_kms->irq_controller.domain, + hwirq); + if (mapping == 0) { + SDE_EVT32(hwirq, SDE_EVTLOG_ERROR); + goto error; + } + + rc = generic_handle_irq(mapping); + if (rc < 0) { + SDE_EVT32(hwirq, mapping, rc, SDE_EVTLOG_ERROR); + goto error; + } - generic_handle_irq(irq_find_mapping( - sde_kms->irq_controller.domain, hwirq)); interrupts &= ~(1 << hwirq); } return IRQ_HANDLED; + +error: + /* bad situation, inform irq system, it may disable overall MDSS irq */ + return IRQ_NONE; } void sde_irq_preinstall(struct msm_kms *kms) |