[U-Boot] [PATCH v2 3/4] arm: socfpga: stratix10: Add Stratix10 FPGA into FPGA device table
Marek Vasut
marex at denx.de
Wed Nov 14 11:52:22 UTC 2018
On 11/14/2018 08:09 AM, Ang, Chee Hong wrote:
> On Thu, 2018-10-11 at 10:03 +0000, Marek Vasut wrote:
>> On 10/11/2018 08:21 AM, Ang, Chee Hong wrote:
>>>
>>> On Wed, 2018-10-10 at 12:27 +0200, Marek Vasut wrote:
>>>>
>>>> On 10/10/2018 07:30 AM, Ang, Chee Hong wrote:
>>>>>
>>>>>
>>>>> On Tue, 2018-10-09 at 14:48 +0200, Marek Vasut wrote:
>>>>>>
>>>>>>
>>>>>> On 10/09/2018 05:03 AM, Ang, Chee Hong wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Mon, 2018-10-08 at 22:32 +0200, Marek Vasut wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On 10/08/2018 05:10 PM, Ang, Chee Hong wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Mon, 2018-10-08 at 11:57 +0200, Marek Vasut wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 10/08/2018 11:48 AM, chee.hong.ang at intel.com
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> From: "Ang, Chee Hong" <chee.hong.ang at intel.com>
>>>>>>>>>>>
>>>>>>>>>>> Enable 'fpga' command in u-boot. User will be able
>>>>>>>>>>> to
>>>>>>>>>>> use
>>>>>>>>>>> the
>>>>>>>>>>> fpga
>>>>>>>>>>> command to program the FPGA on Stratix10 SoC.
>>>>>>>>>>>
>>>>>>>>>>> Signed-off-by: Ang, Chee Hong <chee.hong.ang at intel.
>>>>>>>>>>> com>
>>>>>>>>>>> ---
>>>>>>>>>>> arch/arm/mach-socfpga/misc.c | 29
>>>>>>>>>>> +++++++++++++++++++++++++++++
>>>>>>>>>>> arch/arm/mach-socfpga/misc_s10.c | 2 ++
>>>>>>>>>>> drivers/fpga/altera.c | 6 ++++++
>>>>>>>>>>> include/altera.h | 4 ++++
>>>>>>>>>>> 4 files changed, 41 insertions(+)
>>>>>>>>>>>
>>>>>>>>>>> diff --git a/arch/arm/mach-socfpga/misc.c
>>>>>>>>>>> b/arch/arm/mach-
>>>>>>>>>>> socfpga/misc.c
>>>>>>>>>>> index a4f6d5c..7986b58 100644
>>>>>>>>>>> --- a/arch/arm/mach-socfpga/misc.c
>>>>>>>>>>> +++ b/arch/arm/mach-socfpga/misc.c
>>>>>>>>>>> @@ -88,6 +88,27 @@ int overwrite_console(void)
>>>>>>>>>>> #endif
>>>>>>>>>>>
>>>>>>>>>>> #ifdef CONFIG_FPGA
>>>>>>>>>>> +#ifdef CONFIG_FPGA_STRATIX10
>>>>>>>>>>> +/*
>>>>>>>>>>> + * FPGA programming support for SoC FPGA Stratix
>>>>>>>>>>> 10
>>>>>>>>>>> + */
>>>>>>>>>>> +static Altera_desc altera_fpga[] = {
>>>>>>>>>>> + {
>>>>>>>>>>> + /* Family */
>>>>>>>>>>> + Intel_FPGA_Stratix10,
>>>>>>>>>>> + /* Interface type */
>>>>>>>>>>> + secure_device_manager_mailbox,
>>>>>>>>>>> + /* No limitation as additional
>>>>>>>>>>> data
>>>>>>>>>>> will
>>>>>>>>>>> be
>>>>>>>>>>> ignored */
>>>>>>>>>>> + -1,
>>>>>>>>>>> + /* No device function table */
>>>>>>>>>>> + NULL,
>>>>>>>>>>> + /* Base interface address
>>>>>>>>>>> specified in
>>>>>>>>>>> driver
>>>>>>>>>>> */
>>>>>>>>>>> + NULL,
>>>>>>>>>>> + /* No cookie implementation */
>>>>>>>>>>> + 0
>>>>>>>>>>> + },
>>>>>>>>>>> +};
>>>>>>>>>>> +#else
>>>>>>>>>>> /*
>>>>>>>>>>> * FPGA programming support for SoC FPGA Cyclone V
>>>>>>>>>>> */
>>>>>>>>>>> @@ -107,6 +128,7 @@ static Altera_desc
>>>>>>>>>>> altera_fpga[] =
>>>>>>>>>>> {
>>>>>>>>>>> 0
>>>>>>>>>>> },
>>>>>>>>>>> };
>>>>>>>>>>> +#endif
>>>>>>>>>>>
>>>>>>>>>>> /* add device descriptor to FPGA device table */
>>>>>>>>>>> void socfpga_fpga_add(void)
>>>>>>>>>>> @@ -116,6 +138,13 @@ void socfpga_fpga_add(void)
>>>>>>>>>>> for (i = 0; i < ARRAY_SIZE(altera_fpga);
>>>>>>>>>>> i++)
>>>>>>>>>>> fpga_add(fpga_altera,
>>>>>>>>>>> &altera_fpga[i]);
>>>>>>>>>>> }
>>>>>>>>>>> +
>>>>>>>>>>> +#else
>>>>>>>>>>> +
>>>>>>>>>>> +__weak void socfpga_fpga_add(void)
>>>>>>>>>>> +{
>>>>>>>>>>> +}
>>>>>>>>>> Why is a __weak function defined only in else-
>>>>>>>>>> statement ?
>>>>>>>>>>
>>>>>>>>>> It should be defined always, with a sane default
>>>>>>>>>> implementation.
>>>>>>>>> I will remove the empty function in #else-statement and
>>>>>>>>> define
>>>>>>>>> the
>>>>>>>>> default function like this :
>>>>>>>>>
>>>>>>>>> /* add device descriptor to FPGA device table */
>>>>>>>>> void socfpga_fpga_add(void)
>>>>>>>>> {
>>>>>>>>> #ifdef CONFIG_FPGA
>>>>>>>>> int i;
>>>>>>>>> fpga_init();
>>>>>>>>> for (i = 0; i < ARRAY_SIZE(altera_fpga); i++)
>>>>>>>>> fpga_add(fpga_altera, &altera_fpga[i]);
>>>>>>>>> #endif
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> Is that OK?
>>>>>>>> Can't you have __weak empty implementation of
>>>>>>>> socfpga_fpga_add()
>>>>>>>> and
>>>>>>>> implement a version per platform ? Would that work and
>>>>>>>> make
>>>>>>>> sense
>>>>>>>> ?
>>>>>>> socfpga_fpga_add() as shown above is a generic function for
>>>>>>> adding
>>>>>>> FPGA
>>>>>>> devices to FPGA driver which applies to all our platforms.
>>>>>>> This
>>>>>>> is
>>>>>>> the
>>>>>>> reason why it is defined in misc.c instead of
>>>>>>> misc_<platform_name>.c.
>>>>>>>
>>>>>>> It turned out we already have this defined in misc.h:
>>>>>>> #ifdef CONFIG_FPGA
>>>>>>> void socfpga_fpga_add(void);
>>>>>>> #else
>>>>>>> static inline void socfpga_fpga_add(void) {}
>>>>>>> #endif
>>>>>> Right, if you had one socfpga_fpga_add() per platform +
>>>>>> generic
>>>>>> empty
>>>>>> one, you could drop that whole thing ^.
>>>>> Yes. It's being addressed in v3 patch:
>>>>> https://lists.denx.de/pipermail/u-boot/2018-October/343561.html
>>>> So where did the function go in there ? I don't see any __weak
>>>> anything.
>>> I don't have to add anything in my v3 patchsets to make this work.
>>> It's already taken care by arch/arm/mach-
>>> socfpga/include/mach/misc.h as
>>> shown below:
>>>
>>> #ifdef CONFIG_FPGA
>>> void socfpga_fpga_add(void);
>>> #else
>>> static inline void socfpga_fpga_add(void) {}
>>> #endif
>>>
>>> An empty default socfpga_fpga_add() will be defined if CONFIG_FPGA
>>> is
>>> not defined.
>> I was hoping to turn this into __weak function.
>
> Below are the new changes for new patch:
> Empty weak function in arch/arm/mach-socfpga/misc.c:
>
> /* add device descriptor to FPGA device table */
> __weak void socfpga_fpga_add(void)
> {
> }
>
>
> In arch/arm/mach-socfpga/misc_aria10.c and arch/arm/mach-
> socfpga/misc_gen5.c:
>
> #ifdef CONFIG_FPGA
> /*
> * FPGA programming support for SoC FPGA Cyclone V
> */
> static Altera_desc altera_fpga[] = {
> {
> /* Family */
> Altera_SoCFPGA,
> /* Interface type */
> fast_passive_parallel,
> /* No limitation as additional data will be ignored */
> -1,
> /* No device function table */
> NULL,
> /* Base interface address specified in driver */
> NULL,
> /* No cookie implementation */
> 0
> },
> };
>
> /* add device descriptor to FPGA device table */
> void socfpga_fpga_add(void)
> {
> int i;
> fpga_init();
> for (i = 0; i < ARRAY_SIZE(altera_fpga); i++)
> fpga_add(fpga_altera, &altera_fpga[i]);
> }
> #endif
>
>
> In arch/arm/mach-socfpga/misc_s10.c:
>
> #ifdef CONFIG_FPGA
> /*
> * FPGA programming support for SoC FPGA Stratix 10
> */
> static Altera_desc altera_fpga[] = {
> {
> /* Family */
> Intel_FPGA_Stratix10,
> /* Interface type */
> secure_device_manager_mailbox,
> /* No limitation as additional data will be ignored */
> -1,
> /* No device function table */
> NULL,
> /* Base interface address specified in driver */
> NULL,
> /* No cookie implementation */
> 0
> },
> };
>
> /* add device descriptor to FPGA device table */
> void socfpga_fpga_add(void)
> {
> int i;
> fpga_init();
> for (i = 0; i < ARRAY_SIZE(altera_fpga); i++)
> fpga_add(fpga_altera, &altera_fpga[i]);
> }
> #endif
>
> With this new implementation, each platform overrides the
> 'socfpga_fpga_add' to add its own fpga device. The problem here is
> since our aria10 and gen5 are adding same fpga device, there will be
> duplication of code for these 2 platforms.
> What do you think ?
I think you can create a common code for Gen5 somehow, right ?
> If you are OK with this implementation, I can submit a new patch for
> review again. Thanks.
Submit the patches, yes.
--
Best regards,
Marek Vasut
More information about the U-Boot
mailing list