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

scsi: ufs: core: Maximum RTT supported by the host driver

Allow platform vendors to take precedence having their own max rtt support.
This makes sense because the host controller's nortt characteristic may
vary among vendors.

while at it, set this value for Mediatek, as requested by Peter -
https://lore.kernel.org/all/0a57d6bab739d6a10584f2baba115d00dfc9c94c.camel@mediatek.com/

Signed-off-by: Avri Altman <avri.altman@wdc.com>
Link: https://lore.kernel.org/r/20240530142510.734-3-avri.altman@wdc.com
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Avri Altman and committed by
Martin K. Petersen
e75ff633 9ec54934

+10 -1
+4 -1
drivers/ufs/core/ufshcd.c
··· 8131 8131 struct ufs_dev_info *dev_info = &hba->dev_info; 8132 8132 u32 rtt = 0; 8133 8133 u32 dev_rtt = 0; 8134 + int host_rtt_cap = hba->vops && hba->vops->max_num_rtt ? 8135 + hba->vops->max_num_rtt : hba->nortt; 8134 8136 8135 8137 /* RTT override makes sense only for UFS-4.0 and above */ 8136 8138 if (dev_info->wspecversion < 0x400) ··· 8148 8146 if (dev_rtt != DEFAULT_MAX_NUM_RTT) 8149 8147 return; 8150 8148 8151 - rtt = min_t(int, dev_info->rtt_cap, hba->nortt); 8149 + rtt = min_t(int, dev_info->rtt_cap, host_rtt_cap); 8150 + 8152 8151 if (rtt == dev_rtt) 8153 8152 return; 8154 8153
+1
drivers/ufs/host/ufs-mediatek.c
··· 1785 1785 */ 1786 1786 static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = { 1787 1787 .name = "mediatek.ufshci", 1788 + .max_num_rtt = MTK_MAX_NUM_RTT, 1788 1789 .init = ufs_mtk_init, 1789 1790 .get_ufs_hci_version = ufs_mtk_get_ufs_hci_version, 1790 1791 .setup_clocks = ufs_mtk_setup_clocks,
+3
drivers/ufs/host/ufs-mediatek.h
··· 189 189 /* MTK delay of autosuspend: 500 ms */ 190 190 #define MTK_RPM_AUTOSUSPEND_DELAY_MS 500 191 191 192 + /* MTK RTT support number */ 193 + #define MTK_MAX_NUM_RTT 2 194 + 192 195 #endif /* !_UFS_MEDIATEK_H */
+2
include/ufs/ufshcd.h
··· 295 295 /** 296 296 * struct ufs_hba_variant_ops - variant specific callbacks 297 297 * @name: variant name 298 + * @max_num_rtt: maximum RTT supported by the host 298 299 * @init: called when the driver is initialized 299 300 * @exit: called to cleanup everything done in init 300 301 * @get_ufs_hci_version: called to get UFS HCI version ··· 333 332 */ 334 333 struct ufs_hba_variant_ops { 335 334 const char *name; 335 + int max_num_rtt; 336 336 int (*init)(struct ufs_hba *); 337 337 void (*exit)(struct ufs_hba *); 338 338 u32 (*get_ufs_hci_version)(struct ufs_hba *);