public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
@ 2024-03-04  8:07 Naresh Kamboju
  2024-03-04 11:11 ` Arnd Bergmann
  0 siblings, 1 reply; 14+ messages in thread
From: Naresh Kamboju @ 2024-03-04  8:07 UTC (permalink / raw)
  To: open list, Linux ARM, linux-sunxi, dri-devel, lkft-triage
  Cc: Maxime Ripard, Dave Airlie, Arnd Bergmann, Dan Carpenter,
	Ard Biesheuvel

The arm defconfig builds failed on today's Linux next tag next-20240304.

Build log:
---------
ERROR: modpost: "__aeabi_uldivmod"
[drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!

Steps to reproduce:
  # tuxmake --runtime podman --target-arch arm --toolchain clang-17
--kconfig defconfig LLVM=1 LLVM_IAS=1

Links:
 - https://qa-reports.linaro.org/lkft/linux-next-master/build/next-20240304/testrun/22919744/suite/build/test/clang-17-defconfig/history/
 - https://qa-reports.linaro.org/lkft/linux-next-master/build/next-20240304/testrun/22919744/suite/build/test/clang-17-defconfig/log
 - https://qa-reports.linaro.org/lkft/linux-next-master/build/next-20240304/testrun/22919744/suite/build/test/clang-17-defconfig/details/


--
Linaro LKFT
https://lkft.linaro.org

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04  8:07 arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined! Naresh Kamboju
@ 2024-03-04 11:11 ` Arnd Bergmann
  2024-03-04 11:24   ` Andre Przywara
  2024-03-04 11:46   ` Maxime Ripard
  0 siblings, 2 replies; 14+ messages in thread
From: Arnd Bergmann @ 2024-03-04 11:11 UTC (permalink / raw)
  To: Naresh Kamboju, open list, Linux ARM, linux-sunxi, dri-devel,
	lkft-triage
  Cc: Maxime Ripard, Dave Airlie, Dan Carpenter, Ard Biesheuvel

On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> The arm defconfig builds failed on today's Linux next tag next-20240304.
>
> Build log:
> ---------
> ERROR: modpost: "__aeabi_uldivmod"
> [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
>

Apparently caused by the 64-bit division in 358e76fd613a
("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):


+static enum drm_mode_status
+sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
+                                const struct drm_display_mode *mode,
+                                unsigned long long clock)
 {
-       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
-       unsigned long rate = mode->clock * 1000;
-       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
+       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
+       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */
        long rounded_rate;

This used to be a 32-bit division. If the rate is never more than
4.2GHz, clock could be turned back into 'unsigned long' to avoid
the expensive div_u64().

      Arnd

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 11:11 ` Arnd Bergmann
@ 2024-03-04 11:24   ` Andre Przywara
  2024-03-04 11:26     ` Arnd Bergmann
  2024-03-04 11:46   ` Maxime Ripard
  1 sibling, 1 reply; 14+ messages in thread
From: Andre Przywara @ 2024-03-04 11:24 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Naresh Kamboju, open list, Linux ARM, linux-sunxi, dri-devel,
	lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter,
	Ard Biesheuvel

On Mon, 04 Mar 2024 12:11:36 +0100
"Arnd Bergmann" <arnd@arndb.de> wrote:

Hi,

> On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> > The arm defconfig builds failed on today's Linux next tag next-20240304.
> >
> > Build log:
> > ---------
> > ERROR: modpost: "__aeabi_uldivmod"
> > [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
> >  
> 
> Apparently caused by the 64-bit division in 358e76fd613a
> ("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):
> 
> 
> +static enum drm_mode_status
> +sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
> +                                const struct drm_display_mode *mode,
> +                                unsigned long long clock)
>  {
> -       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
> -       unsigned long rate = mode->clock * 1000;
> -       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
> +       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
> +       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */

Wouldn't "div_u64(clock, 200)" solve this problem?

Cheers,
Andre

>         long rounded_rate;
> 
> This used to be a 32-bit division. If the rate is never more than
> 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> the expensive div_u64().
> 
>       Arnd
> 


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 11:24   ` Andre Przywara
@ 2024-03-04 11:26     ` Arnd Bergmann
  2024-03-04 11:45       ` Andre Przywara
  0 siblings, 1 reply; 14+ messages in thread
From: Arnd Bergmann @ 2024-03-04 11:26 UTC (permalink / raw)
  To: Andre Przywara
  Cc: Naresh Kamboju, open list, Linux ARM, linux-sunxi, dri-devel,
	lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter,
	Ard Biesheuvel

On Mon, Mar 4, 2024, at 12:24, Andre Przywara wrote:
> On Mon, 04 Mar 2024 12:11:36 +0100 "Arnd Bergmann" <arnd@arndb.de> wrote:
>>
>> This used to be a 32-bit division. If the rate is never more than
>> 4.2GHz, clock could be turned back into 'unsigned long' to avoid
>> the expensive div_u64().
>
> Wouldn't "div_u64(clock, 200)" solve this problem?

Yes, that's why I mentioned it as the worse of the two obvious
solutions. ;-)

     Arnd

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 11:26     ` Arnd Bergmann
@ 2024-03-04 11:45       ` Andre Przywara
  2024-03-04 12:34         ` Arnd Bergmann
  0 siblings, 1 reply; 14+ messages in thread
From: Andre Przywara @ 2024-03-04 11:45 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Naresh Kamboju, open list, Linux ARM, linux-sunxi, dri-devel,
	lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter,
	Ard Biesheuvel

On Mon, 04 Mar 2024 12:26:46 +0100
"Arnd Bergmann" <arnd@arndb.de> wrote:

> On Mon, Mar 4, 2024, at 12:24, Andre Przywara wrote:
> > On Mon, 04 Mar 2024 12:11:36 +0100 "Arnd Bergmann" <arnd@arndb.de> wrote:  
> >>
> >> This used to be a 32-bit division. If the rate is never more than
> >> 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> >> the expensive div_u64().  
> >
> > Wouldn't "div_u64(clock, 200)" solve this problem?  
> 
> Yes, that's why I mentioned it as the worse of the two obvious
> solutions. ;-)

Argh, should have cleaned my glasses first ;-)

I guess I was put somehow put off by the word "expensive". While it's
admittedly not trivial, I wonder if we care about the (hidden) complexity
of that function? I mean it's neither core code nor something called
frequently?
I don't think we have any clock exceeding 3GHz at the moment, but it
sounds fishy to rely on that.

Cheers,
Andre

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 11:11 ` Arnd Bergmann
  2024-03-04 11:24   ` Andre Przywara
@ 2024-03-04 11:46   ` Maxime Ripard
  2024-03-09 14:33     ` David Laight
  1 sibling, 1 reply; 14+ messages in thread
From: Maxime Ripard @ 2024-03-04 11:46 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Naresh Kamboju, open list, Linux ARM, linux-sunxi, dri-devel,
	lkft-triage, Dave Airlie, Dan Carpenter, Ard Biesheuvel


[-- Attachment #1.1: Type: text/plain, Size: 1511 bytes --]

Hi,

On Mon, Mar 04, 2024 at 12:11:36PM +0100, Arnd Bergmann wrote:
> On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> > The arm defconfig builds failed on today's Linux next tag next-20240304.
> >
> > Build log:
> > ---------
> > ERROR: modpost: "__aeabi_uldivmod"
> > [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
> >
> 
> Apparently caused by the 64-bit division in 358e76fd613a
> ("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):
> 
> 
> +static enum drm_mode_status
> +sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
> +                                const struct drm_display_mode *mode,
> +                                unsigned long long clock)
>  {
> -       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
> -       unsigned long rate = mode->clock * 1000;
> -       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
> +       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
> +       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */
>         long rounded_rate;
> 
> This used to be a 32-bit division. If the rate is never more than
> 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> the expensive div_u64().

I sent a fix for it this morning:
https://lore.kernel.org/r/20240304091225.366325-1-mripard@kernel.org

The framework will pass an unsigned long long because HDMI character
rates can go up to 5.9GHz.

Maxime

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 11:45       ` Andre Przywara
@ 2024-03-04 12:34         ` Arnd Bergmann
  2024-03-04 13:01           ` Ard Biesheuvel
  0 siblings, 1 reply; 14+ messages in thread
From: Arnd Bergmann @ 2024-03-04 12:34 UTC (permalink / raw)
  To: Andre Przywara
  Cc: Naresh Kamboju, open list, Linux ARM, linux-sunxi, dri-devel,
	lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter,
	Ard Biesheuvel

On Mon, Mar 4, 2024, at 12:45, Andre Przywara wrote:
> On Mon, 04 Mar 2024 12:26:46 +0100
> "Arnd Bergmann" <arnd@arndb.de> wrote:
>
>> On Mon, Mar 4, 2024, at 12:24, Andre Przywara wrote:
>> > On Mon, 04 Mar 2024 12:11:36 +0100 "Arnd Bergmann" <arnd@arndb.de> wrote:  
>> >>
>> >> This used to be a 32-bit division. If the rate is never more than
>> >> 4.2GHz, clock could be turned back into 'unsigned long' to avoid
>> >> the expensive div_u64().  
>> >
>> > Wouldn't "div_u64(clock, 200)" solve this problem?  
>> 
>> Yes, that's why I mentioned it as the worse of the two obvious
>> solutions. ;-)
>
> Argh, should have cleaned my glasses first ;-)
>
> I guess I was put somehow put off by the word "expensive". While it's
> admittedly not trivial, I wonder if we care about the (hidden) complexity
> of that function? I mean it's neither core code nor something called
> frequently?

It's not critical if this is called infrequently, and as Maxime
just replied, the 64-bit division is in fact required here.
Since we are dividing by a constant value (200), there is a good
chance that this will be get turned into fairly efficient
multiply/shift code.

> I don't think we have any clock exceeding 3GHz at the moment, but it
> sounds fishy to rely on that.

Right, it's just important to look at each case individually.
The cost of 64-bit division is crazy if it gets called repeatedly,
which is of course the entire reason we don't provide a
__aeabi_uldivmod() function and require developers to think
before adding div_u64().

     Arnd

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 12:34         ` Arnd Bergmann
@ 2024-03-04 13:01           ` Ard Biesheuvel
  2024-03-04 13:48             ` Arnd Bergmann
  0 siblings, 1 reply; 14+ messages in thread
From: Ard Biesheuvel @ 2024-03-04 13:01 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Andre Przywara, Naresh Kamboju, open list, Linux ARM, linux-sunxi,
	dri-devel, lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter

On Mon, 4 Mar 2024 at 13:35, Arnd Bergmann <arnd@arndb.de> wrote:
>
> On Mon, Mar 4, 2024, at 12:45, Andre Przywara wrote:
> > On Mon, 04 Mar 2024 12:26:46 +0100
> > "Arnd Bergmann" <arnd@arndb.de> wrote:
> >
> >> On Mon, Mar 4, 2024, at 12:24, Andre Przywara wrote:
> >> > On Mon, 04 Mar 2024 12:11:36 +0100 "Arnd Bergmann" <arnd@arndb.de> wrote:
> >> >>
> >> >> This used to be a 32-bit division. If the rate is never more than
> >> >> 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> >> >> the expensive div_u64().
> >> >
> >> > Wouldn't "div_u64(clock, 200)" solve this problem?
> >>
> >> Yes, that's why I mentioned it as the worse of the two obvious
> >> solutions. ;-)
> >
> > Argh, should have cleaned my glasses first ;-)
> >
> > I guess I was put somehow put off by the word "expensive". While it's
> > admittedly not trivial, I wonder if we care about the (hidden) complexity
> > of that function? I mean it's neither core code nor something called
> > frequently?
>
> It's not critical if this is called infrequently, and as Maxime
> just replied, the 64-bit division is in fact required here.
> Since we are dividing by a constant value (200), there is a good
> chance that this will be get turned into fairly efficient
> multiply/shift code.
>

Clang does not implement that optimization for 64-bit division. That
is how we ended up with this error in the first place.

Perhaps it is worthwhile to make div_u64() check its divisor, e.g.,

--- a/include/linux/math64.h
+++ b/include/linux/math64.h
@@ -127,6 +127,9 @@
 static inline u64 div_u64(u64 dividend, u32 divisor)
 {
        u32 remainder;
+
+       if (IS_ENABLED(CONFIG_CC_IS_GCC) && __builtin_constant_p(divisor))
+               return dividend / divisor;
        return div_u64_rem(dividend, divisor, &remainder);
 }
 #endif

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 13:01           ` Ard Biesheuvel
@ 2024-03-04 13:48             ` Arnd Bergmann
  2024-03-04 13:55               ` Ard Biesheuvel
  0 siblings, 1 reply; 14+ messages in thread
From: Arnd Bergmann @ 2024-03-04 13:48 UTC (permalink / raw)
  To: Ard Biesheuvel
  Cc: Andre Przywara, Naresh Kamboju, open list, Linux ARM, linux-sunxi,
	dri-devel, lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter

On Mon, Mar 4, 2024, at 14:01, Ard Biesheuvel wrote:
> On Mon, 4 Mar 2024 at 13:35, Arnd Bergmann <arnd@arndb.de> wrote:
>> On Mon, Mar 4, 2024, at 12:45, Andre Przywara wrote:
>> It's not critical if this is called infrequently, and as Maxime
>> just replied, the 64-bit division is in fact required here.
>> Since we are dividing by a constant value (200), there is a good
>> chance that this will be get turned into fairly efficient
>> multiply/shift code.
>>
>
> Clang does not implement that optimization for 64-bit division. That
> is how we ended up with this error in the first place.

I meant it will use the optimization after the patch to convert
the plain '/' to div_u64().

> Perhaps it is worthwhile to make div_u64() check its divisor, e.g.,
>
> --- a/include/linux/math64.h
> +++ b/include/linux/math64.h
> @@ -127,6 +127,9 @@
>  static inline u64 div_u64(u64 dividend, u32 divisor)
>  {
>         u32 remainder;
> +
> +       if (IS_ENABLED(CONFIG_CC_IS_GCC) && __builtin_constant_p(divisor))
> +               return dividend / divisor;
>         return div_u64_rem(dividend, divisor, &remainder);
>  }

I think the div_u64()->do_div()->__div64_const32()->__arch_xprod_64()
optimization in asm-generic/div64.h already produces what we want
on both compilers. Is there something missing there?

     Arnd

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 13:48             ` Arnd Bergmann
@ 2024-03-04 13:55               ` Ard Biesheuvel
  0 siblings, 0 replies; 14+ messages in thread
From: Ard Biesheuvel @ 2024-03-04 13:55 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Andre Przywara, Naresh Kamboju, open list, Linux ARM, linux-sunxi,
	dri-devel, lkft-triage, Maxime Ripard, Dave Airlie, Dan Carpenter

On Mon, 4 Mar 2024 at 14:49, Arnd Bergmann <arnd@arndb.de> wrote:
>
> On Mon, Mar 4, 2024, at 14:01, Ard Biesheuvel wrote:
> > On Mon, 4 Mar 2024 at 13:35, Arnd Bergmann <arnd@arndb.de> wrote:
> >> On Mon, Mar 4, 2024, at 12:45, Andre Przywara wrote:
> >> It's not critical if this is called infrequently, and as Maxime
> >> just replied, the 64-bit division is in fact required here.
> >> Since we are dividing by a constant value (200), there is a good
> >> chance that this will be get turned into fairly efficient
> >> multiply/shift code.
> >>
> >
> > Clang does not implement that optimization for 64-bit division. That
> > is how we ended up with this error in the first place.
>
> I meant it will use the optimization after the patch to convert
> the plain '/' to div_u64().
>

Ah ok.

I did not realize we implement the same optimization in our code as
the one that GCC will apply when encountering a compile-time constant
divisor.

> > Perhaps it is worthwhile to make div_u64() check its divisor, e.g.,
> >
> > --- a/include/linux/math64.h
> > +++ b/include/linux/math64.h
> > @@ -127,6 +127,9 @@
> >  static inline u64 div_u64(u64 dividend, u32 divisor)
> >  {
> >         u32 remainder;
> > +
> > +       if (IS_ENABLED(CONFIG_CC_IS_GCC) && __builtin_constant_p(divisor))
> > +               return dividend / divisor;
> >         return div_u64_rem(dividend, divisor, &remainder);
> >  }
>
> I think the div_u64()->do_div()->__div64_const32()->__arch_xprod_64()
> optimization in asm-generic/div64.h already produces what we want
> on both compilers. Is there something missing there?
>

No, you are right. I thought we were relying on GCC for the optimization here.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* RE: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-04 11:46   ` Maxime Ripard
@ 2024-03-09 14:33     ` David Laight
  2024-03-14  9:27       ` Geert Uytterhoeven
  0 siblings, 1 reply; 14+ messages in thread
From: David Laight @ 2024-03-09 14:33 UTC (permalink / raw)
  To: 'Maxime Ripard', Arnd Bergmann
  Cc: Naresh Kamboju, open list, Linux ARM, linux-sunxi@lists.linux.dev,
	dri-devel@lists.freedesktop.org, lkft-triage@lists.linaro.org,
	Dave Airlie, Dan Carpenter, Ard Biesheuvel

From: Maxime Ripard
> Sent: 04 March 2024 11:46
> 
> On Mon, Mar 04, 2024 at 12:11:36PM +0100, Arnd Bergmann wrote:
> > On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> > > The arm defconfig builds failed on today's Linux next tag next-20240304.
> > >
> > > Build log:
> > > ---------
> > > ERROR: modpost: "__aeabi_uldivmod"
> > > [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
> > >
> >
> > Apparently caused by the 64-bit division in 358e76fd613a
> > ("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):
> >
> >
> > +static enum drm_mode_status
> > +sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
> > +                                const struct drm_display_mode *mode,
> > +                                unsigned long long clock)
> >  {
> > -       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
> > -       unsigned long rate = mode->clock * 1000;
> > -       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
> > +       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
> > +       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */
> >         long rounded_rate;
> >
> > This used to be a 32-bit division. If the rate is never more than
> > 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> > the expensive div_u64().
> 
> I sent a fix for it this morning:
> https://lore.kernel.org/r/20240304091225.366325-1-mripard@kernel.org
> 
> The framework will pass an unsigned long long because HDMI character
> rates can go up to 5.9GHz.

You could do:
	/* The max clock is 5.9GHz, split the divide */
	u32 diff = (u32)(clock / 8) / (200/8);

The code should really use u32 and u64.
Otherwise the sizes are different on 32bit.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-09 14:33     ` David Laight
@ 2024-03-14  9:27       ` Geert Uytterhoeven
  2024-03-14 11:14         ` Geert Uytterhoeven
  2024-03-14 15:04         ` Maxime Ripard
  0 siblings, 2 replies; 14+ messages in thread
From: Geert Uytterhoeven @ 2024-03-14  9:27 UTC (permalink / raw)
  To: David Laight
  Cc: Maxime Ripard, Arnd Bergmann, Naresh Kamboju, open list,
	Linux ARM, linux-sunxi@lists.linux.dev,
	dri-devel@lists.freedesktop.org, lkft-triage@lists.linaro.org,
	Dave Airlie, Dan Carpenter, Ard Biesheuvel

On Sat, Mar 9, 2024 at 3:34 PM David Laight <David.Laight@aculab.com> wrote:
> From: Maxime Ripard
> > Sent: 04 March 2024 11:46
> >
> > On Mon, Mar 04, 2024 at 12:11:36PM +0100, Arnd Bergmann wrote:
> > > On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> > > > The arm defconfig builds failed on today's Linux next tag next-20240304.
> > > >
> > > > Build log:
> > > > ---------
> > > > ERROR: modpost: "__aeabi_uldivmod"
> > > > [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
> > > >
> > >
> > > Apparently caused by the 64-bit division in 358e76fd613a
> > > ("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):
> > >
> > >
> > > +static enum drm_mode_status
> > > +sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
> > > +                                const struct drm_display_mode *mode,
> > > +                                unsigned long long clock)
> > >  {
> > > -       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
> > > -       unsigned long rate = mode->clock * 1000;
> > > -       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
> > > +       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
> > > +       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */
> > >         long rounded_rate;
> > >
> > > This used to be a 32-bit division. If the rate is never more than
> > > 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> > > the expensive div_u64().
> >
> > I sent a fix for it this morning:
> > https://lore.kernel.org/r/20240304091225.366325-1-mripard@kernel.org
> >
> > The framework will pass an unsigned long long because HDMI character
> > rates can go up to 5.9GHz.
>
> You could do:
>         /* The max clock is 5.9GHz, split the divide */
>         u32 diff = (u32)(clock / 8) / (200/8);

+1, as the issue is still present in current next, as per the recent
nagging from the build bots.

> The code should really use u32 and u64.
> Otherwise the sizes are different on 32bit.

The code is already using a variety of types (long, unsigned long long,
unsigned long) :-(

       max_t(unsigned long, rounded_rate, clock) -
       min_t(unsigned long, rounded_rate, clock) < diff)

At least u64 should make it very clear clock does not fit in 32-bit.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-14  9:27       ` Geert Uytterhoeven
@ 2024-03-14 11:14         ` Geert Uytterhoeven
  2024-03-14 15:04         ` Maxime Ripard
  1 sibling, 0 replies; 14+ messages in thread
From: Geert Uytterhoeven @ 2024-03-14 11:14 UTC (permalink / raw)
  To: David Laight
  Cc: Maxime Ripard, Arnd Bergmann, Naresh Kamboju, open list,
	Linux ARM, linux-sunxi@lists.linux.dev,
	dri-devel@lists.freedesktop.org, lkft-triage@lists.linaro.org,
	Dave Airlie, Dan Carpenter, Ard Biesheuvel

On Thu, Mar 14, 2024 at 10:27 AM Geert Uytterhoeven
<geert@linux-m68k.org> wrote:
> On Sat, Mar 9, 2024 at 3:34 PM David Laight <David.Laight@aculab.com> wrote:
> > From: Maxime Ripard
> > > Sent: 04 March 2024 11:46
> > >
> > > On Mon, Mar 04, 2024 at 12:11:36PM +0100, Arnd Bergmann wrote:
> > > > On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> > > > > The arm defconfig builds failed on today's Linux next tag next-20240304.
> > > > >
> > > > > Build log:
> > > > > ---------
> > > > > ERROR: modpost: "__aeabi_uldivmod"
> > > > > [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
> > > > >
> > > >
> > > > Apparently caused by the 64-bit division in 358e76fd613a
> > > > ("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):
> > > >
> > > >
> > > > +static enum drm_mode_status
> > > > +sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
> > > > +                                const struct drm_display_mode *mode,
> > > > +                                unsigned long long clock)
> > > >  {
> > > > -       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
> > > > -       unsigned long rate = mode->clock * 1000;
> > > > -       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
> > > > +       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
> > > > +       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */
> > > >         long rounded_rate;
> > > >
> > > > This used to be a 32-bit division. If the rate is never more than
> > > > 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> > > > the expensive div_u64().
> > >
> > > I sent a fix for it this morning:
> > > https://lore.kernel.org/r/20240304091225.366325-1-mripard@kernel.org
> > >
> > > The framework will pass an unsigned long long because HDMI character
> > > rates can go up to 5.9GHz.
> >
> > You could do:
> >         /* The max clock is 5.9GHz, split the divide */
> >         u32 diff = (u32)(clock / 8) / (200/8);
>
> +1, as the issue is still present in current next, as per the recent
> nagging from the build bots.

Oops, s/next/upstream/.
Well, less 32-bit build testing for the next few days :-(

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
  2024-03-14  9:27       ` Geert Uytterhoeven
  2024-03-14 11:14         ` Geert Uytterhoeven
@ 2024-03-14 15:04         ` Maxime Ripard
  1 sibling, 0 replies; 14+ messages in thread
From: Maxime Ripard @ 2024-03-14 15:04 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: David Laight, Arnd Bergmann, Naresh Kamboju, open list, Linux ARM,
	linux-sunxi@lists.linux.dev, dri-devel@lists.freedesktop.org,
	lkft-triage@lists.linaro.org, Dave Airlie, Dan Carpenter,
	Ard Biesheuvel


[-- Attachment #1.1: Type: text/plain, Size: 2247 bytes --]

On Thu, Mar 14, 2024 at 10:27:23AM +0100, Geert Uytterhoeven wrote:
> On Sat, Mar 9, 2024 at 3:34 PM David Laight <David.Laight@aculab.com> wrote:
> > From: Maxime Ripard
> > > Sent: 04 March 2024 11:46
> > >
> > > On Mon, Mar 04, 2024 at 12:11:36PM +0100, Arnd Bergmann wrote:
> > > > On Mon, Mar 4, 2024, at 09:07, Naresh Kamboju wrote:
> > > > > The arm defconfig builds failed on today's Linux next tag next-20240304.
> > > > >
> > > > > Build log:
> > > > > ---------
> > > > > ERROR: modpost: "__aeabi_uldivmod"
> > > > > [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined!
> > > > >
> > > >
> > > > Apparently caused by the 64-bit division in 358e76fd613a
> > > > ("drm/sun4i: hdmi: Consolidate atomic_check and mode_valid"):
> > > >
> > > >
> > > > +static enum drm_mode_status
> > > > +sun4i_hdmi_connector_clock_valid(const struct drm_connector *connector,
> > > > +                                const struct drm_display_mode *mode,
> > > > +                                unsigned long long clock)
> > > >  {
> > > > -       struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder);
> > > > -       unsigned long rate = mode->clock * 1000;
> > > > -       unsigned long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
> > > > +       const struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
> > > > +       unsigned long diff = clock / 200; /* +-0.5% allowed by HDMI spec */
> > > >         long rounded_rate;
> > > >
> > > > This used to be a 32-bit division. If the rate is never more than
> > > > 4.2GHz, clock could be turned back into 'unsigned long' to avoid
> > > > the expensive div_u64().
> > >
> > > I sent a fix for it this morning:
> > > https://lore.kernel.org/r/20240304091225.366325-1-mripard@kernel.org
> > >
> > > The framework will pass an unsigned long long because HDMI character
> > > rates can go up to 5.9GHz.
> >
> > You could do:
> >         /* The max clock is 5.9GHz, split the divide */
> >         u32 diff = (u32)(clock / 8) / (200/8);
> 
> +1, as the issue is still present in current next, as per the recent
> nagging from the build bots.

A patch to fix it has been merged today and will show up tomorrow in next.

Maxime

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

end of thread, other threads:[~2024-03-14 15:04 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-04  8:07 arm: ERROR: modpost: "__aeabi_uldivmod" [drivers/gpu/drm/sun4i/sun4i-drm-hdmi.ko] undefined! Naresh Kamboju
2024-03-04 11:11 ` Arnd Bergmann
2024-03-04 11:24   ` Andre Przywara
2024-03-04 11:26     ` Arnd Bergmann
2024-03-04 11:45       ` Andre Przywara
2024-03-04 12:34         ` Arnd Bergmann
2024-03-04 13:01           ` Ard Biesheuvel
2024-03-04 13:48             ` Arnd Bergmann
2024-03-04 13:55               ` Ard Biesheuvel
2024-03-04 11:46   ` Maxime Ripard
2024-03-09 14:33     ` David Laight
2024-03-14  9:27       ` Geert Uytterhoeven
2024-03-14 11:14         ` Geert Uytterhoeven
2024-03-14 15:04         ` Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox