linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE
@ 2025-07-07 17:05 André Draszik
  2025-07-07 17:24 ` Bart Van Assche
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: André Draszik @ 2025-07-07 17:05 UTC (permalink / raw)
  To: Alim Akhtar, Peter Griffin, James E.J. Bottomley,
	Martin K. Petersen, Krzysztof Kozlowski, Seungwon Jeon,
	Avri Altman, Kiwoong Kim
  Cc: Tudor Ambarus, Will McVicker, kernel-team, linux-scsi,
	linux-samsung-soc, linux-arm-kernel, linux-kernel, stable,
	André Draszik

On Google gs101, the number of UTP transfer request slots (nutrs) is
32, and in this case the driver ends up programming the UTRL_NEXUS_TYPE
incorrectly as 0.

This is because the left hand side of the shift is 1, which is of type
int, i.e. 31 bits wide. Shifting by more than that width results in
undefined behaviour.

Fix this by switching to the BIT() macro, which applies correct type
casting as required. This ensures the correct value is written to
UTRL_NEXUS_TYPE (0xffffffff on gs101), and it also fixes a UBSAN shift
warning:
    UBSAN: shift-out-of-bounds in drivers/ufs/host/ufs-exynos.c:1113:21
    shift exponent 32 is too large for 32-bit type 'int'

For consistency, apply the same change to the nutmrs / UTMRL_NEXUS_TYPE
write.

Fixes: 55f4b1f73631 ("scsi: ufs: ufs-exynos: Add UFS host support for Exynos SoCs")
Cc: stable@vger.kernel.org
Signed-off-by: André Draszik <andre.draszik@linaro.org>
---
 drivers/ufs/host/ufs-exynos.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/ufs/host/ufs-exynos.c b/drivers/ufs/host/ufs-exynos.c
index 3e545af536e53e06b66c624ed0dc6dc7de13549f..f0adcd9dd553d2e630c75e8c3220e21bc5f7c8d8 100644
--- a/drivers/ufs/host/ufs-exynos.c
+++ b/drivers/ufs/host/ufs-exynos.c
@@ -1110,8 +1110,8 @@ static int exynos_ufs_post_link(struct ufs_hba *hba)
 	hci_writel(ufs, val, HCI_TXPRDT_ENTRY_SIZE);
 
 	hci_writel(ufs, ilog2(DATA_UNIT_SIZE), HCI_RXPRDT_ENTRY_SIZE);
-	hci_writel(ufs, (1 << hba->nutrs) - 1, HCI_UTRL_NEXUS_TYPE);
-	hci_writel(ufs, (1 << hba->nutmrs) - 1, HCI_UTMRL_NEXUS_TYPE);
+	hci_writel(ufs, BIT(hba->nutrs) - 1, HCI_UTRL_NEXUS_TYPE);
+	hci_writel(ufs, BIT(hba->nutmrs) - 1, HCI_UTMRL_NEXUS_TYPE);
 	hci_writel(ufs, 0xf, HCI_AXIDMA_RWDATA_BURST_LEN);
 
 	if (ufs->opts & EXYNOS_UFS_OPT_SKIP_CONNECTION_ESTAB)

---
base-commit: 50c8770a42faf8b1c7abe93e7c114337f580a97d
change-id: 20250707-ufs-exynos-shift-b6d1084e28c4

Best regards,
-- 
André Draszik <andre.draszik@linaro.org>


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE
  2025-07-07 17:05 [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE André Draszik
@ 2025-07-07 17:24 ` Bart Van Assche
  2025-07-10  8:02 ` Peter Griffin
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Bart Van Assche @ 2025-07-07 17:24 UTC (permalink / raw)
  To: André Draszik, Alim Akhtar, Peter Griffin,
	James E.J. Bottomley, Martin K. Petersen, Krzysztof Kozlowski,
	Seungwon Jeon, Avri Altman, Kiwoong Kim
  Cc: Tudor Ambarus, Will McVicker, kernel-team, linux-scsi,
	linux-samsung-soc, linux-arm-kernel, linux-kernel, stable

On 7/7/25 10:05 AM, André Draszik wrote:
> On Google gs101, the number of UTP transfer request slots (nutrs) is
> 32, and in this case the driver ends up programming the UTRL_NEXUS_TYPE
> incorrectly as 0.
> 
> This is because the left hand side of the shift is 1, which is of type
> int, i.e. 31 bits wide. Shifting by more than that width results in
> undefined behaviour.
> 
> Fix this by switching to the BIT() macro, which applies correct type
> casting as required. This ensures the correct value is written to
> UTRL_NEXUS_TYPE (0xffffffff on gs101), and it also fixes a UBSAN shift
> warning:
>      UBSAN: shift-out-of-bounds in drivers/ufs/host/ufs-exynos.c:1113:21
>      shift exponent 32 is too large for 32-bit type 'int'
> 
> For consistency, apply the same change to the nutmrs / UTMRL_NEXUS_TYPE
> write.
> 
> Fixes: 55f4b1f73631 ("scsi: ufs: ufs-exynos: Add UFS host support for Exynos SoCs")
> Cc: stable@vger.kernel.org
> Signed-off-by: André Draszik <andre.draszik@linaro.org>
> ---
>   drivers/ufs/host/ufs-exynos.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-exynos.c b/drivers/ufs/host/ufs-exynos.c
> index 3e545af536e53e06b66c624ed0dc6dc7de13549f..f0adcd9dd553d2e630c75e8c3220e21bc5f7c8d8 100644
> --- a/drivers/ufs/host/ufs-exynos.c
> +++ b/drivers/ufs/host/ufs-exynos.c
> @@ -1110,8 +1110,8 @@ static int exynos_ufs_post_link(struct ufs_hba *hba)
>   	hci_writel(ufs, val, HCI_TXPRDT_ENTRY_SIZE);
>   
>   	hci_writel(ufs, ilog2(DATA_UNIT_SIZE), HCI_RXPRDT_ENTRY_SIZE);
> -	hci_writel(ufs, (1 << hba->nutrs) - 1, HCI_UTRL_NEXUS_TYPE);
> -	hci_writel(ufs, (1 << hba->nutmrs) - 1, HCI_UTMRL_NEXUS_TYPE);
> +	hci_writel(ufs, BIT(hba->nutrs) - 1, HCI_UTRL_NEXUS_TYPE);
> +	hci_writel(ufs, BIT(hba->nutmrs) - 1, HCI_UTMRL_NEXUS_TYPE);
>   	hci_writel(ufs, 0xf, HCI_AXIDMA_RWDATA_BURST_LEN);
>   
>   	if (ufs->opts & EXYNOS_UFS_OPT_SKIP_CONNECTION_ESTAB)

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE
  2025-07-07 17:05 [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE André Draszik
  2025-07-07 17:24 ` Bart Van Assche
@ 2025-07-10  8:02 ` Peter Griffin
  2025-07-14 17:18 ` Martin K. Petersen
  2025-07-22  3:46 ` Martin K. Petersen
  3 siblings, 0 replies; 5+ messages in thread
From: Peter Griffin @ 2025-07-10  8:02 UTC (permalink / raw)
  To: André Draszik
  Cc: Alim Akhtar, James E.J. Bottomley, Martin K. Petersen,
	Krzysztof Kozlowski, Seungwon Jeon, Avri Altman, Kiwoong Kim,
	Tudor Ambarus, Will McVicker, kernel-team, linux-scsi,
	linux-samsung-soc, linux-arm-kernel, linux-kernel, stable

On Mon, 7 Jul 2025 at 18:05, André Draszik <andre.draszik@linaro.org> wrote:
>
> On Google gs101, the number of UTP transfer request slots (nutrs) is
> 32, and in this case the driver ends up programming the UTRL_NEXUS_TYPE
> incorrectly as 0.
>
> This is because the left hand side of the shift is 1, which is of type
> int, i.e. 31 bits wide. Shifting by more than that width results in
> undefined behaviour.
>
> Fix this by switching to the BIT() macro, which applies correct type
> casting as required. This ensures the correct value is written to
> UTRL_NEXUS_TYPE (0xffffffff on gs101), and it also fixes a UBSAN shift
> warning:
>     UBSAN: shift-out-of-bounds in drivers/ufs/host/ufs-exynos.c:1113:21
>     shift exponent 32 is too large for 32-bit type 'int'
>
> For consistency, apply the same change to the nutmrs / UTMRL_NEXUS_TYPE
> write.
>
> Fixes: 55f4b1f73631 ("scsi: ufs: ufs-exynos: Add UFS host support for Exynos SoCs")
> Cc: stable@vger.kernel.org
> Signed-off-by: André Draszik <andre.draszik@linaro.org>
> ---

Reviewed-by: Peter Griffin <peter.griffin@linaro.org>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE
  2025-07-07 17:05 [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE André Draszik
  2025-07-07 17:24 ` Bart Van Assche
  2025-07-10  8:02 ` Peter Griffin
@ 2025-07-14 17:18 ` Martin K. Petersen
  2025-07-22  3:46 ` Martin K. Petersen
  3 siblings, 0 replies; 5+ messages in thread
From: Martin K. Petersen @ 2025-07-14 17:18 UTC (permalink / raw)
  To: André Draszik
  Cc: Alim Akhtar, Peter Griffin, James E.J. Bottomley,
	Martin K. Petersen, Krzysztof Kozlowski, Seungwon Jeon,
	Avri Altman, Kiwoong Kim, Tudor Ambarus, Will McVicker,
	kernel-team, linux-scsi, linux-samsung-soc, linux-arm-kernel,
	linux-kernel, stable


André,

> On Google gs101, the number of UTP transfer request slots (nutrs) is
> 32, and in this case the driver ends up programming the UTRL_NEXUS_TYPE
> incorrectly as 0.

Applied to 6.17/scsi-staging, thanks!

-- 
Martin K. Petersen

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE
  2025-07-07 17:05 [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE André Draszik
                   ` (2 preceding siblings ...)
  2025-07-14 17:18 ` Martin K. Petersen
@ 2025-07-22  3:46 ` Martin K. Petersen
  3 siblings, 0 replies; 5+ messages in thread
From: Martin K. Petersen @ 2025-07-22  3:46 UTC (permalink / raw)
  To: Alim Akhtar, Peter Griffin, James E.J. Bottomley,
	Krzysztof Kozlowski, Seungwon Jeon, Avri Altman, Kiwoong Kim,
	André Draszik
  Cc: Martin K . Petersen, Tudor Ambarus, Will McVicker, kernel-team,
	linux-scsi, linux-samsung-soc, linux-arm-kernel, linux-kernel,
	stable

On Mon, 07 Jul 2025 18:05:27 +0100, André Draszik wrote:

> On Google gs101, the number of UTP transfer request slots (nutrs) is
> 32, and in this case the driver ends up programming the UTRL_NEXUS_TYPE
> incorrectly as 0.
> 
> This is because the left hand side of the shift is 1, which is of type
> int, i.e. 31 bits wide. Shifting by more than that width results in
> undefined behaviour.
> 
> [...]

Applied to 6.17/scsi-queue, thanks!

[1/1] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE
      https://git.kernel.org/mkp/scsi/c/01aad16c2257

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-07-22  3:47 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-07 17:05 [PATCH] scsi: ufs: exynos: fix programming of HCI_UTRL_NEXUS_TYPE André Draszik
2025-07-07 17:24 ` Bart Van Assche
2025-07-10  8:02 ` Peter Griffin
2025-07-14 17:18 ` Martin K. Petersen
2025-07-22  3:46 ` Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).