From patchwork Thu Aug 1 19:54:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Markus Schneider-Pargmann X-Patchwork-Id: 13750876 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7B751C3DA4A for ; Thu, 1 Aug 2024 19:56:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=9iEVMVSSASUblJN+I5RRNLDh5lLbEMUJopbZEPnk+4E=; b=Luj8yjQ1JCcr87eGbfHjaXpQfL vXTuCsr9MFVOF9Eac1JWLksWIcsQxgOCpfS+y5EWsidVXGDDHNZKYFXcgyaAOB1618r3Csy06MqFm 7k7qF9ZiZGFPinT/E6vCqm3W/Yt/E3XLJBYvSlcfCgwJJ24Qh1xshEJR1/MyHnv3PwhA4owmmmK9Q FFrf8spUYO2Htsc1KRPVxSNqy43oBCNPioMGPynfn78sexHy62bpmtJ5H3U6wIxg6KBxdDIDy+/Qe BclpDe/egUGnccwjegqOQGOeyPxqOdnmXyiN+mt3lxJ8pzAztGH6XtPoBZerFf+SEapzCPvN6d8Sg I5T6Ub4Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZbui-00000006bCq-0AzP; Thu, 01 Aug 2024 19:56:40 +0000 Received: from mail-io1-xd30.google.com ([2607:f8b0:4864:20::d30]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZbst-00000006adS-20lx for linux-arm-kernel@lists.infradead.org; Thu, 01 Aug 2024 19:54:48 +0000 Received: by mail-io1-xd30.google.com with SMTP id ca18e2360f4ac-8111f946f04so304807639f.3 for ; Thu, 01 Aug 2024 12:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1722542086; x=1723146886; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9iEVMVSSASUblJN+I5RRNLDh5lLbEMUJopbZEPnk+4E=; b=1R6u22Cyk5oc9LG874aUACnrDzRSrE/oRCg66osAEGYyFj3pVM23wz5d4BBkbosydK gmxI8EdU+Kkus19E71Ckgp/ufl3ZDJm2mAa4buw+rwdgpB0AvHiJBAoJsrFpkshGxiPq k5e+V2cCVemPHrN1lvtdt/j+8dLl29ebjnDf8tqOvz7S/c3BmItuX/pQvyAbZfwTKjKT gqe6dXuYJAwiwSFr93Us7CXVduHQ16tkKvld+TlQpqcXcCbTOWOYTBeeEGiuLcxojrgM JjtxLO1B86OBYx/mJu+HE0Y8BIsJfFhPuq+TFcN4rFGrYp6Ql2kOKrwKSigYmXN4NsW2 1Lrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722542086; x=1723146886; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9iEVMVSSASUblJN+I5RRNLDh5lLbEMUJopbZEPnk+4E=; b=IWNCG1/ZVK7eSCE9CWa8JGG1wSHILX6KEdp1ftEMwEzREgyOg7Md2YQJd2ehOp4ki8 Vn1Sp4g/rCrZWeTfnRYPo8krEkl6QWLI83PS4k07Q89yYZTdW7i5PMxJwTCOjVKlh685 r3+BkQS2hi2Q+n6R/Zb0DRJEZhAfdzCrFZQahNXkk7zKAyxTcEYIM5v0jDaoc0L4lctP M1pDI/O4B9hf9CvlsNla94z2GlLW37kBPErbuL6yMyhMMpYN5whnLiqac9aePY7+R8Zd tvKYfJtlDtIbEWIrjhrVCs86Jb/dvKBquWfCLDZbD1EU72kRRrM/pMfgsU+SjF2tDdt+ fqUA== X-Forwarded-Encrypted: i=1; AJvYcCX2EDuVy/lHIpxRjn8NmNYAJ8HNmJu7klVPqxfC4XRvvYcxdHZZrIUloLTDM9cFF09A9khYY+m2lnSQusdZ/vXKHA014bTFh9iqC3CsZ6RSMWY3B4s= X-Gm-Message-State: AOJu0YwhYCLIQhY/t10O/xGNXa2KtNDcrrU0e/5PCDVyYHDBUDbg/58S c396O/+ARn6uRbMD2HdYfW1Jn6L+epbS0Sk17sCnAGE8lNSYATA85WfIiiUFhVw= X-Google-Smtp-Source: AGHT+IGlQleoo3d7L5GSbrK0N1Kufp4Xm1KA+uZah8PmzbYcBVnm34gnq52AA8WceFq1OcOmBdCXRg== X-Received: by 2002:a05:6602:341f:b0:81f:8bed:702f with SMTP id ca18e2360f4ac-81fd4353a65mr176313939f.1.1722542086410; Thu, 01 Aug 2024 12:54:46 -0700 (PDT) Received: from blmsp.fritz.box ([2001:4091:a245:8609:c1c4:a4f8:94c8:31f2]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-81fd4d1b7ddsm14395039f.3.2024.08.01.12.54.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Aug 2024 12:54:46 -0700 (PDT) From: Markus Schneider-Pargmann To: Nishanth Menon , Tero Kristo , Santosh Shilimkar Cc: Vibhore Vardhan , Kevin Hilman , Dhruva Gole , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Dave Gerlach , Georgi Vlaev , Markus Schneider-Pargmann Subject: [PATCH v8 3/3] firmware: ti_sci: Add system suspend and resume call Date: Thu, 1 Aug 2024 21:54:22 +0200 Message-ID: <20240801195422.2296347-4-msp@baylibre.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240801195422.2296347-1-msp@baylibre.com> References: <20240801195422.2296347-1-msp@baylibre.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240801_125447_547177_124B487A X-CRM114-Status: GOOD ( 26.27 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Vibhore Vardhan Introduce system suspend call that enables the ti_sci driver to support low power mode when the user space issues a suspend to mem. Also, write a ti_sci_prepare_system_suspend call to be used in the driver suspend handler to allow the system to identify the low power mode being entered and if necessary, send TISCI_MSG_PREPARE_SLEEP with information about the mode being entered. Sysfw version >= 10.00.04 support LPM_DM_MANAGED capability [2], where Device Mgr firmware now manages which low power mode is chosen. Going forward, this is the default configuration supported for TI AM62 family of devices. The state chosen by the DM can be influenced by sending constraints using the new LPM constraint APIs. In case the firmware does not support LPM_DM_MANAGED mode, the mode selection logic can be extended as needed. If no suspend-to-RAM modes are supported, return without taking any action. We're using "pm_suspend_target_state" to map the kernel's target suspend state to SysFW low power mode. Make sure this is available only when CONFIG_SUSPEND is enabled. Suspend has to be split into two parts, ti_sci_suspend() will send the prepare sleep message to prepare suspend. ti_sci_suspend_noirq() sets IO isolation which needs to be done as late as possible to avoid any issues. On resume this has to be done as early as possible. Co-developed-by: Dave Gerlach Signed-off-by: Dave Gerlach Signed-off-by: Georgi Vlaev Signed-off-by: Dhruva Gole Signed-off-by: Kevin Hilman Signed-off-by: Vibhore Vardhan Signed-off-by: Markus Schneider-Pargmann --- drivers/firmware/ti_sci.c | 82 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c index d7a3990a6353..c6544cc12417 100644 --- a/drivers/firmware/ti_sci.c +++ b/drivers/firmware/ti_sci.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -3608,6 +3609,84 @@ static int tisci_reboot_handler(struct sys_off_data *data) return NOTIFY_BAD; } +#ifdef CONFIG_SUSPEND +static int ti_sci_prepare_system_suspend(struct ti_sci_info *info) +{ + u8 mode; + + /* + * Map and validate the target Linux suspend state to TISCI LPM. + * Default is to let Device Manager select the low power mode. + */ + switch (pm_suspend_target_state) { + case PM_SUSPEND_MEM: + if (info->fw_caps & MSG_FLAG_CAPS_LPM_DM_MANAGED) + mode = TISCI_MSG_VALUE_SLEEP_MODE_DM_MANAGED; + else + /* DM Managed is not supported by the firmware. */ + return -EOPNOTSUPP; + break; + default: + /* + * Do not fail if we don't have action to take for a + * specific suspend mode. + */ + return 0; + } + + return ti_sci_cmd_prepare_sleep(&info->handle, mode, 0, 0, 0); +} + +static int ti_sci_suspend(struct device *dev) +{ + struct ti_sci_info *info = dev_get_drvdata(dev); + int ret; + + ret = ti_sci_prepare_system_suspend(info); + if (ret) + return ret; + + return 0; +} + +static int ti_sci_suspend_noirq(struct device *dev) +{ + struct ti_sci_info *info = dev_get_drvdata(dev); + int ret = 0; + + ret = ti_sci_cmd_set_io_isolation(&info->handle, TISCI_MSG_VALUE_IO_ENABLE); + if (ret) + return ret; + dev_dbg(dev, "%s: set isolation: %d\n", __func__, ret); + + return 0; +} + +static int ti_sci_resume_noirq(struct device *dev) +{ + struct ti_sci_info *info = dev_get_drvdata(dev); + u32 source; + u64 time; + int ret = 0; + + ret = ti_sci_cmd_set_io_isolation(&info->handle, TISCI_MSG_VALUE_IO_DISABLE); + if (ret) + return ret; + dev_dbg(dev, "%s: disable isolation: %d\n", __func__, ret); + + ti_sci_msg_cmd_lpm_wake_reason(&info->handle, &source, &time); + dev_info(dev, "%s: wakeup source: 0x%X\n", __func__, source); + + return 0; +} + +static const struct dev_pm_ops ti_sci_pm_ops = { + .suspend = ti_sci_suspend, + .suspend_noirq = ti_sci_suspend_noirq, + .resume_noirq = ti_sci_resume_noirq, +}; +#endif /* CONFIG_SUSPEND */ + /* Description for K2G */ static const struct ti_sci_desc ti_sci_pmmc_k2g_desc = { .default_host_id = 2, @@ -3777,6 +3856,9 @@ static struct platform_driver ti_sci_driver = { .name = "ti-sci", .of_match_table = of_match_ptr(ti_sci_of_match), .suppress_bind_attrs = true, +#ifdef CONFIG_SUSPEND + .pm = &ti_sci_pm_ops, +#endif }, }; module_platform_driver(ti_sci_driver);