Home | History | Annotate | Download | only in inc
      1 /*
      2  *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
      3  *
      4  *  Licensed under the Apache License, Version 2.0 (the "License");
      5  *  you may not use this file except in compliance with the License.
      6  *  You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  *  Unless required by applicable law or agreed to in writing, software
     11  *  distributed under the License is distributed on an "AS IS" BASIS,
     12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  *  See the License for the specific language governing permissions and
     14  *  limitations under the License.
     15  */
     16 
     17 /*
     18  *  ======== drv.h ========
     19  *  DSP-BIOS Bridge driver support functions for TI OMAP processors.
     20  *  Purpose:
     21  *      DRV Resource allocation module. Driver Object gets Created
     22  *      at the time of Loading. It holds the List of Device Objects
     23  *      in the Syste,
     24  *
     25  *  Public Functions:
     26  *      DRV_Create
     27  *      DRV_Destroy
     28  *      DRV_Exit
     29  *      DRV_GetDevObject
     30  *      DRV_GetDevExtension
     31  *      DRV_GetFirstDevObject
     32  *      DRV_GetNextDevObject
     33  *      DRV_GetNextDevExtension
     34  *      DRV_Init
     35  *      DRV_InsertDevObject
     36  *      DRV_RemoveDevObject
     37  *      DRV_RequestResources
     38  *      DRV_ReleaseResources
     39  *
     40  *! Revision History
     41  *! ================
     42  *! 10-Feb-2004 vp:  Added OMAP24xx specific definitions.
     43  *! 14-Aug-2000 rr:  Cleaned up.
     44  *! 27-Jul-2000 rr:  DRV_RequestResources split into two(Request and Release)
     45  *!                  Device extension created to hold the DevNodeString.
     46  *! 17-Jul-2000 rr:  Driver Object holds the list of Device Objects.
     47  *!                  Added DRV_Create, DRV_Destroy, DRV_GetDevObject,
     48  *!                  DRV_GetFirst/NextDevObject, DRV_Insert/RemoveDevObject.
     49  *! 12-Nov-1999 rr:  New Flag defines for DRV_ASSIGN and DRV_RELEASE
     50  *! 25-Oct-1999 rr:  Resource Structure removed.
     51  *! 15-Oct-1999 rr:  New Resource structure created.
     52  *! 05-Oct-1999 rr:  Added DRV_RequestResources
     53  *!                  Removed fxn'sDRV_RegisterMiniDriver(), DRV_UnRegisterMiniDriver()
     54  *!                  Removed Structures DSP_DRIVER & DRV_EXTENSION.
     55  *!
     56  *! 24-Sep-1999 rr:  Added DRV_EXTENSION and DSP_DRIVER structures.
     57  *!
     58  */
     59 
     60 #ifndef DRV_
     61 #define DRV_
     62 
     63 #ifdef __cplusplus
     64 extern "C" {
     65 #endif
     66 
     67 #include <devdefs.h>
     68 
     69 #include <drvdefs.h>
     70 
     71 #define DRV_ASSIGN     1
     72 #define DRV_RELEASE    0
     73 
     74 #ifdef OMAP_2430
     75 
     76 #if 0
     77 #warning "For tests only remove !!!"
     78 /* #define OMAP_DSP_BASE   0x5CE00000 */
     79 #define OMAP_DSP_BASE   0x5C000000
     80 /* #define OMAP_DSP_SIZE   0x00810000 */
     81 #define OMAP_DSP_SIZE   0x00F18000
     82 /* #define OMAP_DSP_SIZE   0x00008000 */
     83 #endif
     84 
     85 /* currently we support DSP images with internal L2 and L1 using
     86  * the adress space 0x1000:0000 to 0x10ff:ffff
     87  * And since the first 8MB is reserved, start mapping from
     88  * 0x1080:0000
     89  */
     90 
     91 #define OMAP_DSP_BASE   0x5C800000
     92 #define OMAP_DSP_SIZE   0x00718000
     93 
     94 #define OMAP_GEM_BASE   0x10800000
     95 
     96 /*#define OMAP_PRCM_BASE 0x47806000
     97 #define OMAP_PRCM_SIZE 0x1000*/
     98 
     99 #define OMAP_PRCM_BASE 0x49006000
    100 #define OMAP_PRCM_SIZE 0x1000
    101 
    102 #define OMAP_MBOX_BASE 0x48094000
    103 #define OMAP_MBOX_SIZE 0x2000
    104 
    105 #define OMAP_WDTIMER_DSP_BASE 0x48026000
    106 #define OMAP_WDTIMER_DSP_SIZE 0x2000
    107 
    108 #define OMAP_DMMU_BASE 0x5D000000
    109 #define OMAP_DMMU_SIZE 0x4000
    110 
    111 /*#define OMAP_SYSC_BASE 0x47802000
    112 #define OMAP_SYSC_SIZE 0x1000*/
    113 
    114 /*#define OMAP_SYSC_BASE 0x01C20000
    115 #define OMAP_SYSC_SIZE 0x1000*/
    116 #define OMAP_SYSC_BASE 0x49002000
    117 #define OMAP_SYSC_SIZE 0x1000
    118 #endif
    119 
    120 
    121 #ifdef OMAP_3430
    122 
    123 
    124 /* Provide the DSP Internal memory windows that can be accessed from L3 address
    125  * space
    126  */
    127 
    128 #define OMAP_GEM_BASE   0x107F8000
    129 #define OMAP_DSP_SIZE   0x00720000
    130 
    131 /* MEM1 is L2 RAM + L2 Cache space */
    132 #define OMAP_DSP_MEM1_BASE 0x5C7F8000
    133 #define OMAP_DSP_MEM1_SIZE 0x18000
    134 #define OMAP_DSP_GEM1_BASE 0x107F8000
    135 
    136 
    137 /* MEM2 is L1P RAM/CACHE space */
    138 #define OMAP_DSP_MEM2_BASE 0x5CE00000
    139 #define OMAP_DSP_MEM2_SIZE 0x8000
    140 #define OMAP_DSP_GEM2_BASE 0x10E00000
    141 
    142 /* MEM3 is L1D RAM/CACHE space */
    143 #define OMAP_DSP_MEM3_BASE 0x5CF04000
    144 #define OMAP_DSP_MEM3_SIZE 0x14000
    145 #define OMAP_DSP_GEM3_BASE 0x10F04000
    146 
    147 
    148 #define OMAP_IVA2_PRM_BASE 0x48306000
    149 #define OMAP_IVA2_PRM_SIZE 0x1000
    150 
    151 #define OMAP_IVA2_CM_BASE 0x48004000
    152 #define OMAP_IVA2_CM_SIZE 0x1000
    153 
    154 #define OMAP_PER_CM_BASE 0x48005000
    155 #define OMAP_PER_CM_SIZE 0x1000
    156 
    157 #define OMAP_SYSC_BASE 0x48002000
    158 #define OMAP_SYSC_SIZE 0x1000
    159 
    160 #define OMAP_MBOX_BASE 0x48094000
    161 #define OMAP_MBOX_SIZE 0x1000
    162 
    163 // Do we have a WDT for DSP?
    164 // #define OMAP_WDTIMER_DSP_BASE 0x48026000
    165 // #define OMAP_WDTIMER_DSP_SIZE 0x2000
    166 
    167 #define OMAP_DMMU_BASE 0x5D000000
    168 #define OMAP_DMMU_SIZE 0x1000
    169 
    170 #define OMAP_PRCM_VDD1_DOMAIN 1
    171 #define OMAP_PRCM_VDD2_DOMAIN 2
    172 
    173 #endif
    174 
    175 #ifndef RES_CLEANUP_DISABLE
    176 /**************************************************************************/
    177 /******************** GPP PROCESS CLEANUP Data structures *****************/
    178 /**************************************************************************/
    179 //#ifndef RES_CLEANUP_DISABLE
    180 /* New structure (member of process context) abstracts NODE resource info */
    181 struct NODE_RES_OBJECT {
    182          DSP_HNODE       hNode;
    183          bool            nodeAllocated; //Node status
    184          bool            heapAllocated; //Heap status
    185          bool            streamsAllocated; //Streams status
    186          struct NODE_RES_OBJECT         *next;
    187 } ;
    188 
    189 /* New structure (member of process context) abstracts DMM resource info */
    190 struct DMM_RES_OBJECT {
    191          bool            dmmAllocated; //DMM status
    192          ULONG           ulMpuAddr;
    193          ULONG           ulDSPAddr;
    194          ULONG           ulDSPResAddr;
    195          ULONG           dmmSize;
    196          HANDLE          hProcessor;
    197          struct DMM_RES_OBJECT  *next;
    198 } ;
    199 
    200 /* New structure (member of process context) abstracts DMM resource info */
    201 struct DSPHEAP_RES_OBJECT {
    202          bool            heapAllocated; //DMM status
    203          ULONG           ulMpuAddr;
    204          ULONG           ulDSPAddr;
    205          ULONG           ulDSPResAddr;
    206          ULONG           heapSize;
    207          HANDLE          hProcessor;
    208          struct DSPHEAP_RES_OBJECT  *next;
    209 } ;
    210 
    211 /* New structure (member of process context) abstracts stream resource info */
    212 struct STRM_RES_OBJECT {
    213          bool                    streamAllocated; //Stream status
    214          DSP_HSTREAM             hStream;
    215          UINT                    uNumBufs;
    216          UINT                    uDir;
    217          struct STRM_RES_OBJECT         *next;
    218 } ;
    219 /* Overall Bridge process resource usage state */
    220 typedef enum {
    221          PROC_RES_ALLOCATED ,
    222          PROC_RES_FREED
    223 } GPP_PROC_RES_STATE;
    224 
    225 /* Process Context */
    226 struct PROCESS_CONTEXT{
    227          /* Process State */
    228          GPP_PROC_RES_STATE       resState;
    229 
    230          /* Process ID (Same as UNIX process ID) */
    231          UINT                     pid;
    232 
    233         /* Pointer to next process context
    234 		 * (To maintain a linked list of process contexts) */
    235          struct PROCESS_CONTEXT         *next;
    236 
    237          /* Processor info to which the process is related */
    238          DSP_HPROCESSOR           hProcessor;
    239 
    240          /* DSP Node resources */
    241          struct NODE_RES_OBJECT          *pNodeList;
    242 
    243          /* DMM resources */
    244          struct DMM_RES_OBJECT          *pDMMList;
    245 
    246          /* DSP Heap resources */
    247          struct DSPHEAP_RES_OBJECT          *pDSPHEAPList;
    248 
    249          /* Stream resources */
    250          struct STRM_RES_OBJECT         *pSTRMList;
    251 } ;
    252 #endif
    253 
    254 /*
    255  *  ======== DRV_Create ========
    256  *  Purpose:
    257  *      Creates the Driver Object. This is done during the driver loading.
    258  *      There is only one Driver Object in the DSP/BIOS Bridge.
    259  *  Parameters:
    260  *      phDrvObject:    Location to store created DRV Object handle.
    261  *  Returns:
    262  *      DSP_SOK:        Sucess
    263  *      DSP_EMEMORY:    Failed in Memory allocation
    264  *      DSP_EFAIL:      General Failure
    265  *  Requires:
    266  *      DRV Initialized (cRefs > 0 )
    267  *      phDrvObject != NULL.
    268  *  Ensures:
    269  *      DSP_SOK:        - *phDrvObject is a valid DRV interface to the device.
    270  *                      - List of DevObject Created and Initialized.
    271  *                      - List of DevNode String created and intialized.
    272  *                      - Registry is updated with the DRV Object.
    273  *      !DSP_SOK:       DRV Object not created
    274  *  Details:
    275  *      There is one Driver Object for the Driver representing
    276  *      the driver itself. It contains the list of device
    277  *      Objects and the list of Device Extensions in the system.
    278  *      Also it can hold other neccessary
    279  *      information in its storage area.
    280  */
    281 	extern DSP_STATUS DRV_Create(struct DRV_OBJECT* * phDrvObject);
    282 
    283 /*
    284  *  ======== DRV_Destroy ========
    285  *  Purpose:
    286  *      destroys the Dev Object list, DrvExt list
    287  *      and destroy the DRV object
    288  *      Called upon driver unLoading.or unsuccesful loading of the driver.
    289  *  Parameters:
    290  *      hDrvObject:     Handle to Driver object .
    291  *  Returns:
    292  *      DSP_SOK:        Success.
    293  *      DSP_EFAIL:      Failed to destroy DRV Object
    294  *  Requires:
    295  *      DRV Initialized (cRegs > 0 )
    296  *      hDrvObject is not NULL and a valid DRV handle .
    297  *      List of DevObject is Empty.
    298  *      List of DrvExt is Empty
    299  *  Ensures:
    300  *      DSP_SOK:        - DRV Object destroyed and hDrvObject is not a valid
    301  *                        DRV handle.
    302  *                      - Registry is updated with "0" as the DRV Object.
    303  */
    304 	extern DSP_STATUS DRV_Destroy(struct DRV_OBJECT* hDrvObject);
    305 
    306 /*
    307  *  ======== DRV_Exit ========
    308  *  Purpose:
    309  *      Exit the DRV module, freeing any modules initialized in DRV_Init.
    310  *  Parameters:
    311  *  Returns:
    312  *  Requires:
    313  *  Ensures:
    314  */
    315 	extern VOID DRV_Exit();
    316 
    317 /*
    318  *  ======== DRV_GetFirstDevObject ========
    319  *  Purpose:
    320  *      Returns the Ptr to the FirstDev Object in the List
    321  *  Parameters:
    322  *  Requires:
    323  *      DRV Initialized
    324  *  Returns:
    325  *      dwDevObject:  Ptr to the First Dev Object as a DWORD
    326  *      0 if it fails to retrieve the First Dev Object
    327  *  Ensures:
    328  */
    329 	extern DWORD DRV_GetFirstDevObject();
    330 
    331 /*
    332  *  ======== DRV_GetFirstDevExtension ========
    333  *  Purpose:
    334  *      Returns the Ptr to the First Device Extension in the List
    335  *  Parameters:
    336  *  Requires:
    337  *      DRV Initialized
    338  *  Returns:
    339  *      dwDevExtension:     Ptr to the First Device Extension as a DWORD
    340  *      0:                  Failed to Get the Device Extension
    341  *  Ensures:
    342  */
    343 	extern DWORD DRV_GetFirstDevExtension();
    344 
    345 /*
    346  *  ======== DRV_GetDevObject ========
    347  *  Purpose:
    348  *      Given a index, returns a handle to DevObject from the list
    349  *  Parameters:
    350  *      hDrvObject:     Handle to the Manager
    351  *      phDevObject:    Location to store the Dev Handle
    352  *  Requires:
    353  *      DRV Initialized
    354  *      uIndex >= 0
    355  *      hDrvObject is not NULL and Valid DRV Object
    356  *      phDevObject is not NULL
    357  *      Device Object List not Empty
    358  *  Returns:
    359  *      DSP_SOK:        Success
    360  *      DSP_EFAIL:      Failed to Get the Dev Object
    361  *  Ensures:
    362  *      DSP_SOK:        *phDevObject != NULL
    363  *      DSP_EFAIL:      *phDevObject = NULL
    364  */
    365 	extern DSP_STATUS DRV_GetDevObject(UINT uIndex, struct DRV_OBJECT* hDrvObject,
    366 					   struct DEV_OBJECT* * phDevObject);
    367 
    368 /*
    369  *  ======== DRV_GetNextDevObject ========
    370  *  Purpose:
    371  *      Returns the Ptr to the Next Device Object from the the List
    372  *  Parameters:
    373  *      hDevObject:     Handle to the Device Object
    374  *  Requires:
    375  *      DRV Initialized
    376  *      hDevObject != 0
    377  *  Returns:
    378  *      dwDevObject:    Ptr to the Next Dev Object as a DWORD
    379  *      0:              If it fail to get the next Dev Object.
    380  *  Ensures:
    381  */
    382 	extern DWORD DRV_GetNextDevObject(DWORD hDevObject);
    383 
    384 /*
    385  *  ======== DRV_GetNextDevExtension ========
    386  *  Purpose:
    387  *      Returns the Ptr to the Next Device Extension from the the List
    388  *  Parameters:
    389  *      hDevExtension:      Handle to the Device Extension
    390  *  Requires:
    391  *      DRV Initialized
    392  *      hDevExtension != 0.
    393  *  Returns:
    394  *      dwDevExtension:     Ptr to the Next Dev Extension
    395  *      0:                  If it fail to Get the next Dev Extension
    396  *  Ensures:
    397  */
    398 	extern DWORD DRV_GetNextDevExtension(DWORD hDevExtension);
    399 
    400 /*
    401  *  ======== DRV_Init ========
    402  *  Purpose:
    403  *      Initialize the DRV module.
    404  *  Parameters:
    405  *  Returns:
    406  *      TRUE if success; FALSE otherwise.
    407  *  Requires:
    408  *  Ensures:
    409  */
    410 	extern DSP_STATUS DRV_Init();
    411 
    412 /*
    413  *  ======== DRV_InsertDevObject ========
    414  *  Purpose:
    415  *      Insert a DeviceObject into the list of Driver object.
    416  *  Parameters:
    417  *      hDrvObject:     Handle to DrvObject
    418  *      hDevObject:     Handle to DeviceObject to insert.
    419  *  Returns:
    420  *      DSP_SOK:        If successful.
    421  *      DSP_EFAIL:      General Failure:
    422  *  Requires:
    423  *      hDrvObject != NULL and Valid DRV Handle.
    424  *      hDevObject != NULL.
    425  *  Ensures:
    426  *      DSP_SOK:        Device Object is inserted and the List is not empty.
    427  */
    428 	extern DSP_STATUS DRV_InsertDevObject(struct DRV_OBJECT* hDrvObject,
    429 					      struct DEV_OBJECT* hDevObject);
    430 
    431 /*
    432  *  ======== DRV_RemoveDevObject ========
    433  *  Purpose:
    434  *      Search for and remove a Device object from the given list of Device Obj
    435  *      objects.
    436  *  Parameters:
    437  *      hDrvObject:     Handle to DrvObject
    438  *      hDevObject:     Handle to DevObject to Remove
    439  *  Returns:
    440  *      DSP_SOK:        Success.
    441  *      DSP_EFAIL:      Unable to find pDevObject.
    442  *  Requires:
    443  *      hDrvObject != NULL and a Valid DRV Handle.
    444  *      hDevObject != NULL.
    445  *      List exists and is not empty.
    446  *  Ensures:
    447  *      List either does not exist (NULL), or is not empty if it does exist.
    448 */
    449 	extern DSP_STATUS DRV_RemoveDevObject(struct DRV_OBJECT* hDrvObject,
    450 					      struct DEV_OBJECT* hDevObject);
    451 
    452 /*
    453  *  ======== DRV_RequestResources ========
    454  *  Purpose:
    455  *      Assigns the Resources or Releases them.
    456  *  Parameters:
    457  *      dwContext:          Path to the driver Registry Key.
    458  *      pDevNodeString:     Ptr to DevNode String stored in the Device Ext.
    459  *  Returns:
    460  *      TRUE if success; FALSE otherwise.
    461  *  Requires:
    462  *  Ensures:
    463  *      The Resources are assigned based on Bus type.
    464  *      The hardware is initialized. Resource information is
    465  *      gathered from the Registry(ISA, PCMCIA)or scanned(PCI)
    466  *      Resource structure is stored in the registry which will be
    467  *      later used by the CFG module.
    468  */
    469 	extern DSP_STATUS DRV_RequestResources(IN DWORD dwContext,
    470 					       OUT DWORD * pDevNodeString);
    471 
    472 /*
    473  *  ======== DRV_ReleaseResources ========
    474  *  Purpose:
    475  *      Assigns the Resources or Releases them.
    476  *  Parameters:
    477  *      dwContext:      Path to the driver Registry Key.
    478  *      hDrvObject:     Handle to the Driver Object.
    479  *  Returns:
    480  *      TRUE if success; FALSE otherwise.
    481  *  Requires:
    482  *  Ensures:
    483  *      The Resources are released based on Bus type.
    484  *      Resource structure is deleted from the registry
    485  */
    486 	extern DSP_STATUS DRV_ReleaseResources(IN DWORD dwContext,
    487 					       struct DRV_OBJECT* hDrvObject);
    488 
    489 #ifdef __cplusplus
    490 }
    491 #endif
    492 #endif				/* DRV_ */
    493