[U-Boot] [PATCH] arm: socfpga: stratix10: Add generic FPGA reconfig mailbox API for S10

Marek Vasut marex at denx.de
Sun Sep 30 08:13:12 UTC 2018


On 09/28/2018 11:29 AM, Ang, Chee Hong wrote:
> On Thu, 2018-09-27 at 22:39 +0200, Marek Vasut wrote:
>> On 09/27/2018 08:37 AM, Ang, Chee Hong wrote:
>>>
>>> On Thu, 2018-09-27 at 08:21 +0200, Marek Vasut wrote:
>>>>
>>>> On 09/27/2018 07:08 AM, Ang, Chee Hong wrote:
>>>>>
>>>>>
>>>>> On Wed, 2018-09-26 at 16:53 +0200, Marek Vasut wrote:
>>>>>>
>>>>>>
>>>>>> On 09/26/2018 11:03 AM, chee.hong.ang at intel.com wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> From: "Ang, Chee Hong" <chee.hong.ang at intel.com>
>>>>>>>
>>>>>>> Add a generic mailbox API for FPGA reconfig status which
>>>>>>> can be
>>>>>>> called by others. This new function accepts 2 different
>>>>>>> mailbox
>>>>>>> commands: CONFIG_STATUS or RECONFIG_STATUS.
>>>>>> What "others" can call this ?
>>>>> This is a common function used to check the readiness of the
>>>>> FPGA.
>>>>> FPGA configuration drivers will need to call this to make sure
>>>>> the FPGA configuration is successfully completed and running.
>>>>> These FPGA configuration drivers will be submitted soon after
>>>>> this
>>>>> patch.
>>>> So this should be in drivers/fpga/ ?
>>> Yes. There is a FPGA configuration driver under this folder. Will
>>> submit soon.
>>>>
>>>>
>>>> Also, don't add dead code, just submit this alongside the user of
>>>> this code.
>>> The reason I try to get this common function upstream is because my
>>> colleague is trying to upstream socfpga dwmac driver which also
>>> need to
>>> call this function to check whether the soft Ip running on FPGA for
>>> the
>>> dwmac driver is up and running.
>> SoCFPGA dwmac support is already upstream. Can you explain why it
>> needs
>> to query the FPGA at all ? Is the whole dwmac in the FPGA ? Or is the
>> dwmac just routed through FPGA ?
> dwmac driver need to call this function to access PCS (MAC PHY) which
> is routed through FPGA.

Then shouldn't this be modeled in the DT ?
And if it is properly modeled in the DT, the FPGA driver code should do
any such checking, not the EMAC code.

>>> If I bundle this code alongside with my
>>> FPGA configuration driver, it might take longer time to get into
>>> the
>>> mainline. So this common function is blocking other to upstream
>>> his/her
>>> code.
>> I'm not really fond of accepting dead code, on which code I didn't
>> even
>> see and design that's unclear depends.
> I understand. Can I submit another FPGA driver patchsets and refer this
> patch as the dependency ? The FPGA driver patchsets is the user of the
> common function.

Yes please

>>>>>>> Signed-off-by: Ang, Chee Hong <chee.hong.ang at intel.com>
>>>>>>> ---
>>>>>>>  arch/arm/mach-socfpga/include/mach/mailbox_s10.h |  3 +-
>>>>>>>  arch/arm/mach-socfpga/mailbox_s10.c              | 48
>>>>>>> ++++++++++++++++++++++++
>>>>>>>  2 files changed, 50 insertions(+), 1 deletion(-)
>>>>>>>
>>>>>>> diff --git a/arch/arm/mach-
>>>>>>> socfpga/include/mach/mailbox_s10.h
>>>>>>> b/arch/arm/mach-socfpga/include/mach/mailbox_s10.h
>>>>>>> index 81a609d..660df35 100644
>>>>>>> --- a/arch/arm/mach-socfpga/include/mach/mailbox_s10.h
>>>>>>> +++ b/arch/arm/mach-socfpga/include/mach/mailbox_s10.h
>>>>>>> @@ -140,5 +140,6 @@ int mbox_qspi_open(void);
>>>>>>>  #endif
>>>>>>>  
>>>>>>>  int mbox_reset_cold(void);
>>>>>>> -
>>>>>>> +int mbox_get_fpga_config_status(u32 cmd);
>>>>>>> +int mbox_get_fpga_config_status_psci(u32 cmd);
>>>>>>>  #endif /* _MAILBOX_S10_H_ */
>>>>>>> diff --git a/arch/arm/mach-socfpga/mailbox_s10.c
>>>>>>> b/arch/arm/mach-
>>>>>>> socfpga/mailbox_s10.c
>>>>>>> index 0d906c3..345485c 100644
>>>>>>> --- a/arch/arm/mach-socfpga/mailbox_s10.c
>>>>>>> +++ b/arch/arm/mach-socfpga/mailbox_s10.c
>>>>>>> @@ -342,6 +342,54 @@ int mbox_reset_cold(void)
>>>>>>>  	return 0;
>>>>>>>  }
>>>>>>>  
>>>>>>> +/* Accepted commands: CONFIG_STATUS or RECONFIG_STATUS */
>>>>>>> +static __always_inline int
>>>>>>> mbox_get_fpga_config_status_common(u32
>>>>>>> cmd)
>>>>>> Why __always_inline ?
>>>>> This function is needed in 2 sections. Our u-boot run in normal
>>>>> code
>>>>> section and '__secure' section which mainly used for PSCI
>>>>> services.
>>>>> Refer to the 'mbox_get_fpga_config_status()' and
>>>>> 'mbox_get_fpga_config_status_psci()' below. These 2 functions
>>>>> run
>>>>> in 2
>>>>> different sections and they need to call this function.
>>>> But why does this need to be __always_inline ? The compiler can
>>>> decide
>>>> what's best.
>>> This is dangerous. Let me explain in more details why we need this,
>>> '__secure' section and normal '.code' section exist in different
>>> time.
>>> '.code' section no longer valid once u-boot boot to OS, but
>>> '__secure'
>>> section still exist after booting to OS because OS need to call
>>> PSCI
>>> services to achieve certain things. We need to make sure both
>>> sections
>>> contain the full code, therefore we need to enforce the compiler to
>>> duplicate this piece of code to both sections as well. 
>> How does the __always_inline help with that ?
> mbox_get_fpga_config_status() (in .code section)
> mbox_get_fpga_config_status_psci() (in __secure section)
> Both functions need to implement mbox_get_fpga_config_status_common().
> So we clone this mbox_get_fpga_config_status_common()  into
> mbox_get_fpga_config_status() & mbox_get_fpga_config_status_psci()
> without duplicating the same code in those 2 functions.

This seems like a really hacky way to do it. Wouldn't it make more sense
to use some linker script trick for this ?

> mbox_get_fpga_config_status() exist when u-boot is active. So this
> function is callable by u-boot itself.
> mbox_get_fpga_config_status_psci() exist after u-boot boot the OS. U-
> boot will actually copy this function to another region of memory which
> mostly consist of PSCI/SMC handlers. These services are called by OS to
> do certain stuffs like reboot, access secure hardware and etc. So is
> actually same piece of code that need to exist at 2 different stage.

OK

> arch/arm/mach-socfpga/mailbox_s10.c already has a couple of other
> functions which also use this method to make the same piece of code
> exist in 2 different regions.
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list