#define XELPG_PPGTT_PTE_PAT3           BIT_ULL(62)
 #define XE2_PPGTT_PTE_PAT4             BIT_ULL(61)
+#define XE_PPGTT_PDE_PDPE_PAT2         BIT_ULL(12)
 #define XE_PPGTT_PTE_PAT2              BIT_ULL(7)
 #define XE_PPGTT_PTE_PAT1              BIT_ULL(4)
 #define XE_PPGTT_PTE_PAT0              BIT_ULL(3)
 
        return pte;
 }
 
-static u64 pte_encode_pat_index(struct xe_device *xe, u16 pat_index)
+static u64 pte_encode_pat_index(struct xe_device *xe, u16 pat_index,
+                               u32 pt_level)
 {
        u64 pte = 0;
 
        if (pat_index & BIT(1))
                pte |= XE_PPGTT_PTE_PAT1;
 
-       if (pat_index & BIT(2))
-               pte |= XE_PPGTT_PTE_PAT2;
+       if (pat_index & BIT(2)) {
+               if (pt_level)
+                       pte |= XE_PPGTT_PDE_PDPE_PAT2;
+               else
+                       pte |= XE_PPGTT_PTE_PAT2;
+       }
 
        if (pat_index & BIT(3))
                pte |= XELPG_PPGTT_PTE_PAT3;
 
        pte = xe_bo_addr(bo, bo_offset, XE_PAGE_SIZE);
        pte |= XE_PAGE_PRESENT | XE_PAGE_RW;
-       pte |= pte_encode_pat_index(xe, pat_index);
+       pte |= pte_encode_pat_index(xe, pat_index, pt_level);
        pte |= pte_encode_ps(pt_level);
 
        if (xe_bo_is_vram(bo) || xe_bo_is_stolen_devmem(bo))
        if (likely(!xe_vma_read_only(vma)))
                pte |= XE_PAGE_RW;
 
-       pte |= pte_encode_pat_index(xe, pat_index);
+       pte |= pte_encode_pat_index(xe, pat_index, pt_level);
        pte |= pte_encode_ps(pt_level);
 
        if (unlikely(xe_vma_is_null(vma)))
 
        pte = addr;
        pte |= XE_PAGE_PRESENT | XE_PAGE_RW;
-       pte |= pte_encode_pat_index(xe, pat_index);
+       pte |= pte_encode_pat_index(xe, pat_index, pt_level);
        pte |= pte_encode_ps(pt_level);
 
        if (devmem)