PERFORCE change 139911 for review

Oleksandr Tymoshenko gonzo at FreeBSD.org
Sat Apr 12 16:59:35 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=139911

Change 139911 by gonzo at gonzo_jeeves on 2008/04/12 16:58:46

	o Add proper implementation of pmap_mapdev for physical addresses
	    greater then 512M. Implementation and comment come from 
	    arm/arm/pmap.c

Affected files ...

.. //depot/projects/mips2-jnpr/src/sys/mips/mips/pmap.c#27 edit

Differences ...

==== //depot/projects/mips2-jnpr/src/sys/mips/mips/pmap.c#27 (text+ko) ====

@@ -2758,13 +2758,38 @@
  */
 
 /*
- * Note I don't know if any of this will work if pa is above
- * 512Meg.
+ * Map a set of physical memory pages into the kernel virtual
+ * address space. Return a pointer to where it is mapped. This
+ * routine is intended to be used for mapping device memory,
+ * NOT real memory.
  */
 void *
 pmap_mapdev(vm_offset_t pa, vm_size_t size)
 {
-	return ((void *)(MIPS_PHYS_TO_UNCACHED(pa)));
+        vm_offset_t va, tmpva, offset;
+
+	/* 
+	 * KSEG1 maps only first 512M of phys address space. For 
+	 * pa > 0x20000000 we should make proper mapping * using pmap_kenter.
+	 */
+	if (pa + size < MIPS_KSEG0_LARGEST_PHYS)
+		return (void *)MIPS_PHYS_TO_KSEG1(pa);
+	else {
+		offset = pa & PAGE_MASK;
+		size = roundup(size, PAGE_SIZE);
+        
+		va = kmem_alloc_nofault(kernel_map, size);
+		if (!va)
+			panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
+		for (tmpva = va; size > 0;) {
+			pmap_kenter(tmpva, pa);
+			size -= PAGE_SIZE;
+			tmpva += PAGE_SIZE;
+			pa += PAGE_SIZE;
+		}
+	}
+
+	return ((void *)(va + offset));
 }
 
 void


More information about the p4-projects mailing list