efi/ia64: Move HCDP and MPS table handling into IA64 arch code
authorArd Biesheuvel <ardb@kernel.org>
Sun, 19 Jan 2020 14:43:53 +0000 (15:43 +0100)
committerArd Biesheuvel <ardb@kernel.org>
Sun, 23 Feb 2020 20:59:42 +0000 (21:59 +0100)
The HCDP and MPS tables are Itanium specific EFI config tables, so
move their handling to ia64 arch code.

Tested-by: Tony Luck <tony.luck@intel.com> # arch/ia64
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/ia64/kernel/efi.c
arch/x86/platform/efi/efi.c
drivers/firmware/efi/efi.c
drivers/firmware/pcdp.c
include/linux/efi.h

index 0a34dcc..3123089 100644 (file)
 
 #define EFI_DEBUG      0
 
+static unsigned long mps_phys = EFI_INVALID_TABLE_ADDR;
 static __initdata unsigned long palo_phys;
 
+unsigned long hcdp_phys = EFI_INVALID_TABLE_ADDR;
 unsigned long sal_systab_phys = EFI_INVALID_TABLE_ADDR;
 
 static __initdata efi_config_table_type_t arch_tables[] = {
+       {HCDP_TABLE_GUID, "HCDP", &hcdp_phys},
+       {MPS_TABLE_GUID, "MPS", &mps_phys},
        {PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID, "PALO", &palo_phys},
        {SAL_SYSTEM_TABLE_GUID, "SALsystab", &sal_systab_phys},
        {NULL_GUID, NULL, 0},
@@ -1351,3 +1355,12 @@ vmcore_find_descriptor_size (unsigned long address)
        return ret;
 }
 #endif
+
+char *efi_systab_show_arch(char *str)
+{
+       if (mps_phys != EFI_INVALID_TABLE_ADDR)
+               str += sprintf(str, "MPS=0x%lx\n", mps_phys);
+       if (hcdp_phys != EFI_INVALID_TABLE_ADDR)
+               str += sprintf(str, "HCDP=0x%lx\n", hcdp_phys);
+       return str;
+}
index 4970229..61ebaae 100644 (file)
@@ -65,12 +65,10 @@ static efi_config_table_type_t arch_tables[] __initdata = {
 };
 
 static const unsigned long * const efi_tables[] = {
-       &efi.mps,
        &efi.acpi,
        &efi.acpi20,
        &efi.smbios,
        &efi.smbios3,
-       &efi.hcdp,
        &efi.uga,
 #ifdef CONFIG_X86_UV
        &uv_systab_phys,
index 5464e38..8129a52 100644 (file)
 #include <asm/early_ioremap.h>
 
 struct efi __read_mostly efi = {
-       .mps                    = EFI_INVALID_TABLE_ADDR,
        .acpi                   = EFI_INVALID_TABLE_ADDR,
        .acpi20                 = EFI_INVALID_TABLE_ADDR,
        .smbios                 = EFI_INVALID_TABLE_ADDR,
        .smbios3                = EFI_INVALID_TABLE_ADDR,
-       .hcdp                   = EFI_INVALID_TABLE_ADDR,
        .uga                    = EFI_INVALID_TABLE_ADDR,
        .fw_vendor              = EFI_INVALID_TABLE_ADDR,
        .runtime                = EFI_INVALID_TABLE_ADDR,
@@ -121,8 +119,6 @@ static ssize_t systab_show(struct kobject *kobj,
        if (!kobj || !buf)
                return -EINVAL;
 
-       if (efi.mps != EFI_INVALID_TABLE_ADDR)
-               str += sprintf(str, "MPS=0x%lx\n", efi.mps);
        if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
                str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20);
        if (efi.acpi != EFI_INVALID_TABLE_ADDR)
@@ -136,11 +132,15 @@ static ssize_t systab_show(struct kobject *kobj,
                str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
        if (efi.smbios != EFI_INVALID_TABLE_ADDR)
                str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
-       if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
-               str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
        if (efi.uga != EFI_INVALID_TABLE_ADDR)
                str += sprintf(str, "UGA=0x%lx\n", efi.uga);
 
+       if (IS_ENABLED(CONFIG_IA64)) {
+               extern char *efi_systab_show_arch(char *str);
+
+               str = efi_systab_show_arch(str);
+       }
+
        return str - buf;
 }
 
@@ -467,8 +467,6 @@ void __init efi_mem_reserve(phys_addr_t addr, u64 size)
 static __initdata efi_config_table_type_t common_tables[] = {
        {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
        {ACPI_TABLE_GUID, "ACPI", &efi.acpi},
-       {HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
-       {MPS_TABLE_GUID, "MPS", &efi.mps},
        {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
        {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
        {UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
index 4adeb7a..715a454 100644 (file)
@@ -80,6 +80,8 @@ setup_vga_console(struct pcdp_device *dev)
 #endif
 }
 
+extern unsigned long hcdp_phys;
+
 int __init
 efi_setup_pcdp_console(char *cmdline)
 {
@@ -89,11 +91,11 @@ efi_setup_pcdp_console(char *cmdline)
        int i, serial = 0;
        int rc = -ENODEV;
 
-       if (efi.hcdp == EFI_INVALID_TABLE_ADDR)
+       if (hcdp_phys == EFI_INVALID_TABLE_ADDR)
                return -ENODEV;
 
-       pcdp = early_memremap(efi.hcdp, 4096);
-       printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, efi.hcdp);
+       pcdp = early_memremap(hcdp_phys, 4096);
+       printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, hcdp_phys);
 
        if (strstr(cmdline, "console=hcdp")) {
                if (pcdp->rev < 3)
index c517d3b..4544393 100644 (file)
@@ -531,12 +531,10 @@ typedef struct {
 extern struct efi {
        efi_system_table_t *systab;     /* EFI system table */
        unsigned int runtime_version;   /* Runtime services version */
-       unsigned long mps;              /* MPS table */
        unsigned long acpi;             /* ACPI table  (IA64 ext 0.71) */
        unsigned long acpi20;           /* ACPI table  (ACPI 2.0) */
        unsigned long smbios;           /* SMBIOS table (32 bit entry point) */
        unsigned long smbios3;          /* SMBIOS table (64 bit entry point) */
-       unsigned long hcdp;             /* HCDP table */
        unsigned long uga;              /* UGA table */
        unsigned long fw_vendor;        /* fw_vendor */
        unsigned long runtime;          /* runtime table */