Merge branch 'for-next/errata' into for-next/core
* for-next/errata: arm64: Add cavium_erratum_23154_cpus missing sentinel irqchip/gic-v3: Workaround Marvell erratum 38545 when reading IAR
This commit is contained in:
commit
cd92fdfcfa
@ -136,7 +136,7 @@ stable kernels.
|
|||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Cavium | ThunderX ITS | #23144 | CAVIUM_ERRATUM_23144 |
|
| Cavium | ThunderX ITS | #23144 | CAVIUM_ERRATUM_23144 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 |
|
| Cavium | ThunderX GICv3 | #23154,38545 | CAVIUM_ERRATUM_23154 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Cavium | ThunderX GICv3 | #38539 | N/A |
|
| Cavium | ThunderX GICv3 | #38539 | N/A |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
@ -891,13 +891,17 @@ config CAVIUM_ERRATUM_23144
|
|||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
config CAVIUM_ERRATUM_23154
|
config CAVIUM_ERRATUM_23154
|
||||||
bool "Cavium erratum 23154: Access to ICC_IAR1_EL1 is not sync'ed"
|
bool "Cavium errata 23154 and 38545: GICv3 lacks HW synchronisation"
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
The gicv3 of ThunderX requires a modified version for
|
The ThunderX GICv3 implementation requires a modified version for
|
||||||
reading the IAR status to ensure data synchronization
|
reading the IAR status to ensure data synchronization
|
||||||
(access to icc_iar1_el1 is not sync'ed before and after).
|
(access to icc_iar1_el1 is not sync'ed before and after).
|
||||||
|
|
||||||
|
It also suffers from erratum 38545 (also present on Marvell's
|
||||||
|
OcteonTX and OcteonTX2), resulting in deactivated interrupts being
|
||||||
|
spuriously presented to the CPU interface.
|
||||||
|
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
config CAVIUM_ERRATUM_27456
|
config CAVIUM_ERRATUM_27456
|
||||||
|
@ -53,17 +53,36 @@ static inline u64 gic_read_iar_common(void)
|
|||||||
* The gicv3 of ThunderX requires a modified version for reading the
|
* The gicv3 of ThunderX requires a modified version for reading the
|
||||||
* IAR status to ensure data synchronization (access to icc_iar1_el1
|
* IAR status to ensure data synchronization (access to icc_iar1_el1
|
||||||
* is not sync'ed before and after).
|
* is not sync'ed before and after).
|
||||||
|
*
|
||||||
|
* Erratum 38545
|
||||||
|
*
|
||||||
|
* When a IAR register read races with a GIC interrupt RELEASE event,
|
||||||
|
* GIC-CPU interface could wrongly return a valid INTID to the CPU
|
||||||
|
* for an interrupt that is already released(non activated) instead of 0x3ff.
|
||||||
|
*
|
||||||
|
* To workaround this, return a valid interrupt ID only if there is a change
|
||||||
|
* in the active priority list after the IAR read.
|
||||||
|
*
|
||||||
|
* Common function used for both the workarounds since,
|
||||||
|
* 1. On Thunderx 88xx 1.x both erratas are applicable.
|
||||||
|
* 2. Having extra nops doesn't add any side effects for Silicons where
|
||||||
|
* erratum 23154 is not applicable.
|
||||||
*/
|
*/
|
||||||
static inline u64 gic_read_iar_cavium_thunderx(void)
|
static inline u64 gic_read_iar_cavium_thunderx(void)
|
||||||
{
|
{
|
||||||
u64 irqstat;
|
u64 irqstat, apr;
|
||||||
|
|
||||||
|
apr = read_sysreg_s(SYS_ICC_AP1R0_EL1);
|
||||||
nops(8);
|
nops(8);
|
||||||
irqstat = read_sysreg_s(SYS_ICC_IAR1_EL1);
|
irqstat = read_sysreg_s(SYS_ICC_IAR1_EL1);
|
||||||
nops(4);
|
nops(4);
|
||||||
mb();
|
mb();
|
||||||
|
|
||||||
return irqstat;
|
/* Max priority groups implemented is only 32 */
|
||||||
|
if (likely(apr != read_sysreg_s(SYS_ICC_AP1R0_EL1)))
|
||||||
|
return irqstat;
|
||||||
|
|
||||||
|
return 0x3ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_ctlr(u32 val)
|
static inline void gic_write_ctlr(u32 val)
|
||||||
|
@ -84,6 +84,13 @@
|
|||||||
#define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2
|
#define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2
|
||||||
#define CAVIUM_CPU_PART_THUNDERX_83XX 0x0A3
|
#define CAVIUM_CPU_PART_THUNDERX_83XX 0x0A3
|
||||||
#define CAVIUM_CPU_PART_THUNDERX2 0x0AF
|
#define CAVIUM_CPU_PART_THUNDERX2 0x0AF
|
||||||
|
/* OcteonTx2 series */
|
||||||
|
#define CAVIUM_CPU_PART_OCTX2_98XX 0x0B1
|
||||||
|
#define CAVIUM_CPU_PART_OCTX2_96XX 0x0B2
|
||||||
|
#define CAVIUM_CPU_PART_OCTX2_95XX 0x0B3
|
||||||
|
#define CAVIUM_CPU_PART_OCTX2_95XXN 0x0B4
|
||||||
|
#define CAVIUM_CPU_PART_OCTX2_95XXMM 0x0B5
|
||||||
|
#define CAVIUM_CPU_PART_OCTX2_95XXO 0x0B6
|
||||||
|
|
||||||
#define BRCM_CPU_PART_BRAHMA_B53 0x100
|
#define BRCM_CPU_PART_BRAHMA_B53 0x100
|
||||||
#define BRCM_CPU_PART_VULCAN 0x516
|
#define BRCM_CPU_PART_VULCAN 0x516
|
||||||
@ -124,6 +131,12 @@
|
|||||||
#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)
|
#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)
|
||||||
#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
|
#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
|
||||||
#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
|
#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
|
||||||
|
#define MIDR_OCTX2_98XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_98XX)
|
||||||
|
#define MIDR_OCTX2_96XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_96XX)
|
||||||
|
#define MIDR_OCTX2_95XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XX)
|
||||||
|
#define MIDR_OCTX2_95XXN MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XXN)
|
||||||
|
#define MIDR_OCTX2_95XXMM MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XXMM)
|
||||||
|
#define MIDR_OCTX2_95XXO MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XXO)
|
||||||
#define MIDR_CAVIUM_THUNDERX2 MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX2)
|
#define MIDR_CAVIUM_THUNDERX2 MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX2)
|
||||||
#define MIDR_BRAHMA_B53 MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_BRAHMA_B53)
|
#define MIDR_BRAHMA_B53 MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_BRAHMA_B53)
|
||||||
#define MIDR_BRCM_VULCAN MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN)
|
#define MIDR_BRCM_VULCAN MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN)
|
||||||
|
@ -214,6 +214,21 @@ static const struct arm64_cpu_capabilities arm64_repeat_tlbi_list[] = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_CAVIUM_ERRATUM_23154
|
||||||
|
const struct midr_range cavium_erratum_23154_cpus[] = {
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_THUNDERX),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_THUNDERX_81XX),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_THUNDERX_83XX),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_OCTX2_98XX),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_OCTX2_96XX),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_OCTX2_95XX),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_OCTX2_95XXN),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_OCTX2_95XXMM),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_OCTX2_95XXO),
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CAVIUM_ERRATUM_27456
|
#ifdef CONFIG_CAVIUM_ERRATUM_27456
|
||||||
const struct midr_range cavium_erratum_27456_cpus[] = {
|
const struct midr_range cavium_erratum_27456_cpus[] = {
|
||||||
/* Cavium ThunderX, T88 pass 1.x - 2.1 */
|
/* Cavium ThunderX, T88 pass 1.x - 2.1 */
|
||||||
@ -425,10 +440,10 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
|||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CAVIUM_ERRATUM_23154
|
#ifdef CONFIG_CAVIUM_ERRATUM_23154
|
||||||
{
|
{
|
||||||
/* Cavium ThunderX, pass 1.x */
|
.desc = "Cavium errata 23154 and 38545",
|
||||||
.desc = "Cavium erratum 23154",
|
|
||||||
.capability = ARM64_WORKAROUND_CAVIUM_23154,
|
.capability = ARM64_WORKAROUND_CAVIUM_23154,
|
||||||
ERRATA_MIDR_REV_RANGE(MIDR_THUNDERX, 0, 0, 1),
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
|
||||||
|
ERRATA_MIDR_RANGE_LIST(cavium_erratum_23154_cpus),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CAVIUM_ERRATUM_27456
|
#ifdef CONFIG_CAVIUM_ERRATUM_27456
|
||||||
|
Loading…
Reference in New Issue
Block a user