[PATCH i-g-t v5 3/3] tests/xe_compute: Validate ccs_mode setting
Niranjana Vishwanathapura
niranjana.vishwanathapura at intel.com
Thu Dec 7 21:24:26 UTC 2023
Validate 'ccs_mode' sysfs uapi interface and ensure compute
kernels can be run on enabled compute engines.
v2: Separate num_cslices sysfs interface
Reviewed-by: Andi Shyti <andi.shyti at linux.intel.com>
Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
---
tests/intel/xe_compute.c | 149 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 147 insertions(+), 2 deletions(-)
diff --git a/tests/intel/xe_compute.c b/tests/intel/xe_compute.c
index 1db72785b..42f42ca0c 100644
--- a/tests/intel/xe_compute.c
+++ b/tests/intel/xe_compute.c
@@ -13,9 +13,145 @@
#include <string.h>
#include "igt.h"
+#include "igt_sysfs.h"
#include "intel_compute.h"
+#include "xe/xe_ioctl.h"
#include "xe/xe_query.h"
+static int gt_sysfs_open(int gt)
+{
+ int fd, gt_fd;
+
+ fd = drm_open_driver(DRIVER_XE);
+ gt_fd = xe_sysfs_gt_open(fd, gt);
+ drm_close_driver(fd);
+
+ return gt_fd;
+}
+
+static bool get_num_cslices(u32 gt, u32 *num_slices)
+{
+ int gt_fd, ret;
+
+ gt_fd = gt_sysfs_open(gt);
+ ret = igt_sysfs_scanf(gt_fd, "num_cslices", "%u", num_slices);
+ close(gt_fd);
+
+ return ret > 0;
+}
+
+/**
+ * SUBTEST: ccs-mode-basic
+ * GPU requirement: PVC
+ * Description: Validate 'ccs_mode' sysfs uapi
+ * Functionality: ccs_mode user interface
+ */
+static void
+test_ccs_mode(int num_gt)
+{
+ struct drm_xe_engine_class_instance *hwe;
+ u32 gt, m, ccs_mode, vm, q, num_slices;
+ int fd, gt_fd;
+
+ for (gt = 0; gt < num_gt; gt++) {
+ igt_require(get_num_cslices(gt, &num_slices));
+
+ gt_fd = gt_sysfs_open(gt);
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", 0) < 0);
+ for (m = 1; m <= num_slices; m++) {
+ /* compute slices are to be equally distributed among enabled engines */
+ if (num_slices % m) {
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", m) < 0);
+ continue;
+ }
+
+ /* Validate allowed ccs modes by setting them and reading back */
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", m) > 0);
+ igt_assert(igt_sysfs_scanf(gt_fd, "ccs_mode", "%u", &ccs_mode) > 0);
+ igt_assert(m == ccs_mode);
+
+ /* Validate exec queues creation with enabled ccs engines */
+ fd = drm_open_driver(DRIVER_XE);
+ vm = xe_vm_create(fd, 0, 0);
+ xe_for_each_engine(fd, hwe) {
+ if (hwe->gt_id != gt ||
+ hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
+ continue;
+
+ q = xe_exec_queue_create(fd, vm, hwe, 0);
+ xe_exec_queue_destroy(fd, q);
+ }
+
+ /* Ensure exec queue creation fails for disabled ccs engines */
+ hwe->gt_id = gt;
+ hwe->engine_class = DRM_XE_ENGINE_CLASS_COMPUTE;
+ hwe->engine_instance = m;
+ igt_assert_neq(__xe_exec_queue_create(fd, vm, hwe, 0, &q), 0);
+
+ xe_vm_destroy(fd, vm);
+ drm_close_driver(fd);
+ }
+
+ /* Ensure invalid ccs mode setting is rejected */
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", m) < 0);
+
+ /* Can't change ccs mode with an open drm clients */
+ fd = drm_open_driver(DRIVER_XE);
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", 1) < 0);
+ drm_close_driver(fd);
+
+ /* Set ccs mode back to default value */
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", 1) > 0);
+
+ close(gt_fd);
+ }
+}
+
+/**
+ * SUBTEST: ccs-mode-compute-kernel
+ * GPU requirement: PVC
+ * Description: Validate 'ccs_mode' by running compute kernel
+ * Functionality: CCS mode funtionality
+ */
+static void
+test_compute_kernel_with_ccs_mode(int num_gt)
+{
+ struct drm_xe_engine_class_instance *hwe;
+ u32 gt, m, num_slices;
+ int fd, gt_fd;
+
+ for (gt = 0; gt < num_gt; gt++) {
+ igt_require(get_num_cslices(gt, &num_slices));
+
+ gt_fd = gt_sysfs_open(gt);
+ for (m = 1; m <= num_slices; m++) {
+ if (num_slices % m)
+ continue;
+
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", m) > 0);
+
+ /* Run compute kernel on enabled ccs engines */
+ fd = drm_open_driver(DRIVER_XE);
+ xe_for_each_engine(fd, hwe) {
+ if (hwe->gt_id != gt ||
+ hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
+ continue;
+
+ igt_info("GT-%d: Running compute kernel with ccs_mode %d on ccs engine %d\n",
+ gt, m, hwe->engine_instance);
+ igt_assert_f(xe_run_intel_compute_kernel_on_engine(fd, hwe),
+ "Unable to run compute kernel successfully\n");
+ }
+ drm_close_driver(fd);
+ }
+
+ /* Set ccs mode back to default value */
+ igt_assert(igt_sysfs_printf(gt_fd, "ccs_mode", "%u", 1) > 0);
+
+ close(gt_fd);
+ }
+}
+
/**
* SUBTEST: compute-square
* GPU requirement: TGL, PVC, LNL
@@ -32,14 +168,23 @@ test_compute_square(int fd)
igt_main
{
- int xe;
+ int xe, num_gt;
- igt_fixture
+ igt_fixture {
xe = drm_open_driver(DRIVER_XE);
+ num_gt = xe_number_gt(xe);
+ }
igt_subtest("compute-square")
test_compute_square(xe);
igt_fixture
drm_close_driver(xe);
+
+ /* ccs mode tests should be run without open gpu file handles */
+ igt_subtest("ccs-mode-basic")
+ test_ccs_mode(num_gt);
+
+ igt_subtest("ccs-mode-compute-kernel")
+ test_compute_kernel_with_ccs_mode(num_gt);
}
--
2.43.0
More information about the igt-dev
mailing list