Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 511851c8 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Greg Kroah-Hartman
Browse files

ACPI: processor: perflib: Use the "no limit" frequency QoS



commit c02d5feb6e2f60affc6ba8606d8d614c071e2ba6 upstream.

When _PPC returns 0, it means that the CPU frequency is not limited by
the platform firmware, so make acpi_processor_get_platform_limit()
update the frequency QoS request used by it to "no limit" in that case.

This addresses a problem with limiting CPU frequency artificially on
some systems after CPU offline/online to the frequency that corresponds
to the first entry in the _PSS return package.

Reported-by: default avatarPratyush Yadav <ptyadav@amazon.de>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarPratyush Yadav <ptyadav@amazon.de>
Tested-by: default avatarPratyush Yadav <ptyadav@amazon.de>
Tested-by: default avatarHagar Hemdan <hagarhem@amazon.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 81cd6cee
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
{
	acpi_status status = 0;
	unsigned long long ppc = 0;
	s32 qos_value;
	int index;
	int ret;

	if (!pr)
@@ -75,17 +77,27 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
		return -ENODEV;
	}

	index = ppc;

	pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id,
		       (int)ppc, ppc ? "" : "not");
		 index, index ? "is" : "is not");

	pr->performance_platform_limit = (int)ppc;
	pr->performance_platform_limit = index;

	if (ppc >= pr->performance->state_count ||
	    unlikely(!freq_qos_request_active(&pr->perflib_req)))
		return 0;

	ret = freq_qos_update_request(&pr->perflib_req,
			pr->performance->states[ppc].core_frequency * 1000);
	/*
	 * If _PPC returns 0, it means that all of the available states can be
	 * used ("no limit").
	 */
	if (index == 0)
		qos_value = FREQ_QOS_MAX_DEFAULT_VALUE;
	else
		qos_value = pr->performance->states[index].core_frequency * 1000;

	ret = freq_qos_update_request(&pr->perflib_req, qos_value);
	if (ret < 0) {
		pr_warn("Failed to update perflib freq constraint: CPU%d (%d)\n",
			pr->id, ret);