x86: acpi: Introduce a stub to generate CSRT
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Sun, 14 Jul 2019 16:23:57 +0000 (19:23 +0300)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 9 Aug 2019 14:24:02 +0000 (22:24 +0800)
Here is a stub function that generates an empty CSRT. If the target platform
provides acpi_fill_csrt() function, it will be used to populate the table.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/include/asm/acpi_table.h
arch/x86/lib/acpi_table.c

index a70abd5..02aea12 100644 (file)
@@ -401,6 +401,7 @@ u32 acpi_fill_madt(u32 current);
 int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig, u32 base,
                              u16 seg_nr, u8 start, u8 end);
 u32 acpi_fill_mcfg(u32 current);
+u32 acpi_fill_csrt(u32 current);
 void acpi_create_gnvs(struct acpi_global_nvs *gnvs);
 ulong write_acpi_tables(ulong start);
 
index 270274f..0d69cf2 100644 (file)
@@ -337,6 +337,30 @@ static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
        header->checksum = table_compute_checksum((void *)mcfg, header->length);
 }
 
+__weak u32 acpi_fill_csrt(u32 current)
+{
+       return current;
+}
+
+static void acpi_create_csrt(struct acpi_csrt *csrt)
+{
+       struct acpi_table_header *header = &(csrt->header);
+       u32 current = (u32)csrt + sizeof(struct acpi_csrt);
+
+       memset((void *)csrt, 0, sizeof(struct acpi_csrt));
+
+       /* Fill out header fields */
+       acpi_fill_header(header, "CSRT");
+       header->length = sizeof(struct acpi_csrt);
+       header->revision = 0;
+
+       current = acpi_fill_csrt(current);
+
+       /* (Re)calculate length and checksum */
+       header->length = current - (u32)csrt;
+       header->checksum = table_compute_checksum((void *)csrt, header->length);
+}
+
 static void acpi_create_spcr(struct acpi_spcr *spcr)
 {
        struct acpi_table_header *header = &(spcr->header);
@@ -464,6 +488,7 @@ ulong write_acpi_tables(ulong start)
        struct acpi_fadt *fadt;
        struct acpi_mcfg *mcfg;
        struct acpi_madt *madt;
+       struct acpi_csrt *csrt;
        struct acpi_spcr *spcr;
        int i;
 
@@ -553,6 +578,13 @@ ulong write_acpi_tables(ulong start)
        acpi_add_table(rsdp, mcfg);
        current = ALIGN(current, 16);
 
+       debug("ACPI:    * CSRT\n");
+       csrt = (struct acpi_csrt *)current;
+       acpi_create_csrt(csrt);
+       current += csrt->header.length;
+       acpi_add_table(rsdp, csrt);
+       current = ALIGN(current, 16);
+
        debug("ACPI:    * SPCR\n");
        spcr = (struct acpi_spcr *)current;
        acpi_create_spcr(spcr);