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 */
63DBAPI 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 */
94DBAPI 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 */
155DBAPI 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 */
181DBAPI 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