aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/processor_idle.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2019-12-13 09:55:42 +0100
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2019-12-27 11:02:07 +0100
commit77fb4e0a559a960eb36d0b2c50c781c5492577eb (patch)
treef257bafba2b403de7bf7e0070b256e76f7f2481a /drivers/acpi/processor_idle.c
parentACPI: processor: Make ACPI_PROCESSOR_CSTATE depend on ACPI_PROCESSOR (diff)
downloadlinux-dev-77fb4e0a559a960eb36d0b2c50c781c5492577eb.tar.xz
linux-dev-77fb4e0a559a960eb36d0b2c50c781c5492577eb.zip
ACPI: processor: Export acpi_processor_evaluate_cst()
The intel_idle driver will be modified to use ACPI _CST subsequently and it will need to call acpi_processor_evaluate_cst(), so move that function to acpi_processor.c so that it is always present (which is required by intel_idle) and export it to modules to allow the ACPI processor driver (which is modular) to call it. No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/processor_idle.c')
-rw-r--r--drivers/acpi/processor_idle.c142
1 files changed, 0 insertions, 142 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 7c2fe3b2ec31..dcc289e30166 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -297,148 +297,6 @@ static int acpi_processor_get_power_info_default(struct acpi_processor *pr)
return 0;
}
-static int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,
- struct acpi_processor_power *info)
-{
- struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
- union acpi_object *cst;
- acpi_status status;
- u64 count;
- int last_index = 0;
- int i, ret = 0;
-
- status = acpi_evaluate_object(handle, "_CST", NULL, &buffer);
- if (ACPI_FAILURE(status)) {
- acpi_handle_debug(handle, "No _CST\n");
- return -ENODEV;
- }
-
- cst = buffer.pointer;
-
- /* There must be at least 2 elements. */
- if (!cst || cst->type != ACPI_TYPE_PACKAGE || cst->package.count < 2) {
- acpi_handle_warn(handle, "Invalid _CST output\n");
- ret = -EFAULT;
- goto end;
- }
-
- count = cst->package.elements[0].integer.value;
-
- /* Validate the number of C-states. */
- if (count < 1 || count != cst->package.count - 1) {
- acpi_handle_warn(handle, "Inconsistent _CST data\n");
- ret = -EFAULT;
- goto end;
- }
-
- for (i = 1; i <= count; i++) {
- union acpi_object *element;
- union acpi_object *obj;
- struct acpi_power_register *reg;
- struct acpi_processor_cx cx;
-
- /*
- * If there is not enough space for all C-states, skip the
- * excess ones and log a warning.
- */
- if (last_index >= ACPI_PROCESSOR_MAX_POWER - 1) {
- acpi_handle_warn(handle,
- "No room for more idle states (limit: %d)\n",
- ACPI_PROCESSOR_MAX_POWER - 1);
- break;
- }
-
- memset(&cx, 0, sizeof(cx));
-
- element = &cst->package.elements[i];
- if (element->type != ACPI_TYPE_PACKAGE)
- continue;
-
- if (element->package.count != 4)
- continue;
-
- obj = &element->package.elements[0];
-
- if (obj->type != ACPI_TYPE_BUFFER)
- continue;
-
- reg = (struct acpi_power_register *)obj->buffer.pointer;
-
- obj = &element->package.elements[1];
- if (obj->type != ACPI_TYPE_INTEGER)
- continue;
-
- cx.type = obj->integer.value;
- /*
- * There are known cases in which the _CST output does not
- * contain C1, so if the type of the first state found is not
- * C1, leave an empty slot for C1 to be filled in later.
- */
- if (i == 1 && cx.type != ACPI_STATE_C1)
- last_index = 1;
-
- cx.address = reg->address;
- cx.index = last_index + 1;
-
- if (reg->space_id == ACPI_ADR_SPACE_FIXED_HARDWARE) {
- if (!acpi_processor_ffh_cstate_probe(cpu, &cx, reg)) {
- /*
- * In the majority of cases _CST describes C1 as
- * a FIXED_HARDWARE C-state, but if the command
- * line forbids using MWAIT, use CSTATE_HALT for
- * C1 regardless.
- */
- if (cx.type == ACPI_STATE_C1 &&
- boot_option_idle_override == IDLE_NOMWAIT) {
- cx.entry_method = ACPI_CSTATE_HALT;
- snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
- } else {
- cx.entry_method = ACPI_CSTATE_FFH;
- }
- } else if (cx.type == ACPI_STATE_C1) {
- /*
- * In the special case of C1, FIXED_HARDWARE can
- * be handled by executing the HLT instruction.
- */
- cx.entry_method = ACPI_CSTATE_HALT;
- snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
- } else {
- continue;
- }
- } else if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
- cx.entry_method = ACPI_CSTATE_SYSTEMIO;
- snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI IOPORT 0x%x",
- cx.address);
- } else {
- continue;
- }
-
- if (cx.type == ACPI_STATE_C1)
- cx.valid = 1;
-
- obj = &element->package.elements[2];
- if (obj->type != ACPI_TYPE_INTEGER)
- continue;
-
- cx.latency = obj->integer.value;
-
- obj = &element->package.elements[3];
- if (obj->type != ACPI_TYPE_INTEGER)
- continue;
-
- memcpy(&info->states[++last_index], &cx, sizeof(cx));
- }
-
- acpi_handle_info(handle, "Found %d idle states\n", last_index);
-
- info->count = last_index;
-
- end:
- kfree(buffer.pointer);
-
- return ret;
-}
-
static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
{
int ret;