[U-Boot] [PATCH 5/5] x86: fsp: Configure SPI opcode registers before SPI is locked down

Bin Meng bmeng.cn at gmail.com
Tue Sep 12 13:53:33 UTC 2017


Hi Simon,

On Wed, Sep 6, 2017 at 9:39 AM, Simon Glass <sjg at chromium.org> wrote:
> Hi Bin,
>
> On 26 August 2017 at 18:12, Bin Meng <bmeng.cn at gmail.com> wrote:
>> Hi Simon,
>>
>> On Sun, Aug 27, 2017 at 6:40 AM, Simon Glass <sjg at chromium.org> wrote:
>>> Hi Bin,
>>>
>>> On 26 August 2017 at 07:58, Bin Meng <bmeng.cn at gmail.com> wrote:
>>>> Hi Simon,
>>>>
>>>> On Sat, Aug 26, 2017 at 9:39 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>> Hi Bin,
>>>>>
>>>>> On 15 August 2017 at 23:38, Bin Meng <bmeng.cn at gmail.com> wrote:
>>>>>> Some Intel FSP (like Braswell) does SPI lock-down during the call
>>>>>> to fsp_notify(INIT_PHASE_BOOT). But before SPI lock-down is done,
>>>>>> it's bootloader's responsibility to configure the SPI controller's
>>>>>> opcode registers properly otherwise SPI controller driver doesn't
>>>>>> know how to communicate with the SPI flash device.
>>>>>>
>>>>>> This introduces a Kconfig option CONFIG_FSP_LOCKDOWN_SPI for such
>>>>>> FSPs. When it is on, U-Boot will configure the SPI opcode registers
>>>>>> before the lock-down.
>>>>>>
>>>>>> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
>>>>>> ---
>>>>>>
>>>>>>  arch/x86/Kconfig              |  9 +++++++++
>>>>>>  arch/x86/lib/fsp/fsp_common.c | 24 ++++++++++++++++++++++++
>>>>>>  2 files changed, 33 insertions(+)
>>>>>>
>>>>>> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
>>>>>> index c26710b..5373082 100644
>>>>>> --- a/arch/x86/Kconfig
>>>>>> +++ b/arch/x86/Kconfig
>>>>>> @@ -401,6 +401,15 @@ config FSP_BROKEN_HOB
>>>>>>           do not overwrite the important boot service data which is used by
>>>>>>           FSP, otherwise the subsequent call to fsp_notify() will fail.
>>>>>>
>>>>>> +config FSP_LOCKDOWN_SPI
>>>>>> +       bool
>>>>>> +       depends on HAVE_FSP
>>>>>> +       help
>>>>>> +         Some Intel FSP (like Braswell) does SPI lock-down during the call
>>>>>> +         to fsp_notify(INIT_PHASE_BOOT). This option should be turned on
>>>>>> +         for such FSP and U-Boot will configure the SPI opcode registers
>>>>>> +         before the lock-down.
>>>>>> +
>>>>>>  config ENABLE_MRC_CACHE
>>>>>>         bool "Enable MRC cache"
>>>>>>         depends on !EFI && !SYS_COREBOOT
>>>>>> diff --git a/arch/x86/lib/fsp/fsp_common.c b/arch/x86/lib/fsp/fsp_common.c
>>>>>> index 3397bb8..320d87d 100644
>>>>>> --- a/arch/x86/lib/fsp/fsp_common.c
>>>>>> +++ b/arch/x86/lib/fsp/fsp_common.c
>>>>>> @@ -19,6 +19,8 @@
>>>>>>
>>>>>>  DECLARE_GLOBAL_DATA_PTR;
>>>>>>
>>>>>> +extern void ich_spi_config_opcode(struct udevice *dev);
>>>>>> +
>>>>>>  int checkcpu(void)
>>>>>>  {
>>>>>>         return 0;
>>>>>> @@ -49,6 +51,28 @@ void board_final_cleanup(void)
>>>>>>  {
>>>>>>         u32 status;
>>>>>>
>>>>>> +#ifdef CONFIG_FSP_LOCKDOWN_SPI
>>>>>> +       struct udevice *dev;
>>>>>> +
>>>>>> +       /*
>>>>>> +        * Some Intel FSP (like Braswell) does SPI lock-down during the call
>>>>>> +        * to fsp_notify(INIT_PHASE_BOOT). But before SPI lock-down is done,
>>>>>> +        * it's bootloader's responsibility to configure the SPI controller's
>>>>>> +        * opcode registers properly otherwise SPI controller driver doesn't
>>>>>> +        * know how to communicate with the SPI flash device.
>>>>>> +        *
>>>>>> +        * Note we cannot do such configuration elsewhere (eg: during the SPI
>>>>>> +        * controller driver's probe() routine), becasue:
>>>>>> +        *
>>>>>> +        * 1). U-Boot SPI controller driver does not set the lock-down bit
>>>>>> +        * 2). Any SPI transfer will corrupt the contents of these registers
>>>>>> +        *
>>>>>> +        * Hence we have to do it right here before SPI lock-down bit is set.
>>>>>> +        */
>>>>>> +       if (!uclass_first_device_err(UCLASS_SPI, &dev))
>>>>>> +               ich_spi_config_opcode(dev);
>>>>>
>>>>> I wonder if we could do this by using an operation instead of directly
>>>>> calling a function in the driver?
>>>>>
>>>>
>>>> Do you mean adding one operation to dm_spi_ops?
>>>
>>> Yes I think that would be better.
>>>
>>
>> Since this is x86-specific, I would hesitate to add one.
>>
>
> Yes I understand that. Still I don't think we should call directly
> into drivers. What do you suggest?
>
> - add some sort of DM event system to which drivers can attach for notifications
> - add an ioctl() method to the SPI uclass where we can put random
> calls like this
> - set up a new MISC device as a child of SPI which includes an ioctl
> for this operation
> - something else?
>

These are maybe too complicated to solve this little specific issue.
I've thought about this, and looks we can add a simple DTS property
"intel,spi-lock-down" and let the driver call this function.

Regards,
Bin


More information about the U-Boot mailing list