PCI: Unset resource if initial BAR value is invalid
authorKevin Hao <haokexin@gmail.com>
Sat, 25 May 2013 11:36:27 +0000 (19:36 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Sat, 25 May 2013 18:02:56 +0000 (12:02 -0600)
commitcf4d1cf5ac5e7d2b886af6ed906ea0dcdc5b6855
tree81a359610daf421855e183077baa86f3d4d99f9c
parent96ddef25b24a6159e78fb53c1b13336914ff1154
PCI: Unset resource if initial BAR value is invalid

The initial BAR value in the following example is invalid:

  pci_bus 0000:00: root bus resource [mem 0xa0000000-0xbfffffff] (bus address [0xe0000000-0xffffffff])
  pci 0000:01:00.0: reg 10: initial BAR value: 0xa0000000
  pci 0000:01:00.0: reg 10: [mem 0xa0000000-0xa000007f 64bit]

bus_to_resource(0xa0000000) yields 0xa0000000 because there's no host
bridge window whose bus address range contains 0xa0000000.  But CPU
accesses to 0xa0000000 appear on the bus at 0xe0000000, so they will
not be claimed if the BAR contains 0xa0000000.

If we find a BAR where resource_to_bus(bus_to_resource(A)) != A, we can
work around this problem by reassigning the BAR.

[bhelgaas: changelog, comment]
Reference: https://lkml.kernel.org/r/1368536876-27307-3-git-send-email-haokexin@gmail.com
Signed-off-by: Kevin Hao <haokexin@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/probe.c