svn commit: r191447 - head/sys/powerpc/powerpc

Marcel Moolenaar marcel at FreeBSD.org
Fri Apr 24 03:06:33 UTC 2009


Author: marcel
Date: Fri Apr 24 03:06:32 2009
New Revision: 191447
URL: http://svn.freebsd.org/changeset/base/191447

Log:
  Reimplement bs_be_rs_{1|2|4} and bs_le_rs_{1|2|4} by not
  calling the inline functions in <machine/pio.h> and do
  not add synchronization. Implement bs_gen_barrier() as
  eieio and sync.

Modified:
  head/sys/powerpc/powerpc/bus_machdep.c

Modified: head/sys/powerpc/powerpc/bus_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/bus_machdep.c	Fri Apr 24 02:55:20 2009	(r191446)
+++ head/sys/powerpc/powerpc/bus_machdep.c	Fri Apr 24 03:06:32 2009	(r191447)
@@ -39,9 +39,13 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#define	KTR_BE_IO	0
+#define	KTR_LE_IO	0
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
+#include <sys/ktr.h>
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
@@ -141,7 +145,7 @@ static void
 bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
     bus_size_t size __unused, int flags __unused)
 {
-	__asm __volatile("" : : : "memory");
+	__asm __volatile("eieio; sync" : : : "memory");
 }
 
 /*
@@ -150,19 +154,37 @@ bs_gen_barrier(bus_space_handle_t bsh __
 static uint8_t
 bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	return (in8(__ppc_ba(bsh, ofs)));
+	volatile uint8_t *addr;
+	uint8_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	res = *addr;
+	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
+	return (res);
 }
 
 static uint16_t
 bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	return (in16(__ppc_ba(bsh, ofs)));
+	volatile uint16_t *addr;
+	uint16_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	res = *addr;
+	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
+	return (res);
 }
 
 static uint32_t
 bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	return (in32(__ppc_ba(bsh, ofs)));
+	volatile uint32_t *addr;
+	uint32_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	res = *addr;
+	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
+	return (res);
 }
 
 static uint64_t
@@ -234,19 +256,31 @@ bs_be_rr_8(bus_space_handle_t bsh, bus_s
 static void
 bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
 {
-	out8(__ppc_ba(bsh, ofs), val);
+	volatile uint8_t *addr;
+
+	addr = __ppc_ba(bsh, ofs);
+	*addr = val;
+	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
 }
 
 static void
 bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
 {
-	out16(__ppc_ba(bsh, ofs), val);
+	volatile uint16_t *addr;
+
+	addr = __ppc_ba(bsh, ofs);
+	*addr = val;
+	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
 }
 
 static void
 bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
 {
-	out32(__ppc_ba(bsh, ofs), val);
+	volatile uint32_t *addr;
+
+	addr = __ppc_ba(bsh, ofs);
+	*addr = val;
+	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
 }
 
 static void
@@ -401,19 +435,37 @@ bs_be_sr_8(bus_space_handle_t bsh, bus_s
 static uint8_t
 bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	return (in8(__ppc_ba(bsh, ofs)));
+	volatile uint8_t *addr;
+	uint8_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	res = *addr;
+	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
+	return (res);
 }
 
 static uint16_t
 bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	return (in16rb(__ppc_ba(bsh, ofs)));
+	volatile uint16_t *addr;
+	uint16_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	__asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr));
+	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
+	return (res);
 }
 
 static uint32_t
 bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	return (in32rb(__ppc_ba(bsh, ofs)));
+	volatile uint32_t *addr;
+	uint32_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	__asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr));
+	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
+	return (res);
 }
 
 static uint64_t
@@ -485,19 +537,31 @@ bs_le_rr_8(bus_space_handle_t bsh, bus_s
 static void
 bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
 {
-	out8(__ppc_ba(bsh, ofs), val);
+	volatile uint8_t *addr;
+
+	addr = __ppc_ba(bsh, ofs);
+	*addr = val;
+	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
 }
 
 static void
 bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
 {
-	out16rb(__ppc_ba(bsh, ofs), val);
+	volatile uint16_t *addr;
+ 
+	addr = __ppc_ba(bsh, ofs);
+	__asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr));
+	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
 }
 
 static void
 bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
 {
-	out32rb(__ppc_ba(bsh, ofs), val);
+	volatile uint32_t *addr;
+
+	addr = __ppc_ba(bsh, ofs);
+	__asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr));
+	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
 }
 
 static void


More information about the svn-src-head mailing list