mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
ufs: Sync possible UFS Quirks with Linux UFS driver
Sync u-boot UFS driver to add all possible UFS Quirks as supported by Linux UFS driver as well. Synced with include/ufs/ufshcd.h from Linux v6.11 release Signed-off-by: Bhupesh Sharma <bhupesh.sharma@linaro.org> Tested-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com> Tested-by: Julius Lehmann <lehmanju@devpi.de> Link: https://lore.kernel.org/r/20240930-topic-ufs-enhancements-v3-9-58234f84ab89@linaro.org Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
This commit is contained in:
committed by
Neil Armstrong
parent
002afccdaf
commit
00c54af3ad
@@ -703,6 +703,169 @@ struct ufs_hba_ops {
|
||||
int (*phy_initialization)(struct ufs_hba *hba);
|
||||
};
|
||||
|
||||
enum ufshcd_quirks {
|
||||
/* Interrupt aggregation support is broken */
|
||||
UFSHCD_QUIRK_BROKEN_INTR_AGGR = 1 << 0,
|
||||
|
||||
/*
|
||||
* delay before each dme command is required as the unipro
|
||||
* layer has shown instabilities
|
||||
*/
|
||||
UFSHCD_QUIRK_DELAY_BEFORE_DME_CMDS = 1 << 1,
|
||||
|
||||
/*
|
||||
* If UFS host controller is having issue in processing LCC (Line
|
||||
* Control Command) coming from device then enable this quirk.
|
||||
* When this quirk is enabled, host controller driver should disable
|
||||
* the LCC transmission on UFS device (by clearing TX_LCC_ENABLE
|
||||
* attribute of device to 0).
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_LCC = 1 << 2,
|
||||
|
||||
/*
|
||||
* The attribute PA_RXHSUNTERMCAP specifies whether or not the
|
||||
* inbound Link supports unterminated line in HS mode. Setting this
|
||||
* attribute to 1 fixes moving to HS gear.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_PA_RXHSUNTERMCAP = 1 << 3,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller only allows
|
||||
* accessing the peer dme attributes in AUTO mode (FAST AUTO or
|
||||
* SLOW AUTO).
|
||||
*/
|
||||
UFSHCD_QUIRK_DME_PEER_ACCESS_AUTO_MODE = 1 << 4,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller doesn't
|
||||
* advertise the correct version in UFS_VER register. If this quirk
|
||||
* is enabled, standard UFS host driver will call the vendor specific
|
||||
* ops (get_ufs_hci_version) to get the correct version.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION = 1 << 5,
|
||||
|
||||
/*
|
||||
* Clear handling for transfer/task request list is just opposite.
|
||||
*/
|
||||
UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR = 1 << 6,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if host controller doesn't allow
|
||||
* that the interrupt aggregation timer and counter are reset by s/w.
|
||||
*/
|
||||
UFSHCI_QUIRK_SKIP_RESET_INTR_AGGR = 1 << 7,
|
||||
|
||||
/*
|
||||
* This quirks needs to be enabled if host controller cannot be
|
||||
* enabled via HCE register.
|
||||
*/
|
||||
UFSHCI_QUIRK_BROKEN_HCE = 1 << 8,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller regards
|
||||
* resolution of the values of PRDTO and PRDTL in UTRD as byte.
|
||||
*/
|
||||
UFSHCD_QUIRK_PRDT_BYTE_GRAN = 1 << 9,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller reports
|
||||
* OCS FATAL ERROR with device error through sense data
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR = 1 << 10,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* auto-hibernate capability but it doesn't work.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8 = 1 << 11,
|
||||
|
||||
/*
|
||||
* This quirk needs to disable manual flush for write booster
|
||||
*/
|
||||
UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL = 1 << 12,
|
||||
|
||||
/*
|
||||
* This quirk needs to disable unipro timeout values
|
||||
* before power mode change
|
||||
*/
|
||||
UFSHCD_QUIRK_SKIP_DEF_UNIPRO_TIMEOUT_SETTING = 1 << 13,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller does not
|
||||
* support UIC command
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_UIC_CMD = 1 << 15,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller cannot
|
||||
* support physical host configuration.
|
||||
*/
|
||||
UFSHCD_QUIRK_SKIP_PH_CONFIGURATION = 1 << 16,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* 64-bit addressing supported capability but it doesn't work.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS = 1 << 17,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* auto-hibernate capability but it's FASTAUTO only.
|
||||
*/
|
||||
UFSHCD_QUIRK_HIBERN_FASTAUTO = 1 << 18,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller needs
|
||||
* to reinit the device after switching to maximum gear.
|
||||
*/
|
||||
UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH = 1 << 19,
|
||||
|
||||
/*
|
||||
* Some host raises interrupt (per queue) in addition to
|
||||
* CQES (traditional) when ESI is disabled.
|
||||
* Enable this quirk will disable CQES and use per queue interrupt.
|
||||
*/
|
||||
UFSHCD_QUIRK_MCQ_BROKEN_INTR = 1 << 20,
|
||||
|
||||
/*
|
||||
* Some host does not implement SQ Run Time Command (SQRTC) register
|
||||
* thus need this quirk to skip related flow.
|
||||
*/
|
||||
UFSHCD_QUIRK_MCQ_BROKEN_RTC = 1 << 21,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller supports inline
|
||||
* encryption but it needs to initialize the crypto capabilities in a
|
||||
* nonstandard way and/or needs to override blk_crypto_ll_ops. If
|
||||
* enabled, the standard code won't initialize the blk_crypto_profile;
|
||||
* ufs_hba_variant_ops::init() must do it instead.
|
||||
*/
|
||||
UFSHCD_QUIRK_CUSTOM_CRYPTO_PROFILE = 1 << 22,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller supports inline
|
||||
* encryption but does not support the CRYPTO_GENERAL_ENABLE bit, i.e.
|
||||
* host controller initialization fails if that bit is set.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE = 1 << 23,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller driver copies
|
||||
* cryptographic keys into the PRDT in order to send them to hardware,
|
||||
* and therefore the PRDT should be zeroized after each request (as per
|
||||
* the standard best practice for managing keys).
|
||||
*/
|
||||
UFSHCD_QUIRK_KEYS_IN_PRDT = 1 << 24,
|
||||
|
||||
/*
|
||||
* This quirk indicates that the controller reports the value 1 (not
|
||||
* supported) in the Legacy Single DoorBell Support (LSDBS) bit of the
|
||||
* Controller Capabilities register although it supports the legacy
|
||||
* single doorbell mode.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_LSDBS_CAP = 1 << 25,
|
||||
};
|
||||
|
||||
struct ufs_hba {
|
||||
struct udevice *dev;
|
||||
void __iomem *mmio_base;
|
||||
@@ -711,39 +874,7 @@ struct ufs_hba {
|
||||
u32 capabilities;
|
||||
u32 version;
|
||||
u32 intr_mask;
|
||||
u32 quirks;
|
||||
/*
|
||||
* If UFS host controller is having issue in processing LCC (Line
|
||||
* Control Command) coming from device then enable this quirk.
|
||||
* When this quirk is enabled, host controller driver should disable
|
||||
* the LCC transmission on UFS device (by clearing TX_LCC_ENABLE
|
||||
* attribute of device to 0).
|
||||
*/
|
||||
#define UFSHCD_QUIRK_BROKEN_LCC BIT(0)
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* 64-bit addressing supported capability but it doesn't work.
|
||||
*/
|
||||
#define UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS BIT(1)
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* auto-hibernate capability but it's FASTAUTO only.
|
||||
*/
|
||||
#define UFSHCD_QUIRK_HIBERN_FASTAUTO BIT(2)
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* 64-bit addressing supported capability but it doesn't work.
|
||||
*/
|
||||
#define UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS 0x2
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* auto-hibernate capability but it's FASTAUTO only.
|
||||
*/
|
||||
#define UFSHCD_QUIRK_HIBERN_FASTAUTO 0x4
|
||||
enum ufshcd_quirks quirks;
|
||||
|
||||
/* Virtual memory reference */
|
||||
struct utp_transfer_cmd_desc *ucdl;
|
||||
|
||||
Reference in New Issue
Block a user