Received: by 2002:a05:7412:f690:b0:e2:908c:2ebd with SMTP id ej16csp428061rdb; Thu, 19 Oct 2023 08:20:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHNGR1JU4YTQfEbUii7CJNBXYoJ0z6kOAlBa5GvIfv2OL38U57cicCwVlNyP9SViEDhbaxE X-Received: by 2002:a05:6a20:daa5:b0:17a:eff5:fbbe with SMTP id iy37-20020a056a20daa500b0017aeff5fbbemr3775368pzb.8.1697728856910; Thu, 19 Oct 2023 08:20:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697728856; cv=none; d=google.com; s=arc-20160816; b=rsgQ+AgCXbd0qFufHw1OVDlFp66GQgegWL6TD+nQF9eWYr8pwW73/78SD5vwpaEQpi 9QJzROIq1kjN3UOhDuxrT+No+FHxbbgChwgqnsGJmKH2AEuYsbC+K20gnd/PEZy1dGNZ Hb8/kbQo7QiE9YuIQaof0AU3ZKWTIrlaZptovADWobIovTbvMrKi1IlCKKWcyXAVPHKD wg2sDJ/wongrcV3dgHmQp156phWTu7CGW+QmQARHH/APw6mRIZbN+JtzTPpmL6dc3wH7 Mvluwcx5Ac9wm4OpWGu0/fe929dsgK5U70jDYYq7dxYYgJpVU+wgjwpFe+reaqkosKWO XU2w== 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=UzuYGgMfB2IgWrd3JwAlKJRMS7S7gxXt4VNaKRPI+4c=; fh=nZJSwUHoZdzAYmX6xtxEnz9HM7cA0QGUBLAyl0AHDA4=; b=mbCTPyUcJ6vWtN2w4NZ+kdx+UexM4D+pqGhL4WLubF3sv/10tuBQHBrOoLPhqqOEzt sXxvdaqhTBiAkPpBU8DPO6ss29FA9IoGIvERYWEj/60K3WDJiY+7664XCiH04Doenb1K mT+2E8ko0+qVr7vV+4Q+Hvm+tNKcdYyRwv0LsACWmKu+dt4cpuHJxhNg4SggAd7IOB8T WIAwkceCzeTwvltw4r1WeH5iE+eC8OMdDvHgjnJ5y2EAcuiFKM82XpbMh0FejxSmhPBt trBs3JK2RskI2HpNR1ZxkoQnOmNi0CKgDbL9YqwCnbxnF47UXltIteRn6sbY3Kgxe+Fp fj5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Xo2wMcj8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 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 pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id r19-20020a638f53000000b005b7fb04f1f9si3038904pgn.734.2023.10.19.08.20.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Oct 2023 08:20:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Xo2wMcj8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id 2679681C365E; Thu, 19 Oct 2023 08:20:53 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345979AbjJSPUe (ORCPT + 99 others); Thu, 19 Oct 2023 11:20:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59816 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235435AbjJSPUc (ORCPT ); Thu, 19 Oct 2023 11:20:32 -0400 Received: from mail-yb1-xb2b.google.com (mail-yb1-xb2b.google.com [IPv6:2607:f8b0:4864:20::b2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1CCB212A for ; Thu, 19 Oct 2023 08:20:30 -0700 (PDT) Received: by mail-yb1-xb2b.google.com with SMTP id 3f1490d57ef6-d9a6399cf78so824033276.0 for ; Thu, 19 Oct 2023 08:20:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1697728829; x=1698333629; darn=vger.kernel.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=UzuYGgMfB2IgWrd3JwAlKJRMS7S7gxXt4VNaKRPI+4c=; b=Xo2wMcj8QD+bl4VrwjB91/Y2C0ZxMO3I8l4MCmCc0ZErUV7GovJg/LcsghTu56ZlDW hU5OkzcYNXgXmu3HSyLp7hUrkEf9fPpEC5EP0n+k0/W9z77xSMLgMbPZV2xjOM1b3v95 qhA4xXntYA3wdrl57jkNo3i+rOEuHSqzBp6wj2TecnDLampUM9+ZwUXtCSj/M/xCUfzU IoFfYH+4E9sbizTjT6y7OJmzbGWKYbiAKmaA+jg5QYvp+/cZgdttfitbyuNr3JztiSA+ yh80o4ZjsiBF5clgX+BbOo9HRmvPSKKapxInUjlnGPJxyZ/wdWA2chJTrcgPtLUthhGE CWVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697728829; x=1698333629; 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=UzuYGgMfB2IgWrd3JwAlKJRMS7S7gxXt4VNaKRPI+4c=; b=DalopOdjW/fzM6ufMCh5ADau1gt8KX1PJCf+dgoQmPb/I6ugjJheUH9JBFQSAtL5sX DiGAPyBchnMpE1m+8y+Rrb94fkwj7R/bIScqv6yUY3aiqn4K6L1jewElapyzcZrx4uet tTFXEpIxZVWOcbi5WkD03Vxr9QaOry3hSLX0R6Sogzz7/8cJ8MYij4bAgp/ahC/8mXgs ObqvUY1hWncdRzcsMzHO4ZsLO8IcvLnmsCxN5wJIfMbkjHEQ6lQ6eMKohU9Pq1zfutjM 5IuqIYN2fdzVje4P25uFadmdvMQicV1MSVUZHem5oqwmX0THNeVJlSURpP0b3XYI4vHQ FPUw== X-Gm-Message-State: AOJu0YzKDfqzvT3nMR62KoIcaU7JGPHM8CWtR+YZdbI8/FJPOW/SozbV 7DCFQs2FAqy5V7dE1DQYHr5MUqAxXRGhOTkbTmW1tw== X-Received: by 2002:a25:8e08:0:b0:d81:91b2:62ea with SMTP id p8-20020a258e08000000b00d8191b262eamr1909318ybl.1.1697728829022; Thu, 19 Oct 2023 08:20:29 -0700 (PDT) MIME-Version: 1.0 References: <20231018-msm8909-cpufreq-v2-0-0962df95f654@kernkonzept.com> <20231018-msm8909-cpufreq-v2-2-0962df95f654@kernkonzept.com> In-Reply-To: From: Ulf Hansson Date: Thu, 19 Oct 2023 17:19:53 +0200 Message-ID: Subject: Re: [PATCH v2 2/3] cpufreq: qcom-nvmem: Enable virtual power domain devices To: Stephan Gerhold Cc: Stephan Gerhold , Viresh Kumar , Andy Gross , Bjorn Andersson , Konrad Dybcio , Ilia Lin , "Rafael J. Wysocki" , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, stable@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Thu, 19 Oct 2023 08:20:53 -0700 (PDT) On Thu, 19 Oct 2023 at 16:49, Stephan Gerhold wrote: > > On Thu, Oct 19, 2023 at 04:12:56PM +0200, Ulf Hansson wrote: > > On Thu, 19 Oct 2023 at 15:05, Stephan Gerhold wrote: > > > On Thu, Oct 19, 2023 at 01:26:19PM +0200, Ulf Hansson wrote: > > > > On Thu, 19 Oct 2023 at 12:24, Ulf Hansson wrote: > > > > > On Wed, 18 Oct 2023 at 10:06, Stephan Gerhold > > > > > wrote: > > > > > > > > > > > > The genpd core caches performance state votes from devices that are > > > > > > runtime suspended as of commit 3c5a272202c2 ("PM: domains: Improve > > > > > > runtime PM performance state handling"). They get applied once the > > > > > > device becomes active again. > > > > > > > > > > > > To attach the power domains needed by qcom-cpufreq-nvmem the OPP core > > > > > > calls genpd_dev_pm_attach_by_id(). This results in "virtual" dummy > > > > > > devices that use runtime PM only to control the enable and performance > > > > > > state for the attached power domain. > > > > > > > > > > > > However, at the moment nothing ever resumes the virtual devices created > > > > > > for qcom-cpufreq-nvmem. They remain permanently runtime suspended. This > > > > > > means that performance state votes made during cpufreq scaling get > > > > > > always cached and never applied to the hardware. > > > > > > > > > > > > Fix this by enabling the devices after attaching them and use > > > > > > dev_pm_syscore_device() to ensure the power domains also stay on when > > > > > > going to suspend. Since it supplies the CPU we can never turn it off > > > > > > from Linux. There are other mechanisms to turn it off when needed, > > > > > > usually in the RPM firmware (RPMPD) or the cpuidle path (CPR genpd). > > > > > > > > > > I believe we discussed using dev_pm_syscore_device() for the previous > > > > > version. It's not intended to be used for things like the above. > > > > > > > > > > > Sorry, looks like we still had a misunderstanding in the conclusion of > > > the previous discussion. :') > > > > > > > > Moreover, I was under the impression that it wasn't really needed. In > > > > > fact, I would think that this actually breaks things for system > > > > > suspend/resume, as in this case the cpr driver's genpd > > > > > ->power_on|off() callbacks are no longer getting called due this, > > > > > which means that the cpr state machine isn't going to be restored > > > > > properly. Or did I get this wrong? > > > > > > > > > > We strictly need the RPMPDs to be always-on, also across system suspend > > > [1]. The RPM firmware will drop the votes internally as soon as the > > > CPU(s) have entered deep cpuidle. We can't do this from Linux, because > > > we need the CPU to continue running until it was shut down cleanly. > > > > > > For CPR, we strictly need the backing regulator to be always-on, also > > > across system suspend. Typically the hardware will turn off the > > > regulator as soon as the CPU(s) enter deep cpuidle. Similarly, we can't > > > do this from Linux, because we need the CPU to continue running until it > > > was shut down cleanly. > > > > > > My understanding was that we're going to pause the CPR state machine > > > using the system suspend/resume callbacks on the driver, instead of > > > using the genpd->power_on|off() callbacks [2]. I can submit a separate > > > patch for this. > > > > If we are going to do 1) as described below, this looks to me that > > it's going to be needed. > > > > Yep. > > > How will otherwise the cpr state machine be saved/restored during > > system suspend/resume? Note that, beyond 1), the genpd's > > ->power_on|off() callbacks are no longer going to be called during > > system suspend/resume. > > > > (Side note: I think "save/restore" might be the wrong words for > suspend/resume of CPR. Looking at the code most of the configuration > appears to be preserved across suspend/resume. Nothing is saved, it > literally just disables the state machine during suspend and re-enables > it during resume. > > I'm not entirely sure what's the reason for doing this. Perhaps the > main goal is just to prevent the CPR state machine from getting stuck > or sending pointless IRQs that won't be handled while Linux is > suspended.) If only the latter, that is a very good reason too. Drivers should take care of their devices to make sure they are not triggering spurious irqs during system suspend. > > > In a way this also means that the cpr genpd provider might as well > > also have GENPD_FLAG_ALWAYS_ON set for it. > > Conceptually I would consider CPR to be a generic power domain provider > that could supply any kind of device. I know at least of CPUs and GPUs. > We need "always-on" only for the CPU, but not necessarily for other > devices. > > For a GPU, the Linux driver (running on the CPU) can stop the GPU, wait > for completion and then invoke the ->power_off() callback of CPR. In > that case it is also safe to disable the backing regulator from Linux. > (I briefly mentioned this already in the previous discussion I think.) > > We could set GENPD_FLAG_ALWAYS_ON for the CPR compatibles where we know > that they are only used to supply CPUs, but if we're going to do (1) > anyway there might not be much of an advantage for the extra complexity. Okay, fair enough. Let's just stick with 1) and skip using GENPD_FLAG_ALWAYS_ON bit for the cpr genpd provider. > > > > > > > > > I didn't prioritize this because QCS404 (as the only current user of > > > CPR) doesn't have proper deep cpuidle/power management set up yet. It's > > > not entirely clear to me if there is any advantage (or perhaps even > > > disadvantage) if we pause the CPR state machine while the shared L2 > > > cache is still being actively powered by the CPR power rail during > > > system suspend. I suspect this is a configuration that was never > > > considered in the hardware design. > > > > I see. > > > > > > > > Given the strict requirement for the RPMPDs, I only see two options: > > > > > > 1. Have an always-on consumer that prevents the power domains to be > > > powered off during system suspend. This is what this patch tries to > > > achieve. > > > > > > Or: > > > > > > 2. Come up with a way to register the RPMPDs used by the CPU with > > > GENPD_FLAG_ALWAYS_ON. This would also be doable, but isn't as > > > straightfoward as "regulator-always-on" in the DT because the rpmpd > > > DT node represents multiple genpds in a single DT node [3]. > > > > Yes, it sounds like it may be easier to do 1). > > > > > > > > What do you think? Do you see some other solution perhaps? I hope we can > > > clear up the misunderstanding. :-) > > > > Yes, thanks! > > > > > > > > [1]: https://lore.kernel.org/linux-arm-msm/ZQGqfMigCFZP_HLA@gerhold.net/ > > > [2]: https://lore.kernel.org/linux-arm-msm/CAPDyKFoiup8KNv=1LFGKDdDLA1pHsdJUgTTWMdgxnikEmReXzg@mail.gmail.com/ > > > [3]: https://lore.kernel.org/linux-arm-msm/ZSg-XtwMxg3_fWxc@gerhold.net/ > > > > > > > BTW, if you really need something like the above, the proper way to do > > > > it would instead be to call device_set_awake_path() for the device. > > > > > > > > This informs genpd that the device needs to stay powered-on during > > > > system suspend (assuming that GENPD_FLAG_ACTIVE_WAKEUP has been set > > > > for it), hence it will keep the corresponding PM domain powered-on > > > > too. > > > > > > > > > > Thanks, I can try if this works as alternative to the > > > dev_pm_syscore_device()! > > > > Yes, please. We don't want to abuse the dev_pm_syscore_device() thingy. > > > > Could you clarify the idea behind GENPD_FLAG_ACTIVE_WAKEUP? Would I set > it conditionally for all RPMPDs or just the ones consumed by the CPU? > How does the genpd *provider* know if one of its *consumer* devices > needs to have its power domain kept on for wakeup? We are thinking of the GENPD_FLAG_ACTIVE_WAKEUP as a platform configuration type of flag for the genpd in question. The consumer driver shouldn't need to know about the details of what is happening on the PM domain level - only whether it needs its device to remain powered-on during system suspend or not. I suspect that the GENPD_FLAG_ACTIVE_WAKEUP is probably okay to set for most genpds, but there may be some exceptions. Kind regards Uffe