#include <linux/const.h>
 #include <asm/types.h>
 
+#define _PAGE_SHIFT    12
+#define _PAGE_SIZE     (_AC(1, UL) << _PAGE_SHIFT)
+#define _PAGE_MASK     (~(_PAGE_SIZE - 1))
+
 /* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT      12
-#define PAGE_SIZE      (_AC(1,UL) << PAGE_SHIFT)
-#define PAGE_MASK       (~(PAGE_SIZE-1))
+#define PAGE_SHIFT     _PAGE_SHIFT
+#define PAGE_SIZE      _PAGE_SIZE
+#define PAGE_MASK      _PAGE_MASK
 #define PAGE_DEFAULT_ACC       0
 #define PAGE_DEFAULT_KEY       (PAGE_DEFAULT_ACC << 4)
 
 
 
 /* TODO: s390 cannot support io_remap_pfn_range... */
 
-#define PMD_SHIFT      20
-#define PUD_SHIFT      31
-#define P4D_SHIFT      42
-#define PGDIR_SHIFT    53
-
-#define PMD_SIZE        (1UL << PMD_SHIFT)
-#define PMD_MASK        (~(PMD_SIZE-1))
-#define PUD_SIZE       (1UL << PUD_SHIFT)
-#define PUD_MASK       (~(PUD_SIZE-1))
-#define P4D_SIZE       (1UL << P4D_SHIFT)
-#define P4D_MASK       (~(P4D_SIZE-1))
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-#define PTRS_PER_PTE   256
-#define PTRS_PER_PMD   2048
-#define PTRS_PER_PUD   2048
-#define PTRS_PER_P4D   2048
-#define PTRS_PER_PGD   2048
-
 #define FIRST_USER_ADDRESS  0UL
 
 #define pte_ERROR(e) \
 #define _SEGMENT_ENTRY_SOFT_DIRTY 0x0000 /* SW segment soft dirty bit */
 #endif
 
+#define _CRST_ENTRIES  2048    /* number of region/segment table entries */
+#define _PAGE_ENTRIES  256     /* number of page table entries */
+
+#define _CRST_TABLE_SIZE (_CRST_ENTRIES * 8)
+#define _PAGE_TABLE_SIZE (_PAGE_ENTRIES * 8)
+
+#define _REGION1_SHIFT 53
+#define _REGION2_SHIFT 42
+#define _REGION3_SHIFT 31
+#define _SEGMENT_SHIFT 20
+
+#define _REGION1_INDEX (0x7ffUL << _REGION1_SHIFT)
+#define _REGION2_INDEX (0x7ffUL << _REGION2_SHIFT)
+#define _REGION3_INDEX (0x7ffUL << _REGION3_SHIFT)
+#define _SEGMENT_INDEX (0x7ffUL << _SEGMENT_SHIFT)
+#define _PAGE_INDEX    (0xffUL  << _PAGE_SHIFT)
+
+#define _REGION1_SIZE  (1UL << _REGION1_SHIFT)
+#define _REGION2_SIZE  (1UL << _REGION2_SHIFT)
+#define _REGION3_SIZE  (1UL << _REGION3_SHIFT)
+#define _SEGMENT_SIZE  (1UL << _SEGMENT_SHIFT)
+
+#define _REGION1_MASK  (~(_REGION1_SIZE - 1))
+#define _REGION2_MASK  (~(_REGION2_SIZE - 1))
+#define _REGION3_MASK  (~(_REGION3_SIZE - 1))
+#define _SEGMENT_MASK  (~(_SEGMENT_SIZE - 1))
+
+#define PMD_SHIFT      _SEGMENT_SHIFT
+#define PUD_SHIFT      _REGION3_SHIFT
+#define P4D_SHIFT      _REGION2_SHIFT
+#define PGDIR_SHIFT    _REGION1_SHIFT
+
+#define PMD_SIZE       _SEGMENT_SIZE
+#define PUD_SIZE       _REGION3_SIZE
+#define P4D_SIZE       _REGION2_SIZE
+#define PGDIR_SIZE     _REGION1_SIZE
+
+#define PMD_MASK       _SEGMENT_MASK
+#define PUD_MASK       _REGION3_MASK
+#define P4D_MASK       _REGION2_MASK
+#define PGDIR_MASK     _REGION1_MASK
+
+#define PTRS_PER_PTE   _PAGE_ENTRIES
+#define PTRS_PER_PMD   _CRST_ENTRIES
+#define PTRS_PER_PUD   _CRST_ENTRIES
+#define PTRS_PER_P4D   _CRST_ENTRIES
+#define PTRS_PER_PGD   _CRST_ENTRIES
+
 /*
  * Segment table and region3 table entry encoding
  * (R = read-only, I = invalid, y = young bit):