Module Name:    src
Committed By:   uebayasi
Date:           Wed Aug 11 13:20:08 UTC 2010

Modified Files:
        src/sys/arch/powerpc/conf [uebayasi-xip]: files.powerpc
        src/sys/arch/powerpc/include [uebayasi-xip]: bus.h
        src/sys/arch/powerpc/powerpc [uebayasi-xip]: bus_space.c

Log Message:
Support bus_space_physload(9) and friends.


To generate a diff of this commit:
cvs rdiff -u -r1.71.4.1 -r1.71.4.2 src/sys/arch/powerpc/conf/files.powerpc
cvs rdiff -u -r1.20 -r1.20.20.1 src/sys/arch/powerpc/include/bus.h
cvs rdiff -u -r1.20.20.1 -r1.20.20.2 src/sys/arch/powerpc/powerpc/bus_space.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/powerpc/conf/files.powerpc
diff -u src/sys/arch/powerpc/conf/files.powerpc:1.71.4.1 src/sys/arch/powerpc/conf/files.powerpc:1.71.4.2
--- src/sys/arch/powerpc/conf/files.powerpc:1.71.4.1	Fri Apr 30 14:39:41 2010
+++ src/sys/arch/powerpc/conf/files.powerpc	Wed Aug 11 13:20:07 2010
@@ -1,9 +1,10 @@
-#	$NetBSD: files.powerpc,v 1.71.4.1 2010/04/30 14:39:41 uebayasi Exp $
+#	$NetBSD: files.powerpc,v 1.71.4.2 2010/08/11 13:20:07 uebayasi Exp $
 
 defflag	opt_altivec.h	ALTIVEC K_ALTIVEC
 defflag	opt_openpic.h	OPENPIC OPENPIC_SERIAL_MODE
 defparam opt_ppcparam.h	L2CR_CONFIG L3CR_CONFIG INTSTK CLOCKBASE
 defflag	opt_ppcarch.h	PPC_OEA PPC_OEA601 PPC_OEA64 PPC_OEA64_BRIDGE PPC_MPC8XX PPC_IBM4XX PPC_IBM403 PPC_BOOKE
+			__BUS_SPACE_HAS_PHYSLOAD_METHODS
 defflag opt_pmap.h	PMAPDEBUG PMAPCHECK PMAPCOUNTERS
 defparam opt_pmap.h	PTEGCOUNT PMAP_MEMLIMIT
 

Index: src/sys/arch/powerpc/include/bus.h
diff -u src/sys/arch/powerpc/include/bus.h:1.20 src/sys/arch/powerpc/include/bus.h:1.20.20.1
--- src/sys/arch/powerpc/include/bus.h:1.20	Mon Apr 28 20:23:32 2008
+++ src/sys/arch/powerpc/include/bus.h	Wed Aug 11 13:20:07 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus.h,v 1.20 2008/04/28 20:23:32 martin Exp $	*/
+/*	$NetBSD: bus.h,v 1.20.20.1 2010/08/11 13:20:07 uebayasi Exp $	*/
 /*	$OpenBSD: bus.h,v 1.1 1997/10/13 10:53:42 pefo Exp $	*/
 
 /*-
@@ -110,6 +110,8 @@
  */
 typedef uint32_t bus_addr_t;
 typedef uint32_t bus_size_t;
+#define	PRIxBUSADDR	PRIx32
+#define	PRIxBUSSIZE	PRIx32
 
 #ifndef __HAVE_LOCAL_BUS_SPACE
 typedef	uint32_t bus_space_handle_t;
@@ -211,6 +213,14 @@
 	const struct powerpc_bus_space_set *pbs_set;
 	const struct powerpc_bus_space_set *pbs_set_stream;
 	const struct powerpc_bus_space_copy *pbs_copy;
+
+#ifdef __BUS_SPACE_HAS_PHYSLOAD_METHODS
+	void *(*pbs_physload)(bus_space_tag_t, bus_addr_t, bus_size_t, int);
+	void (*pbs_physunload)(bus_space_tag_t, void *);
+	void *(*pbs_physload_device)(bus_space_tag_t, bus_addr_t, bus_size_t,
+	    int, int);
+	void (*pbs_physunload_device)(bus_space_tag_t, void *);
+#endif
 };
 
 #define _BUS_SPACE_STRIDE(t, o) \
@@ -618,6 +628,46 @@
 
 #endif	/* !__HAVE_LOCAL_BUS_SPACE */
 
+#ifdef __BUS_SPACE_HAS_PHYSLOAD_METHODS
+/*
+ *	void *bus_space_physload (bus_space_tag_t t, bus_addr_t addr,
+ *	    bus_size_t size, int freelist);
+ *
+ * Allocate general purpose managed memory segment for a given bus space.
+ */
+
+#define bus_space_physload(t, a, s, fl)					\
+    ((*(t)->pbs_physload)((t), (a), (s), (fl)))
+
+/*
+ *	void *bus_space_physunload (bus_space_tag_t t, void *phys);
+ *
+ * Free general purpose managed memory segment for a given bus space.
+ */
+
+#define bus_space_physunload(t, phys)					\
+    ((*(t)->pbs_physunload)((t), (phys)))
+
+/*
+ *	void *bus_space_physload_device (bus_space_tag_t t, bus_addr_t addr,
+ *	    bus_size_t size, int freelist);
+ *
+ * Allocate managed device memory segment for a given bus space.
+ */
+
+#define bus_space_physload_device(t, a, s, prot, flags)			\
+    ((*(t)->pbs_physload_device)((t), (a), (s), (prot), (flags)))
+
+/*
+ *	void *bus_space_physunload_device (bus_space_tag_t t, void *phys);
+ *
+ * Allocate managed device memory segment for a given bus space.
+ */
+
+#define bus_space_physunload_device(t, phys)				\
+    ((*(t)->pbs_physunload_device)((t), (phys)))
+#endif
+
 /*
  * Bus DMA methods.
  */

Index: src/sys/arch/powerpc/powerpc/bus_space.c
diff -u src/sys/arch/powerpc/powerpc/bus_space.c:1.20.20.1 src/sys/arch/powerpc/powerpc/bus_space.c:1.20.20.2
--- src/sys/arch/powerpc/powerpc/bus_space.c:1.20.20.1	Fri Apr 30 14:39:45 2010
+++ src/sys/arch/powerpc/powerpc/bus_space.c	Wed Aug 11 13:20:08 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_space.c,v 1.20.20.1 2010/04/30 14:39:45 uebayasi Exp $	*/
+/*	$NetBSD: bus_space.c,v 1.20.20.2 2010/08/11 13:20:08 uebayasi Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.20.20.1 2010/04/30 14:39:45 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.20.20.2 2010/08/11 13:20:08 uebayasi Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -42,6 +42,7 @@
 #include <sys/malloc.h>
 
 #include <uvm/uvm_extern.h>
+#include <uvm/uvm_prot.h>
 
 #define _POWERPC_BUS_SPACE_PRIVATE
 #include <machine/bus.h>
@@ -394,6 +395,13 @@
 static int memio_alloc(bus_space_tag_t, bus_addr_t, bus_addr_t, bus_size_t,
 	bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
 static void memio_free(bus_space_tag_t, bus_space_handle_t, bus_size_t);
+#ifdef __BUS_SPACE_HAS_PHYSLOAD_METHODS
+static void *memio_physload(bus_space_tag_t, bus_addr_t, bus_size_t, int);
+static void memio_physunload(bus_space_tag_t, void *);
+static void *memio_physload_device(bus_space_tag_t, bus_addr_t, bus_size_t,
+	int, int);
+static void memio_physunload_device(bus_space_tag_t, void *);
+#endif
 
 static int extent_flags;
 
@@ -483,6 +491,14 @@
 		}
 	}
 #endif
+
+#ifdef __BUS_SPACE_HAS_PHYSLOAD_METHODS
+	t->pbs_physload = memio_physload;
+	t->pbs_physunload = memio_physunload;
+	t->pbs_physload_device = memio_physload_device;
+	t->pbs_physunload_device = memio_physunload_device;
+#endif
+
 	return 0;
 }
 
@@ -753,3 +769,36 @@
 	/* memio_unmap() does all that we need to do. */
 	memio_unmap(t, bsh, size);
 }
+
+#ifdef __BUS_SPACE_HAS_PHYSLOAD_METHODS
+static void *
+memio_physload(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int freelist)
+{
+	const paddr_t start = memio_mmap(t, bpa, 0, VM_PROT_ALL, 0) >> PAGE_SHIFT;
+	const paddr_t end = memio_mmap(t, bpa + size, 0, VM_PROT_ALL, 0) >> PAGE_SHIFT;
+
+	return uvm_page_physload(start, end, start, end, freelist);
+}
+
+static void
+memio_physunload(bus_space_tag_t t, void *phys)
+{
+	uvm_page_physunload(phys);
+}
+
+static void *
+memio_physload_device(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int prot,
+    int flags)
+{
+	const paddr_t start = memio_mmap(t, bpa, 0, prot, flags) >> PAGE_SHIFT;
+	const paddr_t end = memio_mmap(t, bpa + size, 0, prot, flags) >> PAGE_SHIFT;
+
+	return uvm_page_physload_device(start, end, start, end, prot, flags);
+}
+
+static void
+memio_physunload_device(bus_space_tag_t t, void *phys)
+{
+	uvm_page_physunload_device(phys);
+}
+#endif

Reply via email to