Module Name: src
Committed By: nakayama
Date: Fri Jan 15 23:57:07 UTC 2010
Modified Files:
src/sys/arch/sparc64/sparc64: ipifuncs.c
Log Message:
UltraSPARC-IIIi CPUs select the BUSY/NACK pair in the interrupt
vector dispatch status register based on the lower two bits of the
ITID.
>From OpenBSD and details are described in the section 10.4.3 of
UltraSPARC IIIi Processor User's Manual.
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/sparc64/sparc64/ipifuncs.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/sparc64/ipifuncs.c
diff -u src/sys/arch/sparc64/sparc64/ipifuncs.c:1.25 src/sys/arch/sparc64/sparc64/ipifuncs.c:1.26
--- src/sys/arch/sparc64/sparc64/ipifuncs.c:1.25 Mon Nov 30 01:45:04 2009
+++ src/sys/arch/sparc64/sparc64/ipifuncs.c Fri Jan 15 23:57:07 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: ipifuncs.c,v 1.25 2009/11/30 01:45:04 mrg Exp $ */
+/* $NetBSD: ipifuncs.c,v 1.26 2010/01/15 23:57:07 nakayama Exp $ */
/*-
* Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.25 2009/11/30 01:45:04 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.26 2010/01/15 23:57:07 nakayama Exp $");
#include "opt_ddb.h"
@@ -188,11 +188,19 @@
void
sparc64_send_ipi(int upaid, ipifunc_t func, uint64_t arg1, uint64_t arg2)
{
- int i, ik;
+ int i, ik, shift = 0;
uint64_t intr_func;
KASSERT(upaid != curcpu()->ci_cpuid);
- if (ldxa(0, ASR_IDSR) & IDSR_BUSY)
+
+ /*
+ * UltraSPARC-IIIi CPUs select the BUSY/NACK pair based on the
+ * lower two bits of the ITID.
+ */
+ if (((getver() & VER_IMPL) >> VER_IMPL_SHIFT) == IMPL_JALAPENO)
+ shift = (upaid & 0x3) * 2;
+
+ if (ldxa(0, ASR_IDSR) & (IDSR_BUSY << shift))
panic("recursive IPI?");
intr_func = (uint64_t)(u_long)func;
@@ -211,7 +219,7 @@
membar_sync();
for (ik = 0; ik < 1000000; ik++) {
- if (ldxa(0, ASR_IDSR) & IDSR_BUSY)
+ if (ldxa(0, ASR_IDSR) & (IDSR_BUSY << shift))
continue;
else
break;
@@ -221,7 +229,7 @@
if (ik == 1000000)
break;
- if ((ldxa(0, ASR_IDSR) & IDSR_NACK) == 0)
+ if ((ldxa(0, ASR_IDSR) & (IDSR_NACK << shift)) == 0)
return;
/*
* Wait for a while with enabling interrupts to avoid