#ifndef _MACHINE_PTE_V6_H_
#define _MACHINE_PTE_V6_H_
#define DOMAIN_FAULT 0x00
#define DOMAIN_CLIENT 0x01
#define DOMAIN_RESERVED 0x02
#define DOMAIN_MANAGER 0x03
#define PRRR_SO 0
#define PRRR_DEV 1
#define PRRR_MEM 2
#define PRRR_DS0 (1 << 16)
#define PRRR_DS1 (1 << 17)
#define PRRR_NS0 (1 << 18)
#define PRRR_NS1 (1 << 19)
#define PRRR_NOS_SHIFT 24
#define NMRR_NC 0
#define NMRR_WB_WA 1
#define NMRR_WT 2
#define NMRR_WB 3
#define L1_TABLE_SIZE 0x4000
#define L1_ENTRIES 0x1000
#define L2_TABLE_SIZE 0x0400
#define L2_ENTRIES 0x0100
#define L1_SUP_SIZE 0x01000000
#define L1_SUP_OFFSET (L1_SUP_SIZE - 1)
#define L1_SUP_FRAME (~L1_SUP_OFFSET)
#define L1_SUP_SHIFT 24
#define L1_S_SIZE 0x00100000
#define L1_S_OFFSET (L1_S_SIZE - 1)
#define L1_S_FRAME (~L1_S_OFFSET)
#define L1_S_SHIFT 20
#define L2_L_SIZE 0x00010000
#define L2_L_OFFSET (L2_L_SIZE - 1)
#define L2_L_FRAME (~L2_L_OFFSET)
#define L2_L_SHIFT 16
#define L2_S_SIZE 0x00001000
#define L2_S_OFFSET (L2_S_SIZE - 1)
#define L2_S_FRAME (~L2_S_OFFSET)
#define L2_S_SHIFT 12
#define L1_TYPE_INV 0x00
#define L1_TYPE_C 0x01
#define L1_TYPE_S 0x02
#define L1_TYPE_MASK 0x03
#define L1_S_B 0x00000004
#define L1_S_C 0x00000008
#define L1_S_NX 0x00000010
#define L1_S_DOM(x) ((x) << 5)
#define L1_S_DOM_MASK L1_S_DOM(0xf)
#define L1_S_P 0x00000200
#define L1_S_AP(x) ((x) << 10)
#define L1_S_AP0 0x00000400
#define L1_S_AP1 0x00000800
#define L1_S_TEX(x) ((x) << 12)
#define L1_S_TEX0 0x00001000
#define L1_S_TEX1 0x00002000
#define L1_S_TEX2 0x00004000
#define L1_S_AP2 0x00008000
#define L1_S_SHARED 0x00010000
#define L1_S_NG 0x00020000
#define L1_S_SUPERSEC 0x00040000
#define L1_S_ADDR_MASK 0xfff00000
#define L1_C_DOM(x) ((x) << 5)
#define L1_C_DOM_MASK L1_C_DOM(0xf)
#define L1_C_P 0x00000200
#define L1_C_ADDR_MASK 0xfffffc00
#define L2_TYPE_INV 0x00
#define L2_TYPE_L 0x01
#define L2_TYPE_S 0x02
#define L2_TYPE_MASK 0x03
#define L2_NX 0x00000001
#define L2_B 0x00000004
#define L2_C 0x00000008
#define L2_CB_SHIFT 2
#define L2_AP(x) ((x) << 4)
#define L2_AP0 0x00000010
#define L2_AP1 0x00000020
#define L2_TEX_SHIFT 6
#define L2_TEX(x) ((x) << L2_TEX_SHIFT)
#define L2_TEX0 0x00000040
#define L2_TEX1 0x00000080
#define L2_TEX2 0x00000100
#define L2_AP2 0x00000200
#define L2_SHARED 0x00000400
#define L2_NG 0x00000800
#define TEX1_CLASS_0 ( 0)
#define TEX1_CLASS_1 ( L1_S_B)
#define TEX1_CLASS_2 ( L1_S_C )
#define TEX1_CLASS_3 ( L1_S_C | L1_S_B)
#define TEX1_CLASS_4 (L1_S_TEX0 )
#define TEX1_CLASS_5 (L1_S_TEX0 | L1_S_B)
#define TEX1_CLASS_6 (L1_S_TEX0 | L1_S_C )
#define TEX1_CLASS_7 (L1_S_TEX0 | L1_S_C | L1_S_B)
#define TEX2_CLASS_0 ( 0)
#define TEX2_CLASS_1 ( L2_B)
#define TEX2_CLASS_2 ( L2_C )
#define TEX2_CLASS_3 ( L2_C | L2_B)
#define TEX2_CLASS_4 (L2_TEX0 )
#define TEX2_CLASS_5 (L2_TEX0 | L2_B)
#define TEX2_CLASS_6 (L2_TEX0 | L2_C )
#define TEX2_CLASS_7 (L2_TEX0 | L2_C | L2_B)
#define NB_IN_PT1 L1_TABLE_SIZE
#define NPTE1_IN_PT1 L1_ENTRIES
#define NB_IN_PT2 L2_TABLE_SIZE
#define NPTE2_IN_PT2 L2_ENTRIES
#define PTE2_ATTR_WB_WA TEX2_CLASS_0
#define PTE2_ATTR_NOCACHE TEX2_CLASS_1
#define PTE2_ATTR_DEVICE TEX2_CLASS_2
#define PTE2_ATTR_SO TEX2_CLASS_3
#define PTE2_ATTR_WT TEX2_CLASS_4
#define PTE1_V L1_TYPE_S
#define PTE1_A L1_S_AP0
#define PTE1_NM L1_S_AP2
#define PTE1_M 0
#define PTE1_S L1_S_SHARED
#define PTE1_NG L1_S_NG
#define PTE1_G 0
#define PTE1_NX L1_S_NX
#define PTE1_X 0
#define PTE1_RO L1_S_TEX1
#define PTE1_RW 0
#define PTE1_U L1_S_AP1
#define PTE1_NU 0
#define PTE1_W L1_S_TEX2
#define PTE1_SHIFT L1_S_SHIFT
#define PTE1_SIZE L1_S_SIZE
#define PTE1_OFFSET L1_S_OFFSET
#define PTE1_FRAME L1_S_FRAME
#define PTE1_ATTR_MASK (L1_S_TEX0 | L1_S_C | L1_S_B)
#define PTE1_AP_KR (PTE1_RO | PTE1_NM)
#define PTE1_AP_KRW 0
#define PTE1_AP_KRUR (PTE1_RO | PTE1_NM | PTE1_U)
#define PTE1_AP_KRWURW PTE1_U
#define PTE1_PA(pa) ((pa) & PTE1_FRAME)
#define PTE1_AP_COMMON (PTE1_V | PTE1_S)
#define PTE1(pa, ap, attr) (PTE1_PA(pa) | (ap) | (attr) | PTE1_AP_COMMON)
#define PTE1_KERN(pa, ap, attr) PTE1(pa, (ap) | PTE1_A | PTE1_G, attr)
#define PTE1_KERN_NG(pa, ap, attr) PTE1(pa, (ap) | PTE1_A | PTE1_NG, attr)
#define PTE1_LINK(pa) (((pa) & L1_C_ADDR_MASK) | L1_TYPE_C)
#define PTE2_V L2_TYPE_S
#define PTE2_A L2_AP0
#define PTE2_NM L2_AP2
#define PTE2_M 0
#define PTE2_S L2_SHARED
#define PTE2_NG L2_NG
#define PTE2_G 0
#define PTE2_NX L2_NX
#define PTE2_X 0
#define PTE2_RO L2_TEX1
#define PTE2_U L2_AP1
#define PTE2_NU 0
#define PTE2_W L2_TEX2
#define PTE2_SHIFT L2_S_SHIFT
#define PTE2_SIZE L2_S_SIZE
#define PTE2_OFFSET L2_S_OFFSET
#define PTE2_FRAME L2_S_FRAME
#define PTE2_ATTR_MASK (L2_TEX0 | L2_C | L2_B)
#define PTE2_ATTR2IDX(attr) \
((((attr) & (L2_C | L2_B)) >> L2_CB_SHIFT) | \
(((attr) & L2_TEX0) >> (L2_TEX_SHIFT - L2_CB_SHIFT)))
#define PTE2_AP_KR (PTE2_RO | PTE2_NM)
#define PTE2_AP_KRW 0
#define PTE2_AP_KRUR (PTE2_RO | PTE2_NM | PTE2_U)
#define PTE2_AP_KRWURW PTE2_U
#define PTE2_PA(pa) ((pa) & PTE2_FRAME)
#define PTE2_AP_COMMON (PTE2_V | PTE2_S)
#define PTE2(pa, ap, attr) (PTE2_PA(pa) | (ap) | (attr) | PTE2_AP_COMMON)
#define PTE2_KERN(pa, ap, attr) PTE2(pa, (ap) | PTE2_A | PTE2_G, attr)
#define PTE2_KERN_NG(pa, ap, attr) PTE2(pa, (ap) | PTE2_A | PTE2_NG, attr)
#endif