Nick: carldani E-mail: none Board: pcidev_init_validator_function patch Contents: diff -ur flashrom-pcidev_init_do_not_return_bar/atahpt.c flashrom-pcidev_init_validator_function/atahpt.c --- flashrom-pcidev_init_do_not_return_bar/atahpt.c 2013-01-05 03:35:05.000000000 +0100 +++ flashrom-pcidev_init_validator_function/atahpt.c 2013-01-05 19:04:14.000000000 +0100 @@ -56,6 +56,12 @@ .chip_writen = fallback_chip_writen, }; +static int atahpt_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_4); +} + int atahpt_init(void) { struct pci_dev *dev = NULL; @@ -64,7 +70,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(ata_hpt, PCI_BASE_ADDRESS_4); + dev = pcidev_init(ata_hpt, atahpt_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/drkaiser.c flashrom-pcidev_init_validator_function/drkaiser.c --- flashrom-pcidev_init_do_not_return_bar/drkaiser.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/drkaiser.c 2013-01-05 18:58:40.000000000 +0100 @@ -62,6 +62,12 @@ return 0; } +static int drkaiser_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_2); +} + int drkaiser_init(void) { struct pci_dev *dev = NULL; @@ -70,7 +76,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(drkaiser_pcidev, PCI_BASE_ADDRESS_2); + dev = pcidev_init(drkaiser_pcidev, drkaiser_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/gfxnvidia.c flashrom-pcidev_init_validator_function/gfxnvidia.c --- flashrom-pcidev_init_do_not_return_bar/gfxnvidia.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/gfxnvidia.c 2013-01-05 18:59:47.000000000 +0100 @@ -83,6 +83,12 @@ return 0; } +static int gfxnvidia_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +} + int gfxnvidia_init(void) { struct pci_dev *dev = NULL; @@ -91,7 +97,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(gfx_nvidia, PCI_BASE_ADDRESS_0); + dev = pcidev_init(gfx_nvidia, gfxnvidia_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/nic3com.c flashrom-pcidev_init_validator_function/nic3com.c --- flashrom-pcidev_init_do_not_return_bar/nic3com.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/nic3com.c 2013-01-05 19:04:38.000000000 +0100 @@ -84,6 +84,12 @@ return 0; } +static int nic3com_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +} + int nic3com_init(void) { struct pci_dev *dev = NULL; @@ -91,7 +97,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(nics_3com, PCI_BASE_ADDRESS_0); + dev = pcidev_init(nics_3com, nic3com_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/nicintel.c flashrom-pcidev_init_validator_function/nicintel.c --- flashrom-pcidev_init_do_not_return_bar/nicintel.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/nicintel.c 2013-01-05 19:11:32.000000000 +0100 @@ -66,6 +66,12 @@ return 0; } +static int nicintel_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BARs. */ + return !(pcidev_readbar(dev, PCI_BASE_ADDRESS_0) && pcidev_readbar(dev, PCI_BASE_ADDRESS_2)); +} + int nicintel_init(void) { struct pci_dev *dev = NULL; @@ -78,7 +84,7 @@ return 1; /* FIXME: BAR2 is not available if the device uses the CardBus function. */ - dev = pcidev_init(nics_intel, PCI_BASE_ADDRESS_2); + dev = pcidev_init(nics_intel, nicintel_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/nicintel_spi.c flashrom-pcidev_init_validator_function/nicintel_spi.c --- flashrom-pcidev_init_do_not_return_bar/nicintel_spi.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/nicintel_spi.c 2013-01-05 19:03:01.000000000 +0100 @@ -164,6 +164,12 @@ return 0; } +static int nicintel_spi_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +} + int nicintel_spi_init(void) { struct pci_dev *dev = NULL; @@ -172,7 +178,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(nics_intel_spi, PCI_BASE_ADDRESS_0); + dev = pcidev_init(nics_intel_spi, nicintel_spi_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/nicnatsemi.c flashrom-pcidev_init_validator_function/nicnatsemi.c --- flashrom-pcidev_init_do_not_return_bar/nicnatsemi.c 2013-01-05 18:30:59.000000000 +0100 +++ flashrom-pcidev_init_validator_function/nicnatsemi.c 2013-01-05 19:03:38.000000000 +0100 @@ -52,6 +52,12 @@ .chip_writen = fallback_chip_writen, }; +static int nicnatsemi_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +} + int nicnatsemi_init(void) { struct pci_dev *dev = NULL; @@ -59,7 +65,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(nics_natsemi, PCI_BASE_ADDRESS_0); + dev = pcidev_init(nics_natsemi, nicnatsemi_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/nicrealtek.c flashrom-pcidev_init_validator_function/nicrealtek.c --- flashrom-pcidev_init_do_not_return_bar/nicrealtek.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/nicrealtek.c 2013-01-05 18:26:48.000000000 +0100 @@ -57,6 +57,12 @@ return 0; } +static int nicrealtek_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +} + int nicrealtek_init(void) { struct pci_dev *dev = NULL; @@ -64,7 +70,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(nics_realtek, PCI_BASE_ADDRESS_0); + dev = pcidev_init(nics_realtek, nicrealtek_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/ogp_spi.c flashrom-pcidev_init_validator_function/ogp_spi.c --- flashrom-pcidev_init_do_not_return_bar/ogp_spi.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/ogp_spi.c 2013-01-05 18:58:07.000000000 +0100 @@ -103,6 +103,12 @@ return 0; } +static int ogp_spi_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +} + int ogp_spi_init(void) { struct pci_dev *dev = NULL; @@ -132,7 +138,7 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(ogp_spi, PCI_BASE_ADDRESS_0); + dev = pcidev_init(ogp_spi, ogp_spi_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/pcidev.c flashrom-pcidev_init_validator_function/pcidev.c --- flashrom-pcidev_init_do_not_return_bar/pcidev.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/pcidev.c 2013-01-05 18:50:51.000000000 +0100 @@ -184,7 +184,7 @@ * also matches the specified bus:device.function. * For convenience, this function also registers its own undo handlers. */ -struct pci_dev *pcidev_init(const struct dev_entry *devs, int bar) +struct pci_dev *pcidev_init(const struct dev_entry *devs, int (*validator) (struct pci_dev *dev)) { struct pci_dev *dev; struct pci_dev *found_dev = NULL; @@ -193,7 +193,6 @@ char *msg = NULL; int found = 0; int i; - uintptr_t addr = 0; if (pci_init_common() != 0) return NULL; @@ -233,7 +232,7 @@ /* FIXME: We should count all matching devices, not * just those with a valid BAR. */ - if ((addr = pcidev_readbar(dev, bar)) != 0) { + if (!(*validator)(dev)) { found_dev = dev; found++; } diff -ur flashrom-pcidev_init_do_not_return_bar/programmer.h flashrom-pcidev_init_validator_function/programmer.h --- flashrom-pcidev_init_do_not_return_bar/programmer.h 2013-01-05 18:46:04.000000000 +0100 +++ flashrom-pcidev_init_validator_function/programmer.h 2013-01-05 18:47:33.000000000 +0100 @@ -169,7 +169,7 @@ extern struct pci_access *pacc; int pci_init_common(void); uintptr_t pcidev_readbar(struct pci_dev *dev, int bar); -struct pci_dev *pcidev_init(const struct dev_entry *devs, int bar); +struct pci_dev *pcidev_init(const struct dev_entry *devs, int (*validator) (struct pci_dev *dev)); /* rpci_write_* are reversible writes. The original PCI config space register * contents will be restored on shutdown. */ diff -ur flashrom-pcidev_init_do_not_return_bar/satamv.c flashrom-pcidev_init_validator_function/satamv.c --- flashrom-pcidev_init_do_not_return_bar/satamv.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/satamv.c 2013-01-05 19:02:30.000000000 +0100 @@ -63,6 +63,13 @@ return 0; } +static int satamv_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ +#error Check multiple BARs! + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_); +} + /* * Random notes: * FCE# Flash Chip Enable @@ -89,7 +96,7 @@ return 1; /* BAR0 has all internal registers memory mapped. */ - dev = pcidev_init(satas_mv, PCI_BASE_ADDRESS_0); + dev = pcidev_init(satas_mv, satamv_validator); if (!dev) return 1; diff -ur flashrom-pcidev_init_do_not_return_bar/satasii.c flashrom-pcidev_init_validator_function/satasii.c --- flashrom-pcidev_init_do_not_return_bar/satasii.c 2013-01-05 03:35:06.000000000 +0100 +++ flashrom-pcidev_init_validator_function/satasii.c 2013-01-05 19:09:36.000000000 +0100 @@ -74,6 +74,19 @@ return ctrl_reg; } +static int satasii_validator(struct pci_dev *dev) +{ + /* Return 0 if we have a valid BAR. */ + switch (dev->device_id) { + case 0x3132: + case 0x3124: + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_0); + break; + default: + return !pcidev_readbar(dev, PCI_BASE_ADDRESS_5); + } +} + int satasii_init(void) { struct pci_dev *dev = NULL; @@ -83,16 +96,19 @@ if (rget_io_perms()) return 1; - dev = pcidev_init(satas_sii, PCI_BASE_ADDRESS_0); + dev = pcidev_init(satas_sii, satasii_validator); if (!dev) return 1; id = dev->device_id; - if ((id == 0x3132) || (id == 0x3124)) { + switch (id) { + case 0x3132: + case 0x3124: addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); reg_offset = 0x70; - } else { + break; + default: addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_5); reg_offset = 0x50; }