On Sat, May 28, 2022 at 10:40 AM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > So digging a bit deeper - since I have am arm compiler after all - I > note that 'sizeof(detailed_timings)' is 88. Hmm. sizeof() both detailed_timings[0].data.other_data.data.range.formula.gtf2 and detailed_timings[0].data.other_data.data.range.formula.cvt is 7. But the *union* of those things is detailed_timings[0].data.other_data.data.range.formula and its size is 8 (despite having an alignment of just 1). The attached patch would seem to fix it for me. Not very much tested, and I have no idea what it is that triggers this only on spear3xx_defconfig. Some ARM ABI issue that is triggered by some very particular ARM compiler flag enabled by that config? Adding some ARM (and SPEAR, and SoC) people in case they have any idea. This smells like a compiler bug triggered by "there's a 16-bit member field in that gtf2 structure, and despite it being packed and aligned to 1, we somehow still align the size to 2". I dunno. But marking those unions packed too doesn't seem wrong, and does seem to fix it. Linus
include/drm/drm_edid.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index c3204a58fb09..b2756753370b 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -121,7 +121,7 @@ struct detailed_data_monitor_range { u8 supported_scalings; u8 preferred_refresh; } __attribute__((packed)) cvt; - } formula; + } __attribute__((packed)) formula; } __attribute__((packed)); struct detailed_data_wpindex { @@ -154,7 +154,7 @@ struct detailed_non_pixel { struct detailed_data_wpindex color; struct std_timing timings[6]; struct cvt_timing cvt[4]; - } data; + } __attribute__((packed)) data; } __attribute__((packed)); #define EDID_DETAIL_EST_TIMINGS 0xf7 @@ -172,7 +172,7 @@ struct detailed_timing { union { struct detailed_pixel_timing pixel_data; struct detailed_non_pixel other_data; - } data; + } __attribute__((packed)) data; } __attribute__((packed)); #define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0)