Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp4154115pxv; Mon, 19 Jul 2021 18:39:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyUW9H9bnil29pUn+CpXPy625z5fj4vj/EH41h2wROWrv0llr6krdJQbabMv6PTD5pNqk/Y X-Received: by 2002:a92:6902:: with SMTP id e2mr19471024ilc.275.1626745153023; Mon, 19 Jul 2021 18:39:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626745153; cv=none; d=google.com; s=arc-20160816; b=uN/ijUYL9C5E1PN9GSe5YPEVEkkDLjnYTH0XVz2mlWQ8ARQ6bIVhEIJrKa8y5ZDhNI GGF0M8+IWffBi9duMQ2CvWLSCEUEFz80BeWpgxQiVYi+F04JozKJqeQy7KCyMO5M9lbf 8bqsmhEI2W7itydcuNzs2zu6RXfkURCF24hdqpp5SX1jTy8PS1vaQF4O4be0V1NbE6Pu 1c/Nlfjp17cI14EjPnLJV0KG5rF2e+RGlNb6ZGPnz6qilMbWjmbC5RPdr7lnuI4D1vpv ODOyLjWOkt8s4zogN5nXFMzY0IKXNHJV4k8ryZxU4pGAYsS5ePwSrHsBmhV82WY1e3xL yTSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WYGgVF3P9xiO+UOLzhviiMqMVY489Bg306VbFGnhnPM=; b=pJGUkP5gReYTKlXnuNt6PepHKKIsFffSUKP+ETisqXROCiwmgFB0esp6e8hjUj19Ow N8tPiZK6gAgF/ujJpOQ34ny1h+ypQd4GwjHpHV9YiXgok7VaNspbzjZtFvkUU1tZnVw8 g7qAl+vQJ+VhHuCtfy3P9HGFw9qqlQZo3lkj04F20bJBljgguE4doUHh8rEt/Abp0vQE K/8aHPJEhn11q5x15yEO2kVrWLkZ/gUz5GG8EoxVf9OZ0nNLFyEb9oQQXfOwEub8CEB8 wYM35VyibsnrlnPzmY7F7AsiTcDN8jOXtQbEocVcr0u3trGQ8oPG2omsCw0V1ULcHWli NqmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="uCj/iBjr"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r18si21680536ile.92.2021.07.19.18.39.01; Mon, 19 Jul 2021 18:39:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="uCj/iBjr"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242261AbhGSO4h (ORCPT + 99 others); Mon, 19 Jul 2021 10:56:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:54628 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244322AbhGSOgB (ORCPT ); Mon, 19 Jul 2021 10:36:01 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 942BD6112D; Mon, 19 Jul 2021 15:16:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626707800; bh=IrBPAoFZwjddYZY2UoNcL72MH2hgB2RKDn/JjljfwnM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uCj/iBjr5oO6QUy1CXqjGhiEDY4XfAuhT9MnujVEXL0fLDc/9Ft1dOTUPnuvS/2xH nqWgmWhhTacOk3DwksTvecQka4K3COOd3FUrgB571/96uyTgMAHNZ6M0Bg9X+cUC9l FRTciF2Ni/MqH+RLlkS7kzXfc3C2GiWsOLNF0uNI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Prike Liang , Alex Deucher , Mario Limonciello , "Rafael J. Wysocki" , Sasha Levin Subject: [PATCH 4.14 061/315] ACPI: processor idle: Fix up C-state latency if not ordered Date: Mon, 19 Jul 2021 16:49:10 +0200 Message-Id: <20210719144944.867991940@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144942.861561397@linuxfoundation.org> References: <20210719144942.861561397@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mario Limonciello [ Upstream commit 65ea8f2c6e230bdf71fed0137cf9e9d1b307db32 ] Generally, the C-state latency is provided by the _CST method or FADT, but some OEM platforms using AMD Picasso, Renoir, Van Gogh, and Cezanne set the C2 latency greater than C3's which causes the C2 state to be skipped. That will block the core entering PC6, which prevents S0ix working properly on Linux systems. In other operating systems, the latency values are not validated and this does not cause problems by skipping states. To avoid this issue on Linux, detect when latencies are not an arithmetic progression and sort them. Link: https://gitlab.freedesktop.org/agd5f/linux/-/commit/026d186e4592c1ee9c1cb44295912d0294508725 Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1230#note_712174 Suggested-by: Prike Liang Suggested-by: Alex Deucher Signed-off-by: Mario Limonciello [ rjw: Subject and changelog edits ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/processor_idle.c | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index d50a7b6ccddd..590eeca2419f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -29,6 +29,7 @@ #include #include #include /* need_resched() */ +#include #include #include #include @@ -540,10 +541,37 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, return; } +static int acpi_cst_latency_cmp(const void *a, const void *b) +{ + const struct acpi_processor_cx *x = a, *y = b; + + if (!(x->valid && y->valid)) + return 0; + if (x->latency > y->latency) + return 1; + if (x->latency < y->latency) + return -1; + return 0; +} +static void acpi_cst_latency_swap(void *a, void *b, int n) +{ + struct acpi_processor_cx *x = a, *y = b; + u32 tmp; + + if (!(x->valid && y->valid)) + return; + tmp = x->latency; + x->latency = y->latency; + y->latency = tmp; +} + static int acpi_processor_power_verify(struct acpi_processor *pr) { unsigned int i; unsigned int working = 0; + unsigned int last_latency = 0; + unsigned int last_type = 0; + bool buggy_latency = false; pr->power.timer_broadcast_on_state = INT_MAX; @@ -567,12 +595,24 @@ static int acpi_processor_power_verify(struct acpi_processor *pr) } if (!cx->valid) continue; + if (cx->type >= last_type && cx->latency < last_latency) + buggy_latency = true; + last_latency = cx->latency; + last_type = cx->type; lapic_timer_check_state(i, pr, cx); tsc_check_state(cx->type); working++; } + if (buggy_latency) { + pr_notice("FW issue: working around C-state latencies out of order\n"); + sort(&pr->power.states[1], max_cstate, + sizeof(struct acpi_processor_cx), + acpi_cst_latency_cmp, + acpi_cst_latency_swap); + } + lapic_timer_propagate_broadcast(pr); return (working); -- 2.30.2