[U-Boot] [PATCH v3] spi: ich: Configure SPI BIOS parameters

Bin Meng bmeng.cn at gmail.com
Mon Feb 13 08:45:08 UTC 2017


Hi Stefan,

On Fri, Feb 10, 2017 at 6:17 PM, Stefan Roese <sr at denx.de> wrote:
> Hi Bin,
>
> On 10.02.2017 06:45, Bin Meng wrote:
>
> <snip>
>
>
>>> @@ -127,6 +120,44 @@ struct spi_trans {
>>>  #define SPI_OPCODE_WREN                0x06
>>>  #define SPI_OPCODE_FAST_READ   0x0b
>>>
>>> +#define SPI_OPCODE_TYPE_READ_NO_ADDRESS                0
>>> +#define SPI_OPCODE_TYPE_WRITE_NO_ADDRESS       1
>>> +#define SPI_OPCODE_TYPE_READ_WITH_ADDRESS      2
>>> +#define SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS     3
>>> +
>>
>>
>> Thanks for changing this.
>>
>>> +#define SPI_OPMENU_0   0x01 /* WRSR: Write Status Register */
>>> +#define SPI_OPTYPE_0   SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
>>> +
>>> +#define SPI_OPMENU_1   0x02 /* BYPR: Byte Program */
>>> +#define SPI_OPTYPE_1   SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
>>> +
>>> +#define SPI_OPMENU_2   0x03 /* READ: Read Data */
>>> +#define SPI_OPTYPE_2   SPI_OPCODE_TYPE_READ_WITH_ADDRESS
>>> +
>>> +#define SPI_OPMENU_3   0x05 /* RDSR: Read Status Register */
>>> +#define SPI_OPTYPE_3   SPI_OPCODE_TYPE_READ_NO_ADDRESS
>>> +
>>> +#define SPI_OPMENU_4   0x20 /* SE20: Sector Erase 0x20 */
>>> +#define SPI_OPTYPE_4   SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
>>> +
>>> +#define SPI_OPMENU_5   0x9f /* RDID: Read ID */
>>> +#define SPI_OPTYPE_5   SPI_OPCODE_TYPE_READ_NO_ADDRESS
>>> +
>>> +#define SPI_OPMENU_6   0xd8 /* BED8: Block Erase 0xd8 */
>>> +#define SPI_OPTYPE_6   SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
>>> +
>>> +#define SPI_OPMENU_7   0x0b /* FAST: Fast Read */
>>> +#define SPI_OPTYPE_7   SPI_OPCODE_TYPE_READ_WITH_ADDRESS
>>> +
>>
>>
>> These are SPI flash commands. Should we name them similarly like
>> SPI_OPCODE_WREN and SPI_OPCODE_FAST_READ?
>
>
> I've thought about this as well but neglected doing this (for now).
> If you think its "better" that way, I'll send a v4 shortly. Just
> let me know.
>

OK, let's leave it for now.

>>> +#define SPI_OPTYPE ((SPI_OPTYPE_7 << 14) | (SPI_OPTYPE_6 << 12) | \
>>> +                   (SPI_OPTYPE_5 << 10) | (SPI_OPTYPE_4 <<  8) | \
>>> +                   (SPI_OPTYPE_3 <<  6) | (SPI_OPTYPE_2 <<  4) | \
>>> +                   (SPI_OPTYPE_1 <<  2) | (SPI_OPTYPE_0 <<  0))
>>> +#define SPI_OPMENU_UPPER ((SPI_OPMENU_7 << 24) | (SPI_OPMENU_6 << 16) |
>>> \
>>> +                         (SPI_OPMENU_5 <<  8) | (SPI_OPMENU_4 <<  0))
>>> +#define SPI_OPMENU_LOWER ((SPI_OPMENU_3 << 24) | (SPI_OPMENU_2 << 16) |
>>> \
>>> +                         (SPI_OPMENU_1 <<  8) | (SPI_OPMENU_0 <<  0))
>>> +
>>
>>
>> What if the board mounts a flash with a different SPI flash command
>> set? Will this work?
>
>
> Frankly, I can't tell for sure but its very likely. As you might
> have guessed, these defines are taken from coreboot where they are
> usually board specific and written in the last stage before booting
> into the OS (IIRC). It would definitely make sense to add a mechanism
> to configure these BIOS parameters in a board-specific way. So that
> boards can choose to (optionally) provide different values.
>
> An easy way to do this, would be to make the newly created function
> spi_controller_config() a wear default. This way, board can always
> overwrite these default values (and / or do other stuff) in their
> board specific code. This could also be added in a follow up patch
> once this is needed though. I still have to see such a case of an
> "incompatible" SPI flash on x86, and IIRC all values in coreboot
> were identical.

I am OK with the weak implementation, but I know Simon dislikes weak
:) Maybe he has a better idea.

Let's hear what others think.

Regards,
Bin


More information about the U-Boot mailing list