/*
* dspbridge/mpu_api/inc/nldrdefs.h
*
* 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.
*/
/*
* ======== nldrdefs.h ========
* Description:
* Global Dynamic + static/overlay Node loader (NLDR) constants and types.
*
*! Revision History
*! ================
*! 07-Apr-2003 map Consolidated dldrdefs.h into nldrdefs.h
*! 05-Aug-2002 jeh Created.
*/
#ifndef NLDRDEFS_
#define NLDRDEFS_
#ifdef __cplusplus
extern "C" {
#endif
#include <dbdcddef.h>
#include <devdefs.h>
#define NLDR_MAXPATHLENGTH 255
/* NLDR Objects: */
struct NLDR_OBJECT;
/*typedef struct NLDR_OBJECT *NLDR_HOBJECT;*/
struct NLDR_NODEOBJECT;
/*typedef struct NLDR_NODEOBJECT *NLDR_HNODE;*/
/*
* ======== NLDR_LOADTYPE ========
* Load types for a node. Must match values in node.h55.
*/
typedef enum NLDR_LOADTYPE {
NLDR_STATICLOAD, /* Linked in base image, not overlay */
NLDR_DYNAMICLOAD, /* Dynamically loaded node */
NLDR_OVLYLOAD /* Linked in base image, overlay node */
} NLDR_LOADTYPE;
/*
* ======== NLDR_OVLYFXN ========
* Causes code or data to be copied from load address to run address. This
* is the "COD_WRITEFXN" that gets passed to the DBLL_Library and is used as
* the ZL write function.
*
* Parameters:
* pPrivRef: Handle to identify the node.
* ulDspRunAddr: Run address of code or data.
* ulDspLoadAddr: Load address of code or data.
* ulNumBytes: Number of (GPP) bytes to copy.
* nMemSpace: RMS_CODE or RMS_DATA.
* Returns:
* ulNumBytes: Success.
* 0: Failure.
* Requires:
* Ensures:
*/
typedef ULONG(CDECL * NLDR_OVLYFXN) (PVOID pPrivRef, ULONG ulDspRunAddr,
ULONG ulDspLoadAddr,
ULONG ulNumBytes, UINT nMemSpace);
/*
* ======== NLDR_WRITEFXN ========
* Write memory function. Used for dynamic load writes.
* Parameters:
* pPrivRef: Handle to identify the node.
* ulDspAddr: Address of code or data.
* pBuf: Code or data to be written
* ulNumBytes: Number of (GPP) bytes to write.
* nMemSpace: DBLL_DATA or DBLL_CODE.
* Returns:
* ulNumBytes: Success.
* 0: Failure.
* Requires:
* Ensures:
*/
typedef ULONG(CDECL * NLDR_WRITEFXN) (PVOID pPrivRef,
ULONG ulDspAddr, PVOID pBuf,
ULONG ulNumBytes, UINT nMemSpace);
/*
* ======== NLDR_ATTRS ========
* Attributes passed to NLDR_Create function.
*/
struct NLDR_ATTRS {
NLDR_OVLYFXN pfnOvly;
NLDR_WRITEFXN pfnWrite;
USHORT usDSPWordSize;
USHORT usDSPMauSize;
} ;
/*
* ======== NLDR_PHASE ========
* Indicates node create, delete, or execute phase function.
*/
typedef enum {
NLDR_CREATE,
NLDR_DELETE,
NLDR_EXECUTE,
NLDR_NOPHASE
} NLDR_PHASE;
/*
* Typedefs of loader functions imported from a DLL, or defined in a
* function table.
*/
/*
* ======== NLDR_Allocate ========
* Allocate resources to manage the loading of a node on the DSP.
*
* Parameters:
* hNldr: Handle of loader that will load the node.
* pPrivRef: Handle to identify the node.
* pNodeProps: Pointer to a DCD_NODEPROPS for the node.
* phNldrNode: Location to store node handle on output. This handle
* will be passed to NLDR_Load/NLDR_Unload.
* pfPhaseSplit: pointer to boolean variable referenced in node.c
* Returns:
* DSP_SOK: Success.
* DSP_EMEMORY: Insufficient memory on GPP.
* Requires:
* NLDR_Init() called.
* Valid hNldr.
* pNodeProps != NULL.
* phNldrNode != NULL.
* Ensures:
* DSP_SOK: IsValidNode(*phNldrNode).
* error: *phNldrNode == NULL.
*/
typedef DSP_STATUS(*NLDR_ALLOCATEFXN) (struct NLDR_OBJECT* hNldr,
PVOID pPrivRef,
IN CONST struct DCD_NODEPROPS *pNodeProps,
OUT struct NLDR_NODEOBJECT* * phNldrNode,
OUT bool * pfPhaseSplit);
/*
* ======== NLDR_Create ========
* Create a loader object. This object handles the loading and unloading of
* create, delete, and execute phase functions of nodes on the DSP target.
*
* Parameters:
* phNldr: Location to store loader handle on output.
* hDevObject: Device for this processor.
* pAttrs: Loader attributes.
* Returns:
* DSP_SOK: Success;
* DSP_EMEMORY: Insufficient memory for requested resources.
* Requires:
* NLDR_Init() called.
* phNldr != NULL.
* hDevObject != NULL.
* pAttrs != NULL.
* Ensures:
* DSP_SOK: Valid *phNldr.
* error: *phNldr == NULL.
*/
typedef DSP_STATUS(*NLDR_CREATEFXN) (OUT struct NLDR_OBJECT* * phNldr,
struct DEV_OBJECT* hDevObject,
IN CONST struct NLDR_ATTRS * pAttrs);
/*
* ======== NLDR_Delete ========
* Delete the NLDR loader.
*
* Parameters:
* hNldr: Node manager object.
* Returns:
* Requires:
* NLDR_Init() called.
* Valid hNldr.
* Ensures:
* hNldr invalid
*/
typedef VOID(*NLDR_DELETEFXN) (struct NLDR_OBJECT* hNldr);
/*
* ======== NLDR_Exit ========
* Discontinue usage of NLDR module.
*
* Parameters:
* Returns:
* Requires:
* NLDR_Init() successfully called before.
* Ensures:
* Any resources acquired in NLDR_Init() will be freed when last NLDR
* client calls NLDR_Exit().
*/
typedef VOID(*NLDR_EXITFXN) ();
/*
* ======== NLDR_Free ========
* Free resources allocated in NLDR_Allocate.
*
* Parameters:
* hNldrNode: Handle returned from NLDR_Allocate().
* Returns:
* Requires:
* NLDR_Init() called.
* Valid hNldrNode.
* Ensures:
*/
typedef VOID(*NLDR_FREEFXN) (struct NLDR_NODEOBJECT* hNldrNode);
/*
* ======== NLDR_GetFxnAddr ========
* Get address of create, delete, or execute phase function of a node on
* the DSP.
*
* Parameters:
* hNldrNode: Handle returned from NLDR_Allocate().
* pstrFxn: Name of function.
* pulAddr: Location to store function address.
* Returns:
* DSP_SOK: Success.
* DSP_ESYMBOL: Address of function not found.
* Requires:
* NLDR_Init() called.
* Valid hNldrNode.
* pulAddr != NULL;
* pstrFxn != NULL;
* Ensures:
*/
typedef DSP_STATUS(*NLDR_GETFXNADDRFXN) (struct NLDR_NODEOBJECT* hNldrNode,
PSTR pstrFxn, ULONG * pulAddr);
/*
* ======== NLDR_Init ========
* Initialize the NLDR module.
*
* Parameters:
* Returns:
* TRUE if initialization succeeded, FALSE otherwise.
* Ensures:
*/
typedef bool(*NLDR_INITFXN) ();
/*
* ======== NLDR_Load ========
* Load create, delete, or execute phase function of a node on the DSP.
*
* Parameters:
* hNldrNode: Handle returned from NLDR_Allocate().
* phase: Type of function to load (create, delete, or execute).
* Returns:
* DSP_SOK: Success.
* DSP_EMEMORY: Insufficient memory on GPP.
* DSP_EOVERLAYMEMORY: Can't overlay phase because overlay memory
* is already in use.
* DSP_EDYNLOAD: Failure in dynamic loader library.
* DSP_EFWRITE: Failed to write phase's code or date to target.
* Requires:
* NLDR_Init() called.
* Valid hNldrNode.
* Ensures:
*/
typedef DSP_STATUS(*NLDR_LOADFXN) (struct NLDR_NODEOBJECT* hNldrNode,
NLDR_PHASE phase);
/*
* ======== NLDR_Unload ========
* Unload create, delete, or execute phase function of a node on the DSP.
*
* Parameters:
* hNldrNode: Handle returned from NLDR_Allocate().
* phase: Node function to unload (create, delete, or execute).
* Returns:
* DSP_SOK: Success.
* DSP_EMEMORY: Insufficient memory on GPP.
* Requires:
* NLDR_Init() called.
* Valid hNldrNode.
* Ensures:
*/
typedef DSP_STATUS(*NLDR_UNLOADFXN) (struct NLDR_NODEOBJECT* hNldrNode,
NLDR_PHASE phase);
/*
* ======== NLDR_FXNS ========
*/
struct NLDR_FXNS {
NLDR_ALLOCATEFXN pfnAllocate;
NLDR_CREATEFXN pfnCreate;
NLDR_DELETEFXN pfnDelete;
NLDR_EXITFXN pfnExit;
NLDR_FREEFXN pfnFree;
NLDR_GETFXNADDRFXN pfnGetFxnAddr;
NLDR_INITFXN pfnInit;
NLDR_LOADFXN pfnLoad;
NLDR_UNLOADFXN pfnUnload;
} ;
#ifdef __cplusplus
}
#endif
#endif /* NLDRDEFS_ */