From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2E55BCCF9F8 for ; Fri, 7 Nov 2025 18:11:07 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CAD0710EB62; Fri, 7 Nov 2025 18:11:06 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="Nd45tjMZ"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.14]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7F0C110EB65 for ; Fri, 7 Nov 2025 18:11:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1762539066; x=1794075066; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MUMUIw8gms1dg41qSyy4te92Uib9RLODyqqID+1oPCw=; b=Nd45tjMZS5GmQdJvi2YmbF7PjG1dj49A+G8j51tY6hXc06s1DSk3kd/Q YEP0iJcM4Q7S+ZhI0A2PVyRgWsX9WzxXjqGtDC+Vf7MsmCVB30ahXHCWZ JJ54G8O9f7V1A3Wz7+VhrVeSmjrjbwR6YHYhoUsxzSxOMouxNAjmRStzl uHOvvKqjxvKT9Iek9ow87+79mw2vkuhj7VFkcGX5lvLc3GUZpmG2gzaqa Uq08LvGpLQGWK8Rmjdee3qXiQnB8hlDsj08ARSqyg3ZjQDdyfYzkJRPwF RK/oAM7sTM9/fhTtneB5OEBkUQzkH990GRCLauB+0CO2NLH1gsGa9iBw0 A==; X-CSE-ConnectionGUID: LgaKMkcsQ1SdRM/YW7TXMQ== X-CSE-MsgGUID: qcKt1Oj6SSW8Cg8Lh5suhQ== X-IronPort-AV: E=McAfee;i="6800,10657,11606"; a="68531490" X-IronPort-AV: E=Sophos;i="6.19,287,1754982000"; d="scan'208";a="68531490" Received: from orviesa010.jf.intel.com ([10.64.159.150]) by orvoesa106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Nov 2025 10:11:05 -0800 X-CSE-ConnectionGUID: xBFfW7zcR3OgF8Be1k386Q== X-CSE-MsgGUID: Aq0XJfxTQLaQcnQx1EUt+w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.19,287,1754982000"; d="scan'208";a="187398537" Received: from lucas-s2600cw.jf.intel.com ([10.54.55.69]) by orviesa010-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Nov 2025 10:11:04 -0800 From: Lucas De Marchi To: intel-xe@lists.freedesktop.org Cc: Lucas De Marchi , Matthew Brost , Gwan-gyeong Mun , Francois Dugast , Priyanka Dandamudi , Matt Roper Subject: [PATCH 2/2] drm/xe/xe3p: Add support for prefetch page fault Date: Fri, 7 Nov 2025 10:10:25 -0800 Message-ID: <20251107-pagefault-prefetch-v1-2-93291d619126@intel.com> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251107-pagefault-prefetch-v1-0-93291d619126@intel.com> References: <20251107-pagefault-prefetch-v1-0-93291d619126@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-50d74 Content-Transfer-Encoding: 8bit X-BeenThere: intel-xe@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel Xe graphics driver List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-xe-bounces@lists.freedesktop.org Sender: "Intel-xe" Xe3p prefetches memory ranges and it notifies software via an additional bit in the page fault descriptor that the fault was caused by prefetch. The prefetch bit should only be in the reply if the page fault handling was not successful, which allows the HW to avoid generating a CAT error for prefetch faults. Based on original patches by Brian Welty and Priyanka Dandamudi . Bspec: 59311 Cc: Matthew Brost Cc: Priyanka Dandamudi Cc: Matt Roper Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/xe/xe_gt_stats.c | 1 + drivers/gpu/drm/xe/xe_gt_stats_types.h | 1 + drivers/gpu/drm/xe/xe_guc_fwif.h | 5 +++-- drivers/gpu/drm/xe/xe_guc_pagefault.c | 2 ++ drivers/gpu/drm/xe/xe_pagefault.c | 13 +++++++++++-- drivers/gpu/drm/xe/xe_pagefault_types.h | 7 ++++++- 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_gt_stats.c b/drivers/gpu/drm/xe/xe_gt_stats.c index 5f74706bab814..af7b859861730 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats.c +++ b/drivers/gpu/drm/xe/xe_gt_stats.c @@ -35,6 +35,7 @@ static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = { DEF_STAT_STR(SVM_TLB_INVAL_US, "svm_tlb_inval_us"), DEF_STAT_STR(VMA_PAGEFAULT_COUNT, "vma_pagefault_count"), DEF_STAT_STR(VMA_PAGEFAULT_KB, "vma_pagefault_kb"), + DEF_STAT_STR(PREFETCH_PAGEFAULT_COUNT, "prefetch_pagefault_count"), DEF_STAT_STR(SVM_4K_PAGEFAULT_COUNT, "svm_4K_pagefault_count"), DEF_STAT_STR(SVM_64K_PAGEFAULT_COUNT, "svm_64K_pagefault_count"), DEF_STAT_STR(SVM_2M_PAGEFAULT_COUNT, "svm_2M_pagefault_count"), diff --git a/drivers/gpu/drm/xe/xe_gt_stats_types.h b/drivers/gpu/drm/xe/xe_gt_stats_types.h index d8348a8de2e1b..23d72c95a2b5f 100644 --- a/drivers/gpu/drm/xe/xe_gt_stats_types.h +++ b/drivers/gpu/drm/xe/xe_gt_stats_types.h @@ -13,6 +13,7 @@ enum xe_gt_stats_id { XE_GT_STATS_ID_SVM_TLB_INVAL_US, XE_GT_STATS_ID_VMA_PAGEFAULT_COUNT, XE_GT_STATS_ID_VMA_PAGEFAULT_KB, + XE_GT_STATS_ID_PREFETCH_PAGEFAULT_COUNT, XE_GT_STATS_ID_SVM_4K_PAGEFAULT_COUNT, XE_GT_STATS_ID_SVM_64K_PAGEFAULT_COUNT, XE_GT_STATS_ID_SVM_2M_PAGEFAULT_COUNT, diff --git a/drivers/gpu/drm/xe/xe_guc_fwif.h b/drivers/gpu/drm/xe/xe_guc_fwif.h index c90dd266e9cf9..1d6f9ebb376df 100644 --- a/drivers/gpu/drm/xe/xe_guc_fwif.h +++ b/drivers/gpu/drm/xe/xe_guc_fwif.h @@ -309,7 +309,8 @@ struct xe_guc_pagefault_desc { #define PFD_ACCESS_TYPE GENMASK(1, 0) #define PFD_FAULT_TYPE GENMASK(3, 2) #define PFD_VFID GENMASK(9, 4) -#define PFD_RSVD_1 GENMASK(11, 10) +#define PFD_RSVD_1 BIT(10) +#define XE3P_PFD_PREFETCH BIT(11) #define PFD_VIRTUAL_ADDR_LO GENMASK(31, 12) #define PFD_VIRTUAL_ADDR_LO_SHIFT 12 @@ -329,7 +330,7 @@ struct xe_guc_pagefault_reply { u32 dw1; #define PFR_VFID GENMASK(5, 0) -#define PFR_RSVD_1 BIT(6) +#define XE3P_PFR_PREFETCH BIT(6) #define PFR_ENG_INSTANCE GENMASK(12, 7) #define PFR_ENG_CLASS GENMASK(15, 13) #define PFR_PDATA GENMASK(31, 16) diff --git a/drivers/gpu/drm/xe/xe_guc_pagefault.c b/drivers/gpu/drm/xe/xe_guc_pagefault.c index 719a18187a31d..b6c12e5630672 100644 --- a/drivers/gpu/drm/xe/xe_guc_pagefault.c +++ b/drivers/gpu/drm/xe/xe_guc_pagefault.c @@ -27,6 +27,7 @@ static void guc_ack_fault(struct xe_pagefault *pf, int err) FIELD_PREP(PFR_ASID, pf->consumer.asid), FIELD_PREP(PFR_VFID, vfid) | + FIELD_PREP(XE3P_PFR_PREFETCH, pf->consumer.prefetch) | FIELD_PREP(PFR_ENG_INSTANCE, engine_instance) | FIELD_PREP(PFR_ENG_CLASS, engine_class) | FIELD_PREP(PFR_PDATA, pdata), @@ -77,6 +78,7 @@ int xe_guc_pagefault_handler(struct xe_guc *guc, u32 *msg, u32 len) pf.consumer.asid = FIELD_GET(PFD_ASID, msg[1]); pf.consumer.access_type = FIELD_GET(PFD_ACCESS_TYPE, msg[2]); pf.consumer.fault_type = FIELD_GET(PFD_FAULT_TYPE, msg[2]); + pf.consumer.prefetch = FIELD_GET(XE3P_PFD_PREFETCH, msg[2]); if (FIELD_GET(XE2_PFD_TRVA_FAULT, msg[0])) pf.consumer.fault_level = XE_PAGEFAULT_LEVEL_NACK; else diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c index 68bcc25f27890..81e641a9b2274 100644 --- a/drivers/gpu/drm/xe/xe_pagefault.c +++ b/drivers/gpu/drm/xe/xe_pagefault.c @@ -222,8 +222,14 @@ static bool xe_pagefault_queue_pop(struct xe_pagefault_queue *pf_queue, return found_fault; } -static void xe_pagefault_print(struct xe_pagefault *pf, int err) +static void xe_pagefault_error_account(struct xe_pagefault *pf, int err) { + /* Don't spam log for prefetch accesses, just add to stats */ + if (pf->consumer.prefetch) { + xe_gt_stats_incr(pf->gt, XE_GT_STATS_ID_PREFETCH_PAGEFAULT_COUNT, 1); + return; + } + xe_gt_dbg(pf->gt, "\nFault response: Unsuccessful %pe\n" "\tASID: %d\n" "\tFaulted Address: 0x%08x%08x\n" @@ -262,7 +268,10 @@ static void xe_pagefault_queue_work(struct work_struct *w) err = xe_pagefault_service(&pf); if (err) - xe_pagefault_print(&pf, err); + xe_pagefault_error_account(&pf, err); + else + /* Prefetch faults should only be acked on error */ + pf.consumer.prefetch = 0; pf.producer.ops->ack_fault(&pf, err); diff --git a/drivers/gpu/drm/xe/xe_pagefault_types.h b/drivers/gpu/drm/xe/xe_pagefault_types.h index d3b516407d600..f42336602f974 100644 --- a/drivers/gpu/drm/xe/xe_pagefault_types.h +++ b/drivers/gpu/drm/xe/xe_pagefault_types.h @@ -84,8 +84,13 @@ struct xe_pagefault { u8 engine_class; /** @consumer.engine_instance: engine instance */ u8 engine_instance; + /** + * @consumer.prefetch: fault is caused by HW prefetch - should + * only be acked on failure + */ + u8 prefetch; /** consumer.reserved: reserved bits for future expansion */ - u8 reserved[7]; + u8 reserved[6]; } consumer; /** * @producer: State for the producer (i.e., HW/FW interface). Populated -- 2.51.2