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 <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/219441
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
b71530edf3
commit
691f979480
1 changed files with 15 additions and 11 deletions
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue