From e23bd0e3c4e4ec8fddf8b2bc6aa6fa398781fcd1 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sat, 18 Jan 2014 17:45:32 +0100 Subject: [PATCH] SPI: Add API for programmer-specific flashing. Change-Id: I7a2f5b9ae74458b5ed6271b1c27842c61546dcd2 Signed-off-by: Vladimir Serbinenko Reviewed-on: http://review.coreboot.org/4712 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- src/drivers/spi/spi_flash.c | 15 +++++++++++++++ src/include/spi-generic.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c index d1a95046db..ada4f3a42b 100644 --- a/src/drivers/spi/spi_flash.c +++ b/src/drivers/spi/spi_flash.c @@ -267,6 +267,13 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, goto err_claim_bus; } + if (spi->force_programmer_specific && spi->programmer_specific_probe) { + flash = spi->programmer_specific_probe (spi); + if (!flash) + goto err_read_id; + goto flash_detected; + } + /* Read the ID codes */ ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode)); if (ret) @@ -295,11 +302,19 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, break; } + if (!flash && spi->programmer_specific_probe) { +#if CONFIG_SMM_TSEG && defined(__SMM__) + /* Need to relocate this function */ + tseg_relocate((void **)&spi->programmer_specific_probe); +#endif + flash = spi->programmer_specific_probe (spi); + } if (!flash) { printk(BIOS_WARNING, "SF: Unsupported manufacturer %02x\n", *idp); goto err_manufacturer_probe; } +flash_detected: #if CONFIG_SMM_TSEG && defined(__SMM__) /* Ensure flash handlers are valid for TSEG */ tseg_relocate((void **)&flash->read); diff --git a/src/include/spi-generic.h b/src/include/spi-generic.h index d252c32ab0..6cdb87a7e7 100644 --- a/src/include/spi-generic.h +++ b/src/include/spi-generic.h @@ -64,6 +64,8 @@ struct spi_slave { unsigned int bus; unsigned int cs; unsigned int rw; + int force_programmer_specific; + struct spi_flash * (*programmer_specific_probe) (struct spi_slave *spi); }; /*-----------------------------------------------------------------------