2 * This file is part of OMAP DSP driver (DSP Gateway version 3.3.1)
4 * Copyright (C) 2002-2006 Nokia Corporation. All rights reserved.
6 * Contact: Toshihiro Kobayashi <toshihiro.kobayashi@nokia.com>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 #include <linux/platform_device.h>
25 #include "hardware_dsp.h"
26 #include "dsp_common.h"
29 * MAJOR device number: !! allocated arbitrary !!
31 #define OMAP_DSP_CTL_MAJOR 96
32 #define OMAP_DSP_TASK_MAJOR 97
34 #define OLD_BINARY_SUPPORT y
36 #ifdef OLD_BINARY_SUPPORT
37 #define MBREV_3_0 0x0017
38 #define MBREV_3_2 0x0018
41 #define DSP_INIT_PAGE 0xfff000
43 #ifdef CONFIG_ARCH_OMAP1
44 /* idle program will be placed at IDLEPG_BASE. */
45 #define IDLEPG_BASE 0xfffe00
46 #define IDLEPG_SIZE 0x100
47 #endif /* CONFIG_ARCH_OMAP1 */
49 /* timeout value for DSP response */
50 #define DSP_TIMEOUT (10 * HZ)
53 MEM_TYPE_CROSSING = -1,
69 CFGSTAT_RESUME, /* request only */
79 /* keep 2 entries for TID_FREE and TID_ANON */
80 #define TASKDEV_MAX 254
82 #define MK32(uw,lw) (((u32)(uw)) << 16 | (lw))
83 #define MKLONG(uw,lw) (((unsigned long)(uw)) << 16 | (lw))
84 #define MKVIRT(uw,lw) dspword_to_virt(MKLONG((uw), (lw)));
93 struct mem_sync_struct {
94 struct sync_seq *DARAM;
95 struct sync_seq *SARAM;
96 struct sync_seq *SDRAM;
99 /* struct mbcmd and union mbcmd_hw must be compatible */
107 #define MBCMD_INIT(h, l, d) { \
119 extern struct mbx *mbx_dsp;
120 extern void dsp_mbx_start(void);
121 extern void dsp_mbx_stop(void);
122 extern int dsp_mbx_config(void *p);
123 extern int sync_with_dsp(u16 *syncwd, u16 tid, int try_cnt);
124 extern int __dsp_mbcmd_send_exarg(struct mbcmd *mb, struct mb_exarg *arg,
126 #define dsp_mbcmd_send(mb) __dsp_mbcmd_send_exarg((mb), NULL, 0)
127 #define dsp_mbcmd_send_exarg(mb, arg) __dsp_mbcmd_send_exarg((mb), (arg), 0)
128 extern int dsp_mbcmd_send_and_wait_exarg(struct mbcmd *mb, struct mb_exarg *arg,
129 wait_queue_head_t *q);
130 #define dsp_mbcmd_send_and_wait(mb, q) \
131 dsp_mbcmd_send_and_wait_exarg((mb), NULL, (q))
133 static __inline__ int __mbcompose_send_exarg(u8 cmd_h, u8 cmd_l, u16 data,
134 struct mb_exarg *arg,
137 struct mbcmd mb = MBCMD_INIT(cmd_h, cmd_l, data);
138 return __dsp_mbcmd_send_exarg(&mb, arg, recovery_flag);
140 #define mbcompose_send(cmd_h, cmd_l, data) \
141 __mbcompose_send_exarg(MBX_CMD_DSP_##cmd_h, (cmd_l), (data), NULL, 0)
142 #define mbcompose_send_exarg(cmd_h, cmd_l, data, arg) \
143 __mbcompose_send_exarg(MBX_CMD_DSP_##cmd_h, (cmd_l), (data), arg, 0)
144 #define mbcompose_send_recovery(cmd_h, cmd_l, data) \
145 __mbcompose_send_exarg(MBX_CMD_DSP_##cmd_h, (cmd_l), (data), NULL, 1)
147 static __inline__ int __mbcompose_send_and_wait_exarg(u8 cmd_h, u8 cmd_l,
149 struct mb_exarg *arg,
150 wait_queue_head_t *q)
152 struct mbcmd mb = MBCMD_INIT(cmd_h, cmd_l, data);
153 return dsp_mbcmd_send_and_wait_exarg(&mb, arg, q);
155 #define mbcompose_send_and_wait(cmd_h, cmd_l, data, q) \
156 __mbcompose_send_and_wait_exarg(MBX_CMD_DSP_##cmd_h, (cmd_l), (data), \
158 #define mbcompose_send_and_wait_exarg(cmd_h, cmd_l, data, arg, q) \
159 __mbcompose_send_and_wait_exarg(MBX_CMD_DSP_##cmd_h, (cmd_l), (data), \
162 extern struct ipbuf_head *bid_to_ipbuf(u16 bid);
163 extern void ipbuf_start(void);
164 extern void ipbuf_stop(void);
165 extern int ipbuf_config(u16 ln, u16 lsz, void *base);
166 extern int ipbuf_sys_config(void *p, enum arm_dsp_dir_e dir);
167 extern int ipbuf_p_validate(void *p, enum arm_dsp_dir_e dir);
168 extern struct ipbuf_head *get_free_ipbuf(u8 tid);
169 extern void release_ipbuf(struct ipbuf_head *ipb_h);
170 extern void balance_ipbuf(void);
171 extern void unuse_ipbuf(struct ipbuf_head *ipb_h);
172 extern void unuse_ipbuf_nowait(struct ipbuf_head *ipb_h);
174 #define release_ipbuf_pvt(ipbuf_pvt) \
176 (ipbuf_pvt)->s = TID_FREE; \
179 extern int mbx_revision;
181 extern int dsp_cfgstat_request(enum cfgstat_e st);
182 extern enum cfgstat_e dsp_cfgstat_get_stat(void);
183 extern int dsp_set_runlevel(u8 level);
185 extern int dsp_task_config_all(u8 n);
186 extern void dsp_task_unconfig_all(void);
187 extern u8 dsp_task_count(void);
188 extern int dsp_taskmod_busy(void);
189 extern int dsp_mkdev(char *name);
190 extern int dsp_rmdev(char *name);
191 extern int dsp_tadd_minor(unsigned char minor, dsp_long_t adr);
192 extern int dsp_tdel_minor(unsigned char minor);
193 extern int dsp_tkill_minor(unsigned char minor);
194 extern long taskdev_state_stale(unsigned char minor);
195 extern int dsp_dbg_config(u16 *buf, u16 sz, u16 lsz);
196 extern void dsp_dbg_stop(void);
198 extern int ipbuf_is_held(u8 tid, u16 bid);
200 extern int dsp_mem_sync_inc(void);
201 extern int dsp_mem_sync_config(struct mem_sync_struct *sync);
202 extern enum dsp_mem_type_e dsp_mem_type(void *vadr, size_t len);
203 extern int dsp_address_validate(void *p, size_t len, char *fmt, ...);
204 extern int dsp_mem_enable(void *adr);
205 extern void dsp_mem_disable(void *adr);
206 #ifdef CONFIG_ARCH_OMAP1
207 extern void dsp_mem_usecount_clear(void);
209 extern void exmap_use(void *vadr, size_t len);
210 extern void exmap_unuse(void *vadr, size_t len);
211 extern unsigned long dsp_virt_to_phys(void *vadr, size_t *len);
212 extern void dsp_mem_start(void);
213 extern void dsp_mem_stop(void);
215 extern void dsp_twch_start(void);
216 extern void dsp_twch_stop(void);
217 extern void dsp_twch_touch(void);
219 extern void dsp_err_start(void);
220 extern void dsp_err_stop(void);
221 extern void dsp_err_set(enum errcode_e code, unsigned long arg);
222 extern void dsp_err_clear(enum errcode_e code);
223 extern int dsp_err_isset(enum errcode_e code);
233 enum cmd_l_type_e cmd_l_type;
234 void (*handler)(struct mbcmd *mb);
237 extern const struct cmdinfo *cmdinfo[];
239 #define cmd_name(mb) (cmdinfo[(mb).cmd_h]->name)
240 extern char *subcmd_name(struct mbcmd *mb);
242 extern void mblog_add(struct mbcmd *mb, enum arm_dsp_dir_e dir);
243 #ifdef CONFIG_OMAP_DSP_MBCMD_VERBOSE
244 extern void mblog_printcmd(struct mbcmd *mb, enum arm_dsp_dir_e dir);
245 #else /* CONFIG_OMAP_DSP_MBCMD_VERBOSE */
246 #define mblog_printcmd(mb, dir) do {} while(0)
247 #endif /* CONFIG_OMAP_DSP_MBCMD_VERBOSE */
249 extern struct platform_device dsp_device;