[OpenBIOS] [commit] r1005 - in trunk/openbios-devel: arch/sparc32 drivers include/libopenbios

repository service svn at openbios.org
Sun Jan 2 01:06:48 CET 2011


Author: mcayland
Date: Sun Jan  2 01:06:47 2011
New Revision: 1005
URL: http://tracker.coreboot.org/trac/openbios/changeset/1005

Log:
Remove the existing map_page() function and instead install a transitional API using map_pages() which is almost identical to the OFMEM API.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
Tested-by: Blue Swirl <blauwirbel at gmail.com>
Reviewed-by: Blue Swirl <blauwirbel at gmail.com>

Modified:
   trunk/openbios-devel/arch/sparc32/lib.c
   trunk/openbios-devel/drivers/iommu.c
   trunk/openbios-devel/include/libopenbios/ofmem.h

Modified: trunk/openbios-devel/arch/sparc32/lib.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/lib.c	Sun Jan  2 01:06:40 2011	(r1004)
+++ trunk/openbios-devel/arch/sparc32/lib.c	Sun Jan  2 01:06:47 2011	(r1005)
@@ -190,49 +190,41 @@
     return pa2va(pa);
 }
 
-/*
- * Create a memory mapping from va to epa.
- */
-int
-map_page(unsigned long va, uint64_t epa, int type)
+void
+map_pages(phys_addr_t phys, unsigned long virt,
+		  unsigned long size, unsigned long mode)
 {
+    unsigned long npages, off;
     uint32_t pte;
     unsigned long pa;
 
-    pa = find_pte(va, 1);
+    DPRINTF("map_pages: va 0x%lx, pa 0x%llx, size 0x%lx\n", virt, phys, size);
 
-    pte = SRMMU_ET_PTE | ((epa & PAGE_MASK) >> 4);
-    if (type) {         /* I/O */
-        pte |= SRMMU_REF;
-        /* SRMMU cannot make Supervisor-only, but not exectutable */
-        pte |= SRMMU_PRIV;
-    } else {            /* memory */
-        pte |= SRMMU_REF | SRMMU_CACHE;
-        pte |= SRMMU_PRIV; /* Supervisor only access */
-    }
-    *(uint32_t *)pa = pte;
-    DPRINTF("map_page: va 0x%lx pa 0x%llx pte 0x%x\n", va, epa, pte);
+    off = phys & (PAGE_SIZE - 1);
+    npages = (off + (size - 1) + (PAGE_SIZE - 1)) / PAGE_SIZE;
+    phys &= ~(uint64_t)(PAGE_SIZE - 1);
 
-    return 0;
-}
+    while (npages-- != 0) {
+        pa = find_pte(virt, 1);
 
-static void map_pages(unsigned long va, uint64_t pa, int type,
-                      unsigned long size)
-{
-    unsigned long npages, off;
+        pte = SRMMU_ET_PTE | ((phys & PAGE_MASK) >> 4);
 
-    DPRINTF("map_pages: va 0x%lx, pa 0x%llx, size 0x%lx\n", va, pa, size);
+	if (mode) {         /* I/O */
+            pte |= SRMMU_REF;
+            /* SRMMU cannot make Supervisor-only, but not exectutable */
+            pte |= SRMMU_PRIV;
+        } else {            /* memory */
+            pte |= SRMMU_REF | SRMMU_CACHE;
+            pte |= SRMMU_PRIV; /* Supervisor only access */
+        }
 
-    off = pa & (PAGE_SIZE - 1);
-    npages = (off + (size - 1) + (PAGE_SIZE - 1)) / PAGE_SIZE;
-    pa &= ~(uint64_t)(PAGE_SIZE - 1);
+        *(uint32_t *)pa = pte;
 
-    while (npages-- != 0) {
-        map_page(va, pa, type);
-        va += PAGE_SIZE;
-        pa += PAGE_SIZE;
+        virt += PAGE_SIZE;
+        phys += PAGE_SIZE;
     }
 }
+
 /*
  * Create an I/O mapping to pa[size].
  * Returns va of the mapping or 0 if unsuccessful.
@@ -252,7 +244,7 @@
     if (va == 0)
         return NULL;
 
-    map_pages(va, pa, 1, npages * PAGE_SIZE);
+    map_pages(pa, va, npages * PAGE_SIZE, 1);
     return (void *)(va + off);
 }
 
@@ -312,7 +304,7 @@
     pa <<= 32;
     pa |= POP() & 0xffffffff;
 
-    map_pages(va, pa, 0, size);
+    map_pages(pa, va, size, 0);
     DPRINTF("map-page: va 0x%lx pa 0x%llx size 0x%x\n", va, pa, size);
 }
 
@@ -370,7 +362,7 @@
 {
     uint64_t mpa = ((uint64_t)which_io << 32) | (uint64_t)pa;
 
-    map_pages((unsigned long)va, mpa, 0, size);
+    map_pages(mpa, (unsigned long)va, size, 0);
     return va;
 }
 
@@ -410,7 +402,7 @@
         DPRINTF("obp_dumb_memalloc req null -> 0x%p\n", va);
     }
 
-    map_pages((unsigned long)va, totavail[0].num_bytes, 0, size);
+    map_pages(totavail[0].num_bytes, (unsigned long)va, size, 0);
 
     update_memory_properties();
 
@@ -481,6 +473,7 @@
 {
     unsigned int addr, i;
     unsigned long pa, va;
+    int size;
 
     mem_init(&cmem, (char *) &_vmem, (char *)&_evmem);
     mem_init(&cio, (char *)&_end, (char *)&_iomem);
@@ -501,16 +494,12 @@
 
     // text, rodata, data, and bss mapped to end of RAM
     va = (unsigned long)&_start;
-    for (; va < (unsigned long)&_end; va += PAGE_SIZE) {
-        pa = va2pa(va);
-        map_page(va, pa, 0);
-    }
+    size = (unsigned long)&_end - (unsigned long)&_start;
+    pa = va2pa(va);
+    map_pages(pa, va, size, 0);
 
     // 1:1 mapping for RAM
-    pa = va = 0;
-    for (; va < LOWMEMSZ; va += PAGE_SIZE, pa += PAGE_SIZE) {
-        map_page(va, pa, 0);
-    }
+    map_pages(0, 0, LOWMEMSZ, 0);
 
     /*
      * Flush cache

Modified: trunk/openbios-devel/drivers/iommu.c
==============================================================================
--- trunk/openbios-devel/drivers/iommu.c	Sun Jan  2 01:06:40 2011	(r1004)
+++ trunk/openbios-devel/drivers/iommu.c	Sun Jan  2 01:06:47 2011	(r1005)
@@ -68,11 +68,7 @@
      */
     mva = (unsigned int) va;
     mpa = (unsigned int) pa;
-    for (i = 0; i < npages; i++) {
-        map_page(mva, mpa, 1);
-        mva += PAGE_SIZE;
-        mpa += PAGE_SIZE;
-    }
+    map_pages(mpa, mva, npages * PAGE_SIZE, 1);
 
     /*
      * Map into IOMMU page table.

Modified: trunk/openbios-devel/include/libopenbios/ofmem.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/ofmem.h	Sun Jan  2 01:06:40 2011	(r1004)
+++ trunk/openbios-devel/include/libopenbios/ofmem.h	Sun Jan  2 01:06:47 2011	(r1005)
@@ -129,7 +129,7 @@
 
 void mem_init(struct mem *t, char *begin, char *limit);
 void *mem_alloc(struct mem *t, int size, int align);
-int map_page(unsigned long va, uint64_t epa, int type);
+void map_pages(phys_addr_t phys, unsigned long virt, unsigned long size, unsigned long mode);
 void *map_io(uint64_t pa, int size);
 #endif
 



More information about the OpenBIOS mailing list