From 1d386518653c070ba51cd88bdfeaf18c81ee8186 Mon Sep 17 00:00:00 2001 From: Alexander Goncharov Date: Wed, 17 Aug 2022 20:56:43 +0300 Subject: drkaiser: restore flash writing access state explicitly Instead of using reversible write (rpci_write_word) that relies on global state, do it manually. Save original PCI config space register contents to programmer's structure during initialization and restore it in programmer's shutdown. TOPIC=reduce_global_pci_state TEST=builds Change-Id: Ie99a7cb3e049b29e6838dd4af587eee8c3b18919 Signed-off-by: Alexander Goncharov Ticket: https://ticket.coreboot.org/issues/389 Reviewed-on: https://review.coreboot.org/c/flashrom/+/66838 Tested-by: build bot (Jenkins) Reviewed-by: Nico Huber Reviewed-by: Felix Singer --- drkaiser.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'drkaiser.c') diff --git a/drkaiser.c b/drkaiser.c index 902f332ff..9267dfe0d 100644 --- a/drkaiser.c +++ b/drkaiser.c @@ -31,7 +31,9 @@ #define DRKAISER_MEMMAP_MASK ((1 << 17) - 1) struct drkaiser_data { + struct pci_dev *dev; uint8_t *bar; + uint16_t flash_access; }; static const struct dev_entry drkaiser_pcidev[] = { @@ -58,6 +60,11 @@ static uint8_t drkaiser_chip_readb(const struct flashctx *flash, static int drkaiser_shutdown(void *par_data) { + struct drkaiser_data *data = par_data; + + /* Restore original flash writing state. */ + pci_write_word(data->dev, PCI_MAGIC_DRKAISER_ADDR, data->flash_access); + free(par_data); return 0; } @@ -88,9 +95,6 @@ static int drkaiser_init(void) if (!addr) return 1; - /* Write magic register to enable flash write. */ - rpci_write_word(dev, PCI_MAGIC_DRKAISER_ADDR, PCI_MAGIC_DRKAISER_VALUE); - /* Map 128kB flash memory window. */ bar = rphysmap("Dr. Kaiser PC-Waechter flash memory", addr, DRKAISER_MEMMAP_SIZE); if (bar == ERROR_PTR) @@ -101,8 +105,13 @@ static int drkaiser_init(void) msg_perr("Unable to allocate space for PAR master data\n"); return 1; } + data->dev = dev; data->bar = bar; + /* Write magic register to enable flash write. */ + data->flash_access = pci_read_word(dev, PCI_MAGIC_DRKAISER_ADDR); + pci_write_word(dev, PCI_MAGIC_DRKAISER_ADDR, PCI_MAGIC_DRKAISER_VALUE); + max_rom_decode.parallel = 128 * 1024; return register_par_master(&par_master_drkaiser, BUS_PARALLEL, data); -- cgit v1.2.3