diff options
author | Alexander Goncharov <chat@joursoir.net> | 2022-08-17 20:56:43 +0300 |
---|---|---|
committer | Anastasia Klimchuk <aklm@chromium.org> | 2022-08-22 22:03:59 +0000 |
commit | 1d386518653c070ba51cd88bdfeaf18c81ee8186 (patch) | |
tree | 70ffdc445eaf8843440bbde29fb1a03c191aede9 | |
parent | 66b34f8ba30026b0cf7db1ce58c8990ebbf6ad48 (diff) | |
download | flashrom-1d386518653c070ba51cd88bdfeaf18c81ee8186.tar.gz flashrom-1d386518653c070ba51cd88bdfeaf18c81ee8186.tar.bz2 flashrom-1d386518653c070ba51cd88bdfeaf18c81ee8186.zip |
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 <chat@joursoir.net>
Ticket: https://ticket.coreboot.org/issues/389
Reviewed-on: https://review.coreboot.org/c/flashrom/+/66838
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Felix Singer <felixsinger@posteo.net>
-rw-r--r-- | drkaiser.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -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); |