[flashrom] Hardware Sequencing for ichspi.c

Stefan Tauner stefan.tauner at student.tuwien.ac.at
Fri May 27 18:36:38 CEST 2011

On Thu, 26 May 2011 03:15:02 +0200
Stefan Tauner <stefan.tauner at student.tuwien.ac.at> wrote:
> the very simple access model of hw seq is too simple for flashrom, or
> put in another way: flashrom is too sophisticated to integrate hw seq
> easily. in hw seq the target device is not a single flashchip from the
> flashchips table, but a contiguous address space which we can access by
> just setting an address, filling in the data (like in sw seq) and then
> committing the command by setting the read/write or erase mode and the
> go-flag in HSFC. 
i successfully read out the 4kB descriptor region with hardware
sequencing today. of course i had to cheat a bit, but as proof of
concept i am quite pleased with this quick success :)

my first approach was to add a new spi programmer to ichspi and
register it in ich_init_spi:
		extern struct flash_descriptor fdbar;
		if (ichspi_lock || fdbar.NC != 0)
		else {

i then added a special device to flashchips.c which points to new
probe, read, write functions in ichspi.c (without solving the const

the probing just checks if the special spi programmer is the
current/registered one.

reading is currently done by a simple 4byte-reading loop which
certainly could be improved (and maybe refactored together with the
existing run_opcode methods (which should be refactored anyway imho)).

writing is not implemented yet... and i certainly wont test it on my
hardware. if someone with an ICH (>=9)/PCH and a good way to recover
wants to test it later please step forward.
best would be if there is already a descriptor available for that
board. else we would have a nice opportunity to enhance the
ich_descriptor_tool... not on my schedule though.

i discovered another minor problem: the programmer has to have the
generic spi programmer functions implemented, that is:
	int (*command)(unsigned int writecnt, unsigned int readcnt,
		   const unsigned char *writearr, unsigned char *readarr);
	int (*multicommand)(struct spi_command *cmds);

this is (at least) needed to get correct probing output else you will
get something like:
Probing for Winbond W25Q80, 1024 kB: spi_send_command called, but SPI is unsupported on this hardware. Please report a bug at flashrom at flashrom.org

i tried to circumvent this problem by adding a new chip bus type, but
it is not trivial (register_spi_programmer sets the bus to SPI
explicitly etc) and imho not worth it.

to sum up: i think the second problem can be considered solved, but the
first one namely the constant flashchip array needs a solution. i will
probably come up with a hack later when i try to add erase and write
functions.. and probably with new problems too (erase sizes etc...).
will keep you updated ofc.
Kind regards/Mit freundlichen Grüßen, Stefan Tauner

More information about the flashrom mailing list