From patchwork Wed Nov 29 15:31:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Richard X-Patchwork-Id: 748272 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="B+04Pvk3" Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::224]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A99B1D48; Wed, 29 Nov 2023 07:31:25 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id C7635E0004; Wed, 29 Nov 2023 15:31:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1701271884; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QI1TyzlXaMDB+nhKVeoMHOxLQU8QDlDCw/eJpwfHUjI=; b=B+04Pvk3bWmTvMKPRwosQPKO0bPMfT8nIYKro4x6w5StmHTn4ntp35qumfbEmEr1iZUFvY h5vd2lx1Zu/KXq7I1HA6Svd1D8ClwkQzAwQqywyRs6HtxmBhOuq9HzTD+NKrs44JpoWvuw VHRg8plyHlX+LFUItkfkhsHzfg4vpwM8PfCvcrdrTsXreunjIm8cyH+AnsJW1ZwL0MK0KB r0EjUi5bX7UQ1s8CqLH9z99bs2+qnDt7eLd45H3/eLWPQ18er8GjsSPAiysHVatAko5t7V 3TbKN29vILU+zZ12cMiF7FB7eNV+Q1gav41vgI+AS112rPbwCGOV6ckr5sfFiQ== From: Thomas Richard Date: Wed, 29 Nov 2023 16:31:17 +0100 Subject: [PATCH 1/5] dt-bindings: arm: keystone: add ti,j7200-sci compatible Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231129-j7200-tisci-s2r-v1-1-c1d5964ed574@bootlin.com> References: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> In-Reply-To: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> To: Nishanth Menon , Tero Kristo , Santosh Shilimkar , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vignesh Raghavendra Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, u-kumar1@ti.com, Thomas Richard X-Mailer: b4 0.12.0 X-GND-Sasl: thomas.richard@bootlin.com On j7200, during suspend to ram the soc is powered-off. At resume requested irqs shall be restored which is a different behavior from other platforms. Signed-off-by: Thomas Richard --- Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml b/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml index c24ad0968f3e..53d9c58dcd70 100644 --- a/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml +++ b/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml @@ -40,6 +40,8 @@ properties: - description: System controller on TI AM654 SoC items: - const: ti,am654-sci + - description: System controller on TI J7200 SOC + - const: ti,j7200-sci reg-names: description: | From patchwork Wed Nov 29 15:31:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Richard X-Patchwork-Id: 748271 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="NvRyz5oV" Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::224]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 47225D46; Wed, 29 Nov 2023 07:31:26 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 6066EE0011; Wed, 29 Nov 2023 15:31:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1701271884; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+cbJLlFkfaPpJj8eq2H7GH+mfMR2CF2wpb8mSuVlsv0=; b=NvRyz5oV+vJAoMD+AzwVa0Pd3fnr+0xseEL8Idc6yMEkfYblEjF1tnKQk8dZ9Zsnw3tu2k MsWb8UYvtX+4Oa54PdnY5Jo7iNPLv7uDa/6nQl25VeYsqNOzLAufD6dAo1itmaYp9PXDMz wkPB5GTCnLIsRV5X9mWxzLAUCm7pLqspV9Weuu7Ltpn4OHxj+PUbYookW9YM9LcNU/VOXt Yuq1JzI9DDXHDxWMkVfim4EgxX+SBRzKGBAT0uqghV7frsfBGBsWPQT0UmetjjrtsYRUuK KW3G8peHoHsWh4AdoVeR0OqBPvurU6pCrjl4C/hZmDyfTnAA/9PFsOPv+rL2aA== From: Thomas Richard Date: Wed, 29 Nov 2023 16:31:18 +0100 Subject: [PATCH 2/5] firmware: ti_sci: add suspend/resume support for irqs Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231129-j7200-tisci-s2r-v1-2-c1d5964ed574@bootlin.com> References: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> In-Reply-To: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> To: Nishanth Menon , Tero Kristo , Santosh Shilimkar , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vignesh Raghavendra Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, u-kumar1@ti.com, Thomas Richard X-Mailer: b4 0.12.0 X-GND-Sasl: thomas.richard@bootlin.com On j7200, during suspend to ram, the SoC is powered-off. The irqs configuration is lost, so it shall be restored at resume. The ti-sci has an internal list of irqs updated at each set/free. All irqs in this list are restored at resume. Signed-off-by: Thomas Richard --- drivers/firmware/ti_sci.c | 155 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 147 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c index 7041befc756a..c26ec86a5ff2 100644 --- a/drivers/firmware/ti_sci.c +++ b/drivers/firmware/ti_sci.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "ti_sci.h" @@ -75,12 +76,24 @@ struct ti_sci_xfers_info { * @max_msgs: Maximum number of messages that can be pending * simultaneously in the system * @max_msg_size: Maximum size of data per message that can be handled. + * @restore_irqs: Set to true if allocated irqs shall be restored at resume */ struct ti_sci_desc { u8 default_host_id; int max_rx_timeout_ms; int max_msgs; int max_msg_size; + bool restore_irqs; +}; + +/** + * struct ti_sci_irq - Description of allocated irqs + * @list: List head + * @desc: Description of the irq + */ +struct ti_sci_irq { + struct list_head list; + struct ti_sci_msg_req_manage_irq desc; }; /** @@ -97,6 +110,7 @@ struct ti_sci_desc { * @chan_tx: Transmit mailbox channel * @chan_rx: Receive mailbox channel * @minfo: Message info + * @irqs: List of allocated irqs * @node: list head * @host_id: Host ID * @users: Number of users of this instance @@ -114,6 +128,7 @@ struct ti_sci_info { struct mbox_chan *chan_tx; struct mbox_chan *chan_rx; struct ti_sci_xfers_info minfo; + struct ti_sci_irq irqs; struct list_head node; u8 host_id; /* protected by ti_sci_list_mutex */ @@ -1890,6 +1905,29 @@ static int ti_sci_manage_irq(const struct ti_sci_handle *handle, return ret; } +/** + * ti_sci_irqs_equal() - Helper API to compare two irqs (generic headers are not + * compared) + * @irq_a: IRQ A to compare + * @irq_b: IRQ B to compare + * + * Return: true if the two irqs are equal, else false. + */ +static bool ti_sci_irqs_equal(struct ti_sci_msg_req_manage_irq irq_a, + struct ti_sci_msg_req_manage_irq irq_b) +{ + return irq_a.valid_params == irq_b.valid_params && + irq_a.src_id == irq_b.src_id && + irq_a.src_index == irq_b.src_index && + irq_a.dst_id == irq_b.dst_id && + irq_a.dst_host_irq == irq_b.dst_host_irq && + irq_a.ia_id == irq_b.ia_id && + irq_a.vint == irq_b.vint && + irq_a.global_event == irq_b.global_event && + irq_a.vint_status_bit == irq_b.vint_status_bit && + irq_a.secondary_host == irq_b.secondary_host; +} + /** * ti_sci_set_irq() - Helper api to configure the irq route between the * requested source and destination @@ -1913,15 +1951,39 @@ static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params, u16 dst_host_irq, u16 ia_id, u16 vint, u16 global_event, u8 vint_status_bit, u8 s_host) { + struct ti_sci_info *info = handle_to_ti_sci_info(handle); + struct ti_sci_msg_req_manage_irq *desc; + struct ti_sci_irq *irq; + int ret; + pr_debug("%s: IRQ set with valid_params = 0x%x from src = %d, index = %d, to dst = %d, irq = %d,via ia_id = %d, vint = %d, global event = %d,status_bit = %d\n", __func__, valid_params, src_id, src_index, dst_id, dst_host_irq, ia_id, vint, global_event, vint_status_bit); - return ti_sci_manage_irq(handle, valid_params, src_id, src_index, - dst_id, dst_host_irq, ia_id, vint, - global_event, vint_status_bit, s_host, - TI_SCI_MSG_SET_IRQ); + ret = ti_sci_manage_irq(handle, valid_params, src_id, src_index, + dst_id, dst_host_irq, ia_id, vint, + global_event, vint_status_bit, s_host, + TI_SCI_MSG_SET_IRQ); + + if (ret) + return ret; + + irq = kmalloc(sizeof(*irq), GFP_KERNEL); + desc = &irq->desc; + desc->valid_params = valid_params; + desc->src_id = src_id; + desc->src_index = src_index; + desc->dst_id = dst_id; + desc->dst_host_irq = dst_host_irq; + desc->ia_id = ia_id; + desc->vint = vint; + desc->global_event = global_event; + desc->vint_status_bit = vint_status_bit; + desc->secondary_host = s_host; + list_add(&irq->list, &info->irqs.list); + + return ret; } /** @@ -1947,15 +2009,46 @@ static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params, u16 dst_host_irq, u16 ia_id, u16 vint, u16 global_event, u8 vint_status_bit, u8 s_host) { + struct ti_sci_info *info = handle_to_ti_sci_info(handle); + struct ti_sci_msg_req_manage_irq irq_desc; + struct ti_sci_irq *this_irq; + struct list_head *this; + int ret; + pr_debug("%s: IRQ release with valid_params = 0x%x from src = %d, index = %d, to dst = %d, irq = %d,via ia_id = %d, vint = %d, global event = %d,status_bit = %d\n", __func__, valid_params, src_id, src_index, dst_id, dst_host_irq, ia_id, vint, global_event, vint_status_bit); - return ti_sci_manage_irq(handle, valid_params, src_id, src_index, - dst_id, dst_host_irq, ia_id, vint, - global_event, vint_status_bit, s_host, - TI_SCI_MSG_FREE_IRQ); + ret = ti_sci_manage_irq(handle, valid_params, src_id, src_index, + dst_id, dst_host_irq, ia_id, vint, + global_event, vint_status_bit, s_host, + TI_SCI_MSG_FREE_IRQ); + + if (ret) + return ret; + + irq_desc.valid_params = valid_params; + irq_desc.src_id = src_id; + irq_desc.src_index = src_index; + irq_desc.dst_id = dst_id; + irq_desc.dst_host_irq = dst_host_irq; + irq_desc.ia_id = ia_id; + irq_desc.vint = vint; + irq_desc.global_event = global_event; + irq_desc.vint_status_bit = vint_status_bit; + irq_desc.secondary_host = s_host; + + list_for_each(this, &info->irqs.list) { + this_irq = list_entry(this, struct ti_sci_irq, list); + if (ti_sci_irqs_equal(irq_desc, this_irq->desc)) { + list_del(&this_irq->list); + kfree(this_irq); + break; + } + } + + return ret; } /** @@ -3266,6 +3359,37 @@ static int tisci_reboot_handler(struct notifier_block *nb, unsigned long mode, return NOTIFY_BAD; } +static int __maybe_unused ti_sci_resume_noirq(struct device *dev) +{ + const struct ti_sci_desc *desc = device_get_match_data(dev); + struct ti_sci_info *info = dev_get_drvdata(dev); + struct ti_sci_msg_req_manage_irq *irq_desc; + struct ti_sci_irq *irq; + struct list_head *this; + int ret = 0; + + if (!desc->restore_irqs || pm_suspend_target_state != PM_SUSPEND_MEM) + return ret; + + /* restore irqs */ + list_for_each(this, &info->irqs.list) { + irq = list_entry(this, struct ti_sci_irq, list); + irq_desc = &irq->desc; + ret |= ti_sci_manage_irq(&info->handle, irq_desc->valid_params, + irq_desc->src_id, irq_desc->src_index, + irq_desc->dst_id, irq_desc->dst_host_irq, + irq_desc->ia_id, irq_desc->vint, + irq_desc->global_event, irq_desc->vint_status_bit, + irq_desc->secondary_host, TI_SCI_MSG_SET_IRQ); + } + + return ret; +} + +static const struct dev_pm_ops ti_sci_pm_ops = { + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, ti_sci_resume_noirq) +}; + /* Description for K2G */ static const struct ti_sci_desc ti_sci_pmmc_k2g_desc = { .default_host_id = 2, @@ -3286,9 +3410,21 @@ static const struct ti_sci_desc ti_sci_pmmc_am654_desc = { .max_msg_size = 60, }; +/* Description for J7200 */ +static const struct ti_sci_desc ti_sci_pmmc_j7200_desc = { + .default_host_id = 2, + /* Conservative duration */ + .max_rx_timeout_ms = 1000, + /* Limited by MBOX_TX_QUEUE_LEN. K2G can handle up to 128 messages! */ + .max_msgs = 20, + .max_msg_size = 64, + .restore_irqs = true, +}; + static const struct of_device_id ti_sci_of_match[] = { {.compatible = "ti,k2g-sci", .data = &ti_sci_pmmc_k2g_desc}, {.compatible = "ti,am654-sci", .data = &ti_sci_pmmc_am654_desc}, + {.compatible = "ti,j7200-sci", .data = &ti_sci_pmmc_j7200_desc}, { /* Sentinel */ }, }; MODULE_DEVICE_TABLE(of, ti_sci_of_match); @@ -3415,6 +3551,8 @@ static int ti_sci_probe(struct platform_device *pdev) info->handle.version.firmware_revision, info->handle.version.firmware_description); + INIT_LIST_HEAD(&info->irqs.list); + mutex_lock(&ti_sci_list_mutex); list_add_tail(&info->node, &ti_sci_list); mutex_unlock(&ti_sci_list_mutex); @@ -3435,6 +3573,7 @@ static struct platform_driver ti_sci_driver = { .name = "ti-sci", .of_match_table = of_match_ptr(ti_sci_of_match), .suppress_bind_attrs = true, + .pm = &ti_sci_pm_ops, }, }; module_platform_driver(ti_sci_driver); From patchwork Wed Nov 29 15:31:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Richard X-Patchwork-Id: 748760 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Bu0pbZEC" Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BC2DD1BF; Wed, 29 Nov 2023 07:31:26 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 08D42E0013; Wed, 29 Nov 2023 15:31:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1701271885; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1sAANN2EXeewZfaaobbe7muJTHqc8A8qnJjW9NGWcx8=; b=Bu0pbZECI7sSk70SeqV6BFWJPSrmAsRp2m0uGsoD2H1yVZjphF1Z5CqBRErPyFHg6wE696 1Ul3AFqec7rPvpHTuEY+3yMu3rRr/pZvFgwnWQOfjdBbGOOQMaEqImhtUFxQoedH78DEY0 XvOuwOwIAQ6woWiV8jBoXXhOaZwJSYYiBxkH/gYRbECvdKQ+GbieTpf/S4kYl6D3uZ3iFu VgEKVCDhmbyxL8CEhdsPocoVNXCSP1QAhcVvDItFiouwZMmaWag91eRfRnDyYlxdxef5k7 Hcg52H2lyI68tqyjH3HcF2Da06v5jsqs/W4d84OeRDizSH04+hF8a2m5ys+86A== From: Thomas Richard Date: Wed, 29 Nov 2023 16:31:19 +0100 Subject: [PATCH 3/5] arm64: dts: ti: k3-j7200: use ti,j7200-sci compatible Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231129-j7200-tisci-s2r-v1-3-c1d5964ed574@bootlin.com> References: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> In-Reply-To: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> To: Nishanth Menon , Tero Kristo , Santosh Shilimkar , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vignesh Raghavendra Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, u-kumar1@ti.com, Thomas Richard X-Mailer: b4 0.12.0 X-GND-Sasl: thomas.richard@bootlin.com On j7200, suspend to ram poweroff the SOC. This compatible restores irqs at resume. Signed-off-by: Thomas Richard --- arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi b/arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi index 467970fab3a0..d8dc1421e75e 100644 --- a/arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi +++ b/arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi @@ -7,7 +7,7 @@ &cbass_mcu_wakeup { dmsc: system-controller@44083000 { - compatible = "ti,k2g-sci"; + compatible = "ti,j7200-sci", "ti,k2g-sci"; ti,host-id = <12>; mbox-names = "rx", "tx"; From patchwork Wed Nov 29 15:31:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Richard X-Patchwork-Id: 748759 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="BO10/zqY" Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::224]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D02CD6E; Wed, 29 Nov 2023 07:31:27 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 980B2E0012; Wed, 29 Nov 2023 15:31:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1701271886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ONeuGYPs2IMgsIBQkR63Bawpq/9TA/sG6QW/wej75m4=; b=BO10/zqYJKqTCTIriRT9JmPYFVTsWtcA7KqYL7K/1BHkPPd1Xn0YV9WLZVcrbte4oXJ2t5 3yPSNaxWnpuWxT/A/2D2eVv/dIWO5zasx3T0t64s3Yj6FmsKEAE9y5lN+X7hL+eZrye8NF xkapT2x0QOo5fK3O2yfX6sJo38ukCLlKiAf2Y7brH8S8iwQC2oH8hgCG4TXlO4V72aIQsd roI5ybfc38SLcyjs2xBIR2XOgXfHQtbegtMgxm+pcQNyM8DNq2Qa6Yt5psl0+3Qt7agspG vwaOIprv1oFe5JB3R6Mwc5LCySr4SG8rjNzBhjIWr1LzOig16YdDNBxyDGLmLQ== From: Thomas Richard Date: Wed, 29 Nov 2023 16:31:20 +0100 Subject: [PATCH 4/5] firmware: ti-sci: for j7200 before suspend check the reserved memory for lpm Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231129-j7200-tisci-s2r-v1-4-c1d5964ed574@bootlin.com> References: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> In-Reply-To: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> To: Nishanth Menon , Tero Kristo , Santosh Shilimkar , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vignesh Raghavendra Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, u-kumar1@ti.com, Thomas Richard X-Mailer: b4 0.12.0 X-GND-Sasl: thomas.richard@bootlin.com On j7200, a reserved memory region is needed for TF-A to save its context during suspend to ram. In ti-sci suspend, check if the region was defined, if not return an error. Signed-off-by: Thomas Richard --- drivers/firmware/ti_sci.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c index c26ec86a5ff2..deaca17322df 100644 --- a/drivers/firmware/ti_sci.c +++ b/drivers/firmware/ti_sci.c @@ -77,6 +77,8 @@ struct ti_sci_xfers_info { * simultaneously in the system * @max_msg_size: Maximum size of data per message that can be handled. * @restore_irqs: Set to true if allocated irqs shall be restored at resume + * @lpm_region: Set to true if a reserved memory region is needed for suspend to + * ram */ struct ti_sci_desc { u8 default_host_id; @@ -84,6 +86,7 @@ struct ti_sci_desc { int max_msgs; int max_msg_size; bool restore_irqs; + bool lpm_region; }; /** @@ -3359,6 +3362,32 @@ static int tisci_reboot_handler(struct notifier_block *nb, unsigned long mode, return NOTIFY_BAD; } +static bool ti_sci_check_lpm_region(void) +{ + struct device_node *parent, *node; + + parent = of_find_node_by_path("/reserved-memory"); + for_each_child_of_node(parent, node) { + if (of_node_name_eq(node, "lpm-memory")) + return true; + } + + return false; +} + +static int __maybe_unused ti_sci_suspend(struct device *dev) +{ + const struct ti_sci_desc *desc = device_get_match_data(dev); + + if (pm_suspend_target_state == PM_SUSPEND_MEM && + desc->lpm_region && !ti_sci_check_lpm_region()) { + dev_err(dev, "lpm region is required for suspend to ram but is not provided\n"); + return -EINVAL; + } + + return 0; +} + static int __maybe_unused ti_sci_resume_noirq(struct device *dev) { const struct ti_sci_desc *desc = device_get_match_data(dev); @@ -3387,6 +3416,7 @@ static int __maybe_unused ti_sci_resume_noirq(struct device *dev) } static const struct dev_pm_ops ti_sci_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(ti_sci_suspend, NULL) SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, ti_sci_resume_noirq) }; @@ -3419,6 +3449,7 @@ static const struct ti_sci_desc ti_sci_pmmc_j7200_desc = { .max_msgs = 20, .max_msg_size = 64, .restore_irqs = true, + .lpm_region = true, }; static const struct of_device_id ti_sci_of_match[] = { @@ -3546,6 +3577,11 @@ static int ti_sci_probe(struct platform_device *pdev) } } +#ifdef CONFIG_PM_SLEEP + if (desc->lpm_region && !ti_sci_check_lpm_region()) + dev_warn(dev, "lpm region is required for suspend to ram but is not provided\n"); +#endif + dev_info(dev, "ABI: %d.%d (firmware rev 0x%04x '%s')\n", info->handle.version.abi_major, info->handle.version.abi_minor, info->handle.version.firmware_revision, From patchwork Wed Nov 29 15:31:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Richard X-Patchwork-Id: 748270 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="IAr/fyUw" Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DF4E8D6F; Wed, 29 Nov 2023 07:31:27 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 340CDE000A; Wed, 29 Nov 2023 15:31:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1701271886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=n6Se7MgTLDlVPsmnv481wC76UKLsZL7lpNqEMlGZzy0=; b=IAr/fyUww18EgY4GKsHZMYeVTdK+cveCDjQkTAmKmYQJpAQ7V63VUI9w7uU7LnDdhJ++6s dswp7Ew+Zg2jg5CZ6Spu6PDvXR+wXPIizzILSrhOIIRTH348R5T8oNbB0qw9s1hJRTqFdV 2Fy+7NThE7UTzrSf0si2wpYZf8E9T0LpEFGHklB76X5DCOqK1OrBEAMdRHaIW5bIgqCctX oWBJ5zufnZ+o9VcXTxrrzf5pGoqf2q7bRqpUHmsMx/5lsiRj2JVK0yEGnZy+kq8fjMv+Pg i45A8YVchsERATCQniJ8Nm2udPMXvwziQDnejef9/H38zCbu3qbps28oEgypgA== From: Thomas Richard Date: Wed, 29 Nov 2023 16:31:21 +0100 Subject: [PATCH 5/5] arm64: dts: ti: k3-j7200: add reserved memory regions for lpm Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231129-j7200-tisci-s2r-v1-5-c1d5964ed574@bootlin.com> References: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> In-Reply-To: <20231129-j7200-tisci-s2r-v1-0-c1d5964ed574@bootlin.com> To: Nishanth Menon , Tero Kristo , Santosh Shilimkar , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vignesh Raghavendra Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, u-kumar1@ti.com, Thomas Richard X-Mailer: b4 0.12.0 X-GND-Sasl: thomas.richard@bootlin.com Two memory regions are reserved for suspend to ram on j7200. One is dedicated to TF-A, it uses this region to save its context during suspend. The second region is for R5 SPL, which uses it for its stacks and to store some firmware images. These regions are reserved from the linux point of view to avoid any memory corruption. Signed-off-by: Thomas Richard --- arch/arm64/boot/dts/ti/k3-j7200-som-p0.dtsi | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arch/arm64/boot/dts/ti/k3-j7200-som-p0.dtsi b/arch/arm64/boot/dts/ti/k3-j7200-som-p0.dtsi index 5a300d4c8ba0..dc8c9c3e8443 100644 --- a/arch/arm64/boot/dts/ti/k3-j7200-som-p0.dtsi +++ b/arch/arm64/boot/dts/ti/k3-j7200-som-p0.dtsi @@ -79,6 +79,16 @@ rtos_ipc_memory_region: ipc-memories@a4000000 { alignment = <0x1000>; no-map; }; + + lpm_r5_spl_ctx_ddr: lpm-memory@a5000000 { + reg = <0x00 0xa5000000 0x00 0x1000000>; + no-map; + }; + + lpm_bl31_ctx_ddr: lpm-memory@a6000000 { + reg = <0x00 0xa6000000 0x00 0x20000>; + no-map; + }; }; };