drm/xe/pf: Disable auto-provisioning if changed using debugfs

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
This commit is contained in:
Michal Wajdeczko
2025-10-15 11:12:08 +02:00
parent 5546bc2071
commit b1767ca123
5 changed files with 70 additions and 0 deletions

View 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;

View File

@@ -10,6 +10,19 @@
#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;
}

View 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

View File

@@ -15,9 +15,13 @@
* 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);

View 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; \