Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/xe/pf: Clamp maximum execution quantum to 100s

GuC is silently clamping values of the execution quantum and
preemption timeout KLVs to 100s. Perform explicit clamping on the
driver side as later there is no way to read back values used by
the firmware and we shouldn't mislead the user about actual values
being used when we print them in dmesg or debugfs.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240419123543.270-3-michal.wajdeczko@intel.com

+12 -6
+12 -6
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
··· 187 187 return pf_push_vf_cfg_klvs(gt, vfid, 2, klvs, ARRAY_SIZE(klvs)); 188 188 } 189 189 190 - static int pf_push_vf_cfg_exec_quantum(struct xe_gt *gt, unsigned int vfid, u32 exec_quantum) 190 + static int pf_push_vf_cfg_exec_quantum(struct xe_gt *gt, unsigned int vfid, u32 *exec_quantum) 191 191 { 192 - return pf_push_vf_cfg_u32(gt, vfid, GUC_KLV_VF_CFG_EXEC_QUANTUM_KEY, exec_quantum); 192 + /* GuC will silently clamp values exceeding max */ 193 + *exec_quantum = min_t(u32, *exec_quantum, GUC_KLV_VF_CFG_EXEC_QUANTUM_MAX_VALUE); 194 + 195 + return pf_push_vf_cfg_u32(gt, vfid, GUC_KLV_VF_CFG_EXEC_QUANTUM_KEY, *exec_quantum); 193 196 } 194 197 195 - static int pf_push_vf_cfg_preempt_timeout(struct xe_gt *gt, unsigned int vfid, u32 preempt_timeout) 198 + static int pf_push_vf_cfg_preempt_timeout(struct xe_gt *gt, unsigned int vfid, u32 *preempt_timeout) 196 199 { 197 - return pf_push_vf_cfg_u32(gt, vfid, GUC_KLV_VF_CFG_PREEMPT_TIMEOUT_KEY, preempt_timeout); 200 + /* GuC will silently clamp values exceeding max */ 201 + *preempt_timeout = min_t(u32, *preempt_timeout, GUC_KLV_VF_CFG_PREEMPT_TIMEOUT_MAX_VALUE); 202 + 203 + return pf_push_vf_cfg_u32(gt, vfid, GUC_KLV_VF_CFG_PREEMPT_TIMEOUT_KEY, *preempt_timeout); 198 204 } 199 205 200 206 static int pf_push_vf_cfg_lmem(struct xe_gt *gt, unsigned int vfid, u64 size) ··· 1610 1604 struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid); 1611 1605 int err; 1612 1606 1613 - err = pf_push_vf_cfg_exec_quantum(gt, vfid, exec_quantum); 1607 + err = pf_push_vf_cfg_exec_quantum(gt, vfid, &exec_quantum); 1614 1608 if (unlikely(err)) 1615 1609 return err; 1616 1610 ··· 1680 1674 struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid); 1681 1675 int err; 1682 1676 1683 - err = pf_push_vf_cfg_preempt_timeout(gt, vfid, preempt_timeout); 1677 + err = pf_push_vf_cfg_preempt_timeout(gt, vfid, &preempt_timeout); 1684 1678 if (unlikely(err)) 1685 1679 return err; 1686 1680