svn commit: r286121 - in head/sys: arm64/arm64 arm64/conf arm64/include conf

Zbigniew Bodek zbb at FreeBSD.org
Fri Jul 31 10:00:47 UTC 2015


Author: zbb
Date: Fri Jul 31 10:00:45 2015
New Revision: 286121
URL: https://svnweb.freebsd.org/changeset/base/286121

Log:
  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

Modified:
  head/sys/arm64/arm64/gic_v3.c
  head/sys/arm64/conf/GENERIC
  head/sys/arm64/include/cpu.h
  head/sys/conf/options.arm64

Modified: head/sys/arm64/arm64/gic_v3.c
==============================================================================
--- head/sys/arm64/arm64/gic_v3.c	Fri Jul 31 09:43:07 2015	(r286120)
+++ head/sys/arm64/arm64/gic_v3.c	Fri Jul 31 10:00:45 2015	(r286121)
@@ -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 tra
 	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;

Modified: head/sys/arm64/conf/GENERIC
==============================================================================
--- head/sys/arm64/conf/GENERIC	Fri Jul 31 09:43:07 2015	(r286120)
+++ head/sys/arm64/conf/GENERIC	Fri Jul 31 10:00:45 2015	(r286121)
@@ -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
 

Modified: head/sys/arm64/include/cpu.h
==============================================================================
--- head/sys/arm64/include/cpu.h	Fri Jul 31 09:43:07 2015	(r286120)
+++ head/sys/arm64/include/cpu.h	Fri Jul 31 10:00:45 2015	(r286121)
@@ -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[];
 

Modified: head/sys/conf/options.arm64
==============================================================================
--- head/sys/conf/options.arm64	Fri Jul 31 09:43:07 2015	(r286120)
+++ head/sys/conf/options.arm64	Fri Jul 31 10:00:45 2015	(r286121)
@@ -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


More information about the svn-src-head mailing list