From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7619F10E21B for ; Mon, 14 Aug 2023 17:27:50 +0000 (UTC) From: janga.rahul.kumar@intel.com To: igt-dev@lists.freedesktop.org, ramadevi.gandi@intel.com, janga.rahul.kumar@intel.com Date: Mon, 14 Aug 2023 22:59:39 +0530 Message-Id: <20230814172940.1818622-3-janga.rahul.kumar@intel.com> In-Reply-To: <20230814172940.1818622-1-janga.rahul.kumar@intel.com> References: <20230814172940.1818622-1-janga.rahul.kumar@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [igt-dev] [PATCH i-g-t 2/3] lib/xe: Add hang library support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: sai.gowtham.ch@intel.com, kunal1.joshi@intel.com Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" List-ID: From: Janga Rahul Kumar Add helper library support to submit hanging batch and clean state post hang. An hanging batch is a spinning batch that never gets stopped. Cc: Sai Gowtham Ch Cc: Kunal Joshi Cc: Kamil Konieczny Cc: Anna Karas Signed-off-by: Janga Rahul Kumar Tested-by: Kunal Joshi Reviewed-by: Sai Gowtham Ch --- lib/xe/xe_gt.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/xe/xe_gt.h | 6 ++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/lib/xe/xe_gt.c b/lib/xe/xe_gt.c index a79e19fd4..cc833e1c7 100644 --- a/lib/xe/xe_gt.c +++ b/lib/xe/xe_gt.c @@ -65,3 +65,72 @@ void xe_force_gt_reset_all(int xe_fd) xe_force_gt_reset(xe_fd, gt); } +/** + * xe_hang_ring: + * @fd: open xe drm file descriptor + * @ring: execbuf ring flag + * + * This helper function injects a hanging batch into @ring. It returns a + * #igt_hang_t structure which must be passed to xe_post_hang_ring() for + * hang post-processing (after the gpu hang interaction has been tested). + * + * Returns: + * Structure with helper internal state for xe_post_hang_ring(). + */ +igt_hang_t xe_hang_ring(int fd, uint64_t ahnd, uint32_t ctx, int ring, + unsigned int flags) +{ + uint16_t class; + uint32_t vm; + unsigned int exec_queue; + igt_spin_t *spin_t; + + vm = xe_vm_create(fd, 0, 0); + + switch (ring) { + case I915_EXEC_DEFAULT: + if (IS_PONTEVECCHIO(intel_get_drm_devid(fd))) + class = DRM_XE_ENGINE_CLASS_COPY; + else + class = DRM_XE_ENGINE_CLASS_RENDER; + break; + case I915_EXEC_RENDER: + if (IS_PONTEVECCHIO(intel_get_drm_devid(fd))) + igt_skip("Render engine not supported on this platform.\n"); + else + class = DRM_XE_ENGINE_CLASS_RENDER; + break; + case I915_EXEC_BLT: + class = DRM_XE_ENGINE_CLASS_COPY; + break; + case I915_EXEC_BSD: + class = DRM_XE_ENGINE_CLASS_VIDEO_DECODE; + break; + case I915_EXEC_VEBOX: + class = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE; + break; + default: + igt_assert_f(false, "Unknown engine: %x", (uint32_t) flags); + } + + exec_queue = xe_exec_queue_create_class(fd, vm, class); + + spin_t = igt_spin_new(fd, .ahnd = ahnd, .engine = exec_queue, .vm = vm, + .flags = IGT_SPIN_NO_PREEMPTION); + return (igt_hang_t){ spin_t, exec_queue, 0, flags }; +} + +/** + * xe_post_hang_ring: + * @fd: open xe drm file descriptor + * @arg: hang state from xe_hang_ring() + * + * This function does the necessary post-processing after a gpu hang injected + * with xe_hang_ring(). + */ +void xe_post_hang_ring(int fd, igt_hang_t arg) +{ + xe_exec_queue_destroy(fd, arg.ctx); + xe_vm_destroy(fd, arg.spin->vm); +} + diff --git a/lib/xe/xe_gt.h b/lib/xe/xe_gt.h index aeb4aec36..de3fc35b0 100644 --- a/lib/xe/xe_gt.h +++ b/lib/xe/xe_gt.h @@ -10,9 +10,13 @@ #include "igt_core.h" #include "igt_sysfs.h" +#include "lib/igt_gt.h" +#include "lib/intel_chipset.h" #include "xe_ioctl.h" #include "xe_query.h" bool has_xe_gt_reset(int fd); void xe_force_gt_reset_all(int fd); - +igt_hang_t xe_hang_ring(int fd, uint64_t ahnd, uint32_t ctx, int ring, + unsigned int flags); +void xe_post_hang_ring(int fd, igt_hang_t arg); -- 2.25.1