spi: Adopt programmers to use per-flash spi master scheme
Leverage the new register dispatch mechanism by using it
to confine global usage behind an invversion of control
dispatch API for the programmers.
Sqush in,
- port bitbang_spi to new dispatch
- port opaque to new dispatch
- port programmer to new dispatch
- port dediprog to new dispatch
- remove hack in cli_classic.c
- fix dupicate const usage
V.2:
- opaque: validate {read,write}_status fn ptrs on init
V.3: squash in,
- cli_classic: keep force chip hunk en
- cli_classic: upstream uses a while loop
- flashrom: Fix buses_support check in probe_flash()
buses_supported is still a global symbol that needs to be fixed in a
follow up leading to these kinds of bugs creeping in:
```
- buses_common = buses_supported & chip->bustype;
+ buses_common = mst->buses_supported & chip->bustype;
```
BUG=chromium:478356
BRANCH=none
TEST=still builds
Change-Id: I45cd15527b72312fb5b8fedb1a9877c69446c761
Signed-off-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/flashrom/+/1710338
Reviewed-by: Sam McNally <sammc@chromium.org>
diff --git a/programmer.c b/programmer.c
index 1af52b0..9749d86 100644
--- a/programmer.c
+++ b/programmer.c
@@ -26,19 +26,6 @@
enum ich_chipset ich_generation = CHIPSET_ICH_UNKNOWN;
int ich_dry_run;
-static const struct par_master par_master_none = {
- .chip_readb = noop_chip_readb,
- .chip_readw = fallback_chip_readw,
- .chip_readl = fallback_chip_readl,
- .chip_readn = fallback_chip_readn,
- .chip_writeb = noop_chip_writeb,
- .chip_writew = fallback_chip_writew,
- .chip_writel = fallback_chip_writel,
- .chip_writen = fallback_chip_writen,
-};
-
-const struct par_master *par_master = &par_master_none;
-
/* No-op shutdown() for programmers which don't need special handling */
int noop_shutdown(void)
{
@@ -57,13 +44,7 @@
{
}
-/* No-op chip_writeb() for drivers not supporting addr/data pair accesses */
-uint8_t noop_chip_readb(const struct flashctx *flash, const chipaddr addr)
-{
- return 0xff;
-}
-
-/* No-op chip_writeb() for drivers not supporting addr/data pair accesses */
+/* No-op chip_writeb() for parallel style drivers not supporting writes */
void noop_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
{
}
@@ -116,10 +97,22 @@
return;
}
-void register_par_master(const struct par_master *pgm, const enum chipbustype buses)
+int register_par_master(const struct par_master *pgm, const enum chipbustype buses)
{
- par_master = pgm;
- buses_supported |= buses;
+ struct registered_master rmst;
+
+ if (!pgm->chip_writeb || !pgm->chip_writew || !pgm->chip_writel ||
+ !pgm->chip_writen || !pgm->chip_readb || !pgm->chip_readw ||
+ !pgm->chip_readl || !pgm->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 = *pgm;
+ return register_master(&rmst);
}
/* The limit of 4 is totally arbitrary. */