[U-Boot] [PATCH v2 22/22] x86: Add support for Intel Minnowboard Max
Bin Meng
bmeng.cn at gmail.com
Fri May 29 15:54:32 CEST 2015
Hi Andrew, Simon,
On Fri, May 29, 2015 at 2:09 AM, Andrew Bradford
<andrew at bradfordembedded.com> wrote:
> On 05/28 10:30, Simon Glass wrote:
>> Hi Andrew,
>>
>> On 27 May 2015 at 08:39, Andrew Bradford <andrew at bradfordembedded.com> wrote:
>> > On 05/27 13:19, Bin Meng wrote:
>> >> Hi Simon,
>> >>
>> >> On Wed, May 27, 2015 at 5:37 AM, Simon Glass <sjg at chromium.org> wrote:
>> >> > Hi Andrew,
>> >> >
>> >> > On 26 May 2015 at 13:52, Andrew Bradford <andrew at bradfordembedded.com> wrote:
>> >> >> Hi Simon and Bin (sorry for bringing this back from the dead),
>> >> >>
>> >> >> But I have a question about fsp_configs.c down below:
>> >> >>
>> >> >> On 01/27 22:13, Simon Glass wrote:
>> >> >> ------------->8---------------
[snip]
>> >> >>
>> >> >> I am trying to move this fsp upd to use device tree as I am trying to
>> >> >> create a patch set to add the Intel Valley Island E38xx board (which
>> >> >> uses a SODIMM rather than memory down). In doing so, I've found that
>> >> >> global data doesn't seem to be available when update_fsp_upd() is called
>> >> >> and generally it seems that gd->fdt_blob is used to get a reference to
>> >> >> the flattened device tree.
>> >> >>
>> >> >> I'm not super familiar with device tree, but I was attempting to use
>> >> >> fdtdec_next_compatible(gd->fdt_blob, 0, COMPAT_INTEL_BAYTRAIL_FSP) in a
>> >> >> similar way that Quark does in my patchset (I've properly created the
>> >> >> COMPAT_INTEL_BAYTRAIL_FSP define and some device tree nodes in my dts
>> >> >> file). When I call fdtdec_next_compatible() the board does something
>> >> >> which I'm unable to debug (Valley Island does not have the early UART
>> >> >> pins connected so I have no early UART capability) but things just seem
>> >> >> to stop.
>> >> >>
>> >> >> In manually tracing the calls which lead to update_fsp_upd(), it seems
>> >> >> that we haven't yet set up global data, so it makes sense that I can't
>> >> >> reference it. But the device tree should be available in NOR flash or
>> >> >> in some other way which we can access in order to get the FSP UPD
>> >> >> settings.
>> >> >>
>> >> >> Is there a simple way to access the device tree while it's still in NOR
>> >> >> flash so I can avoid using gd? Or can global data be setup prior to
>> >> >> calling update_fsp_upd() (I believe we're still in CAR at this point)?
>> >> >> Or am I misunderstanding something basic here?
>> >> >>
>> >> >> Did you have a rough outline of how this could be moved to device tree?
>> >> >
>> >> > This is a bit tricky. I would like to move fsp_init() later in the
>> >> > init sequence (e.g. to board_init_f()). See this TODO in the code:
>> >> >
>> >> > /*
>> >> > * TODO:
>> >> > *
>> >> > * According to FSP architecture spec, the fsp_init() will not return
>> >> > * to its caller, instead it requires the bootloader to provide a
>> >> > * so-called continuation function to pass into the FSP as a parameter
>> >> > * of fsp_init, and fsp_init() will call that continuation function
>> >> > * directly.
>> >> > *
>> >> > * The call to fsp_init() may need to be moved out of the car_init()
>> >> > * to cpu_init_f() with the help of some inline assembly codes.
>> >> > * Note there is another issue that fsp_init() will setup another stack
>> >> > * using the fsp_init parameter stack_top after DRAM is initialized,
>> >> > * which means any data on the previous stack (on the CAR) gets lost
>> >> > * (ie: U-Boot global_data). FSP is supposed to support such scenario,
>> >> > * however it does not work. This should be revisited in the future.
>> >> > */
>> >> >
>> >> > The primary issues are:
>> >> > 1. The need to recover the global_data
>> >> > 2. The need to change to a new stack
>> >> >
>> >> > Re 1, my reading of the HOB stuff is that it is supposed to provide
>> >> > you with a pointer to the CAR RAM (all ~128KB of it) so that you can
>> >> > go back and find your old stack (and in our case, global_data).
>> >> >
>> >> > Bin mentioned that this doesn't work - his is the comment above after
>> >> > I asked him about it.
>> >> >
>> >> > But if it could be made to work, then we could delay the init.
>> >> >
>> >> > Re 2, U-Boot expects to change to a new stack when it wants to, which
>> >> > is at the boundary of board_init_f() and board_init_r(). The Intel FSP
>> >> > should not mandate a stack change over a C function call. IMO that is
>> >> > just bad design. Dealing with it is not very easy, but one option is
>> >> > to run with the new stack for the rest of the board_init_f() sequence
>> >> > and then change stack again at the end of the sequence. Ick.
>> >> >
>> >> > To specifically address your problem, global_data is not available
>> >> > until board_init_f() is called, and the device tree comes into
>> >> > existence soon after. We could hack around it - e.g. with microcode we
>> >> > find it in the device tree and stick a pointer to it in a special
>> >> > place. But the real solution is to figure out how to move this
>> >> > fsp_init() stuff to later in the sequence. For non-FSP boards we don't
>> >> > have this problem - e.g. ivybridge does RAM init long after we have
>> >> > global_data and device tree. Note it is still running from flash at
>> >> > this point, but CAR is set up and that is where global_data resides.
>> >> >
>> >> > I'm interested to hear what you figure out.
>> >> >
>> >>
>> >> I just noticed that Intel has released FSP specification v1.1 [1] in
>> >> April. After a rough read of the 1.1 spec, it looks to me that Intel
>> >> changed the fsp_init() design by breaking it down into 3 sub-routines:
>> >> FspMemoryInit(), TempRamExit() and FspSiliconInit(). I feel this might
>> >> be more logical to adapt U-Boot, but again I am not sure if the stack
>> >> migration stuff is still there. So far I don't see any new FSP
>> >> releases using the 1.1 spec.
>> >>
>> >> [1] https://www-ssl.intel.com/content/www/us/en/embedded/software/fsp/fsp-architecture-spec-v1-1.html
>> >
>> > There's also a very good overview of how to use an FSP v1.1 firmware at
>> > [1]. It states that the problem in v1.0 for bootloaders was that when
>> > you call FspInit() that temporary ram was torn down unconditionally.
>> > Now, in v1.1, it says after calling FspMemoryInit() that control will be
>> > given back to the bootloader running in the temporary ram (CAR?). Then
>> > the bootloader is responsible for migrating to main memory and to call
>> > TempRamExit() so that temporary memory can be cleaned up.
>> >
>> > This sounds like what u-boot would want and what Simon described above,
>> > for u-boot to be in charge of relocating from CAR to main memory, right?
>> > If so, likely things will be much easier once there's a v1.1 FSP for
>> > baytrail...
>> >
>>
>> Indeed, care to ping them to find out when this might happen?
>
> I'm not sure, but I think Intel may have the source on Github [1]. I'm
> starting to look through the code to see if it's actually useful for
> E3800 parts or not, but a quick scan through the git log does show
> changes to support FSP v1.1 and it appears to be actively developed...
>
> [1]:https://github.com/tianocore/edk2-IntelFspPkg
>
Looks like this is not the FSP source codes, but just the support
codes to get FSP integrated into the EDKII TianCore. I doubt Intel
will release any source codes of FSP.
> Having a few other, more experienced, eyes on this to see if it's useful
> would probably be good.
>
I will see if I can restart this FSP initialization sequence work next week.
> I will see what else I can find out about an FSP v1.1 release for E3800
> parts, in the mean time.
>
Regards,
Bin
More information about the U-Boot
mailing list