diff options
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 20 | 
1 files changed, 15 insertions, 5 deletions
| diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 1c38174b5f01..21b542a6866c 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -146,7 +146,11 @@ static int __init acpi_parse_madt(struct acpi_table_header *table)  		pr_debug("Local APIC address 0x%08x\n", madt->address);  	} -	if (madt->header.revision >= 5) + +	/* ACPI 6.3 and newer support the online capable bit. */ +	if (acpi_gbl_FADT.header.revision > 6 || +	    (acpi_gbl_FADT.header.revision == 6 && +	     acpi_gbl_FADT.minor_revision >= 3))  		acpi_support_online_capable = true;  	default_acpi_madt_oem_check(madt->header.oem_id, @@ -193,7 +197,8 @@ static bool __init acpi_is_processor_usable(u32 lapic_flags)  	if (lapic_flags & ACPI_MADT_ENABLED)  		return true; -	if (acpi_support_online_capable && (lapic_flags & ACPI_MADT_ONLINE_CAPABLE)) +	if (!acpi_support_online_capable || +	    (lapic_flags & ACPI_MADT_ONLINE_CAPABLE))  		return true;  	return false; @@ -1853,13 +1858,18 @@ early_param("acpi_sci", setup_acpi_sci);  int __acpi_acquire_global_lock(unsigned int *lock)  { -	unsigned int old, new; +	unsigned int old, new, val;  	old = READ_ONCE(*lock);  	do { -		new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); +		val = (old >> 1) & 0x1; +		new = (old & ~0x3) + 2 + val;  	} while (!try_cmpxchg(lock, &old, new)); -	return ((new & 0x3) < 3) ? -1 : 0; + +	if (val) +		return 0; + +	return -1;  }  int __acpi_release_global_lock(unsigned int *lock) | 
