After a reset we missed to reprovision VFs scheduling priority config.
But as of today, the GuC firmware allows to change scheduling priority
using config SCHED_PRIORITY KLV only for the PF and configuration of
all VFs relies on the previously applied value of the SCHED_IF_IDLE
policy. Use this policy value to check and decide whether we need to
encode VF priority KLV while reprovisioning this VF.
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://patch.msgid.link/20260402191726.4932-8-michal.wajdeczko@intel.com
return encode_ggtt(cfg, xe_ggtt_node_addr(node), xe_ggtt_node_size(node), details);
}
+static bool custom_sched_priority(struct xe_gt *gt, u32 priority)
+{
+ return xe_gt_sriov_pf_policy_get_sched_if_idle_locked(gt) ?
+ priority != GUC_SCHED_PRIORITY_NORMAL :
+ priority != GUC_SCHED_PRIORITY_LOW;
+}
+
static u32 encode_config_sched(struct xe_gt *gt, u32 *cfg, u32 n,
const struct xe_gt_sriov_config *config)
{
cfg[n++] = config->preempt_timeout[0];
}
+ if (custom_sched_priority(gt, config->sched_priority)) {
+ cfg[n++] = PREP_GUC_KLV_TAG(VF_CFG_SCHED_PRIORITY);
+ cfg[n++] = config->sched_priority;
+ }
+
return n;
}
return 0;
}
+/**
+ * xe_gt_sriov_pf_policy_get_sched_if_idle_locked() - Retrieve value of 'sched_if_idle' policy.
+ * @gt: the &xe_gt where to read the policy from
+ *
+ * This function can only be called on PF.
+ *
+ * Return: last value of 'sched_if_idle' policy applied.
+ */
+bool xe_gt_sriov_pf_policy_get_sched_if_idle_locked(struct xe_gt *gt)
+{
+ xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+ lockdep_assert_held(xe_gt_sriov_pf_master_mutex(gt));
+
+ return gt->sriov.pf.policy.guc.sched_if_idle;
+}
+
/**
* xe_gt_sriov_pf_policy_get_sched_if_idle - Retrieve value of 'sched_if_idle' policy.
* @gt: the &xe_gt where to read the policy from
*/
bool xe_gt_sriov_pf_policy_get_sched_if_idle(struct xe_gt *gt)
{
- bool enable;
-
xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+ guard(mutex)(xe_gt_sriov_pf_master_mutex(gt));
- mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
- enable = gt->sriov.pf.policy.guc.sched_if_idle;
- mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
-
- return enable;
+ return xe_gt_sriov_pf_policy_get_sched_if_idle_locked(gt);
}
static int pf_provision_reset_engine(struct xe_gt *gt, bool enable)
int xe_gt_sriov_pf_policy_set_sched_if_idle(struct xe_gt *gt, bool enable);
bool xe_gt_sriov_pf_policy_get_sched_if_idle(struct xe_gt *gt);
+bool xe_gt_sriov_pf_policy_get_sched_if_idle_locked(struct xe_gt *gt);
int xe_gt_sriov_pf_policy_set_reset_engine(struct xe_gt *gt, bool enable);
bool xe_gt_sriov_pf_policy_get_reset_engine(struct xe_gt *gt);
int xe_gt_sriov_pf_policy_set_sample_period(struct xe_gt *gt, u32 value);