]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/xe3p_xpc: Add support for compute walker for non-MSIx
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 17 Oct 2025 02:26:40 +0000 (19:26 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Sun, 19 Oct 2025 02:45:13 +0000 (19:45 -0700)
Current implementation of compute walker has dependency on GPU/SW Stack
which requires SW/UMD to wait for event from KMD to indicate
PIPE_CONTROL interrupt was done. This created latency on SW stack.

This feature adds support to generate completion interrupt from GPGPU
walker which does not support MSIx and avoid software using Pipe control
drain/idle latency.

The only thing needed for the kernel driver to do here is to wakeup the
thread waiting on the ufence, which is already handled by the irq
handler. Before waiting on this event, the userspace side can opt-in to
this interrupt being generated by the HW by selecting the flag in the
POST_SYNC_DATA_2 substructure's dw0[3] of COMPUTE_WALKER_2 instruction.

Bspec: 62346, 74334
Suggested-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: S A Muqthyar Ahmed <syed.abdul.muqthyar.ahmed@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20251016-xe3p-v3-21-3dd173a3097a@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/regs/xe_irq_regs.h
drivers/gpu/drm/xe/xe_irq.c

index 815d5e3d2209985bbfdf24b0d100623033f54edc..2f97662d958dec11d97315cec0a86372f77eaf06 100644 (file)
@@ -85,6 +85,7 @@
 #define   GSC_ER_COMPLETE                      REG_BIT(5)
 #define   GT_FLUSH_COMPLETE_INTERRUPT  REG_BIT(4)
 #define   GT_CS_MASTER_ERROR_INTERRUPT         REG_BIT(3)
+#define   GT_COMPUTE_WALKER_INTERRUPT          REG_BIT(2)
 #define   GT_MI_USER_INTERRUPT                 REG_BIT(0)
 
 /* irqs for OTHER_KCR_INSTANCE */
index 8f2c8d3ae5f8a1712d4312aee2849d0782c4fd85..e5ed0242f7b1d48c57d632a7cb5d2e67e7ce6d9f 100644 (file)
@@ -149,6 +149,12 @@ void xe_irq_enable_hwe(struct xe_gt *gt)
        if (xe_device_uc_enabled(xe)) {
                common_mask = GT_MI_USER_INTERRUPT |
                              GT_FLUSH_COMPLETE_INTERRUPT;
+
+               /* Enable Compute Walker Interrupt for non-MSIX platforms */
+               if (GRAPHICS_VERx100(xe) >= 3511 && !xe_device_has_msix(xe)) {
+                       rcs_mask |= GT_COMPUTE_WALKER_INTERRUPT;
+                       ccs_mask |= GT_COMPUTE_WALKER_INTERRUPT;
+               }
        } else {
                common_mask = GT_MI_USER_INTERRUPT |
                              GT_CS_MASTER_ERROR_INTERRUPT |