blob: af6a5a9ab7046490e7e2cd06ab27cf36021efce9 [file] [log] [blame]
Brian Swetland2eb44eb2008-09-29 16:00:48 -07001/* arch/arm/mach-msm/smd_private.h
2 *
3 * Copyright (C) 2007 Google, Inc.
Duy Truonge833aca2013-02-12 13:35:08 -08004 * Copyright (c) 2007-2012, The Linux Foundation. All rights reserved.
Brian Swetland2eb44eb2008-09-29 16:00:48 -07005 *
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
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070019#include <linux/types.h>
Brian Swetland03e00cd2009-07-01 17:58:37 -070020#include <linux/spinlock.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070021#include <mach/msm_smsm.h>
Eric Holmberg7ad623a2012-03-01 14:41:10 -070022#include <mach/msm_smd.h>
Daniel Walker74df1d02010-03-17 10:51:10 -070023
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070024#define PC_APPS 0
25#define PC_MODEM 1
26
27#define VERSION_QDSP6 4
28#define VERSION_APPS_SBL 6
29#define VERSION_MODEM_SBL 7
30#define VERSION_APPS 8
31#define VERSION_MODEM 9
32#define VERSION_DSPS 10
33
34#define SMD_HEAP_SIZE 512
Brian Swetland03e00cd2009-07-01 17:58:37 -070035
Daniel Walker79848a22010-03-16 15:20:07 -070036struct smem_heap_info {
Brian Swetland2eb44eb2008-09-29 16:00:48 -070037 unsigned initialized;
38 unsigned free_offset;
39 unsigned heap_remaining;
40 unsigned reserved;
41};
42
Daniel Walker79848a22010-03-16 15:20:07 -070043struct smem_heap_entry {
Brian Swetland2eb44eb2008-09-29 16:00:48 -070044 unsigned allocated;
45 unsigned offset;
46 unsigned size;
Jeff Hugobdc734d2012-03-26 16:05:39 -060047 unsigned reserved; /* bits 1:0 reserved, bits 31:2 aux smem base addr */
Brian Swetland2eb44eb2008-09-29 16:00:48 -070048};
Jeff Hugobdc734d2012-03-26 16:05:39 -060049#define BASE_ADDR_MASK 0xfffffffc
Brian Swetland2eb44eb2008-09-29 16:00:48 -070050
Daniel Walker79848a22010-03-16 15:20:07 -070051struct smem_proc_comm {
Brian Swetland2eb44eb2008-09-29 16:00:48 -070052 unsigned command;
53 unsigned status;
54 unsigned data1;
55 unsigned data2;
56};
57
Daniel Walker79848a22010-03-16 15:20:07 -070058struct smem_shared {
Brian Swetland2eb44eb2008-09-29 16:00:48 -070059 struct smem_proc_comm proc_comm[4];
60 unsigned version[32];
61 struct smem_heap_info heap_info;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070062 struct smem_heap_entry heap_toc[SMD_HEAP_SIZE];
Brian Swetland2eb44eb2008-09-29 16:00:48 -070063};
64
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070065#if defined(CONFIG_MSM_SMD_PKG4)
Daniel Walker79848a22010-03-16 15:20:07 -070066struct smsm_interrupt_info {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070067 uint32_t aArm_en_mask;
68 uint32_t aArm_interrupts_pending;
69 uint32_t aArm_wakeup_reason;
70 uint32_t aArm_rpc_prog;
71 uint32_t aArm_rpc_proc;
72 char aArm_smd_port_name[20];
73 uint32_t aArm_gpio_info;
Brian Swetland2eb44eb2008-09-29 16:00:48 -070074};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070075#elif defined(CONFIG_MSM_SMD_PKG3)
76struct smsm_interrupt_info {
77 uint32_t aArm_en_mask;
78 uint32_t aArm_interrupts_pending;
79 uint32_t aArm_wakeup_reason;
80};
81#elif !defined(CONFIG_MSM_SMD)
Steve Mucklef132c6c2012-06-06 18:30:57 -070082/* Don't trigger the error */
Arve Hjønnevågec9d3d12009-06-16 14:48:21 -070083#else
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070084#error No SMD Package Specified; aborting
Arve Hjønnevågec9d3d12009-06-16 14:48:21 -070085#endif
Brian Swetland2eb44eb2008-09-29 16:00:48 -070086
87#define SZ_DIAG_ERR_MSG 0xC8
88#define ID_DIAG_ERR_MSG SMEM_DIAG_ERR_MESSAGE
89#define ID_SMD_CHANNELS SMEM_SMD_BASE_ID
90#define ID_SHARED_STATE SMEM_SMSM_SHARED_STATE
91#define ID_CH_ALLOC_TBL SMEM_CHANNEL_ALLOC_TBL
92
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070093#define SMD_SS_CLOSED 0x00000000
94#define SMD_SS_OPENING 0x00000001
95#define SMD_SS_OPENED 0x00000002
96#define SMD_SS_FLUSHING 0x00000003
97#define SMD_SS_CLOSING 0x00000004
98#define SMD_SS_RESET 0x00000005
99#define SMD_SS_RESET_OPENING 0x00000006
Brian Swetland2eb44eb2008-09-29 16:00:48 -0700100
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700101#define SMD_BUF_SIZE 8192
102#define SMD_CHANNELS 64
103#define SMD_HEADER_SIZE 20
Brian Swetland2eb44eb2008-09-29 16:00:48 -0700104
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700105/* 'type' field of smd_alloc_elm structure
106 * has the following breakup
107 * bits 0-7 -> channel type
108 * bits 8-11 -> xfer type
109 * bits 12-31 -> reserved
110 */
Brian Swetland03e00cd2009-07-01 17:58:37 -0700111struct smd_alloc_elm {
112 char name[20];
113 uint32_t cid;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700114 uint32_t type;
Brian Swetland03e00cd2009-07-01 17:58:37 -0700115 uint32_t ref_count;
116};
117
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700118#define SMD_CHANNEL_TYPE(x) ((x) & 0x000000FF)
119#define SMD_XFER_TYPE(x) (((x) & 0x00000F00) >> 8)
120
Brian Swetland03e00cd2009-07-01 17:58:37 -0700121struct smd_half_channel {
122 unsigned state;
123 unsigned char fDSR;
124 unsigned char fCTS;
125 unsigned char fCD;
126 unsigned char fRI;
127 unsigned char fHEAD;
128 unsigned char fTAIL;
129 unsigned char fSTATE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700130 unsigned char fBLOCKREADINTR;
Brian Swetland03e00cd2009-07-01 17:58:37 -0700131 unsigned tail;
132 unsigned head;
Brian Swetland03e00cd2009-07-01 17:58:37 -0700133};
134
Jeff Hugo918b2dc2012-03-21 13:42:09 -0600135struct smd_half_channel_word_access {
136 unsigned state;
137 unsigned fDSR;
138 unsigned fCTS;
139 unsigned fCD;
140 unsigned fRI;
141 unsigned fHEAD;
142 unsigned fTAIL;
143 unsigned fSTATE;
144 unsigned fBLOCKREADINTR;
145 unsigned tail;
146 unsigned head;
Daniel Walker79848a22010-03-16 15:20:07 -0700147};
Brian Swetland03e00cd2009-07-01 17:58:37 -0700148
Jeff Hugo918b2dc2012-03-21 13:42:09 -0600149struct smd_half_channel_access {
150 void (*set_state)(volatile void *half_channel, unsigned data);
151 unsigned (*get_state)(volatile void *half_channel);
152 void (*set_fDSR)(volatile void *half_channel, unsigned char data);
153 unsigned (*get_fDSR)(volatile void *half_channel);
154 void (*set_fCTS)(volatile void *half_channel, unsigned char data);
155 unsigned (*get_fCTS)(volatile void *half_channel);
156 void (*set_fCD)(volatile void *half_channel, unsigned char data);
157 unsigned (*get_fCD)(volatile void *half_channel);
158 void (*set_fRI)(volatile void *half_channel, unsigned char data);
159 unsigned (*get_fRI)(volatile void *half_channel);
160 void (*set_fHEAD)(volatile void *half_channel, unsigned char data);
161 unsigned (*get_fHEAD)(volatile void *half_channel);
162 void (*set_fTAIL)(volatile void *half_channel, unsigned char data);
163 unsigned (*get_fTAIL)(volatile void *half_channel);
164 void (*set_fSTATE)(volatile void *half_channel, unsigned char data);
165 unsigned (*get_fSTATE)(volatile void *half_channel);
166 void (*set_fBLOCKREADINTR)(volatile void *half_channel,
167 unsigned char data);
168 unsigned (*get_fBLOCKREADINTR)(volatile void *half_channel);
169 void (*set_tail)(volatile void *half_channel, unsigned data);
170 unsigned (*get_tail)(volatile void *half_channel);
171 void (*set_head)(volatile void *half_channel, unsigned data);
172 unsigned (*get_head)(volatile void *half_channel);
173};
Brian Swetland03e00cd2009-07-01 17:58:37 -0700174
Jeff Hugo918b2dc2012-03-21 13:42:09 -0600175int is_word_access_ch(unsigned ch_type);
Brian Swetland03e00cd2009-07-01 17:58:37 -0700176
Jeff Hugo918b2dc2012-03-21 13:42:09 -0600177struct smd_half_channel_access *get_half_ch_funcs(unsigned ch_type);
Brian Swetland03e00cd2009-07-01 17:58:37 -0700178
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700179struct smem_ram_ptn {
180 char name[16];
181 unsigned start;
182 unsigned size;
Brian Swetland03e00cd2009-07-01 17:58:37 -0700183
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700184 /* RAM Partition attribute: READ_ONLY, READWRITE etc. */
185 unsigned attr;
Brian Swetland03e00cd2009-07-01 17:58:37 -0700186
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700187 /* RAM Partition category: EBI0, EBI1, IRAM, IMEM */
188 unsigned category;
189
190 /* RAM Partition domain: APPS, MODEM, APPS & MODEM (SHARED) etc. */
191 unsigned domain;
192
193 /* RAM Partition type: system, bootloader, appsboot, apps etc. */
Brian Swetland03e00cd2009-07-01 17:58:37 -0700194 unsigned type;
195
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700196 /* reserved for future expansion without changing version number */
197 unsigned reserved2, reserved3, reserved4, reserved5;
198} __attribute__ ((__packed__));
199
200
201struct smem_ram_ptable {
202 #define _SMEM_RAM_PTABLE_MAGIC_1 0x9DA5E0A8
203 #define _SMEM_RAM_PTABLE_MAGIC_2 0xAF9EC4E2
204 unsigned magic[2];
205 unsigned version;
206 unsigned reserved1;
207 unsigned len;
208 struct smem_ram_ptn parts[32];
209 unsigned buf;
210} __attribute__ ((__packed__));
211
212/* SMEM RAM Partition */
213enum {
214 DEFAULT_ATTRB = ~0x0,
215 READ_ONLY = 0x0,
216 READWRITE,
Brian Swetland03e00cd2009-07-01 17:58:37 -0700217};
218
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700219enum {
220 DEFAULT_CATEGORY = ~0x0,
221 SMI = 0x0,
222 EBI1,
223 EBI2,
224 QDSP6,
225 IRAM,
226 IMEM,
227 EBI0_CS0,
228 EBI0_CS1,
229 EBI1_CS0,
230 EBI1_CS1,
231 SDRAM = 0xE,
232};
Brian Swetland03e00cd2009-07-01 17:58:37 -0700233
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700234enum {
235 DEFAULT_DOMAIN = 0x0,
236 APPS_DOMAIN,
237 MODEM_DOMAIN,
238 SHARED_DOMAIN,
239};
Brian Swetland03e00cd2009-07-01 17:58:37 -0700240
Naveen Ramaraj76483ad2011-09-06 14:25:44 -0700241enum {
242 SYS_MEMORY = 1, /* system memory*/
243 BOOT_REGION_MEMORY1, /* boot loader memory 1*/
244 BOOT_REGION_MEMORY2, /* boot loader memory 2,reserved*/
245 APPSBL_MEMORY, /* apps boot loader memory*/
246 APPS_MEMORY, /* apps usage memory*/
247};
Brian Swetland03e00cd2009-07-01 17:58:37 -0700248
Brian Swetland03e00cd2009-07-01 17:58:37 -0700249extern spinlock_t smem_lock;
250
Brian Swetland03e00cd2009-07-01 17:58:37 -0700251
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700252void smd_diag(void);
Daniel Walker79848a22010-03-16 15:20:07 -0700253
Eric Holmberg7ad623a2012-03-01 14:41:10 -0700254struct interrupt_stat {
255 uint32_t smd_in_count;
256 uint32_t smd_out_hardcode_count;
257 uint32_t smd_out_config_count;
Arun Kumar Neelakantam240be2e2012-10-16 22:17:55 +0530258 uint32_t smd_interrupt_id;
Daniel Walkerbf83de42010-03-16 16:29:44 -0700259
Eric Holmberg7ad623a2012-03-01 14:41:10 -0700260 uint32_t smsm_in_count;
261 uint32_t smsm_out_hardcode_count;
262 uint32_t smsm_out_config_count;
Arun Kumar Neelakantam240be2e2012-10-16 22:17:55 +0530263 uint32_t smsm_interrupt_id;
Eric Holmberg7ad623a2012-03-01 14:41:10 -0700264};
265extern struct interrupt_stat interrupt_stats[NUM_SMD_SUBSYSTEMS];
Daniel Walker74df1d02010-03-17 10:51:10 -0700266
Brian Swetland2eb44eb2008-09-29 16:00:48 -0700267#endif