/*
* 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_ */