Message ID | 20231227-topic-psci_fw_sus-v1-2-6910add70bf3@linaro.org |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-12284-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1691673dyb; Wed, 27 Dec 2023 14:16:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IFmi46RQXUvNOPImKfocIWykBfXA1LI8ouhJrqnfmhmRsLtn/j+Wj2ITQrcxXXv0I0oq34e X-Received: by 2002:a05:6830:1d54:b0:6d9:db33:39a5 with SMTP id p20-20020a0568301d5400b006d9db3339a5mr6644775oth.75.1703715393356; Wed, 27 Dec 2023 14:16:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703715393; cv=none; d=google.com; s=arc-20160816; b=O48AEx2Gn6lDK6u1KWw1Je5ZkBG4XNtAcwcUORgROW19RhfJquP2l7h+eIJoXmJrW7 lRNZJqbgTvd43RbOoI4QWjr5ucYiNnQt+HbZXg2LxphMOiFCjevTA6p+LCjLEsRvOUO5 +GAs2gEsV5oy/a9Fk9/nrwQDiJsZzQmwOSMBilFobyK1f0oPXZh6B/Qk3q6NV5dkbDyX jWoQkmOXxlbjdEGZ8+IwcF1HwguvR+2umGgzO5owAsxUZtD80yrav5vpJKGcKpNKW5T+ L6k7WZ24losAsQpLM3NA1tyYqpaNOwubQ46/gvVHdh6rTEBRC7RajxPklmUdtm82DTWy UWAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :subject:date:from:dkim-signature; bh=DM4CXwvWCS9WJcPPk5LYsBDY7vznKyyVFP9Y3rGVGSA=; fh=vMPF14dRYhSnas+8U32vLVecrchv7sUNtnX5uRg2iB0=; b=ctZ+WkskjhXTKi14Pf450wl7OYcl0gFIYr/aKsOmnTehCEjlHUPacEjje1MRxPGhsO f/A53opeJNwLC9Ea64c5DpogEAt51tpfEw+cl34ZTx8Fs/+nR8B+TUzh6ONWR1G/x0WU qkRlAiSSDSgj5Ln0NM4XcMtkVi4koaWQ2QAEPSQpZutQXpNwghsnyYQu5HbsyhH3KHOa U/PkfChIUEXleZQtG7UuW/OVYLx98J/MaSRUlQAU2dR+/bHQP93gZPrlvnDLkFHQgY+g mbLEisos+rsp7Q3ldpJPpgVbjpMS14xlqm7wL47ZH/oCdH3c8n9jN8es12iF8aIQZ1S1 OYhw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=eRtOPWIu; spf=pass (google.com: domain of linux-kernel+bounces-12284-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12284-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id k125-20020a632483000000b005cdfd55d112si8941824pgk.655.2023.12.27.14.16.32 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 14:16:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12284-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=eRtOPWIu; spf=pass (google.com: domain of linux-kernel+bounces-12284-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12284-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 36196B225A9 for <ouuuleilei@gmail.com>; Wed, 27 Dec 2023 22:16:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B407948CDA; Wed, 27 Dec 2023 22:15:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="eRtOPWIu" X-Original-To: linux-kernel@vger.kernel.org Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7083E481CE for <linux-kernel@vger.kernel.org>; Wed, 27 Dec 2023 22:15:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-a23566e91d5so633040866b.0 for <linux-kernel@vger.kernel.org>; Wed, 27 Dec 2023 14:15:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1703715350; x=1704320150; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=DM4CXwvWCS9WJcPPk5LYsBDY7vznKyyVFP9Y3rGVGSA=; b=eRtOPWIuphs2fQLqOcXohktt1fA3wqlCgzu/53++Vb9bMackwBN5uzZwykJ3Jh7z+u ob6byIZd7dAyH03+5hrDnaq6mRBgxdXhOHolRelady5yD5WqTAtijOgFA5pGX1HOn9PN I3z3cXJlmOlobztf1dlBz4x+kn9LpJf9BvaKr8c240e3lSvvItlIr4rr/uVBK3Hh87Zp 75khnY/o68RahW+7tVtLNj3XPc08ANolGavwIbE9ZMyh3GnPnFcYI18q9Cth1N1zX1ND X0u3cBKBoyuo0cVEorDXGqvKnHGQcO0CuCv8EfBWT0rL/gJy7i+gJCinPoS0yPh4G7Tm 3R3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703715350; x=1704320150; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DM4CXwvWCS9WJcPPk5LYsBDY7vznKyyVFP9Y3rGVGSA=; b=Eq/a9gopLp3FGaxEm/fAKeCNwvEnTVIlrtjiO18WFhWdhp+XuRtCxT0VcbyVPdEcXi xP0fPhzb9WVuKnnsAoTKKupi+6aHO/pa6SDebisyPpAubKDBQks9vgjCfNDE/FPca0yZ qTQDs3JQxcGuDegMZStzdjap8F/KHs6s8ukwg3nTF1abBxNxrJdOUdB3IsCOXrdthbJU 60Y6L5ebI4F7WVxtnBemBM0IxZIhGzsfhDu2ATKC6OlhDabXsOMriJNGTFYZKO0og5K6 De2WXwnoODHeP8d2UXkEK8pY08K+fWYrshw32QKCfptJutYLIdmEbvxxJ6VWuNV0gU3c bUxA== X-Gm-Message-State: AOJu0YxRJ0sAYFEJbxv9R0GBeh9NO/PL0QrJB/miXbcxzoKDcmtrCL17 p3Cvu+iqk/ITQCqmqVi8NpTND2Xe/8H3YQ== X-Received: by 2002:a17:907:91d1:b0:a26:93d9:eb6a with SMTP id h17-20020a17090791d100b00a2693d9eb6amr2433282ejz.44.1703715350572; Wed, 27 Dec 2023 14:15:50 -0800 (PST) Received: from [10.167.154.1] (178235179028.dynamic-4-waw-k-1-3-0.vectranet.pl. [178.235.179.28]) by smtp.gmail.com with ESMTPSA id vw17-20020a170907059100b00a26f3d6062csm2821501ejb.50.2023.12.27.14.15.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 14:15:50 -0800 (PST) From: Konrad Dybcio <konrad.dybcio@linaro.org> Date: Wed, 27 Dec 2023 23:15:31 +0100 Subject: [PATCH 2/2] firmware/psci: Set pm_set_resume/suspend_via_firmware() on qcom Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20231227-topic-psci_fw_sus-v1-2-6910add70bf3@linaro.org> References: <20231227-topic-psci_fw_sus-v1-0-6910add70bf3@linaro.org> In-Reply-To: <20231227-topic-psci_fw_sus-v1-0-6910add70bf3@linaro.org> To: Mark Rutland <mark.rutland@arm.com>, Lorenzo Pieralisi <lpieralisi@kernel.org> Cc: Marijn Suijten <marijn.suijten@somainline.org>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Bjorn Andersson <andersson@kernel.org>, Konrad Dybcio <konrad.dybcio@linaro.org> X-Mailer: b4 0.12.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1703715346; l=3395; i=konrad.dybcio@linaro.org; s=20230215; h=from:subject:message-id; bh=JzsZaTg1IMKhIfK68jHfV873UZDk10Nbu4hj2+1j2fg=; b=Mw5QVXoHdGheLV+1bzxTtADhkn/zaPQU1MbgFoSVA89LnbIQtJJVihIi5J3WuZYWxQindrXvB sUzNfSt1TuTDktJtJD/hPUp1yX52useQnsRzz4Dywpgok07cbtfO0Wk X-Developer-Key: i=konrad.dybcio@linaro.org; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786475072281819531 X-GMAIL-MSGID: 1786475072281819531 |
Series |
Advertise pm_resume/suspend_via_firmware with PSCI
|
|
Commit Message
Konrad Dybcio
Dec. 27, 2023, 10:15 p.m. UTC
Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for
entering various stages of suspend, across the SoC. These range from a
simple WFI to a full-fledged power collapse of the entire chip
(mostly, anyway).
Some device drivers are curious to know whether "the firmware" (which is
often assumed to be ACPI) takes care of suspending or resuming the
platform. Set the flag that reports this behavior on the aforementioned
chips.
Some newer Qualcomm chips ship with firmware that actually advertises
PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly.
Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
---
drivers/firmware/psci/psci.c | 57 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 56 insertions(+), 1 deletion(-)
Comments
On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: > Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for > entering various stages of suspend, across the SoC. These range from a > simple WFI to a full-fledged power collapse of the entire chip > (mostly, anyway). > > Some device drivers are curious to know whether "the firmware" (which is > often assumed to be ACPI) takes care of suspending or resuming the > platform. Set the flag that reports this behavior on the aforementioned > chips. > > Some newer Qualcomm chips ship with firmware that actually advertises > PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. > NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is designed for such platforms especially on x86/ACPI which don't advertise Sx states. I see no reason why that doesn't work on ARM platforms as well.
On 28.12.2023 11:28, Sudeep Holla wrote: > On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: >> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for >> entering various stages of suspend, across the SoC. These range from a >> simple WFI to a full-fledged power collapse of the entire chip >> (mostly, anyway). >> >> Some device drivers are curious to know whether "the firmware" (which is >> often assumed to be ACPI) takes care of suspending or resuming the >> platform. Set the flag that reports this behavior on the aforementioned >> chips. >> >> Some newer Qualcomm chips ship with firmware that actually advertises >> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. >> > > NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is > designed for such platforms especially on x86/ACPI which don't advertise > Sx states. I see no reason why that doesn't work on ARM platforms as well. Not sure if I got the message through well, but the bottom line is, on Qualcomm platforms the "idle" states aren't actually just "idle" (read: they're not like S0ix). All but the most shallow ones shut down quite a chunk of the entire SoC, with the lowest ones being essentially S3 with power being cut off from the entire chip, except for the memory rail. Konrad
On Thu, Dec 28, 2023 at 12:47:51PM +0100, Konrad Dybcio wrote: > On 28.12.2023 11:28, Sudeep Holla wrote: > > On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: > >> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for > >> entering various stages of suspend, across the SoC. These range from a > >> simple WFI to a full-fledged power collapse of the entire chip > >> (mostly, anyway). > >> > >> Some device drivers are curious to know whether "the firmware" (which is > >> often assumed to be ACPI) takes care of suspending or resuming the > >> platform. Set the flag that reports this behavior on the aforementioned > >> chips. > >> > >> Some newer Qualcomm chips ship with firmware that actually advertises > >> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. > >> > > > > NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is > > designed for such platforms especially on x86/ACPI which don't advertise > > Sx states. I see no reason why that doesn't work on ARM platforms as well. > > Not sure if I got the message through well, but the bottom line is, on > Qualcomm platforms the "idle" states aren't actually just "idle" (read: > they're not like S0ix). All but the most shallow ones shut down quite a > chunk of the entire SoC, with the lowest ones being essentially S3 with > power being cut off from the entire chip, except for the memory rail. > No I understood that and S2I is exactly what you need. Have you checked if S2I already works as intended on these platforms ? What extra do you achieve with this hack by advertising fake S2R ? S2I will have less latency compared to S2R and the mem_sleep will be automatically set to S2I if S2R is not supported, so no userspace impact as well. So please let us know what this change provide extra over S2I ? Until then my NACK still stands. -- Regards, Sudeep
On 28.12.2023 12:50, Sudeep Holla wrote: > On Thu, Dec 28, 2023 at 12:47:51PM +0100, Konrad Dybcio wrote: >> On 28.12.2023 11:28, Sudeep Holla wrote: >>> On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: >>>> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for >>>> entering various stages of suspend, across the SoC. These range from a >>>> simple WFI to a full-fledged power collapse of the entire chip >>>> (mostly, anyway). >>>> >>>> Some device drivers are curious to know whether "the firmware" (which is >>>> often assumed to be ACPI) takes care of suspending or resuming the >>>> platform. Set the flag that reports this behavior on the aforementioned >>>> chips. >>>> >>>> Some newer Qualcomm chips ship with firmware that actually advertises >>>> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. >>>> >>> >>> NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is >>> designed for such platforms especially on x86/ACPI which don't advertise >>> Sx states. I see no reason why that doesn't work on ARM platforms as well. >> >> Not sure if I got the message through well, but the bottom line is, on >> Qualcomm platforms the "idle" states aren't actually just "idle" (read: >> they're not like S0ix). All but the most shallow ones shut down quite a >> chunk of the entire SoC, with the lowest ones being essentially S3 with >> power being cut off from the entire chip, except for the memory rail. >> > > No I understood that and S2I is exactly what you need. > Have you checked if S2I already works as intended on these platforms ? Yes, simple CPU idling works OOTB and the SoC power collapse only works given the developer doesn't cut corners when bringing up the platform (read: works on some of the ones we support, trying hard to expand that group!) > What extra do you achieve with this hack by advertising fake S2R ? Uh.. unless I misunderstood something, I'm not advertising s2ram.. Quite the opposite, I'm making sure only s2idle is allowed. Admittedly, my mistake, I managed to misname the function which I didn't spot before wrapping this patch up for sending.. > S2I will have less latency compared to S2R and the mem_sleep will be > automatically set to S2I if S2R is not supported, so no userspace impact > as well. Yes, everything that differs them is abstracted in TZ or through the power management coprocessor. > > So please let us know what this change provide extra over S2I ? Until > then my NACK still stands. The main point here is to advertise pm_resume/suspend_via_firmware, which represents that Qualcomm does a lot of not-very-obvious power wire plumbing within their PSCI impl. Konrad
On Thu, Dec 28, 2023 at 01:16:28PM +0100, Konrad Dybcio wrote: > On 28.12.2023 12:50, Sudeep Holla wrote: > > On Thu, Dec 28, 2023 at 12:47:51PM +0100, Konrad Dybcio wrote: > >> On 28.12.2023 11:28, Sudeep Holla wrote: > >>> On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: > >>>> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for > >>>> entering various stages of suspend, across the SoC. These range from a > >>>> simple WFI to a full-fledged power collapse of the entire chip > >>>> (mostly, anyway). > >>>> > >>>> Some device drivers are curious to know whether "the firmware" (which is > >>>> often assumed to be ACPI) takes care of suspending or resuming the > >>>> platform. Set the flag that reports this behavior on the aforementioned > >>>> chips. > >>>> > >>>> Some newer Qualcomm chips ship with firmware that actually advertises > >>>> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. > >>>> > >>> > >>> NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is > >>> designed for such platforms especially on x86/ACPI which don't advertise > >>> Sx states. I see no reason why that doesn't work on ARM platforms as well. > >> > >> Not sure if I got the message through well, but the bottom line is, on > >> Qualcomm platforms the "idle" states aren't actually just "idle" (read: > >> they're not like S0ix). All but the most shallow ones shut down quite a > >> chunk of the entire SoC, with the lowest ones being essentially S3 with > >> power being cut off from the entire chip, except for the memory rail. > >> > > > > No I understood that and S2I is exactly what you need. > > Have you checked if S2I already works as intended on these platforms ? > Yes, simple CPU idling works OOTB and the SoC power collapse only works > given the developer doesn't cut corners when bringing up the platform > (read: works on some of the ones we support, trying hard to expand that > group!) > > > What extra do you achieve with this hack by advertising fake S2R ? > Uh.. unless I misunderstood something, I'm not advertising s2ram.. > Quite the opposite, I'm making sure only s2idle is allowed. > Right, I didn't notice that in suspend_valid_all(), it can be rename suspend_valid_s2i or something. "All" indicates all state is valid. Anyways that is not the main point. IIUC S2I must still work if there is at-least one CPU idle state other than WFI without these changes. Right ? If all these changes is to support S2I wih WFI only, then we can look at some generic solution as there were previous attempts to do something similar on other platforms IIRC.
On 28.12.2023 13:43, Sudeep Holla wrote: > On Thu, Dec 28, 2023 at 01:16:28PM +0100, Konrad Dybcio wrote: >> On 28.12.2023 12:50, Sudeep Holla wrote: >>> On Thu, Dec 28, 2023 at 12:47:51PM +0100, Konrad Dybcio wrote: >>>> On 28.12.2023 11:28, Sudeep Holla wrote: >>>>> On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: >>>>>> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for >>>>>> entering various stages of suspend, across the SoC. These range from a >>>>>> simple WFI to a full-fledged power collapse of the entire chip >>>>>> (mostly, anyway). >>>>>> >>>>>> Some device drivers are curious to know whether "the firmware" (which is >>>>>> often assumed to be ACPI) takes care of suspending or resuming the >>>>>> platform. Set the flag that reports this behavior on the aforementioned >>>>>> chips. >>>>>> >>>>>> Some newer Qualcomm chips ship with firmware that actually advertises >>>>>> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. >>>>>> >>>>> >>>>> NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is >>>>> designed for such platforms especially on x86/ACPI which don't advertise >>>>> Sx states. I see no reason why that doesn't work on ARM platforms as well. >>>> >>>> Not sure if I got the message through well, but the bottom line is, on >>>> Qualcomm platforms the "idle" states aren't actually just "idle" (read: >>>> they're not like S0ix). All but the most shallow ones shut down quite a >>>> chunk of the entire SoC, with the lowest ones being essentially S3 with >>>> power being cut off from the entire chip, except for the memory rail. >>>> >>> >>> No I understood that and S2I is exactly what you need. >>> Have you checked if S2I already works as intended on these platforms ? >> Yes, simple CPU idling works OOTB and the SoC power collapse only works >> given the developer doesn't cut corners when bringing up the platform >> (read: works on some of the ones we support, trying hard to expand that >> group!) >> >>> What extra do you achieve with this hack by advertising fake S2R ? >> Uh.. unless I misunderstood something, I'm not advertising s2ram.. >> Quite the opposite, I'm making sure only s2idle is allowed. >> > > Right, I didn't notice that in suspend_valid_all(), it can be rename > suspend_valid_s2i or something. "All" indicates all state is valid. > > Anyways that is not the main point. IIUC S2I must still work if there is > at-least one CPU idle state other than WFI without these changes. Right ? Yes, and it does > > If all these changes is to support S2I wih WFI only, then we can look at > some generic solution as there were previous attempts to do something > similar on other platforms IIRC. No, I'm just interested in setting the resume/suspend_via_firmware() markers and the PSCI driver seems like a good place for it, be it on all platforms with SYSTEM_SUSPEND and Qualcomm which sneaked equivalent functionality into the CPU_SUSPEND call. Konrad
On Tue, Jan 02, 2024 at 07:17:50PM +0100, Konrad Dybcio wrote: > On 28.12.2023 13:43, Sudeep Holla wrote: > > On Thu, Dec 28, 2023 at 01:16:28PM +0100, Konrad Dybcio wrote: > >> On 28.12.2023 12:50, Sudeep Holla wrote: > >>> On Thu, Dec 28, 2023 at 12:47:51PM +0100, Konrad Dybcio wrote: > >>>> On 28.12.2023 11:28, Sudeep Holla wrote: > >>>>> On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: > >>>>>> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for > >>>>>> entering various stages of suspend, across the SoC. These range from a > >>>>>> simple WFI to a full-fledged power collapse of the entire chip > >>>>>> (mostly, anyway). > >>>>>> > >>>>>> Some device drivers are curious to know whether "the firmware" (which is > >>>>>> often assumed to be ACPI) takes care of suspending or resuming the > >>>>>> platform. Set the flag that reports this behavior on the aforementioned > >>>>>> chips. > >>>>>> > >>>>>> Some newer Qualcomm chips ship with firmware that actually advertises > >>>>>> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. > >>>>>> > >>>>> > >>>>> NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is > >>>>> designed for such platforms especially on x86/ACPI which don't advertise > >>>>> Sx states. I see no reason why that doesn't work on ARM platforms as well. > >>>> > >>>> Not sure if I got the message through well, but the bottom line is, on > >>>> Qualcomm platforms the "idle" states aren't actually just "idle" (read: > >>>> they're not like S0ix). All but the most shallow ones shut down quite a > >>>> chunk of the entire SoC, with the lowest ones being essentially S3 with > >>>> power being cut off from the entire chip, except for the memory rail. > >>>> > >>> > >>> No I understood that and S2I is exactly what you need. > >>> Have you checked if S2I already works as intended on these platforms ? > >> Yes, simple CPU idling works OOTB and the SoC power collapse only works > >> given the developer doesn't cut corners when bringing up the platform > >> (read: works on some of the ones we support, trying hard to expand that > >> group!) > >> > >>> What extra do you achieve with this hack by advertising fake S2R ? > >> Uh.. unless I misunderstood something, I'm not advertising s2ram.. > >> Quite the opposite, I'm making sure only s2idle is allowed. > >> > > > > Right, I didn't notice that in suspend_valid_all(), it can be rename > > suspend_valid_s2i or something. "All" indicates all state is valid. > > > > Anyways that is not the main point. IIUC S2I must still work if there is > > at-least one CPU idle state other than WFI without these changes. Right ? > > Yes, and it does > Thanks for the confirmation. > > > > If all these changes is to support S2I wih WFI only, then we can look at > > some generic solution as there were previous attempts to do something > > similar on other platforms IIRC. > > No, I'm just interested in setting the resume/suspend_via_firmware() > markers and the PSCI driver seems like a good place for it, be it on Agreed and your PATCH 1/2 does that exactly and hence I have acked it already. > all platforms with SYSTEM_SUSPEND and Qualcomm which sneaked equivalent > functionality into the CPU_SUSPEND call. > But I don't like the Qualcomm specific changes. -- Regards, Sudeep
On 3.01.2024 10:44, Sudeep Holla wrote: > On Tue, Jan 02, 2024 at 07:17:50PM +0100, Konrad Dybcio wrote: >> On 28.12.2023 13:43, Sudeep Holla wrote: >>> On Thu, Dec 28, 2023 at 01:16:28PM +0100, Konrad Dybcio wrote: >>>> On 28.12.2023 12:50, Sudeep Holla wrote: >>>>> On Thu, Dec 28, 2023 at 12:47:51PM +0100, Konrad Dybcio wrote: >>>>>> On 28.12.2023 11:28, Sudeep Holla wrote: >>>>>>> On Wed, Dec 27, 2023 at 11:15:31PM +0100, Konrad Dybcio wrote: >>>>>>>> Most Qualcomm platforms implementing PSCI (ab)use CPU_SUSPEND for >>>>>>>> entering various stages of suspend, across the SoC. These range from a >>>>>>>> simple WFI to a full-fledged power collapse of the entire chip >>>>>>>> (mostly, anyway). >>>>>>>> >>>>>>>> Some device drivers are curious to know whether "the firmware" (which is >>>>>>>> often assumed to be ACPI) takes care of suspending or resuming the >>>>>>>> platform. Set the flag that reports this behavior on the aforementioned >>>>>>>> chips. >>>>>>>> >>>>>>>> Some newer Qualcomm chips ship with firmware that actually advertises >>>>>>>> PSCI SYSTEM_SUSPEND, so the compatible list should only grow slightly. >>>>>>>> >>>>>>> >>>>>>> NACK, just use suspend-to-idle if SYSTEM_SUSPEND is not advertised. It is >>>>>>> designed for such platforms especially on x86/ACPI which don't advertise >>>>>>> Sx states. I see no reason why that doesn't work on ARM platforms as well. >>>>>> >>>>>> Not sure if I got the message through well, but the bottom line is, on >>>>>> Qualcomm platforms the "idle" states aren't actually just "idle" (read: >>>>>> they're not like S0ix). All but the most shallow ones shut down quite a >>>>>> chunk of the entire SoC, with the lowest ones being essentially S3 with >>>>>> power being cut off from the entire chip, except for the memory rail. >>>>>> >>>>> >>>>> No I understood that and S2I is exactly what you need. >>>>> Have you checked if S2I already works as intended on these platforms ? >>>> Yes, simple CPU idling works OOTB and the SoC power collapse only works >>>> given the developer doesn't cut corners when bringing up the platform >>>> (read: works on some of the ones we support, trying hard to expand that >>>> group!) >>>> >>>>> What extra do you achieve with this hack by advertising fake S2R ? >>>> Uh.. unless I misunderstood something, I'm not advertising s2ram.. >>>> Quite the opposite, I'm making sure only s2idle is allowed. >>>> >>> >>> Right, I didn't notice that in suspend_valid_all(), it can be rename >>> suspend_valid_s2i or something. "All" indicates all state is valid. >>> >>> Anyways that is not the main point. IIUC S2I must still work if there is >>> at-least one CPU idle state other than WFI without these changes. Right ? >> >> Yes, and it does >> > > Thanks for the confirmation. > >>> >>> If all these changes is to support S2I wih WFI only, then we can look at >>> some generic solution as there were previous attempts to do something >>> similar on other platforms IIRC. >> >> No, I'm just interested in setting the resume/suspend_via_firmware() >> markers and the PSCI driver seems like a good place for it, be it on > > Agreed and your PATCH 1/2 does that exactly and hence I have acked it > already. > >> all platforms with SYSTEM_SUSPEND and Qualcomm which sneaked equivalent >> functionality into the CPU_SUSPEND call. >> > > But I don't like the Qualcomm specific changes. Is that because of the matching table, or due to the slightly more convoluted way of suspending the platform through CPU_SUSPEND? If the former, I can think of other solutions. If the latter, I'm open to keep convincing you :D There are probably things I skipped over when explaining how it's wired up.. Konrad
On Mon, Jan 08, 2024 at 04:47:05PM +0100, Konrad Dybcio wrote: > On 3.01.2024 10:44, Sudeep Holla wrote: > > > > But I don't like the Qualcomm specific changes. > > Is that because of the matching table, or due to the slightly more > convoluted way of suspending the platform through CPU_SUSPEND? > I would say both. I don't like this to be Qualcomm platform specific feature. Also advertising absence of system suspend on those platforms as presence of some special system suspend. It simply is not system suspend. The sysfs hides/abstracts and provides s2idle even when user request s2r on such platforms. We should advertise it as s2idle. I would do something like below patch, just a rough idea, not compiled or tested. This avoids any misleading or confusion IMO. However I am interested in knowing which are these drivers that rely on the pm_suspend_global_flags ? The reason I ask the x86 ACPI doesn't set the flags for s2idle. Also the core code explicitly calls pm_set_suspend_no_platform() in suspend_devices_and_enter(). What you want conflicts with both the above observations. I would like to involve Rafael and check what is the correct/expected way to use those flags. Regards, Sudeep --->8 diff --git i/drivers/firmware/psci/psci.c w/drivers/firmware/psci/psci.c index 0e622aa5ad58..b2559ae7668a 100644 --- i/drivers/firmware/psci/psci.c +++ w/drivers/firmware/psci/psci.c @@ -505,26 +505,42 @@ static int psci_system_suspend(unsigned long unused) return psci_to_linux_errno(err); } -static int psci_system_suspend_enter(suspend_state_t state) +static int psci_system_idle_prepare_late(void) { pm_set_resume_via_firmware(); + return 0; +} +#define psci_system_system_prepare_late psci_system_idle_prepare_late + +static int psci_system_suspend_enter(suspend_state_t state) +{ + psci_system_system_prepare_late(); return cpu_suspend(0, psci_system_suspend); } -static int psci_system_suspend_begin(suspend_state_t state) +static int psci_system_idle_begin(void) { pm_set_suspend_via_firmware(); - return 0; } +static int psci_system_suspend_begin(suspend_state_t state) +{ + return psci_system_idle_begin(); +} + static const struct platform_suspend_ops psci_suspend_ops = { .valid = suspend_valid_only_mem, .enter = psci_system_suspend_enter, .begin = psci_system_suspend_begin, }; +static const struct platform_s2idle_ops psci_s2idle_ops = { + .begin = psci_system_idle_begin, + .prepare_late = psci_system_idle_prepare_late, +}; + static void __init psci_init_system_reset2(void) { int ret; @@ -546,6 +562,8 @@ static void __init psci_init_system_suspend(void) if (ret != PSCI_RET_NOT_SUPPORTED) suspend_set_ops(&psci_suspend_ops); + + s2idle_set_ops(&psci_s2idle_ops); } static void __init psci_init_cpu_suspend(void)
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index 1bcb752977b1..ddfdc14e2423 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c @@ -523,6 +523,30 @@ static const struct platform_suspend_ops psci_suspend_ops = { .begin = psci_system_suspend_begin, }; +/* + * Some PSCI implementations (particularly on Qualcomm platforms) silently + * sneak in SoC-wide power collapse through CPU_SUSPEND, while advertising no + * support for SYSTEM_SUSPEND. + */ + +static int psci_cpu_as_system_suspend_enter(suspend_state_t state) +{ + pm_set_resume_via_firmware(); + + return 0; +} + +static int suspend_valid_all(suspend_state_t state) +{ + return state == PM_SUSPEND_TO_IDLE; +} + +static const struct platform_suspend_ops psci_cpu_as_system_suspend_ops = { + .valid = suspend_valid_all, + .enter = psci_cpu_as_system_suspend_enter, + .begin = psci_system_suspend_begin, +}; + static void __init psci_init_system_reset2(void) { int ret; @@ -533,8 +557,33 @@ static void __init psci_init_system_reset2(void) psci_system_reset2_supported = true; } + +static const struct of_device_id cpu_as_system_suspend_match_table[] = { + { .compatible = "qcom,msm8998" }, + { .compatible = "qcom,qcm2290" }, + { .compatible = "qcom,sa8775p" }, + { .compatible = "qcom,sc7180" }, + { .compatible = "qcom,sc7280" }, + { .compatible = "qcom,sc8180x" }, + { .compatible = "qcom,sc8280xp" }, + { .compatible = "qcom,sdm630" }, + { .compatible = "qcom,sdm670" }, + { .compatible = "qcom,sdm845" }, + { .compatible = "qcom,sm4450" }, + { .compatible = "qcom,sm6115" }, + { .compatible = "qcom,sm6125" }, + { .compatible = "qcom,sm6350" }, + { .compatible = "qcom,sm6375" }, + { .compatible = "qcom,sm7125" }, + { .compatible = "qcom,sm8150" }, + { .compatible = "qcom,sm8250" }, + { .compatible = "qcom,sm8350" }, + { } +}; + static void __init psci_init_system_suspend(void) { + struct device_node *np = of_find_node_by_path("/"); int ret; if (!IS_ENABLED(CONFIG_SUSPEND)) @@ -542,8 +591,14 @@ static void __init psci_init_system_suspend(void) ret = psci_features(PSCI_FN_NATIVE(1_0, SYSTEM_SUSPEND)); - if (ret != PSCI_RET_NOT_SUPPORTED) + if (ret == PSCI_RET_NOT_SUPPORTED) { + if (of_match_node(cpu_as_system_suspend_match_table, np)) + suspend_set_ops(&psci_cpu_as_system_suspend_ops); + } else { suspend_set_ops(&psci_suspend_ops); + } + + of_node_put(np); } static void __init psci_init_cpu_suspend(void)