]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/xe/xe_migrate: Handle migration logic for xe2+ dgfx
authorAkshata Jahagirdar <akshata.jahagirdar@intel.com>
Wed, 17 Jul 2024 21:10:06 +0000 (21:10 +0000)
committerMatt Roper <matthew.d.roper@intel.com>
Thu, 18 Jul 2024 00:02:31 +0000 (17:02 -0700)
During eviction (vram->sysmem), we use compressed -> uncompressed mapping.
During restore (sysmem->vram), we need to use mapping from
uncompressed -> uncompressed.
Handle logic for selecting the compressed identity map for eviction,
and selecting uncompressed map for restore operations.
v2: Move check of xe_migrate_ccs_emit() before calling
xe_migrate_ccs_copy(). (Nirmoy)

Signed-off-by: Akshata Jahagirdar <akshata.jahagirdar@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/79b3a016e686a662ae68c32b5fc7f0f2ac8043e9.1721250309.git.akshata.jahagirdar@intel.com
drivers/gpu/drm/xe/xe_migrate.c

index c1c751952ce8d84bf0ef3ac9421e4ff75c2efe08..c007f68503d49575041ded5da26b212720b38c63 100644 (file)
@@ -705,7 +705,7 @@ static u32 xe_migrate_ccs_copy(struct xe_migrate *m,
        struct xe_gt *gt = m->tile->primary_gt;
        u32 flush_flags = 0;
 
-       if (xe_device_has_flat_ccs(gt_to_xe(gt)) && !copy_ccs && dst_is_indirect) {
+       if (!copy_ccs && dst_is_indirect) {
                /*
                 * If the src is already in vram, then it should already
                 * have been cleared by us, or has been populated by the
@@ -781,6 +781,7 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
        bool copy_ccs = xe_device_has_flat_ccs(xe) &&
                xe_bo_needs_ccs_pages(src_bo) && xe_bo_needs_ccs_pages(dst_bo);
        bool copy_system_ccs = copy_ccs && (!src_is_vram || !dst_is_vram);
+       bool use_comp_pat = GRAPHICS_VER(xe) >= 20 && IS_DGFX(xe) && src_is_vram && !dst_is_vram;
 
        /* Copying CCS between two different BOs is not supported yet. */
        if (XE_WARN_ON(copy_ccs && src_bo != dst_bo))
@@ -807,7 +808,7 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
                u32 batch_size = 2; /* arb_clear() + MI_BATCH_BUFFER_END */
                struct xe_sched_job *job;
                struct xe_bb *bb;
-               u32 flush_flags;
+               u32 flush_flags = 0;
                u32 update_idx;
                u64 ccs_ofs, ccs_size;
                u32 ccs_pt;
@@ -825,6 +826,7 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
                src_L0 = min(src_L0, dst_L0);
 
                pte_flags = src_is_vram ? PTE_UPDATE_FLAG_IS_VRAM : 0;
+               pte_flags |= use_comp_pat ? PTE_UPDATE_FLAG_IS_COMP_PTE : 0;
                batch_size += pte_update_size(m, pte_flags, src, &src_it, &src_L0,
                                              &src_L0_ofs, &src_L0_pt, 0, 0,
                                              avail_pts);
@@ -845,7 +847,7 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
 
                /* Add copy commands size here */
                batch_size += ((copy_only_ccs) ? 0 : EMIT_COPY_DW) +
-                       ((xe_device_has_flat_ccs(xe) ? EMIT_COPY_CCS_DW : 0));
+                       ((xe_migrate_needs_ccs_emit(xe) ? EMIT_COPY_CCS_DW : 0));
 
                bb = xe_bb_new(gt, batch_size, usm);
                if (IS_ERR(bb)) {
@@ -874,11 +876,12 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
                if (!copy_only_ccs)
                        emit_copy(gt, bb, src_L0_ofs, dst_L0_ofs, src_L0, XE_PAGE_SIZE);
 
-               flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
-                                                 IS_DGFX(xe) ? src_is_vram : src_is_pltt,
-                                                 dst_L0_ofs,
-                                                 IS_DGFX(xe) ? dst_is_vram : dst_is_pltt,
-                                                 src_L0, ccs_ofs, copy_ccs);
+               if (xe_migrate_needs_ccs_emit(xe))
+                       flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
+                                                         IS_DGFX(xe) ? src_is_vram : src_is_pltt,
+                                                         dst_L0_ofs,
+                                                         IS_DGFX(xe) ? dst_is_vram : dst_is_pltt,
+                                                         src_L0, ccs_ofs, copy_ccs);
 
                job = xe_bb_create_migration_job(m->q, bb,
                                                 xe_migrate_batch_base(m, usm),