drm/xe/pf: Add _locked variant of the doorbells bulk config function

We will soon want to provision all VFs, including their GuC doorbell
IDs config, in one step. Split existing doorbells bulk configuration
function into two functions, one of which will expect the master lock
to be already taken. Use this new function in the fair GuC doorbells
provisioning.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Reviewed-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Link: https://patch.msgid.link/20260807164826.5650-1-michal.wajdeczko@intel.com
This commit is contained in:
Michal Wajdeczko 2026-08-07 18:48:26 +02:00
parent 9147b754f0
commit 267deefc46
2 changed files with 42 additions and 23 deletions

View File

@ -1397,7 +1397,41 @@ int xe_gt_sriov_pf_config_set_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_d
}
/**
* xe_gt_sriov_pf_config_bulk_set_dbs - Provision many VFs with GuC context IDs.
* xe_gt_sriov_pf_config_bulk_set_dbs_locked() - Provision many VFs with GuC doorbells.
* @gt: the &xe_gt
* @vfid: starting VF identifier (can't be 0)
* @num_vfs: number of VFs to provision
* @num_dbs: requested number of GuC doorbell IDs (0 to release)
*
* This function can only be called on PF.
*
* Return: 0 on success or a negative error code on failure.
*/
int xe_gt_sriov_pf_config_bulk_set_dbs_locked(struct xe_gt *gt, unsigned int vfid,
unsigned int num_vfs, u32 num_dbs)
{
unsigned int n;
int err = 0;
xe_gt_assert(gt, vfid);
lockdep_assert_held(xe_gt_sriov_pf_master_mutex(gt));
if (!num_vfs)
return 0;
for (n = vfid; n < vfid + num_vfs; n++) {
err = pf_provision_vf_dbs(gt, n, num_dbs);
if (err)
break;
}
return pf_config_bulk_set_u32_done(gt, vfid, num_vfs, num_dbs,
pf_get_vf_config_dbs,
"GuC doorbell IDs", no_unit, n, err);
}
/**
* xe_gt_sriov_pf_config_bulk_set_dbs() - Provision many VFs with GuC doorbells.
* @gt: the &xe_gt
* @vfid: starting VF identifier (can't be 0)
* @num_vfs: number of VFs to provision
@ -1410,25 +1444,9 @@ int xe_gt_sriov_pf_config_set_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_d
int xe_gt_sriov_pf_config_bulk_set_dbs(struct xe_gt *gt, unsigned int vfid,
unsigned int num_vfs, u32 num_dbs)
{
unsigned int n;
int err = 0;
guard(mutex)(xe_gt_sriov_pf_master_mutex(gt));
xe_gt_assert(gt, vfid);
if (!num_vfs)
return 0;
mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
for (n = vfid; n < vfid + num_vfs; n++) {
err = pf_provision_vf_dbs(gt, n, num_dbs);
if (err)
break;
}
mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
return pf_config_bulk_set_u32_done(gt, vfid, num_vfs, num_dbs,
xe_gt_sriov_pf_config_get_dbs,
"GuC doorbell IDs", no_unit, n, err);
return xe_gt_sriov_pf_config_bulk_set_dbs_locked(gt, vfid, num_vfs, num_dbs);
}
static u32 pf_profile_fair_dbs(struct xe_gt *gt, unsigned int num_vfs)
@ -1480,10 +1498,9 @@ int xe_gt_sriov_pf_config_set_fair_dbs(struct xe_gt *gt, unsigned int vfid,
xe_gt_assert(gt, vfid);
xe_gt_assert(gt, num_vfs);
mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
fair = pf_estimate_fair_dbs(gt, num_vfs);
mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
guard(mutex)(xe_gt_sriov_pf_master_mutex(gt));
fair = pf_estimate_fair_dbs(gt, num_vfs);
if (!fair)
return -ENOSPC;
@ -1492,7 +1509,7 @@ int xe_gt_sriov_pf_config_set_fair_dbs(struct xe_gt *gt, unsigned int vfid,
xe_gt_sriov_info(gt, "Using non-profile provisioning (%s %u vs %u)\n",
"GuC doorbell IDs", fair, profile);
return xe_gt_sriov_pf_config_bulk_set_dbs(gt, vfid, num_vfs, fair);
return xe_gt_sriov_pf_config_bulk_set_dbs_locked(gt, vfid, num_vfs, fair);
}
static u64 pf_get_lmem_alignment(struct xe_gt *gt)

View File

@ -34,6 +34,8 @@ int xe_gt_sriov_pf_config_set_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_d
int xe_gt_sriov_pf_config_set_fair_dbs(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs);
int xe_gt_sriov_pf_config_bulk_set_dbs(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs,
u32 num_dbs);
int xe_gt_sriov_pf_config_bulk_set_dbs_locked(struct xe_gt *gt, unsigned int vfid,
unsigned int num_vfs, u32 num_dbs);
u64 xe_gt_sriov_pf_config_get_lmem(struct xe_gt *gt, unsigned int vfid);
int xe_gt_sriov_pf_config_set_lmem(struct xe_gt *gt, unsigned int vfid, u64 size);