[PATCH 1/6] ufs: Add UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS
Marek Vasut
marek.vasut at mailbox.org
Tue Aug 15 23:40:09 CEST 2023
On 8/15/23 23:08, Bhupesh Sharma wrote:
> On Wed, 16 Aug 2023 at 02:31, Marek Vasut <marek.vasut at mailbox.org> wrote:
>>
>> On 8/15/23 22:04, Bhupesh Sharma wrote:
>>> Hi Marek,
>>>
>>> On 8/14/23 5:22 AM, Marek Vasut wrote:
>>>> Add UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS for host controllers which do not
>>>> support 64-bit addressing.
>>>>
>>>> Ported from Linux kernel commit
>>>> 6554400d6f66 ("scsi: ufs: core: Add UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS")
>>>> with ufs_scsi_buffer_aligned() based on U-Boot generic bounce buffer.
>>>>
>>>> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
>>>> ---
>>>> Cc: Faiz Abbas <faiz_abbas at ti.com>
>>>> ---
>>>> drivers/ufs/ufs.c | 26 ++++++++++++++++++++++++++
>>>> drivers/ufs/ufs.h | 6 ++++++
>>>> 2 files changed, 32 insertions(+)
>>>>
>>>> diff --git a/drivers/ufs/ufs.c b/drivers/ufs/ufs.c
>>>> index 3bf1a95e7f2..da0550d98c6 100644
>>>> --- a/drivers/ufs/ufs.c
>>>> +++ b/drivers/ufs/ufs.c
>>>> @@ -8,6 +8,7 @@
>>>> * Copyright (C) 2019 Texas Instruments Incorporated -
>>>> http://www.ti.com
>>>> */
>>>> +#include <bouncebuf.h>
>>>> #include <charset.h>
>>>> #include <common.h>
>>>> #include <dm.h>
>>>> @@ -1889,6 +1890,8 @@ int ufshcd_probe(struct udevice *ufs_dev, struct
>>>> ufs_hba_ops *hba_ops)
>>>> /* Read capabilties registers */
>>>> hba->capabilities = ufshcd_readl(hba, REG_CONTROLLER_CAPABILITIES);
>>>> + if (hba->quirks & UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS)
>>>> + hba->capabilities &= ~MASK_64_ADDRESSING_SUPPORT;
>>>> /* Get UFS version supported by the controller */
>>>> hba->version = ufshcd_get_ufs_version(hba);
>>>> @@ -1942,8 +1945,31 @@ int ufs_scsi_bind(struct udevice *ufs_dev,
>>>> struct udevice **scsi_devp)
>>>> return ret;
>>>> }
>>>> +#if IS_ENABLED(CONFIG_BOUNCE_BUFFER)
>>>> +static int ufs_scsi_buffer_aligned(struct udevice *scsi_dev, struct
>>>> bounce_buffer *state)
>>>> +{
>>>> +#ifdef CONFIG_PHYS_64BIT
>>>> + struct ufs_hba *hba = dev_get_uclass_priv(scsi_dev->parent);
>>>> + uintptr_t ubuf = (uintptr_t)state->user_buffer;
>>>> + size_t len = state->len_aligned;
>>>> +
>>>> + /* Check if below 32bit boundary */
>>>> + if ((hba->quirks & UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS) &&
>>>> + ((ubuf >> 32) || (ubuf + len) >> 32)) {
>>>> + dev_dbg(scsi_dev, "Buffer above 32bit boundary %lx-%lx\n",
>>>> + ubuf, ubuf + len);
>>>> + return 0;
>>>> + }
>>>> +#endif
>>>> + return 1;
>>>> +}
>>>> +#endif /* CONFIG_BOUNCE_BUFFER */
>>>> +
>>>> static struct scsi_ops ufs_ops = {
>>>> .exec = ufs_scsi_exec,
>>>> +#if IS_ENABLED(CONFIG_BOUNCE_BUFFER)
>>>> + .buffer_aligned = ufs_scsi_buffer_aligned,
>>>> +#endif /* CONFIG_BOUNCE_BUFFER */
>>>> };
>>>> int ufs_probe_dev(int index)
>>>> diff --git a/drivers/ufs/ufs.h b/drivers/ufs/ufs.h
>>>> index 8a38832b05f..070db0dce68 100644
>>>> --- a/drivers/ufs/ufs.h
>>>> +++ b/drivers/ufs/ufs.h
>>>> @@ -719,6 +719,12 @@ struct ufs_hba {
>>>> */
>>>> #define UFSHCD_QUIRK_BROKEN_LCC 0x1
>>>> +/*
>>>> + * 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
>>>> +
>>>> /* Virtual memory reference */
>>>> struct utp_transfer_cmd_desc *ucdl;
>>>> struct utp_transfer_req_desc *utrdl;
>>>
>>> For this and the follow-up patch, I think implementing or at least
>>> supporting all the quirks currently supported by the Linux UFS driver
>>> makes sense as newer controllers do support these quirks.
>>
>> I disagree. There is no point in implementing quirks which cannot be
>> tested or may not even be relevant to U-Boot. Quirks which are needed
>> should be added one by one.
I assume you agree we should not add all quirks at once ?
> But the format you use for adding new quiks in u-boot is still in sync
> with Linux version 3.10. Can we atleast use the newer ( 1<< 7) kind of
> format for consistency.
Feel free to update quirks to BIT() macro.
We should enumerate the quirks in order instead of starting with BIT(7)
however.
More information about the U-Boot
mailing list