summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-03-17 00:47:56 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-03-17 00:47:56 +0000
commit803c2a51a30bbd3195dfa03b628494130f779d4c (patch)
tree58514c2131ee38849dffed49e54537acd7256d9b
parentd66a7b5b2a68950e3b866931d2048c96fdc263c9 (diff)
downloadflashrom-803c2a51a30bbd3195dfa03b628494130f779d4c.zip
flashrom-803c2a51a30bbd3195dfa03b628494130f779d4c.tar.gz
PCI device BARs of all types had only bits 1:0 cleared while reading the address
That was correct for IO BARs, but failed to mask bit 3:2 for MEM BARs, resulting in odd offsets for prefetchable MEM BARs and for 64-bit capable MEM BARs. Mask the correct number of bits for all types of BARs and add some debug printing about BAR type. Corresponding to flashrom svn r946. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
-rw-r--r--pcidev.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/pcidev.c b/pcidev.c
index fcb04e6..818819a 100644
--- a/pcidev.c
+++ b/pcidev.c
@@ -32,6 +32,7 @@ uint32_t pcidev_validate(struct pci_dev *dev, uint32_t bar,
struct pcidev_status *devs)
{
int i;
+ /* FIXME: 64 bit memory BARs need a 64 bit addr. */
uint32_t addr;
for (i = 0; devs[i].device_name != NULL; i++) {
@@ -42,12 +43,27 @@ uint32_t pcidev_validate(struct pci_dev *dev, uint32_t bar,
* Don't use dev->base_addr[x] (as value for 'bar'), won't
* work on older libpci.
*/
- addr = pci_read_long(dev, bar) & ~0x03;
+ addr = pci_read_long(dev, bar);
printf("Found \"%s %s\" (%04x:%04x, BDF %02x:%02x.%x).\n",
devs[i].vendor_name, devs[i].device_name,
dev->vendor_id, dev->device_id, dev->bus, dev->dev,
dev->func);
+ msg_pdbg("Requested BAR is %s", (addr & 0x1) ? "IO" : "MEM");
+ if (addr & 0x1) {
+ /* Mask off IO space indicator and reserved bit. */
+ msg_pdbg("\n");
+ addr &= ~0x3;
+ } else {
+ msg_pdbg(", %sbit, %sprefetchable\n",
+ ((addr & 0x6) == 0x0) ? "32" :
+ (((addr & 0x6) == 0x4) ? "64" : "reserved"),
+ (addr & 0x8) ? "" : "not ");
+ /* Mask off Mem space indicator, 32/64bit type indicator
+ * and Prefetchable indicator.
+ */
+ addr &= ~0xf;
+ }
if (devs[i].status == NT) {
printf("===\nThis PCI device is UNTESTED. Please "
OpenPOWER on IntegriCloud