1 /*
2 * dspbridge/src/api/linux/DSPProcessor_OEM.c
3 *
4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5 *
6 * Copyright (C) 2007 Texas Instruments, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published
10 * by the Free Software Foundation version 2.1 of the License.
11 *
12 * This program is distributed .as is. WITHOUT ANY WARRANTY of any kind,
13 * whether express or implied; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 */
17
18 /*
19 * ======== DSPProcessor_OEM.c ========
20 * Description:
21 * This is the source for the DSP/BIOS Bridge API processor module.
22 *
23 * Public Functions:
24 * DSPProcessor_Ctrl - OEM
25 * DSPProcessor_GetTrace - OEM
26 * DSPProcessor_Load - OEM
27 * DSPProcessor_Start - OEM
28 *
29 *! Revision History
30 *! ================
31 *! 29-Nov-2000 rr: Seperated from DSPProcessor.c
32 *
33 */
34
35 /* ----------------------------------- Host OS */
36 #include <host_os.h>
37
38 /* ----------------------------------- DSP/BIOS Bridge */
39 #include <dbdefs.h>
40 #include <errbase.h>
41
42 /* ----------------------------------- Others */
43 #include <dsptrap.h>
44
45 /* ----------------------------------- This */
46 #include "_dbdebug.h"
47 #include "_dbpriv.h"
48 #include <DSPProcessor_OEM.h>
49 #ifdef DEBUG_BRIDGE_PERF
50 #include <perfutils.h>
51 #endif
52
53
54
55 /*
56 * ======== DSPProcessor_Ctrl ========
57 * Purpose:
58 * Pass control information to the GPP device driver managing the
59 * DSP processor.
60 * This will be an OEM-only function, and not part of the 'Bridge
61 * application developer's API.
62 */
DSPProcessor_Ctrl(DSP_HPROCESSOR hProcessor,ULONG dwCmd,IN OPTIONAL struct DSP_CBDATA * pArgs)63 DBAPI DSPProcessor_Ctrl(DSP_HPROCESSOR hProcessor, ULONG dwCmd,
64 IN OPTIONAL struct DSP_CBDATA *pArgs)
65 {
66 DSP_STATUS status = DSP_SOK;
67 Trapped_Args tempStruct;
68
69 DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Ctrl\r\n")));
70
71 /* Check the handle */
72 if (hProcessor) {
73 tempStruct.ARGS_PROC_CTRL.hProcessor = hProcessor;
74 tempStruct.ARGS_PROC_CTRL.dwCmd = dwCmd;
75 tempStruct.ARGS_PROC_CTRL.pArgs = pArgs;
76 status = DSPTRAP_Trap(&tempStruct, CMD_PROC_CTRL_OFFSET);
77 } else {
78 /* Invalid handle */
79 status = DSP_EHANDLE;
80 DEBUGMSG(DSPAPI_ZONE_ERROR,
81 (TEXT("PROC: Invalid Handle \r\n")));
82 }
83
84 return status;
85 }
86
87 /*
88 * ======== DSPProcessor_Load ========
89 * Purpose:
90 * Reset a processor and load a new base program image.
91 * This will be an OEM-only function, and not part of the 'Bridge
92 * application developer's API.
93 */
DSPProcessor_Load(DSP_HPROCESSOR hProcessor,IN CONST INT iArgc,IN CONST CHAR ** aArgv,IN CONST CHAR ** aEnvp)94 DBAPI DSPProcessor_Load(DSP_HPROCESSOR hProcessor, IN CONST INT iArgc,
95 IN CONST CHAR **aArgv, IN CONST CHAR **aEnvp)
96 {
97 DSP_STATUS status = DSP_SOK;
98 Trapped_Args tempStruct;
99 #ifdef DEBUG_BRIDGE_PERF
100 struct timeval tv_beg;
101 struct timeval tv_end;
102 struct timezone tz;
103 int timeRetVal = 0;
104
105 timeRetVal = getTimeStamp(&tv_beg);
106 #endif
107
108
109 DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Load\r\n")));
110
111 /* Check the handle */
112 if (hProcessor) {
113 if (iArgc > 0) {
114 if (!DSP_ValidReadPtr(aArgv, iArgc)) {
115 tempStruct.ARGS_PROC_LOAD.hProcessor =
116 hProcessor;
117 tempStruct.ARGS_PROC_LOAD.iArgc = iArgc;
118 tempStruct.ARGS_PROC_LOAD.aArgv =
119 (CHAR **)aArgv;
120 tempStruct.ARGS_PROC_LOAD.aEnvp =
121 (CHAR **)aEnvp;
122 status = DSPTRAP_Trap(&tempStruct,
123 CMD_PROC_LOAD_OFFSET);
124 } else {
125 status = DSP_EPOINTER;
126 DEBUGMSG(DSPAPI_ZONE_ERROR,
127 (TEXT("PROC: Null pointer in input \r\n")));
128 }
129 } else {
130 status = DSP_EINVALIDARG;
131 DEBUGMSG(DSPAPI_ZONE_ERROR,
132 (TEXT("PROC: iArgc is invalid. \r\n")));
133 }
134 } else {
135 /* Invalid handle */
136 status = DSP_EHANDLE;
137 DEBUGMSG(DSPAPI_ZONE_ERROR,
138 (TEXT("PROC: Invalid Handle \r\n")));
139 }
140
141 #ifdef DEBUG_BRIDGE_PERF
142 timeRetVal = getTimeStamp(&tv_end);
143 PrintStatistics(&tv_beg, &tv_end, "DSPProcessor_Load", 0);
144
145 #endif
146
147 return status;
148 }
149
150 /*
151 * ======== DSPProcessor_Start ========
152 * Purpose:
153 * Start a processor running.
154 */
DSPProcessor_Start(DSP_HPROCESSOR hProcessor)155 DBAPI DSPProcessor_Start(DSP_HPROCESSOR hProcessor)
156 {
157 DSP_STATUS status = DSP_SOK;
158 Trapped_Args tempStruct;
159
160 DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Start\r\n")));
161
162 /* Check the handle */
163 if (hProcessor) {
164 tempStruct.ARGS_PROC_START.hProcessor = hProcessor;
165 status = DSPTRAP_Trap(&tempStruct, CMD_PROC_START_OFFSET);
166 } else {
167 /* Invalid handle */
168 status = DSP_EHANDLE;
169 DEBUGMSG(DSPAPI_ZONE_ERROR,
170 (TEXT("PROC: Invalid Handle \r\n")));
171 }
172
173 return status;
174 }
175
176 /*
177 * ======== DSPProcessor_Stop ========
178 * Purpose:
179 * Stop a running processor .
180 */
DSPProcessor_Stop(DSP_HPROCESSOR hProcessor)181 DBAPI DSPProcessor_Stop(DSP_HPROCESSOR hProcessor)
182 {
183 DSP_STATUS status = DSP_SOK;
184 Trapped_Args tempStruct;
185
186 DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Stop\r\n")));
187
188 /* Check the handle */
189 if (hProcessor) {
190 tempStruct.ARGS_PROC_START.hProcessor = hProcessor;
191 status = DSPTRAP_Trap(&tempStruct, CMD_PROC_STOP_OFFSET);
192 } else {
193 /* Invalid handle */
194 status = DSP_EHANDLE;
195 DEBUGMSG(DSPAPI_ZONE_ERROR,
196 (TEXT("PROC: Invalid Handle \r\n")));
197 }
198
199 return status;
200 }
201