All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nathan Chancellor <nathan@kernel.org>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Ryan Chen <ryan_chen@aspeedtech.com>,
	Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
	Bill Wendling <morbo@google.com>,
	Justin Stitt <justinstitt@google.com>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	llvm@lists.linux.dev
Subject: Re: [PATCH] usb: uhci: Work around bogus clang shift overflow warning from DMA_BIT_MASK(64)
Date: Tue, 14 Oct 2025 20:19:52 -0700	[thread overview]
Message-ID: <20251015031952.GA2975353@ax162> (raw)
In-Reply-To: <c0d1dc65-6f55-40b9-bbfa-09e8639a28e0@rowland.harvard.edu>

On Tue, Oct 14, 2025 at 11:07:27PM -0400, Alan Stern wrote:
> On Tue, Oct 14, 2025 at 04:38:19PM -0700, Nathan Chancellor wrote:
> > After commit 18a9ec886d32 ("usb: uhci: Add Aspeed AST2700 support"),
> > clang incorrectly warns:
> > 
> >   In file included from drivers/usb/host/uhci-hcd.c:855:
> >   drivers/usb/host/uhci-platform.c:69:32: error: shift count >= width of type [-Werror,-Wshift-count-overflow]
> >      69 | static const u64 dma_mask_64 = DMA_BIT_MASK(64);
> >         |                                ^~~~~~~~~~~~~~~~
> >   include/linux/dma-mapping.h:93:54: note: expanded from macro 'DMA_BIT_MASK'
> >      93 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
> >         |                                                      ^ ~~~
> > 
> > clang has a long outstanding and complicated problem [1] with generating
> > a proper control flow graph at global scope, resulting in it being
> > unable to understand that this shift can never happen due to the
> > 'n == 64' check.
> > 
> > Restructure the code to do the DMA_BIT_MASK() assignments within
> > uhci_hcd_platform_probe() (i.e., function scope) to avoid this global
> > scope issue.
> > 
> > Closes: https://github.com/ClangBuiltLinux/linux/issues/2136
> > Link: https://github.com/ClangBuiltLinux/linux/issues/92 [1]
> > Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> > ---
> 
> Do you think you could instead copy the approach used in:
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git/commit/?id=274f2232a94f6ca626d60288044e13d9a58c7612
> 
> IMO it is cleaner, and it also moves the DMA_BIT_MASK() computations 
> into a function scope.

Sure, would something like this be what you had in mind?

diff --git a/drivers/usb/host/uhci-platform.c b/drivers/usb/host/uhci-platform.c
index 37607f985cc0..5e02f2ceafb6 100644
--- a/drivers/usb/host/uhci-platform.c
+++ b/drivers/usb/host/uhci-platform.c
@@ -65,13 +65,10 @@ static const struct hc_driver uhci_platform_hc_driver = {
 	.hub_control =		uhci_hub_control,
 };
 
-static const u64 dma_mask_32 = DMA_BIT_MASK(32);
-static const u64 dma_mask_64 = DMA_BIT_MASK(64);
-
 static int uhci_hcd_platform_probe(struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
-	const u64 *dma_mask_ptr;
+	bool dma_mask_64 = false;
 	struct usb_hcd *hcd;
 	struct uhci_hcd	*uhci;
 	struct resource *res;
@@ -85,11 +82,11 @@ static int uhci_hcd_platform_probe(struct platform_device *pdev)
 	 * Since shared usb code relies on it, set it here for now.
 	 * Once we have dma capability bindings this can go away.
 	 */
-	dma_mask_ptr = (u64 *)of_device_get_match_data(&pdev->dev);
-	if (!dma_mask_ptr)
-		dma_mask_ptr = &dma_mask_32;
+	if (of_device_get_match_data(&pdev->dev))
+		dma_mask_64 = true;
 
-	ret = dma_coerce_mask_and_coherent(&pdev->dev, *dma_mask_ptr);
+	ret = dma_coerce_mask_and_coherent(&pdev->dev,
+		dma_mask_64 ? DMA_BIT_MASK(64) : DMA_BIT_MASK(32));
 	if (ret)
 		return ret;
 
@@ -200,7 +197,7 @@ static void uhci_hcd_platform_shutdown(struct platform_device *op)
 static const struct of_device_id platform_uhci_ids[] = {
 	{ .compatible = "generic-uhci", },
 	{ .compatible = "platform-uhci", },
-	{ .compatible = "aspeed,ast2700-uhci", .data = &dma_mask_64},
+	{ .compatible = "aspeed,ast2700-uhci", .data = (void *)1 },
 	{}
 };
 MODULE_DEVICE_TABLE(of, platform_uhci_ids);

The

  const struct of_device_id *match;

  match = of_match_device(dev->dev.driver->of_match_table, &dev->dev);
  if (match && match->data)

part of the change you linked to is equivalent to

  if (of_device_get_match_data(&dev->dev))

if someone wanted to do a further clean up.

Cheers,
Nathan

  reply	other threads:[~2025-10-15  3:19 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-14 23:38 [PATCH] usb: uhci: Work around bogus clang shift overflow warning from DMA_BIT_MASK(64) Nathan Chancellor
2025-10-15  3:07 ` Alan Stern
2025-10-15  3:19   ` Nathan Chancellor [this message]
2025-10-15 14:51     ` Alan Stern

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251015031952.GA2975353@ax162 \
    --to=nathan@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=justinstitt@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=morbo@google.com \
    --cc=nick.desaulniers+lkml@gmail.com \
    --cc=ryan_chen@aspeedtech.com \
    --cc=stern@rowland.harvard.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.