Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (140 commits) ACPI: processor: use .notify method instead of installing handler directly ACPI: button: use .notify method instead of installing handler directly ACPI: support acpi_device_ops .notify methods toshiba-acpi: remove MAINTAINERS entry ACPI: battery: asynchronous init acer-wmi: Update copyright notice & documentation acer-wmi: Cleanup the failure cleanup handling acer-wmi: Blacklist Acer Aspire One video: build fix thinkpad-acpi: rework brightness support thinkpad-acpi: enhanced debugging messages for the fan subdriver thinkpad-acpi: enhanced debugging messages for the hotkey subdriver thinkpad-acpi: enhanced debugging messages for rfkill subdrivers thinkpad-acpi: restrict access to some firmware LEDs thinkpad-acpi: remove HKEY disable functionality thinkpad-acpi: add new debug helpers and warn of deprecated atts thinkpad-acpi: add missing log levels thinkpad-acpi: cleanup debug helpers thinkpad-acpi: documentation cleanup thinkpad-acpi: drop ibm-acpi alias ...
This commit is contained in:
@@ -229,6 +229,35 @@ static void __cpuinit acpi_register_lapic(int id, u8 enabled)
|
||||
generic_processor_info(id, ver);
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
|
||||
{
|
||||
struct acpi_madt_local_x2apic *processor = NULL;
|
||||
|
||||
processor = (struct acpi_madt_local_x2apic *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(processor, end))
|
||||
return -EINVAL;
|
||||
|
||||
acpi_table_print_madt_entry(header);
|
||||
|
||||
#ifdef CONFIG_X86_X2APIC
|
||||
/*
|
||||
* We need to register disabled CPU as well to permit
|
||||
* counting disabled CPUs. This allows us to size
|
||||
* cpus_possible_map more accurately, to permit
|
||||
* to not preallocating memory for all NR_CPUS
|
||||
* when we use CPU hotplug.
|
||||
*/
|
||||
acpi_register_lapic(processor->local_apic_id, /* APIC ID */
|
||||
processor->lapic_flags & ACPI_MADT_ENABLED);
|
||||
#else
|
||||
printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
@@ -288,6 +317,25 @@ acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_x2apic_nmi(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_madt_local_x2apic_nmi *x2apic_nmi = NULL;
|
||||
|
||||
x2apic_nmi = (struct acpi_madt_local_x2apic_nmi *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(x2apic_nmi, end))
|
||||
return -EINVAL;
|
||||
|
||||
acpi_table_print_madt_entry(header);
|
||||
|
||||
if (x2apic_nmi->lint != 1)
|
||||
printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
@@ -793,6 +841,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
|
||||
static int __init acpi_parse_madt_lapic_entries(void)
|
||||
{
|
||||
int count;
|
||||
int x2count = 0;
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
@@ -816,22 +865,28 @@ static int __init acpi_parse_madt_lapic_entries(void)
|
||||
count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,
|
||||
acpi_parse_sapic, MAX_APICS);
|
||||
|
||||
if (!count)
|
||||
if (!count) {
|
||||
x2count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC,
|
||||
acpi_parse_x2apic, MAX_APICS);
|
||||
count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC,
|
||||
acpi_parse_lapic, MAX_APICS);
|
||||
if (!count) {
|
||||
}
|
||||
if (!count && !x2count) {
|
||||
printk(KERN_ERR PREFIX "No LAPIC entries present\n");
|
||||
/* TBD: Cleanup to allow fallback to MPS */
|
||||
return -ENODEV;
|
||||
} else if (count < 0) {
|
||||
} else if (count < 0 || x2count < 0) {
|
||||
printk(KERN_ERR PREFIX "Error parsing LAPIC entry\n");
|
||||
/* TBD: Cleanup to allow fallback to MPS */
|
||||
return count;
|
||||
}
|
||||
|
||||
x2count =
|
||||
acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC_NMI,
|
||||
acpi_parse_x2apic_nmi, 0);
|
||||
count =
|
||||
acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0);
|
||||
if (count < 0) {
|
||||
if (count < 0 || x2count < 0) {
|
||||
printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
|
||||
/* TBD: Cleanup to allow fallback to MPS */
|
||||
return count;
|
||||
@@ -1470,7 +1525,7 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
|
||||
|
||||
/*
|
||||
* If your system is blacklisted here, but you find that acpi=force
|
||||
* works for you, please contact acpi-devel@sourceforge.net
|
||||
* works for you, please contact linux-acpi@vger.kernel.org
|
||||
*/
|
||||
static struct dmi_system_id __initdata acpi_dmi_table[] = {
|
||||
/*
|
||||
|
@@ -682,6 +682,18 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||
perf->states[i].transition_latency * 1000;
|
||||
}
|
||||
|
||||
/* Check for high latency (>20uS) from buggy BIOSes, like on T42 */
|
||||
if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
|
||||
policy->cpuinfo.transition_latency > 20 * 1000) {
|
||||
static int print_once;
|
||||
policy->cpuinfo.transition_latency = 20 * 1000;
|
||||
if (!print_once) {
|
||||
print_once = 1;
|
||||
printk(KERN_INFO "Capping off P-state tranision latency"
|
||||
" at 20 uS\n");
|
||||
}
|
||||
}
|
||||
|
||||
data->max_freq = perf->states[0].core_frequency * 1000;
|
||||
/* table init */
|
||||
for (i = 0; i < perf->state_count; i++) {
|
||||
|
@@ -305,7 +305,7 @@ retry_loop:
|
||||
outb(3, 0x22);
|
||||
} else if ((pr != NULL) && pr->flags.bm_control) {
|
||||
/* Disable bus master arbitration */
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
|
||||
acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 1);
|
||||
}
|
||||
switch (longhaul_version) {
|
||||
|
||||
@@ -328,7 +328,7 @@ retry_loop:
|
||||
case TYPE_POWERSAVER:
|
||||
if (longhaul_flags & USE_ACPI_C3) {
|
||||
/* Don't allow wakeup */
|
||||
acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
||||
acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
||||
do_powersaver(cx->address, mults_index, dir);
|
||||
} else {
|
||||
do_powersaver(0, mults_index, dir);
|
||||
@@ -341,7 +341,7 @@ retry_loop:
|
||||
outb(0, 0x22);
|
||||
} else if ((pr != NULL) && pr->flags.bm_control) {
|
||||
/* Enable bus master arbitration */
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
|
||||
acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 0);
|
||||
}
|
||||
outb(pic2_mask, 0xA1); /* restore mask */
|
||||
outb(pic1_mask, 0x21);
|
||||
|
@@ -116,6 +116,36 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
|
||||
reserve_early(phys, phys + length, "ACPI SLIT");
|
||||
}
|
||||
|
||||
/* Callback for Proximity Domain -> x2APIC mapping */
|
||||
void __init
|
||||
acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
||||
{
|
||||
int pxm, node;
|
||||
int apic_id;
|
||||
|
||||
if (srat_disabled())
|
||||
return;
|
||||
if (pa->header.length < sizeof(struct acpi_srat_x2apic_cpu_affinity)) {
|
||||
bad_srat();
|
||||
return;
|
||||
}
|
||||
if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0)
|
||||
return;
|
||||
pxm = pa->proximity_domain;
|
||||
node = setup_node(pxm);
|
||||
if (node < 0) {
|
||||
printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
|
||||
bad_srat();
|
||||
return;
|
||||
}
|
||||
|
||||
apic_id = pa->apic_id;
|
||||
apicid_to_node[apic_id] = node;
|
||||
acpi_numa = 1;
|
||||
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
|
||||
pxm, apic_id, node);
|
||||
}
|
||||
|
||||
/* Callback for Proximity Domain -> LAPIC mapping */
|
||||
void __init
|
||||
acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
|
||||
|
Reference in New Issue
Block a user