summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/include/cpufunc.h
diff options
context:
space:
mode:
authortmm <tmm@FreeBSD.org>2001-11-09 20:05:53 +0000
committertmm <tmm@FreeBSD.org>2001-11-09 20:05:53 +0000
commitadebde5f2dad30fc257378410fd8f6132bfc82d1 (patch)
tree69ba20a07ba1354704a2d2c47d4c1730015692c5 /sys/sparc64/include/cpufunc.h
parent8f24e75043dc5e79a13e508a4218d9a16562d87f (diff)
downloadFreeBSD-src-adebde5f2dad30fc257378410fd8f6132bfc82d1.zip
FreeBSD-src-adebde5f2dad30fc257378410fd8f6132bfc82d1.tar.gz
Add bus_space and busdma support for sparc64.
Diffstat (limited to 'sys/sparc64/include/cpufunc.h')
-rw-r--r--sys/sparc64/include/cpufunc.h56
1 files changed, 50 insertions, 6 deletions
diff --git a/sys/sparc64/include/cpufunc.h b/sys/sparc64/include/cpufunc.h
index 054b8df..8ce80db 100644
--- a/sys/sparc64/include/cpufunc.h
+++ b/sys/sparc64/include/cpufunc.h
@@ -80,17 +80,55 @@
__asm __volatile("flushw" : :); \
} while (0)
-#define ldxa(va, asi) ({ \
- u_long __r; \
- __asm __volatile("ldxa [%1] %2, %0" \
+/* Generate ld*a/st*a functions for non-constant ASI's. */
+#define LDNC_GEN(tp, o) \
+ static __inline tp \
+ o ## _nc(caddr_t va, int asi) \
+ { \
+ tp r; \
+ __asm __volatile("wr %2, 0, %%asi;" #o " [%1] %%asi, %0"\
+ : "=r" (r) : "r" (va), "r" (asi)); \
+ return (r); \
+ }
+
+LDNC_GEN(u_char, lduba);
+LDNC_GEN(u_short, lduha);
+LDNC_GEN(u_int, lduwa);
+LDNC_GEN(u_long, ldxa);
+
+#define LD_GENERIC(va, asi, op, type) ({ \
+ type __r; \
+ __asm __volatile(#op " [%1] %2, %0" \
: "=r" (__r) : "r" (va), "n" (asi)); \
__r; \
})
-#define stxa(va, asi, val) do { \
- __asm __volatile("stxa %0, [%1] %2" \
+#define lduba(va, asi) LD_GENERIC(va, asi, lduba, u_char)
+#define lduha(va, asi) LD_GENERIC(va, asi, lduha, u_short)
+#define lduwa(va, asi) LD_GENERIC(va, asi, lduwa, u_int)
+#define ldxa(va, asi) LD_GENERIC(va, asi, ldxa, u_long)
+
+#define STNC_GEN(tp, o) \
+ static __inline void \
+ o ## _nc(caddr_t va, int asi, tp val) \
+ { \
+ __asm __volatile("wr %2, 0, %%asi;" #o " %0, [%1] %%asi"\
+ : : "r" (val), "r" (va), "r" (asi)); \
+ }
+
+STNC_GEN(u_char, stba);
+STNC_GEN(u_short, stha);
+STNC_GEN(u_int, stwa);
+STNC_GEN(u_long, stxa);
+
+#define ST_GENERIC(va, asi, val, op) \
+ __asm __volatile(#op " %0, [%1] %2" \
: : "r" (val), "r" (va), "n" (asi)); \
-} while (0)
+
+#define stba(va, asi, val) ST_GENERIC(va, asi, val, stba)
+#define stha(va, asi, val) ST_GENERIC(va, asi, val, stha)
+#define stwa(va, asi, val) ST_GENERIC(va, asi, val, stwa)
+#define stxa(va, asi, val) ST_GENERIC(va, asi, val, stxa)
#define membar(mask) do { \
__asm __volatile("membar %0" : : "n" (mask)); \
@@ -140,6 +178,9 @@ critical_exit(critical_t pil)
wrpr(pil, pil, 0);
}
+void ascopyfrom(u_long sasi, vm_offset_t src, caddr_t dst, size_t len);
+void ascopyto(caddr_t src, u_long dasi, vm_offset_t dst, size_t len);
+
/*
* Ultrasparc II doesn't implement popc in hardware. Suck.
*/
@@ -165,4 +206,7 @@ ffs(int mask)
}
#endif
+#undef LDNC_GEN
+#undef STNC_GEN
+
#endif /* !_MACHINE_CPUFUNC_H_ */
OpenPOWER on IntegriCloud