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