|
@@ -47,6 +47,9 @@ ACPI_MODULE_NAME("processor_throttling");
|
|
static int acpi_processor_get_throttling(struct acpi_processor *pr);
|
|
static int acpi_processor_get_throttling(struct acpi_processor *pr);
|
|
int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
|
|
int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * _TPC - Throttling Present Capabilities
|
|
|
|
+ */
|
|
static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
|
|
static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
|
|
{
|
|
{
|
|
acpi_status status = 0;
|
|
acpi_status status = 0;
|
|
@@ -55,8 +58,10 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
|
|
if (!pr)
|
|
if (!pr)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
status = acpi_evaluate_integer(pr->handle, "_TPC", NULL, &tpc);
|
|
status = acpi_evaluate_integer(pr->handle, "_TPC", NULL, &tpc);
|
|
- if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
|
- ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TPC"));
|
|
|
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
|
+ if (status != AE_NOT_FOUND) {
|
|
|
|
+ ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TPC"));
|
|
|
|
+ }
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
pr->throttling_platform_limit = (int)tpc;
|
|
pr->throttling_platform_limit = (int)tpc;
|
|
@@ -68,9 +73,9 @@ int acpi_processor_tstate_has_changed(struct acpi_processor *pr)
|
|
return acpi_processor_get_platform_limit(pr);
|
|
return acpi_processor_get_platform_limit(pr);
|
|
}
|
|
}
|
|
|
|
|
|
-/* --------------------------------------------------------------------------
|
|
|
|
- _PTC, _TSS, _TSD support
|
|
|
|
- -------------------------------------------------------------------------- */
|
|
|
|
|
|
+/*
|
|
|
|
+ * _PTC - Processor Throttling Control (and status) register location
|
|
|
|
+ */
|
|
static int acpi_processor_get_throttling_control(struct acpi_processor *pr)
|
|
static int acpi_processor_get_throttling_control(struct acpi_processor *pr)
|
|
{
|
|
{
|
|
int result = 0;
|
|
int result = 0;
|
|
@@ -81,7 +86,9 @@ static int acpi_processor_get_throttling_control(struct acpi_processor *pr)
|
|
|
|
|
|
status = acpi_evaluate_object(pr->handle, "_PTC", NULL, &buffer);
|
|
status = acpi_evaluate_object(pr->handle, "_PTC", NULL, &buffer);
|
|
if (ACPI_FAILURE(status)) {
|
|
if (ACPI_FAILURE(status)) {
|
|
- ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PTC"));
|
|
|
|
|
|
+ if (status != AE_NOT_FOUND) {
|
|
|
|
+ ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PTC"));
|
|
|
|
+ }
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -132,6 +139,10 @@ static int acpi_processor_get_throttling_control(struct acpi_processor *pr)
|
|
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * _TSS - Throttling Supported States
|
|
|
|
+ */
|
|
static int acpi_processor_get_throttling_states(struct acpi_processor *pr)
|
|
static int acpi_processor_get_throttling_states(struct acpi_processor *pr)
|
|
{
|
|
{
|
|
int result = 0;
|
|
int result = 0;
|
|
@@ -144,7 +155,9 @@ static int acpi_processor_get_throttling_states(struct acpi_processor *pr)
|
|
|
|
|
|
status = acpi_evaluate_object(pr->handle, "_TSS", NULL, &buffer);
|
|
status = acpi_evaluate_object(pr->handle, "_TSS", NULL, &buffer);
|
|
if (ACPI_FAILURE(status)) {
|
|
if (ACPI_FAILURE(status)) {
|
|
- ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TSS"));
|
|
|
|
|
|
+ if (status != AE_NOT_FOUND) {
|
|
|
|
+ ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TSS"));
|
|
|
|
+ }
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -201,6 +214,10 @@ static int acpi_processor_get_throttling_states(struct acpi_processor *pr)
|
|
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * _TSD - T-State Dependencies
|
|
|
|
+ */
|
|
static int acpi_processor_get_tsd(struct acpi_processor *pr)
|
|
static int acpi_processor_get_tsd(struct acpi_processor *pr)
|
|
{
|
|
{
|
|
int result = 0;
|
|
int result = 0;
|
|
@@ -213,6 +230,9 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr)
|
|
|
|
|
|
status = acpi_evaluate_object(pr->handle, "_TSD", NULL, &buffer);
|
|
status = acpi_evaluate_object(pr->handle, "_TSD", NULL, &buffer);
|
|
if (ACPI_FAILURE(status)) {
|
|
if (ACPI_FAILURE(status)) {
|
|
|
|
+ if (status != AE_NOT_FOUND) {
|
|
|
|
+ ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TSD"));
|
|
|
|
+ }
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -525,9 +545,6 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
|
int result = 0;
|
|
int result = 0;
|
|
int step = 0;
|
|
int step = 0;
|
|
int i = 0;
|
|
int i = 0;
|
|
- int no_ptc = 0;
|
|
|
|
- int no_tss = 0;
|
|
|
|
- int no_tsd = 0;
|
|
|
|
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
"pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n",
|
|
"pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n",
|
|
@@ -538,12 +555,14 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
|
if (!pr)
|
|
if (!pr)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- /* TBD: Support ACPI 2.0 objects */
|
|
|
|
- no_ptc = acpi_processor_get_throttling_control(pr);
|
|
|
|
- no_tss = acpi_processor_get_throttling_states(pr);
|
|
|
|
- no_tsd = acpi_processor_get_tsd(pr);
|
|
|
|
-
|
|
|
|
- if (no_ptc || no_tss) {
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Evaluate _PTC, _TSS and _TPC
|
|
|
|
+ * They must all be present or none of them can be used.
|
|
|
|
+ */
|
|
|
|
+ if (acpi_processor_get_throttling_control(pr) ||
|
|
|
|
+ acpi_processor_get_throttling_states(pr) ||
|
|
|
|
+ acpi_processor_get_platform_limit(pr))
|
|
|
|
+ {
|
|
pr->throttling.acpi_processor_get_throttling =
|
|
pr->throttling.acpi_processor_get_throttling =
|
|
&acpi_processor_get_throttling_fadt;
|
|
&acpi_processor_get_throttling_fadt;
|
|
pr->throttling.acpi_processor_set_throttling =
|
|
pr->throttling.acpi_processor_set_throttling =
|
|
@@ -555,6 +574,8 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
|
&acpi_processor_set_throttling_ptc;
|
|
&acpi_processor_set_throttling_ptc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ acpi_processor_get_tsd(pr);
|
|
|
|
+
|
|
if (!pr->throttling.address) {
|
|
if (!pr->throttling.address) {
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No throttling register\n"));
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No throttling register\n"));
|
|
return 0;
|
|
return 0;
|