Commit 1e407f33 authored by Suman Anna's avatar Suman Anna Committed by Santosh Shilimkar

firmware: ti_sci: Add support for processor control

Texas Instrument's System Control Interface (TI-SCI) Message Protocol
is used in Texas Instrument's System on Chip (SoC) such as those
in K3 family AM654 SoC to communicate between various compute
processors with a central system controller entity.

The system controller provides various services including the control
of other compute processors within the SoC. Extend the TI-SCI protocol
support to add various TI-SCI commands to invoke services associated
with power and reset control, and boot vector management of the
various compute processors from the Linux kernel.
Signed-off-by: default avatarSuman Anna <s-anna@ti.com>
Signed-off-by: default avatarTero Kristo <t-kristo@ti.com>
Signed-off-by: default avatarSantosh Shilimkar <santosh.shilimkar@oracle.com>
parent 68608b5e
This diff is collapsed.
......@@ -71,6 +71,14 @@
#define TISCI_MSG_RM_UDMAP_FLOW_GET_CFG 0x1232
#define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_GET_CFG 0x1233
/* Processor Control requests */
#define TI_SCI_MSG_PROC_REQUEST 0xc000
#define TI_SCI_MSG_PROC_RELEASE 0xc001
#define TI_SCI_MSG_PROC_HANDOVER 0xc005
#define TI_SCI_MSG_SET_CONFIG 0xc100
#define TI_SCI_MSG_SET_CTRL 0xc101
#define TI_SCI_MSG_GET_STATUS 0xc400
/**
* struct ti_sci_msg_hdr - Generic Message Header for All messages and responses
* @type: Type of messages: One of TI_SCI_MSG* values
......@@ -1238,4 +1246,131 @@ struct ti_sci_msg_rm_udmap_flow_cfg_req {
u8 rx_ps_location;
} __packed;
/**
* struct ti_sci_msg_req_proc_request - Request a processor
* @hdr: Generic Header
* @processor_id: ID of processor being requested
*
* Request type is TI_SCI_MSG_PROC_REQUEST, response is a generic ACK/NACK
* message.
*/
struct ti_sci_msg_req_proc_request {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
} __packed;
/**
* struct ti_sci_msg_req_proc_release - Release a processor
* @hdr: Generic Header
* @processor_id: ID of processor being released
*
* Request type is TI_SCI_MSG_PROC_RELEASE, response is a generic ACK/NACK
* message.
*/
struct ti_sci_msg_req_proc_release {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
} __packed;
/**
* struct ti_sci_msg_req_proc_handover - Handover a processor to a host
* @hdr: Generic Header
* @processor_id: ID of processor being handed over
* @host_id: Host ID the control needs to be transferred to
*
* Request type is TI_SCI_MSG_PROC_HANDOVER, response is a generic ACK/NACK
* message.
*/
struct ti_sci_msg_req_proc_handover {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
u8 host_id;
} __packed;
/* Boot Vector masks */
#define TI_SCI_ADDR_LOW_MASK GENMASK_ULL(31, 0)
#define TI_SCI_ADDR_HIGH_MASK GENMASK_ULL(63, 32)
#define TI_SCI_ADDR_HIGH_SHIFT 32
/**
* struct ti_sci_msg_req_set_config - Set Processor boot configuration
* @hdr: Generic Header
* @processor_id: ID of processor being configured
* @bootvector_low: Lower 32 bit address (Little Endian) of boot vector
* @bootvector_high: Higher 32 bit address (Little Endian) of boot vector
* @config_flags_set: Optional Processor specific Config Flags to set.
* Setting a bit here implies the corresponding mode
* will be set
* @config_flags_clear: Optional Processor specific Config Flags to clear.
* Setting a bit here implies the corresponding mode
* will be cleared
*
* Request type is TI_SCI_MSG_PROC_HANDOVER, response is a generic ACK/NACK
* message.
*/
struct ti_sci_msg_req_set_config {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
u32 bootvector_low;
u32 bootvector_high;
u32 config_flags_set;
u32 config_flags_clear;
} __packed;
/**
* struct ti_sci_msg_req_set_ctrl - Set Processor boot control flags
* @hdr: Generic Header
* @processor_id: ID of processor being configured
* @control_flags_set: Optional Processor specific Control Flags to set.
* Setting a bit here implies the corresponding mode
* will be set
* @control_flags_clear:Optional Processor specific Control Flags to clear.
* Setting a bit here implies the corresponding mode
* will be cleared
*
* Request type is TI_SCI_MSG_SET_CTRL, response is a generic ACK/NACK
* message.
*/
struct ti_sci_msg_req_set_ctrl {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
u32 control_flags_set;
u32 control_flags_clear;
} __packed;
/**
* struct ti_sci_msg_req_get_status - Processor boot status request
* @hdr: Generic Header
* @processor_id: ID of processor whose status is being requested
*
* Request type is TI_SCI_MSG_GET_STATUS, response is an appropriate
* message, or NACK in case of inability to satisfy request.
*/
struct ti_sci_msg_req_get_status {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
} __packed;
/**
* struct ti_sci_msg_resp_get_status - Processor boot status response
* @hdr: Generic Header
* @processor_id: ID of processor whose status is returned
* @bootvector_low: Lower 32 bit address (Little Endian) of boot vector
* @bootvector_high: Higher 32 bit address (Little Endian) of boot vector
* @config_flags: Optional Processor specific Config Flags set currently
* @control_flags: Optional Processor specific Control Flags set currently
* @status_flags: Optional Processor specific Status Flags set currently
*
* Response structure to a TI_SCI_MSG_GET_STATUS request.
*/
struct ti_sci_msg_resp_get_status {
struct ti_sci_msg_hdr hdr;
u8 processor_id;
u32 bootvector_low;
u32 bootvector_high;
u32 config_flags;
u32 control_flags;
u32 status_flags;
} __packed;
#endif /* __TI_SCI_H */
......@@ -453,12 +453,42 @@ struct ti_sci_rm_udmap_ops {
const struct ti_sci_msg_rm_udmap_flow_cfg *params);
};
/**
* struct ti_sci_proc_ops - Processor Control operations
* @request: Request to control a physical processor. The requesting host
* should be in the processor access list
* @release: Relinquish a physical processor control
* @handover: Handover a physical processor control to another host
* in the permitted list
* @set_config: Set base configuration of a processor
* @set_control: Setup limited control flags in specific cases
* @get_status: Get the state of physical processor
*
* NOTE: The following paramteres are generic in nature for all these ops,
* -handle: Pointer to TI SCI handle as retrieved by *ti_sci_get_handle
* -pid: Processor ID
* -hid: Host ID
*/
struct ti_sci_proc_ops {
int (*request)(const struct ti_sci_handle *handle, u8 pid);
int (*release)(const struct ti_sci_handle *handle, u8 pid);
int (*handover)(const struct ti_sci_handle *handle, u8 pid, u8 hid);
int (*set_config)(const struct ti_sci_handle *handle, u8 pid,
u64 boot_vector, u32 cfg_set, u32 cfg_clr);
int (*set_control)(const struct ti_sci_handle *handle, u8 pid,
u32 ctrl_set, u32 ctrl_clr);
int (*get_status)(const struct ti_sci_handle *handle, u8 pid,
u64 *boot_vector, u32 *cfg_flags, u32 *ctrl_flags,
u32 *status_flags);
};
/**
* struct ti_sci_ops - Function support for TI SCI
* @dev_ops: Device specific operations
* @clk_ops: Clock specific operations
* @rm_core_ops: Resource management core operations.
* @rm_irq_ops: IRQ management specific operations
* @proc_ops: Processor Control specific operations
*/
struct ti_sci_ops {
struct ti_sci_core_ops core_ops;
......@@ -469,6 +499,7 @@ struct ti_sci_ops {
struct ti_sci_rm_ringacc_ops rm_ring_ops;
struct ti_sci_rm_psil_ops rm_psil_ops;
struct ti_sci_rm_udmap_ops rm_udmap_ops;
struct ti_sci_proc_ops proc_ops;
};
/**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment