1 /**********************************************************************
3 * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
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.
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.
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.
18 * The full GNU General Public License is included in this distribution in
19 * the file called "COPYING".
21 * Contact Information:
22 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
23 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
25 ******************************************************************************/
31 #if defined(__KERNEL__)
32 #include <linux/hardirq.h>
33 #include <linux/string.h>
37 #include "servicesext.h"
39 #define PVRSRV_PAGEABLE_SELECT PVRSRV_OS_PAGEABLE_HEAP
41 #define KERNEL_ID 0xffffffffL
42 #define POWER_MANAGER_ID 0xfffffffeL
43 #define ISR_ID 0xfffffffdL
44 #define TIMER_ID 0xfffffffcL
46 #define HOST_PAGESIZE OSGetPageSize
47 #define HOST_PAGEMASK (~(HOST_PAGESIZE()-1))
49 #define HOST_PAGEALIGN(addr) (((addr) + HOST_PAGESIZE() - 1) & \
52 #define PVRSRV_OS_HEAP_MASK 0xf
53 #define PVRSRV_OS_PAGEABLE_HEAP 0x1
54 #define PVRSRV_OS_NON_PAGEABLE_HEAP 0x2
57 u32 OSGetPageSize(void);
58 enum PVRSRV_ERROR OSInstallDeviceLISR(void *pvSysData, u32 ui32Irq,
59 char *pszISRName, void *pvDeviceNode);
60 enum PVRSRV_ERROR OSUninstallDeviceLISR(void *pvSysData);
61 enum PVRSRV_ERROR OSInstallSystemLISR(void *pvSysData, u32 ui32Irq);
62 enum PVRSRV_ERROR OSUninstallSystemLISR(void *pvSysData);
63 enum PVRSRV_ERROR OSInstallMISR(void *pvSysData);
64 enum PVRSRV_ERROR OSUninstallMISR(void *pvSysData);
65 enum PVRSRV_ERROR OSInitPerf(void *pvSysData);
66 enum PVRSRV_ERROR OSCleanupPerf(void *pvSysData);
67 struct IMG_CPU_PHYADDR OSMapLinToCPUPhys(void *pvLinAddr);
68 void OSMemCopy(void *pvDst, void *pvSrc, u32 ui32Size);
69 void __iomem *OSMapPhysToLin(struct IMG_CPU_PHYADDR BasePAddr,
70 u32 ui32Bytes, u32 ui32MappingFlags, void **phOSMemHandle);
71 IMG_BOOL OSUnMapPhysToLin(void __iomem *pvLinAddr, u32 ui32Bytes,
72 u32 ui32MappingFlags, void *hPageAlloc);
74 enum PVRSRV_ERROR OSReservePhys(struct IMG_CPU_PHYADDR BasePAddr, u32 ui32Bytes,
75 u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle);
76 enum PVRSRV_ERROR OSUnReservePhys(void *pvCpuVAddr, u32 ui32Bytes,
77 u32 ui32Flags, void *hOSMemHandle);
79 enum PVRSRV_ERROR OSRegisterDiscontigMem(struct IMG_SYS_PHYADDR *pBasePAddr,
80 void *pvCpuVAddr, u32 ui32Bytes, u32 ui32Flags,
81 void **phOSMemHandle);
82 enum PVRSRV_ERROR OSUnRegisterDiscontigMem(void *pvCpuVAddr, u32 ui32Bytes,
83 u32 ui32Flags, void *hOSMemHandle);
85 static inline enum PVRSRV_ERROR OSReserveDiscontigPhys(
86 struct IMG_SYS_PHYADDR *pBasePAddr, u32 ui32Bytes,
87 u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle)
90 return OSRegisterDiscontigMem(pBasePAddr, *ppvCpuVAddr, ui32Bytes,
91 ui32Flags, phOSMemHandle);
94 static inline enum PVRSRV_ERROR OSUnReserveDiscontigPhys(void *pvCpuVAddr,
95 u32 ui32Bytes, u32 ui32Flags, void *hOSMemHandle)
97 OSUnRegisterDiscontigMem(pvCpuVAddr, ui32Bytes, ui32Flags,
103 enum PVRSRV_ERROR OSRegisterMem(struct IMG_CPU_PHYADDR BasePAddr,
104 void *pvCpuVAddr, u32 ui32Bytes, u32 ui32Flags,
105 void **phOSMemHandle);
106 enum PVRSRV_ERROR OSUnRegisterMem(void *pvCpuVAddr, u32 ui32Bytes,
107 u32 ui32Flags, void *hOSMemHandle);
109 enum PVRSRV_ERROR OSGetSubMemHandle(void *hOSMemHandle, u32 ui32ByteOffset,
110 u32 ui32Bytes, u32 ui32Flags, void **phOSMemHandleRet);
111 enum PVRSRV_ERROR OSReleaseSubMemHandle(void *hOSMemHandle, u32 ui32Flags);
113 u32 OSGetCurrentProcessIDKM(void);
114 u32 OSGetCurrentThreadID(void);
115 void OSMemSet(void *pvDest, u8 ui8Value, u32 ui32Size);
117 #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
118 enum PVRSRV_ERROR _OSAllocMem(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
119 void **phBlockAlloc, char *pszFilename, u32 ui32Line);
120 #define OSAllocMem(ui32Flags, ui32Size, ppvLinAddr, phBlockAlloc) \
121 _OSAllocMem(ui32Flags, ui32Size, ppvLinAddr, phBlockAlloc, \
123 void _OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
124 void *hBlockAlloc, char *pszFilename, u32 ui32Line);
125 #define OSFreeMem(ui32Flags, ui32Size, pvLinAddr, phBlockAlloc) \
126 _OSFreeMem(ui32Flags, ui32Size, pvLinAddr, phBlockAlloc, \
129 enum PVRSRV_ERROR OSAllocMem(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
130 void **phBlockAlloc);
131 void OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr, void *hBlockAlloc);
133 enum PVRSRV_ERROR OSAllocPages(u32 ui32Flags, u32 ui32Size, u32 ui32PageSize,
134 void **ppvLinAddr, void **phPageAlloc);
135 enum PVRSRV_ERROR OSFreePages(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
137 struct IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(void *hOSMemHandle,
139 enum PVRSRV_ERROR OSInitEnvData(void **ppvEnvSpecificData);
140 enum PVRSRV_ERROR OSDeInitEnvData(void *pvEnvSpecificData);
141 char *OSStringCopy(char *pszDest, const char *pszSrc);
142 s32 OSSNPrintf(char *pStr, u32 ui32Size, const char *pszFormat, ...);
143 #define OSStringLength(pszString) strlen(pszString)
145 enum PVRSRV_ERROR OSEventObjectCreate(const char *pszName,
146 struct PVRSRV_EVENTOBJECT *psEventObject);
147 enum PVRSRV_ERROR OSEventObjectDestroy(
148 struct PVRSRV_EVENTOBJECT *psEventObject);
149 enum PVRSRV_ERROR OSEventObjectSignal(void *hOSEventKM);
150 enum PVRSRV_ERROR OSEventObjectWait(void *hOSEventKM);
151 enum PVRSRV_ERROR OSEventObjectOpen(struct PVRSRV_EVENTOBJECT *psEventObject,
153 enum PVRSRV_ERROR OSEventObjectClose(struct PVRSRV_EVENTOBJECT *psEventObject,
156 enum PVRSRV_ERROR OSBaseAllocContigMemory(u32 ui32Size, void **pLinAddr,
157 struct IMG_CPU_PHYADDR *pPhysAddr);
158 enum PVRSRV_ERROR OSBaseFreeContigMemory(u32 ui32Size, void *LinAddr,
159 struct IMG_CPU_PHYADDR PhysAddr);
161 void *MapUserFromKernel(void *pvLinAddrKM, u32 ui32Size, void **phMemBlock);
162 void *OSMapHWRegsIntoUserSpace(void *hDevCookie,
163 struct IMG_SYS_PHYADDR sRegAddr, u32 ulSize, void **ppvProcess);
164 void OSUnmapHWRegsFromUserSpace(void *hDevCookie, void *pvUserAddr,
167 void UnmapUserFromKernel(void *pvLinAddrUM, u32 ui32Size, void *hMemBlock);
169 enum PVRSRV_ERROR OSMapPhysToUserSpace(void *hDevCookie,
170 struct IMG_SYS_PHYADDR sCPUPhysAddr, u32 uiSizeInBytes,
171 u32 ui32CacheFlags, void **ppvUserAddr, u32 *puiActualSize,
172 void *hMappingHandle);
174 enum PVRSRV_ERROR OSUnmapPhysToUserSpace(void *hDevCookie, void *pvUserAddr,
177 void OSWaitus(u32 ui32Timeus);
178 void OSReleaseThreadQuanta(void);
180 u32 OSReadHWReg(void __iomem *pvLinRegBaseAddr, u32 ui32Offset);
181 void OSWriteHWReg(void __iomem *pvLinRegBaseAddr, u32 ui32Offset,
184 void *OSAddTimer(void (*pfnTimerFunc)(void *), void *pvData, u32 ui32MsTimeout);
185 enum PVRSRV_ERROR OSRemoveTimer(void *hTimer);
186 enum PVRSRV_ERROR OSEnableTimer(void *hTimer);
187 enum PVRSRV_ERROR OSDisableTimer(void *hTimer);
189 enum PVRSRV_ERROR OSGetSysMemSize(u32 *pui32Bytes);
191 enum HOST_PCI_INIT_FLAGS {
192 HOST_PCI_INIT_FLAG_BUS_MASTER = 0x00000001,
193 HOST_PCI_INIT_FLAG_MSI = 0x00000002,
194 HOST_PCI_INIT_FLAG_FORCE_I32 = 0x7fffffff
197 enum PVRSRV_ERROR OSScheduleMISR(void *pvSysData);
199 IMG_BOOL OSProcHasPrivSrvInit(void);
201 enum IMG_VERIFY_TEST {
202 PVR_VERIFY_WRITE = 0,
206 IMG_BOOL OSAccessOK(enum IMG_VERIFY_TEST eVerification,
207 const void __user *pvUserPtr, u32 ui32Bytes);
209 enum PVRSRV_ERROR OSCopyToUser(void *pvProcess, void __user *pvDest,
210 const void *pvSrc, u32 ui32Bytes);
211 enum PVRSRV_ERROR OSCopyFromUser(void *pvProcess, void *pvDest,
212 const void __user *pvSrc, u32 ui32Bytes);
214 enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr, u32 ui32Bytes,
215 struct IMG_SYS_PHYADDR *psSysPAddr,
217 enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem);
219 void get_proc_name(int pid, char *buf, size_t buf_size);