Author: stefanct Date: Tue Jun 30 01:24:23 2015 New Revision: 1895 URL: http://flashrom.org/trac/flashrom/changeset/1895
Log: serprog: Fix FWH/LPC by implementing serprog_map.
The serprog protocol does only transmit 24 bit-wide address and ignores the top 8 bit. This is fine as long as the underlying hardware ignores the latter anyway (which is the case for parallel chips that even lack the respective pins). FWH/LPC chips, however, operate on a full 32-bit (LPC) or 28-bit (FWH) address space and would fail with the fallback mapping to NULL.
Signed-off-by: Urja Rannikko urjaman@gmail.com Acked-by: Stefan Tauner stefan.tauner@alumni.tuwien.ac.at
Modified: trunk/flashrom.c trunk/programmer.h trunk/serprog.c
Modified: trunk/flashrom.c ============================================================================== --- trunk/flashrom.c Sun Jun 28 15:31:19 2015 (r1894) +++ trunk/flashrom.c Tue Jun 30 01:24:23 2015 (r1895) @@ -212,7 +212,7 @@ /* FIXME */ .devs.note = "All programmer devices speaking the serprog protocol\n", .init = serprog_init, - .map_flash_region = fallback_map, + .map_flash_region = serprog_map, .unmap_flash_region = fallback_unmap, .delay = serprog_delay, },
Modified: trunk/programmer.h ============================================================================== --- trunk/programmer.h Sun Jun 28 15:31:19 2015 (r1894) +++ trunk/programmer.h Tue Jun 30 01:24:23 2015 (r1895) @@ -706,6 +706,7 @@ #if CONFIG_SERPROG == 1 int serprog_init(void); void serprog_delay(unsigned int usecs); +void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len); #endif
/* serial.c */
Modified: trunk/serprog.c ============================================================================== --- trunk/serprog.c Sun Jun 28 15:31:19 2015 (r1894) +++ trunk/serprog.c Tue Jun 30 01:24:23 2015 (r1895) @@ -943,3 +943,19 @@ } return 0; } + +void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len) +{ + /* Serprog transmits 24 bits only and assumes the underlying implementation handles any remaining bits + * correctly (usually setting them to one either in software (for FWH/LPC) or relying on the fact that + * the hardware observes a subset of the address bits only). Combined with the standard mapping of + * flashrom this creates a 16 MB-wide window just below the 4 GB boundary where serprog can operate (as + * needed for non-SPI chips). Below we make sure that the requested range is within this window. */ + if ((phys_addr & 0xFF000000) == 0xFF000000) { + return (void*)phys_addr; + } else { + msg_pwarn(MSGHEADER "requested mapping %s is incompatible: 0x%zx bytes at 0x%0*" PRIxPTR ".\n", + descr, len, PRIxPTR_WIDTH, phys_addr); + return NULL; + } +}