[U-Boot] [PATCH 3/4] x86: acpi: Pack global NVS into ACPI table

Bin Meng bmeng.cn at gmail.com
Fri Jun 17 06:53:11 CEST 2016


Hi Simon,

On Fri, Jun 17, 2016 at 11:52 AM, Simon Glass <sjg at chromium.org> wrote:
> Hi Bin,
>
> On 15 June 2016 at 02:33, Bin Meng <bmeng.cn at gmail.com> wrote:
>> Now that platform-specific ACPI global NVS is added, pack it into
>> ACPI table and get its address fixed up.
>>
>> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
>> ---
>>
>>  arch/x86/include/asm/acpi_table.h                   |  4 ++++
>>  .../x86/include/asm/arch-baytrail/acpi/platform.asl |  3 +++
>>  arch/x86/include/asm/arch-quark/acpi/platform.asl   |  3 +++
>>  arch/x86/lib/acpi_table.c                           | 21 +++++++++++++++++++++
>>  doc/README.x86                                      |  2 --
>>  5 files changed, 31 insertions(+), 2 deletions(-)
>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> Comments/questions below
>
>>
>> diff --git a/arch/x86/include/asm/acpi_table.h b/arch/x86/include/asm/acpi_table.h
>> index 56aa282..caff4d8 100644
>> --- a/arch/x86/include/asm/acpi_table.h
>> +++ b/arch/x86/include/asm/acpi_table.h
>> @@ -299,6 +299,9 @@ struct acpi_mcfg_mmconfig {
>>  /* PM1_CNT bit defines */
>>  #define PM1_CNT_SCI_EN         (1 << 0)
>>
>> +/* ACPI global NVS structure */
>> +struct acpi_global_nvs;
>> +
>>  /* These can be used by the target port */
>>
>>  void acpi_fill_header(struct acpi_table_header *header, char *signature);
>> @@ -312,4 +315,5 @@ int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
>>  int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
>>                                u8 cpu, u16 flags, u8 lint);
>>  u32 acpi_fill_madt(u32 current);
>> +void acpi_create_gnvs(struct acpi_global_nvs *gnvs);
>>  u32 write_acpi_tables(u32 start);
>> diff --git a/arch/x86/include/asm/arch-baytrail/acpi/platform.asl b/arch/x86/include/asm/arch-baytrail/acpi/platform.asl
>> index 6bc82ec..a80d2c0 100644
>> --- a/arch/x86/include/asm/arch-baytrail/acpi/platform.asl
>> +++ b/arch/x86/include/asm/arch-baytrail/acpi/platform.asl
>> @@ -22,6 +22,9 @@ Method(_WAK, 1)
>>         Return (Package() {0, 0})
>>  }
>>
>> +/* ACPI global NVS */
>> +#include "global_nvs.asl"
>> +
>>  /* TODO: add CPU ASL support */
>>
>>  Scope (\_SB)
>> diff --git a/arch/x86/include/asm/arch-quark/acpi/platform.asl b/arch/x86/include/asm/arch-quark/acpi/platform.asl
>> index bd72842..1ecf153 100644
>> --- a/arch/x86/include/asm/arch-quark/acpi/platform.asl
>> +++ b/arch/x86/include/asm/arch-quark/acpi/platform.asl
>> @@ -22,6 +22,9 @@ Method(_WAK, 1)
>>         Return (Package() {0, 0})
>>  }
>>
>> +/* ACPI global NVS */
>> +#include "global_nvs.asl"
>> +
>>  /* TODO: add CPU ASL support */
>>
>>  Scope (\_SB)
>> diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
>> index bb71286..2e4f3ab 100644
>> --- a/arch/x86/lib/acpi_table.c
>> +++ b/arch/x86/lib/acpi_table.c
>> @@ -15,6 +15,7 @@
>>  #include <asm/io.h>
>>  #include <asm/lapic.h>
>>  #include <asm/tables.h>
>> +#include <asm/arch/global_nvs.h>
>>
>>  /*
>>   * IASL compiles the dsdt entries and writes the hex values
>> @@ -336,6 +337,7 @@ u32 write_acpi_tables(u32 start)
>>         struct acpi_fadt *fadt;
>>         struct acpi_mcfg *mcfg;
>>         struct acpi_madt *madt;
>> +       int i;
>>
>>         current = start;
>>
>> @@ -383,6 +385,25 @@ u32 write_acpi_tables(u32 start)
>>         current += dsdt->length - sizeof(struct acpi_table_header);
>>         current = ALIGN(current, 16);
>>
>> +       /* Pack GNVS into the ACPI table area */
>> +       for (i = 0; i < dsdt->length; i++) {
>> +               u32 gnvs = (u32)dsdt + i;
>
> How about:
>
> u32 *gnvs = (u32 *)(dsdt + i)

(dsdt + i) points to wrong place, it should be:

u32 *gnvs = (u32 *)((u32)dsdt + i);

Which way do you prefer?

>
>> +               if (*(u32 *)gnvs == 0xdeadbeef) {
>
> The deadbeef comes from the .asl file, right? Can you use a #define
> shared by both files?
>

Yes, they have to match. Will do in v2.

>> +                       debug("Fix up global NVS in DSDT to 0x%08x\n", current);
>> +                       *(u32 *)gnvs = current;
>> +                       break;
>> +               }
>> +       }
>> +
>> +       /* Update DSDT checksum since we patched the GNVS address */
>> +       dsdt->checksum = 0;
>> +       dsdt->checksum = table_compute_checksum((void *)dsdt, dsdt->length);
>> +
>> +       /* Fill in platform-specific global NVS variables */
>> +       acpi_create_gnvs((struct acpi_global_nvs *)current);
>> +       current += sizeof(struct acpi_global_nvs);
>> +       current = ALIGN(current, 16);
>> +
>>         debug("ACPI:    * FADT\n");
>>         fadt = (struct acpi_fadt *)current;
>>         current += sizeof(struct acpi_fadt);
>> diff --git a/doc/README.x86 b/doc/README.x86
>> index a548b54..7d694b1 100644
>> --- a/doc/README.x86
>> +++ b/doc/README.x86
>> @@ -1020,8 +1020,6 @@ Features not supported so far (to make it a complete ACPI solution):
>>   * S3 (Suspend to RAM), S4 (Suspend to Disk).
>>
>>  Features that are optional:
>> - * ACPI global NVS support. We may need it to simplify ASL code logic if
>> -   utilizing NVS variables. Most likely we will need this sooner or later.
>>   * Dynamic AML bytecodes insertion at run-time. We may need this to support
>>     SSDT table generation and DSDT fix up.
>>   * SMI support. Since U-Boot is a modern bootloader, we don't want to bring
>> --

Regards,
Bin


More information about the U-Boot mailing list