Commit acf6d534 authored by Timothy Pearson's avatar Timothy Pearson

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.

Change-Id: I7a37ae98f54aab62e0937985220d1dcd097109f3
Signed-off-by: Timothy Pearson's avatarTimothy Pearson <tpearson@raptorengineering.com>
parent 9dedbdb2
...@@ -37,11 +37,13 @@ enum pci_bartype { ...@@ -37,11 +37,13 @@ enum pci_bartype {
uintptr_t pcidev_readbar(struct pci_dev *dev, int bar) uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
{ {
uint64_t addr; uint64_t addr;
uint32_t upperaddr;
uint8_t headertype; uint8_t headertype;
uint16_t supported_cycles; uint16_t supported_cycles;
enum pci_bartype bartype = TYPE_UNKNOWN; enum pci_bartype bartype = TYPE_UNKNOWN;
#ifndef __PPC64__
uint32_t upperaddr;
#endif
headertype = pci_read_byte(dev, PCI_HEADER_TYPE) & 0x7f; headertype = pci_read_byte(dev, PCI_HEADER_TYPE) & 0x7f;
msg_pspew("PCI header type 0x%02x\n", headertype); msg_pspew("PCI header type 0x%02x\n", headertype);
...@@ -97,6 +99,12 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar) ...@@ -97,6 +99,12 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
switch (bartype) { switch (bartype) {
case TYPE_MEMBAR: case TYPE_MEMBAR:
msg_pdbg("MEM"); 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)) { if (!(supported_cycles & PCI_COMMAND_MEMORY)) {
msg_perr("MEM BAR access requested, but device has MEM space accesses disabled.\n"); msg_perr("MEM BAR access requested, but device has MEM space accesses disabled.\n");
/* TODO: Abort here? */ /* TODO: Abort here? */
...@@ -122,6 +130,7 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar) ...@@ -122,6 +130,7 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
} }
} }
addr &= PCI_BASE_ADDRESS_MEM_MASK; addr &= PCI_BASE_ADDRESS_MEM_MASK;
#endif
break; break;
case TYPE_IOBAR: case TYPE_IOBAR:
msg_pdbg("I/O\n"); msg_pdbg("I/O\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment