Re: [PATCH] drm/xe: Flush LSC untyped L1 dataport cache after rcs/ccs batches

"Souza, Jose" <[email protected]>
Newsgroups org.freedesktop.lists.intel-xe,org.kernel.vger.stable
Message-ID <[email protected]>
On Fri, 2026-08-14 at 12:17 +0200, Thomas Hellström wrote:
> emit_render_cache_flush() sets PIPE_CONTROL0_HDC_PIPELINE_FLUSH to
> flush the L2/HDC data cache before fence signalling, but it never
> requests a flush of the LSC untyped L1 data cache via the 'Untyped
> Data-Port Cache Flush Enable' bit in PIPE_CONTROL DWord0[11].
> 
> Per the Bspec, in 3D pipeline mode HDC Pipeline Flush is documented
> to
> also flush/invalidate the untyped L1 cache, but only depending on how
> HDC_CHICKEN0[13:11] is programmed. Starting with MTL, this coupling
> between HDC Pipeline Flush and the untyped L1 cache flush no longer
> holds in practice, regardless of how HDC_CHICKEN0 is programmed, so
> relying on it is not safe on newer platforms such as BMG. Mesa's
> Vulkan
> driver (anv) has been assuming the kernel flushes both caches between
> submissions, and hit user-visible corruption in apps such as
> Llama.cpp
> because of this gap; it now works around it by flushing both caches
> again from userspace at the end of every command buffer.
> 
> Fix it in the kernel instead: explicitly set
> PIPE_CONTROL0_UNTYPED_DATAPORT_CACHE_FLUSH together with
> PIPE_CONTROL0_HDC_PIPELINE_FLUSH in emit_render_cache_flush(), so
> callers waiting on this flush (e.g. end of batch, before releasing
> memory for reuse) can rely on both the L2 and L1 data caches being
> clean, without depending on undocumented platform-specific
> HDC_CHICKEN0 behavior or requiring a userspace workaround.
> 
> Fixes: 9f8f93bee3ef ("drm/xe: Emit a render cache flush after each
> rcs/ccs batch")
> Reported-by: Lionel Landwerlin <[email protected]>
> Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/8909
> Cc: José Roberto de Souza <[email protected]>
> Cc: [email protected]
> Cc: <[email protected]> # v6.8+
> Assisted-by: GitHub_Copilot:claude-sonnet-5
> Signed-off-by: Thomas Hellström <[email protected]>
> ---
>  drivers/gpu/drm/xe/instructions/xe_gpu_commands.h | 1 +
>  drivers/gpu/drm/xe/xe_ring_ops.c                  | 3 ++-
>  2 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/instructions/xe_gpu_commands.h
> b/drivers/gpu/drm/xe/instructions/xe_gpu_commands.h
> index 18d0fde8c98f..faf8d7e2c5c1 100644
> --- a/drivers/gpu/drm/xe/instructions/xe_gpu_commands.h
> +++ b/drivers/gpu/drm/xe/instructions/xe_gpu_commands.h
> @@ -46,6 +46,7 @@
>  #define
> GFX_OP_PIPE_CONTROL(len)	((0x3<<29)|(0x3<<27)|(0x2<<24)|((len)-2))
>  
>  #define   PIPE_CONTROL0_QUEUE_DRAIN_MODE		BIT(12)
> +#define	 
> PIPE_CONTROL0_UNTYPED_DATAPORT_CACHE_FLUSH	BIT(11)	/* gen12 */
>  #define	 
> PIPE_CONTROL0_L3_READ_ONLY_CACHE_INVALIDATE	BIT(10)	/* gen12 */
>  #define	 
> PIPE_CONTROL0_HDC_PIPELINE_FLUSH		BIT(9)	/* gen12 */
>  
> diff --git a/drivers/gpu/drm/xe/xe_ring_ops.c
> b/drivers/gpu/drm/xe/xe_ring_ops.c
> index 39a670e91ba7..79511de558d9 100644
> --- a/drivers/gpu/drm/xe/xe_ring_ops.c
> +++ b/drivers/gpu/drm/xe/xe_ring_ops.c
> @@ -219,7 +219,8 @@ static int emit_render_cache_flush(struct
> xe_sched_job *job, u32 *dw, int i)
>  		i = emit_pipe_control(dw, i, 0,
> PIPE_CONTROL_DEPTH_CACHE_FLUSH,
>  				     
> LRC_PPHWSP_FLUSH_INVAL_SCRATCH_ADDR, 0);
>  
> -	flags0 = PIPE_CONTROL0_HDC_PIPELINE_FLUSH;
> +	flags0 = PIPE_CONTROL0_HDC_PIPELINE_FLUSH |
> +		PIPE_CONTROL0_UNTYPED_DATAPORT_CACHE_FLUSH;

My only concern is this programming note:

This bit is functional and must be only set for GPGPU workloads, i.e
when PIPELINE_SELECT command has set Pipeline Select mode set to GPGPU.

Spec is not 100% clear but looks like setting it in 3D mode would be
nop.

So if this don't cause any regression this is:


Reviewed-by: José Roberto de Souza <[email protected]>

>  	flags1 = (PIPE_CONTROL_TILE_CACHE_FLUSH |
>  		 PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH |
>  		 PIPE_CONTROL_DEPTH_CACHE_FLUSH |
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.