gpu: pvr: pdumpfs: add Kconfig and debugfs pdump mode handling
[sgx.git] / pvr / osfunc.h
1 /**********************************************************************
2  *
3  * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful but, except
10  * as otherwise stated in writing, without any warranty; without even the
11  * implied warranty of merchantability or fitness for a particular purpose.
12  * See the GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  * The full GNU General Public License is included in this distribution in
19  * the file called "COPYING".
20  *
21  * Contact Information:
22  * Imagination Technologies Ltd. <gpl-support@imgtec.com>
23  * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
24  *
25  ******************************************************************************/
26
27
28 #ifndef __OSFUNC_H__
29 #define __OSFUNC_H__
30
31 #if defined(__KERNEL__)
32 #include <linux/hardirq.h>
33 #include <linux/string.h>
34 #endif
35
36 #define PVRSRV_PAGEABLE_SELECT          PVRSRV_OS_PAGEABLE_HEAP
37
38 #define KERNEL_ID                       0xffffffffL
39 #define POWER_MANAGER_ID                0xfffffffeL
40 #define ISR_ID                          0xfffffffdL
41 #define TIMER_ID                        0xfffffffcL
42
43 #define HOST_PAGESIZE                   OSGetPageSize
44 #define HOST_PAGEMASK                   (~(HOST_PAGESIZE()-1))
45
46 #define HOST_PAGEALIGN(addr)            (((addr) + HOST_PAGESIZE() - 1) & \
47                                         HOST_PAGEMASK)
48
49 #define PVRSRV_OS_HEAP_MASK             0xf
50 #define PVRSRV_OS_PAGEABLE_HEAP         0x1
51 #define PVRSRV_OS_NON_PAGEABLE_HEAP     0x2
52
53 u32 OSClockus(void);
54 u32 OSGetPageSize(void);
55 enum PVRSRV_ERROR OSInstallDeviceLISR(void *pvSysData, u32 ui32Irq,
56                                       char *pszISRName, void *pvDeviceNode);
57 enum PVRSRV_ERROR OSUninstallDeviceLISR(void *pvSysData);
58 enum PVRSRV_ERROR OSInstallSystemLISR(void *pvSysData, u32 ui32Irq);
59 enum PVRSRV_ERROR OSUninstallSystemLISR(void *pvSysData);
60 enum PVRSRV_ERROR OSInstallMISR(void *pvSysData);
61 enum PVRSRV_ERROR OSUninstallMISR(void *pvSysData);
62 enum PVRSRV_ERROR OSInitPerf(void *pvSysData);
63 enum PVRSRV_ERROR OSCleanupPerf(void *pvSysData);
64 struct IMG_CPU_PHYADDR OSMapLinToCPUPhys(void *pvLinAddr);
65 void OSMemCopy(void *pvDst, void *pvSrc, u32 ui32Size);
66 void __iomem *OSMapPhysToLin(struct IMG_CPU_PHYADDR BasePAddr,
67                      u32 ui32Bytes, u32 ui32MappingFlags, void **phOSMemHandle);
68 IMG_BOOL OSUnMapPhysToLin(void __iomem *pvLinAddr, u32 ui32Bytes,
69                         u32 ui32MappingFlags, void *hPageAlloc);
70
71 enum PVRSRV_ERROR OSReservePhys(struct IMG_CPU_PHYADDR BasePAddr, u32 ui32Bytes,
72                 u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle);
73 enum PVRSRV_ERROR OSUnReservePhys(void *pvCpuVAddr, u32 ui32Bytes,
74                 u32 ui32Flags, void *hOSMemHandle);
75
76 enum PVRSRV_ERROR OSRegisterDiscontigMem(struct IMG_SYS_PHYADDR *pBasePAddr,
77                 void *pvCpuVAddr, u32 ui32Bytes, u32 ui32Flags,
78                 void **phOSMemHandle);
79 enum PVRSRV_ERROR OSUnRegisterDiscontigMem(void *pvCpuVAddr, u32 ui32Bytes,
80                 u32 ui32Flags, void *hOSMemHandle);
81
82 static inline enum PVRSRV_ERROR OSReserveDiscontigPhys(
83                 struct IMG_SYS_PHYADDR *pBasePAddr, u32 ui32Bytes,
84                 u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle)
85 {
86         *ppvCpuVAddr = NULL;
87         return OSRegisterDiscontigMem(pBasePAddr, *ppvCpuVAddr, ui32Bytes,
88                                       ui32Flags, phOSMemHandle);
89 }
90
91 static inline enum PVRSRV_ERROR OSUnReserveDiscontigPhys(void *pvCpuVAddr,
92                         u32 ui32Bytes, u32 ui32Flags, void *hOSMemHandle)
93 {
94         OSUnRegisterDiscontigMem(pvCpuVAddr, ui32Bytes, ui32Flags,
95                                 hOSMemHandle);
96
97         return PVRSRV_OK;
98 }
99
100 enum PVRSRV_ERROR OSRegisterMem(struct IMG_CPU_PHYADDR BasePAddr,
101                 void *pvCpuVAddr, u32 ui32Bytes, u32 ui32Flags,
102                 void **phOSMemHandle);
103 enum PVRSRV_ERROR OSUnRegisterMem(void *pvCpuVAddr, u32 ui32Bytes,
104                 u32 ui32Flags, void *hOSMemHandle);
105
106 enum PVRSRV_ERROR OSGetSubMemHandle(void *hOSMemHandle, u32 ui32ByteOffset,
107                 u32 ui32Bytes, u32 ui32Flags, void **phOSMemHandleRet);
108 enum PVRSRV_ERROR OSReleaseSubMemHandle(void *hOSMemHandle, u32 ui32Flags);
109
110 u32 OSGetCurrentProcessIDKM(void);
111 u32 OSGetCurrentThreadID(void);
112 void OSMemSet(void *pvDest, u8 ui8Value, u32 ui32Size);
113
114 #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
115 enum PVRSRV_ERROR _OSAllocMem(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
116                 void **phBlockAlloc, char *pszFilename, u32 ui32Line);
117 #define OSAllocMem(ui32Flags, ui32Size, ppvLinAddr, phBlockAlloc)       \
118         _OSAllocMem(ui32Flags, ui32Size, ppvLinAddr, phBlockAlloc,      \
119                     __FILE__, __LINE__)
120 void _OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
121                 void *hBlockAlloc, char *pszFilename, u32 ui32Line);
122 #define OSFreeMem(ui32Flags, ui32Size, pvLinAddr, phBlockAlloc)         \
123         _OSFreeMem(ui32Flags, ui32Size, pvLinAddr, phBlockAlloc,        \
124                    __FILE__, __LINE__)
125 #else
126 enum PVRSRV_ERROR OSAllocMem(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
127                 void **phBlockAlloc);
128 void OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr, void *hBlockAlloc);
129 #endif
130 enum PVRSRV_ERROR OSAllocPages(u32 ui32Flags, u32 ui32Size, u32 ui32PageSize,
131                                void **ppvLinAddr, void **phPageAlloc);
132 enum PVRSRV_ERROR OSFreePages(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
133                 void *hPageAlloc);
134 struct IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(void *hOSMemHandle,
135                 u32 ui32ByteOffset);
136 enum PVRSRV_ERROR OSInitEnvData(void **ppvEnvSpecificData);
137 enum PVRSRV_ERROR OSDeInitEnvData(void *pvEnvSpecificData);
138 char *OSStringCopy(char *pszDest, const char *pszSrc);
139 s32 OSSNPrintf(char *pStr, u32 ui32Size, const char *pszFormat, ...);
140 #define OSStringLength(pszString) strlen(pszString)
141
142 enum PVRSRV_ERROR OSEventObjectCreate(const char *pszName,
143                 struct PVRSRV_EVENTOBJECT *psEventObject);
144 enum PVRSRV_ERROR OSEventObjectDestroy(
145                 struct PVRSRV_EVENTOBJECT *psEventObject);
146 enum PVRSRV_ERROR OSEventObjectSignal(void *hOSEventKM);
147 enum PVRSRV_ERROR OSEventObjectWait(void *hOSEventKM);
148 enum PVRSRV_ERROR OSEventObjectOpen(struct PVRSRV_EVENTOBJECT *psEventObject,
149                 void **phOSEvent);
150 enum PVRSRV_ERROR OSEventObjectClose(struct PVRSRV_EVENTOBJECT *psEventObject,
151                 void *hOSEventKM);
152
153 enum PVRSRV_ERROR OSBaseAllocContigMemory(u32 ui32Size, void **pLinAddr,
154                 struct IMG_CPU_PHYADDR *pPhysAddr);
155 enum PVRSRV_ERROR OSBaseFreeContigMemory(u32 ui32Size, void *LinAddr,
156                 struct IMG_CPU_PHYADDR PhysAddr);
157
158 void *MapUserFromKernel(void *pvLinAddrKM, u32 ui32Size, void **phMemBlock);
159 void *OSMapHWRegsIntoUserSpace(void *hDevCookie,
160                 struct IMG_SYS_PHYADDR sRegAddr, u32 ulSize, void **ppvProcess);
161 void OSUnmapHWRegsFromUserSpace(void *hDevCookie, void *pvUserAddr,
162                 void *pvProcess);
163
164 void UnmapUserFromKernel(void *pvLinAddrUM, u32 ui32Size, void *hMemBlock);
165
166 enum PVRSRV_ERROR OSMapPhysToUserSpace(void *hDevCookie,
167                 struct IMG_SYS_PHYADDR sCPUPhysAddr, u32 uiSizeInBytes,
168                 u32 ui32CacheFlags, void **ppvUserAddr, u32 *puiActualSize,
169                 void *hMappingHandle);
170
171 enum PVRSRV_ERROR OSUnmapPhysToUserSpace(void *hDevCookie, void *pvUserAddr,
172                 void *pvProcess);
173
174 void OSWaitus(u32 ui32Timeus);
175 void OSReleaseThreadQuanta(void);
176
177 u32 OSReadHWReg(void __iomem *pvLinRegBaseAddr, u32 ui32Offset);
178 void OSWriteHWReg(void __iomem *pvLinRegBaseAddr, u32 ui32Offset,
179                   u32 ui32Value);
180
181 void *OSAddTimer(void (*pfnTimerFunc)(void *), void *pvData, u32 ui32MsTimeout);
182 enum PVRSRV_ERROR OSRemoveTimer(void *hTimer);
183 enum PVRSRV_ERROR OSEnableTimer(void *hTimer);
184 enum PVRSRV_ERROR OSDisableTimer(void *hTimer);
185
186 enum PVRSRV_ERROR OSGetSysMemSize(u32 *pui32Bytes);
187
188 enum HOST_PCI_INIT_FLAGS {
189         HOST_PCI_INIT_FLAG_BUS_MASTER = 0x00000001,
190         HOST_PCI_INIT_FLAG_MSI = 0x00000002,
191         HOST_PCI_INIT_FLAG_FORCE_I32 = 0x7fffffff
192 };
193
194 enum PVRSRV_ERROR OSScheduleMISR(void *pvSysData);
195
196 IMG_BOOL OSProcHasPrivSrvInit(void);
197
198 enum IMG_VERIFY_TEST {
199         PVR_VERIFY_WRITE = 0,
200         PVR_VERIFY_READ
201 };
202
203 IMG_BOOL OSAccessOK(enum IMG_VERIFY_TEST eVerification,
204                     const void __user *pvUserPtr, u32 ui32Bytes);
205
206 enum PVRSRV_ERROR OSCopyToUser(void *pvProcess, void __user *pvDest,
207                         const void *pvSrc, u32 ui32Bytes);
208 enum PVRSRV_ERROR OSCopyFromUser(void *pvProcess, void *pvDest,
209                         const void __user *pvSrc, u32 ui32Bytes);
210
211 enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr, u32 ui32Bytes,
212                                    struct IMG_SYS_PHYADDR *psSysPAddr,
213                                         void **phOSWrapMem);
214 enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem);
215
216 #endif