]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - arch/ppc/mm/pgtable.c
CONFIG_HIGHPTE vs. sub-page page tables.
[mirror_ubuntu-artful-kernel.git] / arch / ppc / mm / pgtable.c
index 35ebb6395ae3329d5117d4d0611d21e60d12a361..03a79bff1271fee749e842d56ca21df176e2674d 100644 (file)
@@ -42,10 +42,6 @@ int io_bat_index;
 #define HAVE_BATS      1
 #endif
 
-#if defined(CONFIG_FSL_BOOKE)
-#define HAVE_TLBCAM    1
-#endif
-
 extern char etext[], _stext[];
 
 #ifdef CONFIG_SMP
@@ -63,15 +59,6 @@ void setbat(int index, unsigned long virt, unsigned long phys,
 #define p_mapped_by_bats(x)    (0UL)
 #endif /* HAVE_BATS */
 
-#ifdef HAVE_TLBCAM
-extern unsigned int tlbcam_index;
-extern unsigned long v_mapped_by_tlbcam(unsigned long va);
-extern unsigned long p_mapped_by_tlbcam(unsigned long pa);
-#else /* !HAVE_TLBCAM */
-#define v_mapped_by_tlbcam(x)  (0UL)
-#define p_mapped_by_tlbcam(x)  (0UL)
-#endif /* HAVE_TLBCAM */
-
 #ifdef CONFIG_PTE_64BIT
 /* 44x uses an 8kB pgdir because it has 8-byte Linux PTEs. */
 #define PGDIR_ORDER    1
@@ -87,7 +74,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
        return ret;
 }
 
-void pgd_free(pgd_t *pgd)
+void pgd_free(struct mm_struct *mm, pgd_t *pgd)
 {
        free_pages((unsigned long)pgd, PGDIR_ORDER);
 }
@@ -108,7 +95,7 @@ __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long add
        return pte;
 }
 
-struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
+pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
 {
        struct page *ptepage;
 
@@ -119,12 +106,14 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
 #endif
 
        ptepage = alloc_pages(flags, 0);
-       if (ptepage)
+       if (ptepage) {
                clear_highpage(ptepage);
+               pgtable_page_ctor(ptepage);
+       }
        return ptepage;
 }
 
-void pte_free_kernel(pte_t *pte)
+void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
 {
 #ifdef CONFIG_SMP
        hash_page_sync();
@@ -132,11 +121,12 @@ void pte_free_kernel(pte_t *pte)
        free_page((unsigned long)pte);
 }
 
-void pte_free(struct page *ptepage)
+void pte_free(struct mm_struct *mm, pgtable_t ptepage)
 {
 #ifdef CONFIG_SMP
        hash_page_sync();
 #endif
+       pgtable_page_dtor(ptepage);
        __free_page(ptepage);
 }
 
@@ -213,9 +203,6 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
        if ((v = p_mapped_by_bats(p)) /*&& p_mapped_by_bats(p+size-1)*/ )
                goto out;
 
-       if ((v = p_mapped_by_tlbcam(p)))
-               goto out;
-
        if (mem_init_done) {
                struct vm_struct *area;
                area = get_vm_area(size, VM_IOREMAP);
@@ -341,18 +328,6 @@ void __init io_block_mapping(unsigned long virt, phys_addr_t phys,
        }
 #endif /* HAVE_BATS */
 
-#ifdef HAVE_TLBCAM
-       /*
-        * Use a CAM for this if possible...
-        */
-       if (tlbcam_index < num_tlbcam_entries && is_power_of_4(size)
-           && (virt & (size - 1)) == 0 && (phys & (size - 1)) == 0) {
-               settlbcam(tlbcam_index, virt, phys, size, flags, 0);
-               ++tlbcam_index;
-               return;
-       }
-#endif /* HAVE_TLBCAM */
-
        /* No BATs available, put it in the page tables. */
        for (i = 0; i < size; i += PAGE_SIZE)
                map_page(virt + i, phys + i, flags);
@@ -426,41 +401,3 @@ unsigned long iopa(unsigned long addr)
        return(pa);
 }
 
-/* This is will find the virtual address for a physical one....
- * Swiped from APUS, could be dangerous :-).
- * This is only a placeholder until I really find a way to make this
- * work.  -- Dan
- */
-unsigned long
-mm_ptov (unsigned long paddr)
-{
-       unsigned long ret;
-#if 0
-       if (paddr < 16*1024*1024)
-               ret = ZTWO_VADDR(paddr);
-       else {
-               int i;
-
-               for (i = 0; i < kmap_chunk_count;){
-                       unsigned long phys = kmap_chunks[i++];
-                       unsigned long size = kmap_chunks[i++];
-                       unsigned long virt = kmap_chunks[i++];
-                       if (paddr >= phys
-                           && paddr < (phys + size)){
-                               ret = virt + paddr - phys;
-                               goto exit;
-                       }
-               }
-       
-               ret = (unsigned long) __va(paddr);
-       }
-exit:
-#ifdef DEBUGPV
-       printk ("PTOV(%lx)=%lx\n", paddr, ret);
-#endif
-#else
-       ret = (unsigned long)paddr + KERNELBASE;
-#endif
-       return ret;
-}
-