]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/xe/bmg: improve cache flushing behaviour
authorMatthew Auld <matthew.auld@intel.com>
Mon, 7 Oct 2024 07:45:42 +0000 (08:45 +0100)
committerMatthew Auld <matthew.auld@intel.com>
Wed, 9 Oct 2024 08:01:42 +0000 (09:01 +0100)
The BSpec says that EN_L3_RW_CCS_CACHE_FLUSH must be toggled
on for manual global invalidation to take effect and actually flush
device cache, however this also turns on flushing for things like
pipecontrol, which occurs between submissions for compute/render. This
sounds like massive overkill for our needs, where we already have the
manual flushing on the display side with the global invalidation. Some
observations on BMG:

1. Disabling l2 caching for host writes and stubbing out the driver
   global invalidation but keeping EN_L3_RW_CCS_CACHE_FLUSH enabled, has
   no impact on wb-transient-vs-display IGT, which makes sense since the
   pipecontrol is now flushing the device cache after the render copy.
   Without EN_L3_RW_CCS_CACHE_FLUSH the test then fails, which is also
   expected since device cache is now dirty and display engine can't see
   the writes.

2. Disabling EN_L3_RW_CCS_CACHE_FLUSH, but keeping the driver global
   invalidation also has no impact on wb-transient-vs-display. This
   suggests that the global invalidation still works as expected and is
   flushing the device cache without EN_L3_RW_CCS_CACHE_FLUSH turned on.

With that drop EN_L3_RW_CCS_CACHE_FLUSH. This helps some workloads since
we no longer flush the device cache between submissions as part of
pipecontrol.

Edit: We now also have clarification from HW side that BSpec was indeed
wrong here.

v2:
  - Rebase and update commit message.

BSpec: 71718
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Vitasta Wattal <vitasta.wattal@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Nirmoy Das <nirmoy.das@intel.com>
Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241007074541.33937-2-matthew.auld@intel.com
drivers/gpu/drm/xe/regs/xe_gt_regs.h
drivers/gpu/drm/xe/xe_gt.c

index 55092089bff6001fb778177ddcd9c1ad204db386..f531eeeb89576d19f4a044737282ef71e4c387e4 100644 (file)
 
 #define XE2_GLOBAL_INVAL                       XE_REG(0xb404)
 
-#define SCRATCH1LPFC                           XE_REG(0xb474)
-#define   EN_L3_RW_CCS_CACHE_FLUSH             REG_BIT(0)
-
 #define XE2LPM_L3SQCREG2                       XE_REG_MCR(0xb604)
 
 #define XE2LPM_L3SQCREG3                       XE_REG_MCR(0xb608)
index 2d5e78311b76c02f6d89a0931d0538a3d63693c9..1c79660fb086120018908ae5af85161df7e4341d 100644 (file)
@@ -108,7 +108,6 @@ static void xe_gt_enable_host_l2_vram(struct xe_gt *gt)
                return;
 
        if (!xe_gt_is_media_type(gt)) {
-               xe_mmio_write32(&gt->mmio, SCRATCH1LPFC, EN_L3_RW_CCS_CACHE_FLUSH);
                reg = xe_gt_mcr_unicast_read_any(gt, XE2_GAMREQSTRM_CTRL);
                reg |= CG_DIS_CNTLBUS;
                xe_gt_mcr_multicast_write(gt, XE2_GAMREQSTRM_CTRL, reg);