Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
smd_private.h
Go to the documentation of this file.
1 /* arch/arm/mach-msm/smd_private.h
2  *
3  * Copyright (C) 2007 Google, Inc.
4  * Copyright (c) 2007 QUALCOMM Incorporated
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  */
16 #ifndef _ARCH_ARM_MACH_MSM_MSM_SMD_PRIVATE_H_
17 #define _ARCH_ARM_MACH_MSM_MSM_SMD_PRIVATE_H_
18 
19 #include <linux/platform_device.h>
20 #include <linux/spinlock.h>
21 #include <linux/list.h>
22 #include <linux/io.h>
23 
24 #include <mach/msm_iomap.h>
25 
27  unsigned initialized;
28  unsigned free_offset;
29  unsigned heap_remaining;
30  unsigned reserved;
31 };
32 
34  unsigned allocated;
35  unsigned offset;
36  unsigned size;
37  unsigned reserved;
38 };
39 
41  unsigned command;
42  unsigned status;
43  unsigned data1;
44  unsigned data2;
45 };
46 
47 #define PC_APPS 0
48 #define PC_MODEM 1
49 
50 #define VERSION_SMD 0
51 #define VERSION_QDSP6 4
52 #define VERSION_APPS_SBL 6
53 #define VERSION_MODEM_SBL 7
54 #define VERSION_APPS 8
55 #define VERSION_MODEM 9
56 
57 struct smem_shared {
59  unsigned version[32];
62 };
63 
64 #define SMSM_V1_SIZE (sizeof(unsigned) * 8)
65 #define SMSM_V2_SIZE (sizeof(unsigned) * 4)
66 
67 #ifdef CONFIG_MSM_SMD_PKG3
68 struct smsm_interrupt_info {
69  uint32_t interrupt_mask;
70  uint32_t pending_interrupts;
71  uint32_t wakeup_reason;
72 };
73 #else
74 #define DEM_MAX_PORT_NAME_LEN (20)
80 
87 };
88 #endif
89 
90 #define SZ_DIAG_ERR_MSG 0xC8
91 #define ID_DIAG_ERR_MSG SMEM_DIAG_ERR_MESSAGE
92 #define ID_SMD_CHANNELS SMEM_SMD_BASE_ID
93 #define ID_SHARED_STATE SMEM_SMSM_SHARED_STATE
94 #define ID_CH_ALLOC_TBL SMEM_CHANNEL_ALLOC_TBL
95 
96 #define SMSM_INIT 0x00000001
97 #define SMSM_SMDINIT 0x00000008
98 #define SMSM_RPCINIT 0x00000020
99 #define SMSM_RESET 0x00000040
100 #define SMSM_RSA 0x00000080
101 #define SMSM_RUN 0x00000100
102 #define SMSM_PWRC 0x00000200
103 #define SMSM_TIMEWAIT 0x00000400
104 #define SMSM_TIMEINIT 0x00000800
105 #define SMSM_PWRC_EARLY_EXIT 0x00001000
106 #define SMSM_WFPI 0x00002000
107 #define SMSM_SLEEP 0x00004000
108 #define SMSM_SLEEPEXIT 0x00008000
109 #define SMSM_APPS_REBOOT 0x00020000
110 #define SMSM_SYSTEM_POWER_DOWN 0x00040000
111 #define SMSM_SYSTEM_REBOOT 0x00080000
112 #define SMSM_SYSTEM_DOWNLOAD 0x00100000
113 #define SMSM_PWRC_SUSPEND 0x00200000
114 #define SMSM_APPS_SHUTDOWN 0x00400000
115 #define SMSM_SMD_LOOPBACK 0x00800000
116 #define SMSM_RUN_QUIET 0x01000000
117 #define SMSM_MODEM_WAIT 0x02000000
118 #define SMSM_MODEM_BREAK 0x04000000
119 #define SMSM_MODEM_CONTINUE 0x08000000
120 #define SMSM_UNKNOWN 0x80000000
121 
122 #define SMSM_WKUP_REASON_RPC 0x00000001
123 #define SMSM_WKUP_REASON_INT 0x00000002
124 #define SMSM_WKUP_REASON_GPIO 0x00000004
125 #define SMSM_WKUP_REASON_TIMER 0x00000008
126 #define SMSM_WKUP_REASON_ALARM 0x00000010
127 #define SMSM_WKUP_REASON_RESET 0x00000020
128 
129 #ifdef CONFIG_ARCH_MSM7X00A
130 enum smsm_state_item {
131  SMSM_STATE_APPS = 1,
132  SMSM_STATE_MODEM = 3,
134 };
135 #else
146 };
147 #endif
148 
149 void *smem_alloc(unsigned id, unsigned size);
150 int smsm_change_state(enum smsm_state_item item, uint32_t clear_mask, uint32_t set_mask);
153 void smsm_print_sleep_info(void);
154 
155 #define SMEM_NUM_SMD_CHANNELS 64
156 
157 typedef enum {
158  /* fixed items */
168 
169  /* dynamic items */
234 } smem_mem_type;
235 
236 
237 #define SMD_SS_CLOSED 0x00000000
238 #define SMD_SS_OPENING 0x00000001
239 #define SMD_SS_OPENED 0x00000002
240 #define SMD_SS_FLUSHING 0x00000003
241 #define SMD_SS_CLOSING 0x00000004
242 #define SMD_SS_RESET 0x00000005
243 #define SMD_SS_RESET_OPENING 0x00000006
244 
245 #define SMD_BUF_SIZE 8192
246 #define SMD_CHANNELS 64
247 
248 #define SMD_HEADER_SIZE 20
249 
251  char name[20];
255 };
256 
258  unsigned state;
259  unsigned char fDSR;
260  unsigned char fCTS;
261  unsigned char fCD;
262  unsigned char fRI;
263  unsigned char fHEAD;
264  unsigned char fTAIL;
265  unsigned char fSTATE;
266  unsigned char fUNUSED;
267  unsigned tail;
268  unsigned head;
269 } __attribute__(( aligned(4), packed ));
271 /* Only used on SMD package v3 on msm7201a */
274  unsigned char data0[SMD_BUF_SIZE];
276  unsigned char data1[SMD_BUF_SIZE];
277 };
279 /* Used on SMD package v4 */
283 };
284 
285 struct smd_channel {
286  volatile struct smd_half_channel *send;
287  volatile struct smd_half_channel *recv;
288  unsigned char *send_data;
289  unsigned char *recv_data;
290 
291  unsigned fifo_mask;
292  unsigned fifo_size;
293  unsigned current_packet;
294  unsigned n;
295 
297 
298  void *priv;
299  void (*notify)(void *priv, unsigned flags);
300 
301  int (*read)(struct smd_channel *ch, void *data, int len);
302  int (*write)(struct smd_channel *ch, const void *data, int len);
303  int (*read_avail)(struct smd_channel *ch);
304  int (*write_avail)(struct smd_channel *ch);
305 
306  void (*update_state)(struct smd_channel *ch);
307  unsigned last_state;
309  unsigned type;
310 
311  char name[32];
313 };
314 
315 #define SMD_TYPE_MASK 0x0FF
316 #define SMD_TYPE_APPS_MODEM 0x000
317 #define SMD_TYPE_APPS_DSP 0x001
318 #define SMD_TYPE_MODEM_DSP 0x002
319 
320 #define SMD_KIND_MASK 0xF00
321 #define SMD_KIND_UNKNOWN 0x000
322 #define SMD_KIND_STREAM 0x100
323 #define SMD_KIND_PACKET 0x200
324 
325 extern struct list_head smd_ch_closed_list;
326 extern struct list_head smd_ch_list_modem;
327 extern struct list_head smd_ch_list_dsp;
328 
329 extern spinlock_t smd_lock;
330 extern spinlock_t smem_lock;
331 
332 void *smem_find(unsigned id, unsigned size);
333 void *smem_item(unsigned id, unsigned *size);
335 
336 extern void msm_init_last_radio_log(struct module *);
337 
338 #ifdef CONFIG_MSM_SMD_PKG3
339 /*
340  * This allocator assumes an SMD Package v3 which only exists on
341  * MSM7x00 SoC's.
342  */
343 static inline int _smd_alloc_channel(struct smd_channel *ch)
344 {
345  struct smd_shared_v1 *shared1;
346 
347  shared1 = smem_alloc(ID_SMD_CHANNELS + ch->n, sizeof(*shared1));
348  if (!shared1) {
349  pr_err("smd_alloc_channel() cid %d does not exist\n", ch->n);
350  return -1;
351  }
352  ch->send = &shared1->ch0;
353  ch->recv = &shared1->ch1;
354  ch->send_data = shared1->data0;
355  ch->recv_data = shared1->data1;
356  ch->fifo_size = SMD_BUF_SIZE;
357  return 0;
358 }
359 #else
360 /*
361  * This allocator assumes an SMD Package v4, the most common
362  * and the default.
363  */
364 static inline int _smd_alloc_channel(struct smd_channel *ch)
365 {
366  struct smd_shared_v2 *shared2;
367  void *buffer;
368  unsigned buffer_sz;
369 
370  shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
371  buffer = smem_item(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
372 
373  if (!buffer)
374  return -1;
375 
376  /* buffer must be a power-of-two size */
377  if (buffer_sz & (buffer_sz - 1))
378  return -1;
379 
380  buffer_sz /= 2;
381  ch->send = &shared2->ch0;
382  ch->recv = &shared2->ch1;
383  ch->send_data = buffer;
384  ch->recv_data = buffer + buffer_sz;
385  ch->fifo_size = buffer_sz;
386  return 0;
387 }
388 #endif /* CONFIG_MSM_SMD_PKG3 */
389 
390 #if defined(CONFIG_ARCH_MSM7X30)
391 static inline void msm_a2m_int(uint32_t irq)
392 {
393  writel(1 << irq, MSM_GCC_BASE + 0x8);
394 }
395 #else
396 static inline void msm_a2m_int(uint32_t irq)
397 {
398  writel(1, MSM_CSR_BASE + 0x400 + (irq * 4));
399 }
400 #endif /* CONFIG_ARCH_MSM7X30 */
401 
402 
403 #endif