BizHawk/yabause/src/psp/me.h

232 lines
7.0 KiB
C

/* src/psp/me.h: PSP Media Engine access library header
Copyright 2009-2010 Andrew Church
This file is part of Yabause.
Yabause is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Yabause is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Yabause; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef ME_H
#define ME_H
/*************************************************************************/
/* Error codes specific to Media Engine routines */
enum {
/* Media Engine has not been successfully started with meStart() */
ME_ERROR_NOT_STARTED = 0x90000001,
/* Media Engine is currently executing a function */
ME_ERROR_BUSY = 0x90000002,
/* No Media Engine interrupt is pending */
ME_ERROR_NO_INTERRUPT = 0x90000003,
};
/*----------------------------------*/
/* Magic value stored in $k0 to indicate that code is running on the ME */
#define ME_K0_MAGIC 0x3E3E3E3E
/*************************************************************************/
/**
* meStart: Start up the Media Engine. This function must be called
* before any other Media Engine operations are performed.
*
* [Parameters]
* None
* [Return value]
* Zero on success, otherwise an error code (negative)
*/
extern int meStart(void);
/**
* meStop: Stop the Media Engine. No other Media Engine functions except
* meStart() may be called after this function returns.
*
* If code is currently executing on the Media Engine when this function is
* called, the effect on system state is undefined.
*
* [Parameters]
* None
* [Return value]
* None
*/
extern void meStop(void);
/*----------------------------------*/
/**
* meCall: Begin executing the given function on the Media Engine. The
* function must not call any firmware functions, whether directly or
* indirectly. This routine may only be called when the Media Engine is
* idle (i.e., when mePoll() returns zero).
*
* [Parameters]
* function: Function pointer
* argument: Optional argument to function
* [Return value]
* Zero on success, otherwise an error code (negative)
*/
extern int meCall(int (*function)(void *), void *argument);
/**
* mePoll: Check whether the Media Engine is idle.
*
* [Parameters]
* None
* [Return value]
* Zero if the Media Engine is idle, otherwise an error code (negative)
*/
extern int mePoll(void);
/**
* meWait: Wait for the Media Engine to become idle.
*
* [Parameters]
* None
* [Return value]
* Zero if the Media Engine has become (or was already) idle,
* otherwise an error code (negative)
*/
extern int meWait(void);
/**
* meResult: Return the result (return value) of the most recently
* executed function. The result is undefined if the Media Engine has not
* been started or is not idle, if the most recently executed function did
* not return a result (i.e. had a return type of void), or if the most
* recently executed function triggered an exception.
*
* [Parameters]
* None
* [Return value]
* Result of the most recently executed function
*/
extern int meResult(void);
/*----------------------------------*/
/**
* meException: Return whether the most recently executed function
* triggered an exception. The result is undefined if the Media Engine has
* not been started or is not idle.
*
* [Parameters]
* None
* [Return value]
* Nonzero if the most recently executed function triggered an
* exception, else zero
*/
extern int meException(void);
/**
* meExceptionGetData: Retrieve CPU status register values related to the
* most recent exception. The values retrieved are undefined in any case
* where meException() returns zero or has an undefined return value.
*
* NULL can be passed for any unneeded register values.
*
* [Parameters]
* BadVAddr_ret: Pointer to variable to receive BadVAddr register value
* Status_ret: Pointer to variable to receive Status register value
* Cause_ret: Pointer to variable to receive Cause register value
* EPC_ret: Pointer to variable to receive EPC register value
* ErrorEPC_ret: Pointer to variable to receive ErrorEPC register value
* [Return value]
* None
*/
extern void meExceptionGetData(uint32_t *BadVAddr_ret, uint32_t *Status_ret,
uint32_t *Cause_ret, uint32_t *EPC_ret,
uint32_t *ErrorEPC_ret);
/**
* meExceptionSetFatal: Set whether an exception on the Media Engine
* should automatically trigger an exception on the main CPU. If enabled,
* any call to mePoll() or meWait() when an exception is pending will cause
* an address error exception to be generated on the main CPU, with
* exception status information stored in a buffer pointed to by $gp:
* 0($gp) = Status
* 4($gp) = Cause
* 8($gp)= EPC or ErrorEPC (depending on the exception type)
* 12($gp) = BadVAddr
* 16($gp) = Media Engine's $sp
* 20($gp) = Media Engine's $gp
* All general-purpose registers other than $sp and $gp, as well as $hi and
* $lo, are copied from the Media Engine.
*
* Unlike other functions in this library, this function can be called even
* when the ME is not running, and it will always succeed.
*
* By default, exceptions are not fatal.
*
* [Parameters]
* fatal: Nonzero to make exceptions fatal, zero to make them nonfatal
* [Return value]
* None
*/
extern void meExceptionSetFatal(int fatal);
/*----------------------------------*/
/**
* meInterruptPoll: Return whether an interrupt from the Media Engine is
* pending. Any pending interrupt is _not_ cleared.
*
* [Parameters]
* None
* [Return value]
* Zero if an interrupt from the Media Engine is pending, otherwise an
* error code (negative)
*/
extern int meInterruptPoll(void);
/**
* meInterruptWait: Wait for an interrupt from the Media Engine if none is
* already pending, then clear the interrupt and return.
*
* [Parameters]
* None
* [Return value]
* Zero if an interrupt was received from the Media Engine, otherwise
* an error code (negative)
*/
extern int meInterruptWait(void);
/**
* meInterruptClear: Clear any pending Media Engine interrupt.
*
* [Parameters]
* None
* [Return value]
* None
*/
extern void meInterruptClear(void);
/*************************************************************************/
#endif // ME_H
/*
* Local variables:
* c-file-style: "stroustrup"
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
* indent-tabs-mode: nil
* End:
*
* vim: expandtab shiftwidth=4:
*/