From 691f9794805d04beff349f1bc60ac9d7530d7cbf Mon Sep 17 00:00:00 2001 From: Vadim Bendebury Date: Mon, 22 Sep 2014 17:25:37 -0700 Subject: [PATCH] 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: Ib9d9d1f5209c2e515a95d7acbf4a8ac1255d3f8a Signed-off-by: Vadim Bendebury Reviewed-on: https://chromium-review.googlesource.com/219441 Reviewed-by: Aaron Durbin --- src/lib/cbfs_spi.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/lib/cbfs_spi.c b/src/lib/cbfs_spi.c index 717a4a3e0e..5dd8f143dd 100644 --- a/src/lib/cbfs_spi.c +++ b/src/lib/cbfs_spi.c @@ -70,27 +70,31 @@ static void *cbfs_media_unmap(struct cbfs_media *media, return cbfs_simple_buffer_unmap(&context->buffer, address); } +static int init_cbfs_media_context(void) +{ + 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.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) { - if (spi_context.buffer.buffer) - return 0; /* It has been already initialized. */ - - spi_context.spi_flash_info = spi_flash_probe - (CONFIG_BOOT_MEDIA_SPI_BUS, 0); - if (!spi_context.spi_flash_info) - return -1; - - spi_context.buffer.buffer = (void *)CONFIG_CBFS_CACHE_ADDRESS; - spi_context.buffer.size = CONFIG_CBFS_CACHE_SIZE; - 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(); }