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 16BADCEACDD for ; Tue, 1 Oct 2024 14:53:41 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D4E2010E643; Tue, 1 Oct 2024 14:53:40 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="no/CzWnH"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3694610E645 for ; Tue, 1 Oct 2024 14:53:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1727794419; x=1759330419; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UZcpXpFF3ced4lPaxcizJ06rtwGWF8bizoG73T6aVv8=; b=no/CzWnH7xWSzL2hymcxOQWqLBXz9S+F+y8pLmyO5mfAhxkw4NOCaGg1 FSANRXULkxuBkTefWRuayELxlndyzMph/GQGpJ16VjTNzpiY3rXU26sm8 ie6hAO+EDO0SV9gKoDy+OznMZ1jVbwsNyoZeuCD8kNLb3FMDlJnaQ2CIi xHCoKdC9zvKiaJPjaePg1Xdqpqb+1UQ9vt5kNrIvwsg5Le6AI296nUf15 ll/Mfcvx8OHDmRyo5OoaFZD+kNPbEeAK4t73xV9pNORHm7Jdq1XU4CHCp CLZpWSj8aWmMtTxcN2LLEixX7rXpkEzHQuqktc2A4Ft4sSCThK6z1IsoJ Q==; X-CSE-ConnectionGUID: 3xjMBU9iQ9uXsL8Y+CakDg== X-CSE-MsgGUID: 5uxcu+ppRJ6eKhUKLnpc9A== X-IronPort-AV: E=McAfee;i="6700,10204,11212"; a="27091387" X-IronPort-AV: E=Sophos;i="6.11,167,1725346800"; d="scan'208";a="27091387" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Oct 2024 07:53:39 -0700 X-CSE-ConnectionGUID: viAwoGRtSj61CK28BvCbBQ== X-CSE-MsgGUID: sAhZw44qSQCf4lspJ1n71g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.11,167,1725346800"; d="scan'208";a="97048649" Received: from mkuoppal-desk.fi.intel.com ([10.237.72.193]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Oct 2024 07:53:38 -0700 From: Mika Kuoppala To: intel-xe@lists.freedesktop.org Cc: Dominik Grzegorzek , Mika Kuoppala Subject: [PATCH 05/18] drm/xe/eudebug: hw enablement for eudebug Date: Tue, 1 Oct 2024 17:42:53 +0300 Message-Id: <20241001144306.1991001-6-mika.kuoppala@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241001144306.1991001-1-mika.kuoppala@linux.intel.com> References: <20241001144306.1991001-1-mika.kuoppala@linux.intel.com> MIME-Version: 1.0 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" From: Dominik Grzegorzek In order to turn on debug capabilities, (i.e. breakpoints), TD_CTL and some other registers needs to be programmed. Implement eudebug mode enabling including eudebug related workarounds. v2: Move workarounds to xe_wa_oob. Use reg_sr directly instead of xe_rtp as it suits better for dynamic manipulation of those register we do later in the series. Signed-off-by: Dominik Grzegorzek Signed-off-by: Mika Kuoppala --- drivers/gpu/drm/xe/regs/xe_engine_regs.h | 4 ++ drivers/gpu/drm/xe/regs/xe_gt_regs.h | 10 ++++ drivers/gpu/drm/xe/xe_eudebug.c | 70 ++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_eudebug.h | 3 + drivers/gpu/drm/xe/xe_hw_engine.c | 2 + drivers/gpu/drm/xe/xe_wa_oob.rules | 2 + 6 files changed, 91 insertions(+) diff --git a/drivers/gpu/drm/xe/regs/xe_engine_regs.h b/drivers/gpu/drm/xe/regs/xe_engine_regs.h index 81b71903675e..e004423a66bf 100644 --- a/drivers/gpu/drm/xe/regs/xe_engine_regs.h +++ b/drivers/gpu/drm/xe/regs/xe_engine_regs.h @@ -115,6 +115,10 @@ #define INDIRECT_RING_STATE(base) XE_REG((base) + 0x108) +#define CS_DEBUG_MODE2(base) XE_REG((base) + 0xd8, XE_REG_OPTION_MASKED) +#define INST_STATE_CACHE_INVALIDATE REG_BIT(6) +#define GLOBAL_DEBUG_ENABLE REG_BIT(5) + #define RING_BBADDR(base) XE_REG((base) + 0x140) #define RING_BBADDR_UDW(base) XE_REG((base) + 0x168) diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h index fb80042cbe0d..2780541feb67 100644 --- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h +++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h @@ -453,6 +453,14 @@ #define DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA REG_BIT(15) #define CLEAR_OPTIMIZATION_DISABLE REG_BIT(6) +#define TD_CTL XE_REG_MCR(0xe400) +#define TD_CTL_FEH_AND_FEE_ENABLE REG_BIT(7) /* forced halt and exception */ +#define TD_CTL_FORCE_EXTERNAL_HALT REG_BIT(6) +#define TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE REG_BIT(4) +#define TD_CTL_FORCE_EXCEPTION REG_BIT(3) +#define TD_CTL_BREAKPOINT_ENABLE REG_BIT(2) +#define TD_CTL_GLOBAL_DEBUG_ENABLE REG_BIT(0) /* XeHP */ + #define CACHE_MODE_SS XE_REG_MCR(0xe420, XE_REG_OPTION_MASKED) #define DISABLE_ECC REG_BIT(5) #define ENABLE_PREFETCH_INTO_IC REG_BIT(3) @@ -479,11 +487,13 @@ #define MDQ_ARBITRATION_MODE REG_BIT(12) #define STALL_DOP_GATING_DISABLE REG_BIT(5) #define EARLY_EOT_DIS REG_BIT(1) +#define STALL_DOP_GATING_DISABLE REG_BIT(5) #define ROW_CHICKEN2 XE_REG_MCR(0xe4f4, XE_REG_OPTION_MASKED) #define DISABLE_READ_SUPPRESSION REG_BIT(15) #define DISABLE_EARLY_READ REG_BIT(14) #define ENABLE_LARGE_GRF_MODE REG_BIT(12) +#define XEHPC_DISABLE_BTB REG_BIT(11) #define PUSH_CONST_DEREF_HOLD_DIS REG_BIT(8) #define DISABLE_TDL_SVHS_GATING REG_BIT(1) #define DISABLE_DOP_GATING REG_BIT(0) diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c index 4706320b39b6..f90b15fc4964 100644 --- a/drivers/gpu/drm/xe/xe_eudebug.c +++ b/drivers/gpu/drm/xe/xe_eudebug.c @@ -10,13 +10,21 @@ #include +#include + +#include "regs/xe_gt_regs.h" +#include "regs/xe_engine_regs.h" + #include "xe_assert.h" #include "xe_device.h" #include "xe_eudebug.h" #include "xe_eudebug_types.h" #include "xe_exec_queue.h" #include "xe_macros.h" +#include "xe_reg_sr.h" +#include "xe_rtp.h" #include "xe_vm.h" +#include "xe_wa.h" /* * If there is no detected event read by userspace, during this period, assume @@ -945,6 +953,68 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev, return ret; } +#undef XE_REG_MCR +#define XE_REG_MCR(...) XE_REG(__VA_ARGS__, .mcr = 1) + +void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe) +{ + struct xe_gt *gt = hwe->gt; + struct xe_device *xe = gt_to_xe(gt); + + if (!xe->eudebug.available) + return; + + if (!xe_rtp_match_first_render_or_compute(gt, hwe)) + return; + + if (XE_WA(gt, 18022722726)) { + struct xe_reg_sr_entry sr_entry = { + .reg = ROW_CHICKEN, + .clr_bits = STALL_DOP_GATING_DISABLE, + .set_bits = STALL_DOP_GATING_DISABLE, + .read_mask = STALL_DOP_GATING_DISABLE, + }; + + xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt); + } + + if (XE_WA(gt, 14015474168)) { + struct xe_reg_sr_entry sr_entry = { + .reg = ROW_CHICKEN2, + .clr_bits = XEHPC_DISABLE_BTB, + .set_bits = XEHPC_DISABLE_BTB, + .read_mask = XEHPC_DISABLE_BTB, + }; + + xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt); + } + + if (xe->info.graphics_verx100 >= 1200) { + u32 mask = TD_CTL_BREAKPOINT_ENABLE | + TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE | + TD_CTL_FEH_AND_FEE_ENABLE; + struct xe_reg_sr_entry sr_entry = { + .reg = TD_CTL, + .clr_bits = mask, + .set_bits = mask, + .read_mask = mask, + }; + + xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt); + } + + if (xe->info.graphics_verx100 >= 1250) { + struct xe_reg_sr_entry sr_entry = { + .reg = TD_CTL, + .clr_bits = TD_CTL_GLOBAL_DEBUG_ENABLE, + .set_bits = TD_CTL_GLOBAL_DEBUG_ENABLE, + .read_mask = TD_CTL_GLOBAL_DEBUG_ENABLE, + }; + + xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt); + } +} + void xe_eudebug_init(struct xe_device *xe) { spin_lock_init(&xe->eudebug.lock); diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h index 326ddbd50651..3cd6bc7bb682 100644 --- a/drivers/gpu/drm/xe/xe_eudebug.h +++ b/drivers/gpu/drm/xe/xe_eudebug.h @@ -11,6 +11,7 @@ struct xe_device; struct xe_file; struct xe_vm; struct xe_exec_queue; +struct xe_hw_engine; #if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG) @@ -20,6 +21,7 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev, void xe_eudebug_init(struct xe_device *xe); void xe_eudebug_fini(struct xe_device *xe); +void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe); void xe_eudebug_file_open(struct xe_file *xef); void xe_eudebug_file_close(struct xe_file *xef); @@ -38,6 +40,7 @@ static inline int xe_eudebug_connect_ioctl(struct drm_device *dev, static inline void xe_eudebug_init(struct xe_device *xe) { } static inline void xe_eudebug_fini(struct xe_device *xe) { } +static inline void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe) { } static inline void xe_eudebug_file_open(struct xe_file *xef) { } static inline void xe_eudebug_file_close(struct xe_file *xef) { } diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c index ea6d9ef7fab6..8e9a08395042 100644 --- a/drivers/gpu/drm/xe/xe_hw_engine.c +++ b/drivers/gpu/drm/xe/xe_hw_engine.c @@ -16,6 +16,7 @@ #include "xe_assert.h" #include "xe_bo.h" #include "xe_device.h" +#include "xe_eudebug.h" #include "xe_execlist.h" #include "xe_force_wake.h" #include "xe_gsc.h" @@ -557,6 +558,7 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe, xe_tuning_process_engine(hwe); xe_wa_process_engine(hwe); hw_engine_setup_default_state(hwe); + xe_eudebug_init_hw_engine(hwe); xe_reg_sr_init(&hwe->reg_whitelist, hwe->name, gt_to_xe(gt)); xe_reg_whitelist_process_engine(hwe); diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules index 920ca5060146..da7d2c84298c 100644 --- a/drivers/gpu/drm/xe/xe_wa_oob.rules +++ b/drivers/gpu/drm/xe/xe_wa_oob.rules @@ -37,3 +37,5 @@ 16023588340 GRAPHICS_VERSION(2001) 14019789679 GRAPHICS_VERSION(1255) GRAPHICS_VERSION_RANGE(1270, 2004) +18022722726 GRAPHICS_VERSION_RANGE(1250, 1274) +14015474168 PLATFORM(PVC) -- 2.34.1