diff --git a/Makefile b/Makefile index db8c8c9af..513db8e88 100644 --- a/Makefile +++ b/Makefile @@ -386,7 +386,7 @@ CHIP_OBJS = jedec.o stm50.o w39.o w29ee011.o \ ############################################################################### # Library code. -LIB_OBJS = libflashrom.o layout.o flashrom.o udelay.o programmer.o programmer_table.o \ +LIB_OBJS = libflashrom.o layout.o flashrom.o udelay.o parallel.o programmer.o programmer_table.o \ helpers.o helpers_fileio.o ich_descriptors.o fmap.o platform/endian_$(ENDIAN).o platform/memaccess.o diff --git a/flashrom.c b/flashrom.c index e529249b9..8f2edb056 100644 --- a/flashrom.c +++ b/flashrom.c @@ -205,47 +205,6 @@ void programmer_unmap_flash_region(void *virt_addr, size_t len) msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr); } -void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr) -{ - flash->mst->par.chip_writeb(flash, val, addr); -} - -void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr) -{ - flash->mst->par.chip_writew(flash, val, addr); -} - -void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr) -{ - flash->mst->par.chip_writel(flash, val, addr); -} - -void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len) -{ - flash->mst->par.chip_writen(flash, buf, addr, len); -} - -uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr) -{ - return flash->mst->par.chip_readb(flash, addr); -} - -uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr) -{ - return flash->mst->par.chip_readw(flash, addr); -} - -uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr) -{ - return flash->mst->par.chip_readl(flash, addr); -} - -void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr, - size_t len) -{ - flash->mst->par.chip_readn(flash, buf, addr, len); -} - void programmer_delay(unsigned int usecs) { if (usecs > 0) diff --git a/include/flash.h b/include/flash.h index a1b83dab6..79aaa64a8 100644 --- a/include/flash.h +++ b/include/flash.h @@ -372,6 +372,7 @@ struct flashrom_flashctx { extern const struct flashchip flashchips[]; extern const unsigned int flashchips_size; +/* parallel.c */ void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr); void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr); void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr); diff --git a/include/programmer.h b/include/programmer.h index b7b128f3f..f5ce5566e 100644 --- a/include/programmer.h +++ b/include/programmer.h @@ -417,15 +417,7 @@ struct opaque_master { }; int register_opaque_master(const struct opaque_master *mst, void *data); -/* programmer.c */ -void *fallback_map(const char *descr, uintptr_t phys_addr, size_t len); -void fallback_unmap(void *virt_addr, size_t len); -void fallback_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr); -void fallback_chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr); -void fallback_chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len); -uint16_t fallback_chip_readw(const struct flashctx *flash, const chipaddr addr); -uint32_t fallback_chip_readl(const struct flashctx *flash, const chipaddr addr); -void fallback_chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len); +/* parallel.c */ struct par_master { void (*chip_writeb) (const struct flashctx *flash, uint8_t val, chipaddr addr); void (*chip_writew) (const struct flashctx *flash, uint16_t val, chipaddr addr); @@ -439,6 +431,16 @@ struct par_master { void *data; }; int register_par_master(const struct par_master *mst, const enum chipbustype buses, void *data); + +/* programmer.c */ +void *fallback_map(const char *descr, uintptr_t phys_addr, size_t len); +void fallback_unmap(void *virt_addr, size_t len); +void fallback_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr); +void fallback_chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr); +void fallback_chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len); +uint16_t fallback_chip_readw(const struct flashctx *flash, const chipaddr addr); +uint32_t fallback_chip_readl(const struct flashctx *flash, const chipaddr addr); +void fallback_chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len); struct registered_master { enum chipbustype buses_supported; struct { diff --git a/meson.build b/meson.build index 98283aa2d..f07be3e0e 100644 --- a/meson.build +++ b/meson.build @@ -97,6 +97,7 @@ srcs = files( 'layout.c', 'libflashrom.c', 'opaque.c', + 'parallel.c', 'print.c', 'programmer.c', 'programmer_table.c', diff --git a/parallel.c b/parallel.c new file mode 100644 index 000000000..9001fe80f --- /dev/null +++ b/parallel.c @@ -0,0 +1,93 @@ +/* + * This file is part of the flashrom project. + * + * Copyright (C) 2000 Silicon Integrated System Corporation + * Copyright (C) 2004 Tyan Corp + * Copyright (C) 2005-2008 coresystems GmbH + * Copyright (C) 2008,2009 Carl-Daniel Hailfinger + * Copyright (C) 2016 secunet Security Networks AG + * (Written by Nico Huber for secunet) + * Copyright (C) 2009,2010,2011 Carl-Daniel Hailfinger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "flash.h" +#include "programmer.h" + +void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr) +{ + flash->mst->par.chip_writeb(flash, val, addr); +} + +void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr) +{ + flash->mst->par.chip_writew(flash, val, addr); +} + +void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr) +{ + flash->mst->par.chip_writel(flash, val, addr); +} + +void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len) +{ + flash->mst->par.chip_writen(flash, buf, addr, len); +} + +uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr) +{ + return flash->mst->par.chip_readb(flash, addr); +} + +uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr) +{ + return flash->mst->par.chip_readw(flash, addr); +} + +uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr) +{ + return flash->mst->par.chip_readl(flash, addr); +} + +void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr, + size_t len) +{ + flash->mst->par.chip_readn(flash, buf, addr, len); +} + +int register_par_master(const struct par_master *mst, + const enum chipbustype buses, + void *data) +{ + struct registered_master rmst = {0}; + + if (mst->shutdown) { + if (register_shutdown(mst->shutdown, data)) { + mst->shutdown(data); /* cleanup */ + return 1; + } + } + + if (!mst->chip_writeb || !mst->chip_writew || !mst->chip_writel || + !mst->chip_writen || !mst->chip_readb || !mst->chip_readw || + !mst->chip_readl || !mst->chip_readn) { + msg_perr("%s called with incomplete master definition. " + "Please report a bug at flashrom@flashrom.org\n", + __func__); + return ERROR_FLASHROM_BUG; + } + + rmst.buses_supported = buses; + rmst.par = *mst; + if (data) + rmst.par.data = data; + return register_master(&rmst); +} diff --git a/programmer.c b/programmer.c index 9a67157b0..2b960e6a0 100644 --- a/programmer.c +++ b/programmer.c @@ -80,35 +80,6 @@ void fallback_chip_readn(const struct flashctx *flash, uint8_t *buf, return; } -int register_par_master(const struct par_master *mst, - const enum chipbustype buses, - void *data) -{ - struct registered_master rmst = {0}; - - if (mst->shutdown) { - if (register_shutdown(mst->shutdown, data)) { - mst->shutdown(data); /* cleanup */ - return 1; - } - } - - if (!mst->chip_writeb || !mst->chip_writew || !mst->chip_writel || - !mst->chip_writen || !mst->chip_readb || !mst->chip_readw || - !mst->chip_readl || !mst->chip_readn) { - msg_perr("%s called with incomplete master definition. " - "Please report a bug at flashrom@flashrom.org\n", - __func__); - return ERROR_FLASHROM_BUG; - } - - rmst.buses_supported = buses; - rmst.par = *mst; - if (data) - rmst.par.data = data; - return register_master(&rmst); -} - /* The limit of 4 is totally arbitrary. */ #define MASTERS_MAX 4 struct registered_master registered_masters[MASTERS_MAX];