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