Hi Gerd, On Thu, 31 Jul 2025 at 20:57, Gerd Bayer <gbayer@xxxxxxxxxxxxx> wrote: > Simple pointer-casts to map byte and word reads from PCI config space > into dwords (i.e. u32) produce unintended results on big-endian systems. > Add the necessary adjustments under compile-time switch > CONFIG_CPU_BIG_ENDIAN. > > pci_bus_read_config() was just introduced with > https://lore.kernel.org/all/20250716161203.83823-2-18255117159@xxxxxxx/ > > Signed-off-by: Gerd Bayer <gbayer@xxxxxxxxxxxxx> Thanks for your patch! > --- a/drivers/pci/access.c > +++ b/drivers/pci/access.c > @@ -89,15 +89,24 @@ int pci_bus_read_config(void *priv, unsigned int devfn, int where, u32 size, > u32 *val) > { > struct pci_bus *bus = priv; > + int rc; > > - if (size == 1) > - return pci_bus_read_config_byte(bus, devfn, where, (u8 *)val); > - else if (size == 2) > - return pci_bus_read_config_word(bus, devfn, where, (u16 *)val); > - else if (size == 4) > - return pci_bus_read_config_dword(bus, devfn, where, val); > - else > - return PCIBIOS_BAD_REGISTER_NUMBER; > + if (size == 1) { > + rc = pci_bus_read_config_byte(bus, devfn, where, (u8 *)val); > +#if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) > + *val = ((*val >> 24) & 0xff); > +#endif IMHO this looks ugly and error-prone. In addition, it still relies on the caller initializing the upper bits to zero on little-endian. What about: u8 byte; rc = pci_bus_read_config_byte(bus, devfn, where, &byte); *val = byte; > + } else if (size == 2) { > + rc = pci_bus_read_config_word(bus, devfn, where, (u16 *)val); > +#if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) > + *val = ((*val >> 16) & 0xffff); > +#endif and: u16 word; rc = pci_bus_read_config_word(bus, devfn, where, &word); *val = word; > + } else if (size == 4) { > + rc = pci_bus_read_config_dword(bus, devfn, where, val); > + } else { > + rc = PCIBIOS_BAD_REGISTER_NUMBER; > + } > + return rc; > } > > int pci_generic_config_read(struct pci_bus *bus, unsigned int devfn, Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx 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