mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
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 <turboj@gmx.de> Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
This commit is contained in:
parent
04aa59a864
commit
b0912c0adb
2
Makefile
2
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 \
|
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 \
|
ichspi.o w39v040c.o sb600spi.o wbsio_spi.o m29f002.o internal.o \
|
||||||
dummyflasher.o pcidev.o nic3com.o satasii.o ft2232_spi.o \
|
dummyflasher.o pcidev.o nic3com.o satasii.o ft2232_spi.o \
|
||||||
print.o
|
print.o drkaiser.o
|
||||||
|
|
||||||
all: pciutils features dep $(PROGRAM)
|
all: pciutils features dep $(PROGRAM)
|
||||||
|
|
||||||
|
12
flash.h
12
flash.h
@ -84,6 +84,7 @@ enum programmer {
|
|||||||
PROGRAMMER_INTERNAL,
|
PROGRAMMER_INTERNAL,
|
||||||
PROGRAMMER_DUMMY,
|
PROGRAMMER_DUMMY,
|
||||||
PROGRAMMER_NIC3COM,
|
PROGRAMMER_NIC3COM,
|
||||||
|
PROGRAMMER_DRKAISER,
|
||||||
PROGRAMMER_SATASII,
|
PROGRAMMER_SATASII,
|
||||||
PROGRAMMER_IT87SPI,
|
PROGRAMMER_IT87SPI,
|
||||||
#if FT2232_SPI_SUPPORT == 1
|
#if FT2232_SPI_SUPPORT == 1
|
||||||
@ -281,8 +282,8 @@ struct pcidev_status {
|
|||||||
const char *vendor_name;
|
const char *vendor_name;
|
||||||
const char *device_name;
|
const char *device_name;
|
||||||
};
|
};
|
||||||
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);
|
||||||
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);
|
||||||
|
|
||||||
/* print.c */
|
/* print.c */
|
||||||
char *flashbuses_to_text(enum chipbustype bustype);
|
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);
|
uint8_t nic3com_chip_readb(const chipaddr addr);
|
||||||
extern struct pcidev_status nics_3com[];
|
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 */
|
/* satasii.c */
|
||||||
int satasii_init(void);
|
int satasii_init(void);
|
||||||
int satasii_shutdown(void);
|
int satasii_shutdown(void);
|
||||||
|
@ -140,6 +140,8 @@ Specify the programmer device. Currently supported are:
|
|||||||
.sp
|
.sp
|
||||||
.BR "* nic3com" " (for flash ROMs on 3COM network cards)"
|
.BR "* nic3com" " (for flash ROMs on 3COM network cards)"
|
||||||
.sp
|
.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)"
|
.BR "* satasii" " (for flash ROMs on Silicon Image SATA/IDE controllers)"
|
||||||
.sp
|
.sp
|
||||||
.BR "* it87spi" " (for flash ROMs behind an ITE IT87xx Super I/O LPC/SPI translation unit)"
|
.BR "* it87spi" " (for flash ROMs behind an ITE IT87xx Super I/O LPC/SPI translation unit)"
|
||||||
|
18
flashrom.c
18
flashrom.c
@ -88,6 +88,23 @@ const struct programmer_entry programmer_table[] = {
|
|||||||
.delay = internal_delay,
|
.delay = internal_delay,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
.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",
|
.name = "satasii",
|
||||||
.init = satasii_init,
|
.init = satasii_init,
|
||||||
@ -747,6 +764,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("\nSupported PCI devices flashrom can use "
|
printf("\nSupported PCI devices flashrom can use "
|
||||||
"as programmer:\n\n");
|
"as programmer:\n\n");
|
||||||
print_supported_pcidevs(nics_3com);
|
print_supported_pcidevs(nics_3com);
|
||||||
|
print_supported_pcidevs(drkaiser_pcidev);
|
||||||
print_supported_pcidevs(satas_sii);
|
print_supported_pcidevs(satas_sii);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,8 @@ int nic3com_init(void)
|
|||||||
{
|
{
|
||||||
get_io_perms();
|
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;
|
id = pcidev_dev->device_id;
|
||||||
|
|
||||||
/* 3COM 3C90xB cards need a special fixup. */
|
/* 3COM 3C90xB cards need a special fixup. */
|
||||||
|
12
pcidev.c
12
pcidev.c
@ -28,7 +28,7 @@ struct pci_access *pacc;
|
|||||||
struct pci_filter filter;
|
struct pci_filter filter;
|
||||||
struct pci_dev *pcidev_dev = NULL;
|
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;
|
int i;
|
||||||
uint32_t addr;
|
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)
|
if (dev->device_id != devs[i].device_id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Don't use dev->base_addr[0], won't work on older libpci. */
|
/* Don't use dev->base_addr[x] (as value for 'bar'), won't work on older libpci. */
|
||||||
addr = pci_read_long(dev, PCI_BASE_ADDRESS_0) & ~0x03;
|
addr = pci_read_long(dev, bar) & ~0x03;
|
||||||
|
|
||||||
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, dev->vendor_id,
|
devs[i].vendor_name, devs[i].device_name, dev->vendor_id,
|
||||||
dev->device_id, dev->bus, dev->dev, dev->func);
|
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;
|
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;
|
struct pci_dev *dev;
|
||||||
char *msg = NULL;
|
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) {
|
for (dev = pacc->devices; dev; dev = dev->next) {
|
||||||
if (pci_filter_match(&filter, dev)) {
|
if (pci_filter_match(&filter, dev)) {
|
||||||
if ((addr = pcidev_validate(dev, devs)) != 0) {
|
if ((addr = pcidev_validate(dev, bar, devs)) != 0) {
|
||||||
curaddr = addr;
|
curaddr = addr;
|
||||||
pcidev_dev = dev;
|
pcidev_dev = dev;
|
||||||
found++;
|
found++;
|
||||||
|
@ -47,7 +47,8 @@ int satasii_init(void)
|
|||||||
|
|
||||||
get_io_perms();
|
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;
|
id = pcidev_dev->device_id;
|
||||||
|
|
||||||
if ((id == 0x3132) || (id == 0x3124)) {
|
if ((id == 0x3132) || (id == 0x3124)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user