|
25 | 25 | #define ACPI_PROCESSOR_AGGREGATOR_CLASS "acpi_pad"
|
26 | 26 | #define ACPI_PROCESSOR_AGGREGATOR_DEVICE_NAME "Processor Aggregator"
|
27 | 27 | #define ACPI_PROCESSOR_AGGREGATOR_NOTIFY 0x80
|
| 28 | + |
| 29 | +#define ACPI_PROCESSOR_AGGREGATOR_STATUS_SUCCESS 0 |
| 30 | +#define ACPI_PROCESSOR_AGGREGATOR_STATUS_NO_ACTION 1 |
| 31 | + |
28 | 32 | static DEFINE_MUTEX(isolated_cpus_lock);
|
29 | 33 | static DEFINE_MUTEX(round_robin_lock);
|
30 | 34 |
|
@@ -382,16 +386,23 @@ static void acpi_pad_handle_notify(acpi_handle handle)
|
382 | 386 | .length = 4,
|
383 | 387 | .pointer = (void *)&idle_cpus,
|
384 | 388 | };
|
| 389 | + u32 status; |
385 | 390 |
|
386 | 391 | mutex_lock(&isolated_cpus_lock);
|
387 | 392 | num_cpus = acpi_pad_pur(handle);
|
388 | 393 | if (num_cpus < 0) {
|
389 |
| - mutex_unlock(&isolated_cpus_lock); |
390 |
| - return; |
| 394 | + /* The ACPI specification says that if no action was performed when |
| 395 | + * processing the _PUR object, _OST should still be evaluated, albeit |
| 396 | + * with a different status code. |
| 397 | + */ |
| 398 | + status = ACPI_PROCESSOR_AGGREGATOR_STATUS_NO_ACTION; |
| 399 | + } else { |
| 400 | + status = ACPI_PROCESSOR_AGGREGATOR_STATUS_SUCCESS; |
| 401 | + acpi_pad_idle_cpus(num_cpus); |
391 | 402 | }
|
392 |
| - acpi_pad_idle_cpus(num_cpus); |
| 403 | + |
393 | 404 | idle_cpus = acpi_pad_idle_cpus_num();
|
394 |
| - acpi_evaluate_ost(handle, ACPI_PROCESSOR_AGGREGATOR_NOTIFY, 0, ¶m); |
| 405 | + acpi_evaluate_ost(handle, ACPI_PROCESSOR_AGGREGATOR_NOTIFY, status, ¶m); |
395 | 406 | mutex_unlock(&isolated_cpus_lock);
|
396 | 407 | }
|
397 | 408 |
|
|
0 commit comments