mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
drm/xe/pf: Make sure PF is ready to configure VFs
The PF driver might be resumed just to configure VFs, but since it is doing some asynchronous GuC reconfigurations after fresh reset, we should wait until all pending works are completed. This is especially important in case of LMEM provisioning, since we also need to update the LMTT and send invalidation requests to all GuCs, which are expected to be already in the VGT mode. Fixes:68ae022278("drm/xe/pf: Force GuC virtualization mode") Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com> Cc: Jonathan Cavitt <jonathan.cavitt@intel.com> Link: https://lore.kernel.org/r/20250801142822.180530-3-michal.wajdeczko@intel.com (cherry picked from commitc6c86441c4) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
c286ce6b01
commit
cb7a3f949a
|
|
@ -16,6 +16,7 @@
|
|||
#include "xe_gt_sriov_pf_migration.h"
|
||||
#include "xe_gt_sriov_pf_service.h"
|
||||
#include "xe_gt_sriov_printk.h"
|
||||
#include "xe_guc_submit.h"
|
||||
#include "xe_mmio.h"
|
||||
#include "xe_pm.h"
|
||||
|
||||
|
|
@ -260,3 +261,27 @@ void xe_gt_sriov_pf_restart(struct xe_gt *gt)
|
|||
{
|
||||
pf_queue_restart(gt);
|
||||
}
|
||||
|
||||
static void pf_flush_restart(struct xe_gt *gt)
|
||||
{
|
||||
xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
|
||||
flush_work(>->sriov.pf.workers.restart);
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_gt_sriov_pf_wait_ready() - Wait until per-GT PF SR-IOV support is ready.
|
||||
* @gt: the &xe_gt
|
||||
*
|
||||
* This function can only be called on PF.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int xe_gt_sriov_pf_wait_ready(struct xe_gt *gt)
|
||||
{
|
||||
/* don't wait if there is another ongoing reset */
|
||||
if (xe_guc_read_stopped(>->uc.guc))
|
||||
return -EBUSY;
|
||||
|
||||
pf_flush_restart(gt);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ struct xe_gt;
|
|||
#ifdef CONFIG_PCI_IOV
|
||||
int xe_gt_sriov_pf_init_early(struct xe_gt *gt);
|
||||
int xe_gt_sriov_pf_init(struct xe_gt *gt);
|
||||
int xe_gt_sriov_pf_wait_ready(struct xe_gt *gt);
|
||||
void xe_gt_sriov_pf_init_hw(struct xe_gt *gt);
|
||||
void xe_gt_sriov_pf_sanitize_hw(struct xe_gt *gt, unsigned int vfid);
|
||||
void xe_gt_sriov_pf_stop_prepare(struct xe_gt *gt);
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include "xe_gt_sriov_pf_policy.h"
|
||||
#include "xe_gt_sriov_pf_service.h"
|
||||
#include "xe_pm.h"
|
||||
#include "xe_sriov_pf.h"
|
||||
|
||||
/*
|
||||
* /sys/kernel/debug/dri/0/
|
||||
|
|
@ -205,7 +206,8 @@ static int CONFIG##_set(void *data, u64 val) \
|
|||
return -EOVERFLOW; \
|
||||
\
|
||||
xe_pm_runtime_get(xe); \
|
||||
err = xe_gt_sriov_pf_config_set_##CONFIG(gt, vfid, val); \
|
||||
err = xe_sriov_pf_wait_ready(xe) ?: \
|
||||
xe_gt_sriov_pf_config_set_##CONFIG(gt, vfid, val); \
|
||||
xe_pm_runtime_put(xe); \
|
||||
\
|
||||
return err; \
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include "xe_pci_sriov.h"
|
||||
#include "xe_pm.h"
|
||||
#include "xe_sriov.h"
|
||||
#include "xe_sriov_pf.h"
|
||||
#include "xe_sriov_pf_helpers.h"
|
||||
#include "xe_sriov_printk.h"
|
||||
|
||||
|
|
@ -138,6 +139,10 @@ static int pf_enable_vfs(struct xe_device *xe, int num_vfs)
|
|||
xe_assert(xe, num_vfs <= total_vfs);
|
||||
xe_sriov_dbg(xe, "enabling %u VF%s\n", num_vfs, str_plural(num_vfs));
|
||||
|
||||
err = xe_sriov_pf_wait_ready(xe);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* We must hold additional reference to the runtime PM to keep PF in D0
|
||||
* during VFs lifetime, as our VFs do not implement the PM capability.
|
||||
|
|
@ -169,7 +174,7 @@ static int pf_enable_vfs(struct xe_device *xe, int num_vfs)
|
|||
failed:
|
||||
pf_unprovision_vfs(xe, num_vfs);
|
||||
xe_pm_runtime_put(xe);
|
||||
|
||||
out:
|
||||
xe_sriov_notice(xe, "Failed to enable %u VF%s (%pe)\n",
|
||||
num_vfs, str_plural(num_vfs), ERR_PTR(err));
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "xe_assert.h"
|
||||
#include "xe_device.h"
|
||||
#include "xe_gt_sriov_pf.h"
|
||||
#include "xe_module.h"
|
||||
#include "xe_sriov.h"
|
||||
#include "xe_sriov_pf.h"
|
||||
|
|
@ -102,6 +103,32 @@ int xe_sriov_pf_init_early(struct xe_device *xe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_sriov_pf_wait_ready() - Wait until PF is ready to operate.
|
||||
* @xe: the &xe_device to test
|
||||
*
|
||||
* This function can only be called on PF.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int xe_sriov_pf_wait_ready(struct xe_device *xe)
|
||||
{
|
||||
struct xe_gt *gt;
|
||||
unsigned int id;
|
||||
int err;
|
||||
|
||||
if (xe_device_wedged(xe))
|
||||
return -ECANCELED;
|
||||
|
||||
for_each_gt(gt, xe, id) {
|
||||
err = xe_gt_sriov_pf_wait_ready(gt);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_sriov_pf_print_vfs_summary - Print SR-IOV PF information.
|
||||
* @xe: the &xe_device to print info from
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ struct xe_device;
|
|||
#ifdef CONFIG_PCI_IOV
|
||||
bool xe_sriov_pf_readiness(struct xe_device *xe);
|
||||
int xe_sriov_pf_init_early(struct xe_device *xe);
|
||||
int xe_sriov_pf_wait_ready(struct xe_device *xe);
|
||||
void xe_sriov_pf_debugfs_register(struct xe_device *xe, struct dentry *root);
|
||||
void xe_sriov_pf_print_vfs_summary(struct xe_device *xe, struct drm_printer *p);
|
||||
#else
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user