492 lines
15 KiB
C
492 lines
15 KiB
C
/*
|
|
* Copyright 2001-2008 Texas Instruments - http://www.ti.com/
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/*
|
|
* ======== drv.h ========
|
|
* DSP-BIOS Bridge driver support functions for TI OMAP processors.
|
|
* Purpose:
|
|
* DRV Resource allocation module. Driver Object gets Created
|
|
* at the time of Loading. It holds the List of Device Objects
|
|
* in the Syste,
|
|
*
|
|
* Public Functions:
|
|
* DRV_Create
|
|
* DRV_Destroy
|
|
* DRV_Exit
|
|
* DRV_GetDevObject
|
|
* DRV_GetDevExtension
|
|
* DRV_GetFirstDevObject
|
|
* DRV_GetNextDevObject
|
|
* DRV_GetNextDevExtension
|
|
* DRV_Init
|
|
* DRV_InsertDevObject
|
|
* DRV_RemoveDevObject
|
|
* DRV_RequestResources
|
|
* DRV_ReleaseResources
|
|
*
|
|
*! Revision History
|
|
*! ================
|
|
*! 10-Feb-2004 vp: Added OMAP24xx specific definitions.
|
|
*! 14-Aug-2000 rr: Cleaned up.
|
|
*! 27-Jul-2000 rr: DRV_RequestResources split into two(Request and Release)
|
|
*! Device extension created to hold the DevNodeString.
|
|
*! 17-Jul-2000 rr: Driver Object holds the list of Device Objects.
|
|
*! Added DRV_Create, DRV_Destroy, DRV_GetDevObject,
|
|
*! DRV_GetFirst/NextDevObject, DRV_Insert/RemoveDevObject.
|
|
*! 12-Nov-1999 rr: New Flag defines for DRV_ASSIGN and DRV_RELEASE
|
|
*! 25-Oct-1999 rr: Resource Structure removed.
|
|
*! 15-Oct-1999 rr: New Resource structure created.
|
|
*! 05-Oct-1999 rr: Added DRV_RequestResources
|
|
*! Removed fxn'sDRV_RegisterMiniDriver(), DRV_UnRegisterMiniDriver()
|
|
*! Removed Structures DSP_DRIVER & DRV_EXTENSION.
|
|
*!
|
|
*! 24-Sep-1999 rr: Added DRV_EXTENSION and DSP_DRIVER structures.
|
|
*!
|
|
*/
|
|
|
|
#ifndef DRV_
|
|
#define DRV_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <devdefs.h>
|
|
|
|
#include <drvdefs.h>
|
|
|
|
#define DRV_ASSIGN 1
|
|
#define DRV_RELEASE 0
|
|
|
|
#ifdef OMAP_2430
|
|
|
|
#if 0
|
|
#warning "For tests only remove !!!"
|
|
/* #define OMAP_DSP_BASE 0x5CE00000 */
|
|
#define OMAP_DSP_BASE 0x5C000000
|
|
/* #define OMAP_DSP_SIZE 0x00810000 */
|
|
#define OMAP_DSP_SIZE 0x00F18000
|
|
/* #define OMAP_DSP_SIZE 0x00008000 */
|
|
#endif
|
|
|
|
/* currently we support DSP images with internal L2 and L1 using
|
|
* the adress space 0x1000:0000 to 0x10ff:ffff
|
|
* And since the first 8MB is reserved, start mapping from
|
|
* 0x1080:0000
|
|
*/
|
|
|
|
#define OMAP_DSP_BASE 0x5C800000
|
|
#define OMAP_DSP_SIZE 0x00718000
|
|
|
|
#define OMAP_GEM_BASE 0x10800000
|
|
|
|
/*#define OMAP_PRCM_BASE 0x47806000
|
|
#define OMAP_PRCM_SIZE 0x1000*/
|
|
|
|
#define OMAP_PRCM_BASE 0x49006000
|
|
#define OMAP_PRCM_SIZE 0x1000
|
|
|
|
#define OMAP_MBOX_BASE 0x48094000
|
|
#define OMAP_MBOX_SIZE 0x2000
|
|
|
|
#define OMAP_WDTIMER_DSP_BASE 0x48026000
|
|
#define OMAP_WDTIMER_DSP_SIZE 0x2000
|
|
|
|
#define OMAP_DMMU_BASE 0x5D000000
|
|
#define OMAP_DMMU_SIZE 0x4000
|
|
|
|
/*#define OMAP_SYSC_BASE 0x47802000
|
|
#define OMAP_SYSC_SIZE 0x1000*/
|
|
|
|
/*#define OMAP_SYSC_BASE 0x01C20000
|
|
#define OMAP_SYSC_SIZE 0x1000*/
|
|
#define OMAP_SYSC_BASE 0x49002000
|
|
#define OMAP_SYSC_SIZE 0x1000
|
|
#endif
|
|
|
|
|
|
#ifdef OMAP_3430
|
|
|
|
|
|
/* Provide the DSP Internal memory windows that can be accessed from L3 address
|
|
* space
|
|
*/
|
|
|
|
#define OMAP_GEM_BASE 0x107F8000
|
|
#define OMAP_DSP_SIZE 0x00720000
|
|
|
|
/* MEM1 is L2 RAM + L2 Cache space */
|
|
#define OMAP_DSP_MEM1_BASE 0x5C7F8000
|
|
#define OMAP_DSP_MEM1_SIZE 0x18000
|
|
#define OMAP_DSP_GEM1_BASE 0x107F8000
|
|
|
|
|
|
/* MEM2 is L1P RAM/CACHE space */
|
|
#define OMAP_DSP_MEM2_BASE 0x5CE00000
|
|
#define OMAP_DSP_MEM2_SIZE 0x8000
|
|
#define OMAP_DSP_GEM2_BASE 0x10E00000
|
|
|
|
/* MEM3 is L1D RAM/CACHE space */
|
|
#define OMAP_DSP_MEM3_BASE 0x5CF04000
|
|
#define OMAP_DSP_MEM3_SIZE 0x14000
|
|
#define OMAP_DSP_GEM3_BASE 0x10F04000
|
|
|
|
|
|
#define OMAP_IVA2_PRM_BASE 0x48306000
|
|
#define OMAP_IVA2_PRM_SIZE 0x1000
|
|
|
|
#define OMAP_IVA2_CM_BASE 0x48004000
|
|
#define OMAP_IVA2_CM_SIZE 0x1000
|
|
|
|
#define OMAP_PER_CM_BASE 0x48005000
|
|
#define OMAP_PER_CM_SIZE 0x1000
|
|
|
|
#define OMAP_SYSC_BASE 0x48002000
|
|
#define OMAP_SYSC_SIZE 0x1000
|
|
|
|
#define OMAP_MBOX_BASE 0x48094000
|
|
#define OMAP_MBOX_SIZE 0x1000
|
|
|
|
// Do we have a WDT for DSP?
|
|
// #define OMAP_WDTIMER_DSP_BASE 0x48026000
|
|
// #define OMAP_WDTIMER_DSP_SIZE 0x2000
|
|
|
|
#define OMAP_DMMU_BASE 0x5D000000
|
|
#define OMAP_DMMU_SIZE 0x1000
|
|
|
|
#define OMAP_PRCM_VDD1_DOMAIN 1
|
|
#define OMAP_PRCM_VDD2_DOMAIN 2
|
|
|
|
#endif
|
|
|
|
#ifndef RES_CLEANUP_DISABLE
|
|
/**************************************************************************/
|
|
/******************** GPP PROCESS CLEANUP Data structures *****************/
|
|
/**************************************************************************/
|
|
//#ifndef RES_CLEANUP_DISABLE
|
|
/* New structure (member of process context) abstracts NODE resource info */
|
|
struct NODE_RES_OBJECT {
|
|
DSP_HNODE hNode;
|
|
bool nodeAllocated; //Node status
|
|
bool heapAllocated; //Heap status
|
|
bool streamsAllocated; //Streams status
|
|
struct NODE_RES_OBJECT *next;
|
|
} ;
|
|
|
|
/* New structure (member of process context) abstracts DMM resource info */
|
|
struct DMM_RES_OBJECT {
|
|
bool dmmAllocated; //DMM status
|
|
ULONG ulMpuAddr;
|
|
ULONG ulDSPAddr;
|
|
ULONG ulDSPResAddr;
|
|
ULONG dmmSize;
|
|
HANDLE hProcessor;
|
|
struct DMM_RES_OBJECT *next;
|
|
} ;
|
|
|
|
/* New structure (member of process context) abstracts DMM resource info */
|
|
struct DSPHEAP_RES_OBJECT {
|
|
bool heapAllocated; //DMM status
|
|
ULONG ulMpuAddr;
|
|
ULONG ulDSPAddr;
|
|
ULONG ulDSPResAddr;
|
|
ULONG heapSize;
|
|
HANDLE hProcessor;
|
|
struct DSPHEAP_RES_OBJECT *next;
|
|
} ;
|
|
|
|
/* New structure (member of process context) abstracts stream resource info */
|
|
struct STRM_RES_OBJECT {
|
|
bool streamAllocated; //Stream status
|
|
DSP_HSTREAM hStream;
|
|
UINT uNumBufs;
|
|
UINT uDir;
|
|
struct STRM_RES_OBJECT *next;
|
|
} ;
|
|
/* Overall Bridge process resource usage state */
|
|
typedef enum {
|
|
PROC_RES_ALLOCATED ,
|
|
PROC_RES_FREED
|
|
} GPP_PROC_RES_STATE;
|
|
|
|
/* Process Context */
|
|
struct PROCESS_CONTEXT{
|
|
/* Process State */
|
|
GPP_PROC_RES_STATE resState;
|
|
|
|
/* Process ID (Same as UNIX process ID) */
|
|
UINT pid;
|
|
|
|
/* Pointer to next process context
|
|
* (To maintain a linked list of process contexts) */
|
|
struct PROCESS_CONTEXT *next;
|
|
|
|
/* Processor info to which the process is related */
|
|
DSP_HPROCESSOR hProcessor;
|
|
|
|
/* DSP Node resources */
|
|
struct NODE_RES_OBJECT *pNodeList;
|
|
|
|
/* DMM resources */
|
|
struct DMM_RES_OBJECT *pDMMList;
|
|
|
|
/* DSP Heap resources */
|
|
struct DSPHEAP_RES_OBJECT *pDSPHEAPList;
|
|
|
|
/* Stream resources */
|
|
struct STRM_RES_OBJECT *pSTRMList;
|
|
} ;
|
|
#endif
|
|
|
|
/*
|
|
* ======== DRV_Create ========
|
|
* Purpose:
|
|
* Creates the Driver Object. This is done during the driver loading.
|
|
* There is only one Driver Object in the DSP/BIOS Bridge.
|
|
* Parameters:
|
|
* phDrvObject: Location to store created DRV Object handle.
|
|
* Returns:
|
|
* DSP_SOK: Sucess
|
|
* DSP_EMEMORY: Failed in Memory allocation
|
|
* DSP_EFAIL: General Failure
|
|
* Requires:
|
|
* DRV Initialized (cRefs > 0 )
|
|
* phDrvObject != NULL.
|
|
* Ensures:
|
|
* DSP_SOK: - *phDrvObject is a valid DRV interface to the device.
|
|
* - List of DevObject Created and Initialized.
|
|
* - List of DevNode String created and intialized.
|
|
* - Registry is updated with the DRV Object.
|
|
* !DSP_SOK: DRV Object not created
|
|
* Details:
|
|
* There is one Driver Object for the Driver representing
|
|
* the driver itself. It contains the list of device
|
|
* Objects and the list of Device Extensions in the system.
|
|
* Also it can hold other neccessary
|
|
* information in its storage area.
|
|
*/
|
|
extern DSP_STATUS DRV_Create(struct DRV_OBJECT* * phDrvObject);
|
|
|
|
/*
|
|
* ======== DRV_Destroy ========
|
|
* Purpose:
|
|
* destroys the Dev Object list, DrvExt list
|
|
* and destroy the DRV object
|
|
* Called upon driver unLoading.or unsuccesful loading of the driver.
|
|
* Parameters:
|
|
* hDrvObject: Handle to Driver object .
|
|
* Returns:
|
|
* DSP_SOK: Success.
|
|
* DSP_EFAIL: Failed to destroy DRV Object
|
|
* Requires:
|
|
* DRV Initialized (cRegs > 0 )
|
|
* hDrvObject is not NULL and a valid DRV handle .
|
|
* List of DevObject is Empty.
|
|
* List of DrvExt is Empty
|
|
* Ensures:
|
|
* DSP_SOK: - DRV Object destroyed and hDrvObject is not a valid
|
|
* DRV handle.
|
|
* - Registry is updated with "0" as the DRV Object.
|
|
*/
|
|
extern DSP_STATUS DRV_Destroy(struct DRV_OBJECT* hDrvObject);
|
|
|
|
/*
|
|
* ======== DRV_Exit ========
|
|
* Purpose:
|
|
* Exit the DRV module, freeing any modules initialized in DRV_Init.
|
|
* Parameters:
|
|
* Returns:
|
|
* Requires:
|
|
* Ensures:
|
|
*/
|
|
extern VOID DRV_Exit();
|
|
|
|
/*
|
|
* ======== DRV_GetFirstDevObject ========
|
|
* Purpose:
|
|
* Returns the Ptr to the FirstDev Object in the List
|
|
* Parameters:
|
|
* Requires:
|
|
* DRV Initialized
|
|
* Returns:
|
|
* dwDevObject: Ptr to the First Dev Object as a DWORD
|
|
* 0 if it fails to retrieve the First Dev Object
|
|
* Ensures:
|
|
*/
|
|
extern DWORD DRV_GetFirstDevObject();
|
|
|
|
/*
|
|
* ======== DRV_GetFirstDevExtension ========
|
|
* Purpose:
|
|
* Returns the Ptr to the First Device Extension in the List
|
|
* Parameters:
|
|
* Requires:
|
|
* DRV Initialized
|
|
* Returns:
|
|
* dwDevExtension: Ptr to the First Device Extension as a DWORD
|
|
* 0: Failed to Get the Device Extension
|
|
* Ensures:
|
|
*/
|
|
extern DWORD DRV_GetFirstDevExtension();
|
|
|
|
/*
|
|
* ======== DRV_GetDevObject ========
|
|
* Purpose:
|
|
* Given a index, returns a handle to DevObject from the list
|
|
* Parameters:
|
|
* hDrvObject: Handle to the Manager
|
|
* phDevObject: Location to store the Dev Handle
|
|
* Requires:
|
|
* DRV Initialized
|
|
* uIndex >= 0
|
|
* hDrvObject is not NULL and Valid DRV Object
|
|
* phDevObject is not NULL
|
|
* Device Object List not Empty
|
|
* Returns:
|
|
* DSP_SOK: Success
|
|
* DSP_EFAIL: Failed to Get the Dev Object
|
|
* Ensures:
|
|
* DSP_SOK: *phDevObject != NULL
|
|
* DSP_EFAIL: *phDevObject = NULL
|
|
*/
|
|
extern DSP_STATUS DRV_GetDevObject(UINT uIndex, struct DRV_OBJECT* hDrvObject,
|
|
struct DEV_OBJECT* * phDevObject);
|
|
|
|
/*
|
|
* ======== DRV_GetNextDevObject ========
|
|
* Purpose:
|
|
* Returns the Ptr to the Next Device Object from the the List
|
|
* Parameters:
|
|
* hDevObject: Handle to the Device Object
|
|
* Requires:
|
|
* DRV Initialized
|
|
* hDevObject != 0
|
|
* Returns:
|
|
* dwDevObject: Ptr to the Next Dev Object as a DWORD
|
|
* 0: If it fail to get the next Dev Object.
|
|
* Ensures:
|
|
*/
|
|
extern DWORD DRV_GetNextDevObject(DWORD hDevObject);
|
|
|
|
/*
|
|
* ======== DRV_GetNextDevExtension ========
|
|
* Purpose:
|
|
* Returns the Ptr to the Next Device Extension from the the List
|
|
* Parameters:
|
|
* hDevExtension: Handle to the Device Extension
|
|
* Requires:
|
|
* DRV Initialized
|
|
* hDevExtension != 0.
|
|
* Returns:
|
|
* dwDevExtension: Ptr to the Next Dev Extension
|
|
* 0: If it fail to Get the next Dev Extension
|
|
* Ensures:
|
|
*/
|
|
extern DWORD DRV_GetNextDevExtension(DWORD hDevExtension);
|
|
|
|
/*
|
|
* ======== DRV_Init ========
|
|
* Purpose:
|
|
* Initialize the DRV module.
|
|
* Parameters:
|
|
* Returns:
|
|
* TRUE if success; FALSE otherwise.
|
|
* Requires:
|
|
* Ensures:
|
|
*/
|
|
extern DSP_STATUS DRV_Init();
|
|
|
|
/*
|
|
* ======== DRV_InsertDevObject ========
|
|
* Purpose:
|
|
* Insert a DeviceObject into the list of Driver object.
|
|
* Parameters:
|
|
* hDrvObject: Handle to DrvObject
|
|
* hDevObject: Handle to DeviceObject to insert.
|
|
* Returns:
|
|
* DSP_SOK: If successful.
|
|
* DSP_EFAIL: General Failure:
|
|
* Requires:
|
|
* hDrvObject != NULL and Valid DRV Handle.
|
|
* hDevObject != NULL.
|
|
* Ensures:
|
|
* DSP_SOK: Device Object is inserted and the List is not empty.
|
|
*/
|
|
extern DSP_STATUS DRV_InsertDevObject(struct DRV_OBJECT* hDrvObject,
|
|
struct DEV_OBJECT* hDevObject);
|
|
|
|
/*
|
|
* ======== DRV_RemoveDevObject ========
|
|
* Purpose:
|
|
* Search for and remove a Device object from the given list of Device Obj
|
|
* objects.
|
|
* Parameters:
|
|
* hDrvObject: Handle to DrvObject
|
|
* hDevObject: Handle to DevObject to Remove
|
|
* Returns:
|
|
* DSP_SOK: Success.
|
|
* DSP_EFAIL: Unable to find pDevObject.
|
|
* Requires:
|
|
* hDrvObject != NULL and a Valid DRV Handle.
|
|
* hDevObject != NULL.
|
|
* List exists and is not empty.
|
|
* Ensures:
|
|
* List either does not exist (NULL), or is not empty if it does exist.
|
|
*/
|
|
extern DSP_STATUS DRV_RemoveDevObject(struct DRV_OBJECT* hDrvObject,
|
|
struct DEV_OBJECT* hDevObject);
|
|
|
|
/*
|
|
* ======== DRV_RequestResources ========
|
|
* Purpose:
|
|
* Assigns the Resources or Releases them.
|
|
* Parameters:
|
|
* dwContext: Path to the driver Registry Key.
|
|
* pDevNodeString: Ptr to DevNode String stored in the Device Ext.
|
|
* Returns:
|
|
* TRUE if success; FALSE otherwise.
|
|
* Requires:
|
|
* Ensures:
|
|
* The Resources are assigned based on Bus type.
|
|
* The hardware is initialized. Resource information is
|
|
* gathered from the Registry(ISA, PCMCIA)or scanned(PCI)
|
|
* Resource structure is stored in the registry which will be
|
|
* later used by the CFG module.
|
|
*/
|
|
extern DSP_STATUS DRV_RequestResources(IN DWORD dwContext,
|
|
OUT DWORD * pDevNodeString);
|
|
|
|
/*
|
|
* ======== DRV_ReleaseResources ========
|
|
* Purpose:
|
|
* Assigns the Resources or Releases them.
|
|
* Parameters:
|
|
* dwContext: Path to the driver Registry Key.
|
|
* hDrvObject: Handle to the Driver Object.
|
|
* Returns:
|
|
* TRUE if success; FALSE otherwise.
|
|
* Requires:
|
|
* Ensures:
|
|
* The Resources are released based on Bus type.
|
|
* Resource structure is deleted from the registry
|
|
*/
|
|
extern DSP_STATUS DRV_ReleaseResources(IN DWORD dwContext,
|
|
struct DRV_OBJECT* hDrvObject);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* DRV_ */
|