Hi Andrew, Simon, On Fri, May 29, 2015 at 2:09 AM, Andrew Bradford <[email protected]> wrote: > On 05/28 10:30, Simon Glass wrote: >> Hi Andrew, >> >> On 27 May 2015 at 08:39, Andrew Bradford <[email protected]> wrote: >> > On 05/27 13:19, Bin Meng wrote: >> >> Hi Simon, >> >> >> >> On Wed, May 27, 2015 at 5:37 AM, Simon Glass <[email protected]> wrote: >> >> > Hi Andrew, >> >> > >> >> > On 26 May 2015 at 13:52, Andrew Bradford <[email protected]> >> >> > 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 _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

