summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mvme88k/mvme88k/m88110.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/sys/arch/mvme88k/mvme88k/m88110.c b/sys/arch/mvme88k/mvme88k/m88110.c
index 9fb5de38a43..7d706dab07e 100644
--- a/sys/arch/mvme88k/mvme88k/m88110.c
+++ b/sys/arch/mvme88k/mvme88k/m88110.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: m88110.c,v 1.52 2007/12/15 19:37:41 miod Exp $ */
+/* $OpenBSD: m88110.c,v 1.53 2007/12/22 17:13:53 miod Exp $ */
/*
* Copyright (c) 1998 Steve Murphree, Jr.
* All rights reserved.
@@ -252,6 +252,7 @@ m88110_initialize_cpu(cpuid_t cpu)
extern int cpuspeed;
u_int ictl, dctl;
int i;
+ int procvers = (get_cpu_pid() & PID_VN) >> VN_SHIFT;
/* clear BATCs */
for (i = 0; i < 8; i++) {
@@ -264,13 +265,6 @@ m88110_initialize_cpu(cpuid_t cpu)
/* clear PATCs */
patc_clear();
- /*
- * 88110 errata #1:
- * ``Under certain conditions involving exceptions, with branch
- * prediction enabled, the CPU may hang.
- * Suggested fix: Clear the PREN bit of the ICTL. This will
- * disable branch prediction.''
- */
ictl = BATC_512K | CMMU_ICTL_DID | CMMU_ICTL_CEN | CMMU_ICTL_BEN;
/*
@@ -312,6 +306,36 @@ m88110_initialize_cpu(cpuid_t cpu)
dctl = BATC_512K | CMMU_DCTL_CEN | CMMU_DCTL_ADS;
dctl |= CMMU_DCTL_RSVD1; /* Data Matching Disable */
+ /*
+ * 88110 rev 4.2 errata #1:
+ * ``Under certain conditions involving exceptions, with branch
+ * prediction enabled, the CPU may hang.
+ * Suggested fix: Clear the PREN bit of the ICTL. This will
+ * disable branch prediction.''
+ *
+ * ...but this errata becomes...
+ *
+ * 88110 rev 5.1 errata #1:
+ * ``Under certain conditions involving exceptions, with branch
+ * prediction enabled and decoupled loads/stores enabled, load
+ * instructions may complete incorrectly or stores may execute
+ * to the wrong. address.
+ * Suggested fix: Clear the PREN bit of the ICTL or the DEN bit
+ * of the DCTL.''
+ *
+ * So since branch prediction appears to give better performance
+ * than data cache decoupling, and it is not known whether the
+ * problem has been understood better and thus the conditions
+ * narrowed on 5.1, or changes between 4.2 and 5.1 only restrict
+ * the conditions on which it may occur, we'll enable branch
+ * prediction on 5.1 processors and data cache decoupling on
+ * earlier versions.
+ */
+ if (procvers >= 0xf) /* > 0xb ? */
+ ictl |= CMMU_ICTL_PREN;
+ else
+ dctl |= CMMU_DCTL_DEN;
+
mc88110_inval_inst(); /* clear instruction cache & TIC */
mc88110_inval_data(); /* clear data cache */