[PATCH 2/3] pci: Make auto-config code a little more robust
Stefan Roese
sr at denx.de
Tue Jan 5 16:57:59 CET 2021
Adding a few more PCI experts (Simon & Bin) to Cc.
On 03.01.21 23:06, Phil Sutter wrote:
> On my DS414, some PCI devices return odd values when probing BAR sizes.
> An obvious case is all-ones response, the Linux driver
> (drivers/pci/probe.c) catches those explicitly and a comment explains
> that either bit 0 or bit 1 must be clear (depending on MEM or IO type).
> Other BARs return e.g. 0xfff0000f or 0xfff00004 and thus manage to break
> size calculation due to the "middle" zeroes. Mitigate that copying more
> or less what Linux does and do a "find least bit set".
>
> Signed-off-by: Phil Sutter <phil at nwl.cc>
> ---
> drivers/pci/pci_auto.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pci/pci_auto.c b/drivers/pci/pci_auto.c
> index 3f46b7697d7ca..ea202b0e0959e 100644
> --- a/drivers/pci/pci_auto.c
> +++ b/drivers/pci/pci_auto.c
> @@ -47,16 +47,17 @@ void dm_pciauto_setup_device(struct udevice *dev, int bars_num,
> dm_pci_write_config32(dev, bar, 0xffffffff);
> dm_pci_read_config32(dev, bar, &bar_response);
>
> - /* If BAR is not implemented go to the next BAR */
> - if (!bar_response)
> + /* If BAR is not implemented (or invalid) go to the next BAR */
> + if (!bar_response || bar_response == 0xffffffff)
> continue;
>
> found_mem64 = 0;
>
> /* Check the BAR type and set our address mask */
> if (bar_response & PCI_BASE_ADDRESS_SPACE) {
> - bar_size = ((~(bar_response & PCI_BASE_ADDRESS_IO_MASK))
> - & 0xffff) + 1;
> + bar_size = bar_response & PCI_BASE_ADDRESS_IO_MASK;
> + bar_size &= ~(bar_size - 1);
> +
> if (!enum_only)
> bar_res = io;
>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
More information about the U-Boot
mailing list