mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-26 22:52:34 +02:00
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. Corresponding to flashrom svn r1895. Signed-off-by: Urja Rannikko <urjaman@gmail.com> Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
This commit is contained in:
parent
25e9f40e21
commit
0b4ffd58aa
@ -212,7 +212,7 @@ const struct programmer_entry programmer_table[] = {
|
|||||||
/* FIXME */
|
/* FIXME */
|
||||||
.devs.note = "All programmer devices speaking the serprog protocol\n",
|
.devs.note = "All programmer devices speaking the serprog protocol\n",
|
||||||
.init = serprog_init,
|
.init = serprog_init,
|
||||||
.map_flash_region = fallback_map,
|
.map_flash_region = serprog_map,
|
||||||
.unmap_flash_region = fallback_unmap,
|
.unmap_flash_region = fallback_unmap,
|
||||||
.delay = serprog_delay,
|
.delay = serprog_delay,
|
||||||
},
|
},
|
||||||
|
@ -706,6 +706,7 @@ int register_master(const struct registered_master *mst);
|
|||||||
#if CONFIG_SERPROG == 1
|
#if CONFIG_SERPROG == 1
|
||||||
int serprog_init(void);
|
int serprog_init(void);
|
||||||
void serprog_delay(unsigned int usecs);
|
void serprog_delay(unsigned int usecs);
|
||||||
|
void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* serial.c */
|
/* serial.c */
|
||||||
|
16
serprog.c
16
serprog.c
@ -943,3 +943,19 @@ static int serprog_spi_read(struct flashctx *flash, uint8_t *buf,
|
|||||||
}
|
}
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user