[PATCH 1/6] ufs: Add UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS
Marek Vasut
marek.vasut at mailbox.org
Tue Aug 15 22:47:08 CEST 2023
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.
> Accordingly I had sent:
> https://lists.denx.de/pipermail/u-boot/2023-August/527217.html
>
> So, I would suggest that we pick these two patches and then I can send
> my patches rebased on the same, but change the .h to support all the
> possible UFS quirks currently supported in Linux so that subsequent
> patches can utilize them in u-boot - which I plan to post next.
See above.
More information about the U-Boot
mailing list