summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--flash.h12
-rw-r--r--flashrom.82
-rw-r--r--flashrom.c18
-rw-r--r--nic3com.c3
-rw-r--r--pcidev.c12
-rw-r--r--satasii.c3
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)) {
OpenPOWER on IntegriCloud