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 E6E32CCFA03 for ; Thu, 6 Nov 2025 15:29:01 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 745EB10E939; Thu, 6 Nov 2025 15:29:01 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="BshSzbdp"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.14]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3E43B10E939 for ; Thu, 6 Nov 2025 15:28:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1762442939; x=1793978939; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6zxTHyA8a38Bhqt/ZyJKE8fDI22t17eivWk6YqGKTsQ=; b=BshSzbdpO0Sh/HGMVKyC138GRDj2wsKHoENKyndp97ijcPGQmuD1cXXq AqmRmV6iaZnEGAqdG7uGWa+rZuSp8TMFj8JTcCzUqjemx0L+xaovIkUms w7a3HiSWGV/GAByxtrIwLpSG90fKkWPm/MFVVt0WXl1i+Povw2hqBTLN+ TyAUBcWNfu5bpAZ5Q7K9TIFXeWi+Wr9Bzhpa4nnGGUY4fK+SOM7OoFVFe Cu+3KxZTNgfr5Y8nO0tyu2yph7QV0KsenBWrHvbOtCcXMy1HmWUrmjHMG JzwdE6FO6jn7ykLGzbFcYciQuoZMzv8hApJ+dT8ILFJ6W5x53IXcvKUOa A==; X-CSE-ConnectionGUID: QYT35m9xS8SXRr1snExtQg== X-CSE-MsgGUID: tBToha8SSi6xqzoY3TGnIQ== X-IronPort-AV: E=McAfee;i="6800,10657,11531"; a="68420358" X-IronPort-AV: E=Sophos;i="6.17,312,1747724400"; d="scan'208";a="68420358" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by orvoesa106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Nov 2025 07:28:59 -0800 X-CSE-ConnectionGUID: 2dGm+j3RRYaL+xqDAICcDg== X-CSE-MsgGUID: i+kyWi+VT6uzU5khPLaXQA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.19,284,1754982000"; d="scan'208";a="218537055" Received: from soc-5cg43972f8.clients.intel.com (HELO localhost) ([172.28.180.65]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Nov 2025 07:28:57 -0800 From: Marcin Bernatowicz To: igt-dev@lists.freedesktop.org Cc: piotr.piorkowski@intel.com, lukasz.laguna@intel.com, jakub1.kolakowski@intel.com, Marcin Bernatowicz Subject: [PATCH i-g-t 5/6] tests/intel/xe_sriov_flr: Use global MMIO context initialized in verify_flr Date: Thu, 6 Nov 2025 16:28:09 +0100 Message-ID: <20251106152811.1997614-6-marcin.bernatowicz@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251106152811.1997614-1-marcin.bernatowicz@linux.intel.com> References: <20251106152811.1997614-1-marcin.bernatowicz@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: igt-dev@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development mailing list for IGT GPU Tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" Move MMIO initialization to verify_flr() after VF enable and PCI reinit. Replace per-subcheck MMIO pointers with a global context accessed via xe_mmio_for_vf() to simplify resource management. v2: - Switch num_vfs to unsigned int (Piotr) Suggested-by: Piotr Piórkowski Signed-off-by: Marcin Bernatowicz Cc: Lukasz Laguna Reviewed-by: Piotr Piórkowski --- tests/intel/xe_sriov_flr.c | 90 ++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 33 deletions(-) diff --git a/tests/intel/xe_sriov_flr.c b/tests/intel/xe_sriov_flr.c index ee0baa0fa..e69de46c4 100644 --- a/tests/intel/xe_sriov_flr.c +++ b/tests/intel/xe_sriov_flr.c @@ -55,6 +55,44 @@ IGT_TEST_DESCRIPTION("Xe tests for SR-IOV VF FLR (Functional Level Reset)"); const char *SKIP_REASON = "SKIP"; +static struct g_mmio { + struct xe_mmio *mmio; + unsigned int num_vfs; +} g_mmio; + +static inline struct xe_mmio *xe_mmio_for_vf(unsigned int vf) +{ + igt_assert_f(g_mmio.mmio, "MMIO not initialized\n"); + igt_assert_f(vf <= g_mmio.num_vfs, "VF%u out of range (<= %u)\n", vf, + g_mmio.num_vfs); + return &g_mmio.mmio[vf]; +} + +static void init_mmio(int pf_fd, unsigned int num_vfs) +{ + igt_assert_f(!g_mmio.mmio, "MMIO already initialized\n"); + g_mmio.mmio = calloc(num_vfs + 1, sizeof(*g_mmio.mmio)); + igt_assert(g_mmio.mmio); + + for (unsigned int i = 0; i <= num_vfs; ++i) + xe_mmio_vf_access_init(pf_fd, i, &g_mmio.mmio[i]); + + g_mmio.num_vfs = num_vfs; +} + +static void cleanup_mmio(void) +{ + if (!g_mmio.mmio) + return; + + for (size_t i = 0; i <= g_mmio.num_vfs; ++i) + if (xe_mmio_is_initialized(&g_mmio.mmio[i])) + xe_mmio_access_fini(&g_mmio.mmio[i]); + free(g_mmio.mmio); + g_mmio.mmio = NULL; + g_mmio.num_vfs = 0; +} + /** * struct subcheck_data - Base structure for subcheck data. * @@ -285,6 +323,8 @@ static void verify_flr(int pf_fd, int num_vfs, struct subcheck *checks, if (igt_warn_on(igt_pci_system_reinit())) goto disable_vfs; + init_mmio(pf_fd, num_vfs); + for (i = 0; i < num_checks; ++i) checks[i].init(checks[i].data); @@ -303,6 +343,8 @@ cleanup: for (i = 0; i < num_checks; ++i) checks[i].cleanup(checks[i].data); + cleanup_mmio(); + disable_vfs: igt_sriov_disable_vfs(pf_fd); @@ -489,7 +531,6 @@ struct ggtt_provisioned_offset_range { struct ggtt_data { struct subcheck_data base; struct ggtt_provisioned_offset_range *pte_offsets; - struct xe_mmio *mmio; struct ggtt_ops ggtt; }; @@ -544,11 +585,12 @@ static int populate_ggtt_pte_offsets(struct ggtt_data *gdata) struct xe_sriov_provisioned_range *ranges; uint8_t tile = gdata->base.tile; unsigned int nr_ranges; + struct xe_mmio *mmio = xe_mmio_for_vf(0); gdata->pte_offsets = calloc(num_vfs + 1, sizeof(*gdata->pte_offsets)); igt_assert(gdata->pte_offsets); - ret = xe_sriov_find_ggtt_provisioned_pte_offsets(pf_fd, tile, gdata->mmio, + ret = xe_sriov_find_ggtt_provisioned_pte_offsets(pf_fd, tile, mmio, &ranges, &nr_ranges); if (ret) { set_skip_reason(&gdata->base, "Failed to scan GGTT PTE offset ranges (%d)\n", @@ -603,19 +645,15 @@ static void ggtt_subcheck_init(struct subcheck_data *data) else gdata->ggtt.set_pte = intel_set_pte; - if (gdata->mmio) { - if (!xe_mmio_is_initialized(&gdata->mmio[0])) - xe_mmio_vf_access_init(data->pf_fd, 0 /*PF*/, gdata->mmio); - - populate_ggtt_pte_offsets(gdata); - } else { - set_skip_reason(data, "xe_mmio is NULL\n"); - } + if (populate_ggtt_pte_offsets(gdata)) + /* skip reason set in populate_ggtt_pte_offsets */ + return; } static void ggtt_subcheck_prepare_vf(int vf_id, struct subcheck_data *data) { struct ggtt_data *gdata = (struct ggtt_data *)data; + struct xe_mmio *mmio = xe_mmio_for_vf(0); xe_ggtt_pte_t pte; uint32_t pte_offset; @@ -628,7 +666,7 @@ static void ggtt_subcheck_prepare_vf(int vf_id, struct subcheck_data *data) gdata->pte_offsets[vf_id].end); for_each_pte_offset(pte_offset, &gdata->pte_offsets[vf_id]) { - if (!set_pte_gpa(&gdata->ggtt, gdata->mmio, data->tile, pte_offset, + if (!set_pte_gpa(&gdata->ggtt, mmio, data->tile, pte_offset, (uint8_t)vf_id, &pte)) { set_skip_reason(data, "Prepare VF%u failed, unexpected gpa: Read PTE: %#" PRIx64 " at offset: %#x\n", @@ -642,6 +680,7 @@ static void ggtt_subcheck_verify_vf(int vf_id, int flr_vf_id, struct subcheck_da { struct ggtt_data *gdata = (struct ggtt_data *)data; uint8_t expected = (vf_id == flr_vf_id) ? 0 : vf_id; + struct xe_mmio *mmio = xe_mmio_for_vf(0); xe_ggtt_pte_t pte; uint32_t pte_offset; @@ -649,7 +688,7 @@ static void ggtt_subcheck_verify_vf(int vf_id, int flr_vf_id, struct subcheck_da return; for_each_pte_offset(pte_offset, &gdata->pte_offsets[vf_id]) { - if (!check_pte_gpa(&gdata->ggtt, gdata->mmio, data->tile, pte_offset, + if (!check_pte_gpa(&gdata->ggtt, mmio, data->tile, pte_offset, expected, &pte)) { set_fail_reason(data, "GGTT check after VF%u FLR failed on VF%u: Read PTE: %#" PRIx64 " at offset: %#x\n", @@ -828,7 +867,6 @@ static void lmem_subcheck_cleanup(struct subcheck_data *data) struct regs_data { struct subcheck_data base; - struct xe_mmio *mmio; uint32_t reg_addr; int reg_count; }; @@ -846,6 +884,7 @@ static void regs_subcheck_init(struct subcheck_data *data) static void regs_subcheck_prepare_vf(int vf_id, struct subcheck_data *data) { struct regs_data *rdata = (struct regs_data *)data; + struct xe_mmio *mmio = xe_mmio_for_vf(vf_id); uint8_t tile = data->tile; uint32_t reg; int i; @@ -853,14 +892,11 @@ static void regs_subcheck_prepare_vf(int vf_id, struct subcheck_data *data) if (data->stop_reason) return; - if (!xe_mmio_is_initialized(&rdata->mmio[vf_id])) - xe_mmio_vf_access_init(data->pf_fd, vf_id, &rdata->mmio[vf_id]); - for (i = 0; i < rdata->reg_count; i++) { reg = rdata->reg_addr + i * 4; - xe_mmio_tile_write32(&rdata->mmio[vf_id], tile, reg, vf_id); - if (xe_mmio_tile_read32(&rdata->mmio[vf_id], tile, reg) != vf_id) { + xe_mmio_tile_write32(mmio, tile, reg, vf_id); + if (xe_mmio_tile_read32(mmio, tile, reg) != vf_id) { set_skip_reason(data, "Registers write/read check failed on VF%u\n", vf_id); return; } @@ -871,6 +907,7 @@ static void regs_subcheck_verify_vf(int vf_id, int flr_vf_id, struct subcheck_da { struct regs_data *rdata = (struct regs_data *)data; uint32_t expected = (vf_id == flr_vf_id) ? 0 : vf_id; + struct xe_mmio *mmio = xe_mmio_for_vf(vf_id); uint32_t reg; int i; @@ -880,7 +917,7 @@ static void regs_subcheck_verify_vf(int vf_id, int flr_vf_id, struct subcheck_da for (i = 0; i < rdata->reg_count; i++) { reg = rdata->reg_addr + i * 4; - if (xe_mmio_tile_read32(&rdata->mmio[vf_id], data->tile, reg) != expected) { + if (xe_mmio_tile_read32(mmio, data->tile, reg) != expected) { set_fail_reason(data, "Registers check after VF%u FLR failed on VF%u\n", flr_vf_id, vf_id); @@ -889,18 +926,12 @@ static void regs_subcheck_verify_vf(int vf_id, int flr_vf_id, struct subcheck_da } } -static void regs_subcheck_cleanup(struct subcheck_data *data) { } - -static void cleanup_mmio(struct xe_mmio *mmio, int num_vfs) +static void regs_subcheck_cleanup(struct subcheck_data *data) { - for (int i = 0; i <= num_vfs; ++i) - if (xe_mmio_is_initialized(&mmio[i])) - xe_mmio_access_fini(&mmio[i]); } static void clear_tests(int pf_fd, int num_vfs, flr_exec_strategy exec_strategy) { - struct xe_mmio mmio[num_vfs + 1]; const uint8_t num_tiles = xe_tiles_count(pf_fd); struct subcheck_data base; struct ggtt_data gdata[num_tiles]; @@ -912,8 +943,6 @@ static void clear_tests(int pf_fd, int num_vfs, flr_exec_strategy exec_strategy) struct subcheck checks[num_checks]; unsigned int i = 0, t; - memset(mmio, 0, sizeof(mmio)); - xe_for_each_tile(pf_fd, t) { igt_assert_lt(i, num_tiles); base = (struct subcheck_data){ .pf_fd = pf_fd, @@ -922,7 +951,6 @@ static void clear_tests(int pf_fd, int num_vfs, flr_exec_strategy exec_strategy) gdata[i] = (struct ggtt_data){ .base = base, - .mmio = mmio, }; checks[i * subcheck_count + 0] = (struct subcheck){ .data = (struct subcheck_data *)&gdata[i], @@ -947,7 +975,6 @@ static void clear_tests(int pf_fd, int num_vfs, flr_exec_strategy exec_strategy) scratch_data[i] = (struct regs_data){ .base = base, - .mmio = mmio, .reg_addr = SCRATCH_REG, .reg_count = SCRATCH_REG_COUNT, }; @@ -962,7 +989,6 @@ static void clear_tests(int pf_fd, int num_vfs, flr_exec_strategy exec_strategy) media_scratch_data[i] = (struct regs_data){ .base = base, - .mmio = mmio, .reg_addr = MED_SCRATCH_REG, .reg_count = MED_SCRATCH_REG_COUNT, }; @@ -980,8 +1006,6 @@ static void clear_tests(int pf_fd, int num_vfs, flr_exec_strategy exec_strategy) igt_assert_eq(i * subcheck_count, num_checks); verify_flr(pf_fd, num_vfs, checks, num_checks, exec_strategy); - - cleanup_mmio(mmio, num_vfs); } igt_main -- 2.43.0