summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <tpearson@raptorengineering.com>2016-08-31 20:18:57 -0500
committerTimothy Pearson <tpearson@raptorengineering.com>2017-04-20 16:45:16 -0500
commite8011bd9f925c8cb436ebe87e7f7ed0caf2685cc (patch)
tree21f1d71c6d7e0b18162216275da43c7137924ddb
parent0cd3a8e8839662d04d3f6eadfc5a369544cb4c6a (diff)
downloadflashrom-raptor-p9-e8011bd9f925c8cb436ebe87e7f7ed0caf2685cc.tar.gz
flashrom-raptor-p9-e8011bd9f925c8cb436ebe87e7f7ed0caf2685cc.zip
Obtain correct virtual address for 32-bit BARs on PPC
PowerPC systems have the ability to map 32-bit BARs into 64-bit host windows. Reading the BAR directly from the hardware is insufficient on these machines; use the libpci deb->base_addr[x] mechanism instead.
-rw-r--r--pcidev.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/pcidev.c b/pcidev.c
index 2c78063..34b948b 100644
--- a/pcidev.c
+++ b/pcidev.c
@@ -37,11 +37,13 @@ enum pci_bartype {
uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
{
uint64_t addr;
- uint32_t upperaddr;
uint8_t headertype;
uint16_t supported_cycles;
enum pci_bartype bartype = TYPE_UNKNOWN;
+#ifndef __PPC64__
+ uint32_t upperaddr;
+#endif
headertype = pci_read_byte(dev, PCI_HEADER_TYPE) & 0x7f;
msg_pspew("PCI header type 0x%02x\n", headertype);
@@ -97,6 +99,12 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
switch (bartype) {
case TYPE_MEMBAR:
msg_pdbg("MEM");
+#ifdef __PPC64__
+ /* PowerPC is able to translate 32-bit BARs into 64-bit host windows.
+ * Use the dev->base_addr[x] mechanism to handle mapping.
+ */
+ addr = dev->base_addr[(bar - 0x10) / 0x4] & PCI_BASE_ADDRESS_MEM_MASK;
+#else
if (!(supported_cycles & PCI_COMMAND_MEMORY)) {
msg_perr("MEM BAR access requested, but device has MEM space accesses disabled.\n");
/* TODO: Abort here? */
@@ -122,6 +130,7 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
}
}
addr &= PCI_BASE_ADDRESS_MEM_MASK;
+#endif
break;
case TYPE_IOBAR:
msg_pdbg("I/O\n");
OpenPOWER on IntegriCloud