Apply erratum for mrs ICC_IAR1_EL1 speculative execution on ThunderX

ERRATUM:     22978, 23154
PASS (rev.): 1.0/1.1

Reviewed by:   imp
Obtained from: Semihalf
Sponsored by:  The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D3184
This commit is contained in:
Zbigniew Bodek 2015-07-31 10:00:45 +00:00
parent 56d6361d92
commit a2b3dfad08
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=286121
4 changed files with 51 additions and 5 deletions

View File

@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <vm/pmap.h>
#include <machine/bus.h>
#include <machine/cpu.h>
#include <machine/intr.h>
#include "pic_if.h"
@ -230,7 +231,22 @@ gic_v3_dispatch(device_t dev, struct trapframe *frame)
uint64_t active_irq;
while (1) {
active_irq = gic_icc_read(IAR1);
if (CPU_MATCH_ERRATA_CAVIUM_THUNDER_1_1) {
/*
* Hardware: Cavium ThunderX
* Chip revision: Pass 1.0 (early version)
* Pass 1.1 (production)
* ERRATUM: 22978, 23154
*/
__asm __volatile(
"nop;nop;nop;nop;nop;nop;nop;nop; \n"
"mrs %0, ICC_IAR1_EL1 \n"
"nop;nop;nop;nop; \n"
"dsb sy \n"
: "=&r" (active_irq));
} else {
active_irq = gic_icc_read(IAR1);
}
if (__predict_false(active_irq == ICC_IAR1_EL1_SPUR))
break;

View File

@ -109,6 +109,9 @@ device psci # Support for ARM PSCI
# Note that 'bpf' is required for DHCP.
device bpf # Berkeley packet filter
# Chip-specific errata
options THUNDERX_PASS_1_1_ERRATA
options FDT
device acpi

View File

@ -78,6 +78,9 @@
#define CPU_PART_CORTEX_A53 0xD03
#define CPU_PART_CORTEX_A57 0xD07
#define CPU_REV_THUNDER_1_0 0x00
#define CPU_REV_THUNDER_1_1 0x01
#define CPU_IMPL(midr) (((midr) >> 24) & 0xff)
#define CPU_PART(midr) (((midr) >> 4) & 0xfff)
#define CPU_VAR(midr) (((midr) >> 20) & 0xf)
@ -105,6 +108,29 @@
#define CPU_MATCH_RAW(mask, devid) \
(((mask) & PCPU_GET(midr)) == ((mask) & (devid)))
/*
* Chip-specific errata. This defines are intended to be
* booleans used within if statements. When an appropriate
* kernel option is disabled, these defines must be defined
* as 0 to allow the compiler to remove a dead code thus
* produce better optimized kernel image.
*/
/*
* Vendor: Cavium
* Chip: ThunderX
* Revision(s): Pass 1.0, Pass 1.1
*/
#ifdef THUNDERX_PASS_1_1_ERRATA
#define CPU_MATCH_ERRATA_CAVIUM_THUNDER_1_1 \
(CPU_MATCH(CPU_IMPL_MASK | CPU_PART_MASK | CPU_REV_MASK, \
CPU_IMPL_CAVIUM, CPU_PART_THUNDER, 0, CPU_REV_THUNDER_1_0) || \
CPU_MATCH(CPU_IMPL_MASK | CPU_PART_MASK | CPU_REV_MASK, \
CPU_IMPL_CAVIUM, CPU_PART_THUNDER, 0, CPU_REV_THUNDER_1_1))
#else
#define CPU_MATCH_ERRATA_CAVIUM_THUNDER_1_1 0
#endif
extern char btext[];
extern char etext[];

View File

@ -1,6 +1,7 @@
# $FreeBSD$
ARM64 opt_global.h
SOCDEV_PA opt_global.h
SOCDEV_VA opt_global.h
VFP opt_global.h
ARM64 opt_global.h
SOCDEV_PA opt_global.h
SOCDEV_VA opt_global.h
THUNDERX_PASS_1_1_ERRATA opt_global.h
VFP opt_global.h