Hi Rob, Ard,

On Wed, Jan 3, 2024 at 9:01 AM Rob Herring <r...@kernel.org> wrote:
>
> On Fri, Dec 22, 2023 at 5:48 AM Ard Biesheuvel <a...@kernel.org> wrote:
> >
> > On Thu, 21 Dec 2023 at 17:50, Chiu, Chasel <chasel.c...@intel.com> wrote:
> > >
> > >
> > > Hi Ard,
> > >
> > > Please see my reply below inline and let me know your thoughts.
> > >
> > > Thanks,
> > > Chasel
> > >
> > >
> > > > -----Original Message-----
> > > > From: Ard Biesheuvel <a...@kernel.org>
> > > > Sent: Thursday, December 21, 2023 6:31 AM
> > > > To: Chiu, Chasel <chasel.c...@intel.com>
> > > > Cc: Simon Glass <s...@chromium.org>; devicet...@vger.kernel.org; Mark 
> > > > Rutland
> > > > <mark.rutl...@arm.com>; Rob Herring <r...@kernel.org>; Tan, Lean Sheng
> > > > <sheng....@9elements.com>; lkml <linux-ker...@vger.kernel.org>; Dhaval
> > > > Sharma <dha...@rivosinc.com>; Brune, Maximilian
> > > > <maximilian.br...@9elements.com>; Yunhui Cui <cuiyun...@bytedance.com>;
> > > > Dong, Guo <guo.d...@intel.com>; Tom Rini <tr...@konsulko.com>; ron 
> > > > minnich
> > > > <rminn...@gmail.com>; Guo, Gua <gua....@intel.com>; linux-
> > > > a...@vger.kernel.org; U-Boot Mailing List <u-boot@lists.denx.de>
> > > > Subject: Re: [PATCH v7 2/2] schemas: Add some common reserved-memory
> > > > usages
> > > >
> > > > On Tue, 28 Nov 2023 at 21:31, Chiu, Chasel <chasel.c...@intel.com> 
> > > > wrote:
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Ard Biesheuvel <a...@kernel.org>
> > > > > > Sent: Tuesday, November 28, 2023 10:08 AM
> > > > > > To: Chiu, Chasel <chasel.c...@intel.com>
> > > > > > Cc: Simon Glass <s...@chromium.org>; devicet...@vger.kernel.org; 
> > > > > > Mark
> > > > > > Rutland <mark.rutl...@arm.com>; Rob Herring <r...@kernel.org>; Tan,
> > > > > > Lean Sheng <sheng....@9elements.com>; lkml
> > > > > > <linux-ker...@vger.kernel.org>; Dhaval Sharma <dha...@rivosinc.com>;
> > > > > > Brune, Maximilian <maximilian.br...@9elements.com>; Yunhui Cui
> > > > > > <cuiyun...@bytedance.com>; Dong, Guo <guo.d...@intel.com>; Tom Rini
> > > > > > <tr...@konsulko.com>; ron minnich <rminn...@gmail.com>; Guo, Gua
> > > > > > <gua....@intel.com>; linux- a...@vger.kernel.org; U-Boot Mailing
> > > > > > List <u-boot@lists.denx.de>
> > > > > > Subject: Re: [PATCH v7 2/2] schemas: Add some common reserved-memory
> > > > > > usages
> > > > > >
> > > > > > You are referring to a 2000 line patch so it is not 100% clear 
> > > > > > where to look tbh.
> > > > > >
> > > > > >
> > > > > > On Tue, 21 Nov 2023 at 19:37, Chiu, Chasel <chasel.c...@intel.com> 
> > > > > > wrote:
> > > > > > >
> > > > > > >
> > > > > > > In PR, UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c, line
> > > > > > > 268 is for
> > > > > > related example code.
> > > > > > >
> > > > > >
> > > > > > That refers to a 'memory-allocation' node, right? How does that
> > > > > > relate to the 'reserved-memory' node?
> > > > > >
> > > > > > And crucially, how does this clarify in which way "runtime-code" and
> > > > > > "runtime- data" reservations are being used?
> > > > > >
> > > > > > Since the very beginning of this discussion, I have been asking
> > > > > > repeatedly for examples that describe the wider context in which 
> > > > > > these
> > > > reservations are used.
> > > > > > The "runtime" into runtime-code and runtime-data means that these
> > > > > > regions have a special significance to the operating system, not
> > > > > > just to the next bootloader stage. So I want to understand exactly
> > > > > > why it is necessary to describe these regions in a way where the
> > > > > > operating system might be expected to interpret this information 
> > > > > > and act
> > > > upon it.
> > > > > >
> > > > >
> > > > >
> > > > > I think runtime code and data today are mainly for supporting UEFI 
> > > > > runtime
> > > > services - some BIOS functions for OS to utilize, OS may follow below 
> > > > ACPI spec to
> > > > treat them as reserved range:
> > > > > https://uefi.org/specs/ACPI/6.5/15_System_Address_Map_Interfaces.html#
> > > > > uefi-memory-types-and-mapping-to-acpi-address-range-types
> > > > >
> > > > > Like I mentioned earlier, that PR is still in early phase and has not 
> > > > > reflected all
> > > > the required changes yet, but the idea is to build
> > > > gEfiMemoryTypeInformationGuid HOB from FDT reserved-memory nodes.
> > > > > UEFI generic Payload has DxeMain integrated, however Memory Types are
> > > > platform-specific, for example, some platforms may need bigger runtime 
> > > > memory
> > > > for their implementation, that's why we want such FDT reserved-memory 
> > > > node to
> > > > tell DxeMain.
> > > > >
> > > >
> > > > > The Payload flow will be like this:
> > > > >   Payload creates built-in default MemoryTypes table ->
> > > > >     FDT reserved-memory node to override if required (this also 
> > > > > ensures the
> > > > same memory map cross boots so ACPI S4 works) ->
> > > > >       Build gEfiMemoryTypeInformationGuid HOB by "platfom specific"
> > > > MemoryTypes Table ->
> > > > >         DxeMain/GCD to consume this MemoryTypes table and setup memory
> > > > service ->
> > > > >           Install memory types table to UEFI system 
> > > > > table.Configuration table...
> > > > >
> > > > > Note: if Payload built-in default MemoryTypes table works fine for the
> > > > > platform, then FDT reserved-memory node does not need to provide such
> > > > 'usage' compatible strings. (optional) This FDT node could allow
> > > > flexibility/compatibility without rebuilding Payload binary.
> > > > >
> > > > > Not sure if I answered all your questions, please highlight which 
> > > > > area you need
> > > > more information.
> > > > >
> > > >
> > > > The gEfiMemoryTypeInformationGuid HOB typically carries platform 
> > > > defaults, and
> > > > the actual memory type information is kept in a non-volatile EFI 
> > > > variable, which
> > > > gets updated when the memory usage changes. Is this different for
> > > > UefiPayloadPkg?
> > > >
> > > > (For those among the cc'ees less versed in EFI/EDK2: when you get the 
> > > > 'config
> > > > changed -rebooting' message from the boot firmware, it typically means 
> > > > that this
> > > > memory type table has changed, and a reboot is necessary.)
> > > >
> > > > So the platform init needs to read this variable, or get the 
> > > > information in a
> > > > different way. I assume it is the payload, not the platform init that 
> > > > updates the
> > > > variable when necessary. This means the information flows from 
> > > > payload(n) to
> > > > platform init(n+1), where n is a monotonic index tracking consecutive 
> > > > boots of the
> > > > system.
> > > >
> > > > Can you explain how the DT fits into this? How are the runtime-code and
> > > > runtime-data memory reservation nodes under /reserved-memory used to
> > > > implement this information exchange between platform init and payload? 
> > > > And
> > > > how do the HOB and the EFI variable fit into this picture?
> > >
> > >
> > > 1. With some offline discussion, we would move 
> > > gEfiMemoryTypeInformationGuid usage to FDT->upl-custom node. This is 
> > > because it is edk2 implementation choice and non-edk2 PlatformInit or 
> > > Payload may not have such memory optimization implementation. (not a 
> > > generic usage/requirement for PlatformInit and Payload)
> > >
> > > The edk2 example flow will be like below:
> > >
> > > PlatformInit to GetVariable of gEfiMemoryTypeInformationGuid and create 
> > > Hob->
> > >   PlatformInit to initialize FDT->upl-custom node to report 
> > > gEfiMemoryTypeInformationGuid HOB information ->
> > >     UefiPayload entry to re-create gEfiMemoryTypeInformationGuid HOB 
> > > basing on FDT input (instead of the default MemoryType inside 
> > > UefiPayload) ->
> > >       UefiPayload DxeMain/Gcd will consume gEfiMemoryTypeInformationGuid 
> > > Hob for memory type information ->
> > >         UefiPayload to initialize UEFI environment (mainly DXE 
> > > dispatcher) ->
> > >           (additional FV binary appended to common UefiPayload binary) 
> > > PlatformPayload to provide VariableService which is platform specific ->
> > >             UefiPayload UefiBootManager will SetVariable if memory type 
> > > change needed and request a warm reset ->
> > >               Back to PlatformInit ...
> > >
> >
> > OK so the upl-custom node can do whatever it needs to. I imagine these
> > will include the memory descriptor attribute field, and other parts
> > that may be missing from the /reserved-memory DT node specification?

>From my side, ideally this will be empty, but it may be needed to make
things work.

> >
> > >
> > > 2. Now the proposed reserved-memory node usages will be for PlatformInit 
> > > to provide data which may be used by Payload or OS. This is not edk2 
> > > specific and any PlatformInit/Payload could have same support.
> > > Note: all of below are optional and PlatformInit may choose to implement 
> > > some of them or not.
> > >
> > >       - acpi
> > > If PlatformInit created some ACPI tables, this will report a memory 
> > > region which contains all the tables to Payload and Payload may base on 
> > > this to add some more tables if required.
> > >
> > >       - acpi-nvs
> > > If PlatformInit has created some ACPI tables which having ACPI NVS memory 
> > > dependency, this will be that nvs region.
> > >
> >
> > These make sense.
> >
> > >       - boot-code
> > > When PlatformInit having some FW boot phase code that could be freed for 
> > > OS to use when payload transferring control to UEFI OS
> > >
> > >       - boot-data
> > > When PlatformInit having some FW boot phase data that could be freed for 
> > > OS to use when payload transferring control to UEFI OS.
> > >
> > >       - runtime-code
> > > PlatformInit may provide some services code that can be used for Payload 
> > > to initialize UEFI Runtime Services for supporting UEFI OS.
> > >
> > >       - runtime-data
> > > PlatformInit may provide some services data that can be used for Payload 
> > > to Initialize UEFI Runtime Services for supporting UEFI OS.
> > >
>
> I'll say it again. "boot" and "runtime" on their own could mean about
> anything, but the usage here is clearly tied to UEFI (or the EDK2
> implementation) and its meaning of boot and runtime. So the naming
> needs to reflect that.
>

Chasel has made a suggestion.

>
> > A UEFI OS must consume this information from the UEFI memory map, not
> > from the /reserved-memory nodes. So these nodes must either not be
> > visible to the OS at all, or carry an annotation that the OS must
> > ignore them.
>
> The kernel will process /reserved-memory for UEFI boot, so the
> expectation is anything in the EFI memory map is not present there. An
> annotation to ignore some nodes would require going back in time or
> accepting 2 sources of truth on existing OS.

The DT spec says:

>>>>>
3.5.4 /reserved-memory and UEFI
When booting via [UEFI], static /reserved-memory regions must also be
listed in the system memory map obtained
via the GetMemoryMap() UEFI boot time service as defined in [UEFI] §
7.2. The reserved memory regions need to be
included in the UEFI memory map to protect against allocations by UEFI
applications.
<<<<<

To my reading, that means that the requirement is that the
/reserved-memory regions must be returned from the GetMemoryMap() call
too. I don't see it saying that the reserved-memory regions must be
empty, though.

>
> > Would it be possible to include a restriction in the DT schema that
> > these are only valid in the firmware boot phase?
>
> The only way ATM is including a schema or not when running validation
> on a DT for a particular boot phase. Include the schema in the project
> that wants to use these nodes and don't include it in cases that don't
> use it. I don't see a reason why this needs to be in dtschema.

We would like to use a single schema, which is dtschema. UPL
validation will eventually check this, so it needs to be correct.

Regards,
Simon

Reply via email to