[Skiboot] [PATCH] nvram: Fix 'missing' nvram on FSP systems.
Cyril Bur
cyril.bur at au1.ibm.com
Tue Nov 14 10:39:48 AEDT 2017
On Mon, 2017-11-13 at 17:33 +1100, Stewart Smith wrote:
> Cyril Bur <cyril.bur at au1.ibm.com> writes:
> > commit ba4d46fdd9eb ("console: Set log level from nvram") wants to read
> > from NVRAM rather early. This works fine on BMC based systems as
> > nvram_init() is actually synchronous. This is not true for FSP systems
> > and it turns out that the query for the console log level simply
> > queries blank nvram.
> >
> > The simple fix is to wait for the NVRAM read to complete before
> > performing any query. Unfortunately it turns out that the fsp-nvram
> > code does not inform the generic NVRAM layer when the read is complete,
> > rather, it must be prompted to do so.
> >
> > This patch addresses both these problems. This patch adds a check before
> > the first read of the NVRAM (for the console log level) that the read
> > has completed. The fsp-nvram code has been updated to inform the generic
> > layer as soon as the read completes.
> >
> > The old prompt to the fsp-nvram code has been removed but a check to
> > ensure that the NVRAM has been loaded remains. It is conservative but
> > if the NVRAM is not done loading before the host is booted it will not
> > have an nvram device-tree node which means it won't be able to access
> > the NVRAM at all, ever, even after the NVRAM has loaded.
> >
> > Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> > ---
> > core/init.c | 11 +++++++++--
> > core/nvram-format.c | 5 +++++
> > core/nvram.c | 35 +++++++++++++++++++++++++++++++++++
> > core/test/run-nvram-format.c | 5 +++++
> > hw/fsp/fsp-nvram.c | 28 ++++------------------------
> > include/fsp.h | 1 -
> > include/nvram.h | 2 ++
> > 7 files changed, 60 insertions(+), 27 deletions(-)
> >
> > diff --git a/core/init.c b/core/init.c
> > index 8951e17b..17de9851 100644
> > --- a/core/init.c
> > +++ b/core/init.c
> > @@ -497,7 +497,7 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
> > /* We wait for the nvram read to complete here so we can
> > * grab stuff from there such as the kernel arguments
> > */
> > - fsp_nvram_wait_open();
> > + nvram_wait_for_load();
> >
> > /* Wait for FW VPD data read to complete */
> > fsp_code_update_wait_vpd(true);
> > @@ -987,7 +987,14 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt)
> > /* preload the IMC catalog dtb */
> > imc_catalog_preload();
> >
> > - /* Set the console level */
> > + /*
> > + * Set the console level
> > + * We need NVRAM to have been setup by now otherwise we'll
> > + * just read a zeroed buffer.
> > + * Some FSP systems can actually be quite slow to return the
> > + * NVRAM.
> > + */
> > + nvram_wait_for_load();
> > console_log_level();
> >
> > /* Secure/Trusted Boot init. We look for /ibm,secureboot in DT */
> > diff --git a/core/nvram-format.c b/core/nvram-format.c
> > index 923098af..655cb8ee 100644
> > --- a/core/nvram-format.c
> > +++ b/core/nvram-format.c
> > @@ -216,6 +216,11 @@ const char *nvram_query(const char *key)
> > const char *part_end, *start;
> > int key_len = strlen(key);
> >
> > + if (!nvram_has_loaded()) {
> > + prlog(PR_WARNING, "NVRAM: Query before is done loading\n");
> > + return NULL;
> > + }
> > +
> > /*
> > * The running OS can modify the NVRAM as it pleases so we need to be
> > * a little paranoid and check that it's ok before we try parse it.
> > diff --git a/core/nvram.c b/core/nvram.c
> > index 2140706a..de6cbddf 100644
> > --- a/core/nvram.c
> > +++ b/core/nvram.c
> > @@ -122,6 +122,41 @@ void nvram_read_complete(bool success)
> > nvram_ready = true;
> > }
> >
> > +bool nvram_wait_for_load(void)
> > +{
> > + /* Short cut */
> > + if (nvram_ready)
> > + return true;
> > +
> > + /* Tell the caller it will never happen */
> > + if (!platform.nvram_info)
> > + return false;
>
> here I think we should return true instead, as it's as 'ready' as it's
> ever going to be, it's just not ever going to be usable.
>
> So for the purpose of "do we need to log some error about not being able
> to wait for nvram to be ready", the answer is no, which is pretty much
> what the return value of this function is saying.
>
> make sense?
>
Sure, I'll add that to a v2 respin. If we're going to do that I'll also
rename the function to nvram_wait_for_ready().
> Of course, what doesn't make sense is that I now have a meeting and thus
> I haven't looked at the rest of this patch yet
>
More information about the Skiboot
mailing list