Commit 8b7a51ba authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'irq-urgent-2020-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fixes from Thomas Gleixner:
 "Two fixes for irqchip drivers:

   - Save and restore the GICV3 ITS state unconditionally on
     suspend/resume to handle firmware which fails to do so.

   - Use the correct index into the fwspec parameters to read the irq
     trigger type in the EXIU chip driver"

* tag 'irq-urgent-2020-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  irqchip/gic-v3-its: Unconditionally save/restore the ITS state on suspend
  irqchip/exiu: Fix the index of fwspec for IRQ type
parents 1214917e 7032908c
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#define ITS_FLAGS_CMDQ_NEEDS_FLUSHING (1ULL << 0) #define ITS_FLAGS_CMDQ_NEEDS_FLUSHING (1ULL << 0)
#define ITS_FLAGS_WORKAROUND_CAVIUM_22375 (1ULL << 1) #define ITS_FLAGS_WORKAROUND_CAVIUM_22375 (1ULL << 1)
#define ITS_FLAGS_WORKAROUND_CAVIUM_23144 (1ULL << 2) #define ITS_FLAGS_WORKAROUND_CAVIUM_23144 (1ULL << 2)
#define ITS_FLAGS_SAVE_SUSPEND_STATE (1ULL << 3)
#define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING (1 << 0) #define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING (1 << 0)
#define RDIST_FLAGS_RD_TABLES_PREALLOCATED (1 << 1) #define RDIST_FLAGS_RD_TABLES_PREALLOCATED (1 << 1)
...@@ -4741,9 +4740,6 @@ static int its_save_disable(void) ...@@ -4741,9 +4740,6 @@ static int its_save_disable(void)
list_for_each_entry(its, &its_nodes, entry) { list_for_each_entry(its, &its_nodes, entry) {
void __iomem *base; void __iomem *base;
if (!(its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE))
continue;
base = its->base; base = its->base;
its->ctlr_save = readl_relaxed(base + GITS_CTLR); its->ctlr_save = readl_relaxed(base + GITS_CTLR);
err = its_force_quiescent(base); err = its_force_quiescent(base);
...@@ -4762,9 +4758,6 @@ static int its_save_disable(void) ...@@ -4762,9 +4758,6 @@ static int its_save_disable(void)
list_for_each_entry_continue_reverse(its, &its_nodes, entry) { list_for_each_entry_continue_reverse(its, &its_nodes, entry) {
void __iomem *base; void __iomem *base;
if (!(its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE))
continue;
base = its->base; base = its->base;
writel_relaxed(its->ctlr_save, base + GITS_CTLR); writel_relaxed(its->ctlr_save, base + GITS_CTLR);
} }
...@@ -4784,9 +4777,6 @@ static void its_restore_enable(void) ...@@ -4784,9 +4777,6 @@ static void its_restore_enable(void)
void __iomem *base; void __iomem *base;
int i; int i;
if (!(its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE))
continue;
base = its->base; base = its->base;
/* /*
...@@ -4794,7 +4784,10 @@ static void its_restore_enable(void) ...@@ -4794,7 +4784,10 @@ static void its_restore_enable(void)
* don't restore it since writing to CBASER or BASER<n> * don't restore it since writing to CBASER or BASER<n>
* registers is undefined according to the GIC v3 ITS * registers is undefined according to the GIC v3 ITS
* Specification. * Specification.
*
* Firmware resuming with the ITS enabled is terminally broken.
*/ */
WARN_ON(readl_relaxed(base + GITS_CTLR) & GITS_CTLR_ENABLE);
ret = its_force_quiescent(base); ret = its_force_quiescent(base);
if (ret) { if (ret) {
pr_err("ITS@%pa: failed to quiesce on resume: %d\n", pr_err("ITS@%pa: failed to quiesce on resume: %d\n",
...@@ -5074,9 +5067,6 @@ static int __init its_probe_one(struct resource *res, ...@@ -5074,9 +5067,6 @@ static int __init its_probe_one(struct resource *res,
ctlr |= GITS_CTLR_ImDe; ctlr |= GITS_CTLR_ImDe;
writel_relaxed(ctlr, its->base + GITS_CTLR); writel_relaxed(ctlr, its->base + GITS_CTLR);
if (GITS_TYPER_HCC(typer))
its->flags |= ITS_FLAGS_SAVE_SUSPEND_STATE;
err = its_init_domain(handle, its); err = its_init_domain(handle, its);
if (err) if (err)
goto out_free_tables; goto out_free_tables;
......
...@@ -136,7 +136,7 @@ static int exiu_domain_translate(struct irq_domain *domain, ...@@ -136,7 +136,7 @@ static int exiu_domain_translate(struct irq_domain *domain,
if (fwspec->param_count != 2) if (fwspec->param_count != 2)
return -EINVAL; return -EINVAL;
*hwirq = fwspec->param[0]; *hwirq = fwspec->param[0];
*type = fwspec->param[2] & IRQ_TYPE_SENSE_MASK; *type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK;
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment