[flashrom] [PATCH] ICH SPI address window for reads
David Hendricks
dhendrix at google.com
Wed Sep 15 02:06:25 CEST 2010
On Tue, Sep 14, 2010 at 4:59 PM, Carl-Daniel Hailfinger <
c-d.hailfinger.devel.2006 at gmx.net> wrote:
> ICH SPI has the ability to restrict SPI read/write accesses to a given
> address range. The low end of the range is configurable by the BIOS (and
> by flashrom if the BIOS didn't lock down the flash interface), the high
> end of the range is 0xffffff (2^24-1).
> This patch checks for an address range restriction and uses the low end
> of the allowed range as base for SPI reads. A similar workaround for
> REMS/RES opcodes has been committed in r500.
>
> This fixes read on the Intel D945GCLF mainboard where the stock BIOS
> enforces a restricted address range.
> Please note that writes need the same fix, but for architectural reasons
> that fix will be merged once partial write is available.
>
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
>
> Index: flashrom-ichspi_read_use_min_addr/spi.c
> ===================================================================
> --- flashrom-ichspi_read_use_min_addr/spi.c (Revision 1165)
> +++ flashrom-ichspi_read_use_min_addr/spi.c (Arbeitskopie)
> @@ -22,6 +22,7 @@
> * Contains the generic SPI framework
> */
>
> +#include <string.h>
> #include "flash.h"
> #include "flashchips.h"
> #include "chipdrivers.h"
> @@ -207,6 +208,7 @@
>
> int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int
> len)
> {
> + int addrbase = 0;
> if (!spi_programmer[spi_controller].read) {
> msg_perr("%s called, but SPI read is unsupported on this "
> "hardware. Please report a bug at "
> @@ -214,7 +216,26 @@
> return 1;
> }
>
> - return spi_programmer[spi_controller].read(flash, buf, start, len);
> + /* Check if the chip fits between lowest valid and highest possible
> + * address. Highest possible address with the current SPI
> implementation
> + * means 0xffffff, the highest unsigned 24bit number.
> + */
> + addrbase = spi_get_valid_read_addr();
> + if (addrbase + flash->total_size * 1024 > (1 << 24)) {
> + msg_perr("Flash chip size exceeds the allowed access
> window. ");
> + msg_perr("Read will probably fail.\n");
> + /* Try to get the best alignment subject to constraints. */
> + addrbase = (1 << 24) - flash->total_size * 1024;
> + }
> + /* Check if alignment is native (at least the largest power of two
> which
> + * is a factor of the mapped size of the chip).
> + */
> + if (ffs(flash->total_size * 1024) > (ffs(addrbase) ? : 33)) {
> + msg_perr("Flash chip is not aligned natively in the allowed
> "
> + "access window.\n");
> + msg_perr("Read will probably return garbage.\n");
> + }
> + return spi_programmer[spi_controller].read(flash, buf, addrbase +
> start, len);
> }
>
> /*
>
I applied and tested the patch with positive results:
http://paste.flashrom.org/view.php?id=79
Acked-by: David Hendricks <dhendrix at google.com>
--
David Hendricks (dhendrix)
Systems Software Engineer, Google Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.flashrom.org/pipermail/flashrom/attachments/20100914/8826b0ab/attachment.html>
More information about the flashrom
mailing list