[PATCH 1/6] ufs: Add UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS

Bhupesh Sharma bhupesh.sharma at linaro.org
Tue Aug 15 22:04:28 CEST 2023


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.

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.

Thanks,
Bhupesh


More information about the U-Boot mailing list