[coreboot-gerrit] Patch set updated for coreboot: 31ee74b Provide a common CBFS wrapper for SPI storage

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Tue Dec 30 07:30:32 CET 2014


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7932

-gerrit

commit 31ee74bb590bc251163730751f3507dc8ef4076f
Author: Vadim Bendebury <vbendeb at chromium.org>
Date:   Thu May 1 12:23:09 2014 -0700

    Provide a common CBFS wrapper for SPI storage
    
    Coreboot has all necessary infrastructure to use the proper SPI flash
    interface in bootblock for CBFS. This patch creates a common CBFS
    wrapper which can be enabled on different platforms as required.
    
    COMMON_CBFS_SPI_WRAPPER, a new configuration option, enables the
    common CBFS interface and prevents default inclusion of all SPI chip
    drivers, only explicitly configured ones will be included when the new
    feature is enabled. Since the wrapper uses the same driver at all
    stages, enabling the new feature will also make it necessary to
    include the SPI chip drivers in bootblock and romstage images.
    
    init_default_cbfs_media() can now be common for different platforms,
    and as such is defined in the library.
    
    BUG=none
    TEST=manual
       . with this change and the rest of the patches coreboot on AP148
         comes up all the way to attempting to boot the payload (reading
         earlier stages from the SPI flash along the way).
    
    Original-Change-Id: Ia887bb7f386a0e23a110e38001d86f9d43fadf2c
    Original-Signed-off-by: Vadim Bendebury <vbendeb at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/197800
    Original-Tested-by: Vadim Bendebury <vbendeb at google.com>
    Original-Reviewed-by: Aaron Durbin <adurbin at chromium.org>
    Original-Reviewed-by: David Hendricks <dhendrix at chromium.org>
    (cherry picked from commit 60eb16ebe624f9420c6191afa6ba239b8e83a6e6)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I7b0bf3dda915c227659ab62743e405312dedaf41
---
 src/Kconfig                  |  8 ++++
 src/drivers/spi/Kconfig      | 20 +++++-----
 src/drivers/spi/Makefile.inc | 23 +++++++++++
 src/lib/Makefile.inc         |  4 ++
 src/lib/cbfs_spi.c           | 95 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 140 insertions(+), 10 deletions(-)

diff --git a/src/Kconfig b/src/Kconfig
index 0fb88da..bb8bf05 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -47,6 +47,14 @@ config CBFS_PREFIX
 	  Select the prefix to all files put into the image. It's "fallback"
 	  by default, "normal" is a common alternative.
 
+config COMMON_CBFS_SPI_WRAPPER
+	bool
+	default n
+	depends on SPI_FLASH
+	depends on !ARCH_X86
+	help
+	 Use common wrapper to interface CBFS to SPI bootrom.
+
 choice
 	prompt "Compiler to use"
 	default COMPILER_GCC
diff --git a/src/drivers/spi/Kconfig b/src/drivers/spi/Kconfig
index cc8703f..3a1950f 100644
--- a/src/drivers/spi/Kconfig
+++ b/src/drivers/spi/Kconfig
@@ -59,70 +59,70 @@ config SPI_FLASH_NO_FAST_READ
 
 config SPI_FLASH_ADESTO
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by Adesto Technologies.
 
 config SPI_FLASH_AMIC
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by AMIC.
 
 config SPI_FLASH_ATMEL
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by Atmel.
 
 config SPI_FLASH_EON
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by EON.
 
 config SPI_FLASH_GIGADEVICE
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by Gigadevice.
 
 config SPI_FLASH_MACRONIX
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by Macronix.
 
 config SPI_FLASH_SPANSION
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by Spansion.
 
 config SPI_FLASH_SST
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by SST.
 
 config SPI_FLASH_STMICRO
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by ST MICRO.
 
 config SPI_FLASH_WINBOND
 	bool
-	default y
+	default y if !COMMON_CBFS_SPI_WRAPPER
 	help
 	  Select this option if your chipset driver needs to store certain
 	  data in the SPI flash and your SPI flash is made by Winbond.
diff --git a/src/drivers/spi/Makefile.inc b/src/drivers/spi/Makefile.inc
index 934743e..1bada79 100644
--- a/src/drivers/spi/Makefile.inc
+++ b/src/drivers/spi/Makefile.inc
@@ -1,4 +1,27 @@
 # SPI flash driver interface
+
+ifeq ($(CONFIG_COMMON_CBFS_SPI_WRAPPER),y)
+bootblock-y += spi_flash.c
+bootblock-$(CONFIG_SPI_FLASH_EON) += eon.c
+bootblock-$(CONFIG_SPI_FLASH_GIGADEVICE) += gigadevice.c
+bootblock-$(CONFIG_SPI_FLASH_MACRONIX) += macronix.c
+bootblock-$(CONFIG_SPI_FLASH_SPANSION) += spansion.c
+bootblock-$(CONFIG_SPI_FLASH_SST) += sst.c
+bootblock-$(CONFIG_SPI_FLASH_STMICRO) += stmicro.c
+bootblock-$(CONFIG_SPI_FLASH_WINBOND) += winbond.c
+bootblock-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.c
+
+romstage-$(CONFIG_SPI_FLASH) += spi_flash.c
+romstage-$(CONFIG_SPI_FLASH_EON) += eon.c
+romstage-$(CONFIG_SPI_FLASH_GIGADEVICE) += gigadevice.c
+romstage-$(CONFIG_SPI_FLASH_MACRONIX) += macronix.c
+romstage-$(CONFIG_SPI_FLASH_SPANSION) += spansion.c
+romstage-$(CONFIG_SPI_FLASH_SST) += sst.c
+romstage-$(CONFIG_SPI_FLASH_STMICRO) += stmicro.c
+romstage-$(CONFIG_SPI_FLASH_WINBOND) += winbond.c
+romstage-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.c
+endif
+
 ramstage-$(CONFIG_SPI_FLASH) += spi_flash.c
 
 # drivers
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 327c9f2..2dbf905 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -19,6 +19,8 @@
 subdirs-y += loaders
 
 bootblock-y += cbfs.c cbfs_core.c
+bootblock-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
+
 bootblock-y += memchr.c
 bootblock-y += memcmp.c
 
@@ -29,6 +31,7 @@ $(foreach arch,$(ARCH_SUPPORTED),\
 
 romstage-$(CONFIG_I2C_TPM) += delay.c
 romstage-y += cbfs.c cbfs_core.c
+romstage-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
 romstage-$(CONFIG_COMPRESS_RAMSTAGE) += lzma.c lzmadecode.c
 romstage-$(CONFIG_CACHE_AS_RAM) += ramtest.c
 
@@ -55,6 +58,7 @@ ramstage-y += delay.c
 ramstage-y += fallback_boot.c
 ramstage-y += compute_ip_checksum.c
 ramstage-y += cbfs.c cbfs_core.c
+ramstage-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
 ramstage-y += lzma.c lzmadecode.c
 ramstage-y += stack.c
 ramstage-y += clog2.c
diff --git a/src/lib/cbfs_spi.c b/src/lib/cbfs_spi.c
new file mode 100644
index 0000000..4471532
--- /dev/null
+++ b/src/lib/cbfs_spi.c
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2014 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/*
+ * This file provides a common CBFS wrapper for SPI storage. SPI driver
+ * context is expanded with the buffer descriptor used to store data read from
+ * SPI.
+ */
+
+#include <cbfs.h>
+#include <spi_flash.h>
+
+/* SPI flash as CBFS media. */
+struct cbfs_spi_context {
+	struct spi_flash *spi_flash_info;
+	struct cbfs_simple_buffer buffer;
+};
+
+static struct cbfs_spi_context spi_context;
+
+static int cbfs_media_open(struct cbfs_media *media)
+{
+	return 0;
+}
+
+static int cbfs_media_close(struct cbfs_media *media)
+{
+	return 0;
+}
+
+static size_t cbfs_media_read(struct cbfs_media *media,
+			      void *dest, size_t offset,
+			      size_t count)
+{
+	struct cbfs_spi_context *context = media->context;
+
+	return context->spi_flash_info->read
+		(context->spi_flash_info, offset, count, dest) ? 0 : count;
+}
+
+static void *cbfs_media_map(struct cbfs_media *media,
+			    size_t offset, size_t count)
+{
+	struct cbfs_spi_context *context = media->context;
+
+	return cbfs_simple_buffer_map(&context->buffer, media, offset, count);
+}
+
+static void *cbfs_media_unmap(struct cbfs_media *media,
+			       const void *address)
+{
+	struct cbfs_spi_context *context = media->context;
+
+	return cbfs_simple_buffer_unmap(&context->buffer, address);
+}
+
+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;
+}



More information about the coreboot-gerrit mailing list