scsi: ufs: Fix hynix ufs bug with quirk on hi36xx SoC
PATCH RESEND 1/1 scsi: ufs: Fix hynix ufs bug with quirk on hi36xx SoC
From: Wei Li <[email protected]>
Hynix ufs has deviations on hi36xx platform which will result in ufs bursts transfer failures.
To fix the problem, the Hynix device must set the register VS_DebugSaveConfigTime to 0x10, which will set time reference for SaveConfigTime is 250 ns. The time reference for SaveConfigTime is 40 ns by default.
This patch is necessary to boot on HiKey960 boards that use Hynix UFS chips.
--- drivers/scsi/ufs/ufs-hisi.c | 9 +++++++++ drivers/scsi/ufs/ufs_quirks.h | 6 ++++++ drivers/scsi/ufs/ufshcd.c | 2 ++ 3 files changed, 17 insertions(+)
drivers/scsi/ufs/ufs-hisi.c +9 -0
@@ -20,6 +20,7 @@#include "unipro.h" #include "ufs-hisi.h" #include "ufshci.h" +#include "ufs_quirks.h" static int ufs_hisi_check_hibern8 (struct ufs_hba *hba) {
@@ -390,6 +391,14 @@ static void ufs_hisi_set_dev_cap(struct ufs_hisi_dev_params *hisi_param)static void ufs_hisi_pwr_change_pre_change (struct ufs_hba *hba) { +if (hba->dev_quirks &UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME ) { +pr_info ("ufs flash device must set VS_DebugSaveConfigTime 0x10\n" ); +/* VS_DebugSaveConfigTime */ +ufshcd_dme_set (hba,UIC_ARG_MIB (0xD0A0 ),0x10 ); +/* sync length */ +ufshcd_dme_set (hba,UIC_ARG_MIB (0x1556 ),0x48 ); + } +/* update */ ufshcd_dme_set (hba,UIC_ARG_MIB (0x15A8 ),0x1 );/* PA_TxSkip */
drivers/scsi/ufs/ufs_quirks.h +6 -0
@@ -131,4 +131,10 @@ struct ufs_dev_fix {*/ #define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8) +/* +* Some UFS devices require VS_DebugSaveConfigTime is 0x10, +* enabling this quirk ensure this. +*/ +#define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9) +#endif /* UFS_QUIRKS_H_ */
drivers/scsi/ufs/ufshcd.c +2 -0
@@ -230,6 +230,8 @@ static struct ufs_dev_fix ufs_fixups[] = {UFS_FIX (UFS_VENDOR_SKHYNIX ,UFS_ANY_MODEL ,UFS_DEVICE_NO_VCCQ ),UFS_FIX (UFS_VENDOR_SKHYNIX ,UFS_ANY_MODEL ,UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME ), +UFS_FIX (UFS_VENDOR_SKHYNIX ,UFS_ANY_MODEL , +UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME ), END_FIX };
Signature · 1 line
2.7.4
John,
Quoted 2 lines
Hynix ufs has deviations on hi36xx platform which will result in ufs bursts transfer failures.
Is this specific to the particular implementation on hi36xx or all SK Hynix implementations?
drivers/scsi/ufs/ufshcd.c static struct ufs_dev_fix ufs_fixups[] = { · line 234
Quoted 2 lines
drivers/scsi/ufs/ufshcd.c +2
-0+UFS_FIX (UFS_VENDOR_SKHYNIX ,UFS_ANY_MODEL , + UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME),
I am not so keen on matching on all current and future models.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Quoted 8 lines · Martin K. Petersen
John,
Quoted 2 lines
Hynix ufs has deviations on hi36xx platform which will result in ufs bursts transfer failures.
Is this specific to the particular implementation on hi36xx or all SK Hynix implementations?
I'd have to defer to Wei Li on that question.
Wei Li?
Quoted 4 lines
drivers/scsi/ufs/ufshcd.c static struct ufs_dev_fix ufs_fixups[] = { · line 234
Quoted 2 lines
drivers/scsi/ufs/ufshcd.c +2
-0+UFS_FIX (UFS_VENDOR_SKHYNIX ,UFS_ANY_MODEL , + UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME),I am not so keen on matching on all current and future models.
I'll see if I can narrow down the affected model version on the board I have. Hopefully it doesn't vary too much.
Really appreciate the review and the feedback!
thanks
-john
Quoted 8 lines · John Stultz
Quoted 6 lines · Martin K. Petersen
John,
Quoted 2 lines
Hynix ufs has deviations on hi36xx platform which will result in ufs bursts transfer failures.
Quoted 6 lines
Quoted 2 lines
Is this specific to the particular implementation on hi36xx or all SK Hynix implementations?
I'd have to defer to Wei Li on that question.
Wei Li?
Just to short-cut things a bit, as this is probably an obvious
followup: if it is hi36xx specific, how would you suggest a such a targeted quirk be added? I'm not sure I see how to get to the ufs_dev_desc from the ufs-hisi.c code.
thanks
-john
Quoted 6 lines · John Stultz
Quoted 5 lines · John Stultz
Quoted 3 lines · Martin K. Petersen
John,
Quoted 7 lines
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
Hynix ufs has deviations on hi36xx platform which will result in ufs bursts transfer failures.
Is this specific to the particular implementation on hi36xx or all SK Hynix implementations?
I'd have to defer to Wei Li on that question.
So I followed up with Wei Li and it seems its something specific to hi36xx that the specific hynix chip brings out, which most other chips don't seem to trigger.
Quoted 4 lines
Just to short-cut things a bit, as this is probably an obvious
followup: if it is hi36xx specific, how would you suggest a such a targeted quirk be added? I'm not sure I see how to get to theufs_dev_descfrom theufs-hisi.ccode.
So yea, I've already reworked the quirk to be specific to the one model of hynix chip, but I'm still a bit confused on best practices for handling these quirks on the controller side. If there's a pointer to similar controller side quirks that are device specific, I'd be glad to rework the patch in that fashion. Otherwise I'll just try to figure out how to get to the ufs_dev_desc from ufs-hisi.c
thanks
-john