[PATCH v3 4/8] drm/xe/migrate: ignore CCS for kernel objects

K V P, Satyanarayana satyanarayana.k.v.p at intel.com
Wed Mar 26 06:09:14 UTC 2025


Hi.
> From: Auld, Matthew <matthew.auld at intel.com>
> Sent: Friday, March 7, 2025 11:59 PM
> To: intel-xe at lists.freedesktop.org
> Cc: K V P, Satyanarayana <satyanarayana.k.v.p at intel.com>; Thomas Hellström
> <thomas.hellstrom at linux.intel.com>; Brost, Matthew
> <matthew.brost at intel.com>
> Subject: [PATCH v3 4/8] drm/xe/migrate: ignore CCS for kernel objects
> 
> For kernel BOs we don't clear the CCS state on creation, therefore we
> should be careful to ignore it when copying pages. In a future patch we
> opt for using the copy path here for kernel BOs, so this now needs to be
> considered.
> 
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> Cc: Satyanarayana K V P <satyanarayana.k.v.p at intel.com>
> Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> Cc: Matthew Brost <matthew.brost at intel.com>
> ---
>  drivers/gpu/drm/xe/xe_migrate.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c
> b/drivers/gpu/drm/xe/xe_migrate.c
> index df4282c71bf0..dbd4bff75783 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -779,10 +779,12 @@ struct dma_fence *xe_migrate_copy(struct
> xe_migrate *m,
>  	bool dst_is_pltt = dst->mem_type == XE_PL_TT;
>  	bool src_is_vram = mem_type_is_vram(src->mem_type);
>  	bool dst_is_vram = mem_type_is_vram(dst->mem_type);
> +	bool type_device = src_bo->ttm.type == ttm_bo_type_device;
> +	bool needs_ccs_emit = type_device &&
> xe_migrate_needs_ccs_emit(xe);
>  	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 = xe_device_has_flat_ccs(xe) &&
> +	bool use_comp_pat = type_device && xe_device_has_flat_ccs(xe) &&
>  		GRAPHICS_VER(xe) >= 20 && src_is_vram && !dst_is_vram;
> 
>  	/* Copying CCS between two different BOs is not supported yet. */
> @@ -792,6 +794,12 @@ struct dma_fence *xe_migrate_copy(struct
> xe_migrate *m,
>  	if (src_bo != dst_bo && XE_WARN_ON(src_bo->size != dst_bo->size))
>  		return ERR_PTR(-EINVAL);
> 
> +	if (src_bo != dst_bo && XE_WARN_ON(src_bo->ttm.type != dst_bo-
> >ttm.type))
> +		return ERR_PTR(-EINVAL);
> +
> +	if (XE_WARN_ON(type_device && copy_only_ccs))
> +		return ERR_PTR(-EINVAL);
> +
>  	if (!src_is_vram)
>  		xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
>  	else
> @@ -839,6 +847,7 @@ struct dma_fence *xe_migrate_copy(struct
> xe_migrate *m,
>  					      avail_pts, avail_pts);
> 
>  		if (copy_system_ccs) {
> +			xe_assert(xe, type_device);
>  			ccs_size = xe_device_ccs_bytes(xe, src_L0);
>  			batch_size += pte_update_size(m, 0, NULL, &ccs_it,
> &ccs_size,
>  						      &ccs_ofs, &ccs_pt, 0,
> @@ -849,7 +858,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_migrate_needs_ccs_emit(xe) ?
> EMIT_COPY_CCS_DW : 0));
> +			((needs_ccs_emit ? EMIT_COPY_CCS_DW : 0));
> 
>  		bb = xe_bb_new(gt, batch_size, usm);
>  		if (IS_ERR(bb)) {
> @@ -878,7 +887,7 @@ 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);
> 
> -		if (xe_migrate_needs_ccs_emit(xe))
> +		if (needs_ccs_emit)
>  			flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
>  							  IS_DGFX(xe) ?
> src_is_vram : src_is_pltt,
>  							  dst_L0_ofs,
> --
LGTM.
Reviewed-by: Satyanarayana K V P <satyanarayana.k.v.p at intel.com>
> 2.48.1



More information about the Intel-xe mailing list