svn commit: r193578 - in head/sys/powerpc: include powerpc

Rafal Jaworowski raj at FreeBSD.org
Sat Jun 6 09:33:33 UTC 2009


Author: raj
Date: Sat Jun  6 09:33:32 2009
New Revision: 193578
URL: http://svn.freebsd.org/changeset/base/193578

Log:
  Provide 64-bit big endian bus space operations for PowerPC. They are required
  for the upcoming sec(4) driver.
  
  Submitted by:	Piotr Ziecik
  Obtained from:	Semihalf

Modified:
  head/sys/powerpc/include/pio.h
  head/sys/powerpc/powerpc/bus_machdep.c

Modified: head/sys/powerpc/include/pio.h
==============================================================================
--- head/sys/powerpc/include/pio.h	Sat Jun  6 08:22:12 2009	(r193577)
+++ head/sys/powerpc/include/pio.h	Sat Jun  6 09:33:32 2009	(r193578)
@@ -61,6 +61,13 @@ __outl(volatile u_int32_t *a, u_int32_t 
 }
 
 static __inline void
+__outll(volatile u_int64_t *a, u_int64_t v)
+{
+	*a = v;
+	__asm__ volatile("eieio; sync");
+}
+
+static __inline void
 __outwrb(volatile u_int16_t *a, u_int16_t v)
 {
 	__asm__ volatile("sthbrx %0, 0, %1" :: "r"(v), "r"(a));
@@ -104,6 +111,16 @@ __inl(volatile u_int32_t *a)
 	return _v_;
 }
 
+static __inline u_int64_t
+__inll(volatile u_int64_t *a)
+{
+	u_int64_t _v_;
+
+	_v_ = *a;
+	__asm__ volatile("eieio; sync");
+	return _v_;
+}
+
 static __inline u_int16_t
 __inwrb(volatile u_int16_t *a)
 {
@@ -130,12 +147,16 @@ __inlrb(volatile u_int32_t *a)
 #define	out16(a,v)	outw(a,v)
 #define	outl(a,v)	(__outl((volatile u_int32_t *)(a), v))
 #define	out32(a,v)	outl(a,v)
+#define	outll(a,v)	(__outll((volatile u_int64_t *)(a), v))
+#define	out64(a,v)	outll(a,v)
 #define	inb(a)		(__inb((volatile u_int8_t *)(a)))
 #define	in8(a)		inb(a)
 #define	inw(a)		(__inw((volatile u_int16_t *)(a)))
 #define	in16(a)		inw(a)
 #define	inl(a)		(__inl((volatile u_int32_t *)(a)))
 #define	in32(a)		inl(a)
+#define	inll(a)		(__inll((volatile u_int64_t *)(a)))
+#define	in64(a)		inll(a)
 
 #define	out8rb(a,v)	outb(a,v)
 #define	outwrb(a,v)	(__outwrb((volatile u_int16_t *)(a), v))
@@ -174,6 +195,14 @@ __outsl(volatile u_int32_t *a, const u_i
 }
 
 static __inline void
+__outsll(volatile u_int64_t *a, const u_int64_t *s, size_t c)
+{
+	while (c--)
+		*a = *s++;
+	__asm__ volatile("eieio; sync");
+}
+
+static __inline void
 __outswrb(volatile u_int16_t *a, const u_int16_t *s, size_t c)
 {
 	while (c--)
@@ -214,6 +243,14 @@ __insl(volatile u_int32_t *a, u_int32_t 
 }
 
 static __inline void
+__insll(volatile u_int64_t *a, u_int64_t *d, size_t c)
+{
+	while (c--)
+		*d++ = *a;
+	__asm__ volatile("eieio; sync");
+}
+
+static __inline void
 __inswrb(volatile u_int16_t *a, u_int16_t *d, size_t c)
 {
 	while (c--)
@@ -235,12 +272,16 @@ __inslrb(volatile u_int32_t *a, u_int32_
 #define	outs16(a,s,c)	outsw(a,s,c)
 #define	outsl(a,s,c)	(__outsl((volatile u_int32_t *)(a), s, c))
 #define	outs32(a,s,c)	outsl(a,s,c)
+#define	outsll(a,s,c)	(__outsll((volatile u_int64_t *)(a), s, c))
+#define	outs64(a,s,c)	outsll(a,s,c)
 #define	insb(a,d,c)	(__insb((volatile u_int8_t *)(a), d, c))
 #define	ins8(a,d,c)	insb(a,d,c)
 #define	insw(a,d,c)	(__insw((volatile u_int16_t *)(a), d, c))
 #define	ins16(a,d,c)	insw(a,d,c)
 #define	insl(a,d,c)	(__insl((volatile u_int32_t *)(a), d, c))
 #define	ins32(a,d,c)	insl(a,d,c)
+#define	insll(a,d,c)	(__insll((volatile u_int64_t *)(a), d, c))
+#define	ins64(a,d,c)	insll(a,d,c)
 
 #define	outs8rb(a,s,c)	outsb(a,s,c)
 #define	outswrb(a,s,c)	(__outswrb((volatile u_int16_t *)(a), s, c))

Modified: head/sys/powerpc/powerpc/bus_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/bus_machdep.c	Sat Jun  6 08:22:12 2009	(r193577)
+++ head/sys/powerpc/powerpc/bus_machdep.c	Sat Jun  6 09:33:32 2009	(r193578)
@@ -190,7 +190,12 @@ bs_be_rs_4(bus_space_handle_t bsh, bus_s
 static uint64_t
 bs_be_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
 {
-	TODO;
+	volatile uint64_t *addr;
+	uint64_t res;
+
+	addr = __ppc_ba(bsh, ofs);
+	res = *addr;
+	return (res);
 }
 
 static void
@@ -212,9 +217,9 @@ bs_be_rm_4(bus_space_handle_t bsh, bus_s
 }
 
 static void
-bs_be_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
+bs_be_rm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
 {
-	TODO;
+	ins64(__ppc_ba(bsh, ofs), addr, cnt);
 }
 
 static void
@@ -250,7 +255,11 @@ bs_be_rr_4(bus_space_handle_t bsh, bus_s
 static void
 bs_be_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
 {
-	TODO;
+	volatile uint64_t *s = __ppc_ba(bsh, ofs);
+
+	while (cnt--)
+		*addr++ = *s++;
+	__asm __volatile("eieio; sync");
 }
 
 static void
@@ -286,7 +295,10 @@ bs_be_ws_4(bus_space_handle_t bsh, bus_s
 static void
 bs_be_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
 {
-	TODO;
+	volatile uint64_t *addr;
+
+	addr = __ppc_ba(bsh, ofs);
+	*addr = val;
 }
 
 static void
@@ -314,7 +326,7 @@ static void
 bs_be_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
     bus_size_t cnt)
 {
-	TODO;
+	outsll(__ppc_ba(bsh, ofs), addr, cnt);
 }
 
 static void
@@ -354,7 +366,11 @@ static void
 bs_be_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
     size_t cnt)
 {
-	TODO;
+	volatile uint64_t *d = __ppc_ba(bsh, ofs);
+
+	while (cnt--)
+		*d++ = *addr++;
+	__asm __volatile("eieio; sync");
 }
 
 static void
@@ -390,7 +406,11 @@ bs_be_sm_4(bus_space_handle_t bsh, bus_s
 static void
 bs_be_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
 {
-	TODO;
+	volatile uint64_t *d = __ppc_ba(bsh, ofs);
+
+	while (cnt--)
+		*d = val;
+	__asm __volatile("eieio; sync");
 }
 
 static void
@@ -426,7 +446,11 @@ bs_be_sr_4(bus_space_handle_t bsh, bus_s
 static void
 bs_be_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
 {
-	TODO;
+	volatile uint64_t *d = __ppc_ba(bsh, ofs);
+
+	while (cnt--)
+		*d++ = val;
+	__asm __volatile("eieio; sync");
 }
 
 /*


More information about the svn-src-head mailing list