[U-Boot] [PATCH 02/10] x86: Correct endianness isues in pci_rom

Bin Meng bmeng.cn at gmail.com
Sun Jan 4 06:43:18 CET 2015


On Tue, Dec 30, 2014 at 10:32 AM, Simon Glass <sjg at chromium.org> wrote:
> This code is too x86-dependent at present. Correct it so that it can run on
> big-endian machines.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  drivers/pci/pci_rom.c | 25 ++++++++++++++-----------
>  1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/pci/pci_rom.c b/drivers/pci/pci_rom.c
> index 7d25cc9..86f0e95 100644
> --- a/drivers/pci/pci_rom.c
> +++ b/drivers/pci/pci_rom.c
> @@ -66,6 +66,7 @@ static int pci_rom_probe(pci_dev_t dev, uint class,
>         struct pci_rom_header *rom_header;
>         struct pci_rom_data *rom_data;
>         u16 vendor, device;
> +       u16 rom_vendor, rom_device;
>         u32 vendev;
>         u32 mapped_vendev;
>         u32 rom_address;
> @@ -95,25 +96,27 @@ static int pci_rom_probe(pci_dev_t dev, uint class,
>         rom_header = (struct pci_rom_header *)rom_address;
>
>         debug("PCI expansion ROM, signature %#04x, INIT size %#04x, data ptr %#04x\n",
> -             le32_to_cpu(rom_header->signature),
> -             rom_header->size * 512, le32_to_cpu(rom_header->data));
> +             le16_to_cpu(rom_header->signature),
> +             rom_header->size * 512, le16_to_cpu(rom_header->data));
>
> -       if (le32_to_cpu(rom_header->signature) != PCI_ROM_HDR) {
> +       if (le16_to_cpu(rom_header->signature) != PCI_ROM_HDR) {
>                 printf("Incorrect expansion ROM header signature %04x\n",
> -                      le32_to_cpu(rom_header->signature));
> +                      le16_to_cpu(rom_header->signature));
>                 return -EINVAL;
>         }
>
> -       rom_data = (((void *)rom_header) + le32_to_cpu(rom_header->data));
> +       rom_data = (((void *)rom_header) + le16_to_cpu(rom_header->data));
> +       rom_vendor = le16_to_cpu(rom_data->vendor);
> +       rom_device = le16_to_cpu(rom_data->device);
>
>         debug("PCI ROM image, vendor ID %04x, device ID %04x,\n",
> -             rom_data->vendor, rom_data->device);
> +             rom_vendor, rom_device);
>
>         /* If the device id is mapped, a mismatch is expected */
> -       if ((vendor != rom_data->vendor || device != rom_data->device) &&
> +       if ((vendor != rom_vendor || device != rom_device) &&
>             (vendev == mapped_vendev)) {
>                 printf("ID mismatch: vendor ID %04x, device ID %04x\n",
> -                      rom_data->vendor, rom_data->device);
> +                      rom_vendor, rom_device);
>                 return -EPERM;
>         }
>
> @@ -144,10 +147,10 @@ int pci_rom_load(uint16_t class, struct pci_rom_header *rom_header,
>                                                             image_size);
>
>                 rom_data = (struct pci_rom_data *)((void *)rom_header +
> -                               le32_to_cpu(rom_header->data));
> +                               le16_to_cpu(rom_header->data));
>
> -               image_size = le32_to_cpu(rom_data->ilen) * 512;
> -       } while ((rom_data->type != 0) && (rom_data->indicator != 0));
> +               image_size = le16_to_cpu(rom_data->ilen) * 512;
> +       } while ((rom_data->type != 0) && (rom_data->indicator == 0));
>
>         if (rom_data->type != 0)
>                 return -EACCES;
> --

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>


More information about the U-Boot mailing list