blob: 2327b385b2836a8edba01379492abf4711c8ec1a [file] [log] [blame]
Sagar Dharia33beca02012-10-22 16:21:46 -06001/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
Sagar Dharia2754ab42012-08-21 18:07:39 -06002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef _SLIM_MSM_H
14#define _SLIM_MSM_H
Kenneth Heitkeae626042012-11-05 21:01:44 -070015
Sagar Dharia2b8a4b52013-05-15 20:01:45 -060016#include <linux/irq.h>
Kenneth Heitkeae626042012-11-05 21:01:44 -070017#include <linux/kthread.h>
18#include <mach/msm_qmi_interface.h>
Naveen Kaje0ba80fa2013-10-29 18:24:15 -060019#include <mach/subsystem_notif.h>
Kenneth Heitkeae626042012-11-05 21:01:44 -070020
Sagar Dharia2754ab42012-08-21 18:07:39 -060021/* Per spec.max 40 bytes per received message */
Sagar Dharia5c8ad192013-05-31 11:39:05 -060022#define SLIM_MSGQ_BUF_LEN 40
23
24#define MSM_TX_BUFS 2
Sagar Dharia2754ab42012-08-21 18:07:39 -060025
26#define SLIM_USR_MC_GENERIC_ACK 0x25
27#define SLIM_USR_MC_MASTER_CAPABILITY 0x0
28#define SLIM_USR_MC_REPORT_SATELLITE 0x1
29#define SLIM_USR_MC_ADDR_QUERY 0xD
30#define SLIM_USR_MC_ADDR_REPLY 0xE
31#define SLIM_USR_MC_DEFINE_CHAN 0x20
32#define SLIM_USR_MC_DEF_ACT_CHAN 0x21
33#define SLIM_USR_MC_CHAN_CTRL 0x23
34#define SLIM_USR_MC_RECONFIG_NOW 0x24
35#define SLIM_USR_MC_REQ_BW 0x28
36#define SLIM_USR_MC_CONNECT_SRC 0x2C
37#define SLIM_USR_MC_CONNECT_SINK 0x2D
38#define SLIM_USR_MC_DISCONNECT_PORT 0x2E
39
Sagar Dhariab046b3c2014-01-27 21:30:48 -070040#define SLIM_USR_MC_REPEAT_CHANGE_VALUE 0x0
41#define MSM_SLIM_VE_MAX_MAP_ADDR 0xFFF
42#define SLIM_MAX_VE_SLC_BYTES 16
43
Sagar Dharia2754ab42012-08-21 18:07:39 -060044#define MSM_SLIM_AUTOSUSPEND MSEC_PER_SEC
45
46/*
47 * Messages that can be received simultaneously:
48 * Client reads, LPASS master responses, announcement messages
49 * Receive upto 10 messages simultaneously.
50 */
51#define MSM_SLIM_DESC_NUM 32
52
53/* MSM Slimbus peripheral settings */
54#define MSM_SLIM_PERF_SUMM_THRESHOLD 0x8000
55#define MSM_SLIM_NPORTS 24
56#define MSM_SLIM_NCHANS 32
57
Sagar Dhariaa3c6a382013-06-21 12:18:20 -060058#define QC_MFGID_LSB 0x2
59#define QC_MFGID_MSB 0x17
60#define QC_CHIPID_SL 0x10
61#define QC_DEVID_SAT1 0x3
62#define QC_DEVID_SAT2 0x4
63#define QC_DEVID_PGD 0x5
64
Sagar Dharia2754ab42012-08-21 18:07:39 -060065#define SLIM_MSG_ASM_FIRST_WORD(l, mt, mc, dt, ad) \
66 ((l) | ((mt) << 5) | ((mc) << 8) | ((dt) << 15) | ((ad) << 16))
67
Sagar Dharia0a693332013-04-15 17:59:03 -060068#define INIT_MX_RETRIES 10
69#define DEF_RETRY_MS 10
Sagar Dharia2754ab42012-08-21 18:07:39 -060070#define MSM_CONCUR_MSG 8
71#define SAT_CONCUR_MSG 8
72#define DEF_WATERMARK (8 << 1)
73#define DEF_ALIGN 0
74#define DEF_PACK (1 << 6)
75#define ENABLE_PORT 1
76
77#define DEF_BLKSZ 0
78#define DEF_TRANSZ 0
79
80#define SAT_MAGIC_LSB 0xD9
81#define SAT_MAGIC_MSB 0xC5
82#define SAT_MSG_VER 0x1
83#define SAT_MSG_PROT 0x1
84#define MSM_SAT_SUCCSS 0x20
85#define MSM_MAX_NSATS 2
86#define MSM_MAX_SATCH 32
87
Kenneth Heitkeae626042012-11-05 21:01:44 -070088/* Slimbus QMI service */
89#define SLIMBUS_QMI_SVC_ID 0x0301
Karthikeyan Ramasubramaniane6e24952013-09-20 15:45:18 -060090#define SLIMBUS_QMI_SVC_V1 1
91#define SLIMBUS_QMI_INS_ID 0
Kenneth Heitkeae626042012-11-05 21:01:44 -070092
Sagar Dharia2754ab42012-08-21 18:07:39 -060093#define PGD_THIS_EE(r, v) ((v) ? PGD_THIS_EE_V2(r) : PGD_THIS_EE_V1(r))
94#define PGD_PORT(r, p, v) ((v) ? PGD_PORT_V2(r, p) : PGD_PORT_V1(r, p))
95#define CFG_PORT(r, v) ((v) ? CFG_PORT_V2(r) : CFG_PORT_V1(r))
96
97#define PGD_THIS_EE_V2(r) (dev->base + (r ## _V2) + (dev->ee * 0x1000))
98#define PGD_PORT_V2(r, p) (dev->base + (r ## _V2) + ((p) * 0x1000))
99#define CFG_PORT_V2(r) ((r ## _V2))
100/* Component registers */
101enum comp_reg_v2 {
102 COMP_CFG_V2 = 4,
103 COMP_TRUST_CFG_V2 = 0x3000,
104};
105
106/* Manager PGD registers */
107enum pgd_reg_v2 {
108 PGD_CFG_V2 = 0x800,
109 PGD_STAT_V2 = 0x804,
110 PGD_INT_EN_V2 = 0x810,
111 PGD_INT_STAT_V2 = 0x814,
112 PGD_INT_CLR_V2 = 0x818,
113 PGD_OWN_EEn_V2 = 0x300C,
114 PGD_PORT_INT_EN_EEn_V2 = 0x5000,
115 PGD_PORT_INT_ST_EEn_V2 = 0x5004,
116 PGD_PORT_INT_CL_EEn_V2 = 0x5008,
117 PGD_PORT_CFGn_V2 = 0x14000,
118 PGD_PORT_STATn_V2 = 0x14004,
119 PGD_PORT_PARAMn_V2 = 0x14008,
120 PGD_PORT_BLKn_V2 = 0x1400C,
121 PGD_PORT_TRANn_V2 = 0x14010,
122 PGD_PORT_MCHANn_V2 = 0x14014,
123 PGD_PORT_PSHPLLn_V2 = 0x14018,
124 PGD_PORT_PC_CFGn_V2 = 0x8000,
125 PGD_PORT_PC_VALn_V2 = 0x8004,
126 PGD_PORT_PC_VFR_TSn_V2 = 0x8008,
127 PGD_PORT_PC_VFR_STn_V2 = 0x800C,
128 PGD_PORT_PC_VFR_CLn_V2 = 0x8010,
129 PGD_IE_STAT_V2 = 0x820,
130 PGD_VE_STAT_V2 = 0x830,
131};
132
133#define PGD_THIS_EE_V1(r) (dev->base + (r ## _V1) + (dev->ee * 16))
134#define PGD_PORT_V1(r, p) (dev->base + (r ## _V1) + ((p) * 32))
135#define CFG_PORT_V1(r) ((r ## _V1))
136/* Component registers */
137enum comp_reg_v1 {
138 COMP_CFG_V1 = 0,
139 COMP_TRUST_CFG_V1 = 0x14,
140};
141
142/* Manager PGD registers */
143enum pgd_reg_v1 {
144 PGD_CFG_V1 = 0x1000,
145 PGD_STAT_V1 = 0x1004,
146 PGD_INT_EN_V1 = 0x1010,
147 PGD_INT_STAT_V1 = 0x1014,
148 PGD_INT_CLR_V1 = 0x1018,
149 PGD_OWN_EEn_V1 = 0x1020,
150 PGD_PORT_INT_EN_EEn_V1 = 0x1030,
151 PGD_PORT_INT_ST_EEn_V1 = 0x1034,
152 PGD_PORT_INT_CL_EEn_V1 = 0x1038,
153 PGD_PORT_CFGn_V1 = 0x1080,
154 PGD_PORT_STATn_V1 = 0x1084,
155 PGD_PORT_PARAMn_V1 = 0x1088,
156 PGD_PORT_BLKn_V1 = 0x108C,
157 PGD_PORT_TRANn_V1 = 0x1090,
158 PGD_PORT_MCHANn_V1 = 0x1094,
159 PGD_PORT_PSHPLLn_V1 = 0x1098,
160 PGD_PORT_PC_CFGn_V1 = 0x1600,
161 PGD_PORT_PC_VALn_V1 = 0x1604,
162 PGD_PORT_PC_VFR_TSn_V1 = 0x1608,
163 PGD_PORT_PC_VFR_STn_V1 = 0x160C,
164 PGD_PORT_PC_VFR_CLn_V1 = 0x1610,
165 PGD_IE_STAT_V1 = 0x1700,
166 PGD_VE_STAT_V1 = 0x1710,
167};
168
Sagar Dharia2b8a4b52013-05-15 20:01:45 -0600169enum msm_slim_port_status {
170 MSM_PORT_OVERFLOW = 1 << 2,
171 MSM_PORT_UNDERFLOW = 1 << 3,
172 MSM_PORT_DISCONNECT = 1 << 19,
173};
174
Sagar Dharia2754ab42012-08-21 18:07:39 -0600175enum msm_ctrl_state {
176 MSM_CTRL_AWAKE,
Sagar Dhariad1468b72013-07-16 12:56:22 -0600177 MSM_CTRL_IDLE,
Sagar Dharia2754ab42012-08-21 18:07:39 -0600178 MSM_CTRL_ASLEEP,
Sagar Dharia33beca02012-10-22 16:21:46 -0600179 MSM_CTRL_DOWN,
Sagar Dharia2754ab42012-08-21 18:07:39 -0600180};
181
Sagar Dharia24419e32013-01-14 17:56:32 -0700182enum msm_slim_msgq {
183 MSM_MSGQ_DISABLED,
184 MSM_MSGQ_RESET,
185 MSM_MSGQ_ENABLED,
Sagar Dhariada48bd62013-03-21 18:02:40 -0600186 MSM_MSGQ_DOWN,
Sagar Dharia24419e32013-01-14 17:56:32 -0700187};
188
Sagar Dharia2754ab42012-08-21 18:07:39 -0600189struct msm_slim_sps_bam {
190 u32 hdl;
191 void __iomem *base;
192 int irq;
193};
194
195struct msm_slim_endp {
196 struct sps_pipe *sps;
197 struct sps_connect config;
198 struct sps_register_event event;
199 struct sps_mem_buffer buf;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600200 bool connected;
201};
202
Kenneth Heitkeae626042012-11-05 21:01:44 -0700203struct msm_slim_qmi {
204 struct qmi_handle *handle;
205 struct task_struct *task;
206 struct kthread_work kwork;
207 struct kthread_worker kworker;
Sagar Dhariacc1001e2012-11-06 13:56:42 -0700208 struct completion qmi_comp;
209 struct notifier_block nb;
Sagar Dharia33beca02012-10-22 16:21:46 -0600210 struct work_struct ssr_down;
211 struct work_struct ssr_up;
Kenneth Heitkeae626042012-11-05 21:01:44 -0700212};
213
Naveen Kaje0ba80fa2013-10-29 18:24:15 -0600214struct msm_slim_mdm {
215 struct notifier_block nb;
216 void *ssr;
217};
218
Sagar Dhariaa3c6a382013-06-21 12:18:20 -0600219struct msm_slim_pdata {
220 u32 apps_pipes;
221 u32 eapc;
222};
223
Sagar Dharia2754ab42012-08-21 18:07:39 -0600224struct msm_slim_ctrl {
225 struct slim_controller ctrl;
226 struct slim_framer framer;
227 struct device *dev;
228 void __iomem *base;
229 struct resource *slew_mem;
Sagar Dharia71fcea52012-09-12 23:21:57 -0600230 struct resource *bam_mem;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600231 u32 curr_bw;
232 u8 msg_cnt;
233 u32 tx_buf[10];
Sagar Dharia5c8ad192013-05-31 11:39:05 -0600234 u8 rx_msgs[MSM_CONCUR_MSG][SLIM_MSGQ_BUF_LEN];
235 int tx_idx;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600236 spinlock_t rx_lock;
237 int head;
238 int tail;
239 int irq;
240 int err;
241 int ee;
242 struct completion *wr_comp;
243 struct msm_slim_sat *satd[MSM_MAX_NSATS];
244 struct msm_slim_endp pipes[7];
245 struct msm_slim_sps_bam bam;
Sagar Dharia5c8ad192013-05-31 11:39:05 -0600246 struct msm_slim_endp tx_msgq;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600247 struct msm_slim_endp rx_msgq;
248 struct completion rx_msgq_notify;
249 struct task_struct *rx_msgq_thread;
250 struct clk *rclk;
251 struct clk *hclk;
252 struct mutex tx_lock;
253 u8 pgdla;
Sagar Dharia24419e32013-01-14 17:56:32 -0700254 enum msm_slim_msgq use_rx_msgqs;
Sagar Dharia5c8ad192013-05-31 11:39:05 -0600255 enum msm_slim_msgq use_tx_msgqs;
Sagar Dharia2b8a4b52013-05-15 20:01:45 -0600256 int port_b;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600257 struct completion reconf;
258 bool reconf_busy;
259 bool chan_active;
260 enum msm_ctrl_state state;
Sagar Dharia33beca02012-10-22 16:21:46 -0600261 struct completion ctrl_up;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600262 int nsats;
263 u32 ver;
Sagar Dharia33beca02012-10-22 16:21:46 -0600264 struct work_struct slave_notify;
Kenneth Heitkeae626042012-11-05 21:01:44 -0700265 struct msm_slim_qmi qmi;
Sagar Dhariaa3c6a382013-06-21 12:18:20 -0600266 struct msm_slim_pdata pdata;
Naveen Kaje0ba80fa2013-10-29 18:24:15 -0600267 struct msm_slim_mdm mdm;
Sagar Dharia2754ab42012-08-21 18:07:39 -0600268};
269
270struct msm_sat_chan {
271 u8 chan;
272 u16 chanh;
273 int req_rem;
274 int req_def;
275 bool reconf;
276};
277
278struct msm_slim_sat {
279 struct slim_device satcl;
280 struct msm_slim_ctrl *dev;
281 struct workqueue_struct *wq;
282 struct work_struct wd;
283 u8 sat_msgs[SAT_CONCUR_MSG][40];
284 struct msm_sat_chan *satch;
285 u8 nsatch;
286 bool sent_capability;
287 bool pending_reconf;
288 bool pending_capability;
289 int shead;
290 int stail;
291 spinlock_t lock;
292};
293
294enum rsc_grp {
295 EE_MGR_RSC_GRP = 1 << 10,
296 EE_NGD_2 = 2 << 6,
297 EE_NGD_1 = 0,
298};
299
300
301int msm_slim_rx_enqueue(struct msm_slim_ctrl *dev, u32 *buf, u8 len);
302int msm_slim_rx_dequeue(struct msm_slim_ctrl *dev, u8 *buf);
303int msm_slim_get_ctrl(struct msm_slim_ctrl *dev);
304void msm_slim_put_ctrl(struct msm_slim_ctrl *dev);
Sagar Dharia2b8a4b52013-05-15 20:01:45 -0600305irqreturn_t msm_slim_port_irq_handler(struct msm_slim_ctrl *dev, u32 pstat);
Sagar Dharia2754ab42012-08-21 18:07:39 -0600306int msm_slim_init_endpoint(struct msm_slim_ctrl *dev, struct msm_slim_endp *ep);
307void msm_slim_free_endpoint(struct msm_slim_endp *ep);
308void msm_hw_set_port(struct msm_slim_ctrl *dev, u8 pn);
Sagar Dharia100e7212013-05-17 18:20:57 -0600309int msm_alloc_port(struct slim_controller *ctrl, u8 pn);
310void msm_dealloc_port(struct slim_controller *ctrl, u8 pn);
Sagar Dharia2754ab42012-08-21 18:07:39 -0600311int msm_slim_connect_pipe_port(struct msm_slim_ctrl *dev, u8 pn);
Sagar Dharia2754ab42012-08-21 18:07:39 -0600312enum slim_port_err msm_slim_port_xfer_status(struct slim_controller *ctr,
Sagar Dharia1bbf38c2014-02-07 19:40:12 -0700313 u8 pn, phys_addr_t *done_buf, u32 *done_len);
314int msm_slim_port_xfer(struct slim_controller *ctrl, u8 pn, phys_addr_t iobuf,
Sagar Dharia2754ab42012-08-21 18:07:39 -0600315 u32 len, struct completion *comp);
316int msm_send_msg_buf(struct msm_slim_ctrl *dev, u32 *buf, u8 len, u32 tx_reg);
317u32 *msm_get_msg_buf(struct msm_slim_ctrl *dev, int len);
318int msm_slim_rx_msgq_get(struct msm_slim_ctrl *dev, u32 *data, int offset);
319int msm_slim_sps_init(struct msm_slim_ctrl *dev, struct resource *bam_mem,
Sagar Dharia60f59a72012-10-17 12:42:03 -0600320 u32 pipe_reg, bool remote);
Sagar Dharia33beca02012-10-22 16:21:46 -0600321void msm_slim_sps_exit(struct msm_slim_ctrl *dev, bool dereg);
Kenneth Heitkeae626042012-11-05 21:01:44 -0700322
Sagar Dharia24419e32013-01-14 17:56:32 -0700323int msm_slim_connect_endp(struct msm_slim_ctrl *dev,
324 struct msm_slim_endp *endpoint,
325 struct completion *notify);
Sagar Dharia5c8ad192013-05-31 11:39:05 -0600326void msm_slim_disconnect_endp(struct msm_slim_ctrl *dev,
327 struct msm_slim_endp *endpoint,
328 enum msm_slim_msgq *msgq_flag);
Kenneth Heitkeae626042012-11-05 21:01:44 -0700329void msm_slim_qmi_exit(struct msm_slim_ctrl *dev);
330int msm_slim_qmi_init(struct msm_slim_ctrl *dev, bool apps_is_master);
331int msm_slim_qmi_power_request(struct msm_slim_ctrl *dev, bool active);
Naveen Kaje0ba80fa2013-10-29 18:24:15 -0600332int msm_slim_qmi_check_framer_request(struct msm_slim_ctrl *dev);
Sagar Dharia2754ab42012-08-21 18:07:39 -0600333#endif