On Mon, Dec 7, 2009 at 3:26 AM, Kenji Kaneshige <kaneshige.kenji@xxxxxxxxxxxxxx> wrote: > Robert Hancock wrote: >> >> I've been looking into why I get these messages on bootup on an Asus >> P7P55D PRO motherboard: >> >> Firmware did not grant requested _OSC control >> aer 0000:00:03.0:pcie02: AER service couldn't init device: no _OSC support >> pci_hotplug: PCI Hot Plug PCI Core version: 0.5 >> Firmware did not grant requested _OSC control >> Firmware did not grant requested _OSC control >> Firmware did not grant requested _OSC control >> Firmware did not grant requested _OSC control >> >> The AML code for _OSC in the DSDT (below) is almost identical to the >> example code in the ACPI spec. From looking at the _OSC method, I don't see >> why it should reject any requests for PCI Express hotplug or AER control. >> >> I can't quite make sense of the ACPI code that is supposed to handle this. >> When the AER driver calls acpi_pci_osc_control_set, it first does this: >> >> /* Need to query controls first before requesting them */ >> if (!root->osc_queried) { >> status = acpi_pci_query_osc(root, root->osc_support_set); >> if (ACPI_FAILURE(status)) >> goto out; >> } > > > Just in case, does removing this 'if' statement fix the problem? > > >> if ((root->osc_control_qry & control_req) != control_req) { >> printk(KERN_DEBUG >> "Firmware did not grant requested _OSC control\n"); >> status = AE_SUPPORT; >> goto out; >> } >> >> Inside acpi_pci_query_osc: >> >> /* do _OSC query for all possible controls */ >> support_set = root->osc_support_set | (flags & OSC_SUPPORT_MASKS); >> capbuf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE; >> capbuf[OSC_SUPPORT_TYPE] = support_set; >> capbuf[OSC_CONTROL_TYPE] = OSC_CONTROL_MASKS; >> >> status = acpi_pci_run_osc(root->device->handle, capbuf, &result); >> if (ACPI_SUCCESS(status)) { >> root->osc_support_set = support_set; >> root->osc_control_qry = result; >> root->osc_queried = 1; >> } >> >> The comment says "do _OSC query for all possible controls", but it doesn't >> look like that's what the code is actually doing. The first time this gets >> called, assuming osc_support_set is 0, it looks like support_set passed into >> _OSC will also be 0. Then osc_queried would be set to 1, _OSC would never >> get called again and the cached query result is based on 0 support flags >> being passed into _OSC, which is wrong. Or am I missing something? >> > > Though I might be missing something, I think _OSC is evaluated > and osc_control_qry is updated, whenever acpi_pci_osc_support() > gets called. Ahh, I missed that acpi_pci_query_osc is also called from acpi_pci_osc_support. -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html