Module Name:    src
Committed By:   skrll
Date:           Tue Feb 16 16:56:30 UTC 2010

Modified Files:
        src/sys/arch/hp700/hp700: machdep.c mainbus.c
        src/sys/arch/hppa/hppa: pmap.c
        src/sys/arch/hppa/include: vmparam.h

Log Message:
Remove the dma24_ex method of dealing with BUS_DMA_24BIT and replace
with a uvm managed freelist of pages in the right range.


To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 src/sys/arch/hp700/hp700/machdep.c
cvs rdiff -u -r1.61 -r1.62 src/sys/arch/hp700/hp700/mainbus.c
cvs rdiff -u -r1.63 -r1.64 src/sys/arch/hppa/hppa/pmap.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/hppa/include/vmparam.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/arch/hp700/hp700/machdep.c
diff -u src/sys/arch/hp700/hp700/machdep.c:1.78 src/sys/arch/hp700/hp700/machdep.c:1.79
--- src/sys/arch/hp700/hp700/machdep.c:1.78	Mon Feb  8 19:02:29 2010
+++ src/sys/arch/hp700/hp700/machdep.c	Tue Feb 16 16:56:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.78 2010/02/08 19:02:29 joerg Exp $	*/
+/*	$NetBSD: machdep.c,v 1.79 2010/02/16 16:56:29 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.78 2010/02/08 19:02:29 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.79 2010/02/16 16:56:29 skrll Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -247,13 +247,6 @@
 /* Virtual page frame for /dev/mem (see mem.c) */
 vaddr_t vmmap;
 
-/*
- * Certain devices need DMA'able memory below the 16MB boundary.
- */
-#define	DMA24_SIZE	(128 * 1024)
-struct extent *dma24_ex;
-long dma24_ex_storage[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
-
 /* Our exported CPU info; we can have only one. */
 struct cpu_info cpu_info_store = {
 #ifdef MULTIPROCESSOR
@@ -495,14 +488,6 @@
 	vstart += MSGBUFSIZE;
 	vstart = round_page(vstart);
 
-	/* Allocate the 24-bit DMA region. */
-	dma24_ex = extent_create("dma24", vstart, vstart + DMA24_SIZE, M_DEVBUF,
-	    (void *)dma24_ex_storage, sizeof(dma24_ex_storage),
-	    EX_NOCOALESCE|EX_NOWAIT);
-	vstart += DMA24_SIZE;
-	vstart = round_page(vstart);
-
-
 	if (usebtlb) {
 		/* Allocate and initialize the BTLB slots array. */
 		btlb_slots = (struct btlb_slot *) ALIGN(vstart);

Index: src/sys/arch/hp700/hp700/mainbus.c
diff -u src/sys/arch/hp700/hp700/mainbus.c:1.61 src/sys/arch/hp700/hp700/mainbus.c:1.62
--- src/sys/arch/hp700/hp700/mainbus.c:1.61	Fri Feb 12 22:34:39 2010
+++ src/sys/arch/hp700/hp700/mainbus.c	Tue Feb 16 16:56:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: mainbus.c,v 1.61 2010/02/12 22:34:39 skrll Exp $	*/
+/*	$NetBSD: mainbus.c,v 1.62 2010/02/16 16:56:29 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.61 2010/02/12 22:34:39 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.62 2010/02/16 16:56:29 skrll Exp $");
 
 #include "locators.h"
 #include "power.h"
@@ -113,7 +113,6 @@
 
 /* from machdep.c */
 extern struct extent *hp700_io_extent;
-extern struct extent *dma24_ex;
 
 u_int8_t mbus_r1(void *, bus_space_handle_t, bus_size_t);
 u_int16_t mbus_r2(void *, bus_space_handle_t, bus_size_t);
@@ -1192,33 +1191,8 @@
 	 * Allocate physical pages from the VM system.
 	 */
 	TAILQ_INIT(mlist);
-	error = uvm_pglistalloc(size, low, high, 0, 0,
-				mlist, nsegs, (flags & BUS_DMA_NOWAIT) == 0);
-
-	/*
-	 * If the allocation failed, and this is a 24-bit
-	 * device, see if we have space left in the 24-bit
-	 * region.
-	 */
-	if (error == ENOMEM && (flags & BUS_DMA_24BIT) && dma24_ex != NULL) {
-		error = extent_alloc(dma24_ex, size, alignment, 0, 0, &pa);
-		if (!error) {
-			free(mlist, M_DEVBUF);
-			/*
-			 * A _ds_mlist value of NULL is the
-			 * signal to mbus_dmamem_map that no
-			 * real mapping needs to be done, and
-			 * it is the signal to mbus_dmamem_free
-			 * that an extent_free is needed.
-			 */
-			*rsegs = 1;
-			segs[0].ds_addr = 0;
-			segs[0].ds_len = size;
-			segs[0]._ds_va = (vaddr_t)pa;
-			segs[0]._ds_mlist = NULL;
-			return (0);
-		}
-	}
+	error = uvm_pglistalloc(size, low, high, 0, 0, mlist, nsegs,
+	    (flags & BUS_DMA_NOWAIT) == 0);
 
 	/* If we don't have the pages. */
 	if (error) {
@@ -1226,15 +1200,10 @@
 		return (error);
 	}
 
-	/*
-	 * Since, at least as of revision 1.17 of uvm_pglist.c,
-	 * uvm_pglistalloc ignores its nsegs argument, we need
-	 * to check that the pages returned conform to the
-	 * caller's segment requirements.
-	 */
 	pa_next = 0;
 	seg = -1;
-	for (m = TAILQ_FIRST(mlist); m != NULL; m = TAILQ_NEXT(m,pageq.queue)) {
+
+	TAILQ_FOREACH(m, mlist, pageq.queue) {
 		pa = VM_PAGE_TO_PHYS(m);
 		if (pa != pa_next) {
 			if (++seg >= nsegs) {
@@ -1269,17 +1238,16 @@
 void
 mbus_dmamem_free(void *v, bus_dma_segment_t *segs, int nsegs)
 {
-
+	struct pglist *mlist;
 	/*
 	 * Return the list of physical pages back to the VM system.
 	 */
-	if (segs[0]._ds_mlist != NULL) {
-		uvm_pglistfree(segs[0]._ds_mlist);
-		free(segs[0]._ds_mlist, M_DEVBUF);
-	} else {
-		extent_free(dma24_ex, segs[0]._ds_va, segs[0].ds_len,
-				EX_NOWAIT);
-	}
+	mlist = segs[0]._ds_mlist;
+	if (mlist == NULL)
+		return;
+	
+	uvm_pglistfree(mlist);
+	free(mlist, M_DEVBUF);
 }
 
 /*
@@ -1299,17 +1267,9 @@
 
 	size = round_page(size);
 
-	/* 24-bit memory needs no mapping. */
-	if (segs[0]._ds_mlist == NULL) {
-		if (size > segs[0].ds_len)
-			panic("mbus_dmamem_map: size botch");
-		*kvap = (void *)segs[0]._ds_va;
-		return (0);
-	}
-
 	/* Get a chunk of kernel virtual space. */
 	va = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | kmflags);
-	if (va == 0)
+	if (__predict_false(va == 0))
 		return (ENOMEM);
 
 	/* Stash that in the first segment. */
@@ -1321,7 +1281,9 @@
 	TAILQ_FOREACH(pg, pglist, pageq.queue) {
 		KASSERT(size != 0);
 		pa = VM_PAGE_TO_PHYS(pg);
-		pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, PMAP_NOCACHE);
+		pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE,
+		    PMAP_NOCACHE);
+
 		va += PAGE_SIZE;
 		size -= PAGE_SIZE;
 	}
@@ -1337,17 +1299,7 @@
 mbus_dmamem_unmap(void *v, void *kva, size_t size)
 {
 
-#ifdef DIAGNOSTIC
-	if ((u_long)kva & PAGE_MASK)
-		panic("mbus_dmamem_unmap");
-#endif
-
-	/*
-	 * XXX fredette - this is gross, but it is needed
-	 * to support the 24-bit DMA address stuff.
-	 */
-	if (dma24_ex != NULL && kva < (void *) (1 << 24))
-		return;
+	KASSERT(((vaddr_t)kva & PAGE_MASK) == 0);
 
 	size = round_page(size);
 	pmap_kremove((vaddr_t)kva, size);

Index: src/sys/arch/hppa/hppa/pmap.c
diff -u src/sys/arch/hppa/hppa/pmap.c:1.63 src/sys/arch/hppa/hppa/pmap.c:1.64
--- src/sys/arch/hppa/hppa/pmap.c:1.63	Fri Dec 18 19:20:35 2009
+++ src/sys/arch/hppa/hppa/pmap.c	Tue Feb 16 16:56:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.63 2009/12/18 19:20:35 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.64 2010/02/16 16:56:30 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.63 2009/12/18 19:20:35 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.64 2010/02/16 16:56:30 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -667,6 +667,39 @@
 	return (pv);
 }
 
+#define	FIRST_16M atop(16 * 1024 * 1024)
+
+static void
+pmap_page_physload(paddr_t spa, paddr_t epa)
+{
+
+	if (spa < FIRST_16M && epa <= FIRST_16M) {
+		DPRINTF(PDB_INIT, ("%s: phys segment 0x%05lx 0x%05lx\n",
+		    __func__, spa, epa));
+
+		uvm_page_physload(spa, epa, spa, epa, VM_FREELIST_ISADMA);
+	} else if (spa < FIRST_16M && epa > FIRST_16M) {
+		DPRINTF(PDB_INIT, ("%s: phys segment 0x%05lx 0x%05lx\n",
+		    __func__, spa, FIRST_16M));
+
+		uvm_page_physload(spa, FIRST_16M, spa, FIRST_16M,
+		    VM_FREELIST_ISADMA);
+
+		DPRINTF(PDB_INIT, ("%s: phys segment 0x%05lx 0x%05lx\n",
+		    __func__, FIRST_16M, epa));
+
+		uvm_page_physload(FIRST_16M, epa, FIRST_16M, epa,
+		    VM_FREELIST_DEFAULT);
+	} else {
+		DPRINTF(PDB_INIT, ("%s: phys segment 0x%05lx 0x%05lx\n",
+		    __func__, spa, epa));
+
+		uvm_page_physload(spa, epa, spa, epa, VM_FREELIST_DEFAULT);
+	}
+
+	availphysmem += epa - spa;
+}
+
 /*
  * Bootstrap the system enough to run with virtual memory.
  * Map the kernel's code, data and bss, and allocate the system page table.
@@ -686,7 +719,6 @@
 	extern int resvphysmem;
 	vsize_t btlb_entry_min, btlb_entry_max, btlb_entry_got;
 	paddr_t ksrx, kerx, ksro, kero, ksrw, kerw;
-	paddr_t phys_start, phys_end;
 	extern int usebtlb;
 
 	/* Provided by the linker script */
@@ -973,41 +1005,9 @@
 
 	availphysmem = 0;
 
-	/* The first segment runs from [resvmem..ksrx). */
-	phys_start = resvmem;
-	phys_end = atop(ksrx);
-
-	DPRINTF(PDB_INIT, ("%s: phys segment 0x%05x 0x%05x\n", __func__,
-	    (u_int)phys_start, (u_int)phys_end));
-	if (phys_end > phys_start) {
-		uvm_page_physload(phys_start, phys_end,
-			phys_start, phys_end, VM_FREELIST_DEFAULT);
-		availphysmem += phys_end - phys_start;
-	}
-
-	/* The second segment runs from [kero..ksrw). */
-	phys_start = atop(kero);
-	phys_end = atop(ksrw);
-
-	DPRINTF(PDB_INIT, ("%s: phys segment 0x%05x 0x%05x\n", __func__,
-	    (u_int)phys_start, (u_int)phys_end));
-	if (phys_end > phys_start) {
-		uvm_page_physload(phys_start, phys_end,
-			phys_start, phys_end, VM_FREELIST_DEFAULT);
-		availphysmem += phys_end - phys_start;
-	}
-
-	/* The third segment runs from [kerw..physmem). */
-	phys_start = atop(kerw);
-	phys_end = physmem;
-
-	DPRINTF(PDB_INIT, ("%s: phys segment 0x%05x 0x%05x\n", __func__,
-	    (u_int)phys_start, (u_int)phys_end));
-	if (phys_end > phys_start) {
-		uvm_page_physload(phys_start, phys_end,
-			phys_start, phys_end, VM_FREELIST_DEFAULT);
-		availphysmem += phys_end - phys_start;
-	}
+	pmap_page_physload(resvmem, atop(ksro));	
+	pmap_page_physload(atop(kero), atop(ksrw));	
+	pmap_page_physload(atop(kerw), physmem);	
 
 	mutex_init(&pmaps_lock, MUTEX_DEFAULT, IPL_NONE);
 

Index: src/sys/arch/hppa/include/vmparam.h
diff -u src/sys/arch/hppa/include/vmparam.h:1.14 src/sys/arch/hppa/include/vmparam.h:1.15
--- src/sys/arch/hppa/include/vmparam.h:1.14	Thu Apr 30 07:01:27 2009
+++ src/sys/arch/hppa/include/vmparam.h	Tue Feb 16 16:56:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmparam.h,v 1.14 2009/04/30 07:01:27 skrll Exp $	*/
+/*	$NetBSD: vmparam.h,v 1.15 2010/02/16 16:56:30 skrll Exp $	*/
 
 /*	$OpenBSD: vmparam.h,v 1.33 2006/06/04 17:21:24 miod Exp $	*/
 
@@ -97,8 +97,9 @@
 
 #define	VM_PHYSSEG_NOADD	/* XXX until uvm code is fixed */
 
-#define	VM_NFREELIST		1
+#define	VM_NFREELIST		2
 #define	VM_FREELIST_DEFAULT	0
+#define	VM_FREELIST_ISADMA	1
 
 #if defined(_KERNEL) && !defined(_LOCORE)
 #define __HAVE_VM_PAGE_MD

Reply via email to