e1000 uses the new kernel dynamic VA mapping
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 14 Jun 2011 23:40:16 +0000 (16:40 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:04 +0000 (17:36 -0700)
Also, we no longer need mmio_alloc(), which was doing both the VA
reservation as well as mapping, and only working about the APICS (which
was the old mmio_base).

kern/arch/i686/e1000.c
kern/arch/i686/pmap.c
kern/arch/riscv/pmap.c
kern/arch/sparc/pmap.c
kern/include/pmap.h
kern/src/init.c
kern/src/mm.c

index 2a293f3..62802b4 100644 (file)
@@ -152,11 +152,14 @@ void e1000_handle_bar0(uint32_t addr) {
                // Restore the MMIO addr to the device (unchanged)
                outl(PCI_CONFIG_DATA, addr);
 
-               // Map the page in.
-               e1000_mmio_base_addr = (uint32_t)mmio_alloc(addr, e1000_addr_size);
-               if (e1000_mmio_base_addr == 0x00) {
-                       panic("Could not map in E1000 MMIO space\n");
-               }
+               /* Get a virt address chunk */
+               e1000_mmio_base_addr = get_vmap_segment(e1000_addr_size >> PGSHIFT);
+               if (!e1000_mmio_base_addr)
+                       panic("Could not aquire VM space for e1000 MMIO\n");
+               /* Map the pages in */
+               if (map_vmap_segment(e1000_mmio_base_addr, addr,
+                                    e1000_addr_size >> PGSHIFT, PTE_P | PTE_KERN_RW))
+                       panic("Unable to map e1000 MMIO\n");
        }
        return;
 }
index 4b8d19d..ed80700 100644 (file)
@@ -29,9 +29,6 @@ physaddr_t RO boot_cr3;               // Physical address of boot time page directory
 // Global variables
 page_t *RO pages = NULL;          // Virtual address of physical page array
 
-/* Base of unalloced MMIO space (TODO: have a facility for MMIO paddr alloc) */
-void *mmio_base = (void*)LAPIC_PBASE + PGSIZE;
-
 // Global descriptor table.
 //
 // The kernel and user segments are identical (except for the DPL).
@@ -779,67 +776,6 @@ page_check(void)
        cprintf("page_check() succeeded!\n");
 }
 
-// Allocate size bytes from the MMIO region of virtual memory,
-//  then map it in. Note: We allocate size bytes starting
-//  from a size alligned address. This may introduce holes,
-//  which we arent worrying about.
-void* mmio_alloc(physaddr_t pa, size_t size) {
-
-       printd("MMIO_ALLOC: Asking for %x bytes for pa %x\n", size, pa);
-
-       extern int booting;
-
-       // Ensure the PA is on a page bound
-       if (ROUNDUP(pa, PGSIZE) != pa) {
-               warn("MMIO_ALLOC: PA is not page aligned!\n");
-               return NULL;
-       }
-
-       if (booting == 0) {
-               warn("MMIO_ALLOC: Can only request MMIO space while booting.\n");
-               return NULL;
-       }
-
-       printd("MMIO_ALLOC: mmio_base was: %x\n", mmio_base);
-
-       void* curr_addr = mmio_base;
-       void* old_mmio_base = mmio_base;
-
-       printd("MMIO_ALLOC: Starting allocation at %x\n", curr_addr);
-
-       // Check if we are out of (32bit) virtual memory.
-       if ((mmio_base + size) < mmio_base) {
-               // Crap...
-               warn("MMIO_ALLOC: No more MMIO space\n");
-               return NULL;
-       }
-
-       for ( ; curr_addr < (mmio_base + size); pa = pa + PGSIZE, curr_addr = curr_addr + PGSIZE) {
-
-               printd("MMIO_ALLOC: Mapping PA %x @ VA %x\n", pa, curr_addr);
-
-               pte_t* pte = pgdir_walk(boot_pgdir, curr_addr, 1);
-               
-               // Check for a mapping error
-               if (!pte || (*pte != 0)) {
-                       // We couldnt map the page. Adjust the mmio_base to exlude the 
-                       //  ernoniously inserted pages, and fail.
-                       warn("MMIO_ALLOC: Bad pgdir walk. Some memory may be lost.\n");
-                       mmio_base = curr_addr;
-                       return NULL;
-               }               
-
-               *pte = PTE(pa >> PGSHIFT, PTE_P | PTE_KERN_RW);
-       }       
-
-       mmio_base = curr_addr;
-
-       printd("MMIO_ALLOC: New mmio_base: %x\n", mmio_base);
-       printd("MMIO_ALLOC: Returning VA %x\n", old_mmio_base);
-
-       return old_mmio_base;
-}
-
 /* 
 
     // testing code for boot_pgdir_walk 
index 8c85245..981b43d 100644 (file)
@@ -97,8 +97,3 @@ void
 page_check(void)
 {
 }
-
-void* mmio_alloc(physaddr_t pa, size_t size)
-{
-       return NULL;
-}
index 45910eb..bf7d22a 100644 (file)
@@ -125,9 +125,3 @@ void
 page_check(void)
 {
 }
-
-void* mmio_alloc(physaddr_t pa, size_t size) {
-
-       return NULL;
-
-}
index a593d14..5c5cb3c 100644 (file)
@@ -82,7 +82,6 @@ void tlb_flush_global(void);
 /* Arch specific implementations for these */
 pte_t *pgdir_walk(pde_t *COUNT(NPDENTRIES) pgdir, const void *SNT va, int create);
 int get_va_perms(pde_t *COUNT(NPDENTRIES) pgdir, const void *SNT va);
-void* mmio_alloc(physaddr_t pa, size_t size);
 
 static inline page_t *SAFE ppn2page(size_t ppn)
 {
index 3e3f133..1bc7943 100644 (file)
@@ -104,7 +104,7 @@ void kernel_init(multiboot_info_t *mboot_info)
 #ifdef __CONFIG_ETH_AUDIO__
        eth_audio_init();
 #endif /* __CONFIG_ETH_AUDIO__ */
-               
+
        // zra: let's Ivy know we're done booting
        booting = 0;
 
index fede248..0052db5 100644 (file)
@@ -697,6 +697,9 @@ int map_vmap_segment(uintptr_t vaddr, uintptr_t paddr, unsigned long num_pages,
                        spin_unlock(&dyn_vmap_lock);
                        return -ENOMEM;
                }
+               /* You probably should have unmapped first */
+               if (*pte)
+                       warn("Existing PTE value %08p\n", *pte);
                *pte = PTE(pa2ppn(paddr + i * PGSIZE), perm);
        }
        spin_unlock(&dyn_vmap_lock);