Received: by 2002:a05:6358:7058:b0:131:369:b2a3 with SMTP id 24csp8320691rwp; Wed, 19 Jul 2023 08:14:52 -0700 (PDT) X-Google-Smtp-Source: APBJJlH9zPx7PMwsYu3K1w01IZF0eCOHSDHryxmxmoUU840V3WE20zxBOlRIYS2Pl0wm4JbpXl8Z X-Received: by 2002:a05:6512:2806:b0:4fb:8bea:f5f6 with SMTP id cf6-20020a056512280600b004fb8beaf5f6mr130640lfb.34.1689779692539; Wed, 19 Jul 2023 08:14:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689779692; cv=none; d=google.com; s=arc-20160816; b=DOPIFedE5GeO2BZRMLA3ac26mmif/xs5FbtMJ5AF8vl/DFuiGXVRtg7JQXMveG9DgD 13Hr/5IO0EkcdX8wvz6FdGf0Xp5UCVsckpg9AIGfzPF0VGxAjwmwgbAYMXOIY4bCqo1W HiHDKYYG6x95pz2mCVKcTE91hUyBtqWY2Z1sEweDYXxaeH8sPAOXMJVoGWOqYHiymNvy kie6hWglSY/ow/hrCLK7ARGiISC+T5YWaeSxjK1We/fVuv9UP8o8UyaKlVFWTD+aKXJJ JiwTpkazIccouOVUm+2dBxCHvIfHoh51m8YAcsI0zpPUO6U9wxxNv8d0FQssEdmhwPte vlXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=Tp3H5pc7kSY1vTwxM+1Q4GuCjqDGy7uWVEZ9bqamdSg=; fh=c0Xdi9QXWQHW4zaWaqBrYG8Ee6F+Klk7htMLXpXmPUc=; b=s7y905dn6VqYNMjI4OfSyTLtT/v77xSUf1rWrLAHfvomVEXuqyWhhqa+xCDgDMahyg 6TFiYtzHIg3y2LHiJ+T6TkIwoyVn50ZfccDMMnAgTXg3zPyezUc83YlYUvIm8gycDMYv nX1iDsxgu19ZvmlrF7a8WeSCAyboJi0aSYNgBiwu7Jc3VRVANmNdtLc2OZnVcYbxVizP 4KAr0Ct+yQOaGTPXdTFO3hXMiQQrS+CQAJBJfvA+sY/NEI4MKCDsz/gwz/p82uqGL7aI +xFGnwJQst+nWDkI5FgZGrqETB54NVbslOF4kZyYdZDJcnb9zOSb1selmFfMnnhlgKl7 8gFA== 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=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j11-20020aa7c0cb000000b0051debd504casi3175106edp.160.2023.07.19.08.14.27; Wed, 19 Jul 2023 08:14:52 -0700 (PDT) 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=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229932AbjGSOvx (ORCPT + 99 others); Wed, 19 Jul 2023 10:51:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229771AbjGSOvv (ORCPT ); Wed, 19 Jul 2023 10:51:51 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id DAC9B11B; Wed, 19 Jul 2023 07:51:49 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C26162F4; Wed, 19 Jul 2023 07:52:32 -0700 (PDT) Received: from e120937-lin (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E5C0E3F6C4; Wed, 19 Jul 2023 07:51:47 -0700 (PDT) Date: Wed, 19 Jul 2023 15:51:45 +0100 From: Cristian Marussi To: Ulf Hansson Cc: Sudeep Holla , Viresh Kumar , Nishanth Menon , Stephen Boyd , Nikunj Kela , Prasad Sodagudi , Alexandre Torgue , linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 10/11] firmware: arm_scmi: Add the SCMI performance domain Message-ID: References: <20230713141738.23970-1-ulf.hansson@linaro.org> <20230713141738.23970-11-ulf.hansson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230713141738.23970-11-ulf.hansson@linaro.org> X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham 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, Jul 13, 2023 at 04:17:37PM +0200, Ulf Hansson wrote: > To enable support for performance scaling (DVFS) for generic devices with > the SCMI performance protocol, let's add an SCMI performance domain. This > is being modelled as a genpd provider, with support for performance scaling > through genpd's ->set_performance_state() callback. > > Note that, this adds the initial support that allows consumer drivers for > attached devices, to vote for a new performance state via calling the > dev_pm_genpd_set_performance_state(). However, this should be avoided as > it's in most cases preferred to use the OPP library to vote for a new OPP > instead. The support using the OPP library isn't part of this change, but > needs to be implemented from subsequent changes. > Hi Ulf, a couple of remarks down below. > Signed-off-by: Ulf Hansson > --- > > Changes in v2: > - Converted to use the new ->domain_info_get() callback. > > --- > drivers/firmware/arm_scmi/Kconfig | 12 ++ > drivers/firmware/arm_scmi/Makefile | 1 + > drivers/firmware/arm_scmi/scmi_perf_domain.c | 155 +++++++++++++++++++ > 3 files changed, 168 insertions(+) > create mode 100644 drivers/firmware/arm_scmi/scmi_perf_domain.c [snip] > +static int scmi_perf_domain_probe(struct scmi_device *sdev) > +{ > + struct device *dev = &sdev->dev; > + const struct scmi_handle *handle = sdev->handle; > + const struct scmi_perf_proto_ops *perf_ops; > + struct scmi_protocol_handle *ph; > + struct scmi_perf_domain *scmi_pd; > + struct genpd_onecell_data *scmi_pd_data; > + struct generic_pm_domain **domains; > + int num_domains, i, ret = 0; > + u32 perf_level; > + > + if (!handle) > + return -ENODEV; > + > + /* The OF node must specify us as a power-domain provider. */ > + if (!of_find_property(dev->of_node, "#power-domain-cells", NULL)) > + return 0; > + > + perf_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_PERF, &ph); > + if (IS_ERR(perf_ops)) > + return PTR_ERR(perf_ops); > + > + num_domains = perf_ops->num_domains_get(ph); > + if (num_domains < 0) { > + dev_warn(dev, "Failed with %d when getting num perf domains\n", > + num_domains); > + return num_domains; > + } else if (!num_domains) { > + return 0; > + } > + > + scmi_pd = devm_kcalloc(dev, num_domains, sizeof(*scmi_pd), GFP_KERNEL); > + if (!scmi_pd) > + return -ENOMEM; > + > + scmi_pd_data = devm_kzalloc(dev, sizeof(*scmi_pd_data), GFP_KERNEL); > + if (!scmi_pd_data) > + return -ENOMEM; > + > + domains = devm_kcalloc(dev, num_domains, sizeof(*domains), GFP_KERNEL); > + if (!domains) > + return -ENOMEM; > + > + for (i = 0; i < num_domains; i++, scmi_pd++) { > + scmi_pd->info = perf_ops->domain_info_get(ph, i); So here you are grabbing all the performance domains exposed by the platform via PERF protocol and then a few lines down below you are registering them with pm_genpd_init(), but the list of domains obtained from the platform will contain NOT only devices but also CPUs possibly, already managed by the SCMI CPUFreq driver. In fact the SCMI CPUFreq driver, on his side, takes care to pick only domains that are bound in the DT to a CPU (via scmi_cpu_domain_id DT parsing) but here you are registering all domains with GenPD upfront. Is it not possible that, once registered, GenPD can decide, at some point in the future, to try act on some of these domains associated with a CPU ? (like Clock framework does at the end of boot trying to disable unused clocks...not familiar with internals of GenPD, though) > + scmi_pd->domain_id = i; > + scmi_pd->perf_ops = perf_ops; > + scmi_pd->ph = ph; > + scmi_pd->genpd.name = scmi_pd->info->name; > + scmi_pd->genpd.flags = GENPD_FLAG_OPP_TABLE_FW; > + scmi_pd->genpd.set_performance_state = scmi_pd_set_perf_state; > + > + ret = perf_ops->level_get(ph, i, &perf_level, false); > + if (ret) { > + dev_dbg(dev, "Failed to get perf level for %s", > + scmi_pd->genpd.name); > + perf_level = 0; > + } > + > + /* Let the perf level indicate the power-state too. */ > + ret = pm_genpd_init(&scmi_pd->genpd, NULL, perf_level == 0); In SCMI world PERF levels should have nothing to do with the Power state of a domain: you have the POWER protocol for that, so you should not assume that perf level 0 means OFF, but you can use the POWER protocol operation .state_get() to lookup the power state. (and you can grab both perf and power ops from the same driver) The tricky part would be to match the PERF domain at hand with the related POWER domain to query the state for, I suppose. Indeed, recently, while looking at SCMI v3.2 PERF evolutions, I was tempted to just start rejecting any level_set() or set_freq() request for ZERO since they really can be abused to power off a domain. (if the platform complies...) Apologize if I missed something about how GenPD behaviour... Thanks, Cristian