| /* |
| * Texas Instruments System Control Interface (TISCI) Protocol |
| * |
| * Communication protocol with TI SCI hardware |
| * 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 - http://www.ti.com/ |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the |
| * distribution. |
| * |
| * Neither the name of Texas Instruments Incorporated nor the names of |
| * its contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| */ |
| |
| #ifndef __TI_SCI_H |
| #define __TI_SCI_H |
| |
| /* Generic Messages */ |
| #define TI_SCI_MSG_ENABLE_WDT 0x0000 |
| #define TI_SCI_MSG_WAKE_RESET 0x0001 |
| #define TI_SCI_MSG_VERSION 0x0002 |
| #define TI_SCI_MSG_WAKE_REASON 0x0003 |
| #define TI_SCI_MSG_GOODBYE 0x0004 |
| |
| /* Device requests */ |
| #define TI_SCI_MSG_SET_DEVICE_STATE 0x0200 |
| #define TI_SCI_MSG_GET_DEVICE_STATE 0x0201 |
| #define TI_SCI_MSG_SET_DEVICE_RESETS 0x0202 |
| |
| /** |
| * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses |
| * @type: Type of messages: One of TI_SCI_MSG* values |
| * @host: Host of the message |
| * @seq: Message identifier indicating a transfer sequence |
| * @flags: Flag for the message |
| */ |
| struct ti_sci_msg_hdr { |
| u16 type; |
| u8 host; |
| u8 seq; |
| #define TI_SCI_MSG_FLAG(val) (1 << (val)) |
| #define TI_SCI_FLAG_REQ_GENERIC_NORESPONSE 0x0 |
| #define TI_SCI_FLAG_REQ_ACK_ON_RECEIVED TI_SCI_MSG_FLAG(0) |
| #define TI_SCI_FLAG_REQ_ACK_ON_PROCESSED TI_SCI_MSG_FLAG(1) |
| #define TI_SCI_FLAG_RESP_GENERIC_NACK 0x0 |
| #define TI_SCI_FLAG_RESP_GENERIC_ACK TI_SCI_MSG_FLAG(1) |
| /* Additional Flags */ |
| u32 flags; |
| } __packed; |
| |
| /** |
| * struct ti_sci_msg_resp_version - Response for a message |
| * @hdr: Generic header |
| * @firmware_description: String describing the firmware |
| * @firmware_revision: Firmware revision |
| * @abi_major: Major version of the ABI that firmware supports |
| * @abi_minor: Minor version of the ABI that firmware supports |
| * |
| * In general, ABI version changes follow the rule that minor version increments |
| * are backward compatible. Major revision changes in ABI may not be |
| * backward compatible. |
| * |
| * Response to a generic message with message type TI_SCI_MSG_VERSION |
| */ |
| struct ti_sci_msg_resp_version { |
| struct ti_sci_msg_hdr hdr; |
| char firmware_description[32]; |
| u16 firmware_revision; |
| u8 abi_major; |
| u8 abi_minor; |
| } __packed; |
| |
| /** |
| * struct ti_sci_msg_req_set_device_state - Set the desired state of the device |
| * @hdr: Generic header |
| * @id: Indicates which device to modify |
| * @reserved: Reserved space in message, must be 0 for backward compatibility |
| * @state: The desired state of the device. |
| * |
| * Certain flags can also be set to alter the device state: |
| * + MSG_FLAG_DEVICE_WAKE_ENABLED - Configure the device to be a wake source. |
| * The meaning of this flag will vary slightly from device to device and from |
| * SoC to SoC but it generally allows the device to wake the SoC out of deep |
| * suspend states. |
| * + MSG_FLAG_DEVICE_RESET_ISO - Enable reset isolation for this device. |
| * + MSG_FLAG_DEVICE_EXCLUSIVE - Claim this device exclusively. When passed |
| * with STATE_RETENTION or STATE_ON, it will claim the device exclusively. |
| * If another host already has this device set to STATE_RETENTION or STATE_ON, |
| * the message will fail. Once successful, other hosts attempting to set |
| * STATE_RETENTION or STATE_ON will fail. |
| * |
| * Request type is TI_SCI_MSG_SET_DEVICE_STATE, responded with a generic |
| * ACK/NACK message. |
| */ |
| struct ti_sci_msg_req_set_device_state { |
| /* Additional hdr->flags options */ |
| #define MSG_FLAG_DEVICE_WAKE_ENABLED TI_SCI_MSG_FLAG(8) |
| #define MSG_FLAG_DEVICE_RESET_ISO TI_SCI_MSG_FLAG(9) |
| #define MSG_FLAG_DEVICE_EXCLUSIVE TI_SCI_MSG_FLAG(10) |
| struct ti_sci_msg_hdr hdr; |
| u32 id; |
| u32 reserved; |
| |
| #define MSG_DEVICE_SW_STATE_AUTO_OFF 0 |
| #define MSG_DEVICE_SW_STATE_RETENTION 1 |
| #define MSG_DEVICE_SW_STATE_ON 2 |
| u8 state; |
| } __packed; |
| |
| /** |
| * struct ti_sci_msg_req_get_device_state - Request to get device. |
| * @hdr: Generic header |
| * @id: Device Identifier |
| * |
| * Request type is TI_SCI_MSG_GET_DEVICE_STATE, responded device state |
| * information |
| */ |
| struct ti_sci_msg_req_get_device_state { |
| struct ti_sci_msg_hdr hdr; |
| u32 id; |
| } __packed; |
| |
| /** |
| * struct ti_sci_msg_resp_get_device_state - Response to get device request. |
| * @hdr: Generic header |
| * @context_loss_count: Indicates how many times the device has lost context. A |
| * driver can use this monotonic counter to determine if the device has |
| * lost context since the last time this message was exchanged. |
| * @resets: Programmed state of the reset lines. |
| * @programmed_state: The state as programmed by set_device. |
| * - Uses the MSG_DEVICE_SW_* macros |
| * @current_state: The actual state of the hardware. |
| * |
| * Response to request TI_SCI_MSG_GET_DEVICE_STATE. |
| */ |
| struct ti_sci_msg_resp_get_device_state { |
| struct ti_sci_msg_hdr hdr; |
| u32 context_loss_count; |
| u32 resets; |
| u8 programmed_state; |
| #define MSG_DEVICE_HW_STATE_OFF 0 |
| #define MSG_DEVICE_HW_STATE_ON 1 |
| #define MSG_DEVICE_HW_STATE_TRANS 2 |
| u8 current_state; |
| } __packed; |
| |
| /** |
| * struct ti_sci_msg_req_set_device_resets - Set the desired resets |
| * configuration of the device |
| * @hdr: Generic header |
| * @id: Indicates which device to modify |
| * @resets: A bit field of resets for the device. The meaning, behavior, |
| * and usage of the reset flags are device specific. 0 for a bit |
| * indicates releasing the reset represented by that bit while 1 |
| * indicates keeping it held. |
| * |
| * Request type is TI_SCI_MSG_SET_DEVICE_RESETS, responded with a generic |
| * ACK/NACK message. |
| */ |
| struct ti_sci_msg_req_set_device_resets { |
| struct ti_sci_msg_hdr hdr; |
| u32 id; |
| u32 resets; |
| } __packed; |
| |
| #endif /* __TI_SCI_H */ |