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