]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/pf: Automatically provision VFs only in auto-mode
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Wed, 15 Oct 2025 09:12:07 +0000 (11:12 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Fri, 17 Oct 2025 15:10:15 +0000 (17:10 +0200)
We shouldn't attempt to auto-provision VFs once we allow other
provisioning methods. Make the code aware of the new condition.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://lore.kernel.org/r/20251015091211.592-3-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_sriov_pf_provision.c
drivers/gpu/drm/xe/xe_sriov_pf_provision_types.h [new file with mode: 0644]
drivers/gpu/drm/xe/xe_sriov_pf_types.h

index 4895d0a7008904611e0b0b12222af82db10d33b7..1e782a96bbdd9eb79dd5e604005a23b2f6a7edc5 100644 (file)
@@ -9,6 +9,14 @@
 #include "xe_sriov.h"
 #include "xe_sriov_pf_helpers.h"
 #include "xe_sriov_pf_provision.h"
+#include "xe_sriov_pf_provision_types.h"
+
+static bool pf_auto_provisioning_mode(struct xe_device *xe)
+{
+       xe_assert(xe, IS_SRIOV_PF(xe));
+
+       return xe->sriov.pf.provision.mode == XE_SRIOV_PROVISIONING_MODE_AUTO;
+}
 
 static bool pf_needs_provisioning(struct xe_gt *gt, unsigned int num_vfs)
 {
@@ -30,7 +38,7 @@ static int pf_provision_vfs(struct xe_device *xe, unsigned int num_vfs)
 
        for_each_gt(gt, xe, id) {
                if (!pf_needs_provisioning(gt, num_vfs))
-                       continue;
+                       return -EUCLEAN;
                err = xe_gt_sriov_pf_config_set_fair(gt, VFID(1), num_vfs);
                result = result ?: err;
        }
@@ -62,6 +70,9 @@ int xe_sriov_pf_provision_vfs(struct xe_device *xe, unsigned int num_vfs)
 {
        xe_assert(xe, IS_SRIOV_PF(xe));
 
+       if (!pf_auto_provisioning_mode(xe))
+               return 0;
+
        return pf_provision_vfs(xe, num_vfs);
 }
 
@@ -78,6 +89,9 @@ int xe_sriov_pf_unprovision_vfs(struct xe_device *xe, unsigned int num_vfs)
 {
        xe_assert(xe, IS_SRIOV_PF(xe));
 
+       if (!pf_auto_provisioning_mode(xe))
+               return 0;
+
        pf_unprovision_vfs(xe, num_vfs);
        return 0;
 }
diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_provision_types.h b/drivers/gpu/drm/xe/xe_sriov_pf_provision_types.h
new file mode 100644 (file)
index 0000000..f72bc5d
--- /dev/null
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _XE_SRIOV_PF_PROVISION_TYPES_H_
+#define _XE_SRIOV_PF_PROVISION_TYPES_H_
+
+#include <linux/build_bug.h>
+
+/**
+ * enum xe_sriov_provisioning_mode - SR-IOV provisioning mode.
+ *
+ * @XE_SRIOV_PROVISIONING_MODE_AUTO: VFs are provisioned during VFs enabling.
+ *                                   Any allocated resources to the VFs will be
+ *                                   automatically released when disabling VFs.
+ *                                   This is a default mode.
+ */
+enum xe_sriov_provisioning_mode {
+       XE_SRIOV_PROVISIONING_MODE_AUTO,
+};
+static_assert(XE_SRIOV_PROVISIONING_MODE_AUTO == 0);
+
+/**
+ * struct xe_sriov_pf_provision - Data used by the PF provisioning.
+ */
+struct xe_sriov_pf_provision {
+       /** @mode: selected provisioning mode. */
+       enum xe_sriov_provisioning_mode mode;
+};
+
+#endif
index 956a88f9f213d4c7f08e1d708b396cdc7597b7e1..c753cd59aed2bf696fc5a8a51fd9004dbe835b90 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/mutex.h>
 #include <linux/types.h>
 
+#include "xe_sriov_pf_provision_types.h"
 #include "xe_sriov_pf_service_types.h"
 
 /**
@@ -35,6 +36,9 @@ struct xe_device_pf {
        /** @master_lock: protects all VFs configurations across GTs */
        struct mutex master_lock;
 
+       /** @provision: device level provisioning data. */
+       struct xe_sriov_pf_provision provision;
+
        /** @service: device level service data. */
        struct xe_sriov_pf_service service;