On 17 February 2016 at 18:40, Laszlo Ersek <ler...@redhat.com> wrote:
> On 02/17/16 18:23, Ard Biesheuvel wrote:
>> On 17 February 2016 at 18:07, Graeme Gregory <graeme.greg...@linaro.org> 
>> wrote:
>>>
>>>
>>> On 17/02/2016 16:04, Laszlo Ersek wrote:
>>>>
>>>> On 02/17/16 16:34, Ard Biesheuvel wrote:
>>>>>
>>>>> On 17 February 2016 at 16:11, Laszlo Ersek <ler...@redhat.com> wrote:
>>>>>>
>>>>>> On 02/17/16 15:48, Ard Biesheuvel wrote:
>>>>>>>
>>>>>>> AARCH64 systems never require compatibility with legacy ACPI OSes, and
>>>>>>> may not have any 32-bit addressable system RAM. To support ACPI on
>>>>>>> these
>>>>>>> systems, we need to be able to relax the 4 GB allocation restriction.
>>>>>>>
>>>>>>> So add a PCD PcdAcpiAllocateTablesBelow4GB defaulting to TRUE, and wire
>>>>>>> it up to the memory allocation calls in
>>>>>>> AcpiTableDxe/AcpiTableProtocol.c
>>>>>>>
>>>>>>> Note that this will inhibit the publishing of any tables that carry
>>>>>>> only
>>>>>>> 32-bit addresses, i.e., RSDPv1, RSDTv1 and RSDTv3.
>>>>>>>
>>>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>>>> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
>>>>>>> ---
>>>>>>>   MdeModulePkg/MdeModulePkg.dec                                |   7 +
>>>>>>>   MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf    |   2 +
>>>>>>>   MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 447
>>>>>>> ++++++++++++--------
>>>>>>>   3 files changed, 270 insertions(+), 186 deletions(-)
>>>>>>
>>>>>> Somewhat independently of your patch, I agree 100% that the interface
>>>>>> exposed by EFI_ACPI_TABLE_PROTOCOL is seriously lacking. It doesn't
>>>>>> allow the caller to control the allocation limit (--> see your patch),
>>>>>> nor the UEFI memory type that the copy of the table being installed will
>>>>>> be placed into (it would be valid for the caller to choose between
>>>>>> AcpiReclaim vs. AcpiNVS), nor the question whether the table being
>>>>>> installed should be linked into the RSDT, XSDT, or both.
>>>>>>
>>>>>> I don't find this an implementation problem; this is a problem with the
>>>>>> specification. In particular, in October last year I cross-posted an
>>>>>> email to the USWG and ASWG lists, entitled
>>>>>>
>>>>>>    LoadTable vs. EFI_ACPI_TABLE_PROTOCOL
>>>>>>
>>>>>> In that email, I pointed out that the current edk2 implementation of
>>>>>> EFI_ACPI_TABLE_PROTOCOL makes it impossible to support the LoadTable
>>>>>> ACPI operator. Namely, the LoadTable operator requires the definition
>>>>>> block (= AML code) being loaded dynamically to come *from* AcpiNVS type
>>>>>> memory, but edk2's implementation doesn't allow the caller to install
>>>>>> tables into AcpiNVS type memory, *except* those with the signature
>>>>>> "UEFI" -- those however are *data* tables, not definition blocks (= AML
>>>>>> code, like SSDT or DSDT).
>>>>>>
>>>>>> For this reason, I proposed EFI_ACPI_TABLE2_PROTOCOL:
>>>>>>
>>>>>>> - same set of member functions
>>>>>>> - UninstallAcpiTable() works the same
>>>>>>> - InstallAcpiTable() gets a new parameter called MemoryType:
>>>>>>>
>>>>>>> typedef
>>>>>>> EFI_STATUS
>>>>>>> (EFIAPI *EFI_ACPI_TABLE2_INSTALL_ACPI_TABLE) (
>>>>>>>    IN EFI_ACPI_TABLE2_PROTOCOL *This,
>>>>>>>    IN VOID                     *AcpiTableBuffer,
>>>>>>>    IN UINTN                    AcpiTableBufferSize,
>>>>>>>    IN EFI_MEMORY_TYPE          *MemoryType         OPTIONAL,
>>>>>>>    OUT UINTN                   *TableKey
>>>>>>> );
>>>>>>>
>>>>>>> - If MemoryType is NULL, then the new interface works identically to
>>>>>>>    the preexistent one.
>>>>>>> - Otherwise, if EFI_ACPI_TABLE2_PROTOCOL can prove that *MemoryType is
>>>>>>>    invalid for the signature detected in AcpiTableBuffer, then
>>>>>>>    EFI_INVALID_PARAMETER is returned.
>>>>>>> - Otherwise, the copy of AcpiTableBuffer is allocated from *MemoryType
>>>>>>>    memory.
>>>>>>>
>>>>>>> This would allow tables with any (non-standard) signatures to be
>>>>>>> placed in reserved or AcpiNVS memory, regardless of contents.
>>>>>>
>>>>>> My query to the USWG & ASWG garnered exactly *zero* replies. I guess
>>>>>> nobody cared about (or understood) my problem.
>>>>>>
>>>>>> Now I absolutely view your use case as a further parameter that
>>>>>> "EFI_ACPI_TABLE2_PROTOCOL" should expose. From that POV, I support your
>>>>>> use case.
>>>>>>
>>>>>> Regarding the implementation, I guess you are not enthusiastic about
>>>>>> turning this question into a standardization effort. (I tried and
>>>>>> failed.) So, whatever works for you -- I won't review the code, but as
>>>>>> long as it can remain compatible with current clients, given the right
>>>>>> PCD settings, I absolutely support the idea.
>>>>>>
>>>>> You may be right about the lacking EFI_ACPI_PROTOCOL interface, but
>>>>> the hardcoded 4 GB limit is simply an implementation detail, and
>>>>> should be treated as such imo.
>>>>
>>>> Hm, maybe, maybe not.
>>>>
>>>> Namely, RSDT cannot reference tables that are located above 4GB, and the
>>>> UEFI spec says, quote,
>>>>
>>>>      EFI_ACPI_TABLE_PROTOCOL.InstallAcpiTable()
>>>>
>>>>      [...]
>>>>
>>>>      The InstallAcpiTable() function allows a caller to install an ACPI
>>>>      table. The ACPI table may either by a System Description Table or
>>>>      the FACS. For all tables except for the DSDT and FACS, a copy of
>>>>      the table will be linked by the RSDT/XSDT. For the FACS and DSDT,
>>>>      the pointer to a copy of the table will be updated in the FADT, if
>>>>      present.
>>>
>>> Surely this is a simple case of the spec not being clear that RSDT/XDST
>>> means RSDT or XSDT as appropriate?
>>>
>>> RSDT is optional for systems in ACPI 5.1+ specs.
>>>
>>
>> Indeed.
>>
>>>>      [...]
>>>>
>>>>      On successful output, the EFI_ACPI_TABLE_PROTOCOL will ensure that
>>>>      the checksum field is correct for both the RSDT/XSDT table and the
>>>>      copy of the table being installed that is linked by the RSDT/XSDT.
>>>>
>>>>      [...]
>>>>
>>>> That is, following the *letter* of the spec, linkage into the RSDT is
>>>> *not* optional. And that requirement can only be satisfied if the tables
>>>> are located under 4GB.
>>>>
>>
>> No, it is 'linkage into the RSDT/XSDT' that is not optional. In the
>> quote above, '..both the RSDT/XDST and ...' does not refer to both
>> RSDT and XSDT but to the RSDT/XSDT on the one hand and the copy of the
>> table being installed on the other.
>
> I agree with you on the scope of the words "both ... and ...".
>
> I disagree with your interpretation of the slash character between the
> words "RSDT" and "XSDT". I believe you say "RSDT and XSDT are
> alternatives, and it's platform prerogative to pick one (or both)" --
> however I can't deduce that from the spec, and the current reference
> implementation doesn't seem to support it either (otherwise your patch
> might not be necessary).
>
> "Interpretation required", I guess.
>

Well, the wording is obviously not unambiguous :-)

> Anyway, please be aware that I'm not trying to block this patch at all.
> As long as the current behavior remains available, I'm all good.
>

Absolutely.
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to