Merge branches 'acpi-scan', 'acpi-tables' and 'acpi-platform'
* acpi-scan: ACPI / scan: Avoid enumerating devices more than once ACPI / scan: Apply default enumeration to devices with ACPI drivers ACPI / scan: Drop support for force_remove * acpi-tables: ACPI / tables: Drop acpi_parse_entries() which is not used * acpi-platform: ACPI / platform: Update platform device NUMA node based on _PXM method
This commit is contained in:
commit
131b3a8db2
|
@ -0,0 +1,8 @@
|
||||||
|
What: /sys/firmware/acpi/hotplug/force_remove
|
||||||
|
Date: Mar 2017
|
||||||
|
Contact: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||||
|
Description:
|
||||||
|
Since the force_remove is inherently broken and dangerous to
|
||||||
|
use for some hotplugable resources like memory (because ignoring
|
||||||
|
the offline failure might lead to memory corruption and crashes)
|
||||||
|
enabling this knob is not safe and thus unsupported.
|
|
@ -44,16 +44,6 @@ Description:
|
||||||
or 0 (unset). Attempts to write any other values to it will
|
or 0 (unset). Attempts to write any other values to it will
|
||||||
cause -EINVAL to be returned.
|
cause -EINVAL to be returned.
|
||||||
|
|
||||||
What: /sys/firmware/acpi/hotplug/force_remove
|
|
||||||
Date: May 2013
|
|
||||||
Contact: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
||||||
Description:
|
|
||||||
The number in this file (0 or 1) determines whether (1) or not
|
|
||||||
(0) the ACPI subsystem will allow devices to be hot-removed even
|
|
||||||
if they cannot be put offline gracefully (from the kernel's
|
|
||||||
viewpoint). That number can be changed by writing a boolean
|
|
||||||
value to this file.
|
|
||||||
|
|
||||||
What: /sys/firmware/acpi/interrupts/
|
What: /sys/firmware/acpi/interrupts/
|
||||||
Date: February 2008
|
Date: February 2008
|
||||||
Contact: Len Brown <lenb@kernel.org>
|
Contact: Len Brown <lenb@kernel.org>
|
||||||
|
|
|
@ -121,11 +121,14 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
|
||||||
if (IS_ERR(pdev))
|
if (IS_ERR(pdev))
|
||||||
dev_err(&adev->dev, "platform device creation failed: %ld\n",
|
dev_err(&adev->dev, "platform device creation failed: %ld\n",
|
||||||
PTR_ERR(pdev));
|
PTR_ERR(pdev));
|
||||||
else
|
else {
|
||||||
|
set_dev_node(&pdev->dev, acpi_get_node(adev->handle));
|
||||||
dev_dbg(&adev->dev, "created platform device %s\n",
|
dev_dbg(&adev->dev, "created platform device %s\n",
|
||||||
dev_name(&pdev->dev));
|
dev_name(&pdev->dev));
|
||||||
|
}
|
||||||
|
|
||||||
kfree(resources);
|
kfree(resources);
|
||||||
|
|
||||||
return pdev;
|
return pdev;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_create_platform_device);
|
EXPORT_SYMBOL_GPL(acpi_create_platform_device);
|
||||||
|
|
|
@ -65,8 +65,6 @@ static inline void acpi_cmos_rtc_init(void) {}
|
||||||
#endif
|
#endif
|
||||||
int acpi_rev_override_setup(char *str);
|
int acpi_rev_override_setup(char *str);
|
||||||
|
|
||||||
extern bool acpi_force_hot_remove;
|
|
||||||
|
|
||||||
void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
|
void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
|
||||||
const char *name);
|
const char *name);
|
||||||
int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler,
|
int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler,
|
||||||
|
|
|
@ -30,12 +30,6 @@ extern struct acpi_device *acpi_root;
|
||||||
|
|
||||||
#define INVALID_ACPI_HANDLE ((acpi_handle)empty_zero_page)
|
#define INVALID_ACPI_HANDLE ((acpi_handle)empty_zero_page)
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, devices will be hot-removed even if they cannot be put offline
|
|
||||||
* gracefully (from the kernel's standpoint).
|
|
||||||
*/
|
|
||||||
bool acpi_force_hot_remove;
|
|
||||||
|
|
||||||
static const char *dummy_hid = "device";
|
static const char *dummy_hid = "device";
|
||||||
|
|
||||||
static LIST_HEAD(acpi_dep_list);
|
static LIST_HEAD(acpi_dep_list);
|
||||||
|
@ -170,9 +164,6 @@ static acpi_status acpi_bus_offline(acpi_handle handle, u32 lvl, void *data,
|
||||||
pn->put_online = false;
|
pn->put_online = false;
|
||||||
}
|
}
|
||||||
ret = device_offline(pn->dev);
|
ret = device_offline(pn->dev);
|
||||||
if (acpi_force_hot_remove)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
pn->put_online = !ret;
|
pn->put_online = !ret;
|
||||||
} else {
|
} else {
|
||||||
|
@ -241,11 +232,11 @@ static int acpi_scan_try_to_offline(struct acpi_device *device)
|
||||||
acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
|
acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
|
||||||
NULL, acpi_bus_offline, (void *)true,
|
NULL, acpi_bus_offline, (void *)true,
|
||||||
(void **)&errdev);
|
(void **)&errdev);
|
||||||
if (!errdev || acpi_force_hot_remove)
|
if (!errdev)
|
||||||
acpi_bus_offline(handle, 0, (void *)true,
|
acpi_bus_offline(handle, 0, (void *)true,
|
||||||
(void **)&errdev);
|
(void **)&errdev);
|
||||||
|
|
||||||
if (errdev && !acpi_force_hot_remove) {
|
if (errdev) {
|
||||||
dev_warn(errdev, "Offline failed.\n");
|
dev_warn(errdev, "Offline failed.\n");
|
||||||
acpi_bus_online(handle, 0, NULL, NULL);
|
acpi_bus_online(handle, 0, NULL, NULL);
|
||||||
acpi_walk_namespace(ACPI_TYPE_ANY, handle,
|
acpi_walk_namespace(ACPI_TYPE_ANY, handle,
|
||||||
|
@ -263,8 +254,7 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
|
||||||
unsigned long long sta;
|
unsigned long long sta;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
|
||||||
if (device->handler && device->handler->hotplug.demand_offline
|
if (device->handler && device->handler->hotplug.demand_offline) {
|
||||||
&& !acpi_force_hot_remove) {
|
|
||||||
if (!acpi_scan_is_offline(device, true))
|
if (!acpi_scan_is_offline(device, true))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1850,6 +1840,8 @@ static void acpi_bus_attach(struct acpi_device *device)
|
||||||
device->flags.power_manageable = 0;
|
device->flags.power_manageable = 0;
|
||||||
|
|
||||||
device->flags.initialized = true;
|
device->flags.initialized = true;
|
||||||
|
} else if (device->flags.visited) {
|
||||||
|
goto ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = acpi_scan_attach_handler(device);
|
ret = acpi_scan_attach_handler(device);
|
||||||
|
@ -1866,10 +1858,10 @@ static void acpi_bus_attach(struct acpi_device *device)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ret > 0 || !device->pnp.type.platform_id)
|
if (device->pnp.type.platform_id)
|
||||||
acpi_device_set_enumerated(device);
|
|
||||||
else
|
|
||||||
acpi_default_enumeration(device);
|
acpi_default_enumeration(device);
|
||||||
|
else
|
||||||
|
acpi_device_set_enumerated(device);
|
||||||
|
|
||||||
ok:
|
ok:
|
||||||
list_for_each_entry(child, &device->children, node)
|
list_for_each_entry(child, &device->children, node)
|
||||||
|
|
|
@ -921,7 +921,7 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
|
||||||
static ssize_t force_remove_show(struct kobject *kobj,
|
static ssize_t force_remove_show(struct kobject *kobj,
|
||||||
struct kobj_attribute *attr, char *buf)
|
struct kobj_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return sprintf(buf, "%d\n", !!acpi_force_hot_remove);
|
return sprintf(buf, "%d\n", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t force_remove_store(struct kobject *kobj,
|
static ssize_t force_remove_store(struct kobject *kobj,
|
||||||
|
@ -935,9 +935,10 @@ static ssize_t force_remove_store(struct kobject *kobj,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
lock_device_hotplug();
|
if (val) {
|
||||||
acpi_force_hot_remove = val;
|
pr_err("Enabling force_remove is not supported anymore. Please report to linux-acpi@vger.kernel.org if you depend on this functionality\n");
|
||||||
unlock_device_hotplug();
|
return -EINVAL;
|
||||||
|
}
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,22 +310,6 @@ acpi_parse_entries_array(char *id, unsigned long table_size,
|
||||||
return errs ? -EINVAL : count;
|
return errs ? -EINVAL : count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init
|
|
||||||
acpi_parse_entries(char *id,
|
|
||||||
unsigned long table_size,
|
|
||||||
acpi_tbl_entry_handler handler,
|
|
||||||
struct acpi_table_header *table_header,
|
|
||||||
int entry_id, unsigned int max_entries)
|
|
||||||
{
|
|
||||||
struct acpi_subtable_proc proc = {
|
|
||||||
.id = entry_id,
|
|
||||||
.handler = handler,
|
|
||||||
};
|
|
||||||
|
|
||||||
return acpi_parse_entries_array(id, table_size, table_header,
|
|
||||||
&proc, 1, max_entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
int __init
|
int __init
|
||||||
acpi_table_parse_entries_array(char *id,
|
acpi_table_parse_entries_array(char *id,
|
||||||
unsigned long table_size,
|
unsigned long table_size,
|
||||||
|
|
|
@ -233,10 +233,6 @@ int acpi_numa_init (void);
|
||||||
|
|
||||||
int acpi_table_init (void);
|
int acpi_table_init (void);
|
||||||
int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
|
int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
|
||||||
int __init acpi_parse_entries(char *id, unsigned long table_size,
|
|
||||||
acpi_tbl_entry_handler handler,
|
|
||||||
struct acpi_table_header *table_header,
|
|
||||||
int entry_id, unsigned int max_entries);
|
|
||||||
int __init acpi_table_parse_entries(char *id, unsigned long table_size,
|
int __init acpi_table_parse_entries(char *id, unsigned long table_size,
|
||||||
int entry_id,
|
int entry_id,
|
||||||
acpi_tbl_entry_handler handler,
|
acpi_tbl_entry_handler handler,
|
||||||
|
|
Loading…
Reference in New Issue