[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86-64: EFI MPS support
# HG changeset patch # User Jan Beulich <jbeulich@xxxxxxxxxx> # Date 1309249288 -3600 # Node ID dffcd8b4c197b58d2acb914d0e07a100e340f7ae # Parent d19e778442673050bba8ea8cf61585902ff81162 x86-64: EFI MPS support It's not clear this is needed - Linux doesn't use the MPS table even if available, and no system having one was seen so far. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> --- diff -r d19e77844267 -r dffcd8b4c197 xen/arch/x86/efi/boot.c --- a/xen/arch/x86/efi/boot.c Tue Jun 28 09:20:49 2011 +0100 +++ b/xen/arch/x86/efi/boot.c Tue Jun 28 09:21:28 2011 +0100 @@ -897,12 +897,15 @@ { static EFI_GUID __initdata acpi2_guid = ACPI_20_TABLE_GUID; static EFI_GUID __initdata acpi_guid = ACPI_TABLE_GUID; + static EFI_GUID __initdata mps_guid = MPS_TABLE_GUID; static EFI_GUID __initdata smbios_guid = SMBIOS_TABLE_GUID; if ( match_guid(&acpi2_guid, &efi_ct[i].VendorGuid) ) efi.acpi20 = (long)efi_ct[i].VendorTable; if ( match_guid(&acpi_guid, &efi_ct[i].VendorGuid) ) efi.acpi = (long)efi_ct[i].VendorTable; + if ( match_guid(&mps_guid, &efi_ct[i].VendorGuid) ) + efi.mps = (long)efi_ct[i].VendorTable; if ( match_guid(&smbios_guid, &efi_ct[i].VendorGuid) ) efi.smbios = (long)efi_ct[i].VendorTable; } diff -r d19e77844267 -r dffcd8b4c197 xen/arch/x86/efi/runtime.c --- a/xen/arch/x86/efi/runtime.c Tue Jun 28 09:20:49 2011 +0100 +++ b/xen/arch/x86/efi/runtime.c Tue Jun 28 09:21:28 2011 +0100 @@ -29,6 +29,7 @@ struct efi __read_mostly efi = { .acpi = EFI_INVALID_TABLE_ADDR, .acpi20 = EFI_INVALID_TABLE_ADDR, + .mps = EFI_INVALID_TABLE_ADDR, .smbios = EFI_INVALID_TABLE_ADDR, }; diff -r d19e77844267 -r dffcd8b4c197 xen/arch/x86/mpparse.c --- a/xen/arch/x86/mpparse.c Tue Jun 28 09:20:49 2011 +0100 +++ b/xen/arch/x86/mpparse.c Tue Jun 28 09:21:28 2011 +0100 @@ -19,6 +19,7 @@ #include <xen/init.h> #include <xen/acpi.h> #include <xen/delay.h> +#include <xen/efi.h> #include <xen/sched.h> #include <asm/bitops.h> @@ -514,6 +515,14 @@ } } +#define FIX_EFI_MPF FIX_KEXEC_BASE_0 + +static __init void efi_unmap_mpf(void) +{ + if (efi_enabled) + __set_fixmap(FIX_EFI_MPF, 0, 0); +} + static struct intel_mp_floating *__initdata mpf_found; /* @@ -528,6 +537,7 @@ * processors, where MPS only supports physical. */ if (acpi_lapic && acpi_ioapic) { + efi_unmap_mpf(); printk(KERN_INFO "Using ACPI (MADT) for SMP configuration information\n"); return; } @@ -558,6 +568,7 @@ * override the defaults. */ if (!smp_read_mpc((void *)(unsigned long)mpf->mpf_physptr)) { + efi_unmap_mpf(); smp_found_config = 0; printk(KERN_ERR "BIOS bug, MP table errors detected!...\n"); printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n"); @@ -584,6 +595,8 @@ } else BUG(); + efi_unmap_mpf(); + printk(KERN_INFO "Processors: %d\n", num_processors); /* * Only use the first configuration found. @@ -638,10 +651,37 @@ return 0; } +static void __init efi_check_config(void) +{ + struct intel_mp_floating *mpf; + + if (efi.mps == EFI_INVALID_TABLE_ADDR) + return; + + __set_fixmap(FIX_EFI_MPF, PFN_DOWN(efi.mps), __PAGE_HYPERVISOR); + mpf = (void *)fix_to_virt(FIX_EFI_MPF) + ((long)efi.mps & (PAGE_SIZE-1)); + + if (memcmp(mpf->mpf_signature, "_MP_", 4) == 0 && + mpf->mpf_length == 1 && + mpf_checksum((void *)mpf, 16) && + (mpf->mpf_specification == 1 || mpf->mpf_specification == 4)) { + smp_found_config = 1; + printk(KERN_INFO "SMP MP-table at %08"PRIx64"\n", efi.mps); + mpf_found = mpf; + } + else + efi_unmap_mpf(); +} + void __init find_smp_config (void) { unsigned int address; + if (efi_enabled) { + efi_check_config(); + return; + } + /* * FIXME: Linux assumes you have 640K of base ram.. * this continues the error... diff -r d19e77844267 -r dffcd8b4c197 xen/include/xen/efi.h --- a/xen/include/xen/efi.h Tue Jun 28 09:20:49 2011 +0100 +++ b/xen/include/xen/efi.h Tue Jun 28 09:21:28 2011 +0100 @@ -17,6 +17,7 @@ /* Add fields here only if they need to be referenced from non-EFI code. */ struct efi { + 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; /* SM BIOS table */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |