mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
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>
This commit is contained in:
parent
6093969529
commit
295b3af767
18
pcidev.c
18
pcidev.c
@ -32,6 +32,7 @@ uint32_t pcidev_validate(struct pci_dev *dev, uint32_t bar,
|
|||||||
struct pcidev_status *devs)
|
struct pcidev_status *devs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
/* FIXME: 64 bit memory BARs need a 64 bit addr. */
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
|
|
||||||
for (i = 0; devs[i].device_name != NULL; i++) {
|
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
|
* Don't use dev->base_addr[x] (as value for 'bar'), won't
|
||||||
* work on older libpci.
|
* 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",
|
printf("Found \"%s %s\" (%04x:%04x, BDF %02x:%02x.%x).\n",
|
||||||
devs[i].vendor_name, devs[i].device_name,
|
devs[i].vendor_name, devs[i].device_name,
|
||||||
dev->vendor_id, dev->device_id, dev->bus, dev->dev,
|
dev->vendor_id, dev->device_id, dev->bus, dev->dev,
|
||||||
dev->func);
|
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) {
|
if (devs[i].status == NT) {
|
||||||
printf("===\nThis PCI device is UNTESTED. Please "
|
printf("===\nThis PCI device is UNTESTED. Please "
|
||||||
|
Loading…
x
Reference in New Issue
Block a user