blob: 31754e444df843e6867e89568f8beac5e0f1074d [file] [log] [blame]
/*
* dspbridge/src/api/linux/DSPProcessor_OEM.c
*
* DSP-BIOS Bridge driver support functions for TI OMAP processors.
*
* Copyright (C) 2007 Texas Instruments, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation version 2.1 of the License.
*
* This program is distributed .as is. WITHOUT ANY WARRANTY of any kind,
* whether express or implied; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
/*
* ======== DSPProcessor_OEM.c ========
* Description:
* This is the source for the DSP/BIOS Bridge API processor module.
*
* Public Functions:
* DSPProcessor_Ctrl - OEM
* DSPProcessor_GetTrace - OEM
* DSPProcessor_Load - OEM
* DSPProcessor_Start - OEM
*
*! Revision History
*! ================
*! 29-Nov-2000 rr: Seperated from DSPProcessor.c
*
*/
/* ----------------------------------- Host OS */
#include <host_os.h>
/* ----------------------------------- DSP/BIOS Bridge */
#include <dbdefs.h>
#include <errbase.h>
/* ----------------------------------- Others */
#include <dsptrap.h>
/* ----------------------------------- This */
#include "_dbdebug.h"
#include "_dbpriv.h"
#include <DSPProcessor_OEM.h>
#ifdef DEBUG_BRIDGE_PERF
#include <perfutils.h>
#endif
/*
* ======== DSPProcessor_Ctrl ========
* Purpose:
* Pass control information to the GPP device driver managing the
* DSP processor.
* This will be an OEM-only function, and not part of the 'Bridge
* application developer's API.
*/
DBAPI DSPProcessor_Ctrl(DSP_HPROCESSOR hProcessor, ULONG dwCmd,
IN OPTIONAL struct DSP_CBDATA *pArgs)
{
DSP_STATUS status = DSP_SOK;
Trapped_Args tempStruct;
DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Ctrl\r\n")));
/* Check the handle */
if (hProcessor) {
tempStruct.ARGS_PROC_CTRL.hProcessor = hProcessor;
tempStruct.ARGS_PROC_CTRL.dwCmd = dwCmd;
tempStruct.ARGS_PROC_CTRL.pArgs = pArgs;
status = DSPTRAP_Trap(&tempStruct, CMD_PROC_CTRL_OFFSET);
} else {
/* Invalid handle */
status = DSP_EHANDLE;
DEBUGMSG(DSPAPI_ZONE_ERROR,
(TEXT("PROC: Invalid Handle \r\n")));
}
return status;
}
/*
* ======== DSPProcessor_Load ========
* Purpose:
* Reset a processor and load a new base program image.
* This will be an OEM-only function, and not part of the 'Bridge
* application developer's API.
*/
DBAPI DSPProcessor_Load(DSP_HPROCESSOR hProcessor, IN CONST INT iArgc,
IN CONST CHAR **aArgv, IN CONST CHAR **aEnvp)
{
DSP_STATUS status = DSP_SOK;
Trapped_Args tempStruct;
#ifdef DEBUG_BRIDGE_PERF
struct timeval tv_beg;
struct timeval tv_end;
struct timezone tz;
int timeRetVal = 0;
timeRetVal = getTimeStamp(&tv_beg);
#endif
DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Load\r\n")));
/* Check the handle */
if (hProcessor) {
if (iArgc > 0) {
if (!DSP_ValidReadPtr(aArgv, iArgc)) {
tempStruct.ARGS_PROC_LOAD.hProcessor =
hProcessor;
tempStruct.ARGS_PROC_LOAD.iArgc = iArgc;
tempStruct.ARGS_PROC_LOAD.aArgv =
(CHAR **)aArgv;
tempStruct.ARGS_PROC_LOAD.aEnvp =
(CHAR **)aEnvp;
status = DSPTRAP_Trap(&tempStruct,
CMD_PROC_LOAD_OFFSET);
} else {
status = DSP_EPOINTER;
DEBUGMSG(DSPAPI_ZONE_ERROR,
(TEXT("PROC: Null pointer in input \r\n")));
}
} else {
status = DSP_EINVALIDARG;
DEBUGMSG(DSPAPI_ZONE_ERROR,
(TEXT("PROC: iArgc is invalid. \r\n")));
}
} else {
/* Invalid handle */
status = DSP_EHANDLE;
DEBUGMSG(DSPAPI_ZONE_ERROR,
(TEXT("PROC: Invalid Handle \r\n")));
}
#ifdef DEBUG_BRIDGE_PERF
timeRetVal = getTimeStamp(&tv_end);
PrintStatistics(&tv_beg, &tv_end, "DSPProcessor_Load", 0);
#endif
return status;
}
/*
* ======== DSPProcessor_Start ========
* Purpose:
* Start a processor running.
*/
DBAPI DSPProcessor_Start(DSP_HPROCESSOR hProcessor)
{
DSP_STATUS status = DSP_SOK;
Trapped_Args tempStruct;
DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Start\r\n")));
/* Check the handle */
if (hProcessor) {
tempStruct.ARGS_PROC_START.hProcessor = hProcessor;
status = DSPTRAP_Trap(&tempStruct, CMD_PROC_START_OFFSET);
} else {
/* Invalid handle */
status = DSP_EHANDLE;
DEBUGMSG(DSPAPI_ZONE_ERROR,
(TEXT("PROC: Invalid Handle \r\n")));
}
return status;
}
/*
* ======== DSPProcessor_Stop ========
* Purpose:
* Stop a running processor .
*/
DBAPI DSPProcessor_Stop(DSP_HPROCESSOR hProcessor)
{
DSP_STATUS status = DSP_SOK;
Trapped_Args tempStruct;
DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("PROC: DSPProcessor_Stop\r\n")));
/* Check the handle */
if (hProcessor) {
tempStruct.ARGS_PROC_START.hProcessor = hProcessor;
status = DSPTRAP_Trap(&tempStruct, CMD_PROC_STOP_OFFSET);
} else {
/* Invalid handle */
status = DSP_EHANDLE;
DEBUGMSG(DSPAPI_ZONE_ERROR,
(TEXT("PROC: Invalid Handle \r\n")));
}
return status;
}