[coreboot] [RFC]flashrom: improve basic design
Joseph Smith
joe at settoplinux.org
Fri Jan 2 05:20:56 CET 2009
On Thu, 1 Jan 2009 18:21:23 +0800, "FENG Yu Ning"
<fengyuning1984 at gmail.com> wrote:
> There is a defect in basic design of flashrom. It leads to problems
> some developers are facing or going to face. A partial solution is
> proposed.
>
> 1. The Defect
>
> struct flashchip {
>
> /* ... */
>
> int (*probe) (struct flashchip *flash);
> int (*erase) (struct flashchip *flash);
> int (*write) (struct flashchip *flash, uint8_t *buf);
> int (*read) (struct flashchip *flash, uint8_t *buf);
>
> /* ... */
>
> };
>
> The struct specifies drivers for operations. It is a good design if
> the drivers deal with flash chips directly and provide interfaces for
> upper layer program to use. However, those drivers deal with every
> component in the communication chain. They do not fit into a structure
> storing information closely related to flash chips.
>
>
> 2. Problems
>
> Supporting non-standard flash chips needs to write a new driver. It
> requires the developer to be familiar with the internals of flashrom.
>
> Probe functions and IDs are seperated. They are associated by the
> flashchip structure. In nature, probe functions and IDs are questions
> and answers, and should be associated more closely. Seperated ID
> fields in struct flashchip are not very meaningful.
>
> flashrom will probably have plugins in the future. Though chips are
> operated in the same way from the view of their host devices, there is
> not much useful information for plugins in struct flashchip.
>
>
> 3. Solution
>
> We need an abstract specification of operations in struct flashchip,
> not actual code. If there have to be some information not related to
> flash chips, the less there is, the better.
>
> Abstract operation specification for SPI flash chips:
>
> /* BEGINNING OF SPECIFICATION */
>
> struct cycles {
> u8 type; /* CYCLETYPE_PREOPCODE, CYCLETYPE_OPCODE, */
> /* CYCLETYPE_ADDRESS, CYCLETYPE_DUMMY, */
> /* CYCLETYPE_DATA_IN, CYCLETYPE_DATA_OUT */
> u8 length; /* in bytes */
> u8 value_type; /* VALUETYPE_VARIABLE, VALUETYPE_FIXED */
> u32 value;
> };
>
> struct cycles byte_read[] =
> {{CYCLETYPE_OPCODE, 1, VALUETYPE_FIXED, 0x3},
> {CYCLETYPE_ADDRESS, 3, VALUETYPE_VARIABLE},
> {CYCLETYPE_DATA_IN, 1, VALUETYPE_VARIABLE}
> };
>
> struct cycles byte_program[] =
> {{CYCLETYPE_PREOPCODE, 1, VALUETYPE_FIXED, 0x6},
> {CYCLETYPE_OPCODE, 1, VALUETYPE_FIXED, 0x2},
> {CYCLETYPE_ADDRESS, 3, VALUETYPE_VARIABLE},
> {CYCLETYPE_DATA_OUT, 1, VALUETYPE_VARIABLE}
> };
>
> struct cycles SST25VF040B_probe_rdid[] =
> {{CYCLETYPE_OPCODE, 1, VALUETYPE_FIXED, 0x90},
> {CYCLETYPE_ADDRESS, 3, VALUETYPE_FIXED, 0},
> {CYCLETYPE_DATA_IN, 2, VALUETYPE_FIXED, 0xbf8d}
> };
>
> struct cycles SST25VF040B_probe_jedec[] =
> {{CYCLETYPE_OPCODE, 1, VALUETYPE_FIXED, 0x9f},
> {CYCLETYPE_DATA_IN, 3, VALUETYPE_FIXED, 0xbf258d}
> };
>
> /* END OF SPECIFICATION */
>
> Specifications for LPC and FWH flash chips will be different, but the
> point is abstraction.
>
> Comments are appreciated.
>
I agree here, especially if we are going to support external programmers
(plug-ins). This would be a big flashrom change though, and a considerable
amount of work. Have you put together a patch for review yet?
--
Thanks,
Joseph Smith
Set-Top-Linux
www.settoplinux.org
More information about the coreboot
mailing list