if (CONFIG_PGTABLE_LEVELS >= 3)
                pwsize |= ilog2(PTRS_PER_PMD) << MIPS_PWSIZE_MDW_SHIFT;
 
-       pwsize |= ilog2(sizeof(pte_t)/4) << MIPS_PWSIZE_PTEW_SHIFT;
+       /* Set pointer size to size of directory pointers */
+       if (config_enabled(CONFIG_64BIT))
+               pwsize |= MIPS_PWSIZE_PS_MASK;
+       /* PTEs may be multiple pointers long (e.g. with XPA) */
+       pwsize |= ((PTE_T_LOG2 - PGD_T_LOG2) << MIPS_PWSIZE_PTEW_SHIFT)
+                       & MIPS_PWSIZE_PTEW_MASK;
 
        write_c0_pwsize(pwsize);
 
        /* Make sure everything is set before we enable the HTW */
        back_to_back_c0_hazard();
 
-       /* Enable HTW and disable the rest of the pwctl fields */
+       /*
+        * Enable HTW (and only for XUSeg on 64-bit), and disable the rest of
+        * the pwctl fields.
+        */
        config = 1 << MIPS_PWCTL_PWEN_SHIFT;
+       if (config_enabled(CONFIG_64BIT))
+               config |= MIPS_PWCTL_XU_MASK;
        write_c0_pwctl(config);
        pr_info("Hardware Page Table Walker enabled\n");