Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp859665rwb; Thu, 10 Nov 2022 08:13:57 -0800 (PST) X-Google-Smtp-Source: AMsMyM4rW8L+IV8xKYVz8CjPM+sLcpdsgCdDLcoDX8d6AzXZHkRvYRzR38D5/JkrIswHt3iQWC52 X-Received: by 2002:a17:906:5dd8:b0:7ae:5ce3:c6f5 with SMTP id p24-20020a1709065dd800b007ae5ce3c6f5mr20013654ejv.219.1668096837654; Thu, 10 Nov 2022 08:13:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668096837; cv=none; d=google.com; s=arc-20160816; b=BvW3o8wJpthJ04rJQMUJTBwWzNThw/VR9jocXHRIzf8Hft6f7HzFjN2CLTw3bBLugC KLffzC6ePO1JcVIpPN467HcNlSIuZ+kBD4pT1kAmzR6GIah6tqPqbglrG3LJTKNiKfIS 15aTyuZfqMm7puWWJPnmOfJukkkc8BN3Ncy+GBr217FtmsQHllY1pWvauramimTM/BkC R4CB0PVVCWO15f0vvbsSeUlc8sEhllVeKkt2HQSljQxB9tOdQYH8SB4y6IswN8TRRT1r I+iKD5VQsWs3sTjsA6S5GdN6U8as85YngSxH7Y1UEfp2xWiJw0q0DsZu8iwMvwWHkQtQ A4IQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version; bh=5GCcN4ergz49gV4k6gX4iuIWjU767EtX1RSbqmpJ7/k=; b=UXepEwMR9MMWLYcsNtPngNolHlUtQO8fVtTGJ2pWxp8hYEcJrdj449vXjeyZixNO90 REahaoRaqQ7f1bfXmm1k1FNiqstvnfWO71hXnvDU07VxrkfDpXqEAQFmVMRWIMc9WiaS N/xlk+n+37BlV7xv/WOH0jbaQ+dAwcdIS5CyQOj1GOdLCse/YT2C5fAKoWa3d0ANNL9L mmShYEjugcqjaEwsWwaL7UGe1LH2OPTi2gBZay5DmbIxo0cA6H7+xgFJyWcNrPKVDl1L 2mPDRWfr5SLurbI8OKm0zftjJXROfgv2mM+FyvkCeq/KnMA6Lb4ttCeG6ycXUagFVYVs V00Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id rl24-20020a170907217800b007ae8d01144dsi3901649ejb.717.2022.11.10.08.13.31; Thu, 10 Nov 2022 08:13:57 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231733AbiKJPzt (ORCPT + 92 others); Thu, 10 Nov 2022 10:55:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37200 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231732AbiKJPzo (ORCPT ); Thu, 10 Nov 2022 10:55:44 -0500 Received: from mail-qk1-f172.google.com (mail-qk1-f172.google.com [209.85.222.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C7FAE2DA98; Thu, 10 Nov 2022 07:55:43 -0800 (PST) Received: by mail-qk1-f172.google.com with SMTP id x21so1359531qkj.0; Thu, 10 Nov 2022 07:55:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=5GCcN4ergz49gV4k6gX4iuIWjU767EtX1RSbqmpJ7/k=; b=qyItoG5fMIYF9OxwBsR0mZSua90KXQlK5ox8fxOZL264jhrBWa5kpEu6LZK1vge8ZN PPSJaA7i6zX07oG7T0UI9BAlZZ1IceUENBAK8OCf+utrrXm60xiiSq19d7syXs2HbpiM 6q1BWXLvw9jtCsLzBVY0OiR1M+cOBgwsnAF/bs+K+Z8YMkvOfQ5PD/HJn9AVuG+e4lfg cSIVmUIvBiD6GPf21mlRyjuAmQbTDgcRT+0p26RA/3/5W6/qtOkZEdxWefBccoQEmEXj UZXQMfI45osnubeN7dXKJPdcG9hIse3ZVKW5c/FXXmN1oOCFhzdc9+xBOVA1+xVPg2Mb o5jQ== X-Gm-Message-State: ACrzQf2pfmpbqqtOpKXAbb7YcyF+vBjBvMZHyTjqnkIHPerH5w5L6lXr AvRfD7+b628FsWmITP9FOfQMrddmuJEsoWqQmxQ= X-Received: by 2002:a05:620a:1476:b0:6fa:4c67:83ec with SMTP id j22-20020a05620a147600b006fa4c6783ecmr35799979qkl.23.1668095742749; Thu, 10 Nov 2022 07:55:42 -0800 (PST) MIME-Version: 1.0 References: <20221107175705.2207842-1-Perry.Yuan@amd.com> <20221107175705.2207842-2-Perry.Yuan@amd.com> <64836554-7caa-9a3e-3832-a66e87c83bf9@amd.com> In-Reply-To: From: "Rafael J. Wysocki" Date: Thu, 10 Nov 2022 16:55:31 +0100 Message-ID: Subject: Re: [PATCH v3 1/8] ACPI: CPPC: Add AMD pstate energy performance preference cppc control To: "Yuan, Perry" Cc: "Rafael J. Wysocki" , "Limonciello, Mario" , "rafael.j.wysocki@intel.com" , "Huang, Ray" , "viresh.kumar@linaro.org" , "Sharma, Deepak" , "Fontenot, Nathan" , "Deucher, Alexander" , "Huang, Shimmer" , "Du, Xiaojian" , "Meng, Li (Jassmine)" , "linux-pm@vger.kernel.org" , "linux-kernel@vger.kernel.org" Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Nov 10, 2022 at 4:52 PM Yuan, Perry wrote: > > [AMD Official Use Only - General] > > > > > -----Original Message----- > > From: Rafael J. Wysocki > > Sent: Thursday, November 10, 2022 10:50 PM > > To: Limonciello, Mario ; Yuan, Perry > > > > Cc: rafael.j.wysocki@intel.com; Huang, Ray ; > > viresh.kumar@linaro.org; Sharma, Deepak ; > > Fontenot, Nathan ; Deucher, Alexander > > ; Huang, Shimmer > > ; Du, Xiaojian ; Meng, > > Li (Jassmine) ; linux-pm@vger.kernel.org; linux- > > kernel@vger.kernel.org > > Subject: Re: [PATCH v3 1/8] ACPI: CPPC: Add AMD pstate energy > > performance preference cppc control > > > > Caution: This message originated from an External Source. Use proper > > caution when opening attachments, clicking links, or responding. > > > > > > On Mon, Nov 7, 2022 at 7:44 PM Limonciello, Mario > > wrote: > > > > > > On 11/7/2022 11:56, Perry Yuan wrote: > > > > Add the EPP(Energy Performance Preference) support for the AMD SoCs > > > > without the dedicated CPPC MSR, those SoCs need to add this cppc > > > > acpi functions to update EPP values and desired perf value. > > > > > > As far as I can tell this is generic code. Although the reason you're > > > submitting it is for enabling AMD SoCs, the commit message should be > > > worded as such. > > > > > > > > > > > In order to get EPP worked, cppc_get_epp_caps() will query EPP > > > > preference value and cppc_set_epp_perf() will set EPP new value. > > > > Before the EPP works, pstate driver will use cppc_set_auto_epp() to > > > > enable EPP function from firmware firstly. > > > > > > This could more succinctly say: > > > > > > "Add support for setting and querying EPP preferences to the generic > > > CPPC driver. This enables downstream drivers such as amd-pstate to > > > discover and use these values." > > > > > > > > > > > Signed-off-by: Perry Yuan > > > > --- > > > > drivers/acpi/cppc_acpi.c | 126 > > +++++++++++++++++++++++++++++++++++++++ > > > > include/acpi/cppc_acpi.h | 17 ++++++ > > > > 2 files changed, 143 insertions(+) > > > > > > > > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > > > > index 093675b1a1ff..d9c38dee1f48 100644 > > > > --- a/drivers/acpi/cppc_acpi.c > > > > +++ b/drivers/acpi/cppc_acpi.c > > > > @@ -1365,6 +1365,132 @@ int cppc_get_perf_ctrs(int cpunum, struct > > cppc_perf_fb_ctrs *perf_fb_ctrs) > > > > } > > > > EXPORT_SYMBOL_GPL(cppc_get_perf_ctrs); > > > > > > > > +/** > > > > + * cppc_get_epp_caps - Get the energy preference register value. > > > > + * @cpunum: CPU from which to get epp preference level. > > > > + * @perf_caps: Return address. > > > > + * > > > > + * Return: 0 for success, -EIO otherwise. > > > > + */ > > > > +int cppc_get_epp_caps(int cpunum, struct cppc_perf_caps *perf_caps) > > > > +{ > > > > + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum); > > > > + struct cpc_register_resource *energy_perf_reg; > > > > + u64 energy_perf; > > > > + > > > > + if (!cpc_desc) { > > > > + pr_warn("No CPC descriptor for CPU:%d\n", cpunum); > > > > + return -ENODEV; > > > > + } > > > > + > > > > + energy_perf_reg = &cpc_desc->cpc_regs[ENERGY_PERF]; > > > > + > > > > + if (!CPC_SUPPORTED(energy_perf_reg)) > > > > + pr_warn("energy perf reg update is unsupported!\n"); > > > > > > No need to add a explanation point at the end. > > > > > > As this is a per-CPU message I wonder if this would be better as > > > pr_warn_once()? Othewrise some systems with large numbers of cores > > > might potentially show this message quite a few times. > > > > pr_info_once() would suffice IMO. > > Fixed in V4. > > > > > > > + > > > > + if (CPC_IN_PCC(energy_perf_reg)) { > > > > + int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpunum); > > > > + struct cppc_pcc_data *pcc_ss_data = NULL; > > > > + int ret = 0; > > > > + > > > > + if (pcc_ss_id < 0) > > > > + return -ENODEV; > > > > + > > > > + pcc_ss_data = pcc_data[pcc_ss_id]; > > > > + > > > > + down_write(&pcc_ss_data->pcc_lock); > > > > + > > > > + if (send_pcc_cmd(pcc_ss_id, CMD_READ) >= 0) { > > > > + cpc_read(cpunum, energy_perf_reg, &energy_perf); > > > > + perf_caps->energy_perf = energy_perf; > > > > + } else { > > > > + ret = -EIO; > > > > + } > > > > + > > > > + up_write(&pcc_ss_data->pcc_lock); > > > > + > > > > + return ret; > > > > + } > > > > What if CPC is not in PCC? > > > > Would returning 0 then work for all users? > > Fixed in V4 > > > > > > > + > > > > + return 0; > > > > +} > > > > +EXPORT_SYMBOL_GPL(cppc_get_epp_caps); > > > > + > > > > +int cppc_set_auto_epp(int cpu, bool enable) { > > > > + int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu); > > > > + struct cpc_register_resource *auto_sel_reg; > > > > + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu); > > > > + struct cppc_pcc_data *pcc_ss_data = NULL; > > > > + int ret = -EINVAL; > > > > + > > > > + if (!cpc_desc) { > > > > + pr_warn("No CPC descriptor for CPU:%d\n", cpu); > > > > > > Is this actually warn worthy? I would think it's fine a debug like we > > > have for the other _CPC missing messages. > > > > > > > + return -EINVAL; > > > > + } > > > > + > > > > + auto_sel_reg = &cpc_desc->cpc_regs[AUTO_SEL_ENABLE]; > > > > + > > > > + if (CPC_IN_PCC(auto_sel_reg)) { > > > > + if (pcc_ss_id < 0) > > > > + return -ENODEV; > > > > + > > > > + ret = cpc_write(cpu, auto_sel_reg, enable); > > > > + if (ret) > > > > + return ret; > > > > + > > > > + pcc_ss_data = pcc_data[pcc_ss_id]; > > > > + > > > > + down_write(&pcc_ss_data->pcc_lock); > > > > + /* after writing CPC, transfer the ownership of PCC to platform */ > > > > + ret = send_pcc_cmd(pcc_ss_id, CMD_WRITE); > > > > + up_write(&pcc_ss_data->pcc_lock); > > > > + return ret; > > > > + } > > > > + > > > > + return cpc_write(cpu, auto_sel_reg, enable); } > > > > +EXPORT_SYMBOL_GPL(cppc_set_auto_epp); > > > > + > > > > +/* > > > > + * Set Energy Performance Preference Register value through > > > > + * Performance Controls Interface > > > > + */ > > > > +int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls) > > > > +{ > > > > + int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu); > > > > + struct cpc_register_resource *epp_set_reg; > > > > + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu); > > > > + struct cppc_pcc_data *pcc_ss_data = NULL; > > > > + int ret = -EINVAL; > > > > + > > > > + if (!cpc_desc) { > > > > + pr_warn("No CPC descriptor for CPU:%d\n", cpu); > > > > > > Is this actually warn worthy? I would think it's fine a debug like we > > > have for the other _CPC missing messages. > > > > > > > + return -EINVAL; > > > > + } > > > > + > > > > + epp_set_reg = &cpc_desc->cpc_regs[ENERGY_PERF]; > > > > + > > > > + if (CPC_IN_PCC(epp_set_reg)) { > > > > + if (pcc_ss_id < 0) > > > > + return -ENODEV; > > > > + > > > > + ret = cpc_write(cpu, epp_set_reg, perf_ctrls->energy_perf); > > > > + if (ret) > > > > + return ret; > > > > + > > > > + pcc_ss_data = pcc_data[pcc_ss_id]; > > > > + > > > > + down_write(&pcc_ss_data->pcc_lock); > > > > + /* after writing CPC, transfer the ownership of PCC to platform */ > > > > + ret = send_pcc_cmd(pcc_ss_id, CMD_WRITE); > > > > + up_write(&pcc_ss_data->pcc_lock); > > > > > > cppc_set_auto_epp and cppc_set_epp_perf have nearly the same code in > > > the if block. I wonder if it's worth having a static helper function > > > for this purpose that takes "reg" and "value" as arguments? > > > > > > > + } > > > > And what about the non-PCC case here? > > I merge the cppc_set_auto_epp and cppc_set_epp_perf in V4. > For the non-PCC case, we canno set the EPP value to FW, then just returned > Error code. Is it Ok ? Yes, if it cannot be updated, it should be treated the same way as unsupported IMV.