Commit d7bead60 authored by Can Guo's avatar Can Guo Committed by Martin K. Petersen
Browse files

scsi: ufs: core: Add a vop to map clock frequency to gear speed



Add a vop to map UFS host controller clock frequencies to the corresponding
maximum supported UFS high speed gear speeds. During clock scaling, we can
map the target clock frequency, demanded by devfreq, to the maximum
supported gear speed, so that devfreq can scale the gear to the highest
gear speed supported at the target clock frequency, instead of just scaling
up/down the gear between the min and max gear speeds.

Co-developed-by: default avatarZiqi Chen <quic_ziqichen@quicinc.com>
Signed-off-by: default avatarZiqi Chen <quic_ziqichen@quicinc.com>
Signed-off-by: default avatarCan Guo <quic_cang@quicinc.com>
Link: https://lore.kernel.org/r/20250213080008.2984807-4-quic_ziqichen@quicinc.com


Reviewed-by: default avatarBean Huo <beanhuo@micron.com>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Tested-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: default avatarPeter Wang <peter.wang@mediatek.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 367a0f01
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -271,6 +271,14 @@ static inline int ufshcd_mcq_vops_config_esi(struct ufs_hba *hba)
	return -EOPNOTSUPP;
}

static inline u32 ufshcd_vops_freq_to_gear_speed(struct ufs_hba *hba, unsigned long freq)
{
	if (hba->vops && hba->vops->freq_to_gear_speed)
		return hba->vops->freq_to_gear_speed(hba, freq);

	return 0;
}

extern const struct ufs_pm_lvl_states ufs_pm_lvl_states[];

/**
+2 −0
Original line number Diff line number Diff line
@@ -336,6 +336,7 @@ struct ufs_pwr_mode_info {
 * @get_outstanding_cqs: called to get outstanding completion queues
 * @config_esi: called to config Event Specific Interrupt
 * @config_scsi_dev: called to configure SCSI device parameters
 * @freq_to_gear_speed: called to map clock frequency to the max supported gear speed
 */
struct ufs_hba_variant_ops {
	const char *name;
@@ -384,6 +385,7 @@ struct ufs_hba_variant_ops {
				       unsigned long *ocqs);
	int	(*config_esi)(struct ufs_hba *hba);
	void	(*config_scsi_dev)(struct scsi_device *sdev);
	u32	(*freq_to_gear_speed)(struct ufs_hba *hba, unsigned long freq);
};

/* clock gating state  */