Module Name:    src
Committed By:   uebayasi
Date:           Tue Feb  9 13:06:17 UTC 2010

Modified Files:
        src/sys/uvm [uebayasi-xip]: uvm_page.c uvm_page.h

Log Message:
Implement device page struct vm_page * handling.


To generate a diff of this commit:
cvs rdiff -u -r1.153.2.7 -r1.153.2.8 src/sys/uvm/uvm_page.c
cvs rdiff -u -r1.59.2.5 -r1.59.2.6 src/sys/uvm/uvm_page.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.153.2.7 src/sys/uvm/uvm_page.c:1.153.2.8
--- src/sys/uvm/uvm_page.c:1.153.2.7	Tue Feb  9 09:07:34 2010
+++ src/sys/uvm/uvm_page.c	Tue Feb  9 13:06:16 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.153.2.7 2010/02/09 09:07:34 uebayasi Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.153.2.8 2010/02/09 13:06:16 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.7 2010/02/09 09:07:34 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.8 2010/02/09 13:06:16 uebayasi Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -1033,35 +1033,53 @@
  * PHYS_TO_VM_PAGE: find vm_page for a PA.   used by MI code to get vm_pages
  * back from an I/O mapping (ugh!).   used in some MD code as well.
  */
-struct vm_page *
-uvm_phys_to_vm_page(paddr_t pa)
+
+#ifdef XIP
+#define	VM_PAGE_DEVICE_MAGIC		0x2
+#define	VM_PAGE_DEVICE_MAGIC_MASK	0x3
+#define	VM_PAGE_DEVICE_MAGIC_SHIFT	2
+
+static inline struct vm_page *
+VM_PAGE_DEVICE_PA_TO_PG(paddr_t pa)
 {
-	paddr_t pf = atop(pa);
-	int	off;
-	int	psi;
+	paddr_t pf = pa >> PAGE_SHIFT;
+	uintptr_t cookie = pf << VM_PAGE_DEVICE_MAGIC_SHIFT;
+	return (void *)(cookie | VM_PAGE_DEVICE_MAGIC);
+}
 
-	psi = vm_physseg_find(pf, &off);
-	if (psi != -1)
-		return(&vm_physmem[psi].pgs[off]);
-	return(NULL);
+static inline paddr_t
+VM_PAGE_DEVICE_PG_TO_PA(const struct vm_page *pg)
+{
+	uintptr_t cookie = (uintptr_t)pg & ~VM_PAGE_DEVICE_MAGIC_MASK;
+	paddr_t pf = cookie >> VM_PAGE_DEVICE_MAGIC_SHIFT;
+	return pf << PAGE_SHIFT;
 }
 
-#if 0
-#ifdef XIP
+bool
+uvm_pageisdevice_p(const struct vm_page *pg)
+{
+
+	return ((uintptr_t)pg & VM_PAGE_DEVICE_MAGIC_MASK) == VM_PAGE_DEVICE_MAGIC;
+}
+#endif
+
 struct vm_page *
-uvm_phys_to_vm_page_device(paddr_t pa)
+uvm_phys_to_vm_page(paddr_t pa)
 {
 	paddr_t pf = atop(pa);
 	int	off;
 	int	psi;
 
+#ifdef XIP
 	psi = vm_physseg_find_device(pf, &off);
 	if (psi != -1)
-		return(&vm_physdev[psi].pgs[off]);
+		return(VM_PAGE_DEVICE_PA_TO_PG(pa));
+#endif
+	psi = vm_physseg_find(pf, &off);
+	if (psi != -1)
+		return(&vm_physmem[psi].pgs[off]);
 	return(NULL);
 }
-#endif
-#endif
 
 paddr_t
 uvm_vm_page_to_phys(const struct vm_page *pg)
@@ -1069,6 +1087,11 @@
 	const struct vm_physseg *seg;
 	int psi;
 
+#ifdef XIP
+	if (uvm_pageisdevice_p(pg)) {
+		return VM_PAGE_DEVICE_PG_TO_PA(pg);
+	}
+#endif
 	psi = VM_PHYSSEG_FIND(vm_physmem, vm_nphysmem, VM_PHYSSEG_OP_PG, 0, pg, NULL);
 	KASSERT(psi != -1);
 	seg = &vm_physmem[psi];

Index: src/sys/uvm/uvm_page.h
diff -u src/sys/uvm/uvm_page.h:1.59.2.5 src/sys/uvm/uvm_page.h:1.59.2.6
--- src/sys/uvm/uvm_page.h:1.59.2.5	Tue Feb  9 09:07:34 2010
+++ src/sys/uvm/uvm_page.h	Tue Feb  9 13:06:17 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.h,v 1.59.2.5 2010/02/09 09:07:34 uebayasi Exp $	*/
+/*	$NetBSD: uvm_page.h,v 1.59.2.6 2010/02/09 13:06:17 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -291,15 +291,20 @@
 void uvm_pagewire(struct vm_page *);
 void uvm_pagezero(struct vm_page *);
 bool uvm_pageismanaged(paddr_t);
+#ifdef XIP
+bool uvm_pageisdevice_p(const struct vm_page *);
+#endif
 
 int uvm_page_lookup_freelist(struct vm_page *);
 
 int vm_physseg_find(paddr_t, int *);
+struct vm_page *uvm_phys_to_vm_page(paddr_t);
+paddr_t uvm_vm_page_to_phys(const struct vm_page *);
 #ifdef XIP
 int vm_physseg_find_device(paddr_t, int *);
+struct vm_page *uvm_phys_to_vm_page_device(paddr_t);
+paddr_t uvm_vm_page_to_phys_device(const struct vm_page *);
 #endif
-struct vm_page *uvm_phys_to_vm_page(paddr_t);
-paddr_t uvm_vm_page_to_phys(const struct vm_page *);
 
 /*
  * macros

Reply via email to