#include <linux/const.h>
 
 #ifndef __ASSEMBLY__
-#include <asm-generic/4level-fixup.h>
+#include <asm-generic/pgtable-nopud.h>
 
 #include <linux/spinlock.h>
 #include <linux/mm_types.h>
        return pfn_to_page((pmd_val(pmd) & SRMMU_PTD_PMASK) >> (PAGE_SHIFT-4));
 }
 
-static inline unsigned long pgd_page_vaddr(pgd_t pgd)
+static inline unsigned long pud_page_vaddr(pud_t pud)
 {
-       if (srmmu_device_memory(pgd_val(pgd))) {
+       if (srmmu_device_memory(pud_val(pud))) {
                return ~0;
        } else {
-               unsigned long v = pgd_val(pgd) & SRMMU_PTD_PMASK;
+               unsigned long v = pud_val(pud) & SRMMU_PTD_PMASK;
                return (unsigned long)__nocache_va(v << 4);
        }
 }
                set_pte((pte_t *)&pmdp->pmdv[i], __pte(0));
 }
 
-static inline int pgd_none(pgd_t pgd)          
+static inline int pud_none(pud_t pud)
 {
-       return !(pgd_val(pgd) & 0xFFFFFFF);
+       return !(pud_val(pud) & 0xFFFFFFF);
 }
 
-static inline int pgd_bad(pgd_t pgd)
+static inline int pud_bad(pud_t pud)
 {
-       return (pgd_val(pgd) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
+       return (pud_val(pud) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
 }
 
-static inline int pgd_present(pgd_t pgd)
+static inline int pud_present(pud_t pud)
 {
-       return ((pgd_val(pgd) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
+       return ((pud_val(pud) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
 }
 
-static inline void pgd_clear(pgd_t *pgdp)
+static inline void pud_clear(pud_t *pudp)
 {
-       set_pte((pte_t *)pgdp, __pte(0));
+       set_pte((pte_t *)pudp, __pte(0));
 }
 
 /*
 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
 
 /* Find an entry in the second-level page table.. */
-static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address)
+static inline pmd_t *pmd_offset(pud_t * dir, unsigned long address)
 {
-       return (pmd_t *) pgd_page_vaddr(*dir) +
+       return (pmd_t *) pud_page_vaddr(*dir) +
                ((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
 }
 
 
        void *srmmu_nocache_bitmap;
        unsigned int bitmap_bits;
        pgd_t *pgd;
+       p4d_t *p4d;
+       pud_t *pud;
        pmd_t *pmd;
        pte_t *pte;
        unsigned long paddr, vaddr;
 
        while (vaddr < srmmu_nocache_end) {
                pgd = pgd_offset_k(vaddr);
+               p4d = p4d_offset(__nocache_fix(pgd), vaddr);
+               pud = pud_offset(__nocache_fix(p4d), vaddr);
                pmd = pmd_offset(__nocache_fix(pgd), vaddr);
                pte = pte_offset_kernel(__nocache_fix(pmd), vaddr);
 
                                   unsigned long virt_addr, int bus_type)
 {
        pgd_t *pgdp;
+       p4d_t *p4dp;
+       pud_t *pudp;
        pmd_t *pmdp;
        pte_t *ptep;
        unsigned long tmp;
 
        physaddr &= PAGE_MASK;
        pgdp = pgd_offset_k(virt_addr);
-       pmdp = pmd_offset(pgdp, virt_addr);
+       p4dp = p4d_offset(pgdp, virt_addr);
+       pudp = pud_offset(p4dp, virt_addr);
+       pmdp = pmd_offset(pudp, virt_addr);
        ptep = pte_offset_kernel(pmdp, virt_addr);
        tmp = (physaddr >> 4) | SRMMU_ET_PTE;
 
 static inline void srmmu_unmapioaddr(unsigned long virt_addr)
 {
        pgd_t *pgdp;
+       p4d_t *p4dp;
+       pud_t *pudp;
        pmd_t *pmdp;
        pte_t *ptep;
 
+
        pgdp = pgd_offset_k(virt_addr);
-       pmdp = pmd_offset(pgdp, virt_addr);
+       p4dp = p4d_offset(pgdp, virt_addr);
+       pudp = pud_offset(p4dp, virt_addr);
+       pmdp = pmd_offset(pudp, virt_addr);
        ptep = pte_offset_kernel(pmdp, virt_addr);
 
        /* No need to flush uncacheable page. */
                                                        unsigned long end)
 {
        pgd_t *pgdp;
+       p4d_t *p4dp;
+       pud_t *pudp;
        pmd_t *pmdp;
        pte_t *ptep;
 
        while (start < end) {
                pgdp = pgd_offset_k(start);
-               if (pgd_none(*(pgd_t *)__nocache_fix(pgdp))) {
+               p4dp = p4d_offset(pgdp, start);
+               pudp = pud_offset(p4dp, start);
+               if (pud_none(*(pud_t *)__nocache_fix(pudp))) {
                        pmdp = __srmmu_get_nocache(
                            SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
                        if (pmdp == NULL)
                                early_pgtable_allocfail("pmd");
                        memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
-                       pgd_set(__nocache_fix(pgdp), pmdp);
+                       pud_set(__nocache_fix(pudp), pmdp);
                }
-               pmdp = pmd_offset(__nocache_fix(pgdp), start);
+               pmdp = pmd_offset(__nocache_fix(pudp), start);
                if (srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
                        ptep = __srmmu_get_nocache(PTE_SIZE, PTE_SIZE);
                        if (ptep == NULL)
                                                  unsigned long end)
 {
        pgd_t *pgdp;
+       p4d_t *p4dp;
+       pud_t *pudp;
        pmd_t *pmdp;
        pte_t *ptep;
 
        while (start < end) {
                pgdp = pgd_offset_k(start);
-               if (pgd_none(*pgdp)) {
+               p4dp = p4d_offset(pgdp, start);
+               pudp = pud_offset(p4dp, start);
+               if (pud_none(*pudp)) {
                        pmdp = __srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
                        if (pmdp == NULL)
                                early_pgtable_allocfail("pmd");
                        memset(pmdp, 0, SRMMU_PMD_TABLE_SIZE);
-                       pgd_set(pgdp, pmdp);
+                       pud_set((pud_t *)pgdp, pmdp);
                }
-               pmdp = pmd_offset(pgdp, start);
+               pmdp = pmd_offset(pudp, start);
                if (srmmu_pmd_none(*pmdp)) {
                        ptep = __srmmu_get_nocache(PTE_SIZE,
                                                             PTE_SIZE);
        unsigned long probed;
        unsigned long addr;
        pgd_t *pgdp;
+       p4d_t *p4dp;
+       pud_t *pudp;
        pmd_t *pmdp;
        pte_t *ptep;
        int what; /* 0 = normal-pte, 1 = pmd-level pte, 2 = pgd-level pte */
                }
 
                pgdp = pgd_offset_k(start);
+               p4dp = p4d_offset(pgdp, start);
+               pudp = pud_offset(p4dp, start);
                if (what == 2) {
                        *(pgd_t *)__nocache_fix(pgdp) = __pgd(probed);
                        start += SRMMU_PGDIR_SIZE;
                        continue;
                }
-               if (pgd_none(*(pgd_t *)__nocache_fix(pgdp))) {
+               if (pud_none(*(pud_t *)__nocache_fix(pudp))) {
                        pmdp = __srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE,
                                                   SRMMU_PMD_TABLE_SIZE);
                        if (pmdp == NULL)
                                early_pgtable_allocfail("pmd");
                        memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
-                       pgd_set(__nocache_fix(pgdp), pmdp);
+                       pud_set(__nocache_fix(pudp), pmdp);
                }
                pmdp = pmd_offset(__nocache_fix(pgdp), start);
                if (srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
        phandle cpunode;
        char node_str[128];
        pgd_t *pgd;
+       p4d_t *p4d;
+       pud_t *pud;
        pmd_t *pmd;
        pte_t *pte;
        unsigned long pages_avail;
        srmmu_allocate_ptable_skeleton(PKMAP_BASE, PKMAP_END);
 
        pgd = pgd_offset_k(PKMAP_BASE);
-       pmd = pmd_offset(pgd, PKMAP_BASE);
+       p4d = p4d_offset(pgd, PKMAP_BASE);
+       pud = pud_offset(p4d, PKMAP_BASE);
+       pmd = pmd_offset(pud, PKMAP_BASE);
        pte = pte_offset_kernel(pmd, PKMAP_BASE);
        pkmap_page_table = pte;