1 /*
2  * io_sm.h
3  *
4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5  *
6  * IO dispatcher for a shared memory channel driver.
7  * Also, includes macros to simulate shm via port io calls.
8  *
9  * Copyright (C) 2005-2006 Texas Instruments, Inc.
10  *
11  * This package is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  *
15  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18  */
19 
20 #ifndef IOSM_
21 #define IOSM_
22 
23 #include <dspbridge/_chnl_sm.h>
24 #include <dspbridge/host_os.h>
25 
26 #include <dspbridge/io.h>
27 #include <dspbridge/mbx_sh.h>	/* shared mailbox codes */
28 
29 /* Magic code used to determine if DSP signaled exception. */
30 #define DEH_BASE        MBX_DEH_BASE
31 #define DEH_LIMIT       MBX_DEH_LIMIT
32 
33 #define IO_INPUT            0
34 #define IO_OUTPUT           1
35 #define IO_SERVICE          2
36 
37 #ifdef CONFIG_TIDSPBRIDGE_DVFS
38 /* The maximum number of OPPs that are supported */
39 extern s32 dsp_max_opps;
40 /* The Vdd1 opp table information */
41 extern u32 vdd1_dsp_freq[6][4];
42 #endif
43 
44 /*
45  *  ======== io_cancel_chnl ========
46  *  Purpose:
47  *      Cancel IO on a given channel.
48  *  Parameters:
49  *      hio_mgr:     IO Manager.
50  *      chnl:       Index of channel to cancel IO on.
51  *  Returns:
52  *  Requires:
53  *      Valid hio_mgr.
54  *  Ensures:
55  */
56 extern void io_cancel_chnl(struct io_mgr *hio_mgr, u32 chnl);
57 
58 /*
59  *  ======== io_dpc ========
60  *  Purpose:
61  *      Deferred procedure call for shared memory channel driver ISR.  Carries
62  *      out the dispatch of I/O.
63  *  Parameters:
64  *      ref_data:   Pointer to reference data registered via a call to
65  *                  DPC_Create().
66  *  Returns:
67  *  Requires:
68  *      Must not block.
69  *      Must not acquire resources.
70  *      All data touched must be locked in memory if running in kernel mode.
71  *  Ensures:
72  *      Non-preemptible (but interruptible).
73  */
74 extern void io_dpc(unsigned long ref_data);
75 
76 /*
77  *  ======== io_mbox_msg ========
78  *  Purpose:
79  *	Main message handler for the shared memory Bridge channel manager.
80  *	Determine if this message is ours, then schedules a DPC to
81  *	dispatch I/O.
82  *  Parameters:
83  *	self:	Pointer to its own notifier_block struct.
84  *	len:	Length of message.
85  *	msg:	Message code received.
86  *  Returns:
87  *	NOTIFY_OK if handled; NOTIFY_BAD otherwise.
88  */
89 int io_mbox_msg(struct notifier_block *self, unsigned long len, void *msg);
90 
91 /*
92  *  ======== io_request_chnl ========
93  *  Purpose:
94  *      Request I/O from the DSP. Sets flags in shared memory, then interrupts
95  *      the DSP.
96  *  Parameters:
97  *      hio_mgr:     IO manager handle.
98  *      pchnl:      Ptr to the channel requesting I/O.
99  *      io_mode:      Mode of channel: {IO_INPUT | IO_OUTPUT}.
100  *  Returns:
101  *  Requires:
102  *      pchnl != NULL
103  *  Ensures:
104  */
105 extern void io_request_chnl(struct io_mgr *io_manager,
106 			    struct chnl_object *pchnl,
107 			    u8 io_mode, u16 *mbx_val);
108 
109 /*
110  *  ======== iosm_schedule ========
111  *  Purpose:
112  *      Schedule DPC for IO.
113  *  Parameters:
114  *      pio_mgr:     Ptr to a I/O manager.
115  *  Returns:
116  *  Requires:
117  *      pchnl != NULL
118  *  Ensures:
119  */
120 extern void iosm_schedule(struct io_mgr *io_manager);
121 
122 /*
123  *  ======== io_sh_msetting ========
124  *  Purpose:
125  *      Sets the shared memory setting
126  *  Parameters:
127  *      hio_mgr:         Handle to a I/O manager.
128  *      desc:             Shared memory type
129  *      pargs:          Ptr to shm setting
130  *  Returns:
131  *  Requires:
132  *      hio_mgr != NULL
133  *      pargs != NULL
134  *  Ensures:
135  */
136 extern int io_sh_msetting(struct io_mgr *hio_mgr, u8 desc, void *pargs);
137 
138 /*
139  *  Misc functions for the CHNL_IO shared memory library:
140  */
141 
142 /* Maximum channel bufsize that can be used. */
143 extern u32 io_buf_size(struct io_mgr *hio_mgr);
144 
145 #ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
146 /*
147  *  ========print_dsp_trace_buffer ========
148  *      Print DSP tracebuffer.
149  */
150 extern int print_dsp_trace_buffer(struct bridge_dev_context
151 					 *hbridge_context);
152 
153 int dump_dsp_stack(struct bridge_dev_context *bridge_context);
154 
155 void dump_dl_modules(struct bridge_dev_context *bridge_context);
156 
157 #endif
158 #if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
159 void print_dsp_debug_trace(struct io_mgr *hio_mgr);
160 #endif
161 
162 #endif /* IOSM_ */
163