History

Merge tag 'pm+acpi-3.17-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI and power management fixes from Rafael Wysocki: "These are regression fixes (ACPI hotplug, cpufreq, hibernation, ACPI LPSS driver), fixes for stuff that never worked correctly (ACPI GPIO support in some cases and a wrong sign of an error code in the ACPI core in one place), and one blacklist item for ACPI backlight handling. Specifics: - Revert of a recent hibernation core commit that introduced a NULL pointer dereference during resume for at least one user (Rafael J Wysocki). - Fix for the ACPI LPSS (Low-Power Subsystem) driver to disable asynchronous PM callback execution for LPSS devices during system suspend/resume (introduced in 3.16) which turns out to break ordering expectations on some systems. From Fu Zhonghui. - cpufreq core fix related to the handling of sysfs nodes during system suspend/resume that has been broken for intel_pstate since 3.15 from Lan Tianyu. - Restore the generation of "online" uevents for ACPI container devices that was removed in 3.14, but some user space utilities turn out to need them (Rafael J Wysocki). - The cpufreq core fails to release a lock in an error code path after changes made in 3.14. Fix from Prarit Bhargava. - ACPICA and ACPI/GPIO fixes to make the handling of ACPI GPIO operation regions (which means AML using GPIOs) work correctly in all cases from Bob Moore and Srinivas Pandruvada. - Fix for a wrong sign of the ACPI core's create_modalias() return value in case of an error from Mika Westerberg. - ACPI backlight blacklist entry for ThinkPad X201s from Aaron Lu" * tag 'pm+acpi-3.17-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: Revert "PM / Hibernate: Iterate over set bits instead of PFNs in swsusp_free()" gpio / ACPI: Use pin index and bit length ACPICA: Update to GPIO region handler interface. ACPI / platform / LPSS: disable async suspend/resume of LPSS devices cpufreq: release policy->rwsem on error cpufreq: fix cpufreq suspend/resume for intel_pstate ACPI / scan: Correct error return value of create_modalias() ACPI / video: disable native backlight for ThinkPad X201s ACPI / hotplug: Generate online uevents for ACPI containers

Linus Torvalds committed 12 years ago

Commit f4cb7072 parents 12df9f3 381e63d14 files · +150 −58Browse files

Unified · Split

14 files
  1. drivers/acpi/acpi_lpss.c +0 −1
  2. drivers/acpi/acpica/aclocal.h +1 −0
  3. drivers/acpi/acpica/acobject.h +1 −0
  4. drivers/acpi/acpica/dsfield.c +2 −0
  5. drivers/acpi/acpica/evregion.c +31 −16
  6. drivers/acpi/acpica/exfield.c +67 −0
  7. drivers/acpi/acpica/exprep.c +2 −0
  8. drivers/acpi/container.c +8 −0
  9. drivers/acpi/scan.c +4 −1
  10. drivers/acpi/video.c +8 −0
  11. drivers/cpufreq/cpufreq.c +6 −4
  12. drivers/gpio/gpiolib-acpi.c +4 −1
  13. include/acpi/acpi_bus.h +1 −0
  14. kernel/power/snapshot.c +15 −35
drivers/acpi/acpi_lpss.c+0−1
@@ -419,7 +419,6 @@ static int acpi_lpss_create_device(struct acpi_device *adev, · 418 unmodified lines
419419 adev->driver_data = pdata;
420420 pdev = acpi_create_platform_device(adev);
421421 if (!IS_ERR_OR_NULL(pdev)) {
422− device_enable_async_suspend(&pdev->dev);
423422 return 1;
424423 }
425424
drivers/acpi/acpica/aclocal.h+1−0
@@ -254,6 +254,7 @@ struct acpi_create_field_info { · 253 unmodified lines
254254 u32 field_bit_position;
255255 u32 field_bit_length;
256256 u16 resource_length;
257+ u16 pin_number_index;
257258 u8 field_flags;
258259 u8 attribute;
259260 u8 field_type;
drivers/acpi/acpica/acobject.h+1−0
@@ -264,6 +264,7 @@ struct acpi_object_region_field { · 263 unmodified lines
264264 ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length;
265265 union acpi_operand_object *region_obj; /* Containing op_region object */
266266 u8 *resource_buffer; /* resource_template for serial regions/fields */
267+ u16 pin_number_index; /* Index relative to previous Connection/Template */
267268 };
268269
269270 struct acpi_object_bank_field {
drivers/acpi/acpica/dsfield.c+2−0
@@ -360,6 +360,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, · 359 unmodified lines
360360 */
361361 info->resource_buffer = NULL;
362362 info->connection_node = NULL;
363+ info->pin_number_index = 0;
363364
364365 /*
365366 * A Connection() is either an actual resource descriptor (buffer)
@@ -437,6 +438,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, · 71 unmodified lines
437438 }
438439
439440 info->field_bit_position += info->field_bit_length;
441+ info->pin_number_index++; /* Index relative to previous Connection() */
440442 break;
441443
442444 default:
drivers/acpi/acpica/evregion.c+31−16
@@ -142,6 +142,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, · 141 unmodified lines
142142 union acpi_operand_object *region_obj2;
143143 void *region_context = NULL;
144144 struct acpi_connection_info *context;
145+ acpi_physical_address address;
145146
146147 ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
147148
@@ -231,25 +232,23 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, · 83 unmodified lines
231232 /* We have everything we need, we can invoke the address space handler */
232233
233234 handler = handler_desc->address_space.handler;
234−
235− ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
236− "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
237− &region_obj->region.handler->address_space, handler,
238− ACPI_FORMAT_NATIVE_UINT(region_obj->region.address +
239− region_offset),
240− acpi_ut_get_region_name(region_obj->region.
241− space_id)));
235+ address = (region_obj->region.address + region_offset);
242236
243237 /*
244238 * Special handling for generic_serial_bus and general_purpose_io:
245239 * There are three extra parameters that must be passed to the
246240 * handler via the context:
247− * 1) Connection buffer, a resource template from Connection() op.
248− * 2) Length of the above buffer.
249− * 3) Actual access length from the access_as() op.
241+ * 1) Connection buffer, a resource template from Connection() op
242+ * 2) Length of the above buffer
243+ * 3) Actual access length from the access_as() op
244+ *
245+ * In addition, for general_purpose_io, the Address and bit_width fields
246+ * are defined as follows:
247+ * 1) Address is the pin number index of the field (bit offset from
248+ * the previous Connection)
249+ * 2) bit_width is the actual bit length of the field (number of pins)
250250 */
251− if (((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) ||
252− (region_obj->region.space_id == ACPI_ADR_SPACE_GPIO)) &&
251+ if ((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) &&
253252 context && field_obj) {
254253
255254 /* Get the Connection (resource_template) buffer */
@@ -258,6 +257,24 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, · 2 unmodified lines
258257 context->length = field_obj->field.resource_length;
259258 context->access_length = field_obj->field.access_length;
260259 }
260+ if ((region_obj->region.space_id == ACPI_ADR_SPACE_GPIO) &&
261+ context && field_obj) {
262+
263+ /* Get the Connection (resource_template) buffer */
264+
265+ context->connection = field_obj->field.resource_buffer;
266+ context->length = field_obj->field.resource_length;
267+ context->access_length = field_obj->field.access_length;
268+ address = field_obj->field.pin_number_index;
269+ bit_width = field_obj->field.bit_length;
270+ }
271+
272+ ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
273+ "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
274+ &region_obj->region.handler->address_space, handler,
275+ ACPI_FORMAT_NATIVE_UINT(address),
276+ acpi_ut_get_region_name(region_obj->region.
277+ space_id)));
261278
262279 if (!(handler_desc->address_space.handler_flags &
263280 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
@@ -271,9 +288,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, · 7 unmodified lines
271288
272289 /* Call the handler */
273290
274− status = handler(function,
275− (region_obj->region.address + region_offset),
276− bit_width, value, context,
291+ status = handler(function, address, bit_width, value, context,
277292 region_obj2->extra.region_context);
278293
279294 if (ACPI_FAILURE(status)) {
drivers/acpi/acpica/exfield.c+67−0
@@ -253,6 +253,37 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state, · 252 unmodified lines
253253 buffer = &buffer_desc->integer.value;
254254 }
255255
256+ if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
257+ (obj_desc->field.region_obj->region.space_id ==
258+ ACPI_ADR_SPACE_GPIO)) {
259+ /*
260+ * For GPIO (general_purpose_io), the Address will be the bit offset
261+ * from the previous Connection() operator, making it effectively a
262+ * pin number index. The bit_length is the length of the field, which
263+ * is thus the number of pins.
264+ */
265+ ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
266+ "GPIO FieldRead [FROM]: Pin %u Bits %u\n",
267+ obj_desc->field.pin_number_index,
268+ obj_desc->field.bit_length));
269+
270+ /* Lock entire transaction if requested */
271+
272+ acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags);
273+
274+ /* Perform the write */
275+
276+ status = acpi_ex_access_region(obj_desc, 0,
277+ (u64 *)buffer, ACPI_READ);
278+ acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
279+ if (ACPI_FAILURE(status)) {
280+ acpi_ut_remove_reference(buffer_desc);
281+ } else {
282+ *ret_buffer_desc = buffer_desc;
283+ }
284+ return_ACPI_STATUS(status);
285+ }
286+
256287 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
257288 "FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n",
258289 obj_desc, obj_desc->common.type, buffer,
@@ -413,6 +444,42 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, · 154 unmodified lines
413444
414445 *result_desc = buffer_desc;
415446 return_ACPI_STATUS(status);
447+ } else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
448+ (obj_desc->field.region_obj->region.space_id ==
449+ ACPI_ADR_SPACE_GPIO)) {
450+ /*
451+ * For GPIO (general_purpose_io), we will bypass the entire field
452+ * mechanism and handoff the bit address and bit width directly to
453+ * the handler. The Address will be the bit offset
454+ * from the previous Connection() operator, making it effectively a
455+ * pin number index. The bit_length is the length of the field, which
456+ * is thus the number of pins.
457+ */
458+ if (source_desc->common.type != ACPI_TYPE_INTEGER) {
459+ return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
460+ }
461+
462+ ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
463+ "GPIO FieldWrite [FROM]: (%s:%X), Val %.8X [TO]: Pin %u Bits %u\n",
464+ acpi_ut_get_type_name(source_desc->common.
465+ type),
466+ source_desc->common.type,
467+ (u32)source_desc->integer.value,
468+ obj_desc->field.pin_number_index,
469+ obj_desc->field.bit_length));
470+
471+ buffer = &source_desc->integer.value;
472+
473+ /* Lock entire transaction if requested */
474+
475+ acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags);
476+
477+ /* Perform the write */
478+
479+ status = acpi_ex_access_region(obj_desc, 0,
480+ (u64 *)buffer, ACPI_WRITE);
481+ acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
482+ return_ACPI_STATUS(status);
416483 }
417484
418485 /* Get a pointer to the data to be written */
drivers/acpi/acpica/exprep.c+2−0
@@ -484,6 +484,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) · 483 unmodified lines
484484 obj_desc->field.resource_length = info->resource_length;
485485 }
486486
487+ obj_desc->field.pin_number_index = info->pin_number_index;
488+
487489 /* Allow full data read from EC address space */
488490
489491 if ((obj_desc->field.region_obj->region.space_id ==
drivers/acpi/container.c+8−0
@@ -99,6 +99,13 @@ static void container_device_detach(struct acpi_device *adev) · 98 unmodified lines
9999 device_unregister(dev);
100100 }
101101
102+static void container_device_online(struct acpi_device *adev)
103+{
104+ struct device *dev = acpi_driver_data(adev);
105+
106+ kobject_uevent(&dev->kobj, KOBJ_ONLINE);
107+}
108+
102109 static struct acpi_scan_handler container_handler = {
103110 .ids = container_device_ids,
104111 .attach = container_device_attach,
@@ -106,6 +113,7 @@ static struct acpi_scan_handler container_handler = { · 1 unmodified line
106113 .hotplug = {
107114 .enabled = true,
108115 .demand_offline = true,
116+ .notify_online = container_device_online,
109117 },
110118 };
111119
drivers/acpi/scan.c+4−1
@@ -130,7 +130,7 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, · 129 unmodified lines
130130 list_for_each_entry(id, &acpi_dev->pnp.ids, list) {
131131 count = snprintf(&modalias[len], size, "%s:", id->id);
132132 if (count < 0)
133− return EINVAL;
133+ return -EINVAL;
134134 if (count >= size)
135135 return -ENOMEM;
136136 len += count;
@@ -2189,6 +2189,9 @@ static void acpi_bus_attach(struct acpi_device *device) · 2052 unmodified lines
21892189 ok:
21902190 list_for_each_entry(child, &device->children, node)
21912191 acpi_bus_attach(child);
2192+
2193+ if (device->handler && device->handler->hotplug.notify_online)
2194+ device->handler->hotplug.notify_online(device);
21922195 }
21932196
21942197 /**
drivers/acpi/video.c+8−0
@@ -750,6 +750,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { · 749 unmodified lines
750750 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
751751 },
752752 },
753+ {
754+ .callback = video_disable_native_backlight,
755+ .ident = "ThinkPad X201s",
756+ .matches = {
757+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
758+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
759+ },
760+ },
753761
754762 /* The native backlight controls do not work on some older machines */
755763 {
drivers/cpufreq/cpufreq.c+6−4
@@ -1289,6 +1289,8 @@ err_get_freq: · 1288 unmodified lines
12891289 per_cpu(cpufreq_cpu_data, j) = NULL;
12901290 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
12911291
1292+ up_write(&policy->rwsem);
1293+
12921294 if (cpufreq_driver->exit)
12931295 cpufreq_driver->exit(policy);
12941296 err_set_policy_cpu:
@@ -1656,6 +1658,8 @@ void cpufreq_suspend(void) · 361 unmodified lines
16561658 if (!cpufreq_driver)
16571659 return;
16581660
1661+ cpufreq_suspended = true;
1662+
16591663 if (!has_target())
16601664 return;
16611665
@@ -1670,8 +1674,6 @@ void cpufreq_suspend(void) · 8 unmodified lines
16701674 pr_err("%s: Failed to suspend driver: %p\n", __func__,
16711675 policy);
16721676 }
1673−
1674− cpufreq_suspended = true;
16751677 }
16761678
16771679 /**
@@ -1687,13 +1689,13 @@ void cpufreq_resume(void) · 9 unmodified lines
16871689 if (!cpufreq_driver)
16881690 return;
16891691
1692+ cpufreq_suspended = false;
1693+
16901694 if (!has_target())
16911695 return;
16921696
16931697 pr_debug("%s: Resuming Governors\n", __func__);
16941698
1695− cpufreq_suspended = false;
1696−
16971699 list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
16981700 if (cpufreq_driver->resume && cpufreq_driver->resume(policy))
16991701 pr_err("%s: Failed to resume driver: %p\n", __func__,
drivers/gpio/gpiolib-acpi.c+4−1
@@ -377,8 +377,10 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, · 376 unmodified lines
377377 struct gpio_chip *chip = achip->chip;
378378 struct acpi_resource_gpio *agpio;
379379 struct acpi_resource *ares;
380+ int pin_index = (int)address;
380381 acpi_status status;
381382 bool pull_up;
383+ int length;
382384 int i;
383385
384386 status = acpi_buffer_to_resource(achip->conn_info.connection,
@@ -400,7 +402,8 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, · 15 unmodified lines
400402 return AE_BAD_PARAMETER;
401403 }
402404
403− for (i = 0; i < agpio->pin_table_length; i++) {
405+ length = min(agpio->pin_table_length, (u16)(pin_index + bits));
406+ for (i = pin_index; i < length; ++i) {
404407 unsigned pin = agpio->pin_table[i];
405408 struct acpi_gpio_connection *conn;
406409 struct gpio_desc *desc;
include/acpi/acpi_bus.h+1−0
@@ -118,6 +118,7 @@ struct acpi_device; · 117 unmodified lines
118118 struct acpi_hotplug_profile {
119119 struct kobject kobj;
120120 int (*scan_dependent)(struct acpi_device *adev);
121+ void (*notify_online)(struct acpi_device *adev);
121122 bool enabled:1;
122123 bool demand_offline:1;
123124 };
kernel/power/snapshot.c+15−35
@@ -725,14 +725,6 @@ static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) · 724 unmodified lines
725725 clear_bit(bit, addr);
726726 }
727727
728−static void memory_bm_clear_current(struct memory_bitmap *bm)
729−{
730− int bit;
731−
732− bit = max(bm->cur.node_bit - 1, 0);
733− clear_bit(bit, bm->cur.node->data);
734−}
735−
736728 static int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn)
737729 {
738730 void *addr;
@@ -1341,35 +1333,23 @@ static struct memory_bitmap copy_bm; · 602 unmodified lines
13411333
13421334 void swsusp_free(void)
13431335 {
1344− unsigned long fb_pfn, fr_pfn;
1345−
1346− memory_bm_position_reset(forbidden_pages_map);
1347− memory_bm_position_reset(free_pages_map);
1348−
1349−loop:
1350− fr_pfn = memory_bm_next_pfn(free_pages_map);
1351− fb_pfn = memory_bm_next_pfn(forbidden_pages_map);
1352−
1353− /*
1354− * Find the next bit set in both bitmaps. This is guaranteed to
1355− * terminate when fb_pfn == fr_pfn == BM_END_OF_MAP.
1356− */
1357− do {
1358− if (fb_pfn < fr_pfn)
1359− fb_pfn = memory_bm_next_pfn(forbidden_pages_map);
1360− if (fr_pfn < fb_pfn)
1361− fr_pfn = memory_bm_next_pfn(free_pages_map);
1362− } while (fb_pfn != fr_pfn);
1363−
1364− if (fr_pfn != BM_END_OF_MAP && pfn_valid(fr_pfn)) {
1365− struct page *page = pfn_to_page(fr_pfn);
1336+ struct zone *zone;
1337+ unsigned long pfn, max_zone_pfn;
13661338
1367− memory_bm_clear_current(forbidden_pages_map);
1368− memory_bm_clear_current(free_pages_map);
1369− __free_page(page);
1370− goto loop;
1339+ for_each_populated_zone(zone) {
1340+ max_zone_pfn = zone_end_pfn(zone);
1341+ for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
1342+ if (pfn_valid(pfn)) {
1343+ struct page *page = pfn_to_page(pfn);
1344+
1345+ if (swsusp_page_is_forbidden(page) &&
1346+ swsusp_page_is_free(page)) {
1347+ swsusp_unset_page_forbidden(page);
1348+ swsusp_unset_page_free(page);
1349+ __free_page(page);
1350+ }
1351+ }
13711352 }
1372−
13731353 nr_copy_pages = 0;
13741354 nr_meta_pages = 0;
13751355 restore_pblist = NULL;