]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/pf: Disable auto-provisioning if changed using debugfs
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Wed, 15 Oct 2025 09:12:08 +0000 (11:12 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Fri, 17 Oct 2025 15:11:09 +0000 (17:11 +0200)
When we attempt to tweak VFs configurations using debugfs, stop
assuming that VFs need auto-(un)provisioning.

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-4-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c
drivers/gpu/drm/xe/xe_sriov_pf_provision.c
drivers/gpu/drm/xe/xe_sriov_pf_provision.h
drivers/gpu/drm/xe/xe_sriov_pf_provision_types.h
drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c

index c026a3910e7e32ba63c88b5fa43c378d158f5d0f..838beb7f6327fcb3b5aeaae521fcff01e010a62b 100644 (file)
@@ -23,6 +23,7 @@
 #include "xe_gt_sriov_pf_service.h"
 #include "xe_pm.h"
 #include "xe_sriov_pf.h"
+#include "xe_sriov_pf_provision.h"
 
 /*
  *      /sys/kernel/debug/dri/BDF/
@@ -124,6 +125,8 @@ static int POLICY##_set(void *data, u64 val)                                        \
                                                                                \
        xe_pm_runtime_get(xe);                                                  \
        err = xe_gt_sriov_pf_policy_set_##POLICY(gt, val);                      \
+       if (!err)                                                               \
+               xe_sriov_pf_provision_set_custom_mode(xe);                      \
        xe_pm_runtime_put(xe);                                                  \
                                                                                \
        return err;                                                             \
@@ -189,6 +192,8 @@ static int CONFIG##_set(void *data, u64 val)                                        \
        xe_pm_runtime_get(xe);                                                  \
        err = xe_sriov_pf_wait_ready(xe) ?:                                     \
              xe_gt_sriov_pf_config_set_##CONFIG(gt, vfid, val);                \
+       if (!err)                                                               \
+               xe_sriov_pf_provision_set_custom_mode(xe);                      \
        xe_pm_runtime_put(xe);                                                  \
                                                                                \
        return err;                                                             \
@@ -246,6 +251,8 @@ static int set_threshold(void *data, u64 val, enum xe_guc_klv_threshold_index in
 
        xe_pm_runtime_get(xe);
        err = xe_gt_sriov_pf_config_set_threshold(gt, vfid, index, val);
+       if (!err)
+               xe_sriov_pf_provision_set_custom_mode(xe);
        xe_pm_runtime_put(xe);
 
        return err;
index 1e782a96bbdd9eb79dd5e604005a23b2f6a7edc5..23b89c4310ed35b2502fd69fd78aa8d9dd4af2d0 100644 (file)
 #include "xe_sriov_pf_helpers.h"
 #include "xe_sriov_pf_provision.h"
 #include "xe_sriov_pf_provision_types.h"
+#include "xe_sriov_printk.h"
+
+static const char *mode_to_string(enum xe_sriov_provisioning_mode mode)
+{
+       switch (mode) {
+       case XE_SRIOV_PROVISIONING_MODE_AUTO:
+               return "auto";
+       case XE_SRIOV_PROVISIONING_MODE_CUSTOM:
+               return "custom";
+       default:
+               return "<invalid>";
+       }
+}
 
 static bool pf_auto_provisioning_mode(struct xe_device *xe)
 {
@@ -95,3 +108,29 @@ int xe_sriov_pf_unprovision_vfs(struct xe_device *xe, unsigned int num_vfs)
        pf_unprovision_vfs(xe, num_vfs);
        return 0;
 }
+
+/**
+ * xe_sriov_pf_provision_set_mode() - Change VFs provision mode.
+ * @xe: the PF &xe_device
+ * @mode: the new VFs provisioning mode
+ *
+ * When changing from AUTO to CUSTOM mode, any already allocated VFs resources
+ * will remain allocated and will not be released upon VFs disabling.
+ *
+ * This function can only be called on PF.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_sriov_pf_provision_set_mode(struct xe_device *xe, enum xe_sriov_provisioning_mode mode)
+{
+       xe_assert(xe, IS_SRIOV_PF(xe));
+
+       if (mode == xe->sriov.pf.provision.mode)
+               return 0;
+
+       xe_sriov_dbg(xe, "mode %s changed to %s by %ps\n",
+                    mode_to_string(xe->sriov.pf.provision.mode),
+                    mode_to_string(mode), __builtin_return_address(0));
+       xe->sriov.pf.provision.mode = mode;
+       return 0;
+}
index f6a902190ad7340145ff2057ede5a89537034f12..cf3657a32e90c0bfe5d42c6df49bf9b13b6c7bae 100644 (file)
@@ -6,9 +6,26 @@
 #ifndef _XE_SRIOV_PF_PROVISION_H_
 #define _XE_SRIOV_PF_PROVISION_H_
 
+#include "xe_sriov_pf_provision_types.h"
+
 struct xe_device;
 
 int xe_sriov_pf_provision_vfs(struct xe_device *xe, unsigned int num_vfs);
 int xe_sriov_pf_unprovision_vfs(struct xe_device *xe, unsigned int num_vfs);
 
+int xe_sriov_pf_provision_set_mode(struct xe_device *xe, enum xe_sriov_provisioning_mode mode);
+
+/**
+ * xe_sriov_pf_provision_set_custom_mode() - Change VFs provision mode to custom.
+ * @xe: the PF &xe_device
+ *
+ * This function can only be called on PF.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+static inline int xe_sriov_pf_provision_set_custom_mode(struct xe_device *xe)
+{
+       return xe_sriov_pf_provision_set_mode(xe, XE_SRIOV_PROVISIONING_MODE_CUSTOM);
+}
+
 #endif
index f72bc5db3a60e01fdfa54c05333198f94b757498..a847b8a4c4da086bee205a5efeb55f2cfcb3d59f 100644 (file)
  *                                   Any allocated resources to the VFs will be
  *                                   automatically released when disabling VFs.
  *                                   This is a default mode.
+ * @XE_SRIOV_PROVISIONING_MODE_CUSTOM: Explicit VFs provisioning using uABI interfaces.
+ *                                     VFs resources remains allocated regardless if
+ *                                     VFs are enabled or not.
  */
 enum xe_sriov_provisioning_mode {
        XE_SRIOV_PROVISIONING_MODE_AUTO,
+       XE_SRIOV_PROVISIONING_MODE_CUSTOM,
 };
 static_assert(XE_SRIOV_PROVISIONING_MODE_AUTO == 0);
 
index 6ba2332c77d41d38e2245217ff6ff415443022a7..f3f478f14ff590c64b0d048b76a546256dae4f57 100644 (file)
@@ -15,6 +15,7 @@
 #include "xe_tile_sriov_pf_debugfs.h"
 #include "xe_sriov.h"
 #include "xe_sriov_pf.h"
+#include "xe_sriov_pf_provision.h"
 
 /*
  *      /sys/kernel/debug/dri/BDF/
@@ -143,6 +144,8 @@ static int NAME##_set(void *data, u64 val)                                  \
        xe_pm_runtime_get(xe);                                                  \
        err = xe_sriov_pf_wait_ready(xe) ?:                                     \
              xe_gt_sriov_pf_config_set_##CONFIG(gt, vfid, val);                \
+       if (!err)                                                               \
+               xe_sriov_pf_provision_set_custom_mode(xe);                      \
        xe_pm_runtime_put(xe);                                                  \
                                                                                \
        return err;                                                             \