Merge tag 'irqchip-fixes-5.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent

Pull irqchip fixes from Marc Zyngier:

- Add workaround for Cavium/Marvell ThunderX unimplemented GIC registers

Changed files
+31 -1
Documentation
drivers
irqchip
+2
Documentation/arm64/silicon-errata.rst
··· 110 110 +----------------+-----------------+-----------------+-----------------------------+ 111 111 | Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 | 112 112 +----------------+-----------------+-----------------+-----------------------------+ 113 + | Cavium | ThunderX GICv3 | #38539 | N/A | 114 + +----------------+-----------------+-----------------+-----------------------------+ 113 115 | Cavium | ThunderX Core | #27456 | CAVIUM_ERRATUM_27456 | 114 116 +----------------+-----------------+-----------------+-----------------------------+ 115 117 | Cavium | ThunderX Core | #30115 | CAVIUM_ERRATUM_30115 |
+29 -1
drivers/irqchip/irq-gic-v3.c
··· 34 34 #define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80) 35 35 36 36 #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0) 37 + #define FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539 (1ULL << 1) 37 38 38 39 struct redist_region { 39 40 void __iomem *redist_base; ··· 1465 1464 return true; 1466 1465 } 1467 1466 1467 + static bool gic_enable_quirk_cavium_38539(void *data) 1468 + { 1469 + struct gic_chip_data *d = data; 1470 + 1471 + d->flags |= FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539; 1472 + 1473 + return true; 1474 + } 1475 + 1468 1476 static bool gic_enable_quirk_hip06_07(void *data) 1469 1477 { 1470 1478 struct gic_chip_data *d = data; ··· 1511 1501 .iidr = 0x00000000, 1512 1502 .mask = 0xffffffff, 1513 1503 .init = gic_enable_quirk_hip06_07, 1504 + }, 1505 + { 1506 + /* 1507 + * Reserved register accesses generate a Synchronous 1508 + * External Abort. This erratum applies to: 1509 + * - ThunderX: CN88xx 1510 + * - OCTEON TX: CN83xx, CN81xx 1511 + * - OCTEON TX2: CN93xx, CN96xx, CN98xx, CNF95xx* 1512 + */ 1513 + .desc = "GICv3: Cavium erratum 38539", 1514 + .iidr = 0xa000034c, 1515 + .mask = 0xe8f00fff, 1516 + .init = gic_enable_quirk_cavium_38539, 1514 1517 }, 1515 1518 { 1516 1519 } ··· 1600 1577 pr_info("%d SPIs implemented\n", GIC_LINE_NR - 32); 1601 1578 pr_info("%d Extended SPIs implemented\n", GIC_ESPI_NR); 1602 1579 1603 - gic_data.rdists.gicd_typer2 = readl_relaxed(gic_data.dist_base + GICD_TYPER2); 1580 + /* 1581 + * ThunderX1 explodes on reading GICD_TYPER2, in violation of the 1582 + * architecture spec (which says that reserved registers are RES0). 1583 + */ 1584 + if (!(gic_data.flags & FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539)) 1585 + gic_data.rdists.gicd_typer2 = readl_relaxed(gic_data.dist_base + GICD_TYPER2); 1604 1586 1605 1587 gic_data.domain = irq_domain_create_tree(handle, &gic_irq_domain_ops, 1606 1588 &gic_data);