Commit bfbcf661 authored by Michal Wajdeczko's avatar Michal Wajdeczko
Browse files

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: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: default avatarPiotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://patch.msgid.link/20251105183253.863-3-michal.wajdeczko@intel.com
parent 8fb1d7d3
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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 = &gt->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);
}