Received: by 2002:a05:6358:700f:b0:131:369:b2a3 with SMTP id 15csp2425898rwo; Thu, 3 Aug 2023 09:10:29 -0700 (PDT) X-Google-Smtp-Source: APBJJlGBkXGrgQE9Y3vdIp6O7GDLkyOm2gzWHQqhvVO51D5J1z6tcBXRQ5DUmiLj0D2SV+/DSDfi X-Received: by 2002:a05:6512:2253:b0:4fe:711:2931 with SMTP id i19-20020a056512225300b004fe07112931mr8046558lfu.22.1691079028938; Thu, 03 Aug 2023 09:10:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691079028; cv=none; d=google.com; s=arc-20160816; b=0bTzTVuAAE34fayIqot0mdS3vtzmROcBUxgSgsWARBV0nRFhkW6x9iAlbD6Bp1AM30 lH2agBtsR8VhwMoJl4nnEB2PWQzwXYBRnDsaUwsNDkfPU2oqfzmRXoqS3qDwXFg6JEN4 xihc1QJDUUc7/ClA6XUAnBHh2Mj4VMSYpJePga4vgtDvrf+MjCZphg/Ae8MCrZJdGQED D3mjwtCsnaZqBIpOcDgum4kx35CgSUWX6MV31xQ4Ojb9tT6gfsciDhVLGs9FgpBImPgB k22UbuNveHofB75OOKUV5Yqo7RK/RzFgxyx9trYjZ+ODgfxCYUZxjFmZO2QAp7jsZFI/ ACMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=LhYsU3q8mRV8TUY+gqhkvbn+QcMk85On0sbXMyClQnU=; fh=FxmqgTko71eRjJTP40SRNoxQTlH8swMFhtq4lqQD5Z8=; b=M3huwyKJuiC5PY8u/zl+Uw8nx3nUWFc/w4/dS+RQrARyIRyZb8ChvQ2+DU7c1euwvC YW+XASiJacN82YRchmsJnLQko12rrYup1ZRsgCUlZvgnymYprNHQ3ohaxm8XFVnRgiIN 2pteOUGK7cQDn9P8ctcKOaKYJUE5WJpW2VtiKTfk5b72vPafpyjVvZqSWw2k9Y5OAgvs FzjmOJhtw5px2b3NU5V8IKqU/zvMGGOcSJmj56JL5SO4rA92whqotFSv6IRHkY2KnEIQ GZXzYhCkkPDbAfsnxIhRA0p1ZRn9khcs0080PJjuza6VxKZG4C7yJWVBFRI3e+Vv9WZx rjCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=b+pX4Y73; 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=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a7-20020aa7d747000000b005223cf584b9si1375393eds.482.2023.08.03.09.10.04; Thu, 03 Aug 2023 09:10:28 -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=@ti.com header.s=ti-com-17Q1 header.b=b+pX4Y73; 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=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236955AbjHCPO6 (ORCPT + 99 others); Thu, 3 Aug 2023 11:14:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236935AbjHCPOv (ORCPT ); Thu, 3 Aug 2023 11:14:51 -0400 Received: from lelv0143.ext.ti.com (lelv0143.ext.ti.com [198.47.23.248]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50DA035BE; Thu, 3 Aug 2023 08:14:28 -0700 (PDT) Received: from lelv0265.itg.ti.com ([10.180.67.224]) by lelv0143.ext.ti.com (8.15.2/8.15.2) with ESMTP id 373FE5OD016664; Thu, 3 Aug 2023 10:14:05 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1691075645; bh=LhYsU3q8mRV8TUY+gqhkvbn+QcMk85On0sbXMyClQnU=; h=Date:Subject:To:CC:References:From:In-Reply-To; b=b+pX4Y73S5+LZXbLEPkjT3a5HHLRlcKgvGYFSoiFbF3eEnqLrXmK/Yf105HYcx/2m UCz90werJNzjbO7KwjM+3+hD+irk+3Vse79JO6BmSLjzUzYzD/n7bVYkF2y+oqbtPt 6+BoRqBmlTicgYBF4rYxPp3rrElSdUBHddqhRfog= Received: from DFLE106.ent.ti.com (dfle106.ent.ti.com [10.64.6.27]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 373FE5QI031591 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 3 Aug 2023 10:14:05 -0500 Received: from DFLE109.ent.ti.com (10.64.6.30) by DFLE106.ent.ti.com (10.64.6.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23; Thu, 3 Aug 2023 10:14:04 -0500 Received: from lelv0327.itg.ti.com (10.180.67.183) by DFLE109.ent.ti.com (10.64.6.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23 via Frontend Transport; Thu, 3 Aug 2023 10:14:04 -0500 Received: from [10.250.36.243] (ileaxei01-snat.itg.ti.com [10.180.69.5]) by lelv0327.itg.ti.com (8.15.2/8.15.2) with ESMTP id 373FE3ib102917; Thu, 3 Aug 2023 10:14:03 -0500 Message-ID: <930ffb16-f212-0bcb-4713-2acc138c4035@ti.com> Date: Thu, 3 Aug 2023 10:14:03 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH V6 1/4] firmware: ti_sci: Introduce Power Management Ops To: Dhruva Gole , Nishanth Menon , Tero Kristo , Santosh Shilimkar CC: , , , Viresh Kumar , "Praneeth Bajjuri" , Tony Lindgren , Dave Gerlach , Vibhore Vardhan , Georgi Vlaev , Roger Quadros References: <20230803064247.503036-1-d-gole@ti.com> <20230803064247.503036-2-d-gole@ti.com> Content-Language: en-US From: Andrew Davis In-Reply-To: <20230803064247.503036-2-d-gole@ti.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 8/3/23 1:42 AM, Dhruva Gole wrote: > From: Dave Gerlach > > Introduce power management ops supported by the TISCI > Low Power Mode API [1]. These messages are currently > supported only on AM62x platforms. > > 1) TISCI_MSG_PREPARE_SLEEP > Prepare the SOC for entering into a low power mode and > provide details to firmware about the state being entered. > > 2) TISCI_MSG_LPM_WAKE_REASON > Get which wake up source woke the SoC from Low Power Mode. > The wake up source IDs will be common for all K3 platforms. > > 3) TISCI_MSG_SET_IO_ISOLATION > Control the IO isolation for Low Power Mode. > > [1] https://software-dl.ti.com/tisci/esd/latest/2_tisci_msgs/pm/lpm.html > > Signed-off-by: Dave Gerlach > Signed-off-by: Vibhore Vardhan > [g-vlaev@ti.com: LPM_WAKE_REASON and IO_ISOLATION support] > Signed-off-by: Georgi Vlaev > Tested-by: Roger Quadros > --- > drivers/firmware/ti_sci.c | 175 +++++++++++++++++++++++++ > drivers/firmware/ti_sci.h | 64 ++++++++- > include/linux/soc/ti/ti_sci_protocol.h | 44 +++++++ > 3 files changed, 282 insertions(+), 1 deletion(-) > > diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c > index 26a37f47f4ca..31a71613ca54 100644 > --- a/drivers/firmware/ti_sci.c > +++ b/drivers/firmware/ti_sci.c > @@ -1664,6 +1664,176 @@ static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle, > return ret; > } > > +/** > + * ti_sci_cmd_prepare_sleep() - Prepare system for system suspend > + * @handle: pointer to TI SCI handle > + * @mode: Device identifier > + * @ctx_lo: Low part of address for context save > + * @ctx_hi: High part of address for context save > + * @debug_flags: Debug flags to pass to firmware > + * > + * Return: 0 if all went well, else returns appropriate error value. > + */ > +static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode, > + u32 ctx_lo, u32 ctx_hi, u32 debug_flags) > +{ > + struct ti_sci_info *info; > + struct ti_sci_msg_req_prepare_sleep *req; > + struct ti_sci_msg_hdr *resp; > + struct ti_sci_xfer *xfer; > + struct device *dev; > + int ret = 0; > + > + if (IS_ERR(handle)) > + return PTR_ERR(handle); > + if (!handle) > + return -EINVAL; > + > + info = handle_to_ti_sci_info(handle); > + dev = info->dev; > + > + xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_PREPARE_SLEEP, > + TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, > + sizeof(*req), sizeof(*resp)); > + if (IS_ERR(xfer)) { > + ret = PTR_ERR(xfer); > + dev_err(dev, "Message alloc failed(%d)\n", ret); > + return ret; > + } > + > + req = (struct ti_sci_msg_req_prepare_sleep *)xfer->xfer_buf; > + req->mode = mode; > + req->ctx_lo = ctx_lo; > + req->ctx_hi = ctx_hi; > + req->debug_flags = debug_flags; > + > + ret = ti_sci_do_xfer(info, xfer); > + if (ret) { > + dev_err(dev, "Mbox send fail %d\n", ret); > + goto fail; > + } > + > + resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf; > + > + ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV; > + > +fail: > + ti_sci_put_one_xfer(&info->minfo, xfer); > + > + return ret; > +} > + > +/** > + * ti_sci_msg_cmd_lpm_wake_reason() - Get the wakeup source from LPM > + * @handle: Pointer to TI SCI handle > + * @source: The wakeup source that woke the SoC from LPM > + * @timestamp: Timestamp of the wakeup event > + * > + * Return: 0 if all went well, else returns appropriate error value. > + */ > +static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle, > + u32 *source, u64 *timestamp) > +{ > + struct ti_sci_info *info; > + struct ti_sci_xfer *xfer; > + struct ti_sci_msg_resp_lpm_wake_reason *resp; > + struct device *dev; > + int ret = 0; > + > + if (IS_ERR(handle)) > + return PTR_ERR(handle); > + if (!handle) > + return -EINVAL; > + > + info = handle_to_ti_sci_info(handle); > + dev = info->dev; > + > + xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_LPM_WAKE_REASON, > + TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, > + sizeof(struct ti_sci_msg_hdr), > + sizeof(*resp)); > + if (IS_ERR(xfer)) { > + ret = PTR_ERR(xfer); > + dev_err(dev, "Message alloc failed(%d)\n", ret); > + return ret; > + } > + > + ret = ti_sci_do_xfer(info, xfer); > + if (ret) { > + dev_err(dev, "Mbox send fail %d\n", ret); > + goto fail; > + } > + > + resp = (struct ti_sci_msg_resp_lpm_wake_reason *)xfer->xfer_buf; > + > + if (!ti_sci_is_response_ack(resp)) { > + ret = -ENODEV; > + goto fail; > + } > + > + if (source) > + *source = resp->wake_source; > + if (timestamp) > + *timestamp = resp->wake_timestamp; > + > +fail: > + ti_sci_put_one_xfer(&info->minfo, xfer); > + > + return ret; > +} > + > +/** > + * ti_sci_cmd_set_io_isolation() - Enable IO isolation in LPM > + * @handle: Pointer to TI SCI handle > + * @state: The desired state of the IO isolation > + * > + * Return: 0 if all went well, else returns appropriate error value. > + */ > +static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle, > + u8 state) > +{ > + struct ti_sci_info *info; > + struct ti_sci_msg_req_set_io_isolation *req; > + struct ti_sci_msg_hdr *resp; > + struct ti_sci_xfer *xfer; > + struct device *dev; > + int ret = 0; > + > + if (IS_ERR(handle)) > + return PTR_ERR(handle); > + if (!handle) > + return -EINVAL; > + > + info = handle_to_ti_sci_info(handle); > + dev = info->dev; > + > + xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_SET_IO_ISOLATION, > + TI_SCI_FLAG_REQ_ACK_ON_PROCESSED, > + sizeof(*req), sizeof(*resp)); > + if (IS_ERR(xfer)) { > + ret = PTR_ERR(xfer); > + dev_err(dev, "Message alloc failed(%d)\n", ret); > + return ret; > + } > + req = (struct ti_sci_msg_req_set_io_isolation *)xfer->xfer_buf; > + req->state = state; > + > + ret = ti_sci_do_xfer(info, xfer); > + if (ret) { > + dev_err(dev, "Mbox send fail %d\n", ret); > + goto fail; > + } > + > + resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf; > + > + ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV; > + > +fail: > + ti_sci_put_one_xfer(&info->minfo, xfer); > + > + return ret; > +} > + > static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle) > { > struct ti_sci_info *info; > @@ -2806,6 +2976,7 @@ static void ti_sci_setup_ops(struct ti_sci_info *info) > struct ti_sci_core_ops *core_ops = &ops->core_ops; > struct ti_sci_dev_ops *dops = &ops->dev_ops; > struct ti_sci_clk_ops *cops = &ops->clk_ops; > + struct ti_sci_pm_ops *pmops = &ops->pm_ops; > struct ti_sci_rm_core_ops *rm_core_ops = &ops->rm_core_ops; > struct ti_sci_rm_irq_ops *iops = &ops->rm_irq_ops; > struct ti_sci_rm_ringacc_ops *rops = &ops->rm_ring_ops; > @@ -2845,6 +3016,10 @@ static void ti_sci_setup_ops(struct ti_sci_info *info) > cops->set_freq = ti_sci_cmd_clk_set_freq; > cops->get_freq = ti_sci_cmd_clk_get_freq; > > + pmops->prepare_sleep = ti_sci_cmd_prepare_sleep; > + pmops->lpm_wake_reason = ti_sci_msg_cmd_lpm_wake_reason; > + pmops->set_io_isolation = ti_sci_cmd_set_io_isolation; > + > rm_core_ops->get_range = ti_sci_cmd_get_resource_range; > rm_core_ops->get_range_from_shost = > ti_sci_cmd_get_resource_range_from_shost; > diff --git a/drivers/firmware/ti_sci.h b/drivers/firmware/ti_sci.h > index ef3a8214d002..e4bfe146c43d 100644 > --- a/drivers/firmware/ti_sci.h > +++ b/drivers/firmware/ti_sci.h > @@ -6,7 +6,7 @@ > * The system works in a message response protocol > * See: http://processors.wiki.ti.com/index.php/TISCI for details > * > - * Copyright (C) 2015-2016 Texas Instruments Incorporated - https://www.ti.com/ > + * Copyright (C) 2015-2022 Texas Instruments Incorporated - https://www.ti.com/ > */ > > #ifndef __TI_SCI_H > @@ -35,6 +35,11 @@ > #define TI_SCI_MSG_QUERY_CLOCK_FREQ 0x010d > #define TI_SCI_MSG_GET_CLOCK_FREQ 0x010e > > +/* Low Power Mode Requests */ > +#define TI_SCI_MSG_PREPARE_SLEEP 0x0300 > +#define TI_SCI_MSG_LPM_WAKE_REASON 0x0306 > +#define TI_SCI_MSG_SET_IO_ISOLATION 0x0307 > + > /* Resource Management Requests */ > #define TI_SCI_MSG_GET_RESOURCE_RANGE 0x1500 > > @@ -545,6 +550,63 @@ struct ti_sci_msg_resp_get_clock_freq { > u64 freq_hz; > } __packed; > > +#define TISCI_MSG_VALUE_SLEEP_MODE_DEEP_SLEEP 0x0 > +#define TISCI_MSG_VALUE_SLEEP_MODE_MCU_ONLY 0x1 > +#define TISCI_MSG_VALUE_SLEEP_MODE_STANDBY 0x2 Feels like excessive alignment tabs.. > + > +/** > + * struct tisci_msg_prepare_sleep_req - Request for TISCI_MSG_PREPARE_SLEEP. > + * > + * @hdr TISCI header to provide ACK/NAK flags to the host. > + * @mode Low power mode to enter. > + * @ctx_lo Low 32-bits of physical pointer to address to use for context save. > + * @ctx_hi High 32-bits of physical pointer to address to use for context save. > + * @debug_flags Flags that can be set to halt the sequence during suspend or > + * resume to allow JTAG connection and debug. > + * > + * This message is used as the first step of entering a low power mode. It > + * allows configurable information, including which state to enter to be > + * easily shared from the application, as this is a non-secure message and > + * therefore can be sent by anyone. > + */ > +struct ti_sci_msg_req_prepare_sleep { > + struct ti_sci_msg_hdr hdr; > + u8 mode; > + u32 ctx_lo; > + u32 ctx_hi; > + u32 debug_flags; > +} __packed; > + > +/** > + * struct ti_sci_msg_resp_lpm_wake_reason - Response for TI_SCI_MSG_LPM_WAKE_REASON. > + * > + * @hdr: Generic header. > + * @wake_source: The wake up source that woke soc from LPM. > + * @wake_timestamp: Timestamp at which soc woke. > + * > + * Response to a generic message with message type TI_SCI_MSG_LPM_WAKE_REASON, > + * used to query the wake up source from low power mode. > + */ > +struct ti_sci_msg_resp_lpm_wake_reason { > + struct ti_sci_msg_hdr hdr; > + u32 wake_source; > + u64 wake_timestamp; > +} __packed; > + > +/** > + * struct tisci_msg_set_io_isolation_req - Request for TI_SCI_MSG_SET_IO_ISOLATION. > + * > + * @hdr: Generic header > + * @state: The deseared state of the IO isolation. > + * > + * This message is used to enable/disable IO isolation for low power modes. > + * Response is generic ACK / NACK message. > + */ > +struct ti_sci_msg_req_set_io_isolation { > + struct ti_sci_msg_hdr hdr; > + u8 state; > +} __packed; > + > #define TI_SCI_IRQ_SECONDARY_HOST_INVALID 0xff > > /** > diff --git a/include/linux/soc/ti/ti_sci_protocol.h b/include/linux/soc/ti/ti_sci_protocol.h > index bd0d11af76c5..f2d1d74ab8fc 100644 > --- a/include/linux/soc/ti/ti_sci_protocol.h > +++ b/include/linux/soc/ti/ti_sci_protocol.h > @@ -195,6 +195,49 @@ struct ti_sci_clk_ops { > u64 *current_freq); > }; > > +/* TISCI LPM wake up sources */ > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_WKUP_I2C0 0x00 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_WKUP_UART0 0x10 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_MCU_GPIO0 0x20 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_WKUP_ICEMELTER0 0x30 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_WKUP_TIMER0 0x40 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_WKUP_TIMER1 0x41 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_WKUP_RTC0 0x50 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_RESET 0x60 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_USB0 0x70 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_USB1 0x71 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_MAIN_IO 0x80 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_MCU_IO 0x81 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_CAN_IO 0x82 > +#define TISCI_MSG_VALUE_LPM_WAKE_SOURCE_INVALID 0xFF I don't see these used in this series, do you need them? lpm_wake_reason() doesn't seem used either and I'm not sure how you plan to use it, could you detail that? Andrew > + > +/* TISCI LPM IO isolation control values */ > +#define TISCI_MSG_VALUE_IO_ENABLE 1 > +#define TISCI_MSG_VALUE_IO_DISABLE 0 > + > +/** > + * struct ti_sci_pm_ops - Low Power Mode (LPM) control operations > + * @prepare_sleep: Prepare to enter low power mode > + * - mode: Low power mode to enter. > + * - ctx_lo: Low 32-bits of physical address for context save. > + * - ctx_hi: High 32-bits of physical address for context save. > + * - ctx_lo: 'true' if frequency change is desired. > + * - debug_flags: JTAG control flags for debug. > + * @lpm_wake_reason: Get the wake up source that woke the SoC from LPM > + * - source: The wake up source that woke soc from LPM. > + * - timestamp: Timestamp at which soc woke. > + * @set_io_isolation: Enable or disable IO isolation > + * - state: The desired state of the IO isolation. > + */ > +struct ti_sci_pm_ops { > + int (*prepare_sleep)(const struct ti_sci_handle *handle, u8 mode, > + u32 ctx_lo, u32 ctx_hi, u32 flags); > + int (*lpm_wake_reason)(const struct ti_sci_handle *handle, > + u32 *source, u64 *timestamp); > + int (*set_io_isolation)(const struct ti_sci_handle *handle, > + u8 state); > +}; > + > /** > * struct ti_sci_resource_desc - Description of TI SCI resource instance range. > * @start: Start index of the first resource range. > @@ -539,6 +582,7 @@ struct ti_sci_ops { > struct ti_sci_core_ops core_ops; > struct ti_sci_dev_ops dev_ops; > struct ti_sci_clk_ops clk_ops; > + struct ti_sci_pm_ops pm_ops; > struct ti_sci_rm_core_ops rm_core_ops; > struct ti_sci_rm_irq_ops rm_irq_ops; > struct ti_sci_rm_ringacc_ops rm_ring_ops;