xref: /rk3399_ARM-atf/plat/marvell/armada/common/mss/mss_ipc_drv.h (revision 9935047b2086faa3bf3ccf0b95a76510eb5a160b)
1*a2847172SGrzegorz Jaszczyk /*
2*a2847172SGrzegorz Jaszczyk  * Copyright (C) 2018 Marvell International Ltd.
3*a2847172SGrzegorz Jaszczyk  *
4*a2847172SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
5*a2847172SGrzegorz Jaszczyk  * https://spdx.org/licenses
6*a2847172SGrzegorz Jaszczyk  */
7*a2847172SGrzegorz Jaszczyk 
8*a2847172SGrzegorz Jaszczyk #ifndef MSS_IPC_DRV_H
9*a2847172SGrzegorz Jaszczyk #define MSS_IPC_DRV_H
10*a2847172SGrzegorz Jaszczyk 
11*a2847172SGrzegorz Jaszczyk #include <lib/psci/psci.h>
12*a2847172SGrzegorz Jaszczyk 
13*a2847172SGrzegorz Jaszczyk #define MV_PM_FW_IPC_VERSION_MAGIC	(0xCA530000) /* Do NOT change */
14*a2847172SGrzegorz Jaszczyk /* Increament for each version */
15*a2847172SGrzegorz Jaszczyk #define MV_PM_FW_IPC_VERSION_SEQ	(0x00000001)
16*a2847172SGrzegorz Jaszczyk #define MV_PM_FW_IPC_VERSION		(MV_PM_FW_IPC_VERSION_MAGIC | \
17*a2847172SGrzegorz Jaszczyk 					 MV_PM_FW_IPC_VERSION_SEQ)
18*a2847172SGrzegorz Jaszczyk 
19*a2847172SGrzegorz Jaszczyk #define IPC_MSG_STATE_LOC		(0x0)
20*a2847172SGrzegorz Jaszczyk #define IPC_MSG_SYNC_ID_LOC		(0x4)
21*a2847172SGrzegorz Jaszczyk #define IPC_MSG_ID_LOC			(0x8)
22*a2847172SGrzegorz Jaszczyk #define IPC_MSG_RET_CH_ID_LOC	(0xC)
23*a2847172SGrzegorz Jaszczyk #define IPC_MSG_CPU_ID_LOC		(0x10)
24*a2847172SGrzegorz Jaszczyk #define IPC_MSG_CLUSTER_ID_LOC	(0x14)
25*a2847172SGrzegorz Jaszczyk #define IPC_MSG_SYSTEM_ID_LOC	(0x18)
26*a2847172SGrzegorz Jaszczyk #define IPC_MSG_POWER_STATE_LOC	(0x1C)
27*a2847172SGrzegorz Jaszczyk #define IPC_MSG_REPLY_LOC		(0x20)
28*a2847172SGrzegorz Jaszczyk #define IPC_MSG_RESERVED_LOC	(0x24)
29*a2847172SGrzegorz Jaszczyk 
30*a2847172SGrzegorz Jaszczyk /* IPC initialization state */
31*a2847172SGrzegorz Jaszczyk enum mss_pm_ipc_init_state {
32*a2847172SGrzegorz Jaszczyk 	IPC_UN_INITIALIZED	= 1,
33*a2847172SGrzegorz Jaszczyk 	IPC_INITIALIZED		= 2
34*a2847172SGrzegorz Jaszczyk };
35*a2847172SGrzegorz Jaszczyk 
36*a2847172SGrzegorz Jaszczyk /* IPC queue direction */
37*a2847172SGrzegorz Jaszczyk enum mss_pm_ipc_init_msg_dir {
38*a2847172SGrzegorz Jaszczyk 	IPC_MSG_TX	= 0,
39*a2847172SGrzegorz Jaszczyk 	IPC_MSG_RX	= 1
40*a2847172SGrzegorz Jaszczyk };
41*a2847172SGrzegorz Jaszczyk 
42*a2847172SGrzegorz Jaszczyk /* IPC message state */
43*a2847172SGrzegorz Jaszczyk enum mss_pm_ipc_msg_state {
44*a2847172SGrzegorz Jaszczyk 	IPC_MSG_FREE	= 1,
45*a2847172SGrzegorz Jaszczyk 	IPC_MSG_OCCUPY	= 2
46*a2847172SGrzegorz Jaszczyk 
47*a2847172SGrzegorz Jaszczyk };
48*a2847172SGrzegorz Jaszczyk 
49*a2847172SGrzegorz Jaszczyk /* IPC control block */
50*a2847172SGrzegorz Jaszczyk struct mss_pm_ipc_ctrl {
51*a2847172SGrzegorz Jaszczyk 	unsigned int ctrl_base_address;
52*a2847172SGrzegorz Jaszczyk 	unsigned int msg_base_address;
53*a2847172SGrzegorz Jaszczyk 	unsigned int num_of_channels;
54*a2847172SGrzegorz Jaszczyk 	unsigned int channel_size;
55*a2847172SGrzegorz Jaszczyk 	unsigned int queue_size;
56*a2847172SGrzegorz Jaszczyk };
57*a2847172SGrzegorz Jaszczyk 
58*a2847172SGrzegorz Jaszczyk /* IPC message types */
59*a2847172SGrzegorz Jaszczyk enum mss_pm_msg_id {
60*a2847172SGrzegorz Jaszczyk 	PM_IPC_MSG_CPU_SUSPEND		= 1,
61*a2847172SGrzegorz Jaszczyk 	PM_IPC_MSG_CPU_OFF		= 2,
62*a2847172SGrzegorz Jaszczyk 	PM_IPC_MSG_CPU_ON		= 3,
63*a2847172SGrzegorz Jaszczyk 	PM_IPC_MSG_SYSTEM_RESET		= 4,
64*a2847172SGrzegorz Jaszczyk 	PM_IPC_MSG_SYSTEM_SUSPEND	= 5,
65*a2847172SGrzegorz Jaszczyk 	PM_IPC_MAX_MSG
66*a2847172SGrzegorz Jaszczyk };
67*a2847172SGrzegorz Jaszczyk 
68*a2847172SGrzegorz Jaszczyk struct mss_pm_ipc_msg {
69*a2847172SGrzegorz Jaszczyk 	unsigned int	msg_sync_id;	/*
70*a2847172SGrzegorz Jaszczyk 					 * Sync number, validate message
71*a2847172SGrzegorz Jaszczyk 					 * reply corresponding to message
72*a2847172SGrzegorz Jaszczyk 					 * received
73*a2847172SGrzegorz Jaszczyk 					 */
74*a2847172SGrzegorz Jaszczyk 	unsigned int	msg_id;		/* Message Id */
75*a2847172SGrzegorz Jaszczyk 	unsigned int	ret_channel_id;	/* IPC channel reply */
76*a2847172SGrzegorz Jaszczyk 	unsigned int	cpu_id;		/* CPU Id */
77*a2847172SGrzegorz Jaszczyk 	unsigned int	cluster_id;	/* Cluster Id */
78*a2847172SGrzegorz Jaszczyk 	unsigned int	system_id;	/* System Id */
79*a2847172SGrzegorz Jaszczyk 	unsigned int	power_state;
80*a2847172SGrzegorz Jaszczyk 	unsigned int	msg_reply;	/* Message reply */
81*a2847172SGrzegorz Jaszczyk };
82*a2847172SGrzegorz Jaszczyk 
83*a2847172SGrzegorz Jaszczyk /* IPC queue */
84*a2847172SGrzegorz Jaszczyk struct mss_pm_ipc_queue {
85*a2847172SGrzegorz Jaszczyk 	unsigned int	state;
86*a2847172SGrzegorz Jaszczyk 	struct mss_pm_ipc_msg		msg;
87*a2847172SGrzegorz Jaszczyk };
88*a2847172SGrzegorz Jaszczyk 
89*a2847172SGrzegorz Jaszczyk /* IPC channel */
90*a2847172SGrzegorz Jaszczyk struct mss_pm_ipc_ch {
91*a2847172SGrzegorz Jaszczyk 	struct mss_pm_ipc_queue *tx_queue;
92*a2847172SGrzegorz Jaszczyk 	struct mss_pm_ipc_queue *rx_queue;
93*a2847172SGrzegorz Jaszczyk };
94*a2847172SGrzegorz Jaszczyk 
95*a2847172SGrzegorz Jaszczyk /*****************************************************************************
96*a2847172SGrzegorz Jaszczyk  * mv_pm_ipc_init
97*a2847172SGrzegorz Jaszczyk  *
98*a2847172SGrzegorz Jaszczyk  * DESCRIPTION: Initialize PM IPC infrastructure
99*a2847172SGrzegorz Jaszczyk  *****************************************************************************
100*a2847172SGrzegorz Jaszczyk  */
101*a2847172SGrzegorz Jaszczyk int mv_pm_ipc_init(unsigned long ipc_control_addr);
102*a2847172SGrzegorz Jaszczyk 
103*a2847172SGrzegorz Jaszczyk /*****************************************************************************
104*a2847172SGrzegorz Jaszczyk  * mv_pm_ipc_msg_rx
105*a2847172SGrzegorz Jaszczyk  *
106*a2847172SGrzegorz Jaszczyk  * DESCRIPTION: Retrieve message from IPC channel
107*a2847172SGrzegorz Jaszczyk  *****************************************************************************
108*a2847172SGrzegorz Jaszczyk  */
109*a2847172SGrzegorz Jaszczyk int mv_pm_ipc_msg_rx(unsigned int channel_id, struct mss_pm_ipc_msg *msg);
110*a2847172SGrzegorz Jaszczyk 
111*a2847172SGrzegorz Jaszczyk /*****************************************************************************
112*a2847172SGrzegorz Jaszczyk  * mv_pm_ipc_msg_tx
113*a2847172SGrzegorz Jaszczyk  *
114*a2847172SGrzegorz Jaszczyk  * DESCRIPTION: Send message via IPC channel
115*a2847172SGrzegorz Jaszczyk  *****************************************************************************
116*a2847172SGrzegorz Jaszczyk  */
117*a2847172SGrzegorz Jaszczyk int mv_pm_ipc_msg_tx(unsigned int channel_id, unsigned int msg_id,
118*a2847172SGrzegorz Jaszczyk 			unsigned int cluster_power_state);
119*a2847172SGrzegorz Jaszczyk 
120*a2847172SGrzegorz Jaszczyk #endif /* MSS_IPC_DRV_H */
121