Hi Simon, Hi Andrew, On Fri, May 29, 2015 at 9:54 PM, Bin Meng <[email protected]> wrote: > 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've reworked the FSP initialization sequence so that now it is called by board_init_f(). I tested it on Crown Bay. Would you please try the following two patches and see if it works on the MinnowMax board? http://patchwork.ozlabs.org/patch/478943/ http://patchwork.ozlabs.org/patch/478944/ [snip] Regards, Bin _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

