From b0912c0adbe3d46bc49babe8c22388da7230d473 Mon Sep 17 00:00:00 2001 From: TURBO J Date: Wed, 2 Sep 2009 23:00:46 +0000 Subject: Add support for parallel flash on Dr. Kaiser PC-Waechter PCI devices The vendor sold different designs under that name, the patch works with the one that has an Actel FPGA as PCI-to-Flash bridge. The Flash chip is a "Macronix MX29F001B" (128 KB, parallel) soldered directly to the PCB. Flash operations (PROBE, READ, ERASE, WRITE) work as expected. Corresponding to flashrom svn r712. Signed-off-by: TURBO J Acked-by: Uwe Hermann --- Makefile | 2 +- flash.h | 12 ++++++++++-- flashrom.8 | 2 ++ flashrom.c | 18 ++++++++++++++++++ nic3com.c | 3 ++- pcidev.c | 12 ++++++------ satasii.c | 3 ++- 7 files changed, 41 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 881c8f2..17d1cf1 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ OBJS = chipset_enable.o board_enable.o udelay.o jedec.o stm50flw0x0x.o \ flashrom.o w39v080fa.o sharplhf00l04.o w29ee011.o spi.o it87spi.o \ ichspi.o w39v040c.o sb600spi.o wbsio_spi.o m29f002.o internal.o \ dummyflasher.o pcidev.o nic3com.o satasii.o ft2232_spi.o \ - print.o + print.o drkaiser.o all: pciutils features dep $(PROGRAM) diff --git a/flash.h b/flash.h index d3e2e30..8752c4a 100644 --- a/flash.h +++ b/flash.h @@ -84,6 +84,7 @@ enum programmer { PROGRAMMER_INTERNAL, PROGRAMMER_DUMMY, PROGRAMMER_NIC3COM, + PROGRAMMER_DRKAISER, PROGRAMMER_SATASII, PROGRAMMER_IT87SPI, #if FT2232_SPI_SUPPORT == 1 @@ -281,8 +282,8 @@ struct pcidev_status { const char *vendor_name; const char *device_name; }; -uint32_t pcidev_validate(struct pci_dev *dev, struct pcidev_status *devs); -uint32_t pcidev_init(uint16_t vendor_id, struct pcidev_status *devs, char *pcidev_bdf); +uint32_t pcidev_validate(struct pci_dev *dev, uint32_t bar, struct pcidev_status *devs); +uint32_t pcidev_init(uint16_t vendor_id, uint32_t bar, struct pcidev_status *devs, char *pcidev_bdf); /* print.c */ char *flashbuses_to_text(enum chipbustype bustype); @@ -387,6 +388,13 @@ void nic3com_chip_writeb(uint8_t val, chipaddr addr); uint8_t nic3com_chip_readb(const chipaddr addr); extern struct pcidev_status nics_3com[]; +/* drkaiser.c */ +int drkaiser_init(void); +int drkaiser_shutdown(void); +void drkaiser_chip_writeb(uint8_t val, chipaddr addr); +uint8_t drkaiser_chip_readb(const chipaddr addr); +extern struct pcidev_status drkaiser_pcidev[]; + /* satasii.c */ int satasii_init(void); int satasii_shutdown(void); diff --git a/flashrom.8 b/flashrom.8 index 1324854..6ceeded 100644 --- a/flashrom.8 +++ b/flashrom.8 @@ -140,6 +140,8 @@ Specify the programmer device. Currently supported are: .sp .BR "* nic3com" " (for flash ROMs on 3COM network cards)" .sp +.BR "* drkaiser" " (for flash ROMs on Dr. Kaiser PC-Waechter PCI cards)" +.sp .BR "* satasii" " (for flash ROMs on Silicon Image SATA/IDE controllers)" .sp .BR "* it87spi" " (for flash ROMs behind an ITE IT87xx Super I/O LPC/SPI translation unit)" diff --git a/flashrom.c b/flashrom.c index fc80301..6da6741 100644 --- a/flashrom.c +++ b/flashrom.c @@ -89,6 +89,23 @@ const struct programmer_entry programmer_table[] = { }, { + .name = "drkaiser", + .init = drkaiser_init, + .shutdown = drkaiser_shutdown, + .map_flash_region = fallback_map, + .unmap_flash_region = fallback_unmap, + .chip_readb = drkaiser_chip_readb, + .chip_readw = fallback_chip_readw, + .chip_readl = fallback_chip_readl, + .chip_readn = fallback_chip_readn, + .chip_writeb = drkaiser_chip_writeb, + .chip_writew = fallback_chip_writew, + .chip_writel = fallback_chip_writel, + .chip_writen = fallback_chip_writen, + .delay = internal_delay, + }, + + { .name = "satasii", .init = satasii_init, .shutdown = satasii_shutdown, @@ -747,6 +764,7 @@ int main(int argc, char *argv[]) printf("\nSupported PCI devices flashrom can use " "as programmer:\n\n"); print_supported_pcidevs(nics_3com); + print_supported_pcidevs(drkaiser_pcidev); print_supported_pcidevs(satas_sii); exit(0); } diff --git a/nic3com.c b/nic3com.c index 075e760..a4878d2 100644 --- a/nic3com.c +++ b/nic3com.c @@ -58,7 +58,8 @@ int nic3com_init(void) { get_io_perms(); - io_base_addr = pcidev_init(PCI_VENDOR_ID_3COM, nics_3com, programmer_param); + io_base_addr = pcidev_init(PCI_VENDOR_ID_3COM, PCI_BASE_ADDRESS_0, + nics_3com, programmer_param); id = pcidev_dev->device_id; /* 3COM 3C90xB cards need a special fixup. */ diff --git a/pcidev.c b/pcidev.c index 580ebae..3ad9db5 100644 --- a/pcidev.c +++ b/pcidev.c @@ -28,7 +28,7 @@ struct pci_access *pacc; struct pci_filter filter; struct pci_dev *pcidev_dev = NULL; -uint32_t pcidev_validate(struct pci_dev *dev, struct pcidev_status *devs) +uint32_t pcidev_validate(struct pci_dev *dev, uint32_t bar, struct pcidev_status *devs) { int i; uint32_t addr; @@ -37,9 +37,9 @@ uint32_t pcidev_validate(struct pci_dev *dev, struct pcidev_status *devs) if (dev->device_id != devs[i].device_id) continue; - /* Don't use dev->base_addr[0], won't work on older libpci. */ - addr = pci_read_long(dev, PCI_BASE_ADDRESS_0) & ~0x03; - + /* Don't use dev->base_addr[x] (as value for 'bar'), won't work on older libpci. */ + addr = pci_read_long(dev, bar) & ~0x03; + 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); @@ -57,7 +57,7 @@ uint32_t pcidev_validate(struct pci_dev *dev, struct pcidev_status *devs) return 0; } -uint32_t pcidev_init(uint16_t vendor_id, struct pcidev_status *devs, char *pcidev_bdf) +uint32_t pcidev_init(uint16_t vendor_id, uint32_t bar, struct pcidev_status *devs, char *pcidev_bdf) { struct pci_dev *dev; char *msg = NULL; @@ -80,7 +80,7 @@ uint32_t pcidev_init(uint16_t vendor_id, struct pcidev_status *devs, char *pcide for (dev = pacc->devices; dev; dev = dev->next) { if (pci_filter_match(&filter, dev)) { - if ((addr = pcidev_validate(dev, devs)) != 0) { + if ((addr = pcidev_validate(dev, bar, devs)) != 0) { curaddr = addr; pcidev_dev = dev; found++; diff --git a/satasii.c b/satasii.c index 2564436..79d4325 100644 --- a/satasii.c +++ b/satasii.c @@ -47,7 +47,8 @@ int satasii_init(void) get_io_perms(); - pcidev_init(PCI_VENDOR_ID_SII, satas_sii, programmer_param); + pcidev_init(PCI_VENDOR_ID_SII, PCI_BASE_ADDRESS_0, satas_sii, + programmer_param); id = pcidev_dev->device_id; if ((id == 0x3132) || (id == 0x3124)) { -- cgit v1.1