irqchip fixes for Linux 5.10, take #2
- Fix Exiu driver trigger type when using ACPI - Fix GICv3 ITS suspend/resume to use the in-kernel path at all times, sidestepping braindead firmware support -----BEGIN PGP SIGNATURE----- iQJDBAABCgAtFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAl+6Yf8PHG1hekBrZXJu ZWwub3JnAAoJECPQ0LrRPXpD/+QP/R6DppA5eVK98xAt/qXia0eUbady8pib/a+8 UGKFJ8d5CPhaP/EuuUk1zcN4ry2WnRSXVxesVkEQMLu8nKLsgG8lEgojJAel+w92 gEbLuVnWJz6kiW/P7NUR/B1mYCacbi5IY+v3hFcoa6XzHbNHulzidUIkAiVcq9E/ aqr08O62BFcBWzxRaaK6om2gTI3oZvD+v/oHTfMzIA59oAQGmgUYnc0CUOjVR5Bl aGYsdq2RqkvSdQbb2oVMPW6Tb22cfUQT1TnY1JR+Q5a5vEqTu67bTs6rpviR2Fj8 CepcmoYUFC1tDW/tfbj+PgdDoyE2rbFUYyYiPX74caMi6rgLvSf8t1zK+sh/Q6x7 Lnriw6xRbCMtkIczM5A3OrMQ/PWdcxHkyNC/3x2+qkkZVOBbZJ+cSWsJm1d3yky+ IuaOTP2UYnToc+/uGHLysqUAehnMsSZnOvuYUVE4RVgMfbJvOX7rZdV1m+pic1GE Rm4TudcWni9b+14rFae/lOXXGDmY725898TI3Nud8bjKvyYcTMDO+R201VNFgNcB m/cWvPhbYP5OLR2cnvbWx0bg4WeBOY3m4RFIPHb2gCiPcWECLSCBaDfm7BG0eQvN DMLFIDePsj74vXejQbe5Txo8+dCe5vZsuzLRdFYElq6pOXVMjBtxF4s7In7RnqNB NPNENkqY =IjDX -----END PGP SIGNATURE----- Merge tag 'irqchip-fixes-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent Pull irqchip fixes from Marc Zyngier: - Fix Exiu driver trigger type when using ACPI - Fix GICv3 ITS suspend/resume to use the in-kernel path at all times, sidestepping braindead firmware support Link: https://lore.kernel.org/r/20201122184752.553990-1-maz@kernel.org
This commit is contained in:
commit
7032908cd5
|
@ -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)
|
||||||
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 @@ err:
|
||||||
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)
|
||||||
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)
|
||||||
* 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,
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue