Question regarding "boot-hartid" DT node

Atish Patra atishp at atishpatra.org
Fri Dec 3 16:44:00 PST 2021


On Fri, Dec 3, 2021 at 10:45 AM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 12/3/21 11:53 AM, Heinrich Schuchardt wrote:
> > On 12/3/21 11:13, Ard Biesheuvel wrote:
> >> On Thu, 2 Dec 2021 at 20:29, Atish Patra <atishp at atishpatra.org> wrote:
> >>>
> >>> On Thu, Dec 2, 2021 at 9:05 AM Heinrich Schuchardt
> >>> <heinrich.schuchardt at canonical.com> wrote:
> >>>>
> >>>> On 12/2/21 17:58, Ard Biesheuvel wrote:
> >>>>> On Thu, 2 Dec 2021 at 17:53, Heinrich Schuchardt
> >>>>> <heinrich.schuchardt at canonical.com> wrote:
> >>>>>>
> >>>>>> On 12/2/21 17:20, Ard Biesheuvel wrote:
> >>>>>>> On Thu, 2 Dec 2021 at 16:05, Sunil V L <sunilvl at ventanamicro.com>
> >>>>>>> wrote:
> >>>>>>>>
> >>>>>>>> Hi All,
> >>>>>>>>       I am starting this thread to discuss about the
> >>>>>>>> "boot-hartid" DT node
> >>>>>>>>       that is being used in RISC-V Linux EFI stub.
> >>>>>>>>
> >>>>>>>>       As you know, the boot Hart ID is passed in a0 register to
> >>>>>>>> the kernel
> >>>>>>>>       and hence there is actually no need to pass it via DT.
> >>>>>>>> However, since
> >>>>>>>>       EFI stub follows EFI application calling conventions, it
> >>>>>>>> needs to
> >>>>>>>>       know the boot Hart ID so that it can pass it to the proper
> >>>>>>>> kernel via
> >>>>>>>>       a0. For this issue, the solution was to add
> >>>>>>>> "/chosen/boot-hartid" in
> >>>>>>>>       DT. Both EDK2 and u-boot append this node in DT.
> >>>>>>>>
> >>>>>>>
> >>>>>>> I think this was a mistake tbh
> >>>>>>>
> >>>>>>>>       But above approach causes issue for ACPI since ACPI
> >>>>>>>> initialization
> >>>>>>>>       happens late in the proper kernel. Same is true even if we
> >>>>>>>> pass this
> >>>>>>>>       information via SMBIOS.
> >>>>>>>>
> >>>>>>>
> >>>>>>> It would be better to define a RISCV specific EFI protocol that the
> >>>>>>> stub can call to discover the boot-hartid value. That wat, it can
> >>>>>>> pass
> >>>>>>> it directly, without having to rely on firmware tables.
> >>>>>>
> >>>>>> As discovering the current process' hartid is not a UEFI specific
> >>>>>> task
> >>>>>> SBI would be a better fit.
> >>>>>>
> >>>>>
> >>>>> I disagree. The OS<->loader firmware interface is UEFI not SBI. So if
> >>>>> the EFI stub needs to ask the firmware which boot-hartid it should
> >>>>> pass in A0, it should use a EFI protocol and nothing else.
> >>>>>
> >>>>> Whether or not the loader/firmware *implements* this EFI protocol by
> >>>>> calling into SBI is a different matter (and likely the best choice).
> >>>>> But that does not mean the EFI stub should make SBI calls directly.
> >>>>>
> >>>>
> >>>> The EFI stub does not need the boot-hartid. It is the main Linux kernel
> >>>> that does. And that kernel already implements SBI calls.
> >>>>
> >>>> The main kernel could just try to read CSR mhartid which fails in
> >>>> S-mode
> >>>> and the SBI could emulate it.
> >>>
> >>> New SBI extension should be added only if there is no other way to
> >>> solve a generic
> >
> > I am not sure this feature would be implemented as SBI extension or as a
> > CSR emulation. Cf. sbi_emulate_csr_read(). But anyway it would require
> > an update of the SBI specification.
> >
> >>> problem. The boot hartid issue is very specific to efi booting only.
> >>> Any system that doesn't require
> >
> > The boot hartid is not EFI related at all. A firmware running single
> > threaded does not need this information.
> >
> > Information about the boot hartid is a general OS need.
> >
> > I am wondering why S-mode software should not have a generic means to
> > find out on which hart it is currently running.
> >
> >>> EFI booting won't need it. Even for EFI booting, we have other
> >>> approaches already proposed
> >>> to solve it. That's why, SBI extension should be the last resort
> >>> rather than first.
> >>>
> >>> I think an RISC-V specific EFI protocol as suggested by Ard should
> >>> work for all the cases.
> >>> Is there a case where you think it may not work ? U-Boot & EDK2
> >>> already stores the boot hartid.
> >>> They just implement that protocol and pass the hartid to the caller.
> >>> We do need to support it in the grub though.
> >>>
> >>
> >> Why would GRUB care about this? The EFI stub will call into the
> >> underlying firmware to invoke the protocol, GRUB is just a loader with
> >> a fancy menu that allows you to select which image to load, no?
> >
> > This is a related discussion:
> >
> > https://github.com/tekkamanninja/grub/commit/be9d4f1863a1fcb1cbbd2f867309457fade8be73#commitcomment-60851029
> >

Yes!! Thanks for refreshing the memory. It seems after 2 years, we are
still debating the same topic :).
Let me summarize the thread. There are multiple ways for EFI stub code
to retrieve the boot hartid.

1. EFI variables - This is what Henerich proposed last time. Ard
suggested that EFI configuration tables are better candidates than EFI
variables.
2. DT modification - This was preferred over the configuration table
at that time given because RISC-V was DT only at that time.
                                 We already had all the infrastructure
around DT. Thus, DT seemed to be a natural choice then.
                                 It works now for existing setup
however, the DT approach will not work for systems with ACPI support.
                                 Adding a similar entry in ACPI tables
is possible but adding ACPI support in EFI stub is not trivial.
3. SMBIOS - Only for platforms with SMBIOS support. SMBIOS is not
mandatory and adding SMBIOS support in EFI stub is not trivial.
4. SBI         -  As I mentioned before, this is an EFI specific
problem because EFI stub doesn't know what the boot hartid is. Thus,
it should be solved
                      in an EFI specific way. An SBI extension for
such features may not be acceptable as the non-EFI booting method
works fine without the SBI extension.
5. RISC-V specific EFI configuration table or protocol: Ard suggested
EFI configuration table last time. Earlier in this thread, EFI
protocol was suggested.
                      My personal preference has always been one of
these as it solves the problem for all EFI booting methods
                      for platforms-os
combination(DT/ACPI-Linux/FreeBSD) in an EFI specific way.

@Heinrich: Do you see any issue with the EFI configuration table or
protocol to retrieve the boot hartid?

My only concern with the RISC-V EFI protocol is that Ard suggested it
doesn't need a modification in UEFI spec.
Where should we document it in this case ? We can't document it in
Linux or EBBR.
Because, this is a protocol that server systems and other non-Linux OS
will also use.
We can define it in the RISC-V platform spec. But that's not the usual
place where somebody will look for the definition of such protocol.

Wouldn't it be better to standardize it in UEFI spec ? The UEFI spec
already has ARCH specific protocols/config tables.

> >
> > If GRUB loads a devicetree it will anyway have to call into the firmware
> > for fixups. These will include adding the boot-hartid.
> >
> >>
> >>> @Heinrich Schuchardt
> >>> I vaguely remember you proposed something similar when we discussed
> >>> this first during FOSDEM.
> >>> I can't recall why it was abandoned in favor of the DT approach which
> >>> works. But,
> >>> it is not an ideal solution considering RISC-V ACPI support is already
> >>> on the way.
> >>>
> >>> Do you have a link to the older thread where this thing was discussed ?
> >
> > Unfortunately I cannot find anything.
>
> I assume Atish referred to this thread:
>
> https://patchwork.ozlabs.org/project/uboot/patch/20200205055334.4072-1-xypron.glpk@gmx.de/
>
> Best regards
>
> Heinrich
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv



-- 
Regards,
Atish



More information about the linux-riscv mailing list