]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/mm/hash_utils_64.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6-omap-h63xx.git] / arch / powerpc / mm / hash_utils_64.c
index 4cc53f92377e7d65eef6c46c3bdf3f26a4d0c018..2b5a399f6fa644763866440916e73658d14e3ed9 100644 (file)
@@ -192,7 +192,8 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
        return ret < 0 ? ret : 0;
 }
 
-static void htab_remove_mapping(unsigned long vstart, unsigned long vend,
+#ifdef CONFIG_MEMORY_HOTPLUG
+static int htab_remove_mapping(unsigned long vstart, unsigned long vend,
                      int psize, int ssize)
 {
        unsigned long vaddr;
@@ -202,13 +203,17 @@ static void htab_remove_mapping(unsigned long vstart, unsigned long vend,
        step = 1 << shift;
 
        if (!ppc_md.hpte_removebolted) {
-               printk("Sub-arch doesn't implement hpte_removebolted\n");
-               return;
+               printk(KERN_WARNING "Platform doesn't implement "
+                               "hpte_removebolted\n");
+               return -EINVAL;
        }
 
        for (vaddr = vstart; vaddr < vend; vaddr += step)
                ppc_md.hpte_removebolted(vaddr, psize, ssize);
+
+       return 0;
 }
+#endif /* CONFIG_MEMORY_HOTPLUG */
 
 static int __init htab_dt_scan_seg_sizes(unsigned long node,
                                         const char *uname, int depth,
@@ -370,9 +375,14 @@ static void __init htab_init_page_sizes(void)
                mmu_vmalloc_psize = MMU_PAGE_64K;
                if (mmu_linear_psize == MMU_PAGE_4K)
                        mmu_linear_psize = MMU_PAGE_64K;
-               if (cpu_has_feature(CPU_FTR_CI_LARGE_PAGE))
-                       mmu_io_psize = MMU_PAGE_64K;
-               else
+               if (cpu_has_feature(CPU_FTR_CI_LARGE_PAGE)) {
+                       /*
+                        * Don't use 64k pages for ioremap on pSeries, since
+                        * that would stop us accessing the HEA ethernet.
+                        */
+                       if (!machine_is(pseries))
+                               mmu_io_psize = MMU_PAGE_64K;
+               } else
                        mmu_ci_restrictions = 1;
        }
 #endif /* CONFIG_PPC_64K_PAGES */
@@ -449,9 +459,10 @@ void create_section_mapping(unsigned long start, unsigned long end)
                        mmu_linear_psize, mmu_kernel_ssize));
 }
 
-void remove_section_mapping(unsigned long start, unsigned long end)
+int remove_section_mapping(unsigned long start, unsigned long end)
 {
-       htab_remove_mapping(start, end, mmu_linear_psize, mmu_kernel_ssize);
+       return htab_remove_mapping(start, end, mmu_linear_psize,
+                       mmu_kernel_ssize);
 }
 #endif /* CONFIG_MEMORY_HOTPLUG */
 
@@ -530,10 +541,10 @@ void __init htab_initialize(void)
        } else {
                /* Find storage for the HPT.  Must be contiguous in
                 * the absolute address space. On cell we want it to be
-                * in the first 1 Gig.
+                * in the first 2 Gig so we can use it for IOMMU hacks.
                 */
                if (machine_is(cell))
-                       limit = 0x40000000;
+                       limit = 0x80000000;
                else
                        limit = 0;