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

Simon Glass sjg at chromium.org
Wed Sep 13 02:31:36 UTC 2017


Hi Bin,

On 12 September 2017 at 07:53, Bin Meng <bmeng.cn at gmail.com> wrote:
> 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.

OK, sounds good so long as it knows when to call it.

Regards,
Simon


More information about the U-Boot mailing list