blob: 9b4b6820b7d97c2e155194befbfe9d9a5b25004b [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* arch/arm/mach-msm/qdsp5/adsp.h
2 *
3 * Copyright (C) 2008 Google, Inc.
Duy Truonge833aca2013-02-12 13:35:08 -08004 * Copyright (c) 2008-2010, 2012 The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005 * Author: Iliyan Malchev <ibm@android.com>
6 *
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18#ifndef _ARCH_ARM_MACH_MSM_ADSP_H
19#define _ARCH_ARM_MACH_MSM_ADSP_H
20
21#include <linux/types.h>
22#include <linux/msm_adsp.h>
Mitchel Humpherys7cdaf772012-09-06 10:15:56 -070023#include <linux/msm_ion.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070024#include <mach/msm_rpcrouter.h>
25#include <mach/msm_adsp.h>
26
27int adsp_pmem_fixup(struct msm_adsp_module *module, void **addr,
28 unsigned long len);
Saikumar Kondaparthi316620f2012-06-26 15:43:22 +053029int adsp_ion_do_cache_op(struct msm_adsp_module *module, void *addr,
30 void *paddr, unsigned long len,
31 unsigned long offset, int cmd);
32int adsp_ion_fixup_kvaddr(struct msm_adsp_module *module, void **addr,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070033 unsigned long *kvaddr, unsigned long len,
34 struct file **filp, unsigned long *offset);
35int adsp_pmem_paddr_fixup(struct msm_adsp_module *module, void **addr);
36
37int adsp_vfe_verify_cmd(struct msm_adsp_module *module,
38 unsigned int queue_id, void *cmd_data,
39 size_t cmd_size);
40int adsp_jpeg_verify_cmd(struct msm_adsp_module *module,
41 unsigned int queue_id, void *cmd_data,
42 size_t cmd_size);
43int adsp_lpm_verify_cmd(struct msm_adsp_module *module,
44 unsigned int queue_id, void *cmd_data,
45 size_t cmd_size);
46int adsp_video_verify_cmd(struct msm_adsp_module *module,
47 unsigned int queue_id, void *cmd_data,
48 size_t cmd_size);
49int adsp_videoenc_verify_cmd(struct msm_adsp_module *module,
50 unsigned int queue_id, void *cmd_data,
51 size_t cmd_size);
Laxminath Kasam1a461112010-11-15 12:17:26 +053052void q5audio_dsp_not_responding(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070053
54struct adsp_event;
55
56int adsp_vfe_patch_event(struct msm_adsp_module *module,
57 struct adsp_event *event);
58
59int adsp_jpeg_patch_event(struct msm_adsp_module *module,
60 struct adsp_event *event);
61
62
63struct adsp_module_info {
64 const char *name;
65 const char *pdev_name;
66 uint32_t id;
67 const char *clk_name;
68 unsigned long clk_rate;
69 int (*verify_cmd) (struct msm_adsp_module*, unsigned int, void *,
70 size_t);
71 int (*patch_event) (struct msm_adsp_module*, struct adsp_event *);
72};
73
74#define ADSP_EVENT_MAX_SIZE 496
75#define EVENT_LEN 12
76#define EVENT_MSG_ID ((uint16_t)~0)
77
78struct adsp_event {
79 struct list_head list;
80 uint32_t size; /* always in bytes */
81 uint16_t msg_id;
82 uint16_t type; /* 0 for msgs (from aDSP), -1 for events (from ARM9) */
83 int is16; /* always 0 (msg is 32-bit) when the event type is 1(ARM9) */
84 union {
85 uint16_t msg16[ADSP_EVENT_MAX_SIZE / 2];
86 uint32_t msg32[ADSP_EVENT_MAX_SIZE / 4];
87 } data;
88};
89
90struct adsp_info {
91 uint32_t send_irq;
92 uint32_t read_ctrl;
93 uint32_t write_ctrl;
94
95 uint32_t max_msg16_size;
96 uint32_t max_msg32_size;
97
98 uint32_t max_task_id;
99 uint32_t max_module_id;
100 uint32_t max_queue_id;
101 uint32_t max_image_id;
102
103 /* for each image id, a map of queue id to offset */
104 uint32_t **queue_offset;
105
106 /* for each image id, a map of task id to module id */
107 uint32_t **task_to_module;
108
109 /* for each module id, map of module id to module */
110 struct msm_adsp_module **id_to_module;
111
112 uint32_t module_count;
113 struct adsp_module_info *module;
114
115 /* stats */
116 uint32_t events_received;
117 uint32_t event_backlog_max;
118
119 /* rpc_client for init_info */
120 struct msm_rpc_endpoint *init_info_rpc_client;
121 struct adsp_rtos_mp_mtoa_init_info_type *init_info_ptr;
122 wait_queue_head_t init_info_wait;
123 unsigned init_info_state;
Manish Dewangan691f1c42012-02-10 12:50:14 +0530124 struct mutex lock;
Laxminath Kasam34aea162012-02-15 12:21:49 +0530125
126 /* Interrupt value */
127 int int_adsp;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700128};
129
130#define RPC_ADSP_RTOS_ATOM_NULL_PROC 0
131#define RPC_ADSP_RTOS_MTOA_NULL_PROC 0
132#define RPC_ADSP_RTOS_APP_TO_MODEM_PROC 2
133#define RPC_ADSP_RTOS_MODEM_TO_APP_PROC 2
134#define RPC_ADSP_RTOS_MTOA_EVENT_INFO_PROC 3
135#define RPC_ADSP_RTOS_MTOA_INIT_INFO_PROC 4
136
137enum rpc_adsp_rtos_proc_type {
138 RPC_ADSP_RTOS_PROC_NONE = 0,
139 RPC_ADSP_RTOS_PROC_MODEM = 1,
140 RPC_ADSP_RTOS_PROC_APPS = 2,
141};
142
143enum {
144 RPC_ADSP_RTOS_CMD_REGISTER_APP,
145 RPC_ADSP_RTOS_CMD_ENABLE,
146 RPC_ADSP_RTOS_CMD_DISABLE,
147 RPC_ADSP_RTOS_CMD_KERNEL_COMMAND,
148 RPC_ADSP_RTOS_CMD_16_COMMAND,
149 RPC_ADSP_RTOS_CMD_32_COMMAND,
150 RPC_ADSP_RTOS_CMD_DISABLE_EVENT_RSP,
151 RPC_ADSP_RTOS_CMD_REMOTE_EVENT,
152 RPC_ADSP_RTOS_CMD_SET_STATE,
153 RPC_ADSP_RTOS_CMD_REMOTE_INIT_INFO_EVENT,
154 RPC_ADSP_RTOS_CMD_GET_INIT_INFO,
155};
156
157enum rpc_adsp_rtos_mod_status_type {
158 RPC_ADSP_RTOS_MOD_READY,
159 RPC_ADSP_RTOS_MOD_DISABLE,
160 RPC_ADSP_RTOS_SERVICE_RESET,
161 RPC_ADSP_RTOS_CMD_FAIL,
162 RPC_ADSP_RTOS_CMD_SUCCESS,
163 RPC_ADSP_RTOS_INIT_INFO,
164 RPC_ADSP_RTOS_DISABLE_FAIL,
165};
166
167struct rpc_adsp_rtos_app_to_modem_args_t {
168 struct rpc_request_hdr hdr;
169 uint32_t gotit; /* if 1, the next elements are present */
170 uint32_t cmd; /* e.g., RPC_ADSP_RTOS_CMD_REGISTER_APP */
171 uint32_t proc_id; /* e.g., RPC_ADSP_RTOS_PROC_APPS */
172 uint32_t module; /* e.g., QDSP_MODULE_AUDPPTASK */
173};
174
175enum qdsp_image_type {
176 QDSP_IMAGE_COMBO,
177 QDSP_IMAGE_GAUDIO,
178 QDSP_IMAGE_QTV_LP,
179 QDSP_IMAGE_MAX,
180 /* DO NOT USE: Force this enum to be a 32bit type to improve speed */
181 QDSP_IMAGE_32BIT_DUMMY = 0x10000
182};
183
184struct adsp_rtos_mp_mtoa_header_type {
185 enum rpc_adsp_rtos_mod_status_type event;
186 enum rpc_adsp_rtos_proc_type proc_id;
187};
188
189/* ADSP RTOS MP Communications - Modem to APP's Event Info*/
190struct adsp_rtos_mp_mtoa_type {
191 uint32_t module;
192 uint32_t image;
193 uint32_t apps_okts;
194};
195
196/* ADSP RTOS MP Communications - Modem to APP's Init Info */
197#if CONFIG_ADSP_RPC_VER > 0x30001
198#define IMG_MAX 2
199#define ENTRIES_MAX 36
200#define MODULES_MAX 64
201#else
202#define IMG_MAX 6
203#define ENTRIES_MAX 48
204#endif
205#define QUEUES_MAX 64
206
207struct queue_to_offset_type {
208 uint32_t queue;
209 uint32_t offset;
210};
211
212struct mod_to_queue_offsets {
213 uint32_t module;
214 uint32_t q_type;
215 uint32_t q_max_len;
216};
217
218struct adsp_rtos_mp_mtoa_init_info_type {
219 uint32_t image_count;
220 uint32_t num_queue_offsets;
221 struct queue_to_offset_type queue_offsets_tbl[IMG_MAX][ENTRIES_MAX];
222 uint32_t num_task_module_entries;
223 uint32_t task_to_module_tbl[IMG_MAX][ENTRIES_MAX];
224
225 uint32_t module_table_size;
226#if CONFIG_ADSP_RPC_VER > 0x30001
227 uint32_t module_entries[MODULES_MAX];
228#else
229 uint32_t module_entries[ENTRIES_MAX];
230#endif
231 uint32_t mod_to_q_entries;
232 struct mod_to_queue_offsets mod_to_q_tbl[ENTRIES_MAX];
233 /*
234 * queue_offsets[] is to store only queue_offsets
235 */
236 uint32_t queue_offsets[IMG_MAX][QUEUES_MAX];
237};
238
239struct adsp_rtos_mp_mtoa_s_type {
240 struct adsp_rtos_mp_mtoa_header_type mp_mtoa_header;
241#if CONFIG_ADSP_RPC_VER == 0x30001
242 uint32_t desc_field;
243#endif
244 union {
245 struct adsp_rtos_mp_mtoa_init_info_type mp_mtoa_init_packet;
246 struct adsp_rtos_mp_mtoa_type mp_mtoa_packet;
247 } adsp_rtos_mp_mtoa_data;
248};
249
250struct rpc_adsp_rtos_modem_to_app_args_t {
251 struct rpc_request_hdr hdr;
252 uint32_t gotit; /* if 1, the next elements are present */
253 struct adsp_rtos_mp_mtoa_s_type mtoa_pkt;
254};
255
256#define ADSP_STATE_DISABLED 0
257#define ADSP_STATE_ENABLING 1
258#define ADSP_STATE_ENABLED 2
259#define ADSP_STATE_DISABLING 3
260#define ADSP_STATE_INIT_INFO 4
261
262struct msm_adsp_module {
263 struct mutex lock;
264 const char *name;
265 unsigned id;
266 struct adsp_info *info;
267
268 struct msm_rpc_endpoint *rpc_client;
269 struct msm_adsp_ops *ops;
270 void *driver_data;
271
272 /* statistics */
273 unsigned num_commands;
274 unsigned num_events;
275
276 wait_queue_head_t state_wait;
277 unsigned state;
278
279 struct platform_device pdev;
280 struct clk *clk;
281 int open_count;
282
Saikumar Kondaparthi316620f2012-06-26 15:43:22 +0530283 struct mutex ion_regions_lock;
284 struct hlist_head ion_regions;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700285 int (*verify_cmd) (struct msm_adsp_module*, unsigned int, void *,
286 size_t);
287 int (*patch_event) (struct msm_adsp_module*, struct adsp_event *);
288};
289
290extern void msm_adsp_publish_cdevs(struct msm_adsp_module *, unsigned);
291extern int adsp_init_info(struct adsp_info *info);
292extern void rmtask_init(void);
293
294/* Value to indicate that a queue is not defined for a particular image */
295#define QDSP_RTOS_NO_QUEUE 0xfffffffe
296
297/*
298 * Constants used to communicate with the ADSP RTOS
299 */
300#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M 0x80000000U
301#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V 0x80000000U
302#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_AVAIL_V 0x00000000U
303
304#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_M 0x70000000U
305#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_REQ_V 0x00000000U
306#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_DONE_V 0x10000000U
307#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_NO_CMD_V 0x70000000U
308
309#define ADSP_RTOS_WRITE_CTRL_WORD_STATUS_M 0x0E000000U
310#define ADSP_RTOS_WRITE_CTRL_WORD_NO_ERR_V 0x00000000U
311#define ADSP_RTOS_WRITE_CTRL_WORD_NO_FREE_BUF_V 0x02000000U
312
313#define ADSP_RTOS_WRITE_CTRL_WORD_KERNEL_FLG_M 0x01000000U
314#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_MSG_WRITE_V 0x00000000U
315#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_CMD_V 0x01000000U
316
317#define ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M 0x00FFFFFFU
318#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_CMD_ID_M 0x00FFFFFFU
319
320/* Combination of MUTEX and CMD bits to check if the DSP is busy */
321#define ADSP_RTOS_WRITE_CTRL_WORD_READY_M 0xF0000000U
322#define ADSP_RTOS_WRITE_CTRL_WORD_READY_V 0x70000000U
323
324/* RTOS to Host processor command mask values */
325#define ADSP_RTOS_READ_CTRL_WORD_FLAG_M 0x80000000U
326#define ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_WAIT_V 0x00000000U
327#define ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_CONT_V 0x80000000U
328
329#define ADSP_RTOS_READ_CTRL_WORD_CMD_M 0x60000000U
330#define ADSP_RTOS_READ_CTRL_WORD_READ_DONE_V 0x00000000U
331#define ADSP_RTOS_READ_CTRL_WORD_READ_REQ_V 0x20000000U
332#define ADSP_RTOS_READ_CTRL_WORD_NO_CMD_V 0x60000000U
333
334/* Combination of FLAG and COMMAND bits to check if MSG ready */
335#define ADSP_RTOS_READ_CTRL_WORD_READY_M 0xE0000000U
336#define ADSP_RTOS_READ_CTRL_WORD_READY_V 0xA0000000U
337#define ADSP_RTOS_READ_CTRL_WORD_CONT_V 0xC0000000U
338#define ADSP_RTOS_READ_CTRL_WORD_DONE_V 0xE0000000U
339
340#define ADSP_RTOS_READ_CTRL_WORD_STATUS_M 0x18000000U
341#define ADSP_RTOS_READ_CTRL_WORD_NO_ERR_V 0x00000000U
342
343#define ADSP_RTOS_READ_CTRL_WORD_IN_PROG_M 0x04000000U
344#define ADSP_RTOS_READ_CTRL_WORD_NO_READ_IN_PROG_V 0x00000000U
345#define ADSP_RTOS_READ_CTRL_WORD_READ_IN_PROG_V 0x04000000U
346
347#define ADSP_RTOS_READ_CTRL_WORD_CMD_TYPE_M 0x03000000U
348#define ADSP_RTOS_READ_CTRL_WORD_CMD_TASK_TO_H_V 0x00000000U
349#define ADSP_RTOS_READ_CTRL_WORD_CMD_KRNL_TO_H_V 0x01000000U
350#define ADSP_RTOS_READ_CTRL_WORD_CMD_H_TO_KRNL_CFM_V 0x02000000U
351
352#define ADSP_RTOS_READ_CTRL_WORD_DSP_ADDR_M 0x00FFFFFFU
353
354#define ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M 0x000000FFU
355#define ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M 0x0000FF00U
356
357/* Base address of DSP and DSP hardware registers */
358#define QDSP_RAMC_OFFSET 0x400000
359
360#endif