Couple of clang warnings for Rockchip boards
Quentin Schulz
quentin.schulz at cherry.de
Wed Apr 22 15:25:55 CEST 2026
Hi all,
I'm looking into force-enabling CONFIG_WERROR for all Rockchip SoCs.
First, let me know if this is a bad idea :)
gcc version 15.2.1 20250808 (Red Hat Cross 15.2.1-1) (GCC) for both ARM
and Aarch64 machines report no warnings (built with a config fragment
enabling CONFIG_WERROR).
For clang, I went for cross-compiling using either
make HOSTCC=clang CROSS_COMPILE=arm-linux-gnu- CC=clang O=build/ ...
or
make HOSTCC=clang CROSS_COMPILE=aarch64-linux-gnu- CC=clang O=build/ ...
First things first, I can't even build any of the Aarch32/ARM with clang
for some reason, so this only applies for Aarch64 Rockchip platforms.
Some platforms couldn't be built due to hitting the max TPL limit (e.g.
PX30).
clang version 21.1.8 (Fedora 21.1.8-4.fc43) (or clang version 22.1.1
(Fedora 22.1.1-2.fc44), doesn't matter) issues three warnings:
1. Chromebooks EC fails to build:
In file included from
/home/qschulz/work/upstream/u-boot/drivers/misc/cros_ec.c:21:
In file included from
/home/qschulz/work/upstream/u-boot/include/cros_ec.h:12:
/home/qschulz/work/upstream/u-boot/include/ec_commands.h:3578:2: error:
field within 'struct ec_params_charge_state' is less aligned than
'union ec_params_charge_state::(anonymous at
/home/qschulz/work/upstream/u-boot/include/ec_commands.h:3578:2)' and is
usually due to 'struct ec_params_charge_state' being packed, which can
lead to unaligned accesses [-Werror,-Wunaligned-access]
3578 | union {
| ^
The following
diff --git a/include/ec_commands.h b/include/ec_commands.h
index 23597d28b2c..c5f9777c0c7 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -3575,7 +3575,7 @@ enum charge_state_params {
struct __ec_todo_packed ec_params_charge_state {
uint8_t cmd; /* enum charge_state_command */
- union {
+ union __ec_todo_packed {
struct __ec_align1 {
/* no args */
} get_state;
seems to fix it. The upstream EC git repo
(https://chromium.googlesource.com/chromiumos/platform/ec) has a commit
with more changes, see 65da9cc08766 ("include/ec_commands.h: Fix
unaligned access warnings"). It doesn't apply cleanly (and I haven't
looked into other patches to backport for this to apply cleanly). I'm
not sure what we're supposed to do here? I also don't have a Chromebook
to test.
2. RK3528, RK3576 and RK3588 boards fail with (replace rk3528 in path
for the other SoCs)
/home/qschulz/work/upstream/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c:98:45:
error: value size does not match register size specified by the
constraint and modifier [-Werror,-Wasm-operand-widths]
98 | asm volatile("msr cntfrq_el0, %0" : : "r"
(CONFIG_COUNTER_FREQUENCY));
| ^
include/generated/autoconf.h:372:34: note: expanded from macro
'CONFIG_COUNTER_FREQUENCY'
372 | #define CONFIG_COUNTER_FREQUENCY 24000000
| ^
/home/qschulz/work/upstream/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c:98:32:
note: use constraint modifier "w"
98 | asm volatile("msr cntfrq_el0, %0" : : "r"
(CONFIG_COUNTER_FREQUENCY));
| ^~
| %w0
Note that all Rockchip SoCs have CONFIG_COUNTER_FREQUENCY set to 24000000.
The cntfrq_el0 register is 64b
(https://developer.arm.com/documentation/ddi0601/2026-03/AArch64-Registers/CNTFRQ-EL0--Counter-timer-Frequency-Register?lang=en),
though the top 32b are reserved. Android decided to ignore this warning
in the Little Kernel with
https://android.googlesource.com/kernel/lk/+/923541d4c23565a47d020d84202a6f77d22fc149%5E%21/.
I tried to follow clang's recommendation and switch this to %w0 but it
fails with:
/tmp/rk3588-a0a4b8.s: Assembler messages:
/tmp/rk3588-a0a4b8.s:87: Error: operand mismatch -- `msr cntfrq_el0,w9'
/tmp/rk3588-a0a4b8.s:87: Info: did you mean this?
/tmp/rk3588-a0a4b8.s:87: Info: msr cntfrq_el0, x9
clang: error: assembler command failed with exit code 1 (use -v to see
invocation)
I tried casting CONFIG_COUNTER_FREQUENCY into a u64 and it builds and no
magic smoke when booting a board. Whether this is the proper fix, I
don't know, but the warning is then gone. We could also decide to ignore
the warning like for Android's Little Kernel (where and how much this is
used is unclear as the repo isn't seeing much activity).
The register documentation indicates this is not used by the hardware at
all, so even if it was broken, we probably wouldn't see a difference?
3. Boards building USB TCPM fail with
In file included from
/home/qschulz/work/upstream/u-boot/drivers/usb/tcpm/tcpm-uclass.c:12:
In file included from
/home/qschulz/work/upstream/u-boot/include/usb/tcpm.h:12:
/home/qschulz/work/upstream/u-boot/include/usb/pd.h:212:2: error: field
within 'struct pd_message' is less aligned than 'union
pd_message::(anonymous at
/home/qschulz/work/upstream/u-boot/include/usb/pd.h:212:2)' and is
usually due to 'struct pd_message' being packed, which can lead to
unaligned accesses [-Werror,-Wunaligned-access]
212 | union {
| ^
This file is apparently adapted from upstream Linux, where the code is
identical for that struct. So not sure what to do here.
Cheers,
Quentin
More information about the U-Boot
mailing list