mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/xe/pf: Use migration-friendly doorbells auto-provisioning
Instead of trying very hard to find the largest fair number of GuC
doorbell IDs that could be allocated for VFs on the current GT, pick
some smaller rounded down to power-of-two value that is more likely
to be provisioned in the same manner by the other PF instance:
num VFs | num doorbells
--------+--------------
63..32 | 4
31..16 | 8
15..8 | 16
7..4 | 32
3..2 | 64
1 | 128 (regular PF)
1 | 240 (admin only PF)
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://patch.msgid.link/20251105183253.863-3-michal.wajdeczko@intel.com
This commit is contained in:
@@ -1249,6 +1249,17 @@ int xe_gt_sriov_pf_config_bulk_set_dbs(struct xe_gt *gt, unsigned int vfid,
|
||||
"GuC doorbell IDs", no_unit, n, err);
|
||||
}
|
||||
|
||||
static u32 pf_profile_fair_dbs(struct xe_gt *gt, unsigned int num_vfs)
|
||||
{
|
||||
bool admin_only_pf = xe_sriov_pf_admin_only(gt_to_xe(gt));
|
||||
|
||||
/* XXX: preliminary */
|
||||
if (admin_only_pf && num_vfs == 1)
|
||||
return GUC_NUM_DOORBELLS - SZ_16;
|
||||
|
||||
return rounddown_pow_of_two(GUC_NUM_DOORBELLS / (num_vfs + 1));
|
||||
}
|
||||
|
||||
static u32 pf_estimate_fair_dbs(struct xe_gt *gt, unsigned int num_vfs)
|
||||
{
|
||||
struct xe_guc_db_mgr *dbm = >->uc.guc.dbm;
|
||||
@@ -1281,6 +1292,7 @@ static u32 pf_estimate_fair_dbs(struct xe_gt *gt, unsigned int num_vfs)
|
||||
int xe_gt_sriov_pf_config_set_fair_dbs(struct xe_gt *gt, unsigned int vfid,
|
||||
unsigned int num_vfs)
|
||||
{
|
||||
u32 profile = pf_profile_fair_dbs(gt, num_vfs);
|
||||
u32 fair;
|
||||
|
||||
xe_gt_assert(gt, vfid);
|
||||
@@ -1293,6 +1305,11 @@ int xe_gt_sriov_pf_config_set_fair_dbs(struct xe_gt *gt, unsigned int vfid,
|
||||
if (!fair)
|
||||
return -ENOSPC;
|
||||
|
||||
fair = min(fair, profile);
|
||||
if (fair < profile)
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user