config PPC_16K_PAGES
        bool "16k page size"
-       depends on 44x
+       depends on 44x || PPC_8xx
 
 config PPC_64K_PAGES
        bool "64k page size"
 
        struct slice_mask mask_8m;
 # endif
 #endif
+       void *pte_frag;
 } mm_context_t;
 
 #define PHYS_IMMR_BASE (mfspr(SPRN_IMMR) & 0xfff80000)
 #define mmu_virtual_psize      MMU_PAGE_4K
 #elif defined(CONFIG_PPC_16K_PAGES)
 #define mmu_virtual_psize      MMU_PAGE_16K
+#define PTE_FRAG_NR            4
+#define PTE_FRAG_SIZE_SHIFT    12
+#define PTE_FRAG_SIZE          (1UL << 12)
 #else
 #error "Unsupported PAGE_SIZE"
 #endif
 
        : "cc" );
 #else /* PTE_ATOMIC_UPDATES */
        unsigned long old = pte_val(*p);
-       *p = __pte((old & ~clr) | set);
+       unsigned long new = (old & ~clr) | set;
+
+#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
+       p->pte = p->pte1 = p->pte2 = p->pte3 = new;
+#else
+       *p = __pte(new);
+#endif
 #endif /* !PTE_ATOMIC_UPDATES */
 
 #ifdef CONFIG_44x
 
        /* Anything else just stores the PTE normally. That covers all 64-bit
         * cases, and 32-bit non-hash with 32-bit PTEs.
         */
+#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
+       ptep->pte = ptep->pte1 = ptep->pte2 = ptep->pte3 = pte_val(pte);
+#else
        *ptep = pte;
+#endif
 
        /*
         * With hardware tablewalk, a sync is needed to ensure that
 
 #define PTE_FLAGS_OFFSET       0
 #endif
 
-#ifdef CONFIG_PPC_256K_PAGES
+#if defined(CONFIG_PPC_256K_PAGES) || \
+    (defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES))
 #define PTE_SHIFT      (PAGE_SHIFT - PTE_T_LOG2 - 2)   /* 1/4 of a page */
 #else
 #define PTE_SHIFT      (PAGE_SHIFT - PTE_T_LOG2)       /* full page */
 
 #define _ASM_POWERPC_PGTABLE_TYPES_H
 
 /* PTE level */
+#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
+typedef struct { pte_basic_t pte, pte1, pte2, pte3; } pte_t;
+#else
 typedef struct { pte_basic_t pte; } pte_t;
+#endif
 #define __pte(x)       ((pte_t) { (x) })
 static inline pte_basic_t pte_val(pte_t x)
 {