Commit 0951a832 authored by Len Brown's avatar Len Brown

Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.0

into intel.com:/home/lenb/bk/linux-acpi-test-2.6.0
parents def8bfa3 09fae3b3
......@@ -939,11 +939,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH(DMI_BOARD_NAME, "CUR-DLS"),
NO_MATCH, NO_MATCH }},
{ force_acpi_ht, "ASUS A7V", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
MATCH(DMI_BOARD_NAME, "<A7V>"),
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1011"), NO_MATCH }},
{ force_acpi_ht, "ABIT i440BX-W83977", {
MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
......@@ -978,7 +973,10 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
{ disable_acpi_pci, "ASUS A7V", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
MATCH(DMI_BOARD_NAME, "<A7V>"),
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }},
/* newer BIOS, Revision 1011, does work */
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"),
NO_MATCH }},
#endif
{ NULL, }
......
......@@ -1019,8 +1019,6 @@ void __init mp_config_acpi_legacy_irqs (void)
}
}
/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
extern FADT_DESCRIPTOR acpi_fadt;
void __init mp_config_ioapic_for_sci(int irq)
......@@ -1029,6 +1027,7 @@ void __init mp_config_ioapic_for_sci(int irq)
int ioapic_pin;
struct acpi_table_madt *madt;
struct acpi_table_int_src_ovr *entry = NULL;
acpi_interrupt_flags flags;
void *madt_end;
acpi_status status;
......@@ -1052,15 +1051,12 @@ void __init mp_config_ioapic_for_sci(int irq)
* See the note at the end of ACPI 2.0b section
* 5.2.10.8 for what this is about.
*/
if (entry->bus_irq != entry->global_irq) {
acpi_fadt.sci_int = entry->global_irq;
irq = entry->global_irq;
break;
}
else
return;
flags = entry->flags;
acpi_fadt.sci_int = entry->global_irq;
irq = entry->global_irq;
break;
}
entry = (struct acpi_table_int_src_ovr *)
((unsigned long) entry + entry->header.length);
}
......@@ -1070,7 +1066,13 @@ void __init mp_config_ioapic_for_sci(int irq)
ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, level triggered
if (flags.polarity == 0)
flags.polarity = 0x3; /* Active low */
if (flags.trigger == 0)
flags.trigger = 0x3; /* Level-triggered */
io_apic_set_pci_routing(ioapic, ioapic_pin, irq,
(flags.trigger >> 1) , (flags.polarity >> 1));
}
#ifdef CONFIG_ACPI_PCI
......
......@@ -32,7 +32,7 @@
#include <asm/io.h>
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
#include <acpi/actypes.h>
#define _COMPONENT ACPI_EC_COMPONENT
ACPI_MODULE_NAME ("acpi_ec")
......@@ -412,7 +412,10 @@ acpi_ec_space_setup (
* The EC object is in the handler context and is needed
* when calling the acpi_ec_space_handler.
*/
*return_context = handler_context;
if(function == ACPI_REGION_DEACTIVATE)
*return_context = NULL;
else
*return_context = handler_context;
return AE_OK;
}
......
......@@ -382,7 +382,7 @@ acpi_ev_detach_region(
union acpi_operand_object *obj_desc;
union acpi_operand_object **last_obj_ptr;
acpi_adr_space_setup region_setup;
void *region_context;
void **region_context;
union acpi_operand_object *region_obj2;
acpi_status status;
......@@ -394,7 +394,7 @@ acpi_ev_detach_region(
if (!region_obj2) {
return_VOID;
}
region_context = region_obj2->extra.region_context;
region_context = &region_obj2->extra.region_context;
/* Get the address handler from the region object */
......@@ -450,7 +450,7 @@ acpi_ev_detach_region(
region_setup = handler_obj->address_space.setup;
status = region_setup (region_obj, ACPI_REGION_DEACTIVATE,
handler_obj->address_space.context, &region_context);
handler_obj->address_space.context, region_context);
/* Init routine may fail, Just ignore errors */
......
......@@ -220,7 +220,6 @@ acpi_pci_link_check_current (
return AE_CTRL_TERMINATE;
}
static int
acpi_pci_link_get_current (
struct acpi_pci_link *link)
......@@ -279,6 +278,28 @@ acpi_pci_link_get_current (
return_VALUE(result);
}
static int
acpi_pci_link_try_get_current (
struct acpi_pci_link *link,
int irq)
{
int result;
ACPI_FUNCTION_TRACE("acpi_pci_link_try_get_current");
result = acpi_pci_link_get_current(link);
if (result && link->irq.active) {
return_VALUE(result);
}
if (!link->irq.active) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No active IRQ resource found\n"));
printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for device (%s [%s]).\n", irq, acpi_device_name(link->device), acpi_device_bid(link->device));
link->irq.active = irq;
}
return 0;
}
static int
acpi_pci_link_set (
......@@ -294,6 +315,7 @@ acpi_pci_link_set (
struct acpi_buffer buffer = {sizeof(resource)+1, &resource};
int i = 0;
int valid = 0;
int resource_type = 0;
ACPI_FUNCTION_TRACE("acpi_pci_link_set");
......@@ -317,20 +339,32 @@ acpi_pci_link_set (
}
}
/* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with
* an extended one */
if (irq <= 15) {
resource_type = ACPI_RSTYPE_IRQ;
} else {
resource_type = ACPI_RSTYPE_EXT_IRQ;
}
retry_programming:
memset(&resource, 0, sizeof(resource));
/* NOTE: PCI interrupts are always level / active_low / shared. But not all
interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for
parameters */
if (irq <= 15) {
switch(resource_type) {
case ACPI_RSTYPE_IRQ:
resource.res.id = ACPI_RSTYPE_IRQ;
resource.res.length = sizeof(struct acpi_resource);
resource.res.data.irq.edge_level = link->irq.edge_level;
resource.res.data.irq.active_high_low = link->irq.active_high_low;
resource.res.data.irq.number_of_interrupts = 1;
resource.res.data.irq.interrupts[0] = irq;
}
else {
break;
case ACPI_RSTYPE_EXT_IRQ:
resource.res.id = ACPI_RSTYPE_EXT_IRQ;
resource.res.length = sizeof(struct acpi_resource);
resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER;
......@@ -339,11 +373,21 @@ acpi_pci_link_set (
resource.res.data.extended_irq.number_of_interrupts = 1;
resource.res.data.extended_irq.interrupts[0] = irq;
/* ignore resource_source, it's optional */
break;
}
resource.end.id = ACPI_RSTYPE_END_TAG;
/* Attempt to set the resource */
status = acpi_set_current_resources(link->handle, &buffer);
/* if we failed and IRQ <= 15, try again with an extended descriptor */
if (ACPI_FAILURE(status) && (resource_type == ACPI_RSTYPE_IRQ)) {
resource_type = ACPI_RSTYPE_EXT_IRQ;
printk(PREFIX "Retrying with extended IRQ descriptor\n");
goto retry_programming;
}
/* check for total failure */
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n"));
return_VALUE(-ENODEV);
......@@ -361,7 +405,7 @@ acpi_pci_link_set (
}
/* Make sure the active IRQ is the one we requested. */
result = acpi_pci_link_get_current(link);
result = acpi_pci_link_try_get_current(link, irq);
if (result) {
return_VALUE(result);
}
......@@ -458,14 +502,14 @@ static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
irq = link->irq.possible[0];
}
/*
* Select the best IRQ. This is done in reverse to promote
* the use of IRQs 9, 10, 11, and >15.
*/
for (i=(link->irq.possible_count-1); i>0; i--) {
if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
irq = link->irq.possible[i];
}
/*
* Select the best IRQ. This is done in reverse to promote
* the use of IRQs 9, 10, 11, and >15.
*/
for (i=(link->irq.possible_count-1); i>0; i--) {
if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
irq = link->irq.possible[i];
}
/* Attempt to enable the link device at this IRQ. */
if (acpi_pci_link_set(link, irq)) {
......@@ -574,10 +618,6 @@ acpi_pci_link_add (
else
printk(" %d", link->irq.possible[i]);
}
if (!link->irq.active)
printk(", disabled");
else if (!found)
printk(", enabled at IRQ %d", link->irq.active);
printk(")\n");
/* TBD: Acquire/release lock */
......
......@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x20030813
#define ACPI_CA_VERSION 0x20030916
/* Maximum objects in the various object caches */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment