summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2014-09-22 17:25:37 -0700
committerPatrick Georgi <pgeorgi@google.com>2015-03-26 08:53:39 +0100
commita88c9197674be58f993a3cf104b4554f190d7b12 (patch)
treef5b05c053d5881d0f242fcc2e318590d9b47bf60
parent62434f088f1081b835ca74a37dc074e1fcb757e5 (diff)
downloadcoreboot-a88c9197674be58f993a3cf104b4554f190d7b12.tar.xz
cbfs: support concurrent media channels properly
Coreboot generic CBFS media API does not support multiple media access instances, but it should. With this fix the CBFS context (memory cache for SPI accesses) is shared among all open media access streams. A better memory management scheme might be required, but for now this fix allows to support booting deptcharge and accessing VPD through two independent CBFS media streams. BUG=chrome-os-partner:32152 TEST=no exception is thrown when the second stream is opened Change-Id: I62889089b4832c9e9760ef24ecc517220d8f3ec4 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 691f9794805d04beff349f1bc60ac9d7530d7cbf Original-Change-Id: Ib9d9d1f5209c2e515a95d7acbf4a8ac1255d3f8a Original-Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/219441 Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/8897 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r--src/lib/cbfs_spi.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/lib/cbfs_spi.c b/src/lib/cbfs_spi.c
index 447153295f..2b3728efaa 100644
--- a/src/lib/cbfs_spi.c
+++ b/src/lib/cbfs_spi.c
@@ -70,26 +70,30 @@ static void *cbfs_media_unmap(struct cbfs_media *media,
return cbfs_simple_buffer_unmap(&context->buffer, address);
}
-int init_default_cbfs_media(struct cbfs_media *media)
+static int init_cbfs_media_context(void)
{
- if (spi_context.buffer.buffer)
- return 0; /* It has been already initialized. */
+ if (!spi_context.spi_flash_info) {
- spi_context.spi_flash_info = spi_flash_probe
- (CONFIG_BOOT_MEDIA_SPI_BUS, 0);
- if (!spi_context.spi_flash_info)
- return -1;
+ spi_context.spi_flash_info = spi_flash_probe
+ (CONFIG_BOOT_MEDIA_SPI_BUS, 0);
- spi_context.buffer.buffer = (void *)CONFIG_CBFS_CACHE_ADDRESS;
- spi_context.buffer.size = CONFIG_CBFS_CACHE_SIZE;
+ if (!spi_context.spi_flash_info)
+ return -1;
- media->context = &spi_context;
+ spi_context.buffer.buffer = (void *)CONFIG_CBFS_CACHE_ADDRESS;
+ spi_context.buffer.size = CONFIG_CBFS_CACHE_SIZE;
+ }
+ return 0;
+}
+int init_default_cbfs_media(struct cbfs_media *media)
+{
+ media->context = &spi_context;
media->open = cbfs_media_open;
media->close = cbfs_media_close;
media->read = cbfs_media_read;
media->map = cbfs_media_map;
media->unmap = cbfs_media_unmap;
- return 0;
+ return init_cbfs_media_context();
}