Received: by 2002:a05:7412:6592:b0:d7:7d3a:4fe2 with SMTP id m18csp2534697rdg; Mon, 14 Aug 2023 05:52:36 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHOnuJc6FtNAUmeHiTHmkuRM2tVMGmke2nhZNcVdfooorob4Ng4V3DA1d4vs0h269HdG2X4 X-Received: by 2002:a17:902:ec92:b0:1b2:2c0c:d400 with SMTP id x18-20020a170902ec9200b001b22c0cd400mr9097579plg.52.1692017556011; Mon, 14 Aug 2023 05:52:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692017555; cv=none; d=google.com; s=arc-20160816; b=q6bsJSG7bNuim0hJ6Q3jfv6s2VcMEGPtEQJT2BeYGTjEAflhguVGXAMmwcaCwZkF16 MRAcEyYKgLY4TTiNyo8csPVJs46rNcVn/D4HV4drUIRfGOavqsZ2jRoEhS9sIPJ2kCXj BrLDIjzP/o6VcviSTP+CAXJGroYpc3DNBQtdscxmzBrTT4mizY6S5N8Lgqw4ELYVV+C/ mdjTSXZJICYEFk6pEJgXs/gKgLdZR3TDhs+v1j8rt/dhmjfIqI2M2veGVxtRVX80Z3h+ JpXA1JpTiY7USdU/KKWXEGSRyPFtXQFHngCd0ipBibfCdTR9OGs8du50jpPaOPzIVUB7 1Wzw== 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:dkim-signature; bh=UuWXzUtgteZMUOcMXL2A8wMeAp2XrMsOVnnYTbiAVnU=; fh=0nxdnq2/b0/V87nRDabxOIgJIX1vI28EKSELwdGL/0o=; b=jk30E8lhwZybGBmy7yKPIFZdCh1G/Z7hshj0m3raIkEuuyNAoSd6TJNfr4kliuUOLS SZxfxwMy7DHIojRLta7XoGCkVdc4UVQ9Js4pyT5NXaG1bD4+Ldxd5RqBVlo+7bDdt2rj i343Fv3QTnxDioofCrb7mnciUlvzvHg8vrhfa7em+KNzWMJtg0dHDpXXrnx6fyYI1K6f 3MDKd3KIthk5rXnkgVQTmfxk2kXhR/77nMa749aEfnc+jgFZ2UeC+Tdf8fjSjZyDZVAY QL/x4ZYoIeW0vTt7cWj7xHCNLqT+584aVSS7GLZ7Z+gLXN6MZHVOLxrfefU5pInqkC3u 09GQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KiuNh1c2; 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=linaro.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d5-20020a170902654500b001bde698074csi1520263pln.584.2023.08.14.05.52.23; Mon, 14 Aug 2023 05:52:35 -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; dkim=pass header.i=@linaro.org header.s=google header.b=KiuNh1c2; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229611AbjHNMYo (ORCPT + 99 others); Mon, 14 Aug 2023 08:24:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36062 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229725AbjHNMYR (ORCPT ); Mon, 14 Aug 2023 08:24:17 -0400 Received: from mail-ot1-x330.google.com (mail-ot1-x330.google.com [IPv6:2607:f8b0:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D678F130 for ; Mon, 14 Aug 2023 05:24:16 -0700 (PDT) Received: by mail-ot1-x330.google.com with SMTP id 46e09a7af769-6bd0a0a675dso3664229a34.2 for ; Mon, 14 Aug 2023 05:24:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1692015856; x=1692620656; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=UuWXzUtgteZMUOcMXL2A8wMeAp2XrMsOVnnYTbiAVnU=; b=KiuNh1c2pexVaz9mgEMw+6vXSUOgMsChXSbMVoQ+taknZfUXE69lYFhGCwG6WYbUKr ggfv9JrPt2tv55CQQUuqyco56mwZfXGtAECpOyTU2rjfl3o7d7of8jZfkYQ3/fulvj1y 4J8K8eW20Gk9oLP0Jsxm65eHN+9s7yAw7n2Z3ES/mjy9CPORnrCdPab9l+TviV7Zdqs3 U2EH8WzirvyzdArKeLYHYBZEEaLGQJhqSoKeEClVHAQAMfizTOdd1PGHNZ1bGAVcJPwI s7VzPDzREBqPDbUvHz/B05Zi/eQhiKSEONuMgCkBAAucdA4dSWuoBvohOUu9aZz6L8CG /h+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692015856; x=1692620656; 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=UuWXzUtgteZMUOcMXL2A8wMeAp2XrMsOVnnYTbiAVnU=; b=GfU3XxE98nn8vFy4imprK1aXtup3NdqOdFdyLVA9PSTGtdLfbVa2vxnbSNIfJZ7bdq Jx4RaJDB1yQYtmyb9nd+RY8HCpj/6clG5j8H+4sOMNgiaAi1qVj1IyNCulO5jRkA2h/F JHP62wMNHCNSy3urtBdexKycy1/G461x5MzpCC48C3Vkmg7WGfrIUC0rqdHAdQKmH/sJ TsNPC3LKnOZF2ZubMb4Xz/g2iMwTXXs5XKiCm56MZYgwinhFYv4ScyiVR8fClJhLGaQ6 JB7KIj+ikRmF3RcJSv2s5sWWXUlVHmJyUpcJ8w2KRFeGOhVeizVk63pvLr8eWsR0sk1b XUmA== X-Gm-Message-State: AOJu0YxfjQboHydjGugfn5u6gM5Rjt8gPNO1QTrVb/aipYN303AZX0SD eiaY2r3VF3FtO04foUzCvy7BAexIvXbhzYiCz7g2Qw== X-Received: by 2002:a9d:6858:0:b0:6bc:b8d9:476e with SMTP id c24-20020a9d6858000000b006bcb8d9476emr9349066oto.16.1692015856121; Mon, 14 Aug 2023 05:24:16 -0700 (PDT) MIME-Version: 1.0 References: <20230814104127.1929-1-peng.fan@oss.nxp.com> <20230814104127.1929-8-peng.fan@oss.nxp.com> In-Reply-To: From: Ulf Hansson Date: Mon, 14 Aug 2023 14:23:39 +0200 Message-ID: Subject: Re: [PATCH V4 7/8] genpd: imx: scu-pd: add multi states support To: Peng Fan Cc: "Peng Fan (OSS)" , "shawnguo@kernel.org" , "s.hauer@pengutronix.de" , "kernel@pengutronix.de" , "festevam@gmail.com" , dl-linux-imx , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-pm@vger.kernel.org" Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS 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 Mon, 14 Aug 2023 at 13:52, Peng Fan wrote: > > > Subject: Re: [PATCH V4 7/8] genpd: imx: scu-pd: add multi states support > > > > On Mon, 14 Aug 2023 at 12:37, Peng Fan (OSS) > > wrote: > > > > > > From: Peng Fan > > > > > > Add multi states support, this is to support devices could run in LP > > > mode when runtime suspend, and OFF mode when system suspend. > > > > For my understanding, is there a functional problem to support OFF at > > runtime suspend too? > > In OFF mode, the HW state is lost, so the clks that exported by this(Subsystem) > genpd is lost. While in LF mode, no need handle clks recover. > > > Such as subsystem LSIO has clks output, has GPIO, has LPUART. > > The clks are in drivers/clk/imx/clk-imx8qxp*, which relies on the scu pd. > > If scu-pd is off, the clks will lose state. Thanks for clarifying, much appreciated! So it sounds like it's the clock provider(s) that has these requirements then. Can we let the clock provider set a QoS latency constraint for its device that is attached to the genpd then? To prevent the deeper OFF state? Another option would be to enable runtime PM support for the clock provider (to manage the save/restore from runtime PM callbacks), but whether that's feasible sounds like a separate discussion. > > > > > > > > > Signed-off-by: Peng Fan > > > --- > > > drivers/genpd/imx/scu-pd.c | 48 > > > ++++++++++++++++++++++++++++++++++++-- > > > 1 file changed, 46 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/genpd/imx/scu-pd.c b/drivers/genpd/imx/scu-pd.c > > > index 2f693b67ddb4..30da101119eb 100644 > > > --- a/drivers/genpd/imx/scu-pd.c > > > +++ b/drivers/genpd/imx/scu-pd.c > > > @@ -65,6 +65,12 @@ > > > #include > > > #include > > > > > > +enum { > > > + PD_STATE_LP, > > > + PD_STATE_OFF, > > > + PD_STATE_MAX > > > +}; > > > + > > > /* SCU Power Mode Protocol definition */ struct > > > imx_sc_msg_req_set_resource_power_mode { > > > struct imx_sc_rpc_msg hdr; > > > @@ -368,7 +374,8 @@ static int imx_sc_pd_power(struct > > generic_pm_domain *domain, bool power_on) > > > hdr->size = 2; > > > > > > msg.resource = pd->rsrc; > > > - msg.mode = power_on ? IMX_SC_PM_PW_MODE_ON : > > IMX_SC_PM_PW_MODE_LP; > > > + msg.mode = power_on ? IMX_SC_PM_PW_MODE_ON : pd- > > >pd.state_idx ? > > > + IMX_SC_PM_PW_MODE_OFF : IMX_SC_PM_PW_MODE_LP; > > > > > > /* keep uart console power on for no_console_suspend */ > > > if (imx_con_rsrc == pd->rsrc && !console_suspend_enabled && > > > !power_on) @@ -412,11 +419,33 @@ static struct generic_pm_domain > > *imx_scu_pd_xlate(struct of_phandle_args *spec, > > > return domain; > > > } > > > > > > +static bool imx_sc_pd_suspend_ok(struct device *dev) { > > > + /* Always true */ > > > + return true; > > > +} > > > + > > > +static bool imx_sc_pd_power_down_ok(struct dev_pm_domain *pd) { > > > + struct generic_pm_domain *genpd = pd_to_genpd(pd); > > > + > > > + /* For runtime suspend, choose LP mode */ > > > + genpd->state_idx = 0; > > > + > > > + return true; > > > +} > > > > I am wondering if we couldn't use the simple_qos_governor here instead. In > > principle it looks like we want a QoS latency constraint to be set during > > runtime, to prevent the OFF state. > > LP mode indeed could save resume time, but the major problem is to avoid > save/restore clks. Okay. So it still sounds like a QoS latency constraint (for the clock provider) sounds like the correct thing to do. If/when the clock provider gets runtime PM support, we can remove the QoS latency constraints. That should work, right? > > > > During system wide suspend, the deepest state is always selected by genpd. > > > > > + > > > +struct dev_power_governor imx_sc_pd_qos_governor = { > > > + .suspend_ok = imx_sc_pd_suspend_ok, > > > + .power_down_ok = imx_sc_pd_power_down_ok, }; > > > + > > > static struct imx_sc_pm_domain * > > > imx_scu_add_pm_domain(struct device *dev, int idx, > > > const struct imx_sc_pd_range *pd_ranges) { > > > struct imx_sc_pm_domain *sc_pd; > > > + struct genpd_power_state *states; > > > bool is_off; > > > int mode, ret; > > > > > > @@ -427,9 +456,22 @@ imx_scu_add_pm_domain(struct device *dev, int > > idx, > > > if (!sc_pd) > > > return ERR_PTR(-ENOMEM); > > > > > > + states = devm_kcalloc(dev, PD_STATE_MAX, sizeof(*states), > > GFP_KERNEL); > > > + if (!states) { > > > + devm_kfree(dev, sc_pd); > > > + return ERR_PTR(-ENOMEM); > > > + } > > > + > > > sc_pd->rsrc = pd_ranges->rsrc + idx; > > > sc_pd->pd.power_off = imx_sc_pd_power_off; > > > sc_pd->pd.power_on = imx_sc_pd_power_on; > > > + states[PD_STATE_LP].power_off_latency_ns = 25000; > > > + states[PD_STATE_LP].power_on_latency_ns = 25000; > > > + states[PD_STATE_OFF].power_off_latency_ns = 2500000; > > > + states[PD_STATE_OFF].power_on_latency_ns = 2500000; > > > > We should probably describe these in DT instead? The domain-idle-states > > bindings allows us to do this. See > > Documentation/devicetree/bindings/power/domain-idle-state.yaml. > > The scu-pd is a firmware function node, there is no sub-genpd node inside it. > > Just like scmi pd, there is no sub-genpd in it. Not sure I got your point. We don't need a sub-genpd node to describe this. This is how it could look like: domain-idle-states { domain_retention: domain-retention { compatible = "domain-idle-state"; entry-latency-us = <25>; exit-latency-us = <25>; }; domain_off: domain-off { compatible = "domain-idle-state"; entry-latency-us = <2500>; exit-latency-us = <2500>; }; }; power-controller { compatible = "fsl,imx8qxp-scu-pd", "fsl,scu-pd"; #power-domain-cells = <1>; domain-idle-states = <&domain_retention>, <&domain_off>; }; [...] Kind regards Uffe