|
@@ -65,10 +65,6 @@ static struct acpi_scan_handler pci_root_handler = {
|
|
|
.detach = acpi_pci_root_remove,
|
|
|
};
|
|
|
|
|
|
-/* Lock to protect both acpi_pci_roots lists */
|
|
|
-static DEFINE_MUTEX(acpi_pci_root_lock);
|
|
|
-static LIST_HEAD(acpi_pci_roots);
|
|
|
-
|
|
|
static DEFINE_MUTEX(osc_lock);
|
|
|
|
|
|
/**
|
|
@@ -381,23 +377,24 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
int result;
|
|
|
struct acpi_pci_root *root;
|
|
|
u32 flags, base_flags;
|
|
|
+ acpi_handle handle = device->handle;
|
|
|
|
|
|
root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
|
|
|
if (!root)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
segment = 0;
|
|
|
- status = acpi_evaluate_integer(device->handle, METHOD_NAME__SEG, NULL,
|
|
|
+ status = acpi_evaluate_integer(handle, METHOD_NAME__SEG, NULL,
|
|
|
&segment);
|
|
|
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
- printk(KERN_ERR PREFIX "can't evaluate _SEG\n");
|
|
|
+ dev_err(&device->dev, "can't evaluate _SEG\n");
|
|
|
result = -ENODEV;
|
|
|
goto end;
|
|
|
}
|
|
|
|
|
|
/* Check _CRS first, then _BBN. If no _BBN, default to zero. */
|
|
|
root->secondary.flags = IORESOURCE_BUS;
|
|
|
- status = try_get_root_bridge_busnr(device->handle, &root->secondary);
|
|
|
+ status = try_get_root_bridge_busnr(handle, &root->secondary);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
/*
|
|
|
* We need both the start and end of the downstream bus range
|
|
@@ -406,33 +403,32 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
* can do is assume [_BBN-0xFF] or [0-0xFF].
|
|
|
*/
|
|
|
root->secondary.end = 0xFF;
|
|
|
- printk(KERN_WARNING FW_BUG PREFIX
|
|
|
- "no secondary bus range in _CRS\n");
|
|
|
- status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN,
|
|
|
+ dev_warn(&device->dev,
|
|
|
+ FW_BUG "no secondary bus range in _CRS\n");
|
|
|
+ status = acpi_evaluate_integer(handle, METHOD_NAME__BBN,
|
|
|
NULL, &bus);
|
|
|
if (ACPI_SUCCESS(status))
|
|
|
root->secondary.start = bus;
|
|
|
else if (status == AE_NOT_FOUND)
|
|
|
root->secondary.start = 0;
|
|
|
else {
|
|
|
- printk(KERN_ERR PREFIX "can't evaluate _BBN\n");
|
|
|
+ dev_err(&device->dev, "can't evaluate _BBN\n");
|
|
|
result = -ENODEV;
|
|
|
goto end;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- INIT_LIST_HEAD(&root->node);
|
|
|
root->device = device;
|
|
|
root->segment = segment & 0xFFFF;
|
|
|
strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);
|
|
|
strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
|
|
|
device->driver_data = root;
|
|
|
|
|
|
- printk(KERN_INFO PREFIX "%s [%s] (domain %04x %pR)\n",
|
|
|
+ pr_info(PREFIX "%s [%s] (domain %04x %pR)\n",
|
|
|
acpi_device_name(device), acpi_device_bid(device),
|
|
|
root->segment, &root->secondary);
|
|
|
|
|
|
- root->mcfg_addr = acpi_pci_root_get_mcfg_addr(device->handle);
|
|
|
+ root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle);
|
|
|
|
|
|
/*
|
|
|
* All supported architectures that use ACPI have support for
|
|
@@ -445,10 +441,6 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
* TBD: Need PCI interface for enumeration/configuration of roots.
|
|
|
*/
|
|
|
|
|
|
- mutex_lock(&acpi_pci_root_lock);
|
|
|
- list_add_tail(&root->node, &acpi_pci_roots);
|
|
|
- mutex_unlock(&acpi_pci_root_lock);
|
|
|
-
|
|
|
/*
|
|
|
* Scan the Root Bridge
|
|
|
* --------------------
|
|
@@ -458,11 +450,11 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
*/
|
|
|
root->bus = pci_acpi_scan_root(root);
|
|
|
if (!root->bus) {
|
|
|
- printk(KERN_ERR PREFIX
|
|
|
- "Bus %04x:%02x not present in PCI namespace\n",
|
|
|
- root->segment, (unsigned int)root->secondary.start);
|
|
|
+ dev_err(&device->dev,
|
|
|
+ "Bus %04x:%02x not present in PCI namespace\n",
|
|
|
+ root->segment, (unsigned int)root->secondary.start);
|
|
|
result = -ENODEV;
|
|
|
- goto out_del_root;
|
|
|
+ goto end;
|
|
|
}
|
|
|
|
|
|
/* Indicate support for various _OSC capabilities. */
|
|
@@ -501,7 +493,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
dev_info(&device->dev,
|
|
|
"Requesting ACPI _OSC control (0x%02x)\n", flags);
|
|
|
|
|
|
- status = acpi_pci_osc_control_set(device->handle, &flags,
|
|
|
+ status = acpi_pci_osc_control_set(handle, &flags,
|
|
|
OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL);
|
|
|
if (ACPI_SUCCESS(status)) {
|
|
|
dev_info(&device->dev,
|
|
@@ -518,8 +510,8 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
"ACPI _OSC request failed (%s), "
|
|
|
"returned control mask: 0x%02x\n",
|
|
|
acpi_format_exception(status), flags);
|
|
|
- pr_info("ACPI _OSC control for PCIe not granted, "
|
|
|
- "disabling ASPM\n");
|
|
|
+ dev_info(&device->dev,
|
|
|
+ "ACPI _OSC control for PCIe not granted, disabling ASPM\n");
|
|
|
pcie_no_aspm();
|
|
|
}
|
|
|
} else {
|
|
@@ -535,20 +527,14 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
if (system_state != SYSTEM_BOOTING) {
|
|
|
pcibios_resource_survey_bus(root->bus);
|
|
|
pci_assign_unassigned_bus_resources(root->bus);
|
|
|
- }
|
|
|
|
|
|
- /* need to after hot-added ioapic is registered */
|
|
|
- if (system_state != SYSTEM_BOOTING)
|
|
|
+ /* need to after hot-added ioapic is registered */
|
|
|
pci_enable_bridges(root->bus);
|
|
|
+ }
|
|
|
|
|
|
pci_bus_add_devices(root->bus);
|
|
|
return 1;
|
|
|
|
|
|
-out_del_root:
|
|
|
- mutex_lock(&acpi_pci_root_lock);
|
|
|
- list_del(&root->node);
|
|
|
- mutex_unlock(&acpi_pci_root_lock);
|
|
|
-
|
|
|
end:
|
|
|
kfree(root);
|
|
|
return result;
|
|
@@ -565,9 +551,6 @@ static void acpi_pci_root_remove(struct acpi_device *device)
|
|
|
|
|
|
pci_remove_root_bus(root->bus);
|
|
|
|
|
|
- mutex_lock(&acpi_pci_root_lock);
|
|
|
- list_del(&root->node);
|
|
|
- mutex_unlock(&acpi_pci_root_lock);
|
|
|
kfree(root);
|
|
|
}
|
|
|
|
|
@@ -587,12 +570,13 @@ static void handle_root_bridge_insertion(acpi_handle handle)
|
|
|
struct acpi_device *device;
|
|
|
|
|
|
if (!acpi_bus_get_device(handle, &device)) {
|
|
|
- printk(KERN_DEBUG "acpi device exists...\n");
|
|
|
+ dev_printk(KERN_DEBUG, &device->dev,
|
|
|
+ "acpi device already exists; ignoring notify\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (acpi_bus_scan(handle))
|
|
|
- printk(KERN_ERR "cannot add bridge to acpi list\n");
|
|
|
+ acpi_handle_err(handle, "cannot add bridge to acpi list\n");
|
|
|
}
|
|
|
|
|
|
static void handle_root_bridge_removal(struct acpi_device *device)
|
|
@@ -621,7 +605,6 @@ static void handle_root_bridge_removal(struct acpi_device *device)
|
|
|
static void _handle_hotplug_event_root(struct work_struct *work)
|
|
|
{
|
|
|
struct acpi_pci_root *root;
|
|
|
- struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER };
|
|
|
struct acpi_hp_work *hp_work;
|
|
|
acpi_handle handle;
|
|
|
u32 type;
|
|
@@ -633,13 +616,12 @@ static void _handle_hotplug_event_root(struct work_struct *work)
|
|
|
acpi_scan_lock_acquire();
|
|
|
|
|
|
root = acpi_pci_find_root(handle);
|
|
|
- acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
|
|
|
|
|
|
switch (type) {
|
|
|
case ACPI_NOTIFY_BUS_CHECK:
|
|
|
/* bus enumerate */
|
|
|
- printk(KERN_DEBUG "%s: Bus check notify on %s\n", __func__,
|
|
|
- (char *)buffer.pointer);
|
|
|
+ acpi_handle_printk(KERN_DEBUG, handle,
|
|
|
+ "Bus check notify on %s\n", __func__);
|
|
|
if (!root)
|
|
|
handle_root_bridge_insertion(handle);
|
|
|
|
|
@@ -647,28 +629,28 @@ static void _handle_hotplug_event_root(struct work_struct *work)
|
|
|
|
|
|
case ACPI_NOTIFY_DEVICE_CHECK:
|
|
|
/* device check */
|
|
|
- printk(KERN_DEBUG "%s: Device check notify on %s\n", __func__,
|
|
|
- (char *)buffer.pointer);
|
|
|
+ acpi_handle_printk(KERN_DEBUG, handle,
|
|
|
+ "Device check notify on %s\n", __func__);
|
|
|
if (!root)
|
|
|
handle_root_bridge_insertion(handle);
|
|
|
break;
|
|
|
|
|
|
case ACPI_NOTIFY_EJECT_REQUEST:
|
|
|
/* request device eject */
|
|
|
- printk(KERN_DEBUG "%s: Device eject notify on %s\n", __func__,
|
|
|
- (char *)buffer.pointer);
|
|
|
+ acpi_handle_printk(KERN_DEBUG, handle,
|
|
|
+ "Device eject notify on %s\n", __func__);
|
|
|
if (root)
|
|
|
handle_root_bridge_removal(root->device);
|
|
|
break;
|
|
|
default:
|
|
|
- printk(KERN_WARNING "notify_handler: unknown event type 0x%x for %s\n",
|
|
|
- type, (char *)buffer.pointer);
|
|
|
+ acpi_handle_warn(handle,
|
|
|
+ "notify_handler: unknown event type 0x%x\n",
|
|
|
+ type);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
acpi_scan_lock_release();
|
|
|
kfree(hp_work); /* allocated in handle_hotplug_event_bridge */
|
|
|
- kfree(buffer.pointer);
|
|
|
}
|
|
|
|
|
|
static void handle_hotplug_event_root(acpi_handle handle, u32 type,
|
|
@@ -682,9 +664,6 @@ static acpi_status __init
|
|
|
find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|
|
{
|
|
|
acpi_status status;
|
|
|
- char objname[64];
|
|
|
- struct acpi_buffer buffer = { .length = sizeof(objname),
|
|
|
- .pointer = objname };
|
|
|
int *count = (int *)context;
|
|
|
|
|
|
if (!acpi_is_root_bridge(handle))
|
|
@@ -692,16 +671,15 @@ find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|
|
|
|
|
(*count)++;
|
|
|
|
|
|
- acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
|
|
|
-
|
|
|
status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
|
|
|
handle_hotplug_event_root, NULL);
|
|
|
if (ACPI_FAILURE(status))
|
|
|
- printk(KERN_DEBUG "acpi root: %s notify handler is not installed, exit status: %u\n",
|
|
|
- objname, (unsigned int)status);
|
|
|
+ acpi_handle_printk(KERN_DEBUG, handle,
|
|
|
+ "notify handler is not installed, exit status: %u\n",
|
|
|
+ (unsigned int)status);
|
|
|
else
|
|
|
- printk(KERN_DEBUG "acpi root: %s notify handler is installed\n",
|
|
|
- objname);
|
|
|
+ acpi_handle_printk(KERN_DEBUG, handle,
|
|
|
+ "notify handler is installed\n");
|
|
|
|
|
|
return AE_OK;
|
|
|
}
|