bool "Timing"
endchoice
+config PVR_DEBUG_PDUMP
+ tristate "PDUMP debug support"
+ depends on PVR
+ default n
+
+config PVR_EDM_DEBUG
+ depends on PVR
+ bool "Enable EDM trace"
+ default n
+ help
+ EDM trace helps to track down some HW recovery events. You _must_
+ also enabled EDM (PVRSRV_USSE_EDM_STATUS_DEBUG) in the userland
+ libraries otherwise the drivers won't start
+
+config PVR_NO_HARDWARE
+ bool
+ default n
+
+config PVR_FORCE_CLOCKS_ON
+ bool "Force clocks on"
+ depends on !PVR_NO_HARDWARE
+ default n
+
config PVR_EXAMPLES
tristate "Example code"
default n
omaplfb-objs := omaplfb_displayclass.o omaplfb_linux.o
pvrsrvkm-objs := osfunc.o mmap.o module.o pdump.o proc.o \
- pvr_bridge_k.o pvr_debug.o mm.o mutex.o event.o \
+ pvr_bridge_k.o mm.o event.o \
buffer_manager.o devicemem.o deviceclass.o \
handle.o hash.o pvrsrv.o queue.o ra.o \
resman.o power.o mem.o bridged_pvr_bridge.o \
sgxinit.o sgxreset.o sgxutils.o sgxkick.o \
sgxtransfer.o mmu.o pb.o perproc.o sysconfig.o \
- sysutils_linux.o
+ sysutils.o osperproc.o bridged_support.o \
+ bridged_sgx_bridge.o sgxpower.o pdump_common.o
+
+pvrsrvkm-objs-$(CONFIG_PVR_DEBUG) += pvr_debug.o
+pvrsrvkm-objs-$(CONFIG_PVR_TIMING) += pvr_debug.o
+
+pvrsrvkm-objs += $(pvrsrvkm-objs-y) $(pvrsrvkm-objs-m)
obj-$(CONFIG_PVR_EXAMPLES) += bc_example.o
bc_example-objs := bufferclass_example.o bufferclass_example_linux.o \
bufferclass_example_private.o
+
+obj-$(CONFIG_PVR_DEBUG_PDUMP) += pvrdbg.o
+
+pvrdbg-objs := tools/main.o tools/dbgdriv.o tools/ioctl.o \
+ tools/hostfunc.o tools/hotkey.o
+
+
DATE := $(shell date "+%a %B %d %Z %Y" )
CBUILD := -O2 \
-DPVR_BUILD_DIR="\"$(PVR_BUILD_DIR)\"" \
-DPVR_BUILD_DATE="\"$(DATE)\""
-ccflags-y += $(CBUILD) -include $(src)/pvrconfig.h
+ccflags-y += $(CBUILD) -include $(srctree)/$(src)/pvrconfig.h
+
+ccflags-$(CONFIG_PVR_DEBUG_PDUMP) += -I $(srctree)/$(src)/tools \
+ -I $(srctree)/$(src)
+ccflags-y += $(ccflags-m)
+
#include "pvr_bridge.h"
#include "sgx_bridge.h"
#include "perproc.h"
-#include "sgx_bridge_km.h"
+#include "device.h"
+#include "buffer_manager.h"
+
#include "pdump_km.h"
-#include "sgxutils.h"
-#include "mmu.h"
+#include "syscommon.h"
#include "bridged_pvr_bridge.h"
+#include "bridged_sgx_bridge.h"
#include "env_data.h"
#include "mmap.h"
+#include <linux/kernel.h>
#include <linux/pagemap.h> /* for cache flush */
-
-
-#if defined(DEBUG)
-#define PVRSRV_BRIDGE_ASSERT_CMD(X, Y) PVR_ASSERT(X == PVRSRV_GET_BRIDGE_ID(Y))
-#else
-#define PVRSRV_BRIDGE_ASSERT_CMD(X, Y) PVR_UNREFERENCED_PARAMETER(X)
-#endif
+#include <linux/mm.h>
+#include <linux/sched.h>
struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY
g_BridgeDispatchTable[BRIDGE_DISPATCH_TABLE_ENTRY_COUNT];
#endif
static IMG_BOOL abSharedDeviceMemHeap[PVRSRV_MAX_CLIENT_HEAPS];
+static IMG_BOOL *pbSharedDeviceMemHeap = abSharedDeviceMemHeap;
#if defined(DEBUG_BRIDGE_KM)
-static enum PVRSRV_ERROR CopyFromUserWrapper(struct PVRSRV_PER_PROCESS_DATA
- *pProcData, u32 ui32BridgeID,
- void *pvDest, void __user *pvSrc, u32 ui32Size)
+enum PVRSRV_ERROR
+CopyFromUserWrapper(struct PVRSRV_PER_PROCESS_DATA *pProcData,
+ u32 ui32BridgeID, void *pvDest, void __user *pvSrc,
+ u32 ui32Size)
{
g_BridgeDispatchTable[ui32BridgeID].ui32CopyFromUserTotalBytes +=
ui32Size;
return OSCopyFromUser(pProcData, pvDest, pvSrc, ui32Size);
}
-static enum PVRSRV_ERROR CopyToUserWrapper(
- struct PVRSRV_PER_PROCESS_DATA *pProcData,
- u32 ui32BridgeID,
- void __user *pvDest, void *pvSrc, u32 ui32Size)
+enum PVRSRV_ERROR CopyToUserWrapper(struct PVRSRV_PER_PROCESS_DATA *pProcData,
+ u32 ui32BridgeID, void __user *pvDest, void *pvSrc,
+ u32 ui32Size)
{
g_BridgeDispatchTable[ui32BridgeID].ui32CopyToUserTotalBytes +=
ui32Size;
g_BridgeGlobalStats.ui32TotalCopyToUserBytes += ui32Size;
return OSCopyToUser(pProcData, pvDest, pvSrc, ui32Size);
}
-#else
-#define CopyFromUserWrapper(pProcData, ui32BridgeID, pvDest, pvSrc, ui32Size) \
- OSCopyFromUser(pProcData, pvDest, pvSrc, ui32Size)
-#define CopyToUserWrapper(pProcData, ui32BridgeID, pvDest, pvSrc, ui32Size) \
- OSCopyToUser(pProcData, pvDest, pvSrc, ui32Size)
#endif
-#define ASSIGN_AND_RETURN_ON_ERROR(error, src, res) \
- do { \
- (error) = (src); \
- if ((error) != PVRSRV_OK) { \
- return res; \
- } \
- } while (error != PVRSRV_OK)
-
-#define ASSIGN_AND_EXIT_ON_ERROR(error, src) \
- ASSIGN_AND_RETURN_ON_ERROR(error, src, 0)
-
-static inline enum PVRSRV_ERROR NewHandleBatch(struct PVRSRV_PER_PROCESS_DATA
- *psPerProc, u32 ui32BatchSize)
-{
- enum PVRSRV_ERROR eError;
-
- PVR_ASSERT(!psPerProc->bHandlesBatched);
-
- eError = PVRSRVNewHandleBatch(psPerProc->psHandleBase, ui32BatchSize);
-
- if (eError == PVRSRV_OK)
- psPerProc->bHandlesBatched = IMG_TRUE;
-
- return eError;
-}
-
-#define NEW_HANDLE_BATCH_OR_ERROR(error, psPerProc, ui32BatchSize) \
- ASSIGN_AND_EXIT_ON_ERROR(error, NewHandleBatch(psPerProc, ui32BatchSize))
-
-static inline enum PVRSRV_ERROR CommitHandleBatch(struct PVRSRV_PER_PROCESS_DATA
- *psPerProc)
-{
- PVR_ASSERT(psPerProc->bHandlesBatched);
-
- psPerProc->bHandlesBatched = IMG_FALSE;
-
- return PVRSRVCommitHandleBatch(psPerProc->psHandleBase);
-}
-
-#define COMMIT_HANDLE_BATCH_OR_ERROR(error, psPerProc) \
- ASSIGN_AND_EXIT_ON_ERROR(error, CommitHandleBatch(psPerProc))
-
-static inline void ReleaseHandleBatch(struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- if (psPerProc->bHandlesBatched) {
- psPerProc->bHandlesBatched = IMG_FALSE;
-
- PVRSRVReleaseHandleBatch(psPerProc->psHandleBase);
- }
-}
-
-static int PVRSRVEnumerateDevicesBW(u32 ui32BridgeID,
- void *psBridgeIn,
+static int PVRSRVEnumerateDevicesBW(u32 ui32BridgeID, void *psBridgeIn,
struct PVRSRV_BRIDGE_OUT_ENUMDEVICE *psEnumDeviceOUT,
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
if (psAcquireDevInfoOUT->eError != PVRSRV_OK)
return 0;
- psAcquireDevInfoOUT->eError =
- PVRSRVAllocHandle(psPerProc->psHandleBase,
- &psAcquireDevInfoOUT->hDevCookie,
- hDevCookieInt,
- PVRSRV_HANDLE_TYPE_DEV_NODE,
- PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
-
- return 0;
-}
-
-static int SGXGetInfoForSrvinitBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
- struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- u32 i;
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT);
-
- NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc,
- PVRSRV_MAX_CLIENT_HEAPS);
-
- if (!psPerProc->bInitProcess) {
- psSGXInfoForSrvinitOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
-
- psSGXInfoForSrvinitOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
- psSGXInfoForSrvinitIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
-
- if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
- return 0;
-
- psSGXInfoForSrvinitOUT->eError =
- SGXGetInfoForSrvinitKM(hDevCookieInt,
- &psSGXInfoForSrvinitOUT->sInitInfo);
-
- if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
- return 0;
-
- for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
- struct PVRSRV_HEAP_INFO *psHeapInfo;
-
- psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i];
-
- if (psHeapInfo->ui32HeapID !=
- (u32) SGX_UNDEFINED_HEAP_ID) {
- void *hDevMemHeapExt;
-
- if (psHeapInfo->hDevMemHeap != NULL) {
-
- PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &hDevMemHeapExt,
- psHeapInfo->hDevMemHeap,
- PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
- PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
- psHeapInfo->hDevMemHeap = hDevMemHeapExt;
- }
- }
- }
-
- COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc);
+ psAcquireDevInfoOUT->eError = PVRSRVAllocHandle(psPerProc->psHandleBase,
+ &psAcquireDevInfoOUT->hDevCookie,
+ hDevCookieInt,
+ PVRSRV_HANDLE_TYPE_DEV_NODE,
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
return 0;
}
NEW_HANDLE_BATCH_OR_ERROR(psCreateDevMemContextOUT->eError, psPerProc,
PVRSRV_MAX_CLIENT_HEAPS + 1);
- psCreateDevMemContextOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psCreateDevMemContextOUT->eError = PVRSRVLookupHandle(
+ psPerProc->psHandleBase, &hDevCookieInt,
psCreateDevMemContextIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if (psCreateDevMemContextOUT->eError != PVRSRV_OK)
return 0;
- psCreateDevMemContextOUT->eError =
- PVRSRVCreateDeviceMemContextKM(hDevCookieInt,
- psPerProc,
+ psCreateDevMemContextOUT->eError = PVRSRVCreateDeviceMemContextKM(
+ hDevCookieInt, psPerProc,
&hDevMemContextInt,
- &psCreateDevMemContextOUT->
- ui32ClientHeapCount,
- &psCreateDevMemContextOUT->
- sHeapInfo[0], &bCreated
- , abSharedDeviceMemHeap
- );
+ &psCreateDevMemContextOUT->ui32ClientHeapCount,
+ &psCreateDevMemContextOUT->sHeapInfo[0],
+ &bCreated, pbSharedDeviceMemHeap);
if (psCreateDevMemContextOUT->eError != PVRSRV_OK)
return 0;
void *hDevMemHeapExt;
if (abSharedDeviceMemHeap[i]) {
-
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&hDevMemHeapExt,
psCreateDevMemContextOUT->
PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
} else {
-
if (bCreated) {
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &hDevMemHeapExt,
- psCreateDevMemContextOUT->
- sHeapInfo[i].hDevMemHeap,
- PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE,
- psCreateDevMemContextOUT->
- hDevMemContext);
+ &hDevMemHeapExt,
+ psCreateDevMemContextOUT->sHeapInfo[i].
+ hDevMemHeap,
+ PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE,
+ psCreateDevMemContextOUT->
+ hDevMemContext);
} else {
psCreateDevMemContextOUT->eError =
PVRSRVFindHandle(
}
}
psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap =
- hDevMemHeapExt;
+ hDevMemHeapExt;
}
COMMIT_HANDLE_BATCH_OR_ERROR(psCreateDevMemContextOUT->eError,
- psPerProc);
+ psPerProc);
return 0;
}
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
PVRSRV_BRIDGE_DESTROY_DEVMEMCONTEXT);
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
psDestroyDevMemContextIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevMemContextInt,
psDestroyDevMemContextIN->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- psRetOUT->eError =
- PVRSRVDestroyDeviceMemContextKM(hDevCookieInt,
- hDevMemContextInt,
- &bDestroyed);
+ psRetOUT->eError = PVRSRVDestroyDeviceMemContextKM(hDevCookieInt,
+ hDevMemContextInt, &bDestroyed);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
if (bDestroyed)
- psRetOUT->eError =
- PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
psDestroyDevMemContextIN->
hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
hDevMemContextInt,
&psGetDevMemHeapInfoOUT->ui32ClientHeapCount,
&psGetDevMemHeapInfoOUT->sHeapInfo[0],
- abSharedDeviceMemHeap);
+ pbSharedDeviceMemHeap);
if (psGetDevMemHeapInfoOUT->eError != PVRSRV_OK)
return 0;
for (i = 0; i < psGetDevMemHeapInfoOUT->ui32ClientHeapCount; i++) {
void *hDevMemHeapExt;
-
if (abSharedDeviceMemHeap[i]) {
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&hDevMemHeapExt,
PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
} else {
-
psGetDevMemHeapInfoOUT->eError =
PVRSRVFindHandle(psPerProc->psHandleBase,
&hDevMemHeapExt,
return 0;
psAllocDeviceMemOUT->eError =
- PVRSRVAllocDeviceMemKM(hDevCookieInt,
- psPerProc,
- hDevMemHeapInt,
+ PVRSRVAllocDeviceMemKM(hDevCookieInt, psPerProc, hDevMemHeapInt,
psAllocDeviceMemIN->ui32Attribs,
psAllocDeviceMemIN->ui32Size,
psAllocDeviceMemIN->ui32Alignment,
if (psAllocDeviceMemOUT->eError != PVRSRV_OK)
return 0;
- OSMemSet(&psAllocDeviceMemOUT->sClientMemInfo,
- 0, sizeof(psAllocDeviceMemOUT->sClientMemInfo));
+ OSMemSet(&psAllocDeviceMemOUT->sClientMemInfo, 0,
+ sizeof(psAllocDeviceMemOUT->sClientMemInfo));
- if (psMemInfo->pvLinAddrKM)
- psAllocDeviceMemOUT->sClientMemInfo.pvLinAddrKM =
+ psAllocDeviceMemOUT->sClientMemInfo.pvLinAddrKM =
psMemInfo->pvLinAddrKM;
- else
- psAllocDeviceMemOUT->sClientMemInfo.pvLinAddrKM =
- psMemInfo->sMemBlk.hOSMemHandle;
+
psAllocDeviceMemOUT->sClientMemInfo.pvLinAddr = NULL;
psAllocDeviceMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr;
psAllocDeviceMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
psAllocDeviceMemOUT->sClientMemInfo.ui32AllocSize =
- psMemInfo->ui32AllocSize;
+ psMemInfo->ui32AllocSize;
psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo =
- psMemInfo->sMemBlk.hOSMemHandle;
+ psMemInfo->sMemBlk.hOSMemHandle;
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
if (psAllocDeviceMemIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ) {
-
- OSMemSet(&psAllocDeviceMemOUT->sClientSyncInfo,
- 0, sizeof(struct PVRSRV_CLIENT_SYNC_INFO));
+ OSMemSet(&psAllocDeviceMemOUT->sClientSyncInfo, 0,
+ sizeof(struct PVRSRV_CLIENT_SYNC_INFO));
psAllocDeviceMemOUT->sClientMemInfo.psClientSyncInfo = NULL;
psAllocDeviceMemOUT->psKernelSyncInfo = NULL;
} else {
psAllocDeviceMemOUT->psKernelSyncInfo =
- psMemInfo->psKernelSyncInfo;
+ psMemInfo->psKernelSyncInfo;
psAllocDeviceMemOUT->sClientSyncInfo.psSyncData =
psMemInfo->psKernelSyncInfo->psSyncData;
psAllocDeviceMemOUT->sClientSyncInfo.hMappingInfo =
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.
- hOSMemHandle;
+ hOSMemHandle;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psAllocDeviceMemOUT->sClientSyncInfo.
{
void *hDevCookieInt;
void *pvKernelMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_FREE_DEVICEMEM);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- psRetOUT->eError =
- PVRSRVFreeDeviceMemKM(hDevCookieInt, pvKernelMemInfo);
+ psKernelMemInfo = (struct PVRSRV_KERNEL_MEM_INFO *)pvKernelMemInfo;
+ if (psKernelMemInfo->ui32RefCount != 1) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVFreeDeviceMemBW: "
+ "mappings are open in other processes");
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ psRetOUT->eError = PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ pvKernelMemInfo);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- psRetOUT->eError =
- PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psFreeDeviceMemIN->psKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
+ psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psFreeDeviceMemIN->psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+
+ return 0;
+}
+
+static int PVRSRVExportDeviceMemBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_EXPORTDEVICEMEM *psExportDeviceMemIN,
+ struct PVRSRV_BRIDGE_OUT_EXPORTDEVICEMEM *psExportDeviceMemOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EXPORT_DEVICEMEM);
+
+ psExportDeviceMemOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psExportDeviceMemIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psExportDeviceMemOUT->eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVExportDeviceMemBW: can't find devcookie");
+ return 0;
+ }
+
+ psExportDeviceMemOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ (void **)&psKernelMemInfo,
+ psExportDeviceMemIN->psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+
+ if (psExportDeviceMemOUT->eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVExportDeviceMemBW: can't find kernel meminfo");
+ return 0;
+ }
+
+ psExportDeviceMemOUT->eError =
+ PVRSRVFindHandle(KERNEL_HANDLE_BASE,
+ &psExportDeviceMemOUT->hMemInfo,
+ psKernelMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if (psExportDeviceMemOUT->eError == PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_MESSAGE, "PVRSRVExportDeviceMemBW: "
+ "allocation is already exported");
+ return 0;
+ }
+
+ psExportDeviceMemOUT->eError = PVRSRVAllocHandle(KERNEL_HANDLE_BASE,
+ &psExportDeviceMemOUT->hMemInfo,
+ psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE);
+ if (psExportDeviceMemOUT->eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVExportDeviceMemBW: "
+ "failed to allocate handle from global handle list");
+ return 0;
+ }
+
+ psKernelMemInfo->ui32Flags |= PVRSRV_MEM_EXPORTED;
return 0;
}
NEW_HANDLE_BATCH_OR_ERROR(psMapDevMemOUT->eError, psPerProc, 2);
- psMapDevMemOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ psMapDevMemOUT->eError = PVRSRVLookupHandle(KERNEL_HANDLE_BASE,
(void **)&psSrcKernelMemInfo,
- psMapDevMemIN->psSrcKernelMemInfo,
+ psMapDevMemIN->hKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (psMapDevMemOUT->eError != PVRSRV_OK)
return 0;
psMapDevMemOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDstDevMemHeap,
- psMapDevMemIN->
- hDstDevMemHeap,
+ psMapDevMemIN->hDstDevMemHeap,
PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
if (psMapDevMemOUT->eError != PVRSRV_OK)
return 0;
if (psMapDevMemOUT->eError != PVRSRV_OK)
return 0;
- OSMemSet(&psMapDevMemOUT->sDstClientMemInfo,
- 0, sizeof(psMapDevMemOUT->sDstClientMemInfo));
- OSMemSet(&psMapDevMemOUT->sDstClientSyncInfo,
- 0, sizeof(psMapDevMemOUT->sDstClientSyncInfo));
+ OSMemSet(&psMapDevMemOUT->sDstClientMemInfo, 0,
+ sizeof(psMapDevMemOUT->sDstClientMemInfo));
+ OSMemSet(&psMapDevMemOUT->sDstClientSyncInfo, 0,
+ sizeof(psMapDevMemOUT->sDstClientSyncInfo));
+
+ psMapDevMemOUT->sDstClientMemInfo.pvLinAddrKM =
+ psDstKernelMemInfo->pvLinAddrKM;
- if (psDstKernelMemInfo->pvLinAddrKM)
- psMapDevMemOUT->sDstClientMemInfo.pvLinAddrKM =
- psDstKernelMemInfo->pvLinAddrKM;
- else
- psMapDevMemOUT->sDstClientMemInfo.pvLinAddrKM =
- psDstKernelMemInfo->sMemBlk.hOSMemHandle;
psMapDevMemOUT->sDstClientMemInfo.pvLinAddr = NULL;
psMapDevMemOUT->sDstClientMemInfo.sDevVAddr =
- psDstKernelMemInfo->sDevVAddr;
+ psDstKernelMemInfo->sDevVAddr;
psMapDevMemOUT->sDstClientMemInfo.ui32Flags =
- psDstKernelMemInfo->ui32Flags;
+ psDstKernelMemInfo->ui32Flags;
psMapDevMemOUT->sDstClientMemInfo.ui32AllocSize =
- psDstKernelMemInfo->ui32AllocSize;
+ psDstKernelMemInfo->ui32AllocSize;
psMapDevMemOUT->sDstClientMemInfo.hMappingInfo =
- psDstKernelMemInfo->sMemBlk.hOSMemHandle;
+ psDstKernelMemInfo->sMemBlk.hOSMemHandle;
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psMapDevMemOUT->sDstClientMemInfo.hKernelMemInfo,
psDstKernelMemInfo->psKernelSyncInfo->psSyncData;
psMapDevMemOUT->sDstClientSyncInfo.sWriteOpsCompleteDevVAddr =
psDstKernelMemInfo->psKernelSyncInfo->
- sWriteOpsCompleteDevVAddr;
+ sWriteOpsCompleteDevVAddr;
psMapDevMemOUT->sDstClientSyncInfo.sReadOpsCompleteDevVAddr =
psDstKernelMemInfo->psKernelSyncInfo->
- sReadOpsCompleteDevVAddr;
+ sReadOpsCompleteDevVAddr;
psMapDevMemOUT->sDstClientSyncInfo.hMappingInfo =
psDstKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->
- sMemBlk.hOSMemHandle;
+ sMemBlk.hOSMemHandle;
psMapDevMemOUT->sDstClientMemInfo.psClientSyncInfo =
&psMapDevMemOUT->sDstClientSyncInfo;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psMapDevMemOUT->sDstClientSyncInfo.
- hKernelSyncInfo,
+ hKernelSyncInfo,
psDstKernelMemInfo->psKernelSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psMapDevMemOUT->sDstClientMemInfo.
- hKernelMemInfo);
+ hKernelMemInfo);
}
COMMIT_HANDLE_BATCH_OR_ERROR(psMapDevMemOUT->eError, psPerProc);
return 0;
}
-static int FlushCacheDRI(int dir, struct BM_BUF *buf)
-{
- unsigned long s, e;
- struct IMG_SYS_PHYADDR *paddr;
- int pg_cnt;
-
- s = (unsigned long)buf->pMapping->CpuVAddr;
- e = s + buf->pMapping->uSize;
- if (s == e)
- return 0;
-
- pg_cnt = (PAGE_ALIGN(e) - (s & PAGE_MASK)) / PAGE_SIZE;
- paddr = buf->pvPageList;
-
- for (; pg_cnt; pg_cnt--) {
- struct page *page;
- size_t chunk;
- void *kaddr;
-
- page = pfn_to_page(paddr->uiAddr >> PAGE_SHIFT);
- kaddr = page_address(page);
- /* Adjust for the first page */
- kaddr += s & ~PAGE_MASK;
- chunk = PAGE_SIZE - (s & ~PAGE_MASK);
-
- /* Adjust for the last page */
- chunk = min_t(ssize_t, e - s, chunk);
- dma_cache_maint(kaddr, chunk, dir);
-
- s += chunk;
-
- paddr++;
- }
-
- return 0;
-}
-
-static struct BM_BUF *get_dev_buf(void *dev_cookie, void *virt_addr)
-{
- struct BM_BUF *buf;
- void *heap;
- struct PVRSRV_DEVICE_NODE *devnode;
- struct DEVICE_MEMORY_INFO *dev_mem_info;
-
- devnode = (struct PVRSRV_DEVICE_NODE *)dev_cookie;
- dev_mem_info = &devnode->sDevMemoryInfo;
- heap = dev_mem_info->
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].hDevMemHeap;
- buf = bm_get_buf_virt(heap, virt_addr);
- if (buf)
- return buf;
-
- heap = dev_mem_info->
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].hDevMemHeap;
- buf = bm_get_buf_virt(heap, virt_addr);
- return buf;
-}
-
-static int PVRSRVCacheFlushDRIBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_CACHEFLUSHDRMFROMUSER *psCacheFlushIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+static int FlushCacheDRI(u32 ui32Type, u32 ui32Virt, u32 ui32Length)
{
- void *dev_cookie_int;
- void *start;
- size_t length;
- int res = 0;
- struct BM_BUF *dev_buf;
- int dir;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_CACHE_FLUSH_DRM);
-
- switch (psCacheFlushIN->ui32Type) {
+ switch (ui32Type) {
case DRM_PVR2D_CFLUSH_FROM_GPU:
- dir = DMA_FROM_DEVICE;
PVR_DPF(PVR_DBG_MESSAGE,
"DRM_PVR2D_CFLUSH_FROM_GPU 0x%08x, length 0x%08x\n",
- pvVirt, ui32Length);
- break;
+ ui32Virt, ui32Length);
+#ifdef CONFIG_ARM
+ dmac_inv_range((const void *)ui32Virt,
+ (const void *)(ui32Virt + ui32Length));
+#endif
+ return 0;
case DRM_PVR2D_CFLUSH_TO_GPU:
- dir = DMA_TO_DEVICE;
PVR_DPF(PVR_DBG_MESSAGE,
"DRM_PVR2D_CFLUSH_TO_GPU 0x%08x, length 0x%08x\n",
- pvVirt, ui32Length);
- break;
+ ui32Virt, ui32Length);
+#ifdef CONFIG_ARM
+ dmac_clean_range((const void *)ui32Virt,
+ (const void *)(ui32Virt + ui32Length));
+#endif
+ return 0;
default:
PVR_DPF(PVR_DBG_ERROR, "Invalid cflush type 0x%x\n",
ui32Type);
return -EINVAL;
}
- PVRSRVLookupHandle(psPerProc->psHandleBase, &dev_cookie_int,
- psCacheFlushIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- PVR_ASSERT(dev_cookie_int);
-
- start = psCacheFlushIN->pvVirt;
- length = psCacheFlushIN->ui32Length;
+ return 0;
+}
- down_read(¤t->mm->mmap_sem);
+static int PVRSRVCacheFlushDRIBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_CACHEFLUSHDRMFROMUSER *psCacheFlushIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ struct vm_area_struct *vma;
+ unsigned long start;
+ size_t len;
+ int type;
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_CACHE_FLUSH_DRM);
- dev_buf = get_dev_buf(dev_cookie_int, start);
+ start = psCacheFlushIN->ui32Virt;
+ len = psCacheFlushIN->ui32Length;
+ type = psCacheFlushIN->ui32Type;
- if (dev_buf && length <= dev_buf->pMapping->uSize) {
- psRetOUT->eError = FlushCacheDRI(dir, dev_buf);
- } else {
- printk(KERN_WARNING
- "%s: Start address %p and length %#08x not wrapped \n",
- __func__,
- start, length);
- res = -EINVAL;
+ down_read(¤t->mm->mmap_sem);
+ vma = find_vma(current->mm, start);
+ if (vma == NULL || vma->vm_start > start ||
+ vma->vm_end < start + len) {
+ pr_err("PVR: %s: invalid address %08lx %zu %c\n",
+ __func__, start, len,
+ type == DRM_PVR2D_CFLUSH_TO_GPU ? 'c' :
+ type == DRM_PVR2D_CFLUSH_FROM_GPU ? 'i' :
+ '?');
+ return 0;
}
+ psRetOUT->eError = FlushCacheDRI(type, start, len);
up_read(¤t->mm->mmap_sem);
- return res;
+ return 0;
}
static int PVRSRVMapDeviceClassMemoryBW(u32 ui32BridgeID,
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
void *hOSMapInfo;
void *hDeviceClassBufferInt;
+ void *hDevMemContextInt;
enum PVRSRV_HANDLE_TYPE eHandleType;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
if (psMapDevClassMemOUT->eError != PVRSRV_OK)
return 0;
+ psMapDevClassMemOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
+ psMapDevClassMemIN->hDevMemContext,
+ PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
+
+ if (psMapDevClassMemOUT->eError != PVRSRV_OK)
+ return 0;
+
switch (eHandleType) {
case PVRSRV_HANDLE_TYPE_DISP_BUFFER:
case PVRSRV_HANDLE_TYPE_BUF_BUFFER:
}
psMapDevClassMemOUT->eError =
- PVRSRVMapDeviceClassMemoryKM(psPerProc,
- hDeviceClassBufferInt,
- &psMemInfo, &hOSMapInfo);
+ PVRSRVMapDeviceClassMemoryKM(psPerProc, hDevMemContextInt,
+ hDeviceClassBufferInt, &psMemInfo, &hOSMapInfo);
if (psMapDevClassMemOUT->eError != PVRSRV_OK)
return 0;
- OSMemSet(&psMapDevClassMemOUT->sClientMemInfo,
- 0, sizeof(psMapDevClassMemOUT->sClientMemInfo));
- OSMemSet(&psMapDevClassMemOUT->sClientSyncInfo,
- 0, sizeof(psMapDevClassMemOUT->sClientSyncInfo));
+ OSMemSet(&psMapDevClassMemOUT->sClientMemInfo, 0,
+ sizeof(psMapDevClassMemOUT->sClientMemInfo));
+ OSMemSet(&psMapDevClassMemOUT->sClientSyncInfo, 0,
+ sizeof(psMapDevClassMemOUT->sClientSyncInfo));
+
+ psMapDevClassMemOUT->sClientMemInfo.pvLinAddrKM =
+ psMemInfo->pvLinAddrKM;
- if (psMemInfo->pvLinAddrKM)
- psMapDevClassMemOUT->sClientMemInfo.pvLinAddrKM =
- psMemInfo->pvLinAddrKM;
- else
- psMapDevClassMemOUT->sClientMemInfo.pvLinAddrKM =
- psMemInfo->sMemBlk.hOSMemHandle;
psMapDevClassMemOUT->sClientMemInfo.pvLinAddr = NULL;
psMapDevClassMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr;
psMapDevClassMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
psMapDevClassMemOUT->sClientMemInfo.ui32AllocSize =
- psMemInfo->ui32AllocSize;
+ psMemInfo->ui32AllocSize;
psMapDevClassMemOUT->sClientMemInfo.hMappingInfo =
- psMemInfo->sMemBlk.hOSMemHandle;
+ psMemInfo->sMemBlk.hOSMemHandle;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psMapDevClassMemOUT->sClientMemInfo.
- hKernelMemInfo, psMemInfo,
+ &psMapDevClassMemOUT->sClientMemInfo.hKernelMemInfo,
+ psMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO,
PVRSRV_HANDLE_ALLOC_FLAG_NONE,
psMapDevClassMemIN->hDeviceClassBuffer);
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psMapDevClassMemOUT->sClientSyncInfo.
- hKernelSyncInfo,
+ hKernelSyncInfo,
psMemInfo->psKernelSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psMapDevClassMemOUT->sClientMemInfo.
- hKernelMemInfo);
+ hKernelMemInfo);
}
COMMIT_HANDLE_BATCH_OR_ERROR(psMapDevClassMemOUT->eError, psPerProc);
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
void *hDevCookieInt;
+ void *hDevMemContextInt;
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
u32 ui32PageTableSize = 0;
struct IMG_SYS_PHYADDR *psSysPAddr = NULL;
if (psWrapExtMemOUT->eError != PVRSRV_OK)
return 0;
+ psWrapExtMemOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
+ psWrapExtMemIN->hDevMemContext,
+ PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
+
+ if (psWrapExtMemOUT->eError != PVRSRV_OK)
+ return 0;
+
if (psWrapExtMemIN->ui32NumPageTableEntries) {
ui32PageTableSize = psWrapExtMemIN->ui32NumPageTableEntries
* sizeof(struct IMG_SYS_PHYADDR);
ui32PageTableSize,
(void **)&psSysPAddr, NULL));
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- psSysPAddr,
+ if (CopyFromUserWrapper(psPerProc, ui32BridgeID, psSysPAddr,
psWrapExtMemIN->psSysPAddr,
ui32PageTableSize) != PVRSRV_OK) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32PageTableSize,
}
}
- psWrapExtMemOUT->eError =
- PVRSRVWrapExtMemoryKM(hDevCookieInt,
- psPerProc,
+ psWrapExtMemOUT->eError = PVRSRVWrapExtMemoryKM(hDevCookieInt,
+ psPerProc, hDevMemContextInt,
psWrapExtMemIN->ui32ByteSize,
psWrapExtMemIN->ui32PageOffset,
psWrapExtMemIN->bPhysContig,
- psSysPAddr,
- psWrapExtMemIN->pvLinAddr, &psMemInfo);
- if (psWrapExtMemOUT->eError != PVRSRV_OK) {
- /* PVRSRVWrapExtMemoryKM failed, so clean up page list */
- if (psWrapExtMemIN->ui32NumPageTableEntries)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32PageTableSize,
- (void *) psSysPAddr, NULL);
+ psSysPAddr, psWrapExtMemIN->pvLinAddr,
+ &psMemInfo);
+ if (psWrapExtMemIN->ui32NumPageTableEntries)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32PageTableSize,
+ (void *)psSysPAddr, NULL);
+ if (psWrapExtMemOUT->eError != PVRSRV_OK)
return 0;
- }
- if (psMemInfo->pvLinAddrKM)
- psWrapExtMemOUT->sClientMemInfo.pvLinAddrKM =
- psMemInfo->pvLinAddrKM;
- else
- psWrapExtMemOUT->sClientMemInfo.pvLinAddrKM =
- psMemInfo->sMemBlk.hOSMemHandle;
+ psWrapExtMemOUT->sClientMemInfo.pvLinAddrKM = psMemInfo->pvLinAddrKM;
psWrapExtMemOUT->sClientMemInfo.pvLinAddr = NULL;
psWrapExtMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr;
psWrapExtMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
psWrapExtMemOUT->sClientMemInfo.ui32AllocSize =
- psMemInfo->ui32AllocSize;
- psWrapExtMemOUT->sClientMemInfo.hMappingInfo = NULL;
+ psMemInfo->ui32AllocSize;
+ psWrapExtMemOUT->sClientMemInfo.hMappingInfo =
+ psMemInfo->sMemBlk.hOSMemHandle;
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo,
- psMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO,
+ psMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
psWrapExtMemOUT->sClientSyncInfo.psSyncData =
psWrapExtMemOUT->sClientSyncInfo.hMappingInfo =
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.
- hOSMemHandle;
+ hOSMemHandle;
psWrapExtMemOUT->sClientMemInfo.psClientSyncInfo =
&psWrapExtMemOUT->sClientSyncInfo;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psWrapExtMemOUT->sClientSyncInfo.
- hKernelSyncInfo,
- (void *) psMemInfo->psKernelSyncInfo,
+ hKernelSyncInfo,
+ (void *)psMemInfo->psKernelSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE,
psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo);
COMMIT_HANDLE_BATCH_OR_ERROR(psWrapExtMemOUT->eError, psPerProc);
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNWRAP_EXT_MEMORY);
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &pvMemInfo,
- psUnwrapExtMemIN->hKernelMemInfo,
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &pvMemInfo, psUnwrapExtMemIN->hKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- psRetOUT->eError =
- PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
psUnwrapExtMemIN->hKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
return 0;
}
-static int PVRMMapKVIndexAddressToMMapDataBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_KV_TO_MMAP_DATA *psMMapDataIN,
- struct PVRSRV_BRIDGE_OUT_KV_TO_MMAP_DATA *psMMapDataOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+static int PVRMMapOSMemHandleToMMapDataBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_MHANDLE_TO_MMAP_DATA *psMMapDataIN,
+ struct PVRSRV_BRIDGE_OUT_MHANDLE_TO_MMAP_DATA *psMMapDataOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_KV_TO_MMAP_DATA);
- PVR_UNREFERENCED_PARAMETER(psMMapDataIN);
- PVR_UNREFERENCED_PARAMETER(psPerProc);
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA);
psMMapDataOUT->eError =
- PVRMMapKVIndexAddressToMMapData(psMMapDataIN->pvKVIndexAddress,
- psMMapDataIN->ui32Bytes,
- &psMMapDataOUT->ui32MMapOffset,
- &psMMapDataOUT->ui32ByteOffset,
- &psMMapDataOUT->ui32RealByteSize);
+ PVRMMapOSMemHandleToMMapData(psPerProc, psMMapDataIN->hMHandle,
+ &psMMapDataOUT->ui32MMapOffset,
+ &psMMapDataOUT->ui32ByteOffset,
+ &psMMapDataOUT->ui32RealByteSize,
+ &psMMapDataOUT->ui32UserVAddr);
+ return 0;
+}
+
+static int PVRMMapReleaseMMapDataBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_RELEASE_MMAP_DATA *psMMapDataIN,
+ struct PVRSRV_BRIDGE_OUT_RELEASE_MMAP_DATA *psMMapDataOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_RELEASE_MMAP_DATA);
+ psMMapDataOUT->eError = PVRMMapReleaseMMapData(psPerProc,
+ psMMapDataIN->hMHandle,
+ &psMMapDataOUT->bMUnmap,
+ &psMMapDataOUT->ui32RealByteSize,
+ &psMMapDataOUT->ui32UserVAddr);
return 0;
}
#ifdef PDUMP
-static int PDumpIsCaptureFrameBW(u32 ui32BridgeID,
- void *psBridgeIn,
+static int PDumpIsCaptureFrameBW(u32 ui32BridgeID, void *psBridgeIn,
struct PVRSRV_BRIDGE_OUT_PDUMP_ISCAPTURING *psPDumpIsCapturingOUT,
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_MEMPOL);
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &pvMemInfo,
- psPDumpMemPolIN->psKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &pvMemInfo,
+ psPDumpMemPolIN->psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
void *pvMemInfo;
- void *pvAltLinAddrKM = NULL;
- u32 ui32Bytes = psPDumpMemDumpIN->ui32Bytes;
- void *hBlockAlloc = 0;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_DUMPMEM);
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &pvMemInfo,
- psPDumpMemDumpIN->psKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &pvMemInfo,
+ psPDumpMemDumpIN->psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- if (psPDumpMemDumpIN->pvAltLinAddr) {
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32Bytes,
- &pvAltLinAddrKM, &hBlockAlloc) != PVRSRV_OK)
- return -EFAULT;
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- pvAltLinAddrKM,
- psPDumpMemDumpIN->pvAltLinAddr,
- ui32Bytes) != PVRSRV_OK) {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32Bytes,
- pvAltLinAddrKM, hBlockAlloc);
- return -EFAULT;
- }
- }
-
- psRetOUT->eError =
- PDumpMemKM(pvAltLinAddrKM,
- pvMemInfo,
- psPDumpMemDumpIN->ui32Offset,
- ui32Bytes,
- psPDumpMemDumpIN->ui32Flags, MAKEUNIQUETAG(pvMemInfo));
-
- if (pvAltLinAddrKM)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32Bytes, pvAltLinAddrKM,
- hBlockAlloc);
+ psRetOUT->eError = PDumpMemUM(psPerProc, psPDumpMemDumpIN->pvAltLinAddr,
+ psPDumpMemDumpIN->pvLinAddr,
+ pvMemInfo, psPDumpMemDumpIN->ui32Offset,
+ psPDumpMemDumpIN->ui32Bytes,
+ psPDumpMemDumpIN->ui32Flags,
+ MAKEUNIQUETAG(pvMemInfo));
return 0;
}
PVR_UNREFERENCED_PARAMETER(psPerProc);
PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
- psRetOUT->eError =
- PDumpBitmapKM(&psPDumpBitmapIN->szFileName[0],
+ psRetOUT->eError = PDumpBitmapKM(&psPDumpBitmapIN->szFileName[0],
psPDumpBitmapIN->ui32FileOffset,
psPDumpBitmapIN->ui32Width,
psPDumpBitmapIN->ui32Height,
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_DUMPREADREG);
PVR_UNREFERENCED_PARAMETER(psPerProc);
- psRetOUT->eError =
- PDumpReadRegKM(&psPDumpReadRegIN->szFileName[0],
+ psRetOUT->eError = PDumpReadRegKM(&psPDumpReadRegIN->szFileName[0],
psPDumpReadRegIN->ui32FileOffset,
psPDumpReadRegIN->ui32Address,
psPDumpReadRegIN->ui32Size,
ui32PDumpFlags = 0;
if (psPDumpDriverInfoIN->bContinuous)
ui32PDumpFlags |= PDUMP_FLAGS_CONTINUOUS;
- psRetOUT->eError =
- PDumpDriverInfoKM(&psPDumpDriverInfoIN->szString[0],
- ui32PDumpFlags);
+ psRetOUT->eError = PDumpDriverInfoKM(&psPDumpDriverInfoIN->szString[0],
+ ui32PDumpFlags);
return 0;
}
struct PVRSRV_BRIDGE_RETURN *psRetOUT,
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
- void *pvAltLinAddrKM = NULL;
u32 ui32Bytes = psPDumpSyncDumpIN->ui32Bytes;
void *pvSyncInfo;
if (psRetOUT->eError != PVRSRV_OK)
return 0;
- if (psPDumpSyncDumpIN->pvAltLinAddr) {
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32Bytes, &pvAltLinAddrKM, 0) != PVRSRV_OK)
- return -EFAULT;
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- pvAltLinAddrKM,
- psPDumpSyncDumpIN->pvAltLinAddr,
- ui32Bytes) != PVRSRV_OK) {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32Bytes,
- pvAltLinAddrKM, 0);
- return -EFAULT;
- }
- }
-
psRetOUT->eError =
- PDumpMemKM(pvAltLinAddrKM,
- ((struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo)->
- psSyncDataMemInfoKM, psPDumpSyncDumpIN->ui32Offset,
- ui32Bytes, 0,
- MAKEUNIQUETAG(
- ((struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo)->
- psSyncDataMemInfoKM));
-
- if (pvAltLinAddrKM)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32Bytes, pvAltLinAddrKM,
- 0);
+ PDumpMemUM(psPerProc, psPDumpSyncDumpIN->pvAltLinAddr, NULL,
+ ((struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo)->
+ psSyncDataMemInfoKM,
+ psPDumpSyncDumpIN->ui32Offset, ui32Bytes, 0,
+ MAKEUNIQUETAG(((struct PVRSRV_KERNEL_SYNC_INFO *)
+ pvSyncInfo)->psSyncDataMemInfoKM));
return 0;
}
}
static int PDumpCycleCountRegReadBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_PDUMP_CYCLE_COUNT_REG_READi
+ struct PVRSRV_BRIDGE_IN_PDUMP_CYCLE_COUNT_REG_READ
*psPDumpCycleCountRegReadIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ);
return 0;
}
-static int
-PDumpPDDevPAddrBW(u32 ui32BridgeID,
+static int PDumpPDDevPAddrBW(u32 ui32BridgeID,
struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR *psPDumpPDDevPAddrIN,
struct PVRSRV_BRIDGE_RETURN *psRetOUT,
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
return 0;
}
-static int PDumpBufferArrayBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
- void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+static int PDumpStartInitPhaseBW(u32 ui32BridgeID, void *psBridgeIn,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
- u32 i;
- struct PVR3DIF4_KICKTA_DUMP_BUFFER *psKickTADumpBuffer;
- u32 ui32BufferArrayLength =
- psPDumpBufferArrayIN->ui32BufferArrayLength;
- u32 ui32BufferArraySize =
- ui32BufferArrayLength * sizeof(struct PVR3DIF4_KICKTA_DUMP_BUFFER);
- enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_PDUMP_STARTINITPHASE);
+ PVR_UNREFERENCED_PARAMETER(psBridgeIn);
+ PVR_UNREFERENCED_PARAMETER(psPerProc);
- PVR_UNREFERENCED_PARAMETER(psBridgeOut);
+ psRetOUT->eError = PDumpStartInitPhaseKM();
+
+ return 0;
+}
+static int PDumpStopInitPhaseBW(u32 ui32BridgeID, void *psBridgeIn,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_PDUMP_BUFFER_ARRAY);
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32BufferArraySize,
- (void **) &psKickTADumpBuffer, 0) != PVRSRV_OK)
- return -ENOMEM;
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- psKickTADumpBuffer,
- psPDumpBufferArrayIN->psBufferArray,
- ui32BufferArraySize) != PVRSRV_OK) {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
- psKickTADumpBuffer, 0);
- return -EFAULT;
- }
+ PVRSRV_BRIDGE_PDUMP_STOPINITPHASE);
+ PVR_UNREFERENCED_PARAMETER(psBridgeIn);
+ PVR_UNREFERENCED_PARAMETER(psPerProc);
- for (i = 0; i < ui32BufferArrayLength; i++) {
- void *pvMemInfo;
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &pvMemInfo,
- psKickTADumpBuffer[i].
- hKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
-
- if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "PVRSRV_BRIDGE_PDUMP_BUFFER_ARRAY: "
- "PVRSRVLookupHandle failed (%d)", eError);
- break;
- }
- psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo;
- }
-
- if (eError == PVRSRV_OK)
- DumpBufferArray(psKickTADumpBuffer,
- ui32BufferArrayLength,
- psPDumpBufferArrayIN->bDumpPolls);
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
- psKickTADumpBuffer, 0);
-
- return 0;
-}
-
-static int PDump3DSignatureRegistersBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS
- *psPDump3DSignatureRegistersIN,
- void *psBridgeOut,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- u32 ui32RegisterArraySize =
- psPDump3DSignatureRegistersIN->ui32NumRegisters *
- sizeof(u32);
- u32 *pui32Registers = NULL;
- int ret = -EFAULT;
-
- PVR_UNREFERENCED_PARAMETER(psBridgeOut);
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_PDUMP_3D_SIGNATURE_REGISTERS);
-
- if (ui32RegisterArraySize == 0)
- goto ExitNoError;
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32RegisterArraySize,
- (void **) &pui32Registers, 0) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "PDump3DSignatureRegistersBW: OSAllocMem failed");
- goto Exit;
- }
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- pui32Registers,
- psPDump3DSignatureRegistersIN->pui32Registers,
- ui32RegisterArraySize) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: "
- "CopyFromUserWrapper failed");
- goto Exit;
- }
-
- PDump3DSignatureRegisters(psPDump3DSignatureRegistersIN->
- ui32DumpFrameNum,
- psPDump3DSignatureRegistersIN->bLastFrame,
- pui32Registers,
- psPDump3DSignatureRegistersIN->
- ui32NumRegisters);
-
-ExitNoError:
- ret = 0;
-Exit:
- if (pui32Registers != NULL)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
- pui32Registers, 0);
-
- return ret;
-}
-
-static int PDumpCounterRegistersBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS
- *psPDumpCounterRegistersIN,
- void *psBridgeOut,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- u32 ui32RegisterArraySize =
- psPDumpCounterRegistersIN->ui32NumRegisters * sizeof(u32);
- u32 *pui32Registers = NULL;
- int ret = -EFAULT;
-
- PVR_UNREFERENCED_PARAMETER(psBridgeOut);
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_PDUMP_COUNTER_REGISTERS);
-
- if (ui32RegisterArraySize == 0)
- goto ExitNoError;
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32RegisterArraySize,
- (void **) &pui32Registers, 0) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "PDumpCounterRegistersBW: OSAllocMem failed");
- ret = -ENOMEM;
- goto Exit;
- }
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- pui32Registers,
- psPDumpCounterRegistersIN->pui32Registers,
- ui32RegisterArraySize) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PDumpCounterRegistersBW: "
- "CopyFromUserWrapper failed");
- goto Exit;
- }
-
- PDumpCounterRegisters(psPDumpCounterRegistersIN->ui32DumpFrameNum,
- psPDumpCounterRegistersIN->bLastFrame,
- pui32Registers,
- psPDumpCounterRegistersIN->ui32NumRegisters);
-
-ExitNoError:
- ret = 0;
-Exit:
- if (pui32Registers != NULL)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
- pui32Registers, 0);
-
- return ret;
-}
-
-static int PDumpTASignatureRegistersBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS
- *psPDumpTASignatureRegistersIN,
- void *psBridgeOut,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- u32 ui32RegisterArraySize =
- psPDumpTASignatureRegistersIN->ui32NumRegisters *
- sizeof(u32);
- u32 *pui32Registers = NULL;
- int ret = -EFAULT;
-
- PVR_UNREFERENCED_PARAMETER(psBridgeOut);
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_PDUMP_TA_SIGNATURE_REGISTERS);
-
- if (ui32RegisterArraySize == 0)
- goto ExitNoError;
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32RegisterArraySize,
- (void **) &pui32Registers, 0) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "PDumpTASignatureRegistersBW: OSAllocMem failed");
- ret = -ENOMEM;
- goto Exit;
- }
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- pui32Registers,
- psPDumpTASignatureRegistersIN->pui32Registers,
- ui32RegisterArraySize) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: "
- "CopyFromUserWrapper failed");
- goto Exit;
- }
-
- PDumpTASignatureRegisters(psPDumpTASignatureRegistersIN->
- ui32DumpFrameNum,
- psPDumpTASignatureRegistersIN->
- ui32TAKickCount,
- psPDumpTASignatureRegistersIN->bLastFrame,
- pui32Registers,
- psPDumpTASignatureRegistersIN->
- ui32NumRegisters);
-
-ExitNoError:
- ret = 0;
-Exit:
- if (pui32Registers != NULL)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
- pui32Registers, 0);
-
- return ret;
-}
-#endif
-
-static int SGXGetClientInfoBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_GETCLIENTINFO *psGetClientInfoIN,
- struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO *psGetClientInfoOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETCLIENTINFO);
-
- psGetClientInfoOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
- psGetClientInfoIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psGetClientInfoOUT->eError != PVRSRV_OK)
- return 0;
-
- psGetClientInfoOUT->eError =
- SGXGetClientInfoKM(hDevCookieInt, &psGetClientInfoOUT->sClientInfo);
- return 0;
-}
-
-static int SGXReleaseClientInfoBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO *psReleaseClientInfoIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- struct PVRSRV_SGXDEV_INFO *psDevInfo;
- void *hDevCookieInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
- psReleaseClientInfoIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psDevInfo = (struct PVRSRV_SGXDEV_INFO *)
- ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
-
- PVR_ASSERT(psDevInfo->ui32ClientRefCount > 0);
-
- psDevInfo->ui32ClientRefCount--;
-
- psRetOUT->eError = PVRSRV_OK;
-
- return 0;
-}
-
-static int SGXGetInternalDevInfoBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO *psSGXGetInternalDevInfoIN,
- struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO *psSGXGetInternalDevInfoOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO);
-
- psSGXGetInternalDevInfoOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
- psSGXGetInternalDevInfoIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psSGXGetInternalDevInfoOUT->eError != PVRSRV_OK)
- return 0;
-
- psSGXGetInternalDevInfoOUT->eError =
- SGXGetInternalDevInfoKM(hDevCookieInt,
- &psSGXGetInternalDevInfoOUT->
- sSGXInternalDevInfo);
-
- psSGXGetInternalDevInfoOUT->eError =
- PVRSRVAllocHandle(psPerProc->psHandleBase,
- &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
- hCtlKernelMemInfoHandle,
- psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
- hCtlKernelMemInfoHandle,
- PVRSRV_HANDLE_TYPE_MEM_INFO,
- PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
-
- return 0;
-}
-
-static int SGXDoKickBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_DOKICK *psDoKickIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- u32 i;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DOKICK);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psDoKickIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.hCCBKernelMemInfo,
- psDoKickIN->sCCBKick.hCCBKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- if (psDoKickIN->sCCBKick.hTA3DSyncInfo != NULL) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.hTA3DSyncInfo,
- psDoKickIN->sCCBKick.hTA3DSyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psDoKickIN->sCCBKick.hTASyncInfo != NULL) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.hTASyncInfo,
- psDoKickIN->sCCBKick.hTASyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psDoKickIN->sCCBKick.h3DSyncInfo != NULL) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.h3DSyncInfo,
- psDoKickIN->sCCBKick.h3DSyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psDoKickIN->sCCBKick.ui32NumSrcSyncs > SGX_MAX_SRC_SYNCS) {
- psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
- return 0;
- }
- for (i = 0; i < psDoKickIN->sCCBKick.ui32NumSrcSyncs; i++) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.
- ahSrcKernelSyncInfo[i],
- psDoKickIN->sCCBKick.
- ahSrcKernelSyncInfo[i],
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psDoKickIN->sCCBKick.ui32NumTAStatusVals > SGX_MAX_TA_STATUS_VALS) {
- psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
- return 0;
- }
- for (i = 0; i < psDoKickIN->sCCBKick.ui32NumTAStatusVals; i++) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.
- ahTAStatusSyncInfo[i],
- psDoKickIN->sCCBKick.
- ahTAStatusSyncInfo[i],
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psDoKickIN->sCCBKick.ui32Num3DStatusVals > SGX_MAX_3D_STATUS_VALS) {
- psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
- return 0;
- }
- for (i = 0; i < psDoKickIN->sCCBKick.ui32Num3DStatusVals; i++) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.
- ah3DStatusSyncInfo[i],
- psDoKickIN->sCCBKick.
- ah3DStatusSyncInfo[i],
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psDoKickIN->sCCBKick.hRenderSurfSyncInfo != NULL) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psDoKickIN->sCCBKick.
- hRenderSurfSyncInfo,
- psDoKickIN->sCCBKick.hRenderSurfSyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- psRetOUT->eError = SGXDoKickKM(hDevCookieInt, &psDoKickIN->sCCBKick);
-
- return 0;
-}
-
-static int SGXSubmitTransferBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER *psSubmitTransferIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- struct PVRSRV_TRANSFER_SGX_KICK *psKick;
- u32 i;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_SUBMITTRANSFER);
- PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
-
- psKick = &psSubmitTransferIN->sKick;
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSubmitTransferIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psKick->hCCBMemInfo,
- psKick->hCCBMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- if (psKick->hTASyncInfo != NULL) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psKick->hTASyncInfo,
- psKick->hTASyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psKick->h3DSyncInfo != NULL) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psKick->h3DSyncInfo,
- psKick->h3DSyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psKick->ui32NumSrcSync > SGX_MAX_TRANSFER_SYNC_OPS) {
- psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
- return 0;
- }
- for (i = 0; i < psKick->ui32NumSrcSync; i++) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psKick->ahSrcSyncInfo[i],
- psKick->ahSrcSyncInfo[i],
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- if (psKick->ui32NumDstSync > SGX_MAX_TRANSFER_SYNC_OPS) {
- psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
- return 0;
- }
- for (i = 0; i < psKick->ui32NumDstSync; i++) {
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psKick->ahDstSyncInfo[i],
- psKick->ahDstSyncInfo[i],
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
- }
-
- psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, psKick);
-
- return 0;
-}
-
-
-
-static int SGXGetMiscInfoBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- struct PVRSRV_SGXDEV_INFO *psDevInfo;
- struct SGX_MISC_INFO sMiscInfo;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETMISCINFO);
-
- psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXGetMiscInfoIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psDevInfo = (struct PVRSRV_SGXDEV_INFO *)
- ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
-
- psRetOUT->eError = CopyFromUserWrapper(psPerProc, ui32BridgeID,
- &sMiscInfo,
- psSGXGetMiscInfoIN->psMiscInfo,
- sizeof(struct SGX_MISC_INFO));
- if (psRetOUT->eError != PVRSRV_OK)
- return -EFAULT;
- if (sMiscInfo.eRequest == SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB) {
- void *pAllocated;
- void *hAllocatedHandle;
- void __user *psTmpUserData;
- int allocatedSize;
-
- allocatedSize = sMiscInfo.uData.sRetrieveCB.ui32ArraySize *
- sizeof(struct PVRSRV_SGX_HWPERF_CBDATA);
-
- ASSIGN_AND_EXIT_ON_ERROR(psRetOUT->eError,
- OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- allocatedSize,
- &pAllocated,
- &hAllocatedHandle));
-
- psTmpUserData = (void __force __user *)
- sMiscInfo.uData.sRetrieveCB.psHWPerfData;
- sMiscInfo.uData.sRetrieveCB.psHWPerfData = pAllocated;
-
- psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo, &sMiscInfo);
- if (psRetOUT->eError != PVRSRV_OK) {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- allocatedSize, pAllocated, hAllocatedHandle);
- return -EFAULT;
- }
-
- psRetOUT->eError = CopyToUserWrapper(
- psPerProc, ui32BridgeID,
- psTmpUserData,
- sMiscInfo.uData.sRetrieveCB.psHWPerfData,
- allocatedSize);
-
- sMiscInfo.uData.sRetrieveCB.psHWPerfData =
- (void __force *)psTmpUserData;
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- allocatedSize, pAllocated, hAllocatedHandle);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return -EFAULT;
- } else {
- psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo, &sMiscInfo);
- if (psRetOUT->eError != PVRSRV_OK)
- return -EFAULT;
- }
-
- psRetOUT->eError = CopyToUserWrapper(psPerProc,
- ui32BridgeID,
- psSGXGetMiscInfoIN->psMiscInfo,
- &sMiscInfo,
- sizeof(struct SGX_MISC_INFO));
- if (psRetOUT->eError != PVRSRV_OK)
- return -EFAULT;
- return 0;
-}
-
-static int SGXReadDiffCountersBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS *psSGXReadDiffCountersIN,
- struct PVRSRV_BRIDGE_OUT_SGX_READ_DIFF_COUNTERS *psSGXReadDiffCountersOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS);
-
- psSGXReadDiffCountersOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
- psSGXReadDiffCountersIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
-
- if (psSGXReadDiffCountersOUT->eError != PVRSRV_OK)
- return 0;
-
- psSGXReadDiffCountersOUT->eError = SGXReadDiffCountersKM(hDevCookieInt,
- psSGXReadDiffCountersIN->ui32Reg,
- &psSGXReadDiffCountersOUT->ui32Old,
- psSGXReadDiffCountersIN->bNew,
- psSGXReadDiffCountersIN->ui32New,
- psSGXReadDiffCountersIN->ui32NewReset,
- psSGXReadDiffCountersIN->ui32CountersReg,
- &psSGXReadDiffCountersOUT->ui32Time,
- &psSGXReadDiffCountersOUT->bActive,
- &psSGXReadDiffCountersOUT->sDiffs);
-
- return 0;
-}
-
-static int PVRSRVInitSrvConnectBW(u32 ui32BridgeID,
- void *psBridgeIn,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- PVR_UNREFERENCED_PARAMETER(psBridgeIn);
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_INITSRV_CONNECT);
- PVR_UNREFERENCED_PARAMETER(psBridgeIn);
-
- if (!OSProcHasPrivSrvInit()
- || PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RUNNING)
- || PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RAN)) {
- psRetOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
- PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RUNNING, IMG_TRUE);
- psPerProc->bInitProcess = IMG_TRUE;
-
- psRetOUT->eError = PVRSRV_OK;
-
- return 0;
-}
-
-static int
-PVRSRVInitSrvDisconnectBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_INITSRV_DISCONNECT *psInitSrvDisconnectIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_INITSRV_DISCONNECT);
-
- if (!psPerProc->bInitProcess) {
- psRetOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
-
- psPerProc->bInitProcess = IMG_FALSE;
-
- PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RUNNING, IMG_FALSE);
- PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RAN, IMG_TRUE);
-
- psRetOUT->eError =
- PVRSRVFinaliseSystem(psInitSrvDisconnectIN->bInitSuccesful);
-
- PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL,
- (IMG_BOOL) (((psRetOUT->eError == PVRSRV_OK)
- && (psInitSrvDisconnectIN->
- bInitSuccesful))));
-
- return 0;
-}
-
-static int
-PVRSRVEventObjectWaitBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_WAIT *psEventObjectWaitIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hOSEventKM;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_WAIT);
-
- psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hOSEventKM,
- psEventObjectWaitIN->hOSEventKM,
- PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError = OSEventObjectWait(hOSEventKM);
-
- return 0;
-}
-
-static int
-PVRSRVEventObjectOpenBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN *psEventObjectOpenIN,
- struct PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN *psEventObjectOpenOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_OPEN);
-
- NEW_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc, 1);
-
- psEventObjectOpenOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psEventObjectOpenIN->sEventObject.hOSEventKM,
- psEventObjectOpenIN->sEventObject.hOSEventKM,
- PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT);
-
- if (psEventObjectOpenOUT->eError != PVRSRV_OK)
- return 0;
-
- psEventObjectOpenOUT->eError =
- OSEventObjectOpen(&psEventObjectOpenIN->sEventObject,
- &psEventObjectOpenOUT->hOSEvent);
-
- if (psEventObjectOpenOUT->eError != PVRSRV_OK)
- return 0;
-
- PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &psEventObjectOpenOUT->hOSEvent,
- psEventObjectOpenOUT->hOSEvent,
- PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
-
- COMMIT_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc);
-
- return 0;
-}
-
-static int
-PVRSRVEventObjectCloseBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE *psEventObjectCloseIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hOSEventKM;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &psEventObjectCloseIN->sEventObject.hOSEventKM,
- psEventObjectCloseIN->sEventObject.hOSEventKM,
- PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- &hOSEventKM,
- psEventObjectCloseIN->hOSEventKM,
- PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT);
-
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- OSEventObjectClose(&psEventObjectCloseIN->sEventObject, hOSEventKM);
-
- return 0;
-}
-
-static int SGXDevInitPart2BW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGXDEVINITPART2 *psSGXDevInitPart2IN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- enum PVRSRV_ERROR eError;
- IMG_BOOL bDissociateFailed = IMG_FALSE;
- IMG_BOOL bLookupFailed = IMG_FALSE;
- IMG_BOOL bReleaseFailed = IMG_FALSE;
- void *hDummy;
- u32 i;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2);
-
- if (!psPerProc->bInitProcess) {
- psRetOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXDevInitPart2IN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDummy,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDummy,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBCtlMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDummy,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBEventKickerMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDummy,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelSGXHostCtlMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDummy,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelHWPerfCBMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
- void *hHandle =
- psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
-
- if (hHandle == NULL)
- continue;
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDummy,
- hHandle,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
- }
-
- if (bLookupFailed) {
- PVR_DPF(PVR_DBG_ERROR,
- "DevInitSGXPart2BW: A handle lookup failed");
- psRetOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
-
- eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- &psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBMemInfo,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- &psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBCtlMemInfo,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBCtlMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- &psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBEventKickerMemInfo,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBEventKickerMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- &psSGXDevInitPart2IN->sInitInfo.
- hKernelSGXHostCtlMemInfo,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelSGXHostCtlMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
-
- eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- &psSGXDevInitPart2IN->sInitInfo.
- hKernelHWPerfCBMemInfo,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelHWPerfCBMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
- void **phHandle =
- &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
-
- if (*phHandle == NULL)
- continue;
-
- eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
- phHandle,
- *phHandle,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
- }
-
- if (bReleaseFailed) {
- PVR_DPF(PVR_DBG_ERROR,
- "DevInitSGXPart2BW: A handle release failed");
- psRetOUT->eError = PVRSRV_ERROR_GENERIC;
-
- PVR_DBG_BREAK;
- return 0;
- }
-
- eError =
- PVRSRVDissociateDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBMemInfo);
- bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError =
- PVRSRVDissociateDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBCtlMemInfo);
- bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError =
- PVRSRVDissociateDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBEventKickerMemInfo);
- bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- eError =
- PVRSRVDissociateDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelSGXHostCtlMemInfo);
- bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
-
- eError =
- PVRSRVDissociateDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelHWPerfCBMemInfo);
- bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
-
- for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
- void *hHandle =
- psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
-
- if (hHandle == NULL)
- continue;
-
- eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, hHandle);
- bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
- }
-
- if (bDissociateFailed) {
- PVRSRVFreeDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBMemInfo);
- PVRSRVFreeDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelCCBCtlMemInfo);
- PVRSRVFreeDeviceMemKM(hDevCookieInt,
- psSGXDevInitPart2IN->sInitInfo.
- hKernelSGXHostCtlMemInfo);
-
- for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
- void *hHandle =
- psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
-
- if (hHandle == NULL)
- continue;
-
- PVRSRVFreeDeviceMemKM(hDevCookieInt,
- (struct PVRSRV_KERNEL_MEM_INFO *)hHandle);
-
- }
-
- PVR_DPF(PVR_DBG_ERROR,
- "DevInitSGXPart2BW: A dissociate failed");
-
- psRetOUT->eError = PVRSRV_ERROR_GENERIC;
-
- PVR_DBG_BREAK;
- return 0;
- }
-
- psRetOUT->eError =
- DevInitSGXPart2KM(psPerProc,
- hDevCookieInt, &psSGXDevInitPart2IN->sInitInfo);
-
- return 0;
-}
-
-static int SGXRegisterHWRenderContextBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT
- *psSGXRegHWRenderContextIN,
- struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT
- *psSGXRegHWRenderContextOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- void *hHWRenderContextInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT);
-
- NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc,
- 1);
-
- psSGXRegHWRenderContextOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXRegHWRenderContextIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psSGXRegHWRenderContextOUT->eError != PVRSRV_OK)
- return 0;
-
- hHWRenderContextInt =
- SGXRegisterHWRenderContextKM(hDevCookieInt,
- &psSGXRegHWRenderContextIN->
- sHWRenderContextDevVAddr, psPerProc);
-
- if (hHWRenderContextInt == NULL) {
- psSGXRegHWRenderContextOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
-
- PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &psSGXRegHWRenderContextOUT->hHWRenderContext,
- hHWRenderContextInt,
- PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
-
- COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError,
- psPerProc);
-
- return 0;
-}
-
-static int SGXUnregisterHWRenderContextBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT *
- psSGXUnregHWRenderContextIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hHWRenderContextInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hHWRenderContextInt,
- psSGXUnregHWRenderContextIN->hHWRenderContext,
- PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psSGXUnregHWRenderContextIN->hHWRenderContext,
- PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
-
- return 0;
-}
-
-static int SGXRegisterHWTransferContextBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT
- *psSGXRegHWTransferContextIN,
- struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT
- *psSGXRegHWTransferContextOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- void *hHWTransferContextInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT);
-
- NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
- psPerProc, 1);
-
- psSGXRegHWTransferContextOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXRegHWTransferContextIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psSGXRegHWTransferContextOUT->eError != PVRSRV_OK)
- return 0;
-
- hHWTransferContextInt =
- SGXRegisterHWTransferContextKM(hDevCookieInt,
- &psSGXRegHWTransferContextIN->
- sHWTransferContextDevVAddr,
- psPerProc);
-
- if (hHWTransferContextInt == NULL) {
- psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_GENERIC;
- return 0;
- }
-
- PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &psSGXRegHWTransferContextOUT->hHWTransferContext,
- hHWTransferContextInt,
- PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
-
- COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
- psPerProc);
-
- return 0;
-}
-
-static int SGXUnregisterHWTransferContextBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT
- *psSGXUnregHWTransferContextIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hHWTransferContextInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hHWTransferContextInt,
- psSGXUnregHWTransferContextIN->
- hHWTransferContext,
- PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- SGXUnregisterHWTransferContextKM(hHWTransferContextInt);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psSGXUnregHWTransferContextIN->
- hHWTransferContext,
- PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
-
- return 0;
-}
-
-
-static int SGXFlushHWRenderTargetBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET
- *psSGXFlushHWRenderTargetIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXFlushHWRenderTargetIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- SGXFlushHWRenderTargetKM(hDevCookieInt,
- psSGXFlushHWRenderTargetIN->
- sHWRTDataSetDevVAddr);
-
- return 0;
-}
-
-static int SGX2DQueryBlitsCompleteBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
- struct PVRSRV_BRIDGE_RETURN *psRetOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- void *pvSyncInfo;
- struct PVRSRV_SGXDEV_INFO *psDevInfo;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE);
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
- ps2DQueryBltsCompleteIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
- ps2DQueryBltsCompleteIN->hKernSyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO);
- if (psRetOUT->eError != PVRSRV_OK)
- return 0;
-
- psDevInfo = (struct PVRSRV_SGXDEV_INFO *)
- ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
-
- psRetOUT->eError = SGX2DQueryBlitsCompleteKM(psDevInfo,
- (struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo,
- ps2DQueryBltsCompleteIN->bWaitForComplete);
-
- return 0;
-}
-
-static int SGXFindSharedPBDescBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC
- *psSGXFindSharedPBDescIN,
- struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC
- *psSGXFindSharedPBDescOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
- struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
- struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
- struct PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = NULL;
- u32 ui32SharedPBDescSubKernelMemInfosCount = 0;
- u32 i;
- void *hSharedPBDesc = NULL;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC);
-
- NEW_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc,
- PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS
- + 4);
-
- psSGXFindSharedPBDescOUT->hSharedPBDesc = NULL;
-
- psSGXFindSharedPBDescOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXFindSharedPBDescIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
-
- psSGXFindSharedPBDescOUT->eError =
- SGXFindSharedPBDescKM(psPerProc, hDevCookieInt,
- psSGXFindSharedPBDescIN->bLockOnFailure,
- psSGXFindSharedPBDescIN->ui32TotalPBSize,
- &hSharedPBDesc,
- &psSharedPBDescKernelMemInfo,
- &psHWPBDescKernelMemInfo,
- &psBlockKernelMemInfo,
- &ppsSharedPBDescSubKernelMemInfos,
- &ui32SharedPBDescSubKernelMemInfosCount);
- if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
-
- PVR_ASSERT(ui32SharedPBDescSubKernelMemInfosCount
- <= PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
-
- psSGXFindSharedPBDescOUT->ui32SharedPBDescSubKernelMemInfoHandlesCount =
- ui32SharedPBDescSubKernelMemInfosCount;
-
- if (hSharedPBDesc == NULL) {
- psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle =
- NULL;
-
- goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
- }
-
- PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &psSGXFindSharedPBDescOUT->hSharedPBDesc,
- hSharedPBDesc,
- PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
-
- PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psSGXFindSharedPBDescOUT->
- hSharedPBDescKernelMemInfoHandle,
- psSharedPBDescKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
- psSGXFindSharedPBDescOUT->hSharedPBDesc);
-
- PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psSGXFindSharedPBDescOUT->
- hHWPBDescKernelMemInfoHandle,
- psHWPBDescKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
- psSGXFindSharedPBDescOUT->hSharedPBDesc);
-
- PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psSGXFindSharedPBDescOUT->
- hBlockKernelMemInfoHandle,
- psBlockKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
- psSGXFindSharedPBDescOUT->hSharedPBDesc);
-
- for (i = 0; i < ui32SharedPBDescSubKernelMemInfosCount; i++) {
- struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *
- psSGXFindSharedPBDescOut = psSGXFindSharedPBDescOUT;
-
- PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psSGXFindSharedPBDescOut->
- ahSharedPBDescSubKernelMemInfoHandles[i],
- ppsSharedPBDescSubKernelMemInfos[i],
- PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
- psSGXFindSharedPBDescOUT->
- hSharedPBDescKernelMemInfoHandle);
- }
-
-PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT:
- if (ppsSharedPBDescSubKernelMemInfos != NULL)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
- ui32SharedPBDescSubKernelMemInfosCount,
- ppsSharedPBDescSubKernelMemInfos, NULL);
-
- if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK) {
- if (hSharedPBDesc != NULL)
- SGXUnrefSharedPBDescKM(hSharedPBDesc);
- } else {
- COMMIT_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError,
- psPerProc);
- }
-
- return 0;
-}
-
-static int SGXUnrefSharedPBDescBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
- struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hSharedPBDesc;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC);
-
- psSGXUnrefSharedPBDescOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hSharedPBDesc,
- psSGXUnrefSharedPBDescIN->hSharedPBDesc,
- PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
- if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
- return 0;
-
- psSGXUnrefSharedPBDescOUT->eError =
- SGXUnrefSharedPBDescKM(hSharedPBDesc);
-
- if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
- return 0;
-
- psSGXUnrefSharedPBDescOUT->eError =
- PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psSGXUnrefSharedPBDescIN->hSharedPBDesc,
- PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
+ psRetOUT->eError = PDumpStopInitPhaseKM();
return 0;
}
-static int
-SGXAddSharedPBDescBW(u32 ui32BridgeID,
- struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
- struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- void *hDevCookieInt;
- struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
- struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
- struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
- u32 ui32KernelMemInfoHandlesCount =
- psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount;
- int ret = 0;
- void **phKernelMemInfoHandles = NULL;
- struct PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = NULL;
- u32 i;
- enum PVRSRV_ERROR eError;
- void *hSharedPBDesc = NULL;
-
- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
- PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC);
-
- NEW_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc,
- 1);
-
- psSGXAddSharedPBDescOUT->hSharedPBDesc = NULL;
-
- PVR_ASSERT(ui32KernelMemInfoHandlesCount
- <= PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- &hDevCookieInt,
- psSGXAddSharedPBDescIN->hDevCookie,
- PVRSRV_HANDLE_TYPE_DEV_NODE);
- if (eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- (void **) &psSharedPBDescKernelMemInfo,
- psSGXAddSharedPBDescIN->
- hSharedPBDescKernelMemInfo,
- PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
- if (eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- (void **) &psHWPBDescKernelMemInfo,
- psSGXAddSharedPBDescIN->
- hHWPBDescKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- if (eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
-
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- (void **) &psBlockKernelMemInfo,
- psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
- PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
- if (eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
-
- if (!OSAccessOK(PVR_VERIFY_READ,
- psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
- ui32KernelMemInfoHandlesCount * sizeof(void *))) {
- PVR_DPF(PVR_DBG_ERROR, "%s: PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:"
- " Invalid phKernelMemInfos pointer", __func__);
- ret = -EFAULT;
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
- }
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32KernelMemInfoHandlesCount * sizeof(void *),
- (void **)&phKernelMemInfoHandles, NULL) != PVRSRV_OK) {
- ret = -ENOMEM;
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
- }
-
- if (CopyFromUserWrapper(psPerProc,
- ui32BridgeID,
- phKernelMemInfoHandles,
- psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
- ui32KernelMemInfoHandlesCount *
- sizeof(void *))
- != PVRSRV_OK) {
- ret = -EFAULT;
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
- }
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32KernelMemInfoHandlesCount *
- sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
- (void **) &ppsKernelMemInfos, NULL) != PVRSRV_OK) {
- ret = -ENOMEM;
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
- }
-
- for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
- eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
- (void **) &
- ppsKernelMemInfos[i],
- phKernelMemInfoHandles[i],
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- if (eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
- }
-
- eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psSGXAddSharedPBDescIN->
- hSharedPBDescKernelMemInfo,
- PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
- PVR_ASSERT(eError == PVRSRV_OK);
-
- eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psSGXAddSharedPBDescIN->
- hHWPBDescKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- PVR_ASSERT(eError == PVRSRV_OK);
-
- eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
- psSGXAddSharedPBDescIN->
- hBlockKernelMemInfo,
- PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
- PVR_ASSERT(eError == PVRSRV_OK);
-
- for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
- eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
- phKernelMemInfoHandles[i],
- PVRSRV_HANDLE_TYPE_MEM_INFO);
- PVR_ASSERT(eError == PVRSRV_OK);
- }
-
- eError = SGXAddSharedPBDescKM(psPerProc, hDevCookieInt,
- psSharedPBDescKernelMemInfo,
- psHWPBDescKernelMemInfo,
- psBlockKernelMemInfo,
- psSGXAddSharedPBDescIN->ui32TotalPBSize,
- &hSharedPBDesc,
- ppsKernelMemInfos,
- ui32KernelMemInfoHandlesCount);
-
- if (eError != PVRSRV_OK)
- goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
-
- PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &psSGXAddSharedPBDescOUT->hSharedPBDesc,
- hSharedPBDesc,
- PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
-
-PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT:
-
- if (phKernelMemInfoHandles)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
- * sizeof(void *),
- (void *)phKernelMemInfoHandles, NULL);
- if (ppsKernelMemInfos)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
- * sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
- (void *)ppsKernelMemInfos, NULL);
-
- if (ret == 0 && eError == PVRSRV_OK)
- COMMIT_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError,
- psPerProc);
-
- psSGXAddSharedPBDescOUT->eError = eError;
-
- return ret;
-}
-
+#endif
static int PVRSRVGetMiscInfoBW(u32 ui32BridgeID,
struct PVRSRV_BRIDGE_IN_GET_MISC_INFO *psGetMiscInfoIN,
OSMemCopy(&psGetMiscInfoOUT->sMiscInfo, &psGetMiscInfoIN->sMiscInfo,
sizeof(struct PVRSRV_MISC_INFO));
- if (psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
- PVRSRV_MISC_INFO_MEMSTATS_PRESENT) {
+ if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
+ PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) &&
+ ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
+ PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0)) {
+
+ psGetMiscInfoOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
+ return 0;
+ }
- ASSIGN_AND_EXIT_ON_ERROR(psGetMiscInfoOUT->eError,
- OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
+ PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) ||
+ ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
+ PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0)) {
+
+ ASSIGN_AND_EXIT_ON_ERROR(
+ psGetMiscInfoOUT->eError,
+ OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen,
(void **)&psGetMiscInfoOUT->sMiscInfo.pszMemoryStr,
NULL));
- psGetMiscInfoOUT->eError = PVRSRVGetMiscInfoKM(
- (struct PVRSRV_MISC_INFO __force *)
- &psGetMiscInfoOUT->sMiscInfo);
+ psGetMiscInfoOUT->eError =
+ PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo);
eError = CopyToUserWrapper(psPerProc, ui32BridgeID,
(void __force __user *)
NULL);
psGetMiscInfoOUT->sMiscInfo.pszMemoryStr =
- psGetMiscInfoIN->sMiscInfo.pszMemoryStr;
+ psGetMiscInfoIN->sMiscInfo.pszMemoryStr;
if (eError != PVRSRV_OK) {
-
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVGetMiscInfoBW Error copy to user");
return -EFAULT;
}
} else {
psGetMiscInfoOUT->eError =
- PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo);
+ PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo);
}
- if (psGetMiscInfoIN->sMiscInfo.
- ui32StateRequest & PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT)
+ if (psGetMiscInfoOUT->eError != PVRSRV_OK)
+ return 0;
+ if (psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
+ PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) {
psGetMiscInfoOUT->eError =
PVRSRVAllocHandle(psPerProc->psHandleBase,
&psGetMiscInfoOUT->sMiscInfo.
- sGlobalEventObject.hOSEventKM,
+ sGlobalEventObject.hOSEventKM,
psGetMiscInfoOUT->sMiscInfo.
- sGlobalEventObject.hOSEventKM,
+ sGlobalEventObject.hOSEventKM,
PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
+ if (psGetMiscInfoOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psGetMiscInfoOUT->sMiscInfo.hSOCTimerRegisterOSMemHandle) {
+ psGetMiscInfoOUT->eError =
+ PVRSRVAllocHandle(psPerProc->psHandleBase,
+ &psGetMiscInfoOUT->sMiscInfo.
+ hSOCTimerRegisterOSMemHandle,
+ psGetMiscInfoOUT->sMiscInfo.
+ hSOCTimerRegisterOSMemHandle,
+ PVRSRV_HANDLE_TYPE_SOC_TIMER,
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
+
+ if (psGetMiscInfoOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
return 0;
}
-static int PVRSRVConnectBW(u32 ui32BridgeID,
- void *psBridgeIn,
+static int PVRSRVConnectBW(u32 ui32BridgeID, void *psBridgeIn,
struct PVRSRV_BRIDGE_OUT_CONNECT_SERVICES *psConnectServicesOUT,
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
psConnectServicesOUT->hKernelServices = psPerProc->hPerProcData;
psConnectServicesOUT->eError = PVRSRV_OK;
+#if defined(PDUMP)
+
+ {
+ struct SYS_DATA *psSysData;
+ SysAcquireData(&psSysData);
+ psSysData->bPowerUpPDumped = IMG_FALSE;
+ }
+#endif
+
return 0;
}
-static int PVRSRVDisconnectBW(u32 ui32BridgeID,
- void *psBridgeIn,
+static int PVRSRVDisconnectBW(u32 ui32BridgeID, void *psBridgeIn,
struct PVRSRV_BRIDGE_RETURN *psRetOUT,
struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
if (psOpenDispClassDeviceOUT->eError != PVRSRV_OK)
return 0;
- psOpenDispClassDeviceOUT->eError =
- PVRSRVOpenDCDeviceKM(psPerProc,
+ psOpenDispClassDeviceOUT->eError = PVRSRVOpenDCDeviceKM(psPerProc,
psOpenDispClassDeviceIN->ui32DeviceID,
hDevCookieInt, &hDispClassInfoInt);
psCreateDispClassSwapChainOUT->eError =
PVRSRVCreateDCSwapChainKM(psPerProc, pvDispClassInfo,
- psCreateDispClassSwapChainIN->ui32Flags,
- &psCreateDispClassSwapChainIN->
- sDstSurfAttrib,
- &psCreateDispClassSwapChainIN->
- sSrcSurfAttrib,
- psCreateDispClassSwapChainIN->
- ui32BufferCount,
- psCreateDispClassSwapChainIN->
- ui32OEMFlags, &hSwapChainInt,
- &psCreateDispClassSwapChainOUT->
- ui32SwapChainID);
+ psCreateDispClassSwapChainIN->ui32Flags,
+ &psCreateDispClassSwapChainIN->sDstSurfAttrib,
+ &psCreateDispClassSwapChainIN->sSrcSurfAttrib,
+ psCreateDispClassSwapChainIN->ui32BufferCount,
+ psCreateDispClassSwapChainIN->ui32OEMFlags,
+ &hSwapChainInt,
+ &psCreateDispClassSwapChainOUT->ui32SwapChainID);
if (psCreateDispClassSwapChainOUT->eError != PVRSRV_OK)
return 0;
void *hBufferExt;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &hBufferExt,
- psGetDispClassBuffersOUT->ahBuffer[i],
- PVRSRV_HANDLE_TYPE_DISP_BUFFER,
- (enum PVRSRV_HANDLE_ALLOC_FLAG)
+ &hBufferExt,
+ psGetDispClassBuffersOUT->ahBuffer[i],
+ PVRSRV_HANDLE_TYPE_DISP_BUFFER,
+ (enum PVRSRV_HANDLE_ALLOC_FLAG)
(PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE |
PVRSRV_HANDLE_ALLOC_FLAG_SHARED),
- psGetDispClassBuffersIN->hSwapChain);
+ psGetDispClassBuffersIN->hSwapChain);
psGetDispClassBuffersOUT->ahBuffer[i] = hBufferExt;
}
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER);
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
- &pvDispClassInfo,
- psSwapDispClassBufferIN->hDeviceKM,
- PVRSRV_HANDLE_TYPE_DISP_INFO);
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &pvDispClassInfo,
+ psSwapDispClassBufferIN->hDeviceKM,
+ PVRSRV_HANDLE_TYPE_DISP_INFO);
if (psRetOUT->eError != PVRSRV_OK)
return 0;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE);
- psRetOUT->eError =
- PVRSRVLookupHandle(psPerProc->psHandleBase,
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&pvBufClassInfo,
psCloseBufferClassDeviceIN->hDeviceKM,
PVRSRV_HANDLE_TYPE_BUF_INFO);
hBufferInt,
PVRSRV_HANDLE_TYPE_BUF_BUFFER,
(enum PVRSRV_HANDLE_ALLOC_FLAG)
- (PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE |
- PVRSRV_HANDLE_ALLOC_FLAG_SHARED),
+ (PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE |
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED),
psGetBufferClassBufferIN->hDeviceKM);
COMMIT_HANDLE_BATCH_OR_ERROR(psGetBufferClassBufferOUT->eError,
OSMemSet(&psAllocSharedSysMemOUT->sClientMemInfo,
0, sizeof(psAllocSharedSysMemOUT->sClientMemInfo));
- if (psKernelMemInfo->pvLinAddrKM)
- psAllocSharedSysMemOUT->sClientMemInfo.pvLinAddrKM =
+ psAllocSharedSysMemOUT->sClientMemInfo.pvLinAddrKM =
psKernelMemInfo->pvLinAddrKM;
- else
- psAllocSharedSysMemOUT->sClientMemInfo.pvLinAddrKM =
- psKernelMemInfo->sMemBlk.hOSMemHandle;
+
psAllocSharedSysMemOUT->sClientMemInfo.pvLinAddr = NULL;
psAllocSharedSysMemOUT->sClientMemInfo.ui32Flags =
- psKernelMemInfo->ui32Flags;
+ psKernelMemInfo->ui32Flags;
psAllocSharedSysMemOUT->sClientMemInfo.ui32AllocSize =
- psKernelMemInfo->ui32AllocSize;
+ psKernelMemInfo->ui32AllocSize;
psAllocSharedSysMemOUT->sClientMemInfo.hMappingInfo =
- psKernelMemInfo->sMemBlk.hOSMemHandle;
+ psKernelMemInfo->sMemBlk.hOSMemHandle;
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
- &psAllocSharedSysMemOUT->sClientMemInfo.
- hKernelMemInfo, psKernelMemInfo,
- PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
+ &psAllocSharedSysMemOUT->sClientMemInfo.hKernelMemInfo,
+ psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE);
COMMIT_HANDLE_BATCH_OR_ERROR(psAllocSharedSysMemOUT->eError, psPerProc);
psFreeSharedSysMemOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
- (void **) &psKernelMemInfo,
+ (void **)&psKernelMemInfo,
psFreeSharedSysMemIN->psKernelMemInfo,
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
psMapMemInfoMemOUT->eError =
PVRSRVLookupHandleAnyType(psPerProc->psHandleBase,
- (void **) &psKernelMemInfo,
- &eHandleType,
+ (void **)&psKernelMemInfo, &eHandleType,
psMapMemInfoMemIN->hKernelMemInfo);
if (psMapMemInfoMemOUT->eError != PVRSRV_OK)
return 0;
}
psMapMemInfoMemOUT->eError =
- PVRSRVGetParentHandle(psPerProc->psHandleBase,
- &hParent,
+ PVRSRVGetParentHandle(psPerProc->psHandleBase, &hParent,
psMapMemInfoMemIN->hKernelMemInfo,
eHandleType);
if (psMapMemInfoMemOUT->eError != PVRSRV_OK)
OSMemSet(&psMapMemInfoMemOUT->sClientMemInfo,
0, sizeof(psMapMemInfoMemOUT->sClientMemInfo));
- if (psKernelMemInfo->pvLinAddrKM)
- psMapMemInfoMemOUT->sClientMemInfo.pvLinAddrKM =
- psKernelMemInfo->pvLinAddrKM;
- else
- psMapMemInfoMemOUT->sClientMemInfo.pvLinAddrKM =
- psKernelMemInfo->sMemBlk.hOSMemHandle;
+ psMapMemInfoMemOUT->sClientMemInfo.pvLinAddrKM =
+ psKernelMemInfo->pvLinAddrKM;
psMapMemInfoMemOUT->sClientMemInfo.pvLinAddr = NULL;
psMapMemInfoMemOUT->sClientMemInfo.sDevVAddr =
- psKernelMemInfo->sDevVAddr;
+ psKernelMemInfo->sDevVAddr;
psMapMemInfoMemOUT->sClientMemInfo.ui32Flags =
- psKernelMemInfo->ui32Flags;
+ psKernelMemInfo->ui32Flags;
psMapMemInfoMemOUT->sClientMemInfo.ui32AllocSize =
- psKernelMemInfo->ui32AllocSize;
+ psKernelMemInfo->ui32AllocSize;
psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo =
- psKernelMemInfo->sMemBlk.hOSMemHandle;
+ psKernelMemInfo->sMemBlk.hOSMemHandle;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psMapMemInfoMemOUT->sClientMemInfo.
- hKernelMemInfo, psKernelMemInfo,
- PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI, hParent);
+ &psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo,
+ psKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI, hParent);
if (psKernelMemInfo->ui32Flags & PVRSRV_MEM_NO_SYNCOBJ) {
-
- OSMemSet(&psMapMemInfoMemOUT->sClientSyncInfo,
- 0, sizeof(struct PVRSRV_CLIENT_SYNC_INFO));
+ OSMemSet(&psMapMemInfoMemOUT->sClientSyncInfo, 0,
+ sizeof(struct PVRSRV_CLIENT_SYNC_INFO));
psMapMemInfoMemOUT->psKernelSyncInfo = NULL;
} else {
-
psMapMemInfoMemOUT->sClientSyncInfo.psSyncData =
psKernelMemInfo->psKernelSyncInfo->psSyncData;
psMapMemInfoMemOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
psKernelMemInfo->psKernelSyncInfo->
- sWriteOpsCompleteDevVAddr;
+ sWriteOpsCompleteDevVAddr;
psMapMemInfoMemOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
psKernelMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
psMapMemInfoMemOUT->sClientSyncInfo.hMappingInfo =
psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->
- sMemBlk.hOSMemHandle;
+ sMemBlk.hOSMemHandle;
psMapMemInfoMemOUT->sClientMemInfo.psClientSyncInfo =
&psMapMemInfoMemOUT->sClientSyncInfo;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
- &psMapMemInfoMemOUT->sClientSyncInfo.
- hKernelSyncInfo,
- psKernelMemInfo->psKernelSyncInfo,
- PVRSRV_HANDLE_TYPE_SYNC_INFO,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
- psMapMemInfoMemOUT->sClientMemInfo.
- hKernelMemInfo);
+ &psMapMemInfoMemOUT->sClientSyncInfo.hKernelSyncInfo,
+ psKernelMemInfo->psKernelSyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
+ psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo);
}
COMMIT_HANDLE_BATCH_OR_ERROR(psMapMemInfoMemOUT->eError, psPerProc);
return 0;
}
+static int PVRSRVModifySyncOpsBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_MODIFY_SYNC_OPS *psModifySyncOpsIN,
+ struct PVRSRV_BRIDGE_OUT_MODIFY_SYNC_OPS *psModifySyncOpsOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hKernelSyncInfo;
+ struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_MODIFY_SYNC_OPS);
+
+ psModifySyncOpsOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hKernelSyncInfo,
+ psModifySyncOpsIN->hKernelSyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psModifySyncOpsOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psKernelSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)hKernelSyncInfo;
+
+ /* We return PRE-INCREMENTED versions of all sync Op Values */
+
+ psModifySyncOpsOUT->ui32ReadOpsPending =
+ psKernelSyncInfo->psSyncData->ui32ReadOpsPending;
+
+ psModifySyncOpsOUT->ui32WriteOpsPending =
+ psKernelSyncInfo->psSyncData->ui32WriteOpsPending;
+
+ psModifySyncOpsOUT->ui32ReadOpsComplete =
+ psKernelSyncInfo->psSyncData->ui32ReadOpsComplete;
+
+ psModifySyncOpsOUT->ui32WriteOpsComplete =
+ psKernelSyncInfo->psSyncData->ui32WriteOpsComplete;
+
+ if (psModifySyncOpsIN->ui32ModifyFlags &
+ PVRSRV_MODIFYSYNCOPS_FLAGS_WOP_INC)
+ psKernelSyncInfo->psSyncData->ui32WriteOpsPending++;
+
+ if (psModifySyncOpsIN->ui32ModifyFlags &
+ PVRSRV_MODIFYSYNCOPS_FLAGS_ROP_INC)
+ psKernelSyncInfo->psSyncData->ui32ReadOpsPending++;
+
+ if (psModifySyncOpsIN->ui32ModifyFlags &
+ PVRSRV_MODIFYSYNCOPS_FLAGS_WOC_INC)
+ psKernelSyncInfo->psSyncData->ui32WriteOpsComplete++;
+
+ if (psModifySyncOpsIN->ui32ModifyFlags &
+ PVRSRV_MODIFYSYNCOPS_FLAGS_ROC_INC)
+ psKernelSyncInfo->psSyncData->ui32ReadOpsComplete++;
+
+ return 0;
+}
+
static int MMU_GetPDDevPAddrBW(u32 ui32BridgeID,
struct PVRSRV_BRIDGE_IN_GETMMU_PD_DEVPADDR *psGetMmuPDDevPAddrIN,
struct PVRSRV_BRIDGE_OUT_GETMMU_PD_DEVPADDR *psGetMmuPDDevPAddrOUT,
return 0;
psGetMmuPDDevPAddrOUT->sPDDevPAddr =
- MMU_GetPDDevPAddr(BM_GetMMUContextFromMemContext
+ BM_GetDeviceNode(hDevMemContextInt)->
+ pfnMMUGetPDDevPAddr(BM_GetMMUContextFromMemContext
(hDevMemContextInt));
if (psGetMmuPDDevPAddrOUT->sPDDevPAddr.uiAddr)
psGetMmuPDDevPAddrOUT->eError = PVRSRV_OK;
return 0;
}
-static int DummyBW(u32 ui32BridgeID, void *psBridgeIn,
- void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+int DummyBW(u32 ui32BridgeID, void *psBridgeIn, void *psBridgeOut,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
#if !defined(DEBUG)
PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
return -ENOTTY;
}
-#define SetDispatchTableEntry(ui32Index, pfFunction) \
- _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, \
- (int (*)(u32 ui32BridgeID, void *psBridgeIn, \
- void *psBridgeOut, \
- struct PVRSRV_PER_PROCESS_DATA *psPerProc))\
- pfFunction, #pfFunction)
+void _SetDispatchTableEntry(u32 ui32Index, const char *pszIOCName,
+ int (*pfFunction)(u32 ui32BridgeID,
+ void *psBridgeIn,
+ void *psBridgeOut,
+ struct PVRSRV_PER_PROCESS_DATA
+ *psPerProc),
+ const char *pszFunctionName)
+{
+ static u32 ui32PrevIndex = ~0UL;
+#if !defined(DEBUG)
+ PVR_UNREFERENCED_PARAMETER(pszIOCName);
+#endif
+#if !defined(DEBUG_BRIDGE_KM_DISPATCH_TABLE) && !defined(DEBUG_BRIDGE_KM)
+ PVR_UNREFERENCED_PARAMETER(pszFunctionName);
+#endif
+
+
+ if (g_BridgeDispatchTable[ui32Index].pfFunction) {
+#if defined(DEBUG_BRIDGE_KM)
+ PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
+ "Adding dispatch table entry for %s "
+ "clobbers an existing entry for %s",
+ __func__, pszIOCName,
+ g_BridgeDispatchTable[ui32Index].pszIOCName);
+#else
+ PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
+ "Adding dispatch table entry for %s "
+ "clobbers an existing entry (index=%lu)",
+ __func__, pszIOCName, ui32Index);
+#endif
+ PVR_DPF(PVR_DBG_ERROR,
+"NOTE: Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE may help debug this issue.",
+ __func__);
+ }
+
+ if ((ui32PrevIndex != ~0UL) &&
+ ((ui32Index >= ui32PrevIndex + DISPATCH_TABLE_GAP_THRESHOLD) ||
+ (ui32Index <= ui32PrevIndex))) {
+#if defined(DEBUG_BRIDGE_KM)
+ PVR_DPF(PVR_DBG_WARNING,
+ "%s: There is a gap in the dispatch table "
+ "between indices %lu (%s) and %lu (%s)",
+ __func__, ui32PrevIndex,
+ g_BridgeDispatchTable[ui32PrevIndex].pszIOCName,
+ ui32Index, pszIOCName);
+#else
+ PVR_DPF(PVR_DBG_WARNING,
+ "%s: There is a gap in the dispatch table "
+ "between indices %u and %u (%s)",
+ __func__, (unsigned)ui32PrevIndex, (unsigned)ui32Index,
+ pszIOCName);
+#endif
+ PVR_DPF(PVR_DBG_ERROR,
+ "NOTE: Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE "
+ "may help debug this issue.",
+ __func__);
+ }
+
+ g_BridgeDispatchTable[ui32Index].pfFunction = pfFunction;
+#if defined(DEBUG_BRIDGE_KM)
+ g_BridgeDispatchTable[ui32Index].pszIOCName = pszIOCName;
+ g_BridgeDispatchTable[ui32Index].pszFunctionName = pszFunctionName;
+ g_BridgeDispatchTable[ui32Index].ui32CallCount = 0;
+ g_BridgeDispatchTable[ui32Index].ui32CopyFromUserTotalBytes = 0;
+#endif
+
+ ui32PrevIndex = ui32Index;
+}
+
+static int PVRSRVInitSrvConnectBW(u32 ui32BridgeID, void *psBridgeIn,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ PVR_UNREFERENCED_PARAMETER(psBridgeIn);
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_INITSRV_CONNECT);
+ PVR_UNREFERENCED_PARAMETER(psBridgeIn);
+
+ if (!OSProcHasPrivSrvInit() ||
+ PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RUNNING) ||
+ PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RAN)) {
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RUNNING, IMG_TRUE);
+ psPerProc->bInitProcess = IMG_TRUE;
+
+ psRetOUT->eError = PVRSRV_OK;
+
+ return 0;
+}
+
+static int PVRSRVInitSrvDisconnectBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_INITSRV_DISCONNECT *psInitSrvDisconnectIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_INITSRV_DISCONNECT);
+
+ if (!psPerProc->bInitProcess) {
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ psPerProc->bInitProcess = IMG_FALSE;
+
+ PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RUNNING, IMG_FALSE);
+ PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RAN, IMG_TRUE);
+
+ psRetOUT->eError =
+ PVRSRVFinaliseSystem(psInitSrvDisconnectIN->bInitSuccesful);
+
+ PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL,
+ (IMG_BOOL)(((psRetOUT->eError == PVRSRV_OK) &&
+ (psInitSrvDisconnectIN->
+ bInitSuccesful))));
+
+ return 0;
+}
+
+static int PVRSRVEventObjectWaitBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_WAIT *psEventObjectWaitIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hOSEventKM;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_WAIT);
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hOSEventKM,
+ psEventObjectWaitIN->hOSEventKM,
+ PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError = OSEventObjectWait(hOSEventKM);
+
+ return 0;
+}
+
+static int PVRSRVEventObjectOpenBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN *psEventObjectOpenIN,
+ struct PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN *psEventObjectOpenOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_OPEN);
+
+ NEW_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc, 1);
+
+ psEventObjectOpenOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psEventObjectOpenIN->sEventObject.hOSEventKM,
+ psEventObjectOpenIN->sEventObject.hOSEventKM,
+ PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT);
+
+ if (psEventObjectOpenOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psEventObjectOpenOUT->eError =
+ OSEventObjectOpen(&psEventObjectOpenIN->sEventObject,
+ &psEventObjectOpenOUT->hOSEvent);
+
+ if (psEventObjectOpenOUT->eError != PVRSRV_OK)
+ return 0;
+
+ PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+ &psEventObjectOpenOUT->hOSEvent,
+ psEventObjectOpenOUT->hOSEvent,
+ PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI);
+
+ COMMIT_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc);
-#define DISPATCH_TABLE_GAP_THRESHOLD 5
+ return 0;
+}
-static void _SetDispatchTableEntry(u32 ui32Index, const char *pszIOCName,
- int (*pfFunction)(u32 ui32BridgeID, void *psBridgeIn,
- void *psBridgeOut,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc),
- const char *pszFunctionName)
+static int PVRSRVEventObjectCloseBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE *psEventObjectCloseIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
{
- static u32 ui32PrevIndex = ~0UL;
-#if !defined(DEBUG)
- PVR_UNREFERENCED_PARAMETER(pszIOCName);
-#endif
-#if !defined(DEBUG_BRIDGE_KM_DISPATCH_TABLE) && !defined(DEBUG_BRIDGE_KM)
- PVR_UNREFERENCED_PARAMETER(pszFunctionName);
-#endif
+ void *hOSEventKM;
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE);
- if (g_BridgeDispatchTable[ui32Index].pfFunction) {
-#if defined(DEBUG_BRIDGE_KM)
- PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
- "Adding dispatch table entry for %s "
- "clobbers an existing entry for %s",
- __func__, pszIOCName,
- g_BridgeDispatchTable[ui32Index].pszIOCName);
-#else
- PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
- "Adding dispatch table entry for %s "
- "clobbers an existing entry (index=%lu)",
- __func__, pszIOCName, ui32Index);
-#endif
- PVR_DPF(PVR_DBG_ERROR, "NOTE: "
- "Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE "
- "may help debug this issue.",
- __func__);
- }
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psEventObjectCloseIN->sEventObject.hOSEventKM,
+ psEventObjectCloseIN->sEventObject.hOSEventKM,
+ PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
- if ((ui32PrevIndex != ~0UL) &&
- ((ui32Index >= ui32PrevIndex + DISPATCH_TABLE_GAP_THRESHOLD) ||
- (ui32Index <= ui32PrevIndex))) {
-#if defined(DEBUG_BRIDGE_KM)
- PVR_DPF(PVR_DBG_WARNING,
- "%s: There is a gap in the dispatch table "
- "between indices %lu (%s) and %lu (%s)",
- __func__, ui32PrevIndex,
- g_BridgeDispatchTable[ui32PrevIndex].pszIOCName,
- ui32Index, pszIOCName);
-#else
- PVR_DPF(PVR_DBG_WARNING,
- "%s: There is a gap in the dispatch table "
- "between indices %lu and %lu (%s)",
- __func__, ui32PrevIndex, ui32Index, pszIOCName);
-#endif
- PVR_DPF(PVR_DBG_ERROR, "NOTE: "
- "Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE "
- "may help debug this issue.",
- __func__);
- }
+ psRetOUT->eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &hOSEventKM,
+ psEventObjectCloseIN->hOSEventKM,
+ PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT);
- g_BridgeDispatchTable[ui32Index].pfFunction = pfFunction;
-#if defined(DEBUG_BRIDGE_KM)
- g_BridgeDispatchTable[ui32Index].pszIOCName = pszIOCName;
- g_BridgeDispatchTable[ui32Index].pszFunctionName = pszFunctionName;
- g_BridgeDispatchTable[ui32Index].ui32CallCount = 0;
- g_BridgeDispatchTable[ui32Index].ui32CopyFromUserTotalBytes = 0;
-#endif
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
- ui32PrevIndex = ui32Index;
+ psRetOUT->eError =
+ OSEventObjectClose(&psEventObjectCloseIN->sEventObject, hOSEventKM);
+
+ return 0;
}
enum PVRSRV_ERROR CommonBridgeInit(void)
PVRSRVGetFreeDeviceMemBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_CREATE_COMMANDQUEUE, DummyBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_DESTROY_COMMANDQUEUE, DummyBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_KV_TO_MMAP_DATA,
- PVRMMapKVIndexAddressToMMapDataBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA,
+ PVRMMapOSMemHandleToMMapDataBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_CONNECT_SERVICES, PVRSRVConnectBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_DISCONNECT_SERVICES,
PVRSRVDisconnectBW);
PVRSRVUnmapDeviceClassMemoryBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER, DummyBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER, DummyBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_EXPORT_DEVICEMEM,
+ PVRSRVExportDeviceMemBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_RELEASE_MMAP_DATA,
+ PVRMMapReleaseMMapDataBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_CACHE_FLUSH_DRM,
PVRSRVCacheFlushDRIBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_PDREG, PDumpPDRegBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR,
PDumpPDDevPAddrBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_BUFFER_ARRAY,
- PDumpBufferArrayBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ,
PDumpCycleCountRegReadBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_3D_SIGNATURE_REGISTERS,
- PDump3DSignatureRegistersBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_COUNTER_REGISTERS,
- PDumpCounterRegistersBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_TA_SIGNATURE_REGISTERS,
- PDumpTASignatureRegistersBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_STARTINITPHASE,
+ PDumpStartInitPhaseBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_STOPINITPHASE,
+ PDumpStopInitPhaseBW);
#endif
SetDispatchTableEntry(PVRSRV_BRIDGE_GET_OEMJTABLE, DummyBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE,
PVRSRVEventObjectCloseBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_MODIFY_SYNC_OPS,
+ PVRSRVModifySyncOpsBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETCLIENTINFO,
- SGXGetClientInfoBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO,
- SGXReleaseClientInfoBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO,
- SGXGetInternalDevInfoBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DOKICK, SGXDoKickBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR, DummyBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READREGISTRYDWORD, DummyBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULECOMMAND, DummyBW);
-
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE,
- SGX2DQueryBlitsCompleteBW);
-
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMMUPDADDR, DummyBW);
-
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMITTRANSFER,
- SGXSubmitTransferBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMISCINFO, SGXGetMiscInfoBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT,
- SGXGetInfoForSrvinitBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DEVINITPART2,
- SGXDevInitPart2BW);
-
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC,
- SGXFindSharedPBDescBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC,
- SGXUnrefSharedPBDescBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC,
- SGXAddSharedPBDescBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT,
- SGXRegisterHWRenderContextBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET,
- SGXFlushHWRenderTargetBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT,
- SGXUnregisterHWRenderContextBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT,
- SGXRegisterHWTransferContextBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT,
- SGXUnregisterHWTransferContextBW);
- SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS,
- SGXReadDiffCountersBW);
+ SetSGXDispatchTableEntry();
for (i = 0; i < BRIDGE_DISPATCH_TABLE_ENTRY_COUNT; i++)
if (!g_BridgeDispatchTable[i].pfFunction) {
g_BridgeDispatchTable[i].pfFunction = DummyBW;
#if defined(DEBUG_BRIDGE_KM)
g_BridgeDispatchTable[i].pszIOCName =
- "_PVRSRV_BRIDGE_DUMMY";
+ "_PVRSRV_BRIDGE_DUMMY";
g_BridgeDispatchTable[i].pszFunctionName = "DummyBW";
g_BridgeDispatchTable[i].ui32CallCount = 0;
g_BridgeDispatchTable[i].ui32CopyFromUserTotalBytes = 0;
return PVRSRV_OK;
}
-int BridgedDispatchKM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
- struct PVRSRV_BRIDGE_PACKAGE *psBridgePackageKM)
+static int bridged_check_cmd(u32 cmd_id)
{
-
- void *psBridgeIn;
- void *psBridgeOut;
- int (*pfBridgeHandler)(u32 ui32BridgeID,
- void *psBridgeIn,
- void *psBridgeOut,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc);
- u32 ui32BridgeID = psBridgePackageKM->ui32BridgeID;
- int err = -EFAULT;
-
-#if defined(DEBUG_BRIDGE_KM)
- g_BridgeDispatchTable[ui32BridgeID].ui32CallCount++;
- g_BridgeGlobalStats.ui32IOCTLCount++;
-#endif
- if (!psPerProc->bInitProcess) {
- if (PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RAN)) {
- if (!PVRSRVGetInitServerState
- (PVRSRV_INIT_SERVER_SUCCESSFUL)) {
- PVR_DPF(PVR_DBG_ERROR,
- "%s: Initialisation failed. "
- "Driver unusable.",
- __func__);
- goto return_fault;
- }
+ if (PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RAN)) {
+ if (!PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL)) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Initialisation failed. Driver unusable.",
+ __func__);
+ return 1;
+ }
+ } else {
+ if (PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RUNNING)) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Initialisation is in progress",
+ __func__);
+ return 1;
} else {
- if (PVRSRVGetInitServerState
- (PVRSRV_INIT_SERVER_RUNNING)) {
+ switch (cmd_id) {
+ case PVRSRV_GET_BRIDGE_ID(
+ PVRSRV_BRIDGE_CONNECT_SERVICES):
+ case PVRSRV_GET_BRIDGE_ID(
+ PVRSRV_BRIDGE_DISCONNECT_SERVICES):
+ case PVRSRV_GET_BRIDGE_ID(
+ PVRSRV_BRIDGE_INITSRV_CONNECT):
+ case PVRSRV_GET_BRIDGE_ID(
+ PVRSRV_BRIDGE_INITSRV_DISCONNECT):
+ break;
+ default:
PVR_DPF(PVR_DBG_ERROR,
- "%s: Initialisation is in progress",
+ "%s: Driver initialisation not completed yet.",
__func__);
- goto return_fault;
- } else {
- switch (ui32BridgeID) {
- case PVRSRV_GET_BRIDGE_ID(
- PVRSRV_BRIDGE_CONNECT_SERVICES):
- case PVRSRV_GET_BRIDGE_ID(
- PVRSRV_BRIDGE_DISCONNECT_SERVICES):
- case PVRSRV_GET_BRIDGE_ID(
- PVRSRV_BRIDGE_INITSRV_CONNECT):
- case PVRSRV_GET_BRIDGE_ID(
- PVRSRV_BRIDGE_INITSRV_DISCONNECT):
- break;
- default:
- PVR_DPF(PVR_DBG_ERROR,
- "%s: Driver initialisation "
- "not completed yet.",
- __func__);
- goto return_fault;
- }
+ return 1;
}
}
}
- {
- struct SYS_DATA *psSysData;
+ return 0;
+}
- if (SysAcquireData(&psSysData) != PVRSRV_OK)
- goto return_fault;
+static int bridged_ioctl(u32 cmd, void *in, void *out,
+ struct PVRSRV_PER_PROCESS_DATA *per_proc)
+{
+ int err = -EFAULT;
- psBridgeIn = ((struct ENV_DATA *)
- psSysData->pvEnvSpecificData)->pvBridgeData;
- psBridgeOut = (void *)((u8 *)psBridgeIn +
- PVRSRV_MAX_BRIDGE_IN_SIZE);
+ switch (PVRSRV_IOWR(cmd)) {
+ case PVRSRV_BRIDGE_ENUM_DEVICES:
+ err = PVRSRVEnumerateDevicesBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO:
+ err = PVRSRVAcquireDeviceDataBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_RELEASE_DEVICEINFO:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_CREATE_DEVMEMCONTEXT:
+ err = PVRSRVCreateDeviceMemContextBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_DESTROY_DEVMEMCONTEXT:
+ err = PVRSRVDestroyDeviceMemContextBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO:
+ err = PVRSRVGetDeviceMemHeapInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_ALLOC_DEVICEMEM:
+ err = PVRSRVAllocDeviceMemBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_FREE_DEVICEMEM:
+ err = PVRSRVFreeDeviceMemBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GETFREE_DEVICEMEM:
+ err = PVRSRVGetFreeDeviceMemBW(cmd, in, out, per_proc);
+ break;
- if (psBridgePackageKM->ui32InBufferSize > 0) {
- if (!OSAccessOK(PVR_VERIFY_READ,
- psBridgePackageKM->pvParamIn,
- psBridgePackageKM->ui32InBufferSize))
- PVR_DPF(PVR_DBG_ERROR,
- "%s: Invalid pvParamIn pointer",
- __func__);
+ case PVRSRV_BRIDGE_CREATE_COMMANDQUEUE:
+ case PVRSRV_BRIDGE_DESTROY_COMMANDQUEUE:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
- if (CopyFromUserWrapper(psPerProc, ui32BridgeID,
- psBridgeIn,
- psBridgePackageKM->pvParamIn,
- psBridgePackageKM->ui32InBufferSize)
- != PVRSRV_OK)
- goto return_fault;
- }
- }
+ case PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA:
+ err = PVRMMapOSMemHandleToMMapDataBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_CONNECT_SERVICES:
+ err = PVRSRVConnectBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_DISCONNECT_SERVICES:
+ err = PVRSRVDisconnectBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_WRAP_DEVICE_MEM:
+ case PVRSRV_BRIDGE_GET_DEVICEMEMINFO:
+ case PVRSRV_BRIDGE_RESERVE_DEV_VIRTMEM:
+ case PVRSRV_BRIDGE_FREE_DEV_VIRTMEM:
+ case PVRSRV_BRIDGE_MAP_EXT_MEMORY:
+ case PVRSRV_BRIDGE_UNMAP_EXT_MEMORY:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_MAP_DEV_MEMORY:
+ err = PVRSRVMapDeviceMemoryBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_UNMAP_DEV_MEMORY:
+ err = PVRSRVUnmapDeviceMemoryBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY:
+ err = PVRSRVMapDeviceClassMemoryBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY:
+ err = PVRSRVUnmapDeviceClassMemoryBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER:
+ case PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_EXPORT_DEVICEMEM:
+ err = PVRSRVExportDeviceMemBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_RELEASE_MMAP_DATA:
+ err = PVRMMapReleaseMMapDataBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_CACHE_FLUSH_DRM:
+ err = PVRSRVCacheFlushDRIBW(cmd, in, out, per_proc);
+ break;
- if (ui32BridgeID >= (BRIDGE_DISPATCH_TABLE_ENTRY_COUNT)) {
+ case PVRSRV_BRIDGE_PROCESS_SIMISR_EVENT:
+ case PVRSRV_BRIDGE_REGISTER_SIM_PROCESS:
+ case PVRSRV_BRIDGE_UNREGISTER_SIM_PROCESS:
+ case PVRSRV_BRIDGE_MAPPHYSTOUSERSPACE:
+ case PVRSRV_BRIDGE_UNMAPPHYSTOUSERSPACE:
+ case PVRSRV_BRIDGE_GETPHYSTOUSERSPACEMAP:
+ case PVRSRV_BRIDGE_GET_FB_STATS:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_GET_MISC_INFO:
+ err = PVRSRVGetMiscInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_RELEASE_MISC_INFO:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+#if defined(PDUMP)
+ case PVRSRV_BRIDGE_PDUMP_INIT:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_MEMPOL:
+ err = PDumpMemPolBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_DUMPMEM:
+ err = PDumpMemBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_REG:
+ err = PDumpRegWithFlagsBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_REGPOL:
+ err = PDumpRegPolBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_COMMENT:
+ err = PDumpCommentBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_SETFRAME:
+ err = PDumpSetFrameBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_ISCAPTURING:
+ err = PDumpIsCaptureFrameBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_DUMPBITMAP:
+ err = PDumpBitmapBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_DUMPREADREG:
+ err = PDumpReadRegBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_SYNCPOL:
+ err = PDumpSyncPolBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_DUMPSYNC:
+ err = PDumpSyncDumpBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_DRIVERINFO:
+ err = PDumpDriverInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_PDREG:
+ err = PDumpPDRegBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR:
+ err = PDumpPDDevPAddrBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ:
+ err = PDumpCycleCountRegReadBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_STARTINITPHASE:
+ err = PDumpStartInitPhaseBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_PDUMP_STOPINITPHASE:
+ err = PDumpStopInitPhaseBW(cmd, in, out, per_proc);
+ break;
+#endif
+
+ case PVRSRV_BRIDGE_GET_OEMJTABLE:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_ENUM_CLASS:
+ err = PVRSRVEnumerateDCBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_OPEN_DISPCLASS_DEVICE:
+ err = PVRSRVOpenDCDeviceBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE:
+ err = PVRSRVCloseDCDeviceBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_ENUM_DISPCLASS_FORMATS:
+ err = PVRSRVEnumDCFormatsBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_ENUM_DISPCLASS_DIMS:
+ err = PVRSRVEnumDCDimsBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GET_DISPCLASS_SYSBUFFER:
+ err = PVRSRVGetDCSystemBufferBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GET_DISPCLASS_INFO:
+ err = PVRSRVGetDCInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_CREATE_DISPCLASS_SWAPCHAIN:
+ err = PVRSRVCreateDCSwapChainBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_DESTROY_DISPCLASS_SWAPCHAIN:
+ err = PVRSRVDestroyDCSwapChainBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SET_DISPCLASS_DSTRECT:
+ err = PVRSRVSetDCDstRectBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SET_DISPCLASS_SRCRECT:
+ err = PVRSRVSetDCSrcRectBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SET_DISPCLASS_DSTCOLOURKEY:
+ err = PVRSRVSetDCDstColourKeyBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SET_DISPCLASS_SRCCOLOURKEY:
+ err = PVRSRVSetDCSrcColourKeyBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS:
+ err = PVRSRVGetDCBuffersBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER:
+ err = PVRSRVSwapToDCBufferBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_SYSTEM:
+ err = PVRSRVSwapToDCSystemBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_OPEN_BUFFERCLASS_DEVICE:
+ err = PVRSRVOpenBCDeviceBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE:
+ err = PVRSRVCloseBCDeviceBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO:
+ err = PVRSRVGetBCInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER:
+ err = PVRSRVGetBCBufferBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_WRAP_EXT_MEMORY:
+ err = PVRSRVWrapExtMemoryBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_UNWRAP_EXT_MEMORY:
+ err = PVRSRVUnwrapExtMemoryBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_ALLOC_SHARED_SYS_MEM:
+ err = PVRSRVAllocSharedSysMemoryBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_FREE_SHARED_SYS_MEM:
+ err = PVRSRVFreeSharedSysMemoryBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_MAP_MEMINFO_MEM:
+ err = PVRSRVMapMemInfoMemBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_GETMMU_PD_DEVPADDR:
+ err = MMU_GetPDDevPAddrBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_INITSRV_CONNECT:
+ err = PVRSRVInitSrvConnectBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_INITSRV_DISCONNECT:
+ err = PVRSRVInitSrvDisconnectBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_EVENT_OBJECT_WAIT:
+ err = PVRSRVEventObjectWaitBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_EVENT_OBJECT_OPEN:
+ err = PVRSRVEventObjectOpenBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE:
+ err = PVRSRVEventObjectCloseBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_MODIFY_SYNC_OPS:
+ err = PVRSRVModifySyncOpsBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_GETCLIENTINFO:
+ err = SGXGetClientInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO:
+ err = SGXReleaseClientInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO:
+ err = SGXGetInternalDevInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_DOKICK:
+ err = SGXDoKickBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR:
+ case PVRSRV_BRIDGE_SGX_READREGISTRYDWORD:
+ case PVRSRV_BRIDGE_SGX_SCHEDULECOMMAND:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE:
+ err = SGX2DQueryBlitsCompleteBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_GETMMUPDADDR:
+ err = DummyBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_SUBMITTRANSFER:
+ err = SGXSubmitTransferBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_GETMISCINFO:
+ err = SGXGetMiscInfoBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT:
+ err = SGXGetInfoForSrvinitBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_DEVINITPART2:
+ err = SGXDevInitPart2BW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC:
+ err = SGXFindSharedPBDescBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC:
+ err = SGXUnrefSharedPBDescBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:
+ err = SGXAddSharedPBDescBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT:
+ err = SGXRegisterHWRenderContextBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET:
+ err = SGXFlushHWRenderTargetBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT:
+ err = SGXUnregisterHWRenderContextBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT:
+ err = SGXRegisterHWTransferContextBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT:
+ err = SGXUnregisterHWTransferContextBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS:
+ err = SGXReadDiffCountersBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_READ_HWPERF_CB:
+ err = SGXReadHWPerfCBBW(cmd, in, out, per_proc);
+ break;
+
+ case PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES:
+ err = SGXScheduleProcessQueuesBW(cmd, in, out, per_proc);
+ break;
+
+#if defined(PDUMP)
+ case PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY:
+ err = SGXPDumpBufferArrayBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS:
+ err = SGXPDump3DSignatureRegistersBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS:
+ err = SGXPDumpCounterRegistersBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS:
+ err = SGXPDumpTASignatureRegistersBW(cmd, in, out, per_proc);
+ break;
+ case PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB:
+ err = SGXPDumpHWPerfCBBW(cmd, in, out, per_proc);
+ break;
+#endif
+
+ default:
+ PVR_DPF(PVR_DBG_ERROR, "%s: cmd = %d is out if range!",
+ __func__, cmd);
+ }
+
+ return err;
+}
+
+int BridgedDispatchKM(struct PVRSRV_PER_PROCESS_DATA *pd,
+ struct PVRSRV_BRIDGE_PACKAGE *pkg)
+{
+
+ void *in;
+ void *out;
+ u32 bid = pkg->ui32BridgeID;
+ int err = -EFAULT;
+ struct SYS_DATA *psSysData;
+
+#if defined(DEBUG_BRIDGE_KM)
+ g_BridgeDispatchTable[bid].ui32CallCount++;
+ g_BridgeGlobalStats.ui32IOCTLCount++;
+#endif
+ if (!pd->bInitProcess && bridged_check_cmd(bid))
+ goto return_fault;
+
+ if (SysAcquireData(&psSysData) != PVRSRV_OK)
+ goto return_fault;
+
+ in = ((struct ENV_DATA *)psSysData->pvEnvSpecificData)->pvBridgeData;
+ out = (void *)((u8 *)in + PVRSRV_MAX_BRIDGE_IN_SIZE);
+
+ if (pkg->ui32InBufferSize > 0 &&
+ CopyFromUserWrapper(pd, bid, in, pkg->pvParamIn,
+ pkg->ui32InBufferSize) != PVRSRV_OK)
+ goto return_fault;
+
+ if (bid >= (BRIDGE_DISPATCH_TABLE_ENTRY_COUNT)) {
PVR_DPF(PVR_DBG_ERROR,
"%s: ui32BridgeID = %d is out if range!", __func__,
- ui32BridgeID);
+ bid);
goto return_fault;
}
- pfBridgeHandler = (int (*)(u32 ui32BridgeID, void *psBridgeIn,
- void *psBridgeOut,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc))
- g_BridgeDispatchTable[ui32BridgeID].pfFunction;
- err = pfBridgeHandler(ui32BridgeID, psBridgeIn, psBridgeOut, psPerProc);
+
+ err = bridged_ioctl(bid, in, out, pd);
+
if (err < 0)
goto return_fault;
-
- if (CopyToUserWrapper(psPerProc,
- ui32BridgeID,
- psBridgePackageKM->pvParamOut,
- psBridgeOut, psBridgePackageKM->ui32OutBufferSize)
- != PVRSRV_OK)
+ if (CopyToUserWrapper(pd, bid, pkg->pvParamOut, out,
+ pkg->ui32OutBufferSize) != PVRSRV_OK)
goto return_fault;
err = 0;
return_fault:
- ReleaseHandleBatch(psPerProc);
+ ReleaseHandleBatch(pd);
return err;
}
#define PVRSRV_GET_BRIDGE_ID(X) _IOC_NR(X)
+#if defined(DEBUG_BRIDGE_KM)
+enum PVRSRV_ERROR CopyFromUserWrapper(struct PVRSRV_PER_PROCESS_DATA *pProcData,
+ u32 ui32BridgeID, void *pvDest,
+ void __user *pvSrc, u32 ui32Size);
+enum PVRSRV_ERROR CopyToUserWrapper(struct PVRSRV_PER_PROCESS_DATA *pProcData,
+ u32 ui32BridgeID, void __user *pvDest,
+ void *pvSrc, u32 ui32Size);
+#else
+#define CopyFromUserWrapper(pProcData, ui32BridgeID, pvDest, pvSrc, ui32Size) \
+ OSCopyFromUser(pProcData, pvDest, pvSrc, ui32Size)
+#define CopyToUserWrapper(pProcData, ui32BridgeID, pvDest, pvSrc, ui32Size) \
+ OSCopyToUser(pProcData, pvDest, pvSrc, ui32Size)
+#endif
+
+#define ASSIGN_AND_RETURN_ON_ERROR(error, src, res) \
+ do { \
+ (error) = (src); \
+ if ((error) != PVRSRV_OK) \
+ return res; \
+ } while (error != PVRSRV_OK)
+
+#define ASSIGN_AND_EXIT_ON_ERROR(error, src) \
+ ASSIGN_AND_RETURN_ON_ERROR(error, src, 0)
+
+static inline enum PVRSRV_ERROR NewHandleBatch(
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc, u32 ui32BatchSize)
+{
+ enum PVRSRV_ERROR eError;
+
+ PVR_ASSERT(!psPerProc->bHandlesBatched);
+
+ eError = PVRSRVNewHandleBatch(psPerProc->psHandleBase, ui32BatchSize);
+
+ if (eError == PVRSRV_OK)
+ psPerProc->bHandlesBatched = IMG_TRUE;
+
+ return eError;
+}
+
+#define NEW_HANDLE_BATCH_OR_ERROR(error, psPerProc, ui32BatchSize) \
+ ASSIGN_AND_EXIT_ON_ERROR(error, NewHandleBatch(psPerProc, \
+ ui32BatchSize))
+
+static inline enum PVRSRV_ERROR
+CommitHandleBatch(struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ PVR_ASSERT(psPerProc->bHandlesBatched);
+
+ psPerProc->bHandlesBatched = IMG_FALSE;
+
+ return PVRSRVCommitHandleBatch(psPerProc->psHandleBase);
+}
+
+#define COMMIT_HANDLE_BATCH_OR_ERROR(error, psPerProc) \
+ ASSIGN_AND_EXIT_ON_ERROR(error, CommitHandleBatch(psPerProc))
+
+static inline void ReleaseHandleBatch(struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ if (psPerProc->bHandlesBatched) {
+ psPerProc->bHandlesBatched = IMG_FALSE;
+
+ PVRSRVReleaseHandleBatch(psPerProc->psHandleBase);
+ }
+}
+
+int DummyBW(u32 ui32BridgeID, void *psBridgeIn, void *psBridgeOut,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY {
int (*pfFunction)(u32 ui32BridgeID, void *psBridgeIn, void *psBridgeOut,
struct PVRSRV_PER_PROCESS_DATA *psPerProc);
};
#define BRIDGE_DISPATCH_TABLE_ENTRY_COUNT (PVRSRV_BRIDGE_LAST_SGX_CMD+1)
+#define PVRSRV_BRIDGE_LAST_DEVICE_CMD PVRSRV_BRIDGE_LAST_SGX_CMD
extern struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY
g_BridgeDispatchTable[BRIDGE_DISPATCH_TABLE_ENTRY_COUNT];
+void _SetDispatchTableEntry(u32 ui32Index,
+ const char *pszIOCName,
+ int (*pfFunction) (u32 ui32BridgeID,
+ void *psBridgeIn,
+ void *psBridgeOut,
+ struct PVRSRV_PER_PROCESS_DATA *
+ psPerProc),
+ const char *pszFunctionName);
+
+#define SetDispatchTableEntry(ui32Index, pfFunction) \
+ _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, \
+ (int (*)(u32 ui32BridgeID, void *psBridgeIn, void *psBridgeOut, \
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc))pfFunction, #pfFunction)
+
+#define DISPATCH_TABLE_GAP_THRESHOLD 5
+
+#if defined(DEBUG)
+#define PVRSRV_BRIDGE_ASSERT_CMD(X, Y) PVR_ASSERT(X == PVRSRV_GET_BRIDGE_ID(Y))
+#else
+#define PVRSRV_BRIDGE_ASSERT_CMD(X, Y) PVR_UNREFERENCED_PARAMETER(X)
+#endif
+
#if defined(DEBUG_BRIDGE_KM)
struct PVRSRV_BRIDGE_GLOBAL_STATS {
u32 ui32IOCTLCount;
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#include <linux/errno.h>
+
+#include <stddef.h>
+
+#include "img_defs.h"
+
+#include "services.h"
+#include "pvr_debug.h"
+#include "pvr_bridge.h"
+#include "sgx_bridge.h"
+#include "perproc.h"
+#include "power.h"
+#include "pvr_bridge_km.h"
+#include "sgx_bridge_km.h"
+#include "bridged_pvr_bridge.h"
+#include "bridged_sgx_bridge.h"
+#include "sgxutils.h"
+#include "pdump_km.h"
+
+int SGXGetClientInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_GETCLIENTINFO *psGetClientInfoIN,
+ struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO *psGetClientInfoOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETCLIENTINFO);
+
+ psGetClientInfoOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psGetClientInfoIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psGetClientInfoOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psGetClientInfoOUT->eError =
+ SGXGetClientInfoKM(hDevCookieInt, &psGetClientInfoOUT->sClientInfo);
+ return 0;
+}
+
+int SGXReleaseClientInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO *psReleaseClientInfoIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ struct PVRSRV_SGXDEV_INFO *psDevInfo;
+ void *hDevCookieInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO);
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psReleaseClientInfoIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psDevInfo =
+ (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
+ hDevCookieInt)->pvDevice;
+
+ PVR_ASSERT(psDevInfo->ui32ClientRefCount > 0);
+
+ psDevInfo->ui32ClientRefCount--;
+
+ psRetOUT->eError = PVRSRV_OK;
+
+ return 0;
+}
+
+int SGXGetInternalDevInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO *psSGXGetInternalDevInfoIN,
+ struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO *psSGXGetInternalDevInfoOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO);
+
+ psSGXGetInternalDevInfoOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psSGXGetInternalDevInfoIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psSGXGetInternalDevInfoOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psSGXGetInternalDevInfoOUT->eError =
+ SGXGetInternalDevInfoKM(hDevCookieInt,
+ &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo);
+
+ psSGXGetInternalDevInfoOUT->eError =
+ PVRSRVAllocHandle(psPerProc->psHandleBase,
+ &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
+ hHostCtlKernelMemInfoHandle,
+ psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
+ hHostCtlKernelMemInfoHandle,
+ PVRSRV_HANDLE_TYPE_MEM_INFO,
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
+
+ return 0;
+}
+
+int SGXDoKickBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_DOKICK *psDoKickIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ u32 i;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DOKICK);
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psDoKickIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.hCCBKernelMemInfo,
+ psDoKickIN->sCCBKick.hCCBKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ if (psDoKickIN->sCCBKick.hTA3DSyncInfo != NULL) {
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.hTA3DSyncInfo,
+ psDoKickIN->sCCBKick.hTA3DSyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psDoKickIN->sCCBKick.hTASyncInfo != NULL) {
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.hTASyncInfo,
+ psDoKickIN->sCCBKick.hTASyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psDoKickIN->sCCBKick.h3DSyncInfo != NULL) {
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.h3DSyncInfo,
+ psDoKickIN->sCCBKick.h3DSyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psDoKickIN->sCCBKick.ui32NumSrcSyncs > SGX_MAX_SRC_SYNCS) {
+ psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
+ return 0;
+ }
+ for (i = 0; i < psDoKickIN->sCCBKick.ui32NumSrcSyncs; i++) {
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.
+ ahSrcKernelSyncInfo[i],
+ psDoKickIN->sCCBKick.
+ ahSrcKernelSyncInfo[i],
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psDoKickIN->sCCBKick.ui32NumTAStatusVals > SGX_MAX_TA_STATUS_VALS) {
+ psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
+ return 0;
+ }
+ for (i = 0; i < psDoKickIN->sCCBKick.ui32NumTAStatusVals; i++) {
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
+ psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psDoKickIN->sCCBKick.ui32Num3DStatusVals > SGX_MAX_3D_STATUS_VALS) {
+ psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
+ return 0;
+ }
+ for (i = 0; i < psDoKickIN->sCCBKick.ui32Num3DStatusVals; i++) {
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
+ psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psDoKickIN->sCCBKick.ui32NumDstSyncObjects > 0) {
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.
+ hKernelHWSyncListMemInfo,
+ psDoKickIN->sCCBKick.
+ hKernelHWSyncListMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psDoKickIN->sCCBKick.sDstSyncHandle,
+ psDoKickIN->sCCBKick.sDstSyncHandle,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ psRetOUT->eError = SGXDoKickKM(hDevCookieInt, &psDoKickIN->sCCBKick);
+
+ return 0;
+}
+
+int SGXScheduleProcessQueuesBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES *psScheduleProcQIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES);
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psScheduleProcQIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError = SGXScheduleProcessQueuesKM(hDevCookieInt);
+
+ return 0;
+}
+
+int SGXSubmitTransferBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER *psSubmitTransferIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ struct PVRSRV_TRANSFER_SGX_KICK *psKick;
+ u32 i;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_SUBMITTRANSFER);
+ PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
+
+ psKick = &psSubmitTransferIN->sKick;
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psSubmitTransferIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psKick->hCCBMemInfo,
+ psKick->hCCBMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ if (psKick->hTASyncInfo != NULL) {
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psKick->hTASyncInfo,
+ psKick->hTASyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psKick->h3DSyncInfo != NULL) {
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psKick->h3DSyncInfo,
+ psKick->h3DSyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psKick->ui32NumSrcSync > SGX_MAX_TRANSFER_SYNC_OPS) {
+ psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
+ return 0;
+ }
+ for (i = 0; i < psKick->ui32NumSrcSync; i++) {
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psKick->ahSrcSyncInfo[i],
+ psKick->ahSrcSyncInfo[i],
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ if (psKick->ui32NumDstSync > SGX_MAX_TRANSFER_SYNC_OPS) {
+ psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
+ return 0;
+ }
+ for (i = 0; i < psKick->ui32NumDstSync; i++) {
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &psKick->ahDstSyncInfo[i],
+ psKick->ahDstSyncInfo[i],
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, psKick);
+
+ return 0;
+}
+
+int SGXGetMiscInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo;
+ struct SGX_MISC_INFO sMiscInfo;
+ struct PVRSRV_DEVICE_NODE *psDeviceNode;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETMISCINFO);
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psSGXGetMiscInfoIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psDeviceNode = hDevCookieInt;
+ PVR_ASSERT(psDeviceNode != NULL);
+ if (psDeviceNode == NULL)
+ return -EFAULT;
+
+ psDevInfo = psDeviceNode->pvDevice;
+
+ psRetOUT->eError = CopyFromUserWrapper(psPerProc, ui32BridgeID,
+ &sMiscInfo,
+ psSGXGetMiscInfoIN->psMiscInfo,
+ sizeof(struct SGX_MISC_INFO));
+ if (psRetOUT->eError != PVRSRV_OK)
+ return -EFAULT;
+
+ if (sMiscInfo.eRequest == SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB) {
+ void *pAllocated;
+ void *hAllocatedHandle;
+ void __user *psTmpUserData;
+ u32 allocatedSize;
+
+ allocatedSize =
+ (u32) (sMiscInfo.uData.sRetrieveCB.ui32ArraySize *
+ sizeof(struct PVRSRV_SGX_HWPERF_CBDATA));
+
+ ASSIGN_AND_EXIT_ON_ERROR(psRetOUT->eError,
+ OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ allocatedSize,
+ &pAllocated,
+ &hAllocatedHandle));
+
+ psTmpUserData = (void __force __user *)
+ sMiscInfo.uData.sRetrieveCB.psHWPerfData;
+ sMiscInfo.uData.sRetrieveCB.psHWPerfData = pAllocated;
+
+ psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo,
+ &sMiscInfo, psDeviceNode);
+ if (psRetOUT->eError != PVRSRV_OK) {
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ allocatedSize, pAllocated, hAllocatedHandle);
+ return 0;
+ }
+
+ psRetOUT->eError = CopyToUserWrapper(psPerProc,
+ ui32BridgeID, psTmpUserData,
+ sMiscInfo.uData.sRetrieveCB.psHWPerfData,
+ allocatedSize);
+
+ sMiscInfo.uData.sRetrieveCB.psHWPerfData =
+ (void __force *)psTmpUserData;
+
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ allocatedSize, pAllocated, hAllocatedHandle);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return -EFAULT;
+ } else {
+ psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo,
+ &sMiscInfo, psDeviceNode);
+
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+ }
+
+ psRetOUT->eError = CopyToUserWrapper(psPerProc,
+ ui32BridgeID,
+ psSGXGetMiscInfoIN->psMiscInfo,
+ &sMiscInfo,
+ sizeof(struct SGX_MISC_INFO));
+ if (psRetOUT->eError != PVRSRV_OK)
+ return -EFAULT;
+ return 0;
+}
+
+int SGXReadDiffCountersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS *psSGXReadDiffCountersIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_READ_DIFF_COUNTERS
+ *psSGXReadDiffCountersOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS);
+
+ psSGXReadDiffCountersOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psSGXReadDiffCountersIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psSGXReadDiffCountersOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psSGXReadDiffCountersOUT->eError = SGXReadDiffCountersKM(
+ hDevCookieInt,
+ psSGXReadDiffCountersIN->ui32Reg,
+ &psSGXReadDiffCountersOUT->ui32Old,
+ psSGXReadDiffCountersIN->bNew,
+ psSGXReadDiffCountersIN->ui32New,
+ psSGXReadDiffCountersIN->ui32NewReset,
+ psSGXReadDiffCountersIN->ui32CountersReg,
+ &psSGXReadDiffCountersOUT->ui32Time,
+ &psSGXReadDiffCountersOUT->bActive,
+ &psSGXReadDiffCountersOUT->sDiffs);
+
+ return 0;
+}
+
+int SGXReadHWPerfCBBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ struct PVRSRV_SGX_HWPERF_CB_ENTRY *psAllocated;
+ void *hAllocatedHandle;
+ u32 ui32AllocatedSize;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_READ_HWPERF_CB);
+
+ psSGXReadHWPerfCBOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psSGXReadHWPerfCBIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psSGXReadHWPerfCBOUT->eError != PVRSRV_OK)
+ return 0;
+
+ ui32AllocatedSize = psSGXReadHWPerfCBIN->ui32ArraySize *
+ sizeof(psSGXReadHWPerfCBIN->psHWPerfCBData[0]);
+ ASSIGN_AND_EXIT_ON_ERROR(psSGXReadHWPerfCBOUT->eError,
+ OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32AllocatedSize,
+ (void **)&psAllocated,
+ &hAllocatedHandle));
+
+ psSGXReadHWPerfCBOUT->eError = SGXReadHWPerfCBKM(hDevCookieInt,
+ psSGXReadHWPerfCBIN->ui32ArraySize,
+ psAllocated,
+ &psSGXReadHWPerfCBOUT->ui32DataCount,
+ &psSGXReadHWPerfCBOUT->ui32ClockSpeed,
+ &psSGXReadHWPerfCBOUT->ui32HostTimeStamp);
+ if (psSGXReadHWPerfCBOUT->eError == PVRSRV_OK)
+ psSGXReadHWPerfCBOUT->eError = CopyToUserWrapper(
+ psPerProc, ui32BridgeID,
+ psSGXReadHWPerfCBIN->psHWPerfCBData,
+ psAllocated, ui32AllocatedSize);
+
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32AllocatedSize, psAllocated, hAllocatedHandle);
+
+ return 0;
+}
+
+int SGXDevInitPart2BW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXDEVINITPART2 *psSGXDevInitPart2IN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ enum PVRSRV_ERROR eError;
+ IMG_BOOL bDissociateFailed = IMG_FALSE;
+ IMG_BOOL bLookupFailed = IMG_FALSE;
+ IMG_BOOL bReleaseFailed = IMG_FALSE;
+ void *hDummy;
+ u32 i;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2);
+
+ if (!psPerProc->bInitProcess) {
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psSGXDevInitPart2IN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBCtlMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBEventKickerMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXHostCtlMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXTA3DCtlMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXMiscMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelHWPerfCBMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelEDMStatusBufferMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+#endif
+
+ for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
+ void *hHandle =
+ psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
+
+ if (hHandle == NULL)
+ continue;
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
+ hHandle,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+ }
+
+ if (bLookupFailed) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "DevInitSGXPart2BW: A handle lookup failed");
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBCtlMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBCtlMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBEventKickerMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBEventKickerMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXHostCtlMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXHostCtlMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXTA3DCtlMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXTA3DCtlMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXMiscMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXMiscMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelHWPerfCBMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelHWPerfCBMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ &psSGXDevInitPart2IN->sInitInfo.
+ hKernelEDMStatusBufferMemInfo,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelEDMStatusBufferMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+#endif
+
+ for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
+ void **phHandle =
+ &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
+
+ if (*phHandle == NULL)
+ continue;
+
+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
+ phHandle, *phHandle,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+ }
+
+ if (bReleaseFailed) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "DevInitSGXPart2BW: A handle release failed");
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+
+ PVR_DBG_BREAK;
+ return 0;
+ }
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBMemInfo);
+ bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBCtlMemInfo);
+ bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBEventKickerMemInfo);
+ bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXHostCtlMemInfo);
+ bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXTA3DCtlMemInfo);
+ bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXMiscMemInfo);
+ bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelHWPerfCBMemInfo);
+ bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelEDMStatusBufferMemInfo);
+ bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+#endif
+
+ for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
+ void *hHandle =
+ psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
+
+ if (hHandle == NULL)
+ continue;
+
+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, hHandle);
+ bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
+ }
+
+ if (bDissociateFailed) {
+ PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBMemInfo);
+ PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelCCBCtlMemInfo);
+ PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXHostCtlMemInfo);
+ PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXTA3DCtlMemInfo);
+ PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ psSGXDevInitPart2IN->sInitInfo.
+ hKernelSGXMiscMemInfo);
+
+ for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
+ void *hHandle =
+ psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
+
+ if (hHandle == NULL)
+ continue;
+
+ PVRSRVFreeDeviceMemKM(hDevCookieInt,
+ (struct PVRSRV_KERNEL_MEM_INFO *)
+ hHandle);
+
+ }
+
+ PVR_DPF(PVR_DBG_ERROR,
+ "DevInitSGXPart2BW: A dissociate failed");
+
+ psRetOUT->eError = PVRSRV_ERROR_GENERIC;
+
+ PVR_DBG_BREAK;
+ return 0;
+ }
+
+ psRetOUT->eError = DevInitSGXPart2KM(psPerProc, hDevCookieInt,
+ &psSGXDevInitPart2IN->sInitInfo);
+
+ return 0;
+}
+
+int SGXRegisterHWRenderContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT
+ *psSGXRegHWRenderContextIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT
+ *psSGXRegHWRenderContextOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ void *hHWRenderContextInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT);
+
+ NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc,
+ 1);
+
+ psSGXRegHWRenderContextOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psSGXRegHWRenderContextIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psSGXRegHWRenderContextOUT->eError != PVRSRV_OK)
+ return 0;
+
+ hHWRenderContextInt =
+ SGXRegisterHWRenderContextKM(hDevCookieInt,
+ &psSGXRegHWRenderContextIN->sHWRenderContextDevVAddr,
+ psPerProc);
+
+ if (hHWRenderContextInt == NULL) {
+ psSGXRegHWRenderContextOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+ &psSGXRegHWRenderContextOUT->hHWRenderContext,
+ hHWRenderContextInt,
+ PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE);
+
+ COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError,
+ psPerProc);
+
+ return 0;
+}
+
+int SGXUnregisterHWRenderContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT
+ *psSGXUnregHWRenderContextIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hHWRenderContextInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT);
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hHWRenderContextInt,
+ psSGXUnregHWRenderContextIN->hHWRenderContext,
+ PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError =
+ PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psSGXUnregHWRenderContextIN->hHWRenderContext,
+ PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
+
+ return 0;
+}
+
+int SGXRegisterHWTransferContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT
+ *psSGXRegHWTransferContextIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT
+ *psSGXRegHWTransferContextOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ void *hHWTransferContextInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT);
+
+ NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
+ psPerProc, 1);
+
+ psSGXRegHWTransferContextOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psSGXRegHWTransferContextIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psSGXRegHWTransferContextOUT->eError != PVRSRV_OK)
+ return 0;
+
+ hHWTransferContextInt =
+ SGXRegisterHWTransferContextKM(hDevCookieInt,
+ &psSGXRegHWTransferContextIN->
+ sHWTransferContextDevVAddr,
+ psPerProc);
+
+ if (hHWTransferContextInt == NULL) {
+ psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+ &psSGXRegHWTransferContextOUT->hHWTransferContext,
+ hHWTransferContextInt,
+ PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE);
+
+ COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
+ psPerProc);
+
+ return 0;
+}
+
+int SGXUnregisterHWTransferContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT
+ *psSGXUnregHWTransferContextIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hHWTransferContextInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT);
+
+ psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hHWTransferContextInt,
+ psSGXUnregHWTransferContextIN->
+ hHWTransferContext,
+ PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError =
+ SGXUnregisterHWTransferContextKM(hHWTransferContextInt);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError =
+ PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psSGXUnregHWTransferContextIN->
+ hHWTransferContext,
+ PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
+
+ return 0;
+}
+
+int SGXFlushHWRenderTargetBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET
+ *psSGXFlushHWRenderTargetIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET);
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psSGXFlushHWRenderTargetIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ SGXFlushHWRenderTargetKM(hDevCookieInt,
+ psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr);
+
+ return 0;
+}
+
+int SGX2DQueryBlitsCompleteBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ void *pvSyncInfo;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE);
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ ps2DQueryBltsCompleteIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
+ ps2DQueryBltsCompleteIN->hKernSyncInfo,
+ PVRSRV_HANDLE_TYPE_SYNC_INFO);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psDevInfo =
+ (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
+ hDevCookieInt)->pvDevice;
+
+ psRetOUT->eError =
+ SGX2DQueryBlitsCompleteKM(psDevInfo,
+ (struct PVRSRV_KERNEL_SYNC_INFO *)
+ pvSyncInfo,
+ ps2DQueryBltsCompleteIN->
+ bWaitForComplete);
+
+ return 0;
+}
+
+int SGXFindSharedPBDescBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescIN,
+ struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = NULL;
+ u32 ui32SharedPBDescSubKernelMemInfosCount = 0;
+ u32 i;
+ void *hSharedPBDesc = NULL;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC);
+
+ NEW_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc,
+ PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS
+ + 4);
+
+ psSGXFindSharedPBDescOUT->hSharedPBDesc = NULL;
+
+ psSGXFindSharedPBDescOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psSGXFindSharedPBDescIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
+
+ psSGXFindSharedPBDescOUT->eError =
+ SGXFindSharedPBDescKM(psPerProc, hDevCookieInt,
+ psSGXFindSharedPBDescIN->bLockOnFailure,
+ psSGXFindSharedPBDescIN->ui32TotalPBSize,
+ &hSharedPBDesc,
+ &psSharedPBDescKernelMemInfo,
+ &psHWPBDescKernelMemInfo,
+ &psBlockKernelMemInfo,
+ &ppsSharedPBDescSubKernelMemInfos,
+ &ui32SharedPBDescSubKernelMemInfosCount);
+ if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
+
+ PVR_ASSERT(ui32SharedPBDescSubKernelMemInfosCount <=
+ PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
+
+ psSGXFindSharedPBDescOUT->ui32SharedPBDescSubKernelMemInfoHandlesCount =
+ ui32SharedPBDescSubKernelMemInfosCount;
+
+ if (hSharedPBDesc == NULL) {
+ psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle =
+ NULL;
+
+ goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
+ }
+
+ PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+ &psSGXFindSharedPBDescOUT->hSharedPBDesc,
+ hSharedPBDesc,
+ PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE);
+
+ PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
+ &psSGXFindSharedPBDescOUT->
+ hSharedPBDescKernelMemInfoHandle,
+ psSharedPBDescKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
+ psSGXFindSharedPBDescOUT->hSharedPBDesc);
+
+ PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
+ &psSGXFindSharedPBDescOUT->
+ hHWPBDescKernelMemInfoHandle,
+ psHWPBDescKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
+ psSGXFindSharedPBDescOUT->hSharedPBDesc);
+
+ PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
+ &psSGXFindSharedPBDescOUT->
+ hBlockKernelMemInfoHandle,
+ psBlockKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
+ psSGXFindSharedPBDescOUT->hSharedPBDesc);
+
+ for (i = 0; i < ui32SharedPBDescSubKernelMemInfosCount; i++) {
+ struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC
+ *psSGXFindSharedPBDescOut = psSGXFindSharedPBDescOUT;
+
+ PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
+ &psSGXFindSharedPBDescOut->
+ ahSharedPBDescSubKernelMemInfoHandles[i],
+ ppsSharedPBDescSubKernelMemInfos[i],
+ PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
+ psSGXFindSharedPBDescOUT->
+ hSharedPBDescKernelMemInfoHandle);
+ }
+
+PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT:
+ if (ppsSharedPBDescSubKernelMemInfos != NULL)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
+ ui32SharedPBDescSubKernelMemInfosCount,
+ ppsSharedPBDescSubKernelMemInfos, NULL);
+
+ if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK) {
+ if (hSharedPBDesc != NULL)
+ SGXUnrefSharedPBDescKM(hSharedPBDesc);
+ } else
+ COMMIT_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError,
+ psPerProc);
+
+ return 0;
+}
+
+int SGXUnrefSharedPBDescBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
+ struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC
+ *psSGXUnrefSharedPBDescOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hSharedPBDesc;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC);
+
+ psSGXUnrefSharedPBDescOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hSharedPBDesc,
+ psSGXUnrefSharedPBDescIN->hSharedPBDesc,
+ PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
+ if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psSGXUnrefSharedPBDescOUT->eError =
+ SGXUnrefSharedPBDescKM(hSharedPBDesc);
+
+ if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psSGXUnrefSharedPBDescOUT->eError =
+ PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psSGXUnrefSharedPBDescIN->hSharedPBDesc,
+ PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
+
+ return 0;
+}
+
+int SGXAddSharedPBDescBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
+ struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
+ u32 ui32KernelMemInfoHandlesCount =
+ psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount;
+ int ret = 0;
+ void **phKernelMemInfoHandles = NULL;
+ struct PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = NULL;
+ u32 i;
+ enum PVRSRV_ERROR eError;
+ void *hSharedPBDesc = NULL;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC);
+
+ NEW_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc,
+ 1);
+
+ psSGXAddSharedPBDescOUT->hSharedPBDesc = NULL;
+
+ PVR_ASSERT(ui32KernelMemInfoHandlesCount <=
+ PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &hDevCookieInt,
+ psSGXAddSharedPBDescIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ (void **)&psSharedPBDescKernelMemInfo,
+ psSGXAddSharedPBDescIN->
+ hSharedPBDescKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ (void **)&psHWPBDescKernelMemInfo,
+ psSGXAddSharedPBDescIN->
+ hHWPBDescKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ (void **)&psBlockKernelMemInfo,
+ psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ if (!OSAccessOK(PVR_VERIFY_READ,
+ psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
+ ui32KernelMemInfoHandlesCount * sizeof(void *))) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:"
+ " Invalid phKernelMemInfos pointer", __func__);
+ ret = -EFAULT;
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+ }
+
+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32KernelMemInfoHandlesCount * sizeof(void *),
+ (void **)&phKernelMemInfoHandles, NULL);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ if (CopyFromUserWrapper(psPerProc,
+ ui32BridgeID,
+ phKernelMemInfoHandles,
+ psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
+ ui32KernelMemInfoHandlesCount * sizeof(void *))
+ != PVRSRV_OK) {
+ ret = -EFAULT;
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+ }
+
+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32KernelMemInfoHandlesCount *
+ sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
+ (void **)&ppsKernelMemInfos, NULL);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ (void **)&ppsKernelMemInfos[i],
+ phKernelMemInfoHandles[i],
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+ }
+
+ eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psSGXAddSharedPBDescIN->
+ hSharedPBDescKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
+ PVR_ASSERT(eError == PVRSRV_OK);
+
+ eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psSGXAddSharedPBDescIN->
+ hHWPBDescKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ PVR_ASSERT(eError == PVRSRV_OK);
+
+ eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ psSGXAddSharedPBDescIN->
+ hBlockKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
+ PVR_ASSERT(eError == PVRSRV_OK);
+
+ for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
+ eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
+ phKernelMemInfoHandles[i],
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ PVR_ASSERT(eError == PVRSRV_OK);
+ }
+
+ eError = SGXAddSharedPBDescKM(psPerProc, hDevCookieInt,
+ psSharedPBDescKernelMemInfo,
+ psHWPBDescKernelMemInfo,
+ psBlockKernelMemInfo,
+ psSGXAddSharedPBDescIN->ui32TotalPBSize,
+ &hSharedPBDesc,
+ ppsKernelMemInfos,
+ ui32KernelMemInfoHandlesCount);
+
+ if (eError != PVRSRV_OK)
+ goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
+
+ PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+ &psSGXAddSharedPBDescOUT->hSharedPBDesc,
+ hSharedPBDesc,
+ PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
+ PVRSRV_HANDLE_ALLOC_FLAG_NONE);
+
+PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT:
+
+ if (phKernelMemInfoHandles)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
+ * sizeof(void *),
+ (void *)phKernelMemInfoHandles, NULL);
+ if (ppsKernelMemInfos)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
+ * sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
+ (void *)ppsKernelMemInfos, NULL);
+
+ if (ret == 0 && eError == PVRSRV_OK)
+ COMMIT_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError,
+ psPerProc);
+
+ psSGXAddSharedPBDescOUT->eError = eError;
+
+ return ret;
+}
+
+int SGXGetInfoForSrvinitBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
+ struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ void *hDevCookieInt;
+ u32 i;
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT);
+
+ NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc,
+ PVRSRV_MAX_CLIENT_HEAPS);
+
+ if (!psPerProc->bInitProcess) {
+ psSGXInfoForSrvinitOUT->eError = PVRSRV_ERROR_GENERIC;
+ return 0;
+ }
+
+ psSGXInfoForSrvinitOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psSGXInfoForSrvinitIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+
+ if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psSGXInfoForSrvinitOUT->eError =
+ SGXGetInfoForSrvinitKM(hDevCookieInt,
+ &psSGXInfoForSrvinitOUT->sInitInfo);
+
+ if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
+ return 0;
+
+ for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
+ struct PVRSRV_HEAP_INFO *psHeapInfo;
+
+ psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i];
+
+ if (psHeapInfo->ui32HeapID != (u32)SGX_UNDEFINED_HEAP_ID) {
+ void *hDevMemHeapExt;
+
+ if (psHeapInfo->hDevMemHeap != NULL) {
+
+ PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+ &hDevMemHeapExt,
+ psHeapInfo->hDevMemHeap,
+ PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
+ psHeapInfo->hDevMemHeap = hDevMemHeapExt;
+ }
+ }
+ }
+
+ COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc);
+
+ return 0;
+}
+
+#if defined(PDUMP)
+static void DumpBufferArray(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ struct SGX_KICKTA_DUMP_BUFFER *psBufferArray,
+ u32 ui32BufferArrayLength, IMG_BOOL bDumpPolls)
+{
+ u32 i;
+
+ for (i = 0; i < ui32BufferArrayLength; i++) {
+ struct SGX_KICKTA_DUMP_BUFFER *psBuffer;
+ struct PVRSRV_KERNEL_MEM_INFO *psCtrlMemInfoKM;
+ char *pszName;
+ void *hUniqueTag;
+ u32 ui32Offset;
+
+ psBuffer = &psBufferArray[i];
+ pszName = psBuffer->pszName;
+ if (!pszName)
+ pszName = "Nameless buffer";
+
+ hUniqueTag =
+ MAKEUNIQUETAG((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
+ hKernelMemInfo);
+
+ psCtrlMemInfoKM =
+ ((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
+ hKernelMemInfo)->psKernelSyncInfo->psSyncDataMemInfoKM;
+ ui32Offset =
+ offsetof(struct PVRSRV_SYNC_DATA, ui32ReadOpsComplete);
+
+ if (psBuffer->ui32Start <= psBuffer->ui32End) {
+ if (bDumpPolls) {
+ PDUMPCOMMENTWITHFLAGS(0,
+ "Wait for %s space\r\n",
+ pszName);
+ PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
+ psBuffer->ui32Start,
+ psBuffer->ui32SpaceUsed,
+ psBuffer->ui32BufferSize, 0,
+ MAKEUNIQUETAG(psCtrlMemInfoKM));
+ }
+
+ PDUMPCOMMENTWITHFLAGS(0, "%s\r\n", pszName);
+ PDUMPMEMUM(psPerProc,
+ NULL, psBuffer->pvLinAddr,
+ (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
+ hKernelMemInfo,
+ psBuffer->ui32Start,
+ psBuffer->ui32End - psBuffer->ui32Start, 0,
+ hUniqueTag);
+ } else {
+
+ if (bDumpPolls) {
+ PDUMPCOMMENTWITHFLAGS(0,
+ "Wait for %s space\r\n",
+ pszName);
+ PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
+ psBuffer->ui32Start,
+ psBuffer->ui32BackEndLength,
+ psBuffer->ui32BufferSize, 0,
+ MAKEUNIQUETAG(psCtrlMemInfoKM));
+ }
+ PDUMPCOMMENTWITHFLAGS(0, "%s (part 1)\r\n", pszName);
+ PDUMPMEMUM(psPerProc,
+ NULL, psBuffer->pvLinAddr,
+ (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
+ hKernelMemInfo,
+ psBuffer->ui32Start,
+ psBuffer->ui32BackEndLength, 0, hUniqueTag);
+
+ if (bDumpPolls) {
+ PDUMPMEMPOL(psCtrlMemInfoKM, ui32Offset,
+ 0, 0xFFFFFFFF,
+ PDUMP_POLL_OPERATOR_NOTEQUAL,
+ IMG_FALSE, IMG_FALSE,
+ MAKEUNIQUETAG(psCtrlMemInfoKM));
+
+ PDUMPCOMMENTWITHFLAGS(0,
+ "Wait for %s space\r\n",
+ pszName);
+ PDUMPCBP(psCtrlMemInfoKM, ui32Offset, 0,
+ psBuffer->ui32End,
+ psBuffer->ui32BufferSize, 0,
+ MAKEUNIQUETAG(psCtrlMemInfoKM));
+ }
+ PDUMPCOMMENTWITHFLAGS(0, "%s (part 2)\r\n", pszName);
+ PDUMPMEMUM(psPerProc, NULL, psBuffer->pvLinAddr,
+ (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
+ hKernelMemInfo,
+ 0, psBuffer->ui32End, 0, hUniqueTag);
+ }
+ }
+}
+
+int SGXPDumpBufferArrayBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ u32 i;
+ struct SGX_KICKTA_DUMP_BUFFER *psKickTADumpBuffer;
+ u32 ui32BufferArrayLength = psPDumpBufferArrayIN->ui32BufferArrayLength;
+ u32 ui32BufferArraySize =
+ ui32BufferArrayLength * sizeof(struct SGX_KICKTA_DUMP_BUFFER);
+ enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
+
+ PVR_UNREFERENCED_PARAMETER(psBridgeOut);
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY);
+
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
+ (void **)&psKickTADumpBuffer, NULL) != PVRSRV_OK)
+ return -ENOMEM;
+
+ if (CopyFromUserWrapper(psPerProc, ui32BridgeID, psKickTADumpBuffer,
+ psPDumpBufferArrayIN->psBufferArray,
+ ui32BufferArraySize) != PVRSRV_OK) {
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
+ psKickTADumpBuffer, NULL);
+ return -EFAULT;
+ }
+
+ for (i = 0; i < ui32BufferArrayLength; i++) {
+ void *pvMemInfo;
+
+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
+ &pvMemInfo,
+ psKickTADumpBuffer[i].
+ hKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY: "
+ "PVRSRVLookupHandle failed (%d)", eError);
+ break;
+ }
+ psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo;
+
+ }
+
+ if (eError == PVRSRV_OK)
+ DumpBufferArray(psPerProc, psKickTADumpBuffer,
+ ui32BufferArrayLength,
+ psPDumpBufferArrayIN->bDumpPolls);
+
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
+ psKickTADumpBuffer, NULL);
+
+ return 0;
+}
+
+int SGXPDump3DSignatureRegistersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS
+ *psPDump3DSignatureRegistersIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ u32 ui32RegisterArraySize =
+ psPDump3DSignatureRegistersIN->ui32NumRegisters * sizeof(u32);
+ u32 *pui32Registers = NULL;
+ int ret = -EFAULT;
+
+ PVR_UNREFERENCED_PARAMETER(psBridgeOut);
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS);
+
+ if (ui32RegisterArraySize == 0)
+ goto ExitNoError;
+
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32RegisterArraySize,
+ (void **)&pui32Registers, NULL) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDump3DSignatureRegistersBW: OSAllocMem failed");
+ goto Exit;
+ }
+
+ if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
+ psPDump3DSignatureRegistersIN->pui32Registers,
+ ui32RegisterArraySize) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: "
+ "CopyFromUserWrapper failed");
+ goto Exit;
+ }
+
+ PDump3DSignatureRegisters(psPDump3DSignatureRegistersIN->
+ ui32DumpFrameNum,
+ psPDump3DSignatureRegistersIN->bLastFrame,
+ pui32Registers,
+ psPDump3DSignatureRegistersIN->
+ ui32NumRegisters);
+
+ExitNoError:
+ ret = 0;
+Exit:
+ if (pui32Registers != NULL)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
+ pui32Registers, NULL);
+
+ return ret;
+}
+
+int SGXPDumpCounterRegistersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS
+ *psPDumpCounterRegistersIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ u32 ui32RegisterArraySize =
+ psPDumpCounterRegistersIN->ui32NumRegisters * sizeof(u32);
+ u32 *pui32Registers = NULL;
+ int ret = -EFAULT;
+
+ PVR_UNREFERENCED_PARAMETER(psBridgeOut);
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS);
+
+ if (ui32RegisterArraySize == 0)
+ goto ExitNoError;
+
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
+ (void **)&pui32Registers, NULL) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpCounterRegistersBW: OSAllocMem failed");
+ ret = -ENOMEM;
+ goto Exit;
+ }
+
+ if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
+ psPDumpCounterRegistersIN->pui32Registers,
+ ui32RegisterArraySize) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpCounterRegistersBW: CopyFromUserWrapper failed");
+ goto Exit;
+ }
+
+ PDumpCounterRegisters(psPDumpCounterRegistersIN->ui32DumpFrameNum,
+ psPDumpCounterRegistersIN->bLastFrame,
+ pui32Registers,
+ psPDumpCounterRegistersIN->ui32NumRegisters);
+
+ExitNoError:
+ ret = 0;
+Exit:
+ if (pui32Registers != NULL)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
+ pui32Registers, NULL);
+
+ return ret;
+}
+
+int SGXPDumpTASignatureRegistersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS
+ *psPDumpTASignatureRegistersIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ u32 ui32RegisterArraySize =
+ psPDumpTASignatureRegistersIN->ui32NumRegisters * sizeof(u32);
+ u32 *pui32Registers = NULL;
+ int ret = -EFAULT;
+
+ PVR_UNREFERENCED_PARAMETER(psBridgeOut);
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS);
+
+ if (ui32RegisterArraySize == 0)
+ goto ExitNoError;
+
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32RegisterArraySize,
+ (void **)&pui32Registers, NULL) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpTASignatureRegistersBW: OSAllocMem failed");
+ ret = -ENOMEM;
+ goto Exit;
+ }
+
+ if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
+ psPDumpTASignatureRegistersIN->pui32Registers,
+ ui32RegisterArraySize) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: "
+ "CopyFromUserWrapper failed");
+ goto Exit;
+ }
+
+ PDumpTASignatureRegisters(psPDumpTASignatureRegistersIN->
+ ui32DumpFrameNum,
+ psPDumpTASignatureRegistersIN->
+ ui32TAKickCount,
+ psPDumpTASignatureRegistersIN->bLastFrame,
+ pui32Registers,
+ psPDumpTASignatureRegistersIN->
+ ui32NumRegisters);
+
+ExitNoError:
+ ret = 0;
+Exit:
+ if (pui32Registers != NULL)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
+ pui32Registers, NULL);
+
+ return ret;
+}
+
+int SGXPDumpHWPerfCBBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB *psPDumpHWPerfCBIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc)
+{
+ struct PVRSRV_SGXDEV_INFO *psDevInfo;
+ void *hDevCookieInt;
+
+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
+ PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB);
+
+ psRetOUT->eError =
+ PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
+ psPDumpHWPerfCBIN->hDevCookie,
+ PVRSRV_HANDLE_TYPE_DEV_NODE);
+ if (psRetOUT->eError != PVRSRV_OK)
+ return 0;
+
+ psDevInfo = ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
+
+ PDumpHWPerfCBKM(&psPDumpHWPerfCBIN->szFileName[0],
+ psPDumpHWPerfCBIN->ui32FileOffset,
+ psDevInfo->psKernelHWPerfCBMemInfo->sDevVAddr,
+ psDevInfo->psKernelHWPerfCBMemInfo->ui32AllocSize,
+ psPDumpHWPerfCBIN->ui32PDumpFlags);
+
+ return 0;
+}
+
+#endif
+
+void SetSGXDispatchTableEntry(void)
+{
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETCLIENTINFO,
+ SGXGetClientInfoBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO,
+ SGXReleaseClientInfoBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO,
+ SGXGetInternalDevInfoBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DOKICK, SGXDoKickBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR, DummyBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READREGISTRYDWORD, DummyBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULECOMMAND, DummyBW);
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE,
+ SGX2DQueryBlitsCompleteBW);
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMMUPDADDR, DummyBW);
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMITTRANSFER,
+ SGXSubmitTransferBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMISCINFO, SGXGetMiscInfoBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT,
+ SGXGetInfoForSrvinitBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DEVINITPART2,
+ SGXDevInitPart2BW);
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC,
+ SGXFindSharedPBDescBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC,
+ SGXUnrefSharedPBDescBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC,
+ SGXAddSharedPBDescBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT,
+ SGXRegisterHWRenderContextBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET,
+ SGXFlushHWRenderTargetBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT,
+ SGXUnregisterHWRenderContextBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT,
+ SGXRegisterHWTransferContextBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT,
+ SGXUnregisterHWTransferContextBW);
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS,
+ SGXReadDiffCountersBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_HWPERF_CB,
+ SGXReadHWPerfCBBW);
+
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES,
+ SGXScheduleProcessQueuesBW);
+
+#if defined(PDUMP)
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY,
+ SGXPDumpBufferArrayBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS,
+ SGXPDump3DSignatureRegistersBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS,
+ SGXPDumpCounterRegistersBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS,
+ SGXPDumpTASignatureRegistersBW);
+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB,
+ SGXPDumpHWPerfCBBW);
+#endif
+}
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#ifndef __BRIDGED_SGX_BRIDGE_H__
+#define __BRIDGED_SGX_BRIDGE_H__
+
+void SetSGXDispatchTableEntry(void);
+
+int SGXGetClientInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_GETCLIENTINFO *psGetClientInfoIN,
+ struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO *psGetClientInfoOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXReleaseClientInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO *psReleaseClientInfoIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXGetInternalDevInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO *psSGXGetInternalDevInfoIN,
+ struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO *psSGXGetInternalDevInfoOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXDoKickBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_DOKICK *psDoKickIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXScheduleProcessQueuesBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES *psScheduleProcQIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXSubmitTransferBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER *psSubmitTransferIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXGetMiscInfoBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXReadDiffCountersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS *psSGXReadDiffCountersIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_READ_DIFF_COUNTERS
+ *psSGXReadDiffCountersOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXReadHWPerfCBBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXDevInitPart2BW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXDEVINITPART2 *psSGXDevInitPart2IN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXRegisterHWRenderContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT
+ *psSGXRegHWRenderContextIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT
+ *psSGXRegHWRenderContextOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXUnregisterHWRenderContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT
+ *psSGXUnregHWRenderContextIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXRegisterHWTransferContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT
+ *psSGXRegHWTransferContextIN,
+ struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT
+ *psSGXRegHWTransferContextOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXUnregisterHWTransferContextBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT
+ *psSGXUnregHWTransferContextIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXFlushHWRenderTargetBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET
+ *psSGXFlushHWRenderTargetIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGX2DQueryBlitsCompleteBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXFindSharedPBDescBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescIN,
+ struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXUnrefSharedPBDescBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
+ struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC
+ *psSGXUnrefSharedPBDescOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXAddSharedPBDescBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
+ struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXGetInfoForSrvinitBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
+ struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+#if defined(PDUMP)
+int SGXPDumpBufferArrayBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXPDump3DSignatureRegistersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS
+ *psPDump3DSignatureRegistersIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXPDumpCounterRegistersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS
+ *psPDumpCounterRegistersIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXPDumpTASignatureRegistersBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS
+ *psPDumpTASignatureRegistersIN,
+ void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+int SGXPDumpHWPerfCBBW(u32 ui32BridgeID,
+ struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB *psPDumpHWPerfCBIN,
+ struct PVRSRV_BRIDGE_RETURN *psRetOUT,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc);
+
+#endif
+#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#include "img_defs.h"
+#include "servicesint.h"
+#include "bridged_support.h"
+
+enum PVRSRV_ERROR
+PVRSRVLookupOSMemHandle(struct PVRSRV_HANDLE_BASE *psHandleBase,
+ void **phOSMemHandle, void *hMHandle)
+{
+ void *hMHandleInt;
+ enum PVRSRV_HANDLE_TYPE eHandleType;
+ enum PVRSRV_ERROR eError;
+
+ eError = PVRSRVLookupHandleAnyType(psHandleBase, &hMHandleInt,
+ &eHandleType, hMHandle);
+ if (eError != PVRSRV_OK)
+ return eError;
+
+ switch (eHandleType) {
+ case PVRSRV_HANDLE_TYPE_MEM_INFO:
+ case PVRSRV_HANDLE_TYPE_MEM_INFO_REF:
+ case PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO:
+ {
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo =
+ (struct PVRSRV_KERNEL_MEM_INFO *)hMHandleInt;
+
+ *phOSMemHandle = psMemInfo->sMemBlk.hOSMemHandle;
+
+ break;
+ }
+ case PVRSRV_HANDLE_TYPE_SYNC_INFO:
+ {
+ struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)hMHandleInt;
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo =
+ psSyncInfo->psSyncDataMemInfoKM;
+
+ *phOSMemHandle = psMemInfo->sMemBlk.hOSMemHandle;
+
+ break;
+ }
+ case PVRSRV_HANDLE_TYPE_SOC_TIMER:
+ {
+ *phOSMemHandle = (void *)hMHandleInt;
+ break;
+ }
+ default:
+ return PVRSRV_ERROR_BAD_MAPPING;
+ }
+
+ return PVRSRV_OK;;
+}
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#ifndef __BRIDGED_SUPPORT_H__
+#define __BRIDGED_SUPPORT_H__
+
+#include "handle.h"
+
+enum PVRSRV_ERROR PVRSRVLookupOSMemHandle(struct PVRSRV_HANDLE_BASE *psBase,
+ void **phOSMemHandle, void *hMHandle);
+
+#endif
#include "ra.h"
#include "pdump_km.h"
-#include <linux/kernel.h>
-#include <linux/mm.h>
-
#define MIN(a, b) (a > b ? b : a)
static IMG_BOOL ZeroBuf(struct BM_BUF *pBuf, struct BM_MAPPING *pMapping,
u32 *pBase);
static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
- struct BM_MAPPING *pMapping, size_t *pActualSize, u32 uFlags,
+ struct BM_MAPPING *pMapping, u32 uFlags,
u32 dev_vaddr_alignment, struct IMG_DEV_VIRTADDR *pDevVAddr);
static void DevMemoryFree(struct BM_MAPPING *pMapping);
u32 uOffset;
struct RA_ARENA *pArena = NULL;
- PVR_DPF(PVR_DBG_MESSAGE, "AllocMemory (pBMContext=%08X, uSize=0x%x,"
- " uFlags=0x%x, align=0x%x, pBuf=%08X)",
+ PVR_DPF(PVR_DBG_MESSAGE, "AllocMemory "
+ "(pBMContext=%08X, uSize=0x%x, uFlags=0x%x, "
+ "align=0x%x, pBuf=%08X)",
pBMContext, uSize, uFlags, uDevVAddrAlignment, pBuf);
if (uFlags & PVRSRV_MEM_RAM_BACKED_ALLOCATION) {
if (uFlags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) {
-
PVR_DPF(PVR_DBG_ERROR, "AllocMemory: "
- "combination of DevVAddr management "
- "and RAM backing mode unsupported");
+ "combination of DevVAddr management and "
+ "RAM backing mode unsupported");
return IMG_FALSE;
}
- if (psBMHeap->ui32Attribs
- & (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG
- | PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG)) {
-
+ if (psBMHeap->ui32Attribs &
+ (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG |
+ PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG)) {
pArena = psBMHeap->pImportArena;
} else {
- PVR_DPF(PVR_DBG_ERROR, "AllocMemory: backing "
- "store type doesn't match heap");
+ PVR_DPF(PVR_DBG_ERROR, "AllocMemory: "
+ "backing store type doesn't match heap");
return IMG_FALSE;
}
- if (!RA_Alloc(pArena,
- uSize,
- NULL,
- (void *)&pMapping,
- uFlags,
+ if (!RA_Alloc(pArena, uSize, (void *)&pMapping, uFlags,
uDevVAddrAlignment,
- 0, (u32 *) &(pBuf->DevVAddr.uiAddr))) {
+ (u32 *)&(pBuf->DevVAddr.uiAddr))) {
PVR_DPF(PVR_DBG_ERROR,
"AllocMemory: RA_Alloc(0x%x) FAILED", uSize);
return IMG_FALSE;
}
uOffset = pBuf->DevVAddr.uiAddr - pMapping->DevVAddr.uiAddr;
- if (pMapping->CpuVAddr)
+ if (pMapping->CpuVAddr) {
pBuf->CpuVAddr =
- (void *)((u32) pMapping->CpuVAddr +
- uOffset);
- else
+ (void *)((u32) pMapping->CpuVAddr + uOffset);
+ } else {
pBuf->CpuVAddr = NULL;
+ }
if (uSize == pMapping->uSize) {
pBuf->hOSMemHandle = pMapping->hOSMemHandle;
}
}
- pBuf->CpuPAddr = pMapping->CpuPAddr;
+ pBuf->CpuPAddr.uiAddr = pMapping->CpuPAddr.uiAddr + uOffset;
if (uFlags & PVRSRV_MEM_ZERO)
- if (!ZeroBuf
- (pBuf, pMapping, uSize,
- psBMHeap->ui32Attribs | uFlags))
+ if (!ZeroBuf(pBuf, pMapping, uSize,
+ psBMHeap->ui32Attribs | uFlags))
return IMG_FALSE;
} else {
if (uFlags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) {
-
PVR_ASSERT(psDevVAddr != NULL);
- pBMContext->psDeviceNode->pfnMMUAlloc(psBMHeap->
- pMMUHeap, uSize, NULL,
+ if (psDevVAddr == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "AllocMemory: "
+ "invalid parameter - psDevVAddr");
+ return IMG_FALSE;
+ }
+
+ pBMContext->psDeviceNode->pfnMMUAlloc(
+ psBMHeap->pMMUHeap, uSize,
PVRSRV_MEM_USER_SUPPLIED_DEVVADDR,
uDevVAddrAlignment, psDevVAddr);
pBuf->DevVAddr = *psDevVAddr;
} else {
-
pBMContext->psDeviceNode->pfnMMUAlloc(psBMHeap->
- pMMUHeap, uSize,
- NULL, 0,
+ pMMUHeap, uSize, 0,
uDevVAddrAlignment,
&pBuf->DevVAddr);
}
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct BM_MAPPING),
- (void **) &pMapping, NULL) != PVRSRV_OK) {
+ (void **)&pMapping, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
"AllocMemory: OSAllocMem(0x%x) FAILED");
return IMG_FALSE;
pBuf->pMapping = pMapping;
PVR_DPF(PVR_DBG_MESSAGE, "AllocMemory: "
- "pMapping=%08X: DevV=%08X CpuV=%08X CpuP=%08X uSize=0x%x",
+ "pMapping=%08X: DevV=%08X CpuV=%08X CpuP=%08X uSize=0x%x",
pMapping, pMapping->DevVAddr.uiAddr, pMapping->CpuVAddr,
pMapping->CpuPAddr.uiAddr, pMapping->uSize);
uSize += ui32BaseOffset;
uSize = HOST_PAGEALIGN(uSize);
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(*pMapping),
- (void **) &pMapping, NULL) != PVRSRV_OK) {
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*pMapping),
+ (void **)&pMapping, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "WrapMemory: OSAllocMem(0x%x) FAILED",
sizeof(*pMapping));
return IMG_FALSE;
if (OSRegisterMem(pMapping->CpuPAddr,
pMapping->CpuVAddr, pMapping->uSize,
- uFlags,
- &pMapping->hOSMemHandle) != PVRSRV_OK) {
+ uFlags, &pMapping->hOSMemHandle) !=
+ PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "WrapMemory: "
"OSRegisterMem Phys=0x%08X, "
"CpuVAddr = 0x%08X, Size=%d) failed",
&pMapping->hOSMemHandle) !=
PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "WrapMemory: "
- "OSRegisterDiscontigMem "
- "CpuVAddr = 0x%08X, Size=%d) failed",
+ "OSRegisterDiscontigMem CpuVAddr = "
+ "0x%08X, Size=%d) failed",
pMapping->CpuVAddr, pMapping->uSize);
goto fail_cleanup;
}
uFlags, &pMapping->CpuVAddr,
&pMapping->hOSMemHandle) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "WrapMemory: "
- "OSReservePhys Phys=0x%08X, "
- "Size=%d) failed",
+ "OSReservePhys Phys=0x%08X, Size=%d) "
+ "failed",
pMapping->CpuPAddr, pMapping->uSize);
goto fail_cleanup;
}
pMapping->psSysAddr = psAddr;
if (OSReserveDiscontigPhys(pMapping->psSysAddr,
- pMapping->uSize,
- uFlags,
+ pMapping->uSize, uFlags,
&pMapping->CpuVAddr,
&pMapping->hOSMemHandle) !=
PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "WrapMemory: "
- "OSReserveDiscontigPhys Size=%d) "
- "failed",
+ "OSReserveDiscontigPhys Size=%d) failed",
pMapping->uSize);
goto fail_cleanup;
}
}
}
- bResult = DevMemoryAlloc(psBMHeap->pBMContext,
- pMapping,
- NULL,
+ bResult = DevMemoryAlloc(psBMHeap->pBMContext, pMapping,
uFlags | PVRSRV_MEM_READ | PVRSRV_MEM_WRITE,
ui32PageSize, &DevVAddr);
if (!bResult) {
goto fail_cleanup;
}
if (pMapping->CpuVAddr)
- pBuf->CpuVAddr =
- (void *)((u32) pMapping->CpuVAddr +
- ui32BaseOffset);
+ pBuf->CpuVAddr = (void *)((u32) pMapping->CpuVAddr +
+ ui32BaseOffset);
pBuf->DevVAddr.uiAddr = pMapping->DevVAddr.uiAddr + ui32BaseOffset;
if (uFlags & PVRSRV_MEM_ZERO)
return IMG_FALSE;
PVR_DPF(PVR_DBG_MESSAGE, "DevVaddr.uiAddr=%08X", DevVAddr.uiAddr);
- PVR_DPF(PVR_DBG_MESSAGE, "WrapMemory: pMapping=%08X: "
- "DevV=%08X CpuV=%08X CpuP=%08X uSize=0x%x",
- pMapping, pMapping->DevVAddr.uiAddr,
- pMapping->CpuVAddr, pMapping->CpuPAddr.uiAddr,
- pMapping->uSize);
- PVR_DPF(PVR_DBG_MESSAGE, "WrapMemory: "
- "pBuf=%08X: DevV=%08X CpuV=%08X CpuP=%08X "
- "uSize=0x%x",
+ PVR_DPF(PVR_DBG_MESSAGE, "WrapMemory: pMapping=%08X: DevV=%08X "
+ "CpuV=%08X CpuP=%08X uSize=0x%x",
+ pMapping, pMapping->DevVAddr.uiAddr, pMapping->CpuVAddr,
+ pMapping->CpuPAddr.uiAddr, pMapping->uSize);
+ PVR_DPF(PVR_DBG_MESSAGE, "WrapMemory: pBuf=%08X: DevV=%08X "
+ "CpuV=%08X CpuP=%08X uSize=0x%x",
pBuf, pBuf->DevVAddr.uiAddr, pBuf->CpuVAddr,
pBuf->CpuPAddr.uiAddr, uSize);
if (pBuf->CpuVAddr) {
OSMemSet(pBuf->CpuVAddr, 0, ui32Bytes);
- } else if (pMapping->eCpuMemoryOrigin == hm_contiguous
- || pMapping->eCpuMemoryOrigin == hm_wrapped) {
+ } else if (pMapping->eCpuMemoryOrigin == hm_contiguous ||
+ pMapping->eCpuMemoryOrigin == hm_wrapped) {
pvCpuVAddr = (void __force *)OSMapPhysToLin(pBuf->CpuPAddr,
ui32Bytes,
PVRSRV_HAP_KERNEL_ONLY |
return IMG_FALSE;
}
OSMemSet(pvCpuVAddr, 0, ui32Bytes);
- OSUnMapPhysToLin((void __force __iomem *)pvCpuVAddr,
- ui32Bytes,
- PVRSRV_HAP_KERNEL_ONLY
- | (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK),
+ OSUnMapPhysToLin((void __force __iomem *)pvCpuVAddr, ui32Bytes,
+ PVRSRV_HAP_KERNEL_ONLY |
+ (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK),
NULL);
} else {
u32 ui32BytesRemaining = ui32Bytes;
pvCpuVAddr = (void __force *)OSMapPhysToLin(CpuPAddr,
ui32BlockBytes,
PVRSRV_HAP_KERNEL_ONLY |
- (ui32Flags &
- PVRSRV_HAP_CACHETYPE_MASK),
+ (ui32Flags &
+ PVRSRV_HAP_CACHETYPE_MASK),
NULL);
if (!pvCpuVAddr) {
PVR_DPF(PVR_DBG_ERROR, "ZeroBuf: "
OSMemSet(pvCpuVAddr, 0, ui32BlockBytes);
OSUnMapPhysToLin((void __force __iomem *)pvCpuVAddr,
ui32BlockBytes,
- PVRSRV_HAP_KERNEL_ONLY
- | (ui32Flags &
+ PVRSRV_HAP_KERNEL_ONLY |
+ (ui32Flags &
PVRSRV_HAP_CACHETYPE_MASK),
NULL);
{
struct BM_MAPPING *pMapping;
- PVR_DPF(PVR_DBG_MESSAGE, "FreeBuf: "
- "pBuf=%08X: DevVAddr=%08X CpuVAddr=%08X CpuPAddr=%08X",
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "FreeBuf: pBuf=%08X: DevVAddr=%08X CpuVAddr=%08X CpuPAddr=%08X",
pBuf, pBuf->DevVAddr.uiAddr, pBuf->CpuVAddr,
pBuf->CpuPAddr.uiAddr);
pMapping = pBuf->pMapping;
if (ui32Flags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) {
-
if (ui32Flags & PVRSRV_MEM_RAM_BACKED_ALLOCATION)
-
PVR_DPF(PVR_DBG_ERROR, "FreeBuf: "
"combination of DevVAddr management "
"and RAM backing mode unsupported");
else
-
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct BM_MAPPING),
pMapping, NULL);
} else {
-
if (pBuf->hOSMemHandle != pMapping->hOSMemHandle)
OSReleaseSubMemHandle(pBuf->hOSMemHandle, ui32Flags);
if (ui32Flags & PVRSRV_MEM_RAM_BACKED_ALLOCATION) {
-
RA_Free(pBuf->pMapping->pArena, pBuf->DevVAddr.uiAddr,
IMG_FALSE);
} else {
void BM_DestroyContext(void *hBMContext)
{
struct BM_CONTEXT *pBMContext = (struct BM_CONTEXT *)hBMContext;
+ struct BM_HEAP *psBMHeap;
PVR_DPF(PVR_DBG_MESSAGE, "BM_DestroyContext");
+ for (psBMHeap = pBMContext->psBMHeap;
+ psBMHeap != NULL; psBMHeap = psBMHeap->psNext)
+ if (psBMHeap->ui32Attribs &
+ (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG |
+ PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG))
+ if (psBMHeap->pImportArena) {
+ IMG_BOOL bTestDelete =
+ RA_TestDelete(psBMHeap->pImportArena);
+ BUG_ON(!bTestDelete);
+ }
+
ResManFreeResByPtr(pBMContext->hResItem);
}
psBMHeap = pBMContext->psBMHeap;
while (psBMHeap) {
-
- if (psBMHeap->ui32Attribs
- & (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG
- | PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG)) {
+ if (psBMHeap->ui32Attribs &
+ (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG |
+ PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG)) {
if (psBMHeap->pImportArena)
RA_Delete(psBMHeap->pImportArena);
} else {
PVR_DPF(PVR_DBG_ERROR, "BM_DestroyContext: "
- "backing store type unsupported");
+ "backing store type unsupported");
return PVRSRV_ERROR_GENERIC;
}
HASH_Delete(pBMContext->pBufferHash);
if (pBMContext == psDeviceNode->sDevMemoryInfo.pBMKernelContext) {
-
psDeviceNode->sDevMemoryInfo.pBMKernelContext = NULL;
} else {
-
for (ppBMContext = &psDeviceNode->sDevMemoryInfo.pBMContext;
*ppBMContext; ppBMContext = &((*ppBMContext)->psNext))
if (*ppBMContext == pBMContext) {
-
*ppBMContext = pBMContext->psNext;
-
break;
}
}
if (bKernelContext == IMG_FALSE)
for (pBMContext = psDevMemoryInfo->pBMContext;
pBMContext != NULL; pBMContext = pBMContext->psNext)
- if (ResManFindResourceByPtr
- (hResManContext,
- pBMContext->hResItem) == PVRSRV_OK) {
-
+ if (ResManFindResourceByPtr(hResManContext,
+ pBMContext->hResItem) ==
+ PVRSRV_OK) {
pBMContext->ui32RefCount++;
-
return (void *)pBMContext;
}
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct BM_CONTEXT),
- (void **) &pBMContext, NULL) != PVRSRV_OK) {
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_CONTEXT),
+ (void **)&pBMContext, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "BM_CreateContext: Alloc failed");
return NULL;
}
} else {
PVR_ASSERT(psDevMemoryInfo->pBMKernelContext);
+
+ if (psDevMemoryInfo->pBMKernelContext == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "BM_CreateContext: "
+ "psDevMemoryInfo->pBMKernelContext invalid");
+ goto cleanup;
+ }
+
PVR_ASSERT(psDevMemoryInfo->pBMKernelContext->psBMHeap);
pBMContext->psBMSharedHeap =
case DEVICE_MEMORY_HEAP_SHARED:
case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
{
-
psDeviceNode->
pfnMMUInsertHeap(pBMContext->
- psMMUContext,
+ psMMUContext,
psBMHeap->
- pMMUHeap);
+ pMMUHeap);
break;
}
}
-
psBMHeap = psBMHeap->psNext;
}
-
pBMContext->psNext = psDevMemoryInfo->pBMContext;
psDevMemoryInfo->pBMContext = pBMContext;
}
-
pBMContext->ui32RefCount++;
-
pBMContext->hResItem = ResManRegisterRes(hResManContext,
RESMAN_TYPE_DEVICEMEM_CONTEXT,
pBMContext,
}
}
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct BM_HEAP),
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_HEAP),
(void **) &psBMHeap, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "BM_CreateHeap: Alloc failed");
return NULL;
psBMHeap->sDevArena.BaseDevVAddr = psDevMemHeapInfo->sDevVAddrBase;
psBMHeap->sDevArena.ui32Size = psDevMemHeapInfo->ui32HeapSize;
psBMHeap->sDevArena.DevMemHeapType = psDevMemHeapInfo->DevMemHeapType;
+ psBMHeap->sDevArena.ui32DataPageSize =
+ psDevMemHeapInfo->ui32DataPageSize;
psBMHeap->sDevArena.psDeviceMemoryHeapInfo = psDevMemHeapInfo;
psBMHeap->ui32Attribs = psDevMemHeapInfo->ui32Attribs;
psBMHeap->pImportArena = RA_Create(psDevMemHeapInfo->pszBSName,
0, 0, NULL,
- HOST_PAGESIZE(),
+ psBMHeap->sDevArena.ui32DataPageSize,
BM_ImportMemory,
BM_FreeMemory, NULL, psBMHeap);
if (psBMHeap->pImportArena == NULL) {
if (psBMHeap) {
struct BM_HEAP **ppsBMHeap;
- if (psBMHeap->ui32Attribs
- & (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG
- | PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG)) {
+ if (psBMHeap->ui32Attribs &
+ (PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG |
+ PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG)) {
if (psBMHeap->pImportArena)
RA_Delete(psBMHeap->pImportArena);
} else {
- PVR_DPF(PVR_DBG_ERROR, "BM_DestroyHeap: "
- "backing store type unsupported");
+ PVR_DPF(PVR_DBG_ERROR,
+ "BM_DestroyHeap: backing store type unsupported");
return;
}
ppsBMHeap = &psBMHeap->pBMContext->psBMHeap;
while (*ppsBMHeap) {
if (*ppsBMHeap == psBMHeap) {
-
*ppsBMHeap = psBMHeap->psNext;
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct BM_HEAP), psBMHeap,
return IMG_TRUE;
}
-IMG_BOOL BM_Alloc(void *hDevMemHeap,
- struct IMG_DEV_VIRTADDR *psDevVAddr,
- size_t uSize,
- u32 *pui32Flags,
- u32 uDevVAddrAlignment, void **phBuf)
+IMG_BOOL BM_Alloc(void *hDevMemHeap, struct IMG_DEV_VIRTADDR *psDevVAddr,
+ size_t uSize, u32 *pui32Flags, u32 uDevVAddrAlignment,
+ void **phBuf)
{
struct BM_BUF *pBuf;
struct BM_CONTEXT *pBMContext;
struct BM_HEAP *psBMHeap;
struct SYS_DATA *psSysData;
- u32 uFlags = 0;
+ u32 uFlags;
- if (pui32Flags)
- uFlags = *pui32Flags;
+ if (pui32Flags == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "BM_Alloc: invalid parameter");
+ PVR_DBG_BREAK;
+ return IMG_FALSE;
+ }
+
+ uFlags = *pui32Flags;
PVR_DPF(PVR_DBG_MESSAGE,
"BM_Alloc (uSize=0x%x, uFlags=0x%x, uDevVAddrAlignment=0x%x)",
if (uDevVAddrAlignment == 0)
uDevVAddrAlignment = 1;
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct BM_BUF),
- (void **) &pBuf, NULL) != PVRSRV_OK) {
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_BUF),
+ (void **)&pBuf, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "BM_Alloc: BM_Buf alloc FAILED");
return IMG_FALSE;
}
OSMemSet(pBuf, 0, sizeof(struct BM_BUF));
- if (AllocMemory(pBMContext,
- psBMHeap,
- psDevVAddr,
- uSize, uFlags, uDevVAddrAlignment, pBuf) != IMG_TRUE) {
+ if (AllocMemory(pBMContext, psBMHeap, psDevVAddr, uSize, uFlags,
+ uDevVAddrAlignment, pBuf) != IMG_TRUE) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_BUF), pBuf,
NULL);
PVR_DPF(PVR_DBG_ERROR, "BM_Alloc: AllocMemory FAILED");
return IMG_FALSE;
}
- PVR_DPF(PVR_DBG_MESSAGE,
- "BM_Alloc (uSize=0x%x, uFlags=0x%x)=%08X",
+ PVR_DPF(PVR_DBG_MESSAGE, "BM_Alloc (uSize=0x%x, uFlags=0x%x)=%08X",
uSize, uFlags, pBuf);
pBuf->ui32RefCount = 1;
return IMG_TRUE;
}
-static struct BM_BUF *bm_get_buf(void *heap_handle,
- struct IMG_SYS_PHYADDR start, u32 offset)
-{
- struct BM_BUF *buf;
- struct BM_CONTEXT *context;
- struct BM_HEAP *heap;
-
- heap = heap_handle;
- context = heap->pBMContext;
- start.uiAddr += offset;
- buf = (struct BM_BUF *)HASH_Retrieve(context->pBufferHash,
- start.uiAddr);
-
- return buf;
-}
-
-struct BM_BUF *bm_get_buf_virt(void *heap_handle, void *virt_start)
-{
- struct BM_BUF *buf;
- struct IMG_SYS_PHYADDR paddr;
- void *wrap_mem;
- unsigned long offset;
-
- offset = (unsigned long)virt_start & ~PAGE_MASK;
- virt_start = (void *)((unsigned long)virt_start & PAGE_MASK);
-
- if (OSAcquirePhysPageAddr(virt_start, PAGE_SIZE, &paddr,
- &wrap_mem, IMG_FALSE) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "%s: failed to get physical address for BM_BUF",
- __func__);
- return NULL;
- }
- buf = bm_get_buf(heap_handle, paddr, offset);
- OSReleasePhysPageAddr(wrap_mem, IMG_FALSE);
-
- return buf;
-}
-
-IMG_BOOL BM_IsWrapped(void *hDevMemHeap, u32 ui32Offset,
- struct IMG_SYS_PHYADDR sSysAddr)
-{
- return bm_get_buf(hDevMemHeap, sSysAddr, ui32Offset) ?
- IMG_TRUE : IMG_FALSE;
-}
-
IMG_BOOL BM_Wrap(void *hDevMemHeap, u32 ui32Size, u32 ui32Offset,
- IMG_BOOL bPhysContig, struct IMG_SYS_PHYADDR *psSysAddr,
- IMG_BOOL bFreePageList, void *pvCPUVAddr, u32 *pui32Flags, void **phBuf)
+ IMG_BOOL bPhysContig, struct IMG_SYS_PHYADDR *psSysAddr,
+ void *pvCPUVAddr, u32 *pui32Flags, void **phBuf)
{
struct BM_BUF *pBuf;
struct BM_CONTEXT *psBMContext;
psBMHeap = (struct BM_HEAP *)hDevMemHeap;
psBMContext = psBMHeap->pBMContext;
- uFlags =
- psBMHeap->
- ui32Attribs & (PVRSRV_HAP_CACHETYPE_MASK | PVRSRV_HAP_MAPTYPE_MASK);
+ uFlags = psBMHeap->ui32Attribs &
+ (PVRSRV_HAP_CACHETYPE_MASK | PVRSRV_HAP_MAPTYPE_MASK);
if (pui32Flags)
uFlags |= *pui32Flags;
u32 ui32MappingSize =
HOST_PAGEALIGN(ui32Size + ui32Offset);
- if (pBuf->pMapping->uSize == ui32MappingSize
- && (pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped
- || pBuf->pMapping->eCpuMemoryOrigin ==
- hm_wrapped_virtaddr
- || pBuf->pMapping->eCpuMemoryOrigin ==
- hm_wrapped_scatter)) {
- PVR_DPF(PVR_DBG_MESSAGE,
- "BM_Wrap (Matched previous Wrap! "
- "uSize=0x%x, uOffset=0x%x, SysAddr=%08X)",
+ if (pBuf->pMapping->uSize == ui32MappingSize &&
+ (pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped ||
+ pBuf->pMapping->eCpuMemoryOrigin ==
+ hm_wrapped_virtaddr)) {
+ PVR_DPF(PVR_DBG_MESSAGE, "BM_Wrap "
+ "(Matched previous Wrap! uSize=0x%x, "
+ "uOffset=0x%x, SysAddr=%08X)",
ui32Size, ui32Offset, sHashAddress.uiAddr);
pBuf->ui32RefCount++;
- *phBuf = (void *) pBuf;
+ *phBuf = (void *)pBuf;
if (pui32Flags)
*pui32Flags = uFlags;
- /* reusing previous mapping, free the page list */
- if (bFreePageList && psSysAddr)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32MappingSize / HOST_PAGESIZE() *
- sizeof(struct IMG_SYS_PHYADDR),
- (void *)psSysAddr, NULL);
return IMG_TRUE;
}
}
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct BM_BUF),
- (void **) &pBuf, NULL) != PVRSRV_OK) {
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_BUF),
+ (void **)&pBuf, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "BM_Wrap: BM_Buf alloc FAILED");
return IMG_FALSE;
}
OSMemSet(pBuf, 0, sizeof(struct BM_BUF));
- if (WrapMemory
- (psBMHeap, ui32Size, ui32Offset, bPhysContig, psSysAddr, pvCPUVAddr,
- uFlags, pBuf) != IMG_TRUE) {
+ if (WrapMemory(psBMHeap, ui32Size, ui32Offset, bPhysContig, psSysAddr,
+ pvCPUVAddr, uFlags, pBuf) != IMG_TRUE) {
PVR_DPF(PVR_DBG_ERROR, "BM_Wrap: WrapMemory FAILED");
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_BUF), pBuf,
NULL);
return IMG_FALSE;
}
- if (pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped
- || pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped_virtaddr
- || pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped_scatter) {
- pBuf->uHashKey = (u32) sHashAddress.uiAddr;
- if (!HASH_Insert
- (psBMContext->pBufferHash, pBuf->uHashKey,
- (u32) pBuf)) {
+ if (pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped ||
+ pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped_virtaddr) {
+
+ PVR_ASSERT(SysSysPAddrToCpuPAddr(sHashAddress).uiAddr ==
+ pBuf->CpuPAddr.uiAddr);
+
+ if (!HASH_Insert(psBMContext->pBufferHash,
+ (u32)sHashAddress.uiAddr, (u32) pBuf)) {
FreeBuf(pBuf, uFlags);
PVR_DPF(PVR_DBG_ERROR, "BM_Wrap: HASH_Insert FAILED");
return IMG_FALSE;
pvr_get_ctx(psBMContext);
*phBuf = (void *) pBuf;
if (pui32Flags)
- *pui32Flags = uFlags;
+ *pui32Flags = (uFlags & ~PVRSRV_HAP_MAPTYPE_MASK) |
+ PVRSRV_HAP_MULTI_PROCESS;
- /* take ownership of the list if requested so */
- if (bFreePageList && psSysAddr)
- pBuf->pvPageList = (void *)psSysAddr;
return IMG_TRUE;
}
{
struct BM_BUF *pBuf = (struct BM_BUF *)hBuf;
struct SYS_DATA *psSysData;
+ struct IMG_SYS_PHYADDR sHashAddr;
PVR_DPF(PVR_DBG_MESSAGE, "BM_Free (h=%08X)", hBuf);
- /*
- Calling BM_Free with NULL hBuf is either a bug or
- out-of-memory condition.
- Bail out if in debug mode, continue in release builds
- */
PVR_ASSERT(pBuf != NULL);
-#if !defined(DEBUG)
- if (!pBuf)
+
+ if (pBuf == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "BM_Free: invalid parameter");
return;
-#endif
+ }
if (SysAcquireData(&psSysData) != PVRSRV_OK)
return;
if (pBuf->ui32RefCount == 0) {
struct BM_MAPPING *map = pBuf->pMapping;
struct BM_CONTEXT *ctx = map->pBMHeap->pBMContext;
- void *pPageList = pBuf->pvPageList;
- u32 ui32ListSize = map->uSize / HOST_PAGESIZE() *
- sizeof(struct IMG_SYS_PHYADDR);
- if (map->eCpuMemoryOrigin == hm_wrapped
- || map->eCpuMemoryOrigin == hm_wrapped_virtaddr
- || map->eCpuMemoryOrigin == hm_wrapped_scatter)
- HASH_Remove(ctx->pBufferHash, pBuf->uHashKey);
+
+ if (map->eCpuMemoryOrigin == hm_wrapped ||
+ map->eCpuMemoryOrigin == hm_wrapped_virtaddr) {
+ sHashAddr = SysCpuPAddrToSysPAddr(pBuf->CpuPAddr);
+
+ HASH_Remove(ctx->pBufferHash, (u32)sHashAddr.uiAddr);
+ }
FreeBuf(pBuf, ui32Flags);
pvr_put_ctx(ctx);
- if (pPageList)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32ListSize,
- pPageList, NULL);
}
}
struct BM_BUF *pBuf = (struct BM_BUF *)hBuf;
PVR_ASSERT(pBuf != NULL);
+ if (pBuf == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "BM_HandleToCpuVaddr: invalid parameter");
+ return NULL;
+ }
+
PVR_DPF(PVR_DBG_MESSAGE,
"BM_HandleToCpuVaddr(h=%08X)=%08X", hBuf, pBuf->CpuVAddr);
return pBuf->CpuVAddr;
struct BM_BUF *pBuf = (struct BM_BUF *)hBuf;
PVR_ASSERT(pBuf != NULL);
+ if (pBuf == NULL) {
+ struct IMG_DEV_VIRTADDR DevVAddr = { 0 };
+ PVR_DPF(PVR_DBG_ERROR,
+ "BM_HandleToDevVaddr: invalid parameter");
+ return DevVAddr;
+ }
+
PVR_DPF(PVR_DBG_MESSAGE, "BM_HandleToDevVaddr(h=%08X)=%08X", hBuf,
pBuf->DevVAddr);
return pBuf->DevVAddr;
struct BM_BUF *pBuf = (struct BM_BUF *)hBuf;
PVR_ASSERT(pBuf != NULL);
+
+ if (pBuf == NULL) {
+ struct IMG_SYS_PHYADDR PhysAddr = { 0 };
+ PVR_DPF(PVR_DBG_ERROR,
+ "BM_HandleToSysPaddr: invalid parameter");
+ return PhysAddr;
+ }
+
PVR_DPF(PVR_DBG_MESSAGE, "BM_HandleToSysPaddr(h=%08X)=%08X", hBuf,
pBuf->CpuPAddr.uiAddr);
return SysCpuPAddrToSysPAddr(pBuf->CpuPAddr);
PVR_ASSERT(pBuf != NULL);
+ if (pBuf == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "BM_HandleToOSMemHandle: invalid parameter");
+ return NULL;
+ }
+
PVR_DPF(PVR_DBG_MESSAGE,
"BM_HandleToOSMemHandle(h=%08X)=%08X",
hBuf, pBuf->hOSMemHandle);
return pBuf->hOSMemHandle;
}
-IMG_BOOL BM_ContiguousStatistics(u32 uFlags,
- u32 *pTotalBytes, u32 *pAvailableBytes)
+IMG_BOOL BM_ContiguousStatistics(u32 uFlags, u32 *pTotalBytes,
+ u32 *pAvailableBytes)
{
if (pAvailableBytes || pTotalBytes || uFlags)
;
}
static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
- struct BM_MAPPING *pMapping, size_t *pActualSize, u32 uFlags,
- u32 dev_vaddr_alignment, struct IMG_DEV_VIRTADDR *pDevVAddr)
+ struct BM_MAPPING *pMapping, u32 uFlags, u32 dev_vaddr_alignment,
+ struct IMG_DEV_VIRTADDR *pDevVAddr)
{
struct PVRSRV_DEVICE_NODE *psDeviceNode;
#ifdef PDUMP
#ifdef PDUMP
if (uFlags & PVRSRV_MEM_DUMMY)
- ui32PDumpSize = HOST_PAGESIZE();
+ ui32PDumpSize = pMapping->pBMHeap->sDevArena.ui32DataPageSize;
#endif
if (!psDeviceNode->pfnMMUAlloc(pMapping->pBMHeap->pMMUHeap,
- pMapping->uSize, pActualSize,
- 0, dev_vaddr_alignment,
+ pMapping->uSize, 0, dev_vaddr_alignment,
&(pMapping->DevVAddr))) {
PVR_DPF(PVR_DBG_ERROR, "DevMemoryAlloc ERROR MMU_Alloc");
return IMG_FALSE;
PDUMPMALLOCPAGES(psDeviceNode->sDevId.eDeviceType,
pMapping->DevVAddr.uiAddr, pMapping->CpuVAddr,
pMapping->hOSMemHandle, ui32PDumpSize,
+ pMapping->pBMHeap->sDevArena.ui32DataPageSize,
(void *)pMapping);
switch (pMapping->eCpuMemoryOrigin) {
case hm_contiguous:
{
psDeviceNode->pfnMMUMapPages(pMapping->pBMHeap->
- pMMUHeap,
+ pMMUHeap,
pMapping->DevVAddr,
SysCpuPAddrToSysPAddr
- (pMapping->CpuPAddr),
+ (pMapping->CpuPAddr),
pMapping->uSize, uFlags,
(void *)pMapping);
case hm_env:
{
psDeviceNode->pfnMMUMapShadow(pMapping->pBMHeap->
- pMMUHeap,
+ pMMUHeap,
pMapping->DevVAddr,
pMapping->uSize,
pMapping->CpuVAddr,
case hm_wrapped_scatter_virtaddr:
{
psDeviceNode->pfnMMUMapScatter(pMapping->pBMHeap->
- pMMUHeap,
+ pMMUHeap,
pMapping->DevVAddr,
pMapping->psSysAddr,
pMapping->uSize, uFlags,
#ifdef PDUMP
if (pMapping->ui32Flags & PVRSRV_MEM_DUMMY)
-
- ui32PSize = HOST_PAGESIZE();
+ ui32PSize = pMapping->pBMHeap->sDevArena.ui32DataPageSize;
else
ui32PSize = pMapping->uSize;
- PDUMPFREEPAGES(pMapping->pBMHeap, pMapping->DevVAddr,
- ui32PSize, (void *) pMapping,
- (IMG_BOOL) (pMapping->
+ PDUMPFREEPAGES(pMapping->pBMHeap, pMapping->DevVAddr, ui32PSize,
+ pMapping->pBMHeap->sDevArena.ui32DataPageSize,
+ (void *)pMapping, (IMG_BOOL)(pMapping->
ui32Flags & PVRSRV_MEM_INTERLEAVED));
#endif
size_t uPSize;
u32 uDevVAddrAlignment = 0;
- PVR_DPF(PVR_DBG_MESSAGE, "BM_ImportMemory (pBMContext=%08X, "
- "uRequestSize=0x%x, uFlags=0x%x, uAlign=0x%x)",
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "BM_ImportMemory (pBMContext=%08X, uRequestSize=0x%x, "
+ "uFlags=0x%x, uAlign=0x%x)",
pBMContext, uRequestSize, uFlags, uDevVAddrAlignment);
PVR_ASSERT(ppsMapping != NULL);
PVR_ASSERT(pBMContext != NULL);
+ if (ppsMapping == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "BM_ImportMemory: invalid parameter");
+ goto fail_exit;
+ }
+
uSize = HOST_PAGEALIGN(uRequestSize);
PVR_ASSERT(uSize >= uRequestSize);
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct BM_MAPPING),
- (void **) &pMapping, NULL) != PVRSRV_OK) {
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BM_MAPPING),
+ (void **)&pMapping, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "BM_ImportMemory: failed to alloc mapping object");
+ "BM_ImportMemory: failed struct BM_MAPPING alloc");
goto fail_exit;
}
*pActualSize = uSize;
if (pMapping->ui32Flags & PVRSRV_MEM_DUMMY)
- uPSize = HOST_PAGESIZE();
+ uPSize = pBMHeap->sDevArena.ui32DataPageSize;
else
uPSize = pMapping->uSize;
if (pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) {
-
- if (OSAllocPages(pBMHeap->ui32Attribs,
- uPSize,
- (void **) &pMapping->CpuVAddr,
+ if (OSAllocPages(pBMHeap->ui32Attribs, uPSize,
+ pBMHeap->sDevArena.ui32DataPageSize,
+ (void **)&pMapping->CpuVAddr,
&pMapping->hOSMemHandle) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
"BM_ImportMemory: OSAllocPages(0x%x) failed",
PVR_ASSERT(pBMHeap->pLocalDevMemArena != NULL);
- if (!RA_Alloc(pBMHeap->pLocalDevMemArena,
- uPSize,
- NULL,
- NULL,
- 0,
- HOST_PAGESIZE(),
- 0, (u32 *) &sSysPAddr.uiAddr)) {
+ if (!RA_Alloc(pBMHeap->pLocalDevMemArena, uPSize, NULL, 0,
+ pBMHeap->sDevArena.ui32DataPageSize,
+ (u32 *)&sSysPAddr.uiAddr)) {
PVR_DPF(PVR_DBG_ERROR,
"BM_ImportMemory: RA_Alloc(0x%x) FAILED",
uPSize);
}
pMapping->CpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr);
- if (OSReservePhys(pMapping->CpuPAddr,
- uPSize,
- pBMHeap->ui32Attribs,
- &pMapping->CpuVAddr,
+ if (OSReservePhys(pMapping->CpuPAddr, uPSize,
+ pBMHeap->ui32Attribs, &pMapping->CpuVAddr,
&pMapping->hOSMemHandle) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
"BM_ImportMemory: OSReservePhys failed");
goto fail_mapping_alloc;
}
- bResult = DevMemoryAlloc(pBMContext, pMapping, NULL, uFlags,
+ bResult = DevMemoryAlloc(pBMContext, pMapping, uFlags,
uDevVAddrAlignment, &pMapping->DevVAddr);
if (!bResult) {
PVR_DPF(PVR_DBG_ERROR,
goto fail_dev_mem_alloc;
}
- PVR_ASSERT(uDevVAddrAlignment >
- 1 ? (pMapping->DevVAddr.uiAddr % uDevVAddrAlignment) ==
- 0 : 1);
+ PVR_ASSERT(uDevVAddrAlignment > 1 ?
+ (pMapping->DevVAddr.uiAddr % uDevVAddrAlignment) == 0 : 1);
*pBase = pMapping->DevVAddr.uiAddr;
*ppsMapping = pMapping;
- PVR_DPF(PVR_DBG_MESSAGE, "BM_ImportMemory: success");
+ PVR_DPF(PVR_DBG_MESSAGE, "BM_ImportMemory: IMG_TRUE");
return IMG_TRUE;
fail_dev_mem_alloc:
if (pMapping && (pMapping->CpuVAddr || pMapping->hOSMemHandle)) {
-
if (pMapping->ui32Flags & PVRSRV_MEM_INTERLEAVED)
pMapping->uSize /= 2;
if (pMapping->ui32Flags & PVRSRV_MEM_DUMMY)
- uPSize = HOST_PAGESIZE();
+ uPSize = pBMHeap->sDevArena.ui32DataPageSize;
else
uPSize = pMapping->uSize;
if (pBMHeap->ui32Attribs &
PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) {
- OSFreePages(pBMHeap->ui32Attribs,
- uPSize,
+ OSFreePages(pBMHeap->ui32Attribs, uPSize,
(void *)pMapping->CpuVAddr,
pMapping->hOSMemHandle);
} else {
PVR_ASSERT(psMapping != NULL);
+ if (psMapping == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "BM_FreeMemory: invalid parameter");
+ return;
+ }
+
DevMemoryFree(psMapping);
if ((psMapping->ui32Flags & PVRSRV_MEM_INTERLEAVED) != 0)
psMapping->uSize /= 2;
if (psMapping->ui32Flags & PVRSRV_MEM_DUMMY)
- uPSize = HOST_PAGESIZE();
+ uPSize = psMapping->pBMHeap->sDevArena.ui32DataPageSize;
else
uPSize = psMapping->uSize;
if (pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) {
- OSFreePages(pBMHeap->ui32Attribs,
- uPSize,
+ OSFreePages(pBMHeap->ui32Attribs, uPSize,
(void *)psMapping->CpuVAddr,
psMapping->hOSMemHandle);
} else if (pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG) {
#ifndef _BUFFER_MANAGER_H_
#define _BUFFER_MANAGER_H_
-#include <linux/kernel.h>
#include "img_types.h"
#include "ra.h"
#include "perproc.h"
struct BM_MAPPING *pMapping;
u32 ui32RefCount;
- u32 uHashKey;
- void *pvKernelSyncInfo;
- void *pvPageList;
- void *hOSWrapMem;
};
struct BM_HEAP {
struct PVRSRV_PER_PROCESS_DATA *psPerProc,
IMG_BOOL *pbCreated);
-struct BM_BUF *bm_get_buf_virt(void *heap_handle, void *virt_start);
-IMG_BOOL BM_IsWrapped(void *hDevMemHeap, u32 ui32Offset,
- struct IMG_SYS_PHYADDR sSysAddr);
-
void BM_DestroyContext(void *hBMContext);
static inline void pvr_get_ctx(struct BM_CONTEXT *ctx)
return false;
}
-
void *BM_CreateHeap(void *hBMContext,
struct DEVICE_MEMORY_HEAP_INFO *psDevMemHeapInfo);
void BM_DestroyHeap(void *hDevMemHeap);
IMG_BOOL BM_Reinitialise(struct PVRSRV_DEVICE_NODE *psDeviceNode);
-IMG_BOOL BM_Alloc(void *hDevMemHeap, struct IMG_DEV_VIRTADDR *psDevVAddr,
- size_t uSize, u32 *pui32Flags, u32 uDevVAddrAlignment,
- void **phBuf);
-IMG_BOOL BM_IsWrapped(void *hDevMemHeap, u32 ui32Offset,
- struct IMG_SYS_PHYADDR sSysAddr);
-
-IMG_BOOL BM_IsWrappedCheckSize(void *hDevMemHeap, u32 ui32Offset,
- struct IMG_SYS_PHYADDR sSysAddr, u32 ui32ByteSize);
-
-IMG_BOOL BM_Wrap(void *hDevMemHeap, u32 ui32Size, u32 ui32Offset,
- IMG_BOOL bPhysContig, struct IMG_SYS_PHYADDR *psSysAddr,
- IMG_BOOL bFreePageList, void *pvCPUVAddr, u32 *pui32Flags,
- void **phBuf);
+
+IMG_BOOL BM_Alloc(void *hDevMemHeap,
+ struct IMG_DEV_VIRTADDR *psDevVAddr,
+ size_t uSize, u32 *pui32Flags, u32 uDevVAddrAlignment, void **phBuf);
+
+IMG_BOOL BM_Wrap(void *hDevMemHeap,
+ u32 ui32Size,
+ u32 ui32Offset,
+ IMG_BOOL bPhysContig,
+ struct IMG_SYS_PHYADDR *psSysAddr,
+ void *pvCPUVAddr, u32 *pui32Flags, void **phBuf);
void BM_Free(void *hBuf, u32 ui32Flags);
void *BM_HandleToCpuVaddr(void *hBuf);
#include "bufferclass_example.h"
static void *gpvAnchor;
-static IMG_BOOL (*pfnGetPVRJTable)(struct PVRSRV_BC_BUFFER2SRV_KMJTABLE *);
+static IMG_BOOL(*pfnGetPVRJTable)(struct PVRSRV_BC_BUFFER2SRV_KMJTABLE *);
struct BC_EXAMPLE_DEVINFO *GetAnchorPtr(void)
{
return PVRSRV_OK;
}
-static enum PVRSRV_ERROR GetBCBufferAddr(void *hDevice,
- void *hBuffer,
- struct IMG_SYS_PHYADDR **ppsSysAddr,
- u32 *pui32ByteSize,
- void **ppvCpuVAddr,
- void **phOSMapInfo,
- IMG_BOOL *pbIsContiguous)
+static enum PVRSRV_ERROR GetBCBufferAddr(void *hDevice, void *hBuffer,
+ struct IMG_SYS_PHYADDR **ppsSysAddr,
+ u32 *pui32ByteSize, void __iomem **ppvCpuVAddr,
+ void **phOSMapInfo, IMG_BOOL *pbIsContiguous)
{
struct BC_EXAMPLE_BUFFER *psBuffer;
if (BCAllocContigMemory(ui32Size,
&psDevInfo->psSystemBuffer[i].
- hMemHandle,
+ hMemHandle,
&psDevInfo->psSystemBuffer[i].
- sCPUVAddr,
+ sCPUVAddr,
&sSystemBufferCPUPAddr) !=
PVRSRV_OK)
break;
CpuPAddrToSysPAddrBC(sSystemBufferCPUPAddr);
psDevInfo->psSystemBuffer[i].sPageAlignSysAddr.uiAddr =
(psDevInfo->psSystemBuffer[i].sSysAddr.
- uiAddr & 0xFFFFF000);
+ uiAddr & 0xFFFFF000);
psDevInfo->psSystemBuffer[i].psSyncData = NULL;
}
&psDevInfo->sPVRJTable;
if (psJTable->
- pfnPVRSRVRemoveBCDevice(psDevInfo->ui32DeviceID) !=
+ pfnPVRSRVRemoveBCDevice(psDevInfo->ui32DeviceID) !=
PVRSRV_OK)
return PVRSRV_ERROR_GENERIC;
for (i = 0; i < psDevInfo->ui32NumBuffers; i++)
BCFreeContigMemory(psDevInfo->psSystemBuffer[i].
- ui32Size,
+ ui32Size,
psDevInfo->psSystemBuffer[i].
- hMemHandle,
+ hMemHandle,
psDevInfo->psSystemBuffer[i].
- sCPUVAddr,
+ sCPUVAddr,
SysPAddrToCpuPAddrBC(psDevInfo->
psSystemBuffer
[i].sSysAddr));
#include "servicesext.h"
#include "kernelbuffer.h"
+extern IMG_BOOL PVRGetBufferClassJTable(
+ struct PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable);
-#define BC_EXAMPLE_NUM_BUFFERS 3
+#define BC_EXAMPLE_NUM_BUFFERS 3
-#define YUV420 1
+#define YUV420 1
#ifdef YUV420
-#define BC_EXAMPLE_WIDTH (320)
-#define BC_EXAMPLE_HEIGHT (160)
-#define BC_EXAMPLE_STRIDE (320)
-#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_NV12)
+#define BC_EXAMPLE_WIDTH 320
+#define BC_EXAMPLE_HEIGHT 160
+#define BC_EXAMPLE_STRIDE 320
+#define BC_EXAMPLE_PIXELFORMAT PVRSRV_PIXEL_FORMAT_NV12
#else
-#define BC_EXAMPLE_WIDTH (320)
-#define BC_EXAMPLE_HEIGHT (160)
-#define BC_EXAMPLE_STRIDE (320*2)
-#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_RGB565)
+#define BC_EXAMPLE_WIDTH 320
+#define BC_EXAMPLE_HEIGHT 160
+#define BC_EXAMPLE_STRIDE (320 * 2)
+#define BC_EXAMPLE_PIXELFORMAT PVRSRV_PIXEL_FORMAT_RGB565
#endif
void *hMemHandle;
struct IMG_SYS_PHYADDR sSysAddr;
struct IMG_SYS_PHYADDR sPageAlignSysAddr;
- void *sCPUVAddr;
+ void __iomem *sCPUVAddr;
struct PVRSRV_SYNC_DATA *psSyncData;
struct BC_EXAMPLE_BUFFER *psNext;
};
void BCFreeKernelMem(void *pvMem);
enum PVRSRV_ERROR BCAllocContigMemory(u32 ui32Size, void **phMemHandle,
- void **pLinAddr,
+ void __iomem **pLinAddr,
struct IMG_CPU_PHYADDR *pPhysAddr);
-void BCFreeContigMemory(u32 ui32Size, void *hMemHandle, void *LinAddr,
+void BCFreeContigMemory(u32 ui32Size, void *hMemHandle, void __iomem *LinAddr,
struct IMG_CPU_PHYADDR PhysAddr);
struct IMG_SYS_PHYADDR CpuPAddrToSysPAddrBC(struct IMG_CPU_PHYADDR cpu_paddr);
#include <linux/dma-mapping.h>
-#include "pvr_bridge_km.h"
+#include "kernelbuffer.h"
#include "bufferclass_example.h"
#include "bufferclass_example_linux.h"
#include "bufferclass_example_private.h"
kfree(pvMem);
}
-enum PVRSRV_ERROR BCAllocContigMemory(u32 ui32Size, void **unref__ phMemHandle,
- void **pLinAddr,
- struct IMG_CPU_PHYADDR *pPhysAddr)
+enum PVRSRV_ERROR BCAllocContigMemory(u32 ui32Size, void *unref__ * phMemHandle,
+ void __iomem **pLinAddr,
+ struct IMG_CPU_PHYADDR *pPhysAddr)
{
dma_addr_t dma;
void *pvLinAddr;
return PVRSRV_ERROR_OUT_OF_MEMORY;
pPhysAddr->uiAddr = dma;
- *pLinAddr = pvLinAddr;
+ *pLinAddr = (void __force __iomem *)pvLinAddr;
return PVRSRV_OK;
}
void BCFreeContigMemory(u32 ui32Size, void *unref__ hMemHandle,
- void *LinAddr, struct IMG_CPU_PHYADDR PhysAddr)
+ void __iomem *LinAddr, struct IMG_CPU_PHYADDR PhysAddr)
{
- dma_free_coherent(NULL, ui32Size, LinAddr,
- (dma_addr_t) PhysAddr.uiAddr);
+ dma_free_coherent(NULL, ui32Size, (void __force *)LinAddr,
+ (dma_addr_t)PhysAddr.uiAddr);
}
struct IMG_SYS_PHYADDR CpuPAddrToSysPAddrBC(struct IMG_CPU_PHYADDR cpu_paddr)
enum PVRSRV_ERROR BCOpenPVRServices(void **phPVRServices)
{
+
*phPVRServices = NULL;
return PVRSRV_OK;
}
return PVRSRV_OK;
}
-int BC_Example_Bridge(struct inode *inode, struct file *file, unsigned int cmd,
- unsigned long arg)
+static int BC_Example_Bridge(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg)
{
int err = -EFAULT;
int command = _IOC_NR(cmd);
- struct BC_Example_ioctl_package *psBridge =
- (struct BC_Example_ioctl_package *)arg;
+ struct BC_Example_ioctl_package __user *psBridge =
+ (struct BC_Example_ioctl_package __user *)arg;
if (!access_ok
(VERIFY_WRITE, psBridge, sizeof(struct BC_Example_ioctl_package)))
switch (command) {
case _IOC_NR(BC_Example_ioctl_fill_buffer):
- {
- if (FillBuffer(psBridge->inputparam) == -1)
- return err;
- break;
- }
+ if (FillBuffer(psBridge->inputparam) == -1)
+ return err;
+ break;
case _IOC_NR(BC_Example_ioctl_get_buffer_count):
- {
- if (GetBufferCount(&psBridge->outputparam) == -1)
- return err;
-
- break;
- }
+ if (GetBufferCount(&psBridge->outputparam) == -1)
+ return err;
+ break;
default:
return err;
}
return 0;
}
-const static struct file_operations bufferclass_example_fops = {
- .ioctl = BC_Example_Bridge,
+static const struct file_operations bufferclass_example_fops = {
+ .ioctl = BC_Example_Bridge,
};
static int __init BC_Example_ModInit(void)
{
-
-
AssignedMajorNumber =
register_chrdev(0, DEVNAME, &bufferclass_example_fops);
#define MIN(a, b) ((a) < (b) ? (a) : (b))
-static void FillYUV420Image(void *pvDest, int width, int height, int bytestride)
+static void FillYUV420Image(void __iomem *pvDest, int width, int height,
+ int bytestride)
{
static int iPhase;
int i, j;
unsigned char u, v, y;
- unsigned char *pui8y = (unsigned char *)pvDest;
+ unsigned char *pui8y = (unsigned char __force *)pvDest;
unsigned short *pui16uv;
unsigned int count = 0;
pui8y[count++] = y;
}
- pui16uv =
- (unsigned short *)((unsigned char *)pvDest + (width * height));
+ pui16uv = (unsigned short *)
+ ((unsigned char __force *)pvDest + (width * height));
count = 0;
for (j = 0; j < height; j += 2)
for (i = 0; i < width; i += 2) {
- u = (j <
- (height / 2)) ? ((i <
- (width /
- 2)) ? 0xFF : 0x33) : ((i <
- (width /
- 2)) ?
- 0x33 :
- 0xAA);
- v = (j <
- (height / 2)) ? ((i <
- (width /
- 2)) ? 0xAC : 0x0) : ((i <
- (width /
- 2)) ?
- 0x03 :
- 0xEE);
+ u = (j < (height / 2)) ?
+ ((i < (width / 2)) ? 0xFF : 0x33) :
+ ((i < (width / 2)) ? 0x33 : 0xAA);
+ v = (j < (height / 2)) ?
+ ((i < (width / 2)) ? 0xAC : 0x0) :
+ ((i < (width / 2)) ? 0x03 : 0xEE);
pui16uv[count++] = (v << 8) | u;
iPhase++;
}
-static void FillYUV422Image(void *pvDest, int width, int height, int bytestride)
+static void FillYUV422Image(void __iomem *pvDest, int width, int height,
+ int bytestride)
{
static int iPhase;
int x, y;
unsigned char u, v, y0, y1;
- unsigned int *pui32yuv = (unsigned int *)pvDest;
+ unsigned int *pui32yuv = (unsigned int __force *)pvDest;
unsigned int count = 0;
for (y = 0; y < height; y++)
for (x = 0; x < width; x += 2) {
- u = (y <
- (height / 2)) ? ((x <
- (width /
- 2)) ? 0xFF : 0x33) : ((x <
- (width /
- 2)) ?
- 0x33 :
- 0xAA);
- v = (y <
- (height / 2)) ? ((x <
- (width /
- 2)) ? 0xAA : 0x0) : ((x <
- (width /
- 2)) ?
- 0x03 :
- 0xEE);
+ u = (y < (height / 2)) ?
+ ((x < (width / 2)) ? 0xFF : 0x33) :
+ ((x < (width / 2)) ? 0x33 : 0xAA);
+ v = (y < (height / 2)) ?
+ ((x < (width / 2)) ? 0xAA : 0x0) :
+ ((x < (width / 2)) ? 0x03 : 0xEE);
y0 = y1 =
(((x + iPhase) >> 6) % (2) == 0) ? 0x7f : 0x00;
iPhase++;
}
-static void FillRGB565Image(void *pvDest, int width, int height, int bytestride)
+static void FillRGB565Image(void __iomem *pvDest, int width, int height,
+ int bytestride)
{
int i, Count;
- unsigned long *pui32Addr = (unsigned long *)pvDest;
- unsigned short *pui16Addr = (unsigned short *)pvDest;
+ unsigned long *pui32Addr = (unsigned long __force *)pvDest;
+ unsigned short *pui16Addr = (unsigned short __force *)pvDest;
unsigned long Colour32;
unsigned short Colour16;
static unsigned char Colour8;
- Colour16 =
- (Colour8 >> 3) | ((Colour8 >> 2) << 5) | ((Colour8 >> 3) << 11);
+ Colour16 = (Colour8 >> 3) | ((Colour8 >> 2) << 5) |
+ ((Colour8 >> 3) << 11);
Colour32 = Colour16 | Colour16 << 16;
Count = (height * bytestride) >> 2;
Count = height;
- pui16Addr = (unsigned short *)((unsigned char *)pvDest + (2 * Colour8));
+ pui16Addr = (unsigned short *)
+ ((unsigned char __force *)pvDest + (2 * Colour8));
for (i = 0; i < Count; i++) {
*pui16Addr = 0xF800;
}
Count = bytestride >> 2;
- pui32Addr =
- (unsigned long *)((unsigned char *)pvDest +
+ pui32Addr = (unsigned long *)((unsigned char __force *)pvDest +
(bytestride * (MIN(height - 1, 0xFF) - Colour8)));
for (i = 0; i < Count; i++)
psSyncData = psBuffer->psSyncData;
if (psSyncData) {
-
if (psSyncData->ui32ReadOpsPending !=
psSyncData->ui32ReadOpsComplete)
return -1;
switch (psBufferInfo->pixelformat) {
case PVRSRV_PIXEL_FORMAT_RGB565:
default:
- {
- FillRGB565Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH,
- BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE);
- break;
- }
+ FillRGB565Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH,
+ BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE);
+ break;
case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY:
- {
- FillYUV422Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH,
- BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE);
- break;
- }
+ FillYUV422Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH,
+ BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE);
+ break;
case PVRSRV_PIXEL_FORMAT_NV12:
- {
- FillYUV420Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH,
- BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE);
- break;
- }
+ FillYUV420Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH,
+ BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE);
+ break;
}
if (psSyncData)
#define DEBUG_SERVICE_READLF \
CTL_CODE(FILE_DEVICE_UNKNOWN, DEBUG_SERVICE_IOCTL_BASE + 0x17, \
METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define DEBUG_SERVICE_WAITFOREVENT \
+ CTL_CODE(FILE_DEVICE_UNKNOWN, DEBUG_SERVICE_IOCTL_BASE + 0x18, \
+ METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+enum DBG_EVENT {
+ DBG_EVENT_STREAM_DATA = 1
+};
struct DBG_IN_CREATESTREAM {
u32 ui32Pages;
u32 ui32InBuffSize, u32 ui32Level);
void (*pfnSetMarker)(struct DBG_STREAM *psStream, u32 ui32Marker);
u32 (*pfnGetMarker)(struct DBG_STREAM *psStream);
- void (*pfnEndInitPhase)(struct DBG_STREAM *psStream);
+ void (*pfnStartInitPhase) (struct DBG_STREAM *psStream);
+ void (*pfnStopInitPhase) (struct DBG_STREAM *psStream);
u32 (*pfnIsCaptureFrame)(struct DBG_STREAM *psStream,
IMG_BOOL bCheckPreviousFrame);
u32 (*pfnWriteLF)(struct DBG_STREAM *psStream, u8 *pui8InBuf,
void (*pfnSetStreamOffset)(struct DBG_STREAM *psStream,
u32 ui32StreamOffset);
u32 (*pfnIsLastCaptureFrame)(struct DBG_STREAM *psStream);
+ void (*pfnWaitForEvent) (enum DBG_EVENT eEvent);
};
extern struct DBGKM_SERVICE_TABLE g_sDBGKMServices;
#define PVRSRV_BACKINGSTORE_LOCALMEM_NONCONTIG \
(1<<(PVRSRV_MEM_BACKINGSTORE_FIELD_SHIFT+3))
-typedef u32 DEVICE_MEMORY_HEAP_TYPE;
#define DEVICE_MEMORY_HEAP_PERCONTEXT 0
#define DEVICE_MEMORY_HEAP_KERNEL 1
#define DEVICE_MEMORY_HEAP_SHARED 2
struct IMG_DEV_VIRTADDR sDevVAddrBase;
u32 ui32HeapSize;
u32 ui32Attribs;
- DEVICE_MEMORY_HEAP_TYPE DevMemHeapType;
+ u32 DevMemHeapType;
void *hDevMemHeap;
struct RA_ARENA *psLocalDevMemArena;
+
+ u32 ui32DataPageSize;
+
};
struct DEVICE_MEMORY_INFO {
char *pszName;
struct IMG_DEV_VIRTADDR BaseDevVAddr;
u32 ui32Size;
- DEVICE_MEMORY_HEAP_TYPE DevMemHeapType;
+ u32 DevMemHeapType;
+
+ u32 ui32DataPageSize;
+
struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeapInfo;
};
enum PVRSRV_ERROR (*pfnInitDevice)(void *);
enum PVRSRV_ERROR (*pfnDeInitDevice)(void *);
+ enum PVRSRV_ERROR (*pfnInitDeviceCompatCheck)(
+ struct PVRSRV_DEVICE_NODE *);
+
enum PVRSRV_ERROR (*pfnMMUInitialise)(struct PVRSRV_DEVICE_NODE *,
struct MMU_CONTEXT **,
struct IMG_DEV_PHYADDR *);
struct MMU_HEAP *(*pfnMMUCreate)(struct MMU_CONTEXT *,
struct DEV_ARENA_DESCRIPTOR *, struct RA_ARENA **);
void (*pfnMMUDelete)(struct MMU_HEAP *);
- IMG_BOOL (*pfnMMUAlloc)(struct MMU_HEAP *pMMU,
- size_t uSize, size_t *pActualSize, u32 uFlags,
+ IMG_BOOL (*pfnMMUAlloc)(struct MMU_HEAP *pMMU, size_t uSize, u32 uFlags,
u32 uDevVAddrAlignment,
struct IMG_DEV_VIRTADDR *pDevVAddr);
void (*pfnMMUFree)(struct MMU_HEAP *, struct IMG_DEV_VIRTADDR, u32);
struct DEVICE_MEMORY_INFO sDevMemoryInfo;
void *pvDevice;
u32 ui32pvDeviceSize;
- void *hDeviceOSMemHandle;
+
struct RESMAN_CONTEXT *hResManContext;
struct SYS_DATA *psSysData;
struct RA_ARENA *psLocalDevMemArena;
enum PVRSRV_ERROR PVRSRVInitialiseDevice(u32 ui32DevIndex);
enum PVRSRV_ERROR PVRSRVFinaliseSystem(IMG_BOOL bInitSuccesful);
+enum PVRSRV_ERROR PVRSRVDevInitCompatCheck(struct PVRSRV_DEVICE_NODE
+ *psDeviceNode);
+
enum PVRSRV_ERROR PVRSRVDeinitialiseDevice(u32 ui32DevIndex);
-enum PVRSRV_ERROR PollForValueKM(volatile u32 *pui32LinMemAddr,
+enum PVRSRV_ERROR PollForValueKM(u32 __iomem *pui32LinMemAddr,
u32 ui32Value, u32 ui32Mask, u32 ui32Waitus, u32 ui32Tries);
enum PVRSRV_ERROR PVRSRVInit(struct SYS_DATA *psSysData);
#include "buffer_manager.h"
#include "kernelbuffer.h"
#include "pvr_bridge_km.h"
-#include "kerneldisplay.h"
-struct PVRSRV_DC_BUFFER {
+struct PVRSRV_DC_SRV2DISP_KMJTABLE;
+struct PVRSRV_DC_BUFFER {
struct PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
-
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
struct PVRSRV_DC_SWAPCHAIN *psSwapChain;
};
struct PVRSRV_BC_SRV2BUFFER_KMJTABLE;
struct PVRSRV_BC_BUFFER {
-
struct PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
-
struct PVRSRV_BUFFERCLASS_INFO *psBCInfo;
};
psDeviceNode = psSysData->psDeviceNodeList;
while (psDeviceNode) {
- if ((psDeviceNode->sDevId.eDeviceClass == DeviceClass)
- && (psDeviceNode->sDevId.eDeviceType ==
+ if ((psDeviceNode->sDevId.eDeviceClass == DeviceClass) &&
+ (psDeviceNode->sDevId.eDeviceType ==
PVRSRV_DEVICE_TYPE_EXT)) {
ui32DevCount++;
- if (pui32DevID)
+ if (pui32DevID) {
*pui32DevID++ =
psDeviceNode->sDevId.ui32DeviceIndex;
+ }
}
psDeviceNode = psDeviceNode->psNext;
}
}
static enum PVRSRV_ERROR PVRSRVRegisterDCDeviceKM(
- struct PVRSRV_DC_SRV2DISP_KMJTABLE *psFuncTable,
- u32 *pui32DeviceID)
+ struct PVRSRV_DC_SRV2DISP_KMJTABLE *psFuncTable,
+ u32 *pui32DeviceID)
{
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo = NULL;
struct PVRSRV_DEVICE_NODE *psDeviceNode;
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE),
- (void **) &psDCInfo->psFuncTable,
+ (void **)&psDCInfo->psFuncTable,
NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVRegisterDCDeviceKM: Failed psFuncTable alloc");
FoundDevice:
psDeviceNode = *ppsDeviceNode;
- *ppsDeviceNode = psDeviceNode->psNext;
-
- SysRemoveExternalDevice(psDeviceNode);
psDCInfo = (struct PVRSRV_DISPLAYCLASS_INFO *)psDeviceNode->pvDevice;
- PVR_ASSERT(psDCInfo->ui32RefCount == 0);
- FreeDeviceID(psSysData, ui32DevIndex);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE),
- psDCInfo->psFuncTable, NULL);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_DISPLAYCLASS_INFO),
- psDCInfo, NULL);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE),
- psDeviceNode, NULL);
+
+ if (psDCInfo->ui32RefCount == 0) {
+ *ppsDeviceNode = psDeviceNode->psNext;
+ SysRemoveExternalDevice(psDeviceNode);
+ PVR_ASSERT(psDCInfo->ui32RefCount == 0);
+ FreeDeviceID(psSysData, ui32DevIndex);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE),
+ psDCInfo->psFuncTable, NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_DISPLAYCLASS_INFO), psDCInfo,
+ NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_DEVICE_NODE), psDeviceNode,
+ NULL);
+ } else {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveDCDeviceKM: "
+ "failed as %d Services DC API "
+ "connections are still open",
+ psDCInfo->ui32RefCount);
+ return PVRSRV_ERROR_GENERIC;
+ }
+
return PVRSRV_OK;
}
if (psBCInfo->psFuncTable)
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE),
+ sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE *),
psBCInfo->psFuncTable, NULL);
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
FoundDevice:
psDevNode = *(ppsDevNode);
- *ppsDevNode = psDevNode->psNext;
- FreeDeviceID(psSysData, ui32DevIndex);
psBCInfo = (struct PVRSRV_BUFFERCLASS_INFO *)psDevNode->pvDevice;
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE),
- psBCInfo->psFuncTable,
- NULL);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_BUFFERCLASS_INFO), psBCInfo, NULL);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE),
- psDevNode, NULL);
+
+ if (psBCInfo->ui32RefCount == 0) {
+ *ppsDevNode = psDevNode->psNext;
+ FreeDeviceID(psSysData, ui32DevIndex);
+ psBCInfo =
+ (struct PVRSRV_BUFFERCLASS_INFO *)psDevNode->pvDevice;
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE),
+ psBCInfo->psFuncTable, NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_BUFFERCLASS_INFO), psBCInfo,
+ NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_DEVICE_NODE), psDevNode, NULL);
+ } else {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveBCDeviceKM: "
+ "failed as %d Services BC API "
+ "connections are still open",
+ psBCInfo->ui32RefCount);
+ return PVRSRV_ERROR_GENERIC;
+ }
+
return PVRSRV_OK;
}
return PVRSRV_OK;
}
-static enum PVRSRV_ERROR CloseDCDeviceCallBack(void *pvParam,
- u32 ui32Param)
+static enum PVRSRV_ERROR CloseDCDeviceCallBack(void *pvParam, u32 ui32Param)
{
struct PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
psDCInfo->ui32RefCount--;
if (psDCInfo->ui32RefCount == 0) {
+ struct PVRSRV_DC_SRV2DISP_KMJTABLE *jtbl;
+
+ jtbl = psDCInfo->psFuncTable;
- psDCInfo->psFuncTable->pfnCloseDCDevice(psDCInfo->hExtDevice);
+ jtbl->pfnCloseDCDevice(psDCInfo->hExtDevice);
PVRSRVFreeSyncInfoKM(psDCInfo->sSystemBuffer.sDeviceClassBuffer.
psKernelSyncInfo);
psDCInfo->hDevMemContext = NULL;
psDCInfo->hExtDevice = NULL;
+
+ module_put(jtbl->owner);
}
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
struct PVRSRV_DEVICE_NODE *psDeviceNode;
struct SYS_DATA *psSysData;
- if (!phDeviceKM) {
+ if (!phDeviceKM || !hDevCookie) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVOpenDCDeviceKM: Invalid params");
return PVRSRV_ERROR_GENERIC;
FoundDevice:
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(*psDCPerContextInfo),
- (void **) &psDCPerContextInfo,
- NULL) != PVRSRV_OK) {
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psDCPerContextInfo),
+ (void **)&psDCPerContextInfo, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVOpenDCDeviceKM: "
- "Failed psDCPerContextInfo alloc");
+ "Failed psDCPerContextInfo alloc");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psDCPerContextInfo, 0, sizeof(*psDCPerContextInfo));
if (psDCInfo->ui32RefCount++ == 0) {
enum PVRSRV_ERROR eError;
+ struct PVRSRV_DC_SRV2DISP_KMJTABLE *jtbl;
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie;
- PVR_ASSERT(psDeviceNode != NULL);
+
+ jtbl = psDCInfo->psFuncTable;
+ if (!try_module_get(jtbl->owner)) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: can't get DC module");
+ return PVRSRV_ERROR_INVALID_DEVICE;
+ }
psDCInfo->hDevMemContext =
(void *) psDeviceNode->sDevMemoryInfo.pBMKernelContext;
eError = PVRSRVAllocSyncInfoKM(NULL,
- (void *) psDeviceNode->
+ (void *)psDeviceNode->
sDevMemoryInfo.pBMKernelContext,
- &psDCInfo->sSystemBuffer.
+ &psDCInfo->sSystemBuffer.
sDeviceClassBuffer.
- psKernelSyncInfo);
+ psKernelSyncInfo);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVOpenDCDeviceKM: Failed sync info alloc");
psDCInfo->ui32RefCount--;
+ module_put(jtbl->owner);
return eError;
}
- eError = psDCInfo->psFuncTable->pfnOpenDCDevice(ui32DeviceID,
+ eError = jtbl->pfnOpenDCDevice(ui32DeviceID,
&psDCInfo->hExtDevice,
(struct PVRSRV_SYNC_DATA *)psDCInfo->sSystemBuffer.
sDeviceClassBuffer.psKernelSyncInfo->
PVR_DPF(PVR_DBG_ERROR, "PVRSRVOpenDCDeviceKM: "
"Failed to open external DC device");
psDCInfo->ui32RefCount--;
+ module_put(jtbl->owner);
PVRSRVFreeSyncInfoKM(psDCInfo->sSystemBuffer.
sDeviceClassBuffer.psKernelSyncInfo);
return eError;
void *hExtBuffer;
if (!hDeviceKM || !phBuffer) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVGetDCSystemBufferKM: "
- "Invalid parameters");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVGetDCSystemBufferKM: Invalid parameters");
return PVRSRV_ERROR_INVALID_PARAMS;
}
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- eError =
- psDCInfo->psFuncTable->pfnGetDCInfo(psDCInfo->hExtDevice,
- psDisplayInfo);
+ eError = psDCInfo->psFuncTable->pfnGetDCInfo(psDCInfo->hExtDevice,
+ psDisplayInfo);
if (eError != PVRSRV_OK)
return eError;
if (psDisplayInfo->ui32MaxSwapChainBuffers >
- PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS)
+ PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS) {
psDisplayInfo->ui32MaxSwapChainBuffers =
PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS;
+ }
return PVRSRV_OK;
}
eError =
psDCInfo->psFuncTable->pfnDestroyDCSwapChain(psDCInfo->hExtDevice,
psSwapChain->
- hExtSwapChain);
+ hExtSwapChain);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "DestroyDCSwapChainCallBack: "
- "Failed to destroy DC swap chain");
+ "Failed to destroy DC swap chain");
return eError;
}
- for (i = 0; i < psSwapChain->ui32BufferCount; i++) {
+ for (i = 0; i < psSwapChain->ui32BufferCount; i++)
if (psSwapChain->asBuffer[i].sDeviceClassBuffer.
psKernelSyncInfo)
PVRSRVFreeSyncInfoKM(psSwapChain->asBuffer[i].
- sDeviceClassBuffer.
- psKernelSyncInfo);
-
- }
+ sDeviceClassBuffer.
+ psKernelSyncInfo);
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DC_SWAPCHAIN),
psSwapChain, NULL);
return eError;
}
-enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
- *psPerProc,
- void *hDeviceKM,
- u32 ui32Flags,
- struct DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib,
- struct DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib,
- u32 ui32BufferCount,
- u32 ui32OEMFlags,
- void **phSwapChain,
- u32 *pui32SwapChainID)
+enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *hDeviceKM, u32 ui32Flags,
+ struct DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib,
+ struct DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib,
+ u32 ui32BufferCount, u32 ui32OEMFlags,
+ void **phSwapChain, u32 *pui32SwapChainID)
{
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
struct PVRSRV_DC_SWAPCHAIN *psSwapChain = NULL;
enum PVRSRV_ERROR eError;
u32 i;
- if (!hDeviceKM
- || !psDstSurfAttrib
- || !psSrcSurfAttrib || !phSwapChain || !pui32SwapChainID) {
+ if (!hDeviceKM || !psDstSurfAttrib || !psSrcSurfAttrib ||
+ !phSwapChain || !pui32SwapChainID) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVCreateDCSwapChainKM: Invalid parameters");
return PVRSRV_ERROR_INVALID_PARAMS;
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct PVRSRV_DC_SWAPCHAIN),
(void **) &psSwapChain, NULL) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDCSwapChainKM: "
- "Failed psSwapChain alloc");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVCreateDCSwapChainKM: Failed psSwapChain alloc");
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto ErrorExit;
}
eError = PVRSRVCreateCommandQueueKM(1024, &psQueue);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDCSwapChainKM: "
- "Failed to create CmdQueue");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVCreateDCSwapChainKM: Failed to create CmdQueue");
goto ErrorExit;
}
eError = PVRSRVAllocSyncInfoKM(NULL,
psDCInfo->hDevMemContext,
&psSwapChain->asBuffer[i].
- sDeviceClassBuffer.
- psKernelSyncInfo);
+ sDeviceClassBuffer.
+ psKernelSyncInfo);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDCSwapChainKM: "
"Failed to alloc syninfo for psSwapChain");
apsSyncData[i] =
(struct PVRSRV_SYNC_DATA *)psSwapChain->asBuffer[i].
- sDeviceClassBuffer.psKernelSyncInfo->psSyncDataMemInfoKM->
- pvLinAddrKM;
+ sDeviceClassBuffer.psKernelSyncInfo->
+ psSyncDataMemInfoKM->pvLinAddrKM;
}
psSwapChain->ui32BufferCount = ui32BufferCount;
eError =
psDCInfo->psFuncTable->pfnCreateDCSwapChain(psDCInfo->hExtDevice,
- ui32Flags,
- psDstSurfAttrib,
- psSrcSurfAttrib,
- ui32BufferCount,
- apsSyncData,
- ui32OEMFlags,
- &psSwapChain->
- hExtSwapChain,
- pui32SwapChainID);
+ ui32Flags,
+ psDstSurfAttrib,
+ psSrcSurfAttrib,
+ ui32BufferCount,
+ apsSyncData,
+ ui32OEMFlags,
+ &psSwapChain->hExtSwapChain,
+ pui32SwapChainID);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDCSwapChainKM: "
- "Failed to create 3rd party SwapChain");
+ "Failed to create 3rd party SwapChain");
goto ErrorExit;
}
for (i = 0; i < ui32BufferCount; i++) {
if (psSwapChain->asBuffer[i].sDeviceClassBuffer.
- psKernelSyncInfo)
+ psKernelSyncInfo) {
PVRSRVFreeSyncInfoKM(psSwapChain->asBuffer[i].
- sDeviceClassBuffer.
- psKernelSyncInfo);
-
+ sDeviceClassBuffer.
+ psKernelSyncInfo);
+ }
}
if (psQueue)
PVRSRVDestroyCommandQueueKM(psQueue);
- if (psSwapChain)
+ if (psSwapChain) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_DC_SWAPCHAIN),
- psSwapChain, NULL);
+ sizeof(struct PVRSRV_DC_SWAPCHAIN), psSwapChain,
+ NULL);
+ }
return eError;
}
-enum PVRSRV_ERROR PVRSRVSetDCDstRectKM(void *hDeviceKM,
- void *hSwapChain, struct IMG_RECT *psRect)
+enum PVRSRV_ERROR PVRSRVSetDCDstRectKM(void *hDeviceKM, void *hSwapChain,
+ struct IMG_RECT *psRect)
{
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
struct PVRSRV_DC_SWAPCHAIN *psSwapChain;
psSwapChain->hExtSwapChain, psRect);
}
-enum PVRSRV_ERROR PVRSRVSetDCSrcRectKM(void *hDeviceKM,
- void *hSwapChain, struct IMG_RECT *psRect)
+enum PVRSRV_ERROR PVRSRVSetDCSrcRectKM(void *hDeviceKM, void *hSwapChain,
+ struct IMG_RECT *psRect)
{
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
struct PVRSRV_DC_SWAPCHAIN *psSwapChain;
psSwapChain->hExtSwapChain, ui32CKColour);
}
-enum PVRSRV_ERROR PVRSRVGetDCBuffersKM(void *hDeviceKM,
- void *hSwapChain,
- u32 *pui32BufferCount,
- void **phBuffer)
+enum PVRSRV_ERROR PVRSRVGetDCBuffersKM(void *hDeviceKM, void *hSwapChain,
+ u32 *pui32BufferCount, void **phBuffer)
{
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
struct PVRSRV_DC_SWAPCHAIN *psSwapChain;
psSwapChain = (struct PVRSRV_DC_SWAPCHAIN *)hSwapChain;
eError = psDCInfo->psFuncTable->pfnGetDCBuffers(psDCInfo->hExtDevice,
- psSwapChain->
- hExtSwapChain,
- pui32BufferCount,
- ahExtBuffer);
+ psSwapChain->hExtSwapChain,
+ pui32BufferCount, ahExtBuffer);
PVR_ASSERT(*pui32BufferCount <= PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS);
for (i = 0; i < *pui32BufferCount; i++) {
psSwapChain->asBuffer[i].sDeviceClassBuffer.hExtBuffer =
- ahExtBuffer[i];
- phBuffer[i] = (void *) &psSwapChain->asBuffer[i];
+ ahExtBuffer[i];
+ phBuffer[i] = (void *)&psSwapChain->asBuffer[i];
}
return eError;
}
-enum PVRSRV_ERROR PVRSRVSwapToDCBufferKM(void *hDeviceKM,
- void *hBuffer,
- u32 ui32SwapInterval,
- void *hPrivateTag,
+enum PVRSRV_ERROR PVRSRVSwapToDCBufferKM(void *hDeviceKM, void *hBuffer,
+ u32 ui32SwapInterval, void *hPrivateTag,
u32 ui32ClipRectCount,
struct IMG_RECT *psClipRect)
{
struct PVRSRV_QUEUE_INFO *psQueue;
struct DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
u32 i;
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0;
u32 ui32NumSrcSyncs = 1;
struct PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[2];
struct PVRSRV_COMMAND *psCommand;
(sizeof(struct IMG_RECT) *
ui32ClipRectCount));
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVSwapToDCBufferKM: "
- "Failed to get space in queue");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVSwapToDCBufferKM: Failed to get space in queue");
goto Exit;
}
goto Exit;
}
- do {
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
if (PVRSRVProcessQueues(KERNEL_ID, IMG_FALSE) !=
- PVRSRV_ERROR_PROCESSING_BLOCKED)
+ PVRSRV_ERROR_PROCESSING_BLOCKED) {
goto ProcessedQueues;
-
- if (bStart == IMG_FALSE) {
- uiStart = OSClockus();
- bStart = IMG_TRUE;
}
OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- } while ((OSClockus() - uiStart) < MAX_HW_TIME_US);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVSwapToDCBufferKM: Failed to process queues");
struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
struct PVRSRV_DC_SWAPCHAIN *psSwapChain;
struct DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0;
u32 ui32NumSrcSyncs = 1;
struct PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[2];
struct PVRSRV_COMMAND *psCommand;
apsSrcSync[0] =
psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo;
if (psSwapChain->psLastFlipBuffer) {
- apsSrcSync[1] =
+ if (apsSrcSync[0] !=
psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.
- psKernelSyncInfo;
- ui32NumSrcSyncs++;
+ psKernelSyncInfo) {
+ apsSrcSync[1] =
+ psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.
+ psKernelSyncInfo;
+ ui32NumSrcSyncs++;
+ }
}
eError = PVRSRVInsertCommandKM(psQueue, &psCommand,
0, NULL, ui32NumSrcSyncs, apsSrcSync,
sizeof(struct DISPLAYCLASS_FLIP_COMMAND));
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVSwapToDCSystemKM: "
- "Failed to get space in queue");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVSwapToDCSystemKM: Failed to get space in queue");
goto Exit;
}
goto Exit;
}
- do {
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
if (PVRSRVProcessQueues(KERNEL_ID, IMG_FALSE) !=
- PVRSRV_ERROR_PROCESSING_BLOCKED)
+ PVRSRV_ERROR_PROCESSING_BLOCKED) {
goto ProcessedQueues;
-
- if (bStart == IMG_FALSE) {
- uiStart = OSClockus();
- bStart = IMG_TRUE;
}
OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- } while ((OSClockus() - uiStart) < MAX_HW_TIME_US);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVSwapToDCSystemKM: Failed to process queues");
if (SysAcquireData(&psSysData) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterSystemISRHandler: "
- "Failed to get SysData");
+ "Failed to get SysData");
return PVRSRV_ERROR_GENERIC;
}
psDevNode = psDevNode->psNext;
}
+ if (psDevNode == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterSystemISRHandler: "
+ "Failed to get psDevNode");
+ PVR_DBG_BREAK;
+ return PVRSRV_ERROR_GENERIC;
+ }
+
psDevNode->pvISRData = (void *) pvISRHandlerData;
psDevNode->pfnDeviceISR = pfnISRHandler;
}
}
-static IMG_BOOL PVRGetDisplayClassJTable(
- struct PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable)
+IMG_BOOL PVRGetDisplayClassJTable(struct PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable)
{
psJTable->ui32TableSize = sizeof(struct PVRSRV_DC_DISP2SRV_KMJTABLE);
psJTable->pfnPVRSRVRegisterDCDevice = PVRSRVRegisterDCDeviceKM;
psBCInfo->psFuncTable->pfnCloseBCDevice(psBCInfo->hExtDevice);
- for (i = 0; i < psBCInfo->ui32BufferCount; i++) {
+ for (i = 0; i < psBCInfo->ui32BufferCount; i++)
if (psBCInfo->psBuffer[i].sDeviceClassBuffer.
- psKernelSyncInfo)
+ psKernelSyncInfo)
PVRSRVFreeSyncInfoKM(psBCInfo->psBuffer[i].
- sDeviceClassBuffer.
- psKernelSyncInfo);
-
- }
+ sDeviceClassBuffer.
+ psKernelSyncInfo);
if (psBCInfo->psBuffer)
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_BC_BUFFER) *
- psBCInfo->ui32BufferCount, psBCInfo->psBuffer,
- NULL);
+ sizeof(struct PVRSRV_BC_BUFFER),
+ psBCInfo->psBuffer, NULL);
}
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
struct SYS_DATA *psSysData;
u32 i;
enum PVRSRV_ERROR eError;
- struct BUFFER_INFO sBufferInfo;
- if (!phDeviceKM) {
+ if (!phDeviceKM || !hDevCookie) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVOpenBCDeviceKM: Invalid params");
return PVRSRV_ERROR_GENERIC;
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(*psBCPerContextInfo),
- (void **) &psBCPerContextInfo,
- NULL) != PVRSRV_OK) {
+ (void **)&psBCPerContextInfo, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVOpenBCDeviceKM: "
- "Failed psBCPerContextInfo alloc");
+ "Failed psBCPerContextInfo alloc");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psBCPerContextInfo, 0, sizeof(*psBCPerContextInfo));
if (psBCInfo->ui32RefCount++ == 0) {
+ struct BUFFER_INFO sBufferInfo;
+
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie;
- PVR_ASSERT(psDeviceNode != NULL);
psBCInfo->hDevMemContext =
(void *) psDeviceNode->sDevMemoryInfo.pBMKernelContext;
psBCInfo->psFuncTable->pfnGetBCInfo(psBCInfo->hExtDevice,
&sBufferInfo);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVOpenBCDeviceKM : "
- "Failed to get BC Info");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVOpenBCDeviceKM : Failed to get BC Info");
return eError;
}
NULL);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVOpenBCDeviceKM: "
- "Failed to allocate BC buffers");
+ "Failed to allocate BC buffers");
return eError;
}
- OSMemSet(psBCInfo->psBuffer,
- 0,
+ OSMemSet(psBCInfo->psBuffer, 0,
sizeof(struct PVRSRV_BC_BUFFER) *
sBufferInfo.ui32BufferCount);
for (i = 0; i < psBCInfo->ui32BufferCount; i++) {
eError = PVRSRVAllocSyncInfoKM(NULL,
- psBCInfo->hDevMemContext,
- &psBCInfo->psBuffer[i].
- sDeviceClassBuffer.
- psKernelSyncInfo);
+ psBCInfo->hDevMemContext,
+ &psBCInfo->psBuffer[i].sDeviceClassBuffer.
+ psKernelSyncInfo);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVOpenBCDeviceKM: "
"Failed sync info alloc");
}
psBCInfo->psBuffer[i].sDeviceClassBuffer.
- pfnGetBufferAddr = (enum PVRSRV_ERROR(*)
- (void *, void *,
- struct IMG_SYS_PHYADDR **, u32 *,
- void __iomem **, void **, IMG_BOOL *))
- psBCInfo->psFuncTable->pfnGetBufferAddr;
+ pfnGetBufferAddr =
+ psBCInfo->psFuncTable->pfnGetBufferAddr;
psBCInfo->psBuffer[i].sDeviceClassBuffer.
hDevMemContext = psBCInfo->hDevMemContext;
psBCInfo->psBuffer[i].sDeviceClassBuffer.hExtDevice =
RESMAN_TYPE_BUFFERCLASS_DEVICE,
psBCPerContextInfo, 0, CloseBCDeviceCallBack);
- *phDeviceKM = (void *) psBCPerContextInfo;
+ *phDeviceKM = (void *)psBCPerContextInfo;
return PVRSRV_OK;
ErrorExit:
for (i = 0; i < psBCInfo->ui32BufferCount; i++) {
- if (psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
+ if (psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo) {
PVRSRVFreeSyncInfoKM(psBCInfo->psBuffer[i].
- sDeviceClassBuffer.
- psKernelSyncInfo);
-
+ sDeviceClassBuffer.
+ psKernelSyncInfo);
+ }
}
- if (psBCInfo->psBuffer)
+ if (psBCInfo->psBuffer) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_BC_BUFFER) *
- sBufferInfo.ui32BufferCount, psBCInfo->psBuffer,
+ sizeof(struct PVRSRV_BC_BUFFER), psBCInfo->psBuffer,
NULL);
+ }
return eError;
}
enum PVRSRV_ERROR PVRSRVGetBCInfoKM(void *hDeviceKM,
- struct BUFFER_INFO *psBufferInfo)
+ struct BUFFER_INFO *psBufferInfo)
{
struct PVRSRV_BUFFERCLASS_INFO *psBCInfo;
enum PVRSRV_ERROR eError;
psBCInfo = BCDeviceHandleToBCInfo(hDeviceKM);
if (ui32BufferIndex < psBCInfo->ui32BufferCount) {
- *phBuffer = (void *) &psBCInfo->psBuffer[ui32BufferIndex];
+ *phBuffer = (void *)&psBCInfo->psBuffer[ui32BufferIndex];
} else {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVGetBCBufferKM: "
- "Buffer index %d out of range (%d)",
+ "Buffer index %d out of range (%d)",
ui32BufferIndex, psBCInfo->ui32BufferCount);
return PVRSRV_ERROR_INVALID_PARAMS;
}
#include "services_headers.h"
#include "buffer_manager.h"
#include "pdump_km.h"
-#include "sgxmmu.h"
-#include "sgxapi_km.h"
#include "pvr_bridge_km.h"
-#include "linux/kernel.h"
-#include "linux/pagemap.h"
+#include <linux/pagemap.h>
static enum PVRSRV_ERROR AllocDeviceMem(void *hDevCookie, void *hDevMemHeap,
- u32 ui32Flags, u32 ui32Size,
- u32 ui32Alignment,
- struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo);
+ u32 ui32Flags, u32 ui32Size, u32 ui32Alignment,
+ struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo);
+
+struct RESMAN_MAP_DEVICE_MEM_DATA {
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psSrcMemInfo;
+};
+
+static inline void get_page_details(u32 vaddr, size_t byte_size,
+ u32 *page_offset_out, int *page_count_out)
+{
+ size_t host_page_size;
+ u32 page_offset;
+ int page_count;
+
+ host_page_size = PAGE_SIZE;
+ page_offset = vaddr & (host_page_size - 1);
+ page_count = PAGE_ALIGN(byte_size + page_offset) / host_page_size;
+
+ *page_offset_out = page_offset;
+ *page_count_out = page_count;
+}
+
+static inline int get_page_count(u32 vaddr, size_t byte_size)
+{
+ u32 page_offset;
+ int page_count;
+
+ get_page_details(vaddr, byte_size, &page_offset, &page_count);
+
+ return page_count;
+}
enum PVRSRV_ERROR PVRSRVGetDeviceMemHeapsKM(void *hDevCookie,
struct PVRSRV_HEAP_INFO *psHeapInfo)
struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
u32 i;
+ if (hDevCookie == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVGetDeviceMemHeapsKM: hDevCookie invalid");
+ PVR_DBG_BREAK;
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie;
- PVR_ASSERT(psDeviceNode != NULL);
ui32HeapCount = psDeviceNode->sDevMemoryInfo.ui32HeapCount;
psDeviceMemoryHeap = psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap;
PVR_ASSERT(ui32HeapCount <= PVRSRV_MAX_CLIENT_HEAPS);
for (i = 0; i < ui32HeapCount; i++) {
-
psHeapInfo[i].ui32HeapID = psDeviceMemoryHeap[i].ui32HeapID;
psHeapInfo[i].hDevMemHeap = psDeviceMemoryHeap[i].hDevMemHeap;
psHeapInfo[i].sDevVAddrBase =
for (; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
OSMemSet(psHeapInfo + i, 0, sizeof(*psHeapInfo));
- psHeapInfo[i].ui32HeapID = (u32) SGX_UNDEFINED_HEAP_ID;
+ psHeapInfo[i].ui32HeapID = (u32) PVRSRV_UNDEFINED_HEAP_ID;
}
return PVRSRV_OK;
struct IMG_DEV_PHYADDR sPDDevPAddr;
u32 i;
+ if (hDevCookie == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVCreateDeviceMemContextKM: hDevCookie invalid");
+ PVR_DBG_BREAK;
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie;
- PVR_ASSERT(psDeviceNode != NULL);
ui32HeapCount = psDeviceNode->sDevMemoryInfo.ui32HeapCount;
psDeviceMemoryHeap = psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap;
hDevMemContext = BM_CreateContext(psDeviceNode,
&sPDDevPAddr, psPerProc, pbCreated);
if (hDevMemContext == NULL) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDeviceMemContextKM: "
- "Failed BM_CreateContext");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVCreateDeviceMemContextKM: Failed BM_CreateContext");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
- for (i = 0; i < ui32HeapCount; i++)
+ for (i = 0; i < ui32HeapCount; i++) {
switch (psDeviceMemoryHeap[i].DevMemHeapType) {
case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
- {
-
- psHeapInfo[ui32ClientHeapCount].ui32HeapID =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapID =
psDeviceMemoryHeap[i].ui32HeapID;
- psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
+ psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
psDeviceMemoryHeap[i].hDevMemHeap;
- psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
+ psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
psDeviceMemoryHeap[i].sDevVAddrBase;
- psHeapInfo[ui32ClientHeapCount].
- ui32HeapByteSize =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize =
psDeviceMemoryHeap[i].ui32HeapSize;
- psHeapInfo[ui32ClientHeapCount].ui32Attribs =
+ psHeapInfo[ui32ClientHeapCount].ui32Attribs =
psDeviceMemoryHeap[i].ui32Attribs;
- pbShared[ui32ClientHeapCount] = IMG_TRUE;
- ui32ClientHeapCount++;
- break;
- }
+ pbShared[ui32ClientHeapCount] = IMG_TRUE;
+ ui32ClientHeapCount++;
+ break;
case DEVICE_MEMORY_HEAP_PERCONTEXT:
- {
- hDevMemHeap = BM_CreateHeap(hDevMemContext,
- &psDeviceMemoryHeap
- [i]);
+ hDevMemHeap = BM_CreateHeap(hDevMemContext,
+ &psDeviceMemoryHeap[i]);
- psHeapInfo[ui32ClientHeapCount].ui32HeapID =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapID =
psDeviceMemoryHeap[i].ui32HeapID;
- psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
+ psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
hDevMemHeap;
- psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
+ psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
psDeviceMemoryHeap[i].sDevVAddrBase;
- psHeapInfo[ui32ClientHeapCount].
- ui32HeapByteSize =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize =
psDeviceMemoryHeap[i].ui32HeapSize;
- psHeapInfo[ui32ClientHeapCount].ui32Attribs =
+ psHeapInfo[ui32ClientHeapCount].ui32Attribs =
psDeviceMemoryHeap[i].ui32Attribs;
- pbShared[ui32ClientHeapCount] = IMG_FALSE;
+ pbShared[ui32ClientHeapCount] = IMG_FALSE;
- ui32ClientHeapCount++;
- break;
- }
+ ui32ClientHeapCount++;
+ break;
}
+ }
*pui32ClientHeapCount = ui32ClientHeapCount;
*phDevMemContext = hDevMemContext;
void *hDevMemHeap;
u32 i;
+ if (hDevCookie == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVGetDeviceMemHeapInfoKM: hDevCookie invalid");
+ PVR_DBG_BREAK;
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie;
- PVR_ASSERT(psDeviceNode != NULL);
ui32HeapCount = psDeviceNode->sDevMemoryInfo.ui32HeapCount;
psDeviceMemoryHeap = psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap;
PVR_ASSERT(ui32HeapCount <= PVRSRV_MAX_CLIENT_HEAPS);
- for (i = 0; i < ui32HeapCount; i++)
+ for (i = 0; i < ui32HeapCount; i++) {
switch (psDeviceMemoryHeap[i].DevMemHeapType) {
case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
- {
-
- psHeapInfo[ui32ClientHeapCount].ui32HeapID =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapID =
psDeviceMemoryHeap[i].ui32HeapID;
- psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
+ psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
psDeviceMemoryHeap[i].hDevMemHeap;
- psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
+ psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
psDeviceMemoryHeap[i].sDevVAddrBase;
- psHeapInfo[ui32ClientHeapCount].
- ui32HeapByteSize =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize =
psDeviceMemoryHeap[i].ui32HeapSize;
- psHeapInfo[ui32ClientHeapCount].ui32Attribs =
+ psHeapInfo[ui32ClientHeapCount].ui32Attribs =
psDeviceMemoryHeap[i].ui32Attribs;
- pbShared[ui32ClientHeapCount] = IMG_TRUE;
- ui32ClientHeapCount++;
- break;
- }
+ pbShared[ui32ClientHeapCount] = IMG_TRUE;
+ ui32ClientHeapCount++;
+ break;
case DEVICE_MEMORY_HEAP_PERCONTEXT:
- {
- hDevMemHeap = BM_CreateHeap(hDevMemContext,
- &psDeviceMemoryHeap
- [i]);
-
- psHeapInfo[ui32ClientHeapCount].ui32HeapID =
+ hDevMemHeap = BM_CreateHeap(hDevMemContext,
+ &psDeviceMemoryHeap[i]);
+ psHeapInfo[ui32ClientHeapCount].ui32HeapID =
psDeviceMemoryHeap[i].ui32HeapID;
- psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
+ psHeapInfo[ui32ClientHeapCount].hDevMemHeap =
hDevMemHeap;
- psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
+ psHeapInfo[ui32ClientHeapCount].sDevVAddrBase =
psDeviceMemoryHeap[i].sDevVAddrBase;
- psHeapInfo[ui32ClientHeapCount].
- ui32HeapByteSize =
+ psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize =
psDeviceMemoryHeap[i].ui32HeapSize;
- psHeapInfo[ui32ClientHeapCount].ui32Attribs =
+ psHeapInfo[ui32ClientHeapCount].ui32Attribs =
psDeviceMemoryHeap[i].ui32Attribs;
- pbShared[ui32ClientHeapCount] = IMG_FALSE;
+ pbShared[ui32ClientHeapCount] = IMG_FALSE;
- ui32ClientHeapCount++;
- break;
- }
+ ui32ClientHeapCount++;
+ break;
}
-
+ }
*pui32ClientHeapCount = ui32ClientHeapCount;
return PVRSRV_OK;
*ppsMemInfo = NULL;
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ if (OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_MEM_INFO),
(void **) &psMemInfo, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
+ OSMemSet(psMemInfo, 0, sizeof(*psMemInfo));
+
psMemBlock = &(psMemInfo->sMemBlk);
psMemInfo->ui32Flags = ui32Flags | PVRSRV_MEM_RAM_BACKED_ALLOCATION;
if (!bBMError) {
PVR_DPF(PVR_DBG_ERROR, "AllocDeviceMem: BM_Alloc Failed");
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_MEM_INFO), psMemInfo,
NULL);
return PVRSRV_ERROR_OUT_OF_MEMORY;
psMemBlock->sDevVirtAddr = BM_HandleToDevVaddr(hBuffer);
psMemBlock->hOSMemHandle = BM_HandleToOSMemHandle(hBuffer);
- psMemBlock->hBuffer = (void *) hBuffer;
+ psMemBlock->hBuffer = (void *)hBuffer;
psMemInfo->pvLinAddrKM = BM_HandleToCpuVaddr(hBuffer);
psMemInfo->sDevVAddr = psMemBlock->sDevVirtAddr;
psMemInfo->ui32AllocSize = ui32Size;
+
+ psMemInfo->pvSysBackupBuffer = NULL;
+
*ppsMemInfo = psMemInfo;
return PVRSRV_OK;
hBuffer = psMemInfo->sMemBlk.hBuffer;
BM_Free(hBuffer, psMemInfo->ui32Flags);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_KERNEL_MEM_INFO),
+
+ if (psMemInfo->pvSysBackupBuffer)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psMemInfo->ui32AllocSize,
+ psMemInfo->pvSysBackupBuffer, NULL);
+
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT, sizeof(struct PVRSRV_KERNEL_MEM_INFO),
psMemInfo, NULL);
return PVRSRV_OK;
struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
struct PVRSRV_SYNC_DATA *psSyncData;
- eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_SYNC_INFO),
(void **) &psKernelSyncInfo, NULL);
if (eError != PVRSRV_OK) {
hSyncDevMemHeap = psDevMemoryInfo->psDeviceMemoryHeap[psDevMemoryInfo->
ui32SyncHeapID].hDevMemHeap;
- eError = AllocDeviceMem(hDevCookie, hSyncDevMemHeap, 0,
- sizeof(struct PVRSRV_SYNC_DATA),
- sizeof(u32),
+ eError = AllocDeviceMem(hDevCookie, hSyncDevMemHeap,
+ PVRSRV_MEM_CACHE_CONSISTENT,
+ sizeof(struct PVRSRV_SYNC_DATA), sizeof(u32),
&psKernelSyncInfo->psSyncDataMemInfoKM);
if (eError != PVRSRV_OK) {
-
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVAllocSyncInfoKM: Failed to alloc memory");
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_SYNC_INFO),
psKernelSyncInfo, NULL);
return PVRSRV_ERROR_OUT_OF_MEMORY;
psSyncData->ui32LastOpDumpVal = 0;
psSyncData->ui32LastReadOpDumpVal = 0;
+#if defined(PDUMP)
+ PDUMPMEM(psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM,
+ psKernelSyncInfo->psSyncDataMemInfoKM, 0,
+ psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize,
+ 0, MAKEUNIQUETAG(psKernelSyncInfo->psSyncDataMemInfoKM));
+#endif
+
psKernelSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr =
psKernelSyncInfo->psSyncDataMemInfoKM->sDevVAddr.uiAddr +
offsetof(struct PVRSRV_SYNC_DATA, ui32WriteOpsComplete);
struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo)
{
FreeDeviceMem(psKernelSyncInfo->psSyncDataMemInfoKM);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_KERNEL_SYNC_INFO), psKernelSyncInfo, NULL);
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
+ sizeof(struct PVRSRV_KERNEL_SYNC_INFO), psKernelSyncInfo,
+ NULL);
return PVRSRV_OK;
}
PVR_UNREFERENCED_PARAMETER(ui32Param);
+ psMemInfo->ui32RefCount--;
+
+ if (psMemInfo->ui32Flags & PVRSRV_MEM_EXPORTED) {
+ void *hMemInfo = NULL;
+
+ if (psMemInfo->ui32RefCount != 0) {
+ PVR_DPF(PVR_DBG_ERROR, "FreeDeviceMemCallBack: "
+ "mappings are open in other processes");
+ return PVRSRV_ERROR_GENERIC;
+ }
+
+ eError = PVRSRVFindHandle(KERNEL_HANDLE_BASE,
+ &hMemInfo,
+ psMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "FreeDeviceMemCallBack: "
+ "can't find exported meminfo in the "
+ "global handle list");
+ return eError;
+ }
+
+ eError = PVRSRVReleaseHandle(KERNEL_HANDLE_BASE,
+ hMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "FreeDeviceMemCallBack: "
+ "PVRSRVReleaseHandle failed for exported meminfo");
+ return eError;
+ }
+ }
+
+ PVR_ASSERT(psMemInfo->ui32RefCount == 0);
+
if (psMemInfo->psKernelSyncInfo)
eError = PVRSRVFreeSyncInfoKM(psMemInfo->psKernelSyncInfo);
if (ui32Flags & PVRSRV_MEM_NO_SYNCOBJ) {
psMemInfo->psKernelSyncInfo = NULL;
} else {
-
psBMHeap = (struct BM_HEAP *)hDevMemHeap;
hDevMemContext = (void *) psBMHeap->pBMContext;
eError = PVRSRVAllocSyncInfoKM(hDevCookie,
if (ui32Flags & PVRSRV_MEM_NO_RESMAN) {
psMemInfo->sMemBlk.hResItem = NULL;
} else {
-
psMemInfo->sMemBlk.hResItem =
ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_DEVICEMEM_ALLOCATION,
psMemInfo, 0, FreeDeviceMemCallBack);
if (psMemInfo->sMemBlk.hResItem == NULL) {
-
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto free_mainalloc;
}
}
+ psMemInfo->ui32RefCount++;
+
return PVRSRV_OK;
free_mainalloc:
enum PVRSRV_ERROR PVRSRVDissociateDeviceMemKM(void *hDevCookie,
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevCookie;
PVR_UNREFERENCED_PARAMETER(hDevCookie);
if (!psMemInfo)
return PVRSRV_ERROR_INVALID_PARAMS;
- ResManDissociateRes(psMemInfo->sMemBlk.hResItem,
- psDeviceNode->hResManContext);
+ eError = ResManDissociateRes(psMemInfo->sMemBlk.hResItem,
+ psDeviceNode->hResManContext);
+
+ PVR_ASSERT(eError == PVRSRV_OK);
return eError;
}
return PVRSRV_ERROR_INVALID_PARAMS;
ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+
return PVRSRV_OK;
}
{
enum PVRSRV_ERROR eError = PVRSRV_OK;
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo = pvParam;
- void *hOSWrapMem = NULL;
- struct BM_BUF *psBMBuf;
+ void *hOSWrapMem;
PVR_UNREFERENCED_PARAMETER(ui32Param);
- psBMBuf = (struct BM_BUF *)psMemInfo->sMemBlk.hBuffer;
+ hOSWrapMem = psMemInfo->sMemBlk.hOSWrapMem;
- if ((psBMBuf->ui32RefCount == 1) && (psMemInfo->psKernelSyncInfo)) {
+ if (psMemInfo->psKernelSyncInfo)
eError = PVRSRVFreeSyncInfoKM(psMemInfo->psKernelSyncInfo);
- hOSWrapMem = psBMBuf->hOSWrapMem;
+
+ if (psMemInfo->sMemBlk.psIntSysPAddr) {
+ int page_count;
+
+ page_count = get_page_count((u32)psMemInfo->pvLinAddrKM,
+ psMemInfo->ui32AllocSize);
+
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ page_count * sizeof(struct IMG_SYS_PHYADDR),
+ psMemInfo->sMemBlk.psIntSysPAddr, NULL);
}
- if (eError == PVRSRV_OK)
+ if (eError == PVRSRV_OK) {
+ psMemInfo->ui32RefCount--;
eError = FreeDeviceMem(psMemInfo);
+ }
if (hOSWrapMem)
- OSReleasePhysPageAddr(hOSWrapMem, IMG_TRUE);
+ OSReleasePhysPageAddr(hOSWrapMem);
return eError;
}
enum PVRSRV_ERROR PVRSRVWrapExtMemoryKM(void *hDevCookie,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc,
- u32 ui32ByteSize, u32 ui32PageOffset,
- IMG_BOOL bPhysContig,
- struct IMG_SYS_PHYADDR *psExtSysPAddr,
- void *pvLinAddr,
- struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo)
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *hDevMemContext, u32 ui32ByteSize,
+ u32 ui32PageOffset, IMG_BOOL bPhysContig,
+ struct IMG_SYS_PHYADDR *psExtSysPAddr,
+ void *pvLinAddr,
+ struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo)
{
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo = NULL;
struct DEVICE_MEMORY_INFO *psDevMemoryInfo;
u32 ui32HostPageSize = HOST_PAGESIZE();
- void *hDevMemHeap, *hDevMemContext;
+ void *hDevMemHeap = NULL;
struct PVRSRV_DEVICE_NODE *psDeviceNode;
void *hBuffer;
struct PVRSRV_MEMBLK *psMemBlock;
void *pvPageAlignedCPUVAddr;
struct IMG_SYS_PHYADDR *psIntSysPAddr = NULL;
void *hOSWrapMem = NULL;
- struct BM_BUF *psBMBuf;
- struct IMG_SYS_PHYADDR *pPageList = psExtSysPAddr;
- u32 ui32PageCount;
-
- u32 ui32CalculatedPageOffset = ((u32)pvLinAddr) & ~PAGE_MASK;
- if (ui32CalculatedPageOffset != ui32PageOffset) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVWrapExtMemoryKM: "
- "offset from address not match offset param");
- return PVRSRV_ERROR_BAD_MAPPING;
- }
+ struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
+ int page_count = 0;
+ u32 i;
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie;
PVR_ASSERT(psDeviceNode != NULL);
- psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
- hDevMemHeap =
- psDevMemoryInfo->psDeviceMemoryHeap[psDevMemoryInfo->
- ui32MappingHeapID].hDevMemHeap;
- ui32PageCount =
- HOST_PAGEALIGN(ui32ByteSize + ui32PageOffset) / ui32HostPageSize;
+ if (psDeviceNode == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVWrapExtMemoryKM: invalid parameter");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
if (pvLinAddr) {
- pvPageAlignedCPUVAddr =
- (void *) ((u8 *) pvLinAddr - ui32PageOffset);
+ get_page_details((u32)pvLinAddr, ui32ByteSize,
+ &ui32PageOffset, &page_count);
+ pvPageAlignedCPUVAddr = (void *)((u8 *) pvLinAddr -
+ ui32PageOffset);
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32PageCount * sizeof(struct IMG_SYS_PHYADDR),
- (void **) &psIntSysPAddr,
- NULL) != PVRSRV_OK) {
+ page_count * sizeof(struct IMG_SYS_PHYADDR),
+ (void **)&psIntSysPAddr, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVWrapExtMemoryKM: "
"Failed to alloc memory for block");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
- /* let's start by getting the address of the first page */
eError = OSAcquirePhysPageAddr(pvPageAlignedCPUVAddr,
- ui32HostPageSize,
- psIntSysPAddr, &hOSWrapMem,
- IMG_TRUE);
+ page_count * ui32HostPageSize,
+ psIntSysPAddr, &hOSWrapMem);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVWrapExtMemoryKM: "
- "Failed to alloc memory for block");
- eError = PVRSRV_ERROR_OUT_OF_MEMORY;
- goto ErrorExitPhase1;
- }
- /* now check if this memory address is already wrapped */
- if (BM_IsWrapped(hDevMemHeap, ui32PageOffset,
- psIntSysPAddr[0])) {
- /* already wrapped */
- OSReleasePhysPageAddr(hOSWrapMem, IMG_TRUE);
- hOSWrapMem = NULL;
- } else if (ui32PageCount > 1) {
- OSReleasePhysPageAddr(hOSWrapMem, IMG_TRUE);
- hOSWrapMem = NULL;
- /* the memory is going to wrapped for the first time,
- * so we need full page list */
- eError = OSAcquirePhysPageAddr(pvPageAlignedCPUVAddr,
- ui32PageCount *
- ui32HostPageSize,
- psIntSysPAddr,
- &hOSWrapMem,
- IMG_TRUE);
- if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVWrapExtMemoryKM:"
- " Failed to alloc memory for block");
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVWrapExtMemoryKM:"
+ " Failed to alloc memory for block");
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto ErrorExitPhase1;
- }
}
-
psExtSysPAddr = psIntSysPAddr;
- } else {
+ bPhysContig = IMG_FALSE;
+ }
+ psDevMemoryInfo =
+ &((struct BM_CONTEXT *)hDevMemContext)->psDeviceNode->
+ sDevMemoryInfo;
+ psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
+ for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
+ if (HEAP_IDX(psDeviceMemoryHeap[i].ui32HeapID) ==
+ psDevMemoryInfo->ui32MappingHeapID) {
+ if (psDeviceMemoryHeap[i].DevMemHeapType ==
+ DEVICE_MEMORY_HEAP_PERCONTEXT) {
+ hDevMemHeap =
+ BM_CreateHeap(hDevMemContext,
+ &psDeviceMemoryHeap[i]);
+ } else {
+ hDevMemHeap =
+ psDevMemoryInfo->psDeviceMemoryHeap[i].
+ hDevMemHeap;
+ }
+ break;
+ }
+ }
+
+ if (hDevMemHeap == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVWrapExtMemoryKM: unable to find mapping heap");
+ eError = PVRSRV_ERROR_GENERIC;
+ goto ErrorExitPhase2;
}
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
OSMemSet(psMemInfo, 0, sizeof(*psMemInfo));
psMemBlock = &(psMemInfo->sMemBlk);
- bBMError = BM_Wrap(hDevMemHeap, ui32ByteSize, ui32PageOffset,
- bPhysContig, psExtSysPAddr,
- IMG_TRUE, NULL, &psMemInfo->ui32Flags, &hBuffer);
+
+ bBMError = BM_Wrap(hDevMemHeap,
+ ui32ByteSize,
+ ui32PageOffset,
+ bPhysContig,
+ psExtSysPAddr,
+ NULL, &psMemInfo->ui32Flags, &hBuffer);
if (!bBMError) {
- /* Alloc failed from current mapping heap, try the other one */
- psDevMemoryInfo->ui32MappingHeapID =
- psDevMemoryInfo->ui32MappingHeapID ==
- SGX_GENERAL_MAPPING_HEAP_ID ? SGX_ALT_MAPPING_HEAP_ID :
- SGX_GENERAL_MAPPING_HEAP_ID;
- hDevMemHeap =
- psDevMemoryInfo->psDeviceMemoryHeap[psDevMemoryInfo->
- ui32MappingHeapID]. hDevMemHeap;
- bBMError =
- BM_Wrap(hDevMemHeap, ui32ByteSize, ui32PageOffset,
- bPhysContig, psExtSysPAddr, IMG_TRUE, NULL,
- &psMemInfo->ui32Flags, &hBuffer);
- if (!bBMError) {
- PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVWrapExtMemoryKM: BM_Wrap Failed");
- eError = PVRSRV_ERROR_BAD_MAPPING;
- goto ErrorExitPhase2;
- }
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVWrapExtMemoryKM: BM_Wrap Failed");
+ eError = PVRSRV_ERROR_BAD_MAPPING;
+ goto ErrorExitPhase3;
}
- /* wrap was successful and BM_Wrap has taken ownership of the page list,
- * clear psIntSysPAddr here, so we don't double free the memory */
- psIntSysPAddr = NULL;
psMemBlock->sDevVirtAddr = BM_HandleToDevVaddr(hBuffer);
psMemBlock->hOSMemHandle = BM_HandleToOSMemHandle(hBuffer);
+ psMemBlock->hOSWrapMem = hOSWrapMem;
+ psMemBlock->psIntSysPAddr = psIntSysPAddr;
psMemBlock->hBuffer = (void *) hBuffer;
psMemInfo->sDevVAddr = psMemBlock->sDevVirtAddr;
psMemInfo->ui32AllocSize = ui32ByteSize;
+ psMemInfo->pvSysBackupBuffer = NULL;
+
psBMHeap = (struct BM_HEAP *)hDevMemHeap;
hDevMemContext = (void *) psBMHeap->pBMContext;
- psBMBuf = (struct BM_BUF *)hBuffer;
- if (psBMBuf->ui32RefCount == 1) {
- eError = PVRSRVAllocSyncInfoKM(hDevCookie, hDevMemContext,
+ eError = PVRSRVAllocSyncInfoKM(hDevCookie,
+ hDevMemContext,
&psMemInfo->psKernelSyncInfo);
- if (eError != PVRSRV_OK)
- goto ErrorExitPhase2;
- psBMBuf->pvKernelSyncInfo = psMemInfo->psKernelSyncInfo;
- psBMBuf->hOSWrapMem = hOSWrapMem;
- } else {
- psMemInfo->psKernelSyncInfo = psBMBuf->pvKernelSyncInfo;
- }
+ if (eError != PVRSRV_OK)
+ goto ErrorExitPhase4;
+
+ psMemInfo->ui32RefCount++;
psMemInfo->sMemBlk.hResItem =
ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_DEVICEMEM_WRAP, psMemInfo, 0,
UnwrapExtMemoryCallBack);
- /* check if we were passed a page list
- * but we didn't use use it */
- if (pPageList && (pPageList != psExtSysPAddr))
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32PageCount * sizeof(struct IMG_SYS_PHYADDR),
- (void *)pPageList, NULL);
*ppsMemInfo = psMemInfo;
return PVRSRV_OK;
-ErrorExitPhase2:
- if (psMemInfo)
+ErrorExitPhase4:
+ if (psMemInfo) {
FreeDeviceMem(psMemInfo);
- if (hOSWrapMem)
- OSReleasePhysPageAddr(hOSWrapMem, IMG_TRUE);
-ErrorExitPhase1:
+ psMemInfo = NULL;
+ }
+
+ErrorExitPhase3:
+ if (psMemInfo) {
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_KERNEL_MEM_INFO), psMemInfo,
+ NULL);
+ }
+
+ErrorExitPhase2:
if (psIntSysPAddr)
+ OSReleasePhysPageAddr(hOSWrapMem);
+
+ErrorExitPhase1:
+ if (psIntSysPAddr) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32PageCount * sizeof(struct IMG_SYS_PHYADDR),
+ page_count * sizeof(struct IMG_SYS_PHYADDR),
psIntSysPAddr, NULL);
+ }
return eError;
}
return PVRSRV_ERROR_INVALID_PARAMS;
ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+
return PVRSRV_OK;
}
static enum PVRSRV_ERROR UnmapDeviceMemoryCallBack(void *pvParam, u32 ui32Param)
{
- struct PVRSRV_KERNEL_MEM_INFO *psMemInfo = pvParam;
+ enum PVRSRV_ERROR eError;
+ struct RESMAN_MAP_DEVICE_MEM_DATA *psMapData = pvParam;
+ int page_count;
PVR_UNREFERENCED_PARAMETER(ui32Param);
- return FreeDeviceMem(psMemInfo);
+ page_count = get_page_count((u32)psMapData->psMemInfo->pvLinAddrKM,
+ psMapData->psMemInfo->ui32AllocSize);
+
+ if (psMapData->psMemInfo->sMemBlk.psIntSysPAddr)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ page_count * sizeof(struct IMG_SYS_PHYADDR),
+ psMapData->psMemInfo->sMemBlk.psIntSysPAddr, NULL);
+
+ eError = FreeDeviceMem(psMapData->psMemInfo);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "UnmapDeviceMemoryCallBack: "
+ "Failed to free DST meminfo");
+ return eError;
+ }
+
+ psMapData->psSrcMemInfo->ui32RefCount--;
+
+ PVR_ASSERT(psMapData->psSrcMemInfo->ui32RefCount != (u32) (-1));
+/*
+ * Don't free the source MemInfo as we didn't allocate it
+ * and it's not our job as the process the allocated
+ * should also free it when it's finished
+ */
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct RESMAN_MAP_DEVICE_MEM_DATA), psMapData, NULL);
+
+ return eError;
+}
+
+static inline int bm_is_continuous(const struct BM_BUF *buf)
+{
+ return buf->pMapping->eCpuMemoryOrigin == hm_wrapped_virtaddr;
}
enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
struct PVRSRV_KERNEL_MEM_INFO **ppsDstMemInfo)
{
enum PVRSRV_ERROR eError;
- u32 i;
- u32 ui32PageCount, ui32PageOffset;
+ u32 ui32PageOffset;
u32 ui32HostPageSize = HOST_PAGESIZE();
+ int page_count;
+ int i;
struct IMG_SYS_PHYADDR *psSysPAddr = NULL;
struct IMG_DEV_PHYADDR sDevPAddr;
struct BM_BUF *psBuf;
IMG_BOOL bBMError;
struct PVRSRV_DEVICE_NODE *psDeviceNode;
void *pvPageAlignedCPUVAddr;
+ struct RESMAN_MAP_DEVICE_MEM_DATA *psMapData = NULL;
if (!psSrcMemInfo || !hDstDevMemHeap || !ppsDstMemInfo) {
PVR_DPF(PVR_DBG_ERROR,
*ppsDstMemInfo = NULL;
- ui32PageOffset =
- psSrcMemInfo->sDevVAddr.uiAddr & (ui32HostPageSize - 1);
- ui32PageCount =
- HOST_PAGEALIGN(psSrcMemInfo->ui32AllocSize +
- ui32PageOffset) / ui32HostPageSize;
+ get_page_details((u32)psSrcMemInfo->pvLinAddrKM,
+ psSrcMemInfo->ui32AllocSize,
+ &ui32PageOffset, &page_count);
pvPageAlignedCPUVAddr =
(void *) ((u8 *) psSrcMemInfo->pvLinAddrKM -
ui32PageOffset);
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32PageCount * sizeof(struct IMG_SYS_PHYADDR),
+ page_count * sizeof(struct IMG_SYS_PHYADDR),
(void **) &psSysPAddr, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVMapDeviceMemoryKM: "
"Failed to alloc memory for block");
psDeviceNode = psBuf->pMapping->pBMHeap->pBMContext->psDeviceNode;
sDevVAddr.uiAddr = psSrcMemInfo->sDevVAddr.uiAddr - ui32PageOffset;
- for (i = 0; i < ui32PageCount; i++) {
+ for (i = 0; i < page_count; i++) {
eError =
BM_GetPhysPageAddr(psSrcMemInfo, sDevVAddr, &sDevPAddr);
if (eError != PVRSRV_OK) {
}
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct RESMAN_MAP_DEVICE_MEM_DATA),
+ (void **)&psMapData, NULL) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVMapDeviceMemoryKM: "
+ "Failed to alloc resman map data");
+ eError = PVRSRV_ERROR_OUT_OF_MEMORY;
+ goto ErrorExit;
+ }
+
+ if (OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_MEM_INFO),
- (void **) &psMemInfo, NULL) != PVRSRV_OK) {
+ (void **)&psMemInfo, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVMapDeviceMemoryKM: "
- "Failed to alloc memory for block");
+ "Failed to alloc memory for block");
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto ErrorExit;
}
psMemBlock = &(psMemInfo->sMemBlk);
- bBMError = BM_Wrap(psBuf->pMapping->pBMHeap,
- psSrcMemInfo->ui32AllocSize,
- ui32PageOffset, IMG_FALSE, psSysPAddr,
- IMG_TRUE, pvPageAlignedCPUVAddr,
- &psMemInfo->ui32Flags, &hBuffer);
+ bBMError = BM_Wrap(hDstDevMemHeap, psSrcMemInfo->ui32AllocSize,
+ ui32PageOffset, bm_is_continuous(psBuf), psSysPAddr,
+ pvPageAlignedCPUVAddr, &psMemInfo->ui32Flags,
+ &hBuffer);
if (!bBMError) {
PVR_DPF(PVR_DBG_ERROR,
psMemBlock->hBuffer = (void *) hBuffer;
+ psMemBlock->psIntSysPAddr = psSysPAddr;
+
psMemInfo->pvLinAddrKM = psSrcMemInfo->pvLinAddrKM;
psMemInfo->sDevVAddr = psMemBlock->sDevVirtAddr;
psMemInfo->ui32AllocSize = psSrcMemInfo->ui32AllocSize;
psMemInfo->psKernelSyncInfo = psSrcMemInfo->psKernelSyncInfo;
+ psMemInfo->pvSysBackupBuffer = NULL;
+
+ psSrcMemInfo->ui32RefCount++;
+
+ psMapData->psMemInfo = psMemInfo;
+ psMapData->psSrcMemInfo = psSrcMemInfo;
+
psMemInfo->sMemBlk.hResItem =
ResManRegisterRes(psPerProc->hResManContext,
- RESMAN_TYPE_DEVICEMEM_MAPPING, psMemInfo, 0,
+ RESMAN_TYPE_DEVICEMEM_MAPPING, psMapData, 0,
UnmapDeviceMemoryCallBack);
*ppsDstMemInfo = psMemInfo;
ErrorExit:
- if (psSysPAddr)
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32PageCount *
- sizeof(struct IMG_SYS_PHYADDR), psSysPAddr, NULL);
-
- if (psMemInfo)
+ if (psSysPAddr) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct IMG_SYS_PHYADDR), psSysPAddr, NULL);
+ }
+
+ if (psMemInfo) {
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_MEM_INFO), psMemInfo,
NULL);
+ }
+
+ if (psMapData) {
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
+ sizeof(struct RESMAN_MAP_DEVICE_MEM_DATA), psMapData,
+ NULL);
+ }
return eError;
}
return PVRSRV_ERROR_INVALID_PARAMS;
ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+
return PVRSRV_OK;
}
enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
struct PVRSRV_PER_PROCESS_DATA *psPerProc,
- void *hDeviceClassBuffer,
+ void *hDevMemContext, void *hDeviceClassBuffer,
struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo,
void **phOSMapInfo)
{
IMG_BOOL bPhysContig;
struct BM_CONTEXT *psBMContext;
struct DEVICE_MEMORY_INFO *psDevMemoryInfo;
- void *hDevMemHeap;
+ struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
+ void *hDevMemHeap = NULL;
u32 ui32ByteSize;
u32 ui32Offset;
u32 ui32PageSize = HOST_PAGESIZE();
void *hBuffer;
struct PVRSRV_MEMBLK *psMemBlock;
IMG_BOOL bBMError;
+ u32 i;
- if (!hDeviceClassBuffer || !ppsMemInfo || !phOSMapInfo) {
+ if (!hDeviceClassBuffer || !ppsMemInfo || !phOSMapInfo ||
+ !hDevMemContext) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVMapDeviceClassMemoryKM: invalid parameters");
return PVRSRV_ERROR_INVALID_PARAMS;
phOSMapInfo, &bPhysContig);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVMapDeviceClassMemoryKM: "
- "unable to get buffer address");
+ "unable to get buffer address");
return PVRSRV_ERROR_GENERIC;
}
psBMContext = (struct BM_CONTEXT *)psDeviceClassBuffer->hDevMemContext;
psDevMemoryInfo = &psBMContext->psDeviceNode->sDevMemoryInfo;
- hDevMemHeap =
- psDevMemoryInfo->psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].
- hDevMemHeap;
+ psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
+ for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
+ if (HEAP_IDX(psDeviceMemoryHeap[i].ui32HeapID) ==
+ psDevMemoryInfo->ui32MappingHeapID) {
+ if (psDeviceMemoryHeap[i].DevMemHeapType ==
+ DEVICE_MEMORY_HEAP_PERCONTEXT)
+ hDevMemHeap =
+ BM_CreateHeap(hDevMemContext,
+ &psDeviceMemoryHeap[i]);
+ else
+ hDevMemHeap =
+ psDevMemoryInfo->psDeviceMemoryHeap[i].
+ hDevMemHeap;
+ break;
+ }
+ }
- ui32Offset = ((u32) pvCPUVAddr) & (ui32PageSize - 1);
- pvPageAlignedCPUVAddr =
- (void *) ((u8 *) pvCPUVAddr - ui32Offset);
+ if (hDevMemHeap == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVMapDeviceClassMemoryKM: "
+ "unable to find mapping heap");
+ return PVRSRV_ERROR_GENERIC;
+ }
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32Offset = ((u32)pvCPUVAddr) & (ui32PageSize - 1);
+ pvPageAlignedCPUVAddr = (void *)((u8 *)pvCPUVAddr - ui32Offset);
+
+ if (OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_KERNEL_MEM_INFO),
- (void **) &psMemInfo, NULL) != PVRSRV_OK) {
+ (void **)&psMemInfo, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVMapDeviceClassMemoryKM: "
- "Failed to alloc memory for block");
+ "Failed to alloc memory for block");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
psMemBlock = &(psMemInfo->sMemBlk);
- bBMError = BM_Wrap(hDevMemHeap,
- ui32ByteSize,
- ui32Offset,
- bPhysContig,
- psSysPAddr,
- IMG_FALSE,
- pvPageAlignedCPUVAddr,
+ bBMError = BM_Wrap(hDevMemHeap, ui32ByteSize, ui32Offset, bPhysContig,
+ psSysPAddr, pvPageAlignedCPUVAddr,
&psMemInfo->ui32Flags, &hBuffer);
if (!bBMError) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVMapDeviceClassMemoryKM: BM_Wrap Failed");
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_KERNEL_MEM_INFO),
- psMemInfo, NULL);
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
+ sizeof(struct PVRSRV_KERNEL_MEM_INFO), psMemInfo,
+ NULL);
return PVRSRV_ERROR_BAD_MAPPING;
}
psMemInfo->ui32AllocSize = ui32ByteSize;
psMemInfo->psKernelSyncInfo = psDeviceClassBuffer->psKernelSyncInfo;
+ psMemInfo->pvSysBackupBuffer = NULL;
+
psMemInfo->sMemBlk.hResItem =
ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_DEVICECLASSMEM_MAPPING, psMemInfo, 0,
#define PVRSRV_MAX_BRIDGE_IN_SIZE 0x1000
#define PVRSRV_MAX_BRIDGE_OUT_SIZE 0x1000
+struct PVR_PCI_DEV {
+ struct pci_dev *psPCIDev;
+ enum HOST_PCI_INIT_FLAGS ePCIFlags;
+ IMG_BOOL abPCIResourceInUse[DEVICE_COUNT_RESOURCE];
+};
+
struct ENV_DATA {
void *pvBridgeData;
struct pm_dev *psPowerDevice;
void *pvISRCookie;
struct workqueue_struct *psMISRWorkqueue;
struct work_struct sMISRWork;
+ void *pvSysData;
struct workqueue_struct *psPerfWorkqueue;
struct delayed_work sPerfWork;
- void *pvSysData; /*for MISR work */
};
#endif
*
******************************************************************************/
-#include <linux/version.h>
-#include <linux/errno.h>
-#include <linux/mutex.h>
-#include <linux/module.h>
+#ifndef __ENV_PERPROC_H__
+#define __ENV_PERPROC_H__
-#include "img_defs.h"
-#include "services.h"
+#include "linux/list.h"
+#include "linux/proc_fs.h"
-#include "mutex.h"
+#include "img_types.h"
-void LinuxInitMutex(struct mutex *psPVRSRVMutex)
-{
- mutex_init(psPVRSRVMutex);
-}
+struct PVRSRV_ENV_PER_PROCESS_DATA {
+ void *hBlockAlloc;
+ struct proc_dir_entry *psProcDir;
+};
-void LinuxLockMutex(struct mutex *psPVRSRVMutex)
-{
- mutex_lock(psPVRSRVMutex);
-}
+void RemovePerProcessProcDir(struct PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc);
-enum PVRSRV_ERROR LinuxLockMutexInterruptible(struct mutex *psPVRSRVMutex)
-{
- if (mutex_lock_interruptible(psPVRSRVMutex) == -EINTR)
- return PVRSRV_ERROR_GENERIC;
- else
- return PVRSRV_OK;
-}
+enum PVRSRV_ERROR LinuxMMapPerProcessConnect(
+ struct PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc);
-s32 LinuxTryLockMutex(struct mutex *psPVRSRVMutex)
-{
- return mutex_trylock(psPVRSRVMutex);
-}
+void LinuxMMapPerProcessDisconnect(
+ struct PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc);
-void LinuxUnLockMutex(struct mutex *psPVRSRVMutex)
-{
- mutex_unlock(psPVRSRVMutex);
-}
-
-IMG_BOOL LinuxIsLockedMutex(struct mutex *psPVRSRVMutex)
-{
- return mutex_is_locked(psPVRSRVMutex);
-}
+enum PVRSRV_ERROR LinuxMMapPerProcessHandleOptions(
+ struct PVRSRV_HANDLE_BASE *psHandleBase);
+#endif
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/version.h>
#include <linux/io.h>
#include <asm/page.h>
#include "env_data.h"
#include "proc.h"
#include "mutex.h"
+#include "lock.h"
#include "event.h"
struct PVRSRV_LINUX_EVENT_OBJECT_LIST {
struct PVRSRV_LINUX_EVENT_OBJECT {
atomic_t sTimeStamp;
u32 ui32TimeStampPrevious;
-#ifdef DEBUG
- unsigned int ui32Stats;
+#if defined(DEBUG)
+ unsigned ui32Stats;
#endif
wait_queue_head_t sWait;
struct list_head sList;
sizeof(struct PVRSRV_LINUX_EVENT_OBJECT_LIST),
(void **) &psEvenObjectList, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "LinuxEventObjectCreate: "
- "failed to allocate memory for event list");
+ "failed to allocate memory for event list");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
enum PVRSRV_ERROR LinuxEventObjectListDestroy(void *hEventObjectList)
{
-
struct PVRSRV_LINUX_EVENT_OBJECT_LIST *psEvenObjectList =
(struct PVRSRV_LINUX_EVENT_OBJECT_LIST *)hEventObjectList;
if (psEvenObjectList) {
if (!list_empty(&psEvenObjectList->sList)) {
- PVR_DPF(PVR_DBG_ERROR, "LinuxEventObjectListDestroy: "
- "Event List is not empty");
+ PVR_DPF(PVR_DBG_ERROR,
+ "LinuxEventObjectListDestroy: Event List is not empty");
return PVRSRV_ERROR_GENERIC;
}
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
if (hOSEventObject) {
struct PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject =
(struct PVRSRV_LINUX_EVENT_OBJECT *)hOSEventObject;
-#ifdef DEBUG
- PVR_DPF(PVR_DBG_MESSAGE, "LinuxEventObjectListDelete: "
- "Event object waits: %lu",
+#if defined(DEBUG)
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "LinuxEventObjectListDelete: Event object waits: %lu",
psLinuxEventObject->ui32Stats);
#endif
ResManFreeResByPtr(psLinuxEventObject->hResItem);
+
return PVRSRV_OK;
}
return PVRSRV_ERROR_GENERIC;
struct PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList =
psLinuxEventObject->psLinuxEventObjectList;
+ PVR_UNREFERENCED_PARAMETER(ui32Param);
+
write_lock_bh(&psLinuxEventObjectList->sLock);
list_del(&psLinuxEventObject->sList);
write_unlock_bh(&psLinuxEventObjectList->sLock);
-#ifdef DEBUG
+#if defined(DEBUG)
PVR_DPF(PVR_DBG_MESSAGE,
"LinuxEventObjectDeleteCallback: Event object waits: %lu",
psLinuxEventObject->ui32Stats);
psPerProc = PVRSRVPerProcessData(ui32PID);
if (psPerProc == NULL) {
- PVR_DPF(PVR_DBG_ERROR, "LinuxEventObjectAdd: "
- "Couldn't find per-process data");
+ PVR_DPF(PVR_DBG_ERROR,
+ "LinuxEventObjectAdd: Couldn't find per-process data");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
atomic_set(&psLinuxEventObject->sTimeStamp, 0);
psLinuxEventObject->ui32TimeStampPrevious = 0;
-#ifdef DEBUG
+#if defined(DEBUG)
psLinuxEventObject->ui32Stats = 0;
#endif
init_waitqueue_head(&psLinuxEventObject->sWait);
list_for_each_safe(psListEntry, psListEntryTemp, psList) {
- psLinuxEventObject = list_entry(psListEntry,
+ psLinuxEventObject =
+ (struct PVRSRV_LINUX_EVENT_OBJECT *)list_entry(psListEntry,
struct PVRSRV_LINUX_EVENT_OBJECT,
sList);
enum PVRSRV_ERROR LinuxEventObjectWait(void *hOSEventObject, u32 ui32MSTimeout)
{
+ u32 ui32TimeStamp;
DEFINE_WAIT(sWait);
struct PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject =
do {
prepare_to_wait(&psLinuxEventObject->sWait, &sWait,
TASK_INTERRUPTIBLE);
+ ui32TimeStamp = atomic_read(&psLinuxEventObject->sTimeStamp);
- if (psLinuxEventObject->ui32TimeStampPrevious !=
- atomic_read(&psLinuxEventObject->sTimeStamp))
+ if (psLinuxEventObject->ui32TimeStampPrevious != ui32TimeStamp)
break;
- LinuxUnLockMutex(&gPVRSRVLock);
- ui32TimeOutJiffies = schedule_timeout(ui32TimeOutJiffies);
-#ifdef DEBUG
+ mutex_unlock(&gPVRSRVLock);
+
+ ui32TimeOutJiffies =
+ (u32) schedule_timeout((s32) ui32TimeOutJiffies);
+
+ mutex_lock(&gPVRSRVLock);
+#if defined(DEBUG)
psLinuxEventObject->ui32Stats++;
#endif
- LinuxLockMutex(&gPVRSRVLock);
+
} while (ui32TimeOutJiffies);
finish_wait(&psLinuxEventObject->sWait, &sWait);
- psLinuxEventObject->ui32TimeStampPrevious =
- atomic_read(&psLinuxEventObject->sTimeStamp);
+ psLinuxEventObject->ui32TimeStampPrevious = ui32TimeStamp;
return ui32TimeOutJiffies ? PVRSRV_OK : PVRSRV_ERROR_TIMEOUT;
enum PVRSRV_ERROR LinuxEventObjectListCreate(void **phEventObjectList);
enum PVRSRV_ERROR LinuxEventObjectListDestroy(void *hEventObjectList);
enum PVRSRV_ERROR LinuxEventObjectAdd(void *hOSEventObjectList,
- void **phOSEventObject);
+ void **phOSEventObject);
enum PVRSRV_ERROR LinuxEventObjectDelete(void *hOSEventObjectList,
- void *hOSEventObject);
+ void *hOSEventObject);
enum PVRSRV_ERROR LinuxEventObjectSignal(void *hOSEventObjectList);
enum PVRSRV_ERROR LinuxEventObjectWait(void *hOSEventObject, u32 ui32MSTimeout);
#include "handle.h"
#ifdef DEBUG
-#define HANDLE_BLOCK_SIZE 1
+#define HANDLE_BLOCK_SIZE 1
#else
-#define HANDLE_BLOCK_SIZE 256
+#define HANDLE_BLOCK_SIZE 256
#endif
#define HANDLE_HASH_TAB_INIT_SIZE 32
-#define INDEX_IS_VALID(psBase, i) ((i) < (psBase)->ui32TotalHandCount)
+#define DEFAULT_MAX_INDEX_PLUS_ONE 0xfffffffful
+#define DEFAULT_MAX_HANDLE DEFAULT_MAX_INDEX_PLUS_ONE
-#define INDEX_TO_HANDLE(psBase, idx) ((void *)((idx) + 1))
-#define HANDLE_TO_INDEX(psBase, hand) ((u32)(hand) - 1)
+#define INDEX_IS_VALID(psBase, i) ((i) < (psBase)->ui32TotalHandCount)
-#define INDEX_TO_HANDLE_PTR(psBase, i) (((psBase)->psHandleArray) + (i))
+#define INDEX_TO_HANDLE(psBase, idx) ((void *)((idx) + 1))
+#define HANDLE_TO_INDEX(psBase, hand) ((u32)(hand) - 1)
+
+#define INDEX_TO_HANDLE_PTR(psBase, i) (((psBase)->psHandleArray) + (i))
#define HANDLE_TO_HANDLE_PTR(psBase, h) \
(INDEX_TO_HANDLE_PTR(psBase, HANDLE_TO_INDEX(psBase, h)))
#define HANDLE_PTR_TO_HANDLE(psBase, psHandle) \
INDEX_TO_HANDLE(psBase, HANDLE_PTR_TO_INDEX(psBase, psHandle))
-#define ROUND_UP_TO_MULTIPLE(a, b) ((((a) + (b) - 1) / (b)) * (b))
+#define ROUND_UP_TO_MULTIPLE(a, b) ((((a) + (b) - 1) / (b)) * (b))
-#define HANDLES_BATCHED(psBase) ((psBase)->ui32HandBatchSize != 0)
+#define HANDLES_BATCHED(psBase) ((psBase)->ui32HandBatchSize != 0)
-#define SET_FLAG(v, f) ((void)((v) |= (f)))
-#define CLEAR_FLAG(v, f) ((void)((v) &= ~(f)))
-#define TEST_FLAG(v, f) ((IMG_BOOL)(((v) & (f)) != 0))
+#define SET_FLAG(v, f) ((void)((v) |= (f)))
+#define CLEAR_FLAG(v, f) ((void)((v) &= ~(f)))
+#define TEST_FLAG(v, f) ((IMG_BOOL)(((v) & (f)) != 0))
-#define TEST_ALLOC_FLAG(psHandle, f) TEST_FLAG((psHandle)->eFlag, f)
+#define TEST_ALLOC_FLAG(psHandle, f) \
+ TEST_FLAG((psHandle)->eFlag, f)
-#define SET_INTERNAL_FLAG(psHandle, f) \
+#define SET_INTERNAL_FLAG(psHandle, f) \
SET_FLAG((psHandle)->eInternalFlag, f)
-#define CLEAR_INTERNAL_FLAG(psHandle, f) \
+#define CLEAR_INTERNAL_FLAG(psHandle, f) \
CLEAR_FLAG((psHandle)->eInternalFlag, f)
-#define TEST_INTERNAL_FLAG(psHandle, f) \
+#define TEST_INTERNAL_FLAG(psHandle, f) \
TEST_FLAG((psHandle)->eInternalFlag, f)
-#define BATCHED_HANDLE(psHandle) \
+#define BATCHED_HANDLE(psHandle) \
TEST_INTERNAL_FLAG(psHandle, INTERNAL_HANDLE_FLAG_BATCHED)
-#define SET_BATCHED_HANDLE(psHandle) \
+#define SET_BATCHED_HANDLE(psHandle) \
SET_INTERNAL_FLAG(psHandle, INTERNAL_HANDLE_FLAG_BATCHED)
-#define SET_UNBATCHED_HANDLE(psHandle) \
+#define SET_UNBATCHED_HANDLE(psHandle) \
CLEAR_INTERNAL_FLAG(psHandle, INTERNAL_HANDLE_FLAG_BATCHED)
-#define BATCHED_HANDLE_PARTIALLY_FREE(psHandle) \
- TEST_INTERNAL_FLAG(psHandle, \
+#define BATCHED_HANDLE_PARTIALLY_FREE(psHandle) \
+ TEST_INTERNAL_FLAG(psHandle, \
INTERNAL_HANDLE_FLAG_BATCHED_PARTIALLY_FREE)
-#define SET_BATCHED_HANDLE_PARTIALLY_FREE(psHandle) \
- SET_INTERNAL_FLAG(psHandle, \
+#define SET_BATCHED_HANDLE_PARTIALLY_FREE(psHandle) \
+ SET_INTERNAL_FLAG(psHandle, \
INTERNAL_HANDLE_FLAG_BATCHED_PARTIALLY_FREE)
+#define HANDLE_STRUCT_IS_FREE(psHandle) \
+ ((psHandle)->eType == PVRSRV_HANDLE_TYPE_NONE && \
+ (psHandle)->eInternalFlag == INTERNAL_HANDLE_FLAG_NONE)
+
+#ifdef MIN
+#undef MIN
+#endif
+
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+
struct sHandleList {
u32 ui32Prev;
u32 ui32Next;
};
enum ePVRSRVInternalHandleFlag {
+ INTERNAL_HANDLE_FLAG_NONE = 0x00,
INTERNAL_HANDLE_FLAG_BATCHED = 0x01,
INTERNAL_HANDLE_FLAG_BATCHED_PARTIALLY_FREE = 0x02,
};
u32 ui32NextIndexPlusOne;
enum ePVRSRVInternalHandleFlag eInternalFlag;
enum PVRSRV_HANDLE_ALLOC_FLAG eFlag;
- u32 ui32PID;
+
u32 ui32Index;
struct sHandleList sChildren;
struct sHandleList sSiblings;
struct PVRSRV_HANDLE_BASE {
void *hBaseBlockAlloc;
- u32 ui32PID;
+
void *hHandBlockAlloc;
- struct RESMAN_ITEM *psResManItem;
+
struct sHandle *psHandleArray;
struct HASH_TABLE *psHashTab;
u32 ui32FreeHandCount;
u32 ui32FirstFreeIndex;
+
+ u32 ui32MaxIndexPlusOne;
+
u32 ui32TotalHandCount;
u32 ui32LastFreeIndexPlusOne;
u32 ui32HandBatchSize;
u32 ui32TotalHandCountPreBatch;
u32 ui32FirstBatchIndexPlusOne;
u32 ui32BatchHandAllocFailures;
+
+ IMG_BOOL bPurgingEnabled;
};
enum eHandKey {
struct PVRSRV_HANDLE_BASE *gpsKernelHandleBase;
-typedef u32 HAND_KEY[HAND_KEY_LEN];
-
static inline void HandleListInit(u32 ui32Index, struct sHandleList *psList,
void *hParent)
{
(((i) == (p)) ? (po) : (eo))))
static inline void HandleListInsertBefore(struct PVRSRV_HANDLE_BASE *psBase,
- u32 ui32InsIndex,
- struct sHandleList *psIns,
- size_t uiParentOffset,
- u32 ui32EntryIndex,
+ u32 ui32InsIndex, struct sHandleList *psIns,
+ size_t uiParentOffset, u32 ui32EntryIndex,
struct sHandleList *psEntry,
- size_t uiEntryOffset,
- u32 ui32ParentIndex)
+ size_t uiEntryOffset, u32 ui32ParentIndex)
{
struct sHandleList *psPrevIns =
LIST_PTR_FROM_INDEX_AND_OFFSET(psBase, psIns->ui32Prev,
}
static inline enum PVRSRV_ERROR HandleListIterate(
- struct PVRSRV_HANDLE_BASE *psBase,
- struct sHandleList *psHead,
- size_t uiParentOffset,
- size_t uiEntryOffset,
- enum PVRSRV_ERROR(*pfnIterFunc)
- (struct PVRSRV_HANDLE_BASE *,
- struct sHandle *))
+ struct PVRSRV_HANDLE_BASE *psBase, struct sHandleList *psHead,
+ size_t uiParentOffset, size_t uiEntryOffset,
+ enum PVRSRV_ERROR(*pfnIterFunc)(struct PVRSRV_HANDLE_BASE *,
+ struct sHandle *))
{
u32 ui32Index;
u32 ui32Parent = HANDLE_TO_INDEX(psBase, psHead->hParent);
ui32Index = psEntry->ui32Next;
- eError = (*pfnIterFunc) (psBase, psHandle);
+ eError = (*pfnIterFunc)(psBase, psHandle);
if (eError != PVRSRV_OK)
return eError;
}
}
static inline enum PVRSRV_ERROR IterateOverChildren(
- struct PVRSRV_HANDLE_BASE *psBase,
- struct sHandle *psParent,
- enum PVRSRV_ERROR(*pfnIterFunc)
+ struct PVRSRV_HANDLE_BASE *psBase,
+ struct sHandle *psParent,
+ enum PVRSRV_ERROR(*pfnIterFunc)
(struct PVRSRV_HANDLE_BASE *, struct sHandle *))
{
return HandleListIterate(psBase, &psParent->sChildren,
static inline enum PVRSRV_ERROR GetHandleStructure(
struct PVRSRV_HANDLE_BASE *psBase,
- struct sHandle **ppsHandle,
- void *hHandle,
+ struct sHandle **ppsHandle, void *hHandle,
enum PVRSRV_HANDLE_TYPE eType)
{
u32 ui32Index = HANDLE_TO_INDEX(psBase, hHandle);
struct sHandle *psHandle;
if (!INDEX_IS_VALID(psBase, ui32Index)) {
- PVR_DPF(PVR_DBG_ERROR, "GetHandleStructure: "
- "Handle index out of range (%u >= %u)",
+ PVR_DPF(PVR_DBG_ERROR,
+ "GetHandleStructure: Handle index out of range (%u >= %u)",
ui32Index, psBase->ui32TotalHandCount);
return PVRSRV_ERROR_GENERIC;
}
psHandle = INDEX_TO_HANDLE_PTR(psBase, ui32Index);
if (psHandle->eType == PVRSRV_HANDLE_TYPE_NONE) {
- PVR_DPF(PVR_DBG_ERROR, "GetHandleStructure: "
- "Handle not allocated (index: %u)", ui32Index);
+ PVR_DPF(PVR_DBG_ERROR,
+ "GetHandleStructure: Handle not allocated (index: %u)",
+ ui32Index);
return PVRSRV_ERROR_GENERIC;
}
return PVRSRV_ERROR_GENERIC;
}
- PVR_ASSERT(psBase->ui32PID == psHandle->ui32PID);
-
*ppsHandle = psHandle;
return PVRSRV_OK;
ParentHandle(psHandle) : NULL;
}
-static inline void InitKey(HAND_KEY aKey, struct PVRSRV_HANDLE_BASE *psBase,
- void *pvData, enum PVRSRV_HANDLE_TYPE eType,
- void *hParent)
+static inline void InitKey(u32 aKey[HAND_KEY_LEN],
+ struct PVRSRV_HANDLE_BASE *psBase,
+ void *pvData, enum PVRSRV_HANDLE_TYPE eType,
+ void *hParent)
{
PVR_UNREFERENCED_PARAMETER(psBase);
static void FreeHandleArray(struct PVRSRV_HANDLE_BASE *psBase)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
-
if (psBase->psHandleArray != NULL) {
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- psBase->ui32TotalHandCount *
- sizeof(struct sHandle),
- psBase->psHandleArray,
- psBase->hHandBlockAlloc);
-
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ psBase->ui32TotalHandCount *
+ sizeof(struct sHandle),
+ psBase->psHandleArray,
+ psBase->hHandBlockAlloc);
psBase->psHandleArray = NULL;
}
}
static enum PVRSRV_ERROR FreeHandle(struct PVRSRV_HANDLE_BASE *psBase,
struct sHandle *psHandle)
{
- HAND_KEY aKey;
+ u32 aKey[HAND_KEY_LEN];
u32 ui32Index = HANDLE_PTR_TO_INDEX(psBase, psHandle);
enum PVRSRV_ERROR eError;
- PVR_ASSERT(psBase->ui32PID == psHandle->ui32PID);
-
InitKey(aKey, psBase, psHandle->pvData, psHandle->eType,
ParentIfPrivate(psHandle));
- if (!TEST_ALLOC_FLAG(psHandle, PVRSRV_HANDLE_ALLOC_FLAG_MULTI)
- && !BATCHED_HANDLE_PARTIALLY_FREE(psHandle)) {
+ if (!TEST_ALLOC_FLAG(psHandle, PVRSRV_HANDLE_ALLOC_FLAG_MULTI) &&
+ !BATCHED_HANDLE_PARTIALLY_FREE(psHandle)) {
void *hHandle;
- hHandle =
- (void *) HASH_Remove_Extended(psBase->psHashTab, aKey);
+ hHandle = (void *)HASH_Remove_Extended(psBase->psHashTab, aKey);
PVR_ASSERT(hHandle != NULL);
PVR_ASSERT(hHandle == INDEX_TO_HANDLE(psBase, ui32Index));
psHandle->eType = PVRSRV_HANDLE_TYPE_NONE;
- if (BATCHED_HANDLE(psHandle)
- && !BATCHED_HANDLE_PARTIALLY_FREE(psHandle)) {
+ if (BATCHED_HANDLE(psHandle) &&
+ !BATCHED_HANDLE_PARTIALLY_FREE(psHandle)) {
SET_BATCHED_HANDLE_PARTIALLY_FREE(psHandle);
-
return PVRSRV_OK;
}
- if (psBase->ui32FreeHandCount == 0) {
- PVR_ASSERT(psBase->ui32FirstFreeIndex == 0);
- PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne == 0);
-
- psBase->ui32FirstFreeIndex = ui32Index;
- } else {
+ if (!psBase->bPurgingEnabled) {
+ if (psBase->ui32FreeHandCount == 0) {
+ PVR_ASSERT(psBase->ui32FirstFreeIndex == 0);
+ PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne == 0);
- PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne != 0);
- PVR_ASSERT(INDEX_TO_HANDLE_PTR
- (psBase,
- psBase->ui32LastFreeIndexPlusOne -
- 1)->ui32NextIndexPlusOne == 0);
-
- INDEX_TO_HANDLE_PTR(psBase,
+ psBase->ui32FirstFreeIndex = ui32Index;
+ } else {
+ PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne != 0);
+ PVR_ASSERT(INDEX_TO_HANDLE_PTR
+ (psBase,
psBase->ui32LastFreeIndexPlusOne -
- 1)->ui32NextIndexPlusOne = ui32Index + 1;
+ 1)->ui32NextIndexPlusOne == 0);
+ INDEX_TO_HANDLE_PTR(psBase,
+ psBase->ui32LastFreeIndexPlusOne -
+ 1)->ui32NextIndexPlusOne =
+ ui32Index + 1;
+ }
+ PVR_ASSERT(psHandle->ui32NextIndexPlusOne == 0);
+ psBase->ui32LastFreeIndexPlusOne = ui32Index + 1;
}
- PVR_ASSERT(psHandle->ui32NextIndexPlusOne == 0);
-
- psBase->ui32LastFreeIndexPlusOne = ui32Index + 1;
-
psBase->ui32FreeHandCount++;
return PVRSRV_OK;
FreeHandleArray(psBase);
if (psBase->psHashTab != NULL)
-
HASH_Delete(psBase->psHashTab);
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(*psBase), psBase, psBase->hBaseBlockAlloc);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psBase), psBase,
+ psBase->hBaseBlockAlloc);
return PVRSRV_OK;
}
static inline void *FindHandle(struct PVRSRV_HANDLE_BASE *psBase, void *pvData,
enum PVRSRV_HANDLE_TYPE eType, void *hParent)
{
- HAND_KEY aKey;
+ u32 aKey[HAND_KEY_LEN];
PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE);
return (void *)HASH_Retrieve_Extended(psBase->psHashTab, aKey);
}
-static enum PVRSRV_ERROR IncreaseHandleArraySize(
- struct PVRSRV_HANDLE_BASE *psBase,
- u32 ui32Delta)
+static enum PVRSRV_ERROR ReallocMem(void **ppvMem, void **phBlockAlloc,
+ u32 ui32NewSize, u32 ui32OldSize)
+{
+ void *pvOldMem = *ppvMem;
+ void *hOldBlockAlloc = *phBlockAlloc;
+ u32 ui32CopySize = MIN(ui32NewSize, ui32OldSize);
+ void *pvNewMem = NULL;
+ void *hNewBlockAlloc = NULL;
+ enum PVRSRV_ERROR eError;
+
+ if (ui32NewSize == ui32OldSize)
+ return PVRSRV_OK;
+
+ if (ui32NewSize != 0) {
+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ ui32NewSize, &pvNewMem, &hNewBlockAlloc);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "ReallocMem: Couldn't allocate new memory area (%d)",
+ eError);
+ return eError;
+ }
+ }
+
+ if (ui32CopySize != 0)
+ OSMemCopy(pvNewMem, pvOldMem, ui32CopySize);
+
+ if (ui32OldSize != 0)
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32OldSize, pvOldMem,
+ hOldBlockAlloc);
+
+ *ppvMem = pvNewMem;
+ *phBlockAlloc = hNewBlockAlloc;
+
+ return PVRSRV_OK;
+}
+
+static inline enum PVRSRV_ERROR ReallocHandleArray(struct PVRSRV_HANDLE_BASE
+ *psBase, u32 ui32NewCount,
+ u32 ui32OldCount)
+{
+ return ReallocMem((void **)&psBase->psHandleArray,
+ &psBase->hHandBlockAlloc,
+ ui32NewCount * sizeof(struct sHandle),
+ ui32OldCount * sizeof(struct sHandle));
+}
+
+static enum PVRSRV_ERROR IncreaseHandleArraySize(struct PVRSRV_HANDLE_BASE
+ *psBase, u32 ui32Delta)
{
- struct sHandle *psNewHandleArray;
- void *hNewHandBlockAlloc;
enum PVRSRV_ERROR eError;
struct sHandle *psHandle;
- u32 ui32DeltaRounded =
+ u32 ui32DeltaAdjusted =
ROUND_UP_TO_MULTIPLE(ui32Delta, HANDLE_BLOCK_SIZE);
u32 ui32NewTotalHandCount =
- psBase->ui32TotalHandCount + ui32DeltaRounded;
- ;
+ psBase->ui32TotalHandCount + ui32DeltaAdjusted;
+
+ PVR_ASSERT(ui32Delta != 0);
- eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- ui32NewTotalHandCount * sizeof(struct sHandle),
- (void **) &psNewHandleArray,
- &hNewHandBlockAlloc);
+ if (ui32NewTotalHandCount > psBase->ui32MaxIndexPlusOne ||
+ ui32NewTotalHandCount <= psBase->ui32TotalHandCount) {
+ ui32NewTotalHandCount = psBase->ui32MaxIndexPlusOne;
+
+ ui32DeltaAdjusted =
+ ui32NewTotalHandCount - psBase->ui32TotalHandCount;
+
+ if (ui32DeltaAdjusted < ui32Delta) {
+ PVR_DPF(PVR_DBG_ERROR, "IncreaseHandleArraySize: "
+ "Maximum handle limit reached (%d)",
+ psBase->ui32MaxIndexPlusOne);
+ return PVRSRV_ERROR_OUT_OF_MEMORY;
+ }
+ }
+
+ PVR_ASSERT(ui32DeltaAdjusted >= ui32Delta);
+
+ eError = ReallocHandleArray(psBase, ui32NewTotalHandCount,
+ psBase->ui32TotalHandCount);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "IncreaseHandleArraySize: "
- "Couldn't allocate new handle array (%d)",
+ "ReallocHandleArray failed (%d)",
eError);
return eError;
}
- if (psBase->psHandleArray != NULL)
- OSMemCopy(psNewHandleArray,
- psBase->psHandleArray,
- psBase->ui32TotalHandCount * sizeof(struct sHandle));
-
- for (psHandle = psNewHandleArray + psBase->ui32TotalHandCount;
- psHandle < psNewHandleArray + ui32NewTotalHandCount; psHandle++) {
+ for (psHandle = psBase->psHandleArray + psBase->ui32TotalHandCount;
+ psHandle < psBase->psHandleArray + ui32NewTotalHandCount;
+ psHandle++) {
psHandle->eType = PVRSRV_HANDLE_TYPE_NONE;
+ psHandle->eInternalFlag = INTERNAL_HANDLE_FLAG_NONE;
psHandle->ui32NextIndexPlusOne = 0;
}
- FreeHandleArray(psBase);
-
- psBase->psHandleArray = psNewHandleArray;
- psBase->hHandBlockAlloc = hNewHandBlockAlloc;
-
- psBase->ui32FreeHandCount += ui32DeltaRounded;
+ psBase->ui32FreeHandCount += ui32DeltaAdjusted;
if (psBase->ui32FirstFreeIndex == 0) {
PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne == 0);
psBase->ui32FirstFreeIndex = psBase->ui32TotalHandCount;
} else {
- PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne != 0);
- PVR_ASSERT(INDEX_TO_HANDLE_PTR
- (psBase,
- psBase->ui32LastFreeIndexPlusOne -
- 1)->ui32NextIndexPlusOne == 0);
-
- INDEX_TO_HANDLE_PTR(psBase,
- psBase->ui32LastFreeIndexPlusOne -
- 1)->ui32NextIndexPlusOne =
- psBase->ui32TotalHandCount + 1;
-
+ if (!psBase->bPurgingEnabled) {
+ PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne != 0);
+ PVR_ASSERT(INDEX_TO_HANDLE_PTR
+ (psBase,
+ psBase->ui32LastFreeIndexPlusOne -
+ 1)->ui32NextIndexPlusOne == 0);
+
+ INDEX_TO_HANDLE_PTR(psBase,
+ psBase->ui32LastFreeIndexPlusOne -
+ 1)->ui32NextIndexPlusOne =
+ psBase->ui32TotalHandCount + 1;
+ }
}
- psBase->ui32LastFreeIndexPlusOne = ui32NewTotalHandCount;
+
+ if (!psBase->bPurgingEnabled)
+ psBase->ui32LastFreeIndexPlusOne = ui32NewTotalHandCount;
psBase->ui32TotalHandCount = ui32NewTotalHandCount;
eError = IncreaseHandleArraySize(psBase, ui32FreeHandDelta);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "EnsureFreeHandles: "
- "Couldn't allocate %u handles "
- "to ensure %u free handles "
- "(IncreaseHandleArraySize failed with error %d)",
+ "Couldn't allocate %u handles to ensure %u "
+ "free handles (IncreaseHandleArraySize "
+ "failed with error %d)",
ui32FreeHandDelta, ui32Free, eError);
return eError;
void *hParent)
{
u32 ui32NewIndex;
- struct sHandle *psNewHandle;
+ struct sHandle *psNewHandle = NULL;
void *hHandle;
- HAND_KEY aKey;
+ u32 aKey[HAND_KEY_LEN];
enum PVRSRV_ERROR eError;
PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE);
PVR_ASSERT(psBase->psHashTab != NULL);
- if (!TEST_FLAG(eFlag, PVRSRV_HANDLE_ALLOC_FLAG_MULTI)) {
-
- PVR_ASSERT(FindHandle(psBase, pvData, eType, hParent) ==
- NULL);
- }
+ if (!TEST_FLAG(eFlag, PVRSRV_HANDLE_ALLOC_FLAG_MULTI))
+ PVR_ASSERT(FindHandle(psBase, pvData, eType, hParent) == NULL);
- if (psBase->ui32FreeHandCount == 0 && HANDLES_BATCHED(psBase)) {
+ if (psBase->ui32FreeHandCount == 0 && HANDLES_BATCHED(psBase))
PVR_DPF(PVR_DBG_WARNING, "AllocHandle: "
"Handle batch size (%u) was too small, "
"allocating additional space",
psBase->ui32HandBatchSize);
- }
eError = EnsureFreeHandles(psBase, 1);
if (eError != PVRSRV_OK) {
}
PVR_ASSERT(psBase->ui32FreeHandCount != 0);
- ui32NewIndex = psBase->ui32FirstFreeIndex;
+ if (!psBase->bPurgingEnabled) {
+ ui32NewIndex = psBase->ui32FirstFreeIndex;
+ psNewHandle = INDEX_TO_HANDLE_PTR(psBase, ui32NewIndex);
+ } else {
+ for (ui32NewIndex = psBase->ui32FirstFreeIndex;
+ ui32NewIndex < psBase->ui32TotalHandCount;
+ ui32NewIndex++) {
+ psNewHandle = INDEX_TO_HANDLE_PTR(psBase, ui32NewIndex);
+ if (HANDLE_STRUCT_IS_FREE(psNewHandle))
+ break;
- psNewHandle = INDEX_TO_HANDLE_PTR(psBase, ui32NewIndex);
+ }
+ psBase->ui32FirstFreeIndex = 0;
+ PVR_ASSERT(ui32NewIndex < psBase->ui32TotalHandCount);
+ }
+ PVR_ASSERT(psNewHandle != NULL);
hHandle = INDEX_TO_HANDLE(psBase, ui32NewIndex);
if (!HASH_Insert_Extended
(psBase->psHashTab, aKey, (u32) hHandle)) {
PVR_DPF(PVR_DBG_ERROR, "AllocHandle: "
- "Couldn't add handle to hash table");
+ "Couldn't add handle to hash table");
return PVRSRV_ERROR_GENERIC;
}
psBase->ui32FreeHandCount--;
- if (psBase->ui32FreeHandCount == 0) {
- PVR_ASSERT(psBase->ui32FirstFreeIndex == ui32NewIndex);
- PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne ==
- (ui32NewIndex + 1));
-
- psBase->ui32LastFreeIndexPlusOne = 0;
- psBase->ui32FirstFreeIndex = 0;
- } else {
+ if (!psBase->bPurgingEnabled) {
+ if (psBase->ui32FreeHandCount == 0) {
+ PVR_ASSERT(psBase->ui32FirstFreeIndex == ui32NewIndex);
+ PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne ==
+ (ui32NewIndex + 1));
- psBase->ui32FirstFreeIndex =
- (psNewHandle->ui32NextIndexPlusOne ==
- 0) ? ui32NewIndex + 1 : psNewHandle->ui32NextIndexPlusOne -
- 1;
+ psBase->ui32LastFreeIndexPlusOne = 0;
+ psBase->ui32FirstFreeIndex = 0;
+ } else {
+ psBase->ui32FirstFreeIndex =
+ (psNewHandle->ui32NextIndexPlusOne ==
+ 0) ? ui32NewIndex +
+ 1 : psNewHandle->ui32NextIndexPlusOne - 1;
+ }
}
psNewHandle->eType = eType;
psNewHandle->pvData = pvData;
- psNewHandle->eInternalFlag = 0;
+ psNewHandle->eInternalFlag = INTERNAL_HANDLE_FLAG_NONE;
psNewHandle->eFlag = eFlag;
- psNewHandle->ui32PID = psBase->ui32PID;
psNewHandle->ui32Index = ui32NewIndex;
InitParentList(psBase, psNewHandle);
*phHandle = NULL;
if (HANDLES_BATCHED(psBase))
-
psBase->ui32BatchHandAllocFailures++;
PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE);
if (!TEST_FLAG(eFlag, PVRSRV_HANDLE_ALLOC_FLAG_MULTI)) {
-
hHandle = FindHandle(psBase, pvData, eType, NULL);
if (hHandle != NULL) {
struct sHandle *psHandle;
GetHandleStructure(psBase, &psHandle, hHandle,
eType);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVAllocHandle: "
- "Lookup of existing handle failed");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVAllocHandle: "
+ "Lookup of existing handle failed");
return eError;
}
- if (TEST_FLAG
- (psHandle->eFlag & eFlag,
+ if (TEST_FLAG(psHandle->eFlag & eFlag,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED)) {
*phHandle = hHandle;
eError = PVRSRV_OK;
hParentKey = TEST_FLAG(eFlag, PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE) ?
hParent : NULL;
- eError =
- GetHandleStructure(psBase, &psPHand, hParent,
+ eError = GetHandleStructure(psBase, &psPHand, hParent,
PVRSRV_HANDLE_TYPE_NONE);
if (eError != PVRSRV_OK)
return PVRSRV_ERROR_GENERIC;
struct sHandle *psCHandle;
enum PVRSRV_ERROR eErr;
- eErr =
- GetHandleStructure(psBase, &psCHandle, hHandle,
+ eErr = GetHandleStructure(psBase, &psCHandle, hHandle,
eType);
if (eErr != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVAllocSubHandle: "
return eErr;
}
- PVR_ASSERT(hParentKey != NULL
- &&
+ PVR_ASSERT(hParentKey != NULL &&
ParentHandle(HANDLE_TO_HANDLE_PTR
(psBase, hHandle)) == hParent);
- if (TEST_FLAG
- (psCHandle->eFlag & eFlag,
- PVRSRV_HANDLE_ALLOC_FLAG_SHARED)
- &&
+ if (TEST_FLAG(psCHandle->eFlag & eFlag,
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED) &&
ParentHandle(HANDLE_TO_HANDLE_PTR(psBase, hHandle))
== hParent) {
*phHandle = hHandle;
}
}
- eError =
- AllocHandle(psBase, &hHandle, pvData, eType, eFlag, hParentKey);
+ eError = AllocHandle(psBase, &hHandle, pvData, eType, eFlag,
+ hParentKey);
if (eError != PVRSRV_OK)
return eError;
PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE);
- hHandle = (void *) FindHandle(psBase, pvData, eType, NULL);
- if (hHandle == NULL) {
- PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVFindHandle: couldn't find handle");
+ hHandle = (void *)FindHandle(psBase, pvData, eType, NULL);
+ if (hHandle == NULL)
return PVRSRV_ERROR_GENERIC;
- }
*phHandle = hHandle;
struct sHandle *psHandle;
enum PVRSRV_ERROR eError;
- eError =
- GetHandleStructure(psBase, &psHandle, hHandle,
+ eError = GetHandleStructure(psBase, &psHandle, hHandle,
PVRSRV_HANDLE_TYPE_NONE);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVLookupHandleAnyType: "
eError = GetHandleStructure(psBase, &psCHand, hHandle, eType);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVLookupSubHandle: "
- "Error looking up subhandle (%d)",
+ "Error looking up subhandle (%d)",
eError);
return eError;
}
eError = GetHandleStructure(psBase, &psHandle, hHandle, eType);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVLookupAndReleaseHandle: "
- "Error looking up handle (%d)",
+ "Error looking up handle (%d)",
eError);
return eError;
}
if (HANDLES_BATCHED(psBase)) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVNewHandleBatch: "
- "There is a handle batch already in use (size %u)",
+ "There is a handle batch already in use (size %u)",
psBase->ui32HandBatchSize);
return PVRSRV_ERROR_GENERIC;
}
if (ui32BatchSize == 0) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVNewHandleBatch: "
- "Invalid batch size (%u)", ui32BatchSize);
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVNewHandleBatch: Invalid batch size (%u)",
+ ui32BatchSize);
return PVRSRV_ERROR_INVALID_PARAMS;
}
eError = EnsureFreeHandles(psBase, ui32BatchSize);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVNewHandleBatch: "
- "EnsureFreeHandles failed (error %d)", eError);
+ "EnsureFreeHandles failed (error %d)",
+ eError);
return eError;
}
if (bCommit)
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVHandleBatchCommitOrRelease: "
- "Attempting to commit batch "
- "with handle allocation failures.");
+ "Attempting to commit batch with handle "
+ "allocation failures.");
bCommitBatch = IMG_FALSE;
}
eError = FreeHandle(psBase, psHandle);
if (eError != PVRSRV_OK)
PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVHandleBatchCommitOrRelease: "
- "Error freeing handle (%d)", eError);
+ "PVRSRVHandleBatchCommitOrRelease: "
+ "Error freeing handle (%d)",
+ eError);
PVR_ASSERT(eError == PVRSRV_OK);
} else {
SET_UNBATCHED_HANDLE(psHandle);
(void)PVRSRVHandleBatchCommitOrRelease(psBase, IMG_FALSE);
}
-enum PVRSRV_ERROR PVRSRVAllocHandleBase(struct PVRSRV_HANDLE_BASE **ppsBase,
- u32 ui32PID)
+enum PVRSRV_ERROR PVRSRVSetMaxHandle(struct PVRSRV_HANDLE_BASE *psBase,
+ u32 ui32MaxHandle)
+{
+ if (HANDLES_BATCHED(psBase)) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVSetMaxHandle: "
+ "Limit cannot be set whilst in batch mode");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
+ if (ui32MaxHandle == 0 || ui32MaxHandle > DEFAULT_MAX_HANDLE) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVSetMaxHandle: "
+ "Limit must be between %u and %u, inclusive",
+ 0, DEFAULT_MAX_HANDLE);
+
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
+ if (psBase->ui32TotalHandCount != 0) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVSetMaxHandle: "
+ "Limit cannot be set becuase handles "
+ "have already been allocated");
+
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
+ psBase->ui32MaxIndexPlusOne = ui32MaxHandle;
+
+ return PVRSRV_OK;
+}
+
+u32 PVRSRVGetMaxHandle(struct PVRSRV_HANDLE_BASE *psBase)
+{
+ return psBase->ui32MaxIndexPlusOne;
+}
+
+enum PVRSRV_ERROR PVRSRVEnableHandlePurging(struct PVRSRV_HANDLE_BASE *psBase)
+{
+ if (psBase->bPurgingEnabled) {
+ PVR_DPF(PVR_DBG_WARNING,
+ "PVRSRVEnableHandlePurging: Purging already enabled");
+ return PVRSRV_OK;
+ }
+
+ if (psBase->ui32TotalHandCount != 0) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVEnableHandlePurging: "
+ "Handles have already been allocated");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
+ psBase->bPurgingEnabled = IMG_TRUE;
+
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR PVRSRVPurgeHandles(struct PVRSRV_HANDLE_BASE *psBase)
+{
+ u32 ui32Handle;
+ u32 ui32NewHandCount;
+
+ if (!psBase->bPurgingEnabled) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVPurgeHandles: "
+ "Purging not enabled for this handle base");
+ return PVRSRV_ERROR_NOT_SUPPORTED;
+ }
+
+ if (HANDLES_BATCHED(psBase)) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVPurgeHandles: "
+ "Purging not allowed whilst in batch mode");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
+ for (ui32Handle = psBase->ui32TotalHandCount; ui32Handle != 0;
+ ui32Handle--) {
+ struct sHandle *psHandle =
+ HANDLE_TO_HANDLE_PTR(psBase, ui32Handle);
+ if (!HANDLE_STRUCT_IS_FREE(psHandle))
+ break;
+ }
+
+ ui32NewHandCount = ROUND_UP_TO_MULTIPLE(ui32Handle, HANDLE_BLOCK_SIZE);
+
+ if (ui32NewHandCount >= ui32Handle
+ && ui32NewHandCount <= (psBase->ui32TotalHandCount / 2)) {
+ u32 ui32Delta = psBase->ui32TotalHandCount - ui32NewHandCount;
+ enum PVRSRV_ERROR eError;
+
+ eError =
+ ReallocHandleArray(psBase, ui32NewHandCount,
+ psBase->ui32TotalHandCount);
+ if (eError != PVRSRV_OK)
+ return eError;
+
+ psBase->ui32TotalHandCount = ui32NewHandCount;
+ psBase->ui32FreeHandCount -= ui32Delta;
+ psBase->ui32FirstFreeIndex = 0;
+ }
+
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR PVRSRVAllocHandleBase(struct PVRSRV_HANDLE_BASE **ppsBase)
{
struct PVRSRV_HANDLE_BASE *psBase;
void *hBlockAlloc;
enum PVRSRV_ERROR eError;
- eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(*psBase),
- (void **) &psBase, &hBlockAlloc);
+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(*psBase), (void **)&psBase, &hBlockAlloc);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVAllocHandleBase: "
- "Couldn't allocate handle base (%d)",
+ "Couldn't allocate handle base (%d)",
eError);
return eError;
}
OSMemSet(psBase, 0, sizeof(*psBase));
psBase->psHashTab =
- HASH_Create_Extended(HANDLE_HASH_TAB_INIT_SIZE, sizeof(HAND_KEY),
+ HASH_Create_Extended(HANDLE_HASH_TAB_INIT_SIZE,
+ HAND_KEY_LEN * sizeof(u32),
HASH_Func_Default, HASH_Key_Comp_Default);
if (psBase->psHashTab == NULL) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVAllocHandleBase: "
- "Couldn't create data pointer hash table\n");
+ "Couldn't create data pointer hash table\n");
goto failure;
}
psBase->hBaseBlockAlloc = hBlockAlloc;
- psBase->ui32PID = ui32PID;
+
+ psBase->ui32MaxIndexPlusOne = DEFAULT_MAX_INDEX_PLUS_ONE;
*ppsBase = psBase;
PVR_ASSERT(psBase != gpsKernelHandleBase);
eError = FreeHandleBase(psBase);
+ if (eError != PVRSRV_OK)
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVFreeHandleBase: FreeHandleBase failed (%d)",
+ eError);
return eError;
}
PVR_ASSERT(gpsKernelHandleBase == NULL);
- eError = PVRSRVAllocHandleBase(&gpsKernelHandleBase, KERNEL_ID);
+ eError = PVRSRVAllocHandleBase(&gpsKernelHandleBase);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVHandleInit: PVRSRVAllocHandleBase failed (%d)",
+ eError);
+ goto error;
+ }
+
+ eError = PVRSRVEnableHandlePurging(gpsKernelHandleBase);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVHandleInit: "
+ "PVRSRVEnableHandlePurging failed (%d)",
+ eError);
+ goto error;
+ }
+ return PVRSRV_OK;
+error:
+ (void)PVRSRVHandleDeInit();
return eError;
}
if (gpsKernelHandleBase != NULL) {
eError = FreeHandleBase(gpsKernelHandleBase);
- if (eError == PVRSRV_OK)
+ if (eError == PVRSRV_OK) {
gpsKernelHandleBase = NULL;
+ } else {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVHandleDeInit: "
+ "FreeHandleBase failed (%d)",
+ eError);
+ }
}
return eError;
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO,
PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT,
PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT,
+ PVRSRV_HANDLE_TYPE_MMAP_INFO,
+ PVRSRV_HANDLE_TYPE_SOC_TIMER
};
enum PVRSRV_HANDLE_ALLOC_FLAG {
PVRSRV_HANDLE_ALLOC_FLAG_NONE = 0,
- PVRSRV_HANDLE_ALLOC_FLAG_SHARED = 1,
- PVRSRV_HANDLE_ALLOC_FLAG_MULTI = 2,
- PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE = 4
+
+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED = 0x01,
+
+ PVRSRV_HANDLE_ALLOC_FLAG_MULTI = 0x02,
+
+ PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE = 0x04
};
struct PVRSRV_HANDLE_BASE;
void PVRSRVReleaseHandleBatch(struct PVRSRV_HANDLE_BASE *psBase);
-enum PVRSRV_ERROR PVRSRVAllocHandleBase(struct PVRSRV_HANDLE_BASE **ppsBase,
- u32 ui32PID);
+enum PVRSRV_ERROR PVRSRVSetMaxHandle(struct PVRSRV_HANDLE_BASE *psBase,
+ u32 ui32MaxHandle);
+
+u32 PVRSRVGetMaxHandle(struct PVRSRV_HANDLE_BASE *psBase);
+
+enum PVRSRV_ERROR PVRSRVEnableHandlePurging(struct PVRSRV_HANDLE_BASE *psBase);
+
+enum PVRSRV_ERROR PVRSRVPurgeHandles(struct PVRSRV_HANDLE_BASE *psBase);
+
+enum PVRSRV_ERROR PVRSRVAllocHandleBase(struct PVRSRV_HANDLE_BASE **ppsBase);
enum PVRSRV_ERROR PVRSRVFreeHandleBase(struct PVRSRV_HANDLE_BASE *psBase);
(void)PVRSRVAllocHandle(psBase, phHandle, pvData, eType, eFlag)
#define PVRSRVAllocSubHandleNR(psBase, phHandle, pvData, eType, eFlag, hParent)\
- (void)PVRSRVAllocSubHandle(psBase, phHandle, pvData, eType, eFlag, hParent)
-
+ (void)PVRSRVAllocSubHandle(psBase, phHandle, pvData, eType, \
+ eFlag, hParent)
#endif
u32 v;
u32 k[];
};
+struct BUCKET;
struct HASH_TABLE {
struct BUCKET **ppBucketTable;
u32 uCount;
u32 uMinimumSize;
u32 uKeySize;
- HASH_FUNC *pfnHashFunc;
- HASH_KEY_COMP *pfnKeyComp;
+ u32 (*pfnHashFunc)(size_t uKeySize, void *pkey, u32 uHashTabLen);
+ IMG_BOOL (*pfnKeyComp)(size_t uKeySize, void *pKey1, void *pkey2);
};
u32 HASH_Func_Default(size_t uKeySize, void *pKey, u32 uHashTabLen)
return IMG_TRUE;
}
-static void _ChainInsert(struct HASH_TABLE *pHash, struct BUCKET *pBucket,
+static enum PVRSRV_ERROR _ChainInsert(struct HASH_TABLE *pHash,
+ struct BUCKET *pBucket,
struct BUCKET **ppBucketTable, u32 uSize)
{
u32 uIndex;
PVR_ASSERT(ppBucketTable != NULL);
PVR_ASSERT(uSize != 0);
+ if ((pBucket == NULL) || (ppBucketTable == NULL) || (uSize == 0)) {
+ PVR_DPF(PVR_DBG_ERROR, "_ChainInsert: invalid parameter");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
uIndex = KEY_TO_INDEX(pHash, pBucket->k, uSize);
pBucket->pNext = ppBucketTable[uIndex];
ppBucketTable[uIndex] = pBucket;
+
+ return PVRSRV_OK;
}
-static void _Rehash(struct HASH_TABLE *pHash, struct BUCKET **ppOldTable,
- u32 uOldSize, struct BUCKET **ppNewTable, u32 uNewSize)
+static enum PVRSRV_ERROR _Rehash(struct HASH_TABLE *pHash,
+ struct BUCKET **ppOldTable, u32 uOldSize,
+ struct BUCKET **ppNewTable, u32 uNewSize)
{
u32 uIndex;
for (uIndex = 0; uIndex < uOldSize; uIndex++) {
pBucket = ppOldTable[uIndex];
while (pBucket != NULL) {
struct BUCKET *pNextBucket = pBucket->pNext;
- _ChainInsert(pHash, pBucket, ppNewTable, uNewSize);
+ if (_ChainInsert(pHash, pBucket, ppNewTable, uNewSize)
+ != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_Rehash: call to _ChainInsert failed");
+ return PVRSRV_ERROR_GENERIC;
+ }
pBucket = pNextBucket;
}
}
+ return PVRSRV_OK;
}
static IMG_BOOL _Resize(struct HASH_TABLE *pHash, u32 uNewSize)
"HASH_Resize: oldsize=0x%x newsize=0x%x count=0x%x",
pHash->uSize, uNewSize, pHash->uCount);
- OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct BUCKET *) * uNewSize,
(void **) &ppNewTable, NULL);
if (ppNewTable == NULL)
for (uIndex = 0; uIndex < uNewSize; uIndex++)
ppNewTable[uIndex] = NULL;
- _Rehash(pHash, pHash->ppBucketTable, pHash->uSize, ppNewTable,
- uNewSize);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+
+ if (_Rehash(pHash, pHash->ppBucketTable, pHash->uSize,
+ ppNewTable, uNewSize) != PVRSRV_OK)
+ return IMG_FALSE;
+
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct BUCKET *) * pHash->uSize,
pHash->ppBucketTable, NULL);
pHash->ppBucketTable = ppNewTable;
}
struct HASH_TABLE *HASH_Create_Extended(u32 uInitialLen, size_t uKeySize,
- HASH_FUNC *pfnHashFunc,
- HASH_KEY_COMP *pfnKeyComp)
+ u32 (*pfnHashFunc)(size_t uKeySize, void *pkey,
+ u32 uHashTabLen),
+ IMG_BOOL (*pfnKeyComp)(size_t uKeySize,
+ void *pKey1,
+ void *pkey2))
{
struct HASH_TABLE *pHash;
u32 uIndex;
PVR_DPF(PVR_DBG_MESSAGE, "HASH_Create_Extended: InitialSize=0x%x",
uInitialLen);
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ if (OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct HASH_TABLE),
(void **) &pHash, NULL) != PVRSRV_OK)
return NULL;
pHash->pfnHashFunc = pfnHashFunc;
pHash->pfnKeyComp = pfnKeyComp;
- OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct BUCKET *) * pHash->uSize,
(void **) &pHash->ppBucketTable, NULL);
if (pHash->ppBucketTable == NULL) {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct HASH_TABLE),
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT, sizeof(struct HASH_TABLE),
pHash, NULL);
return NULL;
}
PVR_DPF(PVR_DBG_MESSAGE, "HASH_Delete");
PVR_ASSERT(pHash->uCount == 0);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct BUCKET *) * pHash->uSize,
pHash->ppBucketTable, NULL);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct HASH_TABLE),
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT, sizeof(struct HASH_TABLE),
pHash, NULL);
}
}
PVR_ASSERT(pHash != NULL);
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ if (pHash == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "HASH_Insert_Extended: invalid parameter");
+ return IMG_FALSE;
+ }
+
+ if (OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct BUCKET) + pHash->uKeySize,
(void **) &pBucket, NULL) != PVRSRV_OK)
return IMG_FALSE;
pBucket->v = v;
OSMemCopy(pBucket->k, pKey, pHash->uKeySize);
- _ChainInsert(pHash, pBucket, pHash->ppBucketTable, pHash->uSize);
+ if (_ChainInsert(pHash, pBucket, pHash->ppBucketTable, pHash->uSize) !=
+ PVRSRV_OK) {
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
+ sizeof(struct BUCKET) + pHash->uKeySize,
+ pBucket, NULL);
+ return IMG_FALSE;
+ }
+
pHash->uCount++;
if (pHash->uCount << 1 > pHash->uSize)
PVR_ASSERT(pHash != NULL);
+ if (pHash == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "FreeResourceByPtr: invalid parameter");
+ return 0;
+ }
+
uIndex = KEY_TO_INDEX(pHash, pKey, pHash->uSize);
for (ppBucket = &(pHash->ppBucketTable[uIndex]); *ppBucket != NULL;
u32 v = pBucket->v;
(*ppBucket) = pBucket->pNext;
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct BUCKET) + pHash->uKeySize,
pBucket, NULL);
PRIVATE_MAX(pHash->uSize >> 1,
pHash->uMinimumSize));
- PVR_DPF(PVR_DBG_MESSAGE, "HASH_Remove_Extended: "
- "Hash=%08X, pKey=%08X = 0x%x",
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "HASH_Remove_Extended: Hash=%08X, pKey=%08X = 0x%x",
pHash, pKey, v);
return v;
}
PVR_ASSERT(pHash != NULL);
+ if (pHash == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "HASH_Retrieve_Extended: invalid parameter");
+ return 0;
+ }
+
uIndex = KEY_TO_INDEX(pHash, pKey, pHash->uSize);
for (ppBucket = &(pHash->ppBucketTable[uIndex]); *ppBucket != NULL;
return v;
}
PVR_DPF(PVR_DBG_MESSAGE,
- "HASH_Retrieve: Hash=%08X, pKey=%08X = 0x0 !!!!", pHash,
- pKey);
+ "HASH_Retrieve: Hash=%08X, pKey=%08X = 0x0 !!!!", pHash, pKey);
return 0;
}
u32 HASH_Retrieve(struct HASH_TABLE *pHash, u32 k)
{
- PVR_DPF(PVR_DBG_MESSAGE, "HASH_Retrieve: Hash=%08X, k=0x%x", pHash,
- k);
+ PVR_DPF(PVR_DBG_MESSAGE, "HASH_Retrieve: Hash=%08X, k=0x%x", pHash, k);
return HASH_Retrieve_Extended(pHash, &k);
}
#include "img_types.h"
#include "osfunc.h"
-typedef u32 HASH_FUNC(size_t uKeySize, void *pKey, u32 uHashTabLen);
-typedef IMG_BOOL HASH_KEY_COMP(size_t uKeySize, void *pKey1, void *pKey2);
-
struct HASH_TABLE;
u32 HASH_Func_Default(size_t uKeySize, void *pKey, u32 uHashTabLen);
IMG_BOOL HASH_Key_Comp_Default(size_t uKeySize, void *pKey1, void *pKey2);
struct HASH_TABLE *HASH_Create_Extended(u32 uInitialLen, size_t uKeySize,
- HASH_FUNC *pfnHashFunc,
- HASH_KEY_COMP *pfnKeyComp);
+ u32 (*pfnHashFunc)(size_t uKeySize, void *pkey,
+ u32 uHashTabLen),
+ IMG_BOOL (*pfnKeyComp)(size_t uKeySize,
+ void *pKey1,
+ void *pkey2));
struct HASH_TABLE *HASH_Create(u32 uInitialLen);
void HASH_Delete(struct HASH_TABLE *pHash);
IMG_BOOL HASH_Insert_Extended(struct HASH_TABLE *pHash, void *pKey, u32 v);
#define IMG_NO_REG 1
#ifndef PVR_UNREFERENCED_PARAMETER
-#define PVR_UNREFERENCED_PARAMETER(param) (param) = (param)
+#define PVR_UNREFERENCED_PARAMETER(param) (param) = (param)
#endif
#ifdef __GNUC__
#define unref__
#endif
-#define IMG_INTERNAL __attribute__ ((visibility("hidden")))
-
#endif
#define __IMG_TYPES_H__
#include <linux/types.h>
-/*
- HACK: Without the include the PVR driver would have at this point __inline =
- __inline, that lets the compiler decide about inlining. With the above
- include this would change to __inline __atribute__((always_inline)). Keep
- it the old way for now to avoid introducing changes related to this. See
- also queue.h.
- */
-#undef inline
-#define inline inline
+
+#if !defined(IMG_UINT32_MAX)
+#define IMG_UINT32_MAX 0xFFFFFFFFUL
+#endif
typedef enum tag_img_bool {
IMG_FALSE = 0,
u32 ui32PageCount;
union {
-
struct IMG_SYS_PHYADDR sContig;
-
struct IMG_SYS_PHYADDR asNonContig[1];
} u;
};
#ifndef __IOCTLDEF_H__
#define __IOCTLDEF_H__
-#define MAKEIOCTLINDEX(i) (((i) >> 2) & 0xFFF)
+#define MAKEIOCTLINDEX(i) (((i) >> 2) & 0xFFF)
#define DEVICE_TYPE ULONG
-#define FILE_DEVICE_BEEP 0x00000001
-#define FILE_DEVICE_CD_ROM 0x00000002
-#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
-#define FILE_DEVICE_CONTROLLER 0x00000004
-#define FILE_DEVICE_DATALINK 0x00000005
-#define FILE_DEVICE_DFS 0x00000006
-#define FILE_DEVICE_DISK 0x00000007
-#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
-#define FILE_DEVICE_FILE_SYSTEM 0x00000009
-#define FILE_DEVICE_INPORT_PORT 0x0000000a
-#define FILE_DEVICE_KEYBOARD 0x0000000b
-#define FILE_DEVICE_MAILSLOT 0x0000000c
-#define FILE_DEVICE_MIDI_IN 0x0000000d
-#define FILE_DEVICE_MIDI_OUT 0x0000000e
-#define FILE_DEVICE_MOUSE 0x0000000f
-#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
-#define FILE_DEVICE_NAMED_PIPE 0x00000011
-#define FILE_DEVICE_NETWORK 0x00000012
-#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
-#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
-#define FILE_DEVICE_NULL 0x00000015
-#define FILE_DEVICE_PARALLEL_PORT 0x00000016
-#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
-#define FILE_DEVICE_PRINTER 0x00000018
-#define FILE_DEVICE_SCANNER 0x00000019
-#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
-#define FILE_DEVICE_SERIAL_PORT 0x0000001b
-#define FILE_DEVICE_SCREEN 0x0000001c
-#define FILE_DEVICE_SOUND 0x0000001d
-#define FILE_DEVICE_STREAMS 0x0000001e
-#define FILE_DEVICE_TAPE 0x0000001f
-#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
-#define FILE_DEVICE_TRANSPORT 0x00000021
-#define FILE_DEVICE_UNKNOWN 0x00000022
-#define FILE_DEVICE_VIDEO 0x00000023
-#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
-#define FILE_DEVICE_WAVE_IN 0x00000025
-#define FILE_DEVICE_WAVE_OUT 0x00000026
-#define FILE_DEVICE_8042_PORT 0x00000027
-#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
-#define FILE_DEVICE_BATTERY 0x00000029
-#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
-#define FILE_DEVICE_MODEM 0x0000002b
-#define FILE_DEVICE_VDM 0x0000002c
-#define FILE_DEVICE_MASS_STORAGE 0x0000002d
+#define FILE_DEVICE_BEEP 0x00000001
+#define FILE_DEVICE_CD_ROM 0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
+#define FILE_DEVICE_CONTROLLER 0x00000004
+#define FILE_DEVICE_DATALINK 0x00000005
+#define FILE_DEVICE_DFS 0x00000006
+#define FILE_DEVICE_DISK 0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
+#define FILE_DEVICE_FILE_SYSTEM 0x00000009
+#define FILE_DEVICE_INPORT_PORT 0x0000000a
+#define FILE_DEVICE_KEYBOARD 0x0000000b
+#define FILE_DEVICE_MAILSLOT 0x0000000c
+#define FILE_DEVICE_MIDI_IN 0x0000000d
+#define FILE_DEVICE_MIDI_OUT 0x0000000e
+#define FILE_DEVICE_MOUSE 0x0000000f
+#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
+#define FILE_DEVICE_NAMED_PIPE 0x00000011
+#define FILE_DEVICE_NETWORK 0x00000012
+#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
+#define FILE_DEVICE_NULL 0x00000015
+#define FILE_DEVICE_PARALLEL_PORT 0x00000016
+#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
+#define FILE_DEVICE_PRINTER 0x00000018
+#define FILE_DEVICE_SCANNER 0x00000019
+#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
+#define FILE_DEVICE_SERIAL_PORT 0x0000001b
+#define FILE_DEVICE_SCREEN 0x0000001c
+#define FILE_DEVICE_SOUND 0x0000001d
+#define FILE_DEVICE_STREAMS 0x0000001e
+#define FILE_DEVICE_TAPE 0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
+#define FILE_DEVICE_TRANSPORT 0x00000021
+#define FILE_DEVICE_UNKNOWN 0x00000022
+#define FILE_DEVICE_VIDEO 0x00000023
+#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
+#define FILE_DEVICE_WAVE_IN 0x00000025
+#define FILE_DEVICE_WAVE_OUT 0x00000026
+#define FILE_DEVICE_8042_PORT 0x00000027
+#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
+#define FILE_DEVICE_BATTERY 0x00000029
+#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
+#define FILE_DEVICE_MODEM 0x0000002b
+#define FILE_DEVICE_VDM 0x0000002c
+#define FILE_DEVICE_MASS_STORAGE 0x0000002d
-#define CTL_CODE( DeviceType, Function, Method, Access) ( \
+#define CTL_CODE( DeviceType, Function, Method, Access) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
-#define METHOD_BUFFERED 0
-#define METHOD_IN_DIRECT 1
-#define METHOD_OUT_DIRECT 2
-#define METHOD_NEITHER 3
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
-#define FILE_ANY_ACCESS 0
-#define FILE_READ_ACCESS (0x0001)
-#define FILE_WRITE_ACCESS (0x0002)
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS 0x0001
+#define FILE_WRITE_ACCESS 0x0002
#endif
struct PVRSRV_SYNC_DATA *, void **);
enum PVRSRV_ERROR (*pfnGetBufferAddr)(void *, void *,
struct IMG_SYS_PHYADDR **, u32 *,
- void **, void **, IMG_BOOL *);
+ void __iomem **, void **, IMG_BOOL *);
};
struct PVRSRV_BC_BUFFER2SRV_KMJTABLE {
enum PVRSRV_ERROR (*pfnPVRSRVRemoveBCDevice)(u32);
};
+IMG_BOOL PVRGetBufferClassJTable(
+ struct PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable);
+
+
#endif
#if !defined(__KERNELDISPLAY_H__)
#define __KERNELDISPLAY_H__
+#include <linux/module.h>
+
+#define DC_FLIP_COMMAND 0
+
+#define DC_STATE_NO_FLUSH_COMMANDS 0
+#define DC_STATE_FLUSH_COMMANDS 1
struct PVRSRV_DC_SRV2DISP_KMJTABLE {
+ struct module *owner;
u32 ui32TableSize;
enum PVRSRV_ERROR (*pfnOpenDCDevice)(u32, void **,
struct PVRSRV_SYNC_DATA *);
enum PVRSRV_ERROR (*pfnSetDCDstColourKey)(void *, void *, u32);
enum PVRSRV_ERROR (*pfnSetDCSrcColourKey)(void *, void *, u32);
enum PVRSRV_ERROR (*pfnGetDCBuffers)(void *, void *, u32 *, void **);
- enum PVRSRV_ERROR (*pfnSwapToDCBuffer)(void *, void *, u32, void *, u32,
- struct IMG_RECT *);
- enum PVRSRV_ERROR (*pfnSwapToDCSystem)(void *, void *);
void (*pfnSetDCState)(void *, u32);
};
u32 ui32SwapInterval;
};
-#define DC_FLIP_COMMAND 0
-
-#define DC_STATE_NO_FLUSH_COMMANDS 0
-#define DC_STATE_FLUSH_COMMANDS 1
+IMG_BOOL PVRGetDisplayClassJTable(struct PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable);
#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+#ifndef __LOCK_H__
+#define __LOCK_H__
+
+extern struct mutex gPVRSRVLock;
+
+#endif
sizeof(struct PVRSRV_KERNEL_MEM_INFO),
(void **) &psKernelMemInfo, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVAllocSharedSysMemoryKM: "
- "Failed to alloc memory for meminfo");
+ "Failed to alloc memory for meminfo");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
+ OSMemSet(psKernelMemInfo, 0, sizeof(*psKernelMemInfo));
+
ui32Flags &= ~PVRSRV_HAP_MAPTYPE_MASK;
ui32Flags |= PVRSRV_HAP_MULTI_PROCESS;
psKernelMemInfo->ui32Flags = ui32Flags;
psKernelMemInfo->ui32AllocSize = ui32Size;
if (OSAllocPages(psKernelMemInfo->ui32Flags,
- psKernelMemInfo->ui32AllocSize,
+ psKernelMemInfo->ui32AllocSize, HOST_PAGESIZE(),
&psKernelMemInfo->pvLinAddrKM,
&psKernelMemInfo->sMemBlk.hOSMemHandle) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVAllocSharedSysMemoryKM: "
- "Failed to alloc memory for block");
+ "Failed to alloc memory for block");
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct PVRSRV_KERNEL_MEM_INFO),
psKernelMemInfo, NULL);
enum PVRSRV_ERROR PVRSRVDissociateMemFromResmanKM(
struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo)
{
+ enum PVRSRV_ERROR eError = PVRSRV_OK;
+
if (!psKernelMemInfo)
return PVRSRV_ERROR_INVALID_PARAMS;
if (psKernelMemInfo->sMemBlk.hResItem) {
- ResManDissociateRes(psKernelMemInfo->sMemBlk.hResItem,
- NULL);
+ eError = ResManDissociateRes(psKernelMemInfo->sMemBlk.hResItem,
+ NULL);
+
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVDissociateMemFromResmanKM: "
+ "ResManDissociateRes failed");
+ PVR_DBG_BREAK;
+ return eError;
+ }
+
psKernelMemInfo->sMemBlk.hResItem = NULL;
}
- return PVRSRV_OK;
+ return eError;
}
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/version.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <linux/slab.h>
#include <linux/highmem.h>
#include <linux/sched.h>
+#include <linux/dma-mapping.h>
#include "img_defs.h"
#include "services.h"
#include "servicesint.h"
#include "syscommon.h"
+#include "mutils.h"
#include "mm.h"
#include "pvrmmap.h"
#include "mmap.h"
#include "pvr_debug.h"
#include "proc.h"
#include "mutex.h"
-
-#define PVR_FLUSH_CACHE_BEFORE_KMAP
-
-#include <asm/cacheflush.h>
+#include "lock.h"
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
enum DEBUG_MEM_ALLOC_TYPE {
DEBUG_MEM_ALLOC_TYPE_IOREMAP,
DEBUG_MEM_ALLOC_TYPE_IO,
DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE,
- DEBUG_MEM_ALLOC_TYPE_KMAP,
DEBUG_MEM_ALLOC_TYPE_COUNT
};
enum DEBUG_MEM_ALLOC_TYPE eAllocType;
void *pvKey;
void *pvCpuVAddr;
- unsigned long ulCpuPAddr;
+ u32 ulCpuPAddr;
void *pvPrivateData;
u32 ui32Bytes;
pid_t pid;
static u32 g_IOMemHighWaterMark;
static void DebugMemAllocRecordAdd(enum DEBUG_MEM_ALLOC_TYPE eAllocType,
- void *pvKey,
- void *pvCpuVAddr,
- unsigned long ulCpuPAddr,
- void *pvPrivateData,
- u32 ui32Bytes,
- char *pszFileName,
+ void *pvKey, void *pvCpuVAddr,
+ u32 ulCpuPAddr, void *pvPrivateData,
+ u32 ui32Bytes, char *pszFileName,
u32 ui32Line);
static void DebugMemAllocRecordRemove(enum DEBUG_MEM_ALLOC_TYPE eAllocType,
- void *pvKey,
- char *pszFileName,
+ void *pvKey, char *pszFileName,
u32 ui32Line);
static char *DebugMemAllocRecordTypeToString(
struct DEBUG_LINUX_MEM_AREA_REC *psNext;
};
+#if defined(DEBUG_LINUX_MEM_AREAS) || defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
+static struct mutex g_sDebugMutex;
+#endif
+
static struct DEBUG_LINUX_MEM_AREA_REC *g_LinuxMemAreaRecords;
static u32 g_LinuxMemAreaCount;
static u32 g_LinuxMemAreaWaterMark;
enum PVRSRV_ERROR LinuxMMInit(void)
{
+#if defined(DEBUG_LINUX_MEM_AREAS) || defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
+ mutex_init(&g_sDebugMutex);
+#endif
+
#if defined(DEBUG_LINUX_MEM_AREAS)
{
int iStatus;
}
#endif
psLinuxMemAreaCache =
- KMemCacheCreateWrapper("img-mm", sizeof(struct LinuxMemArea), 0, 0);
+ kmem_cache_create("img-mm", sizeof(struct LinuxMemArea), 0, 0,
+ NULL);
if (!psLinuxMemAreaCache) {
PVR_DPF(PVR_DBG_ERROR, "%s: failed to allocate kmem_cache",
__func__);
if (g_LinuxMemAreaCount)
PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
- "There are %d Linux memory area allocation "
- "unfreed (%ld bytes)",
+ "There are %d struct LinuxMemArea "
+ "allocation unfreed (%ld bytes)",
__func__, g_LinuxMemAreaCount,
g_LinuxMemAreaWaterMark);
while (psCurrentRecord) {
psNextRecord = psCurrentRecord->psNext;
PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: Cleaning up memory: "
- "type=%s "
- "CpuVAddr=%p "
- "CpuPAddr=0x%08lx, "
+ "type=%s CpuVAddr=%p CpuPAddr=0x%08lx, "
"allocated @ file=%s,line=%d",
__func__,
DebugMemAllocRecordTypeToString
KFreeWrapper(psCurrentRecord->pvCpuVAddr);
break;
case DEBUG_MEM_ALLOC_TYPE_IOREMAP:
- IOUnmapWrapper((void __iomem __force *)
+ IOUnmapWrapper((__force __iomem void *)
psCurrentRecord->pvCpuVAddr);
break;
case DEBUG_MEM_ALLOC_TYPE_IO:
break;
case DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE:
KMemCacheFreeWrapper(psCurrentRecord->
- pvPrivateData,
+ pvPrivateData,
psCurrentRecord->
- pvCpuVAddr);
- break;
- case DEBUG_MEM_ALLOC_TYPE_KMAP:
- KUnMapWrapper(psCurrentRecord->pvKey);
+ pvCpuVAddr);
break;
default:
PVR_ASSERT(0);
#endif
if (psLinuxMemAreaCache) {
- KMemCacheDestroyWrapper(psLinuxMemAreaCache);
+ kmem_cache_destroy(psLinuxMemAreaCache);
psLinuxMemAreaCache = NULL;
}
}
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
static void DebugMemAllocRecordAdd(enum DEBUG_MEM_ALLOC_TYPE eAllocType,
- void *pvKey, void *pvCpuVAddr, unsigned long ulCpuPAddr,
- void *pvPrivateData, u32 ui32Bytes, char *pszFileName,
- u32 ui32Line)
+ void *pvKey, void *pvCpuVAddr,
+ u32 ulCpuPAddr, void *pvPrivateData,
+ u32 ui32Bytes, char *pszFileName,
+ u32 ui32Line)
{
struct DEBUG_MEM_ALLOC_REC *psRecord;
+ mutex_lock(&g_sDebugMutex);
+
psRecord = kmalloc(sizeof(struct DEBUG_MEM_ALLOC_REC), GFP_KERNEL);
psRecord->eAllocType = eAllocType;
if (g_WaterMarkData[eAllocType] > g_HighWaterMarkData[eAllocType])
g_HighWaterMarkData[eAllocType] = g_WaterMarkData[eAllocType];
- if (eAllocType == DEBUG_MEM_ALLOC_TYPE_KMALLOC
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_VMALLOC
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE) {
+ if (eAllocType == DEBUG_MEM_ALLOC_TYPE_KMALLOC ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_VMALLOC ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE) {
g_SysRAMWaterMark += ui32Bytes;
if (g_SysRAMWaterMark > g_SysRAMHighWaterMark)
g_SysRAMHighWaterMark = g_SysRAMWaterMark;
- } else if (eAllocType == DEBUG_MEM_ALLOC_TYPE_IOREMAP
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_IO) {
+ } else if (eAllocType == DEBUG_MEM_ALLOC_TYPE_IOREMAP ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_IO) {
g_IOMemWaterMark += ui32Bytes;
if (g_IOMemWaterMark > g_IOMemHighWaterMark)
g_IOMemHighWaterMark = g_IOMemWaterMark;
}
+
+ mutex_unlock(&g_sDebugMutex);
}
-static void DebugMemAllocRecordRemove(enum DEBUG_MEM_ALLOC_TYPE eAllocType_in,
+static void DebugMemAllocRecordRemove(enum DEBUG_MEM_ALLOC_TYPE eAllocType,
void *pvKey, char *pszFileName,
u32 ui32Line)
{
struct DEBUG_MEM_ALLOC_REC **ppsCurrentRecord;
- for (ppsCurrentRecord = &g_MemoryRecords;
- *ppsCurrentRecord;
+ mutex_lock(&g_sDebugMutex);
+
+ for (ppsCurrentRecord = &g_MemoryRecords; *ppsCurrentRecord;
ppsCurrentRecord = &((*ppsCurrentRecord)->psNext))
- if ((*ppsCurrentRecord)->eAllocType == eAllocType_in
- && (*ppsCurrentRecord)->pvKey == pvKey) {
+ if ((*ppsCurrentRecord)->eAllocType == eAllocType &&
+ (*ppsCurrentRecord)->pvKey == pvKey) {
struct DEBUG_MEM_ALLOC_REC *psNextRecord;
- enum DEBUG_MEM_ALLOC_TYPE eAllocType;
psNextRecord = (*ppsCurrentRecord)->psNext;
- eAllocType = (*ppsCurrentRecord)->eAllocType;
g_WaterMarkData[eAllocType] -=
(*ppsCurrentRecord)->ui32Bytes;
- if (eAllocType == DEBUG_MEM_ALLOC_TYPE_KMALLOC
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_VMALLOC
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES
- || eAllocType == DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE)
+ if (eAllocType == DEBUG_MEM_ALLOC_TYPE_KMALLOC ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_VMALLOC ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES ||
+ eAllocType == DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE) {
g_SysRAMWaterMark -=
(*ppsCurrentRecord)->ui32Bytes;
- else if (eAllocType == DEBUG_MEM_ALLOC_TYPE_IOREMAP
+ } else {
+ if (eAllocType == DEBUG_MEM_ALLOC_TYPE_IOREMAP
|| eAllocType == DEBUG_MEM_ALLOC_TYPE_IO)
- g_IOMemWaterMark -=
- (*ppsCurrentRecord)->ui32Bytes;
+ g_IOMemWaterMark -=
+ (*ppsCurrentRecord)->ui32Bytes;
+
+ }
kfree(*ppsCurrentRecord);
*ppsCurrentRecord = psNextRecord;
- return;
+ goto exit_unlock;
}
PVR_DPF(PVR_DBG_ERROR, "%s: couldn't find an entry for type=%s "
"with pvKey=%p (called from %s, line %d\n",
- __func__, DebugMemAllocRecordTypeToString(eAllocType_in),
- pvKey, pszFileName, ui32Line);
+ __func__, DebugMemAllocRecordTypeToString(eAllocType), pvKey,
+ pszFileName, ui32Line);
+
+exit_unlock:
+ mutex_unlock(&g_sDebugMutex);
}
static char *DebugMemAllocRecordTypeToString(
"ALLOC_PAGES",
"IOREMAP",
"IO",
- "KMEM_CACHE_ALLOC",
- "KMAP"
+ "KMEM_CACHE_ALLOC"
};
return apszDebugMemoryRecordTypes[eAllocType];
}
PGProtFlags = PAGE_KERNEL;
break;
case PVRSRV_HAP_WRITECOMBINE:
- PGProtFlags = pgprot_writecombine(PAGE_KERNEL);
+ PGProtFlags = PGPROT_WC(PAGE_KERNEL);
break;
case PVRSRV_HAP_UNCACHED:
- PGProtFlags = pgprot_noncached(PAGE_KERNEL);
+ PGProtFlags = PGPROT_UC(PAGE_KERNEL);
break;
default:
PVR_DPF(PVR_DBG_ERROR,
return pvRet;
}
-void _VFreeWrapper(void *pvCpuVAddr, char *pszFileName,
- u32 ui32Line)
+void _VFreeWrapper(void *pvCpuVAddr, char *pszFileName, u32 ui32Line)
{
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_VMALLOC, pvCpuVAddr,
vfree(pvCpuVAddr);
}
-struct LinuxMemArea *NewVMallocLinuxMemArea(u32 ui32Bytes,
- u32 ui32AreaFlags)
+struct LinuxMemArea *NewVMallocLinuxMemArea(u32 ui32Bytes, u32 ui32AreaFlags)
{
struct LinuxMemArea *psLinuxMemArea;
void *pvCpuVAddr;
psLinuxMemArea->eAreaType = LINUX_MEM_AREA_VMALLOC;
psLinuxMemArea->uData.sVmalloc.pvVmallocAddress = pvCpuVAddr;
psLinuxMemArea->ui32ByteSize = ui32Bytes;
+ psLinuxMemArea->ui32AreaFlags = ui32AreaFlags;
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+ INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MEM_AREAS)
DebugLinuxMemAreaRecordAdd(psLinuxMemArea, ui32AreaFlags);
switch (ui32MappingFlags & PVRSRV_HAP_CACHETYPE_MASK) {
case PVRSRV_HAP_CACHED:
-#if defined(__arm__)
- pvIORemapCookie = ioremap_cached(BasePAddr.uiAddr, ui32Bytes);
-#else
- pvIORemapCookie = ioremap(BasePAddr.uiAddr, ui32Bytes);
-#endif
+ pvIORemapCookie = IOREMAP(BasePAddr.uiAddr, ui32Bytes);
break;
case PVRSRV_HAP_WRITECOMBINE:
-#if defined(__arm__)
- pvIORemapCookie = ioremap_nocache(BasePAddr.uiAddr, ui32Bytes);
-#else
- pvIORemapCookie = ioremap_nocache(BasePAddr.uiAddr, ui32Bytes);
-#endif
+ pvIORemapCookie = IOREMAP_WC(BasePAddr.uiAddr, ui32Bytes);
break;
case PVRSRV_HAP_UNCACHED:
- pvIORemapCookie = ioremap_nocache(BasePAddr.uiAddr, ui32Bytes);
+ pvIORemapCookie = IOREMAP_UC(BasePAddr.uiAddr, ui32Bytes);
break;
default:
PVR_DPF(PVR_DBG_ERROR,
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
if (pvIORemapCookie)
DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_IOREMAP,
- (void __force *)pvIORemapCookie,
- (void __force *)pvIORemapCookie,
- BasePAddr.uiAddr, NULL, ui32Bytes,
- pszFileName, ui32Line);
+ (__force void *)pvIORemapCookie,
+ (__force void *)pvIORemapCookie,
+ BasePAddr.uiAddr,
+ NULL, ui32Bytes, pszFileName, ui32Line);
#endif
return pvIORemapCookie;
{
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_IOREMAP,
- (void __force *)pvIORemapCookie,
+ (__force void *)pvIORemapCookie,
pszFileName, ui32Line);
#endif
iounmap(pvIORemapCookie);
}
struct LinuxMemArea *NewIORemapLinuxMemArea(struct IMG_CPU_PHYADDR BasePAddr,
- u32 ui32Bytes,
- u32 ui32AreaFlags)
+ u32 ui32Bytes, u32 ui32AreaFlags)
{
struct LinuxMemArea *psLinuxMemArea;
void __iomem *pvIORemapCookie;
psLinuxMemArea->uData.sIORemap.pvIORemapCookie = pvIORemapCookie;
psLinuxMemArea->uData.sIORemap.CPUPhysAddr = BasePAddr;
psLinuxMemArea->ui32ByteSize = ui32Bytes;
+ psLinuxMemArea->ui32AreaFlags = ui32AreaFlags;
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+ INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MEM_AREAS)
DebugLinuxMemAreaRecordAdd(psLinuxMemArea, ui32AreaFlags);
LinuxMemAreaStructFree(psLinuxMemArea);
}
-struct LinuxMemArea *NewExternalKVLinuxMemArea(
- struct IMG_SYS_PHYADDR *pBasePAddr, void *pvCPUVAddr,
- u32 ui32Bytes, IMG_BOOL bPhysContig, u32 ui32AreaFlags)
+static IMG_BOOL PagesAreContiguous(struct IMG_SYS_PHYADDR *psSysPhysAddr,
+ u32 ui32Bytes)
+{
+ u32 ui32;
+ u32 ui32AddrChk;
+ u32 ui32NumPages = RANGE_TO_PAGES(ui32Bytes);
+
+ for (ui32 = 0, ui32AddrChk = psSysPhysAddr[0].uiAddr;
+ ui32 < ui32NumPages; ui32++, ui32AddrChk += PAGE_SIZE)
+ if (psSysPhysAddr[ui32].uiAddr != ui32AddrChk)
+ return IMG_FALSE;
+
+ return IMG_TRUE;
+}
+
+struct LinuxMemArea *NewExternalKVLinuxMemArea(struct IMG_SYS_PHYADDR
+ *pBasePAddr, void *pvCPUVAddr,
+ u32 ui32Bytes,
+ IMG_BOOL bPhysContig,
+ u32 ui32AreaFlags)
{
struct LinuxMemArea *psLinuxMemArea;
psLinuxMemArea->eAreaType = LINUX_MEM_AREA_EXTERNAL_KV;
psLinuxMemArea->uData.sExternalKV.pvExternalKV = pvCPUVAddr;
- psLinuxMemArea->uData.sExternalKV.bPhysContig = bPhysContig;
- if (bPhysContig)
+ psLinuxMemArea->uData.sExternalKV.bPhysContig = bPhysContig ||
+ PagesAreContiguous(pBasePAddr, ui32Bytes);
+
+ if (psLinuxMemArea->uData.sExternalKV.bPhysContig)
psLinuxMemArea->uData.sExternalKV.uPhysAddr.SysPhysAddr =
*pBasePAddr;
else
psLinuxMemArea->uData.sExternalKV.uPhysAddr.pSysPhysAddr =
pBasePAddr;
psLinuxMemArea->ui32ByteSize = ui32Bytes;
+ psLinuxMemArea->ui32AreaFlags = ui32AreaFlags;
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+ INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MEM_AREAS)
DebugLinuxMemAreaRecordAdd(psLinuxMemArea, ui32AreaFlags);
psLinuxMemArea->eAreaType = LINUX_MEM_AREA_IO;
psLinuxMemArea->uData.sIO.CPUPhysAddr.uiAddr = BasePAddr.uiAddr;
psLinuxMemArea->ui32ByteSize = ui32Bytes;
+ psLinuxMemArea->ui32AreaFlags = ui32AreaFlags;
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+ INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_IO,
- (void *)BasePAddr.uiAddr, NULL, BasePAddr.uiAddr,
- NULL, ui32Bytes, "unknown", 0);
+ (void *)BasePAddr.uiAddr, NULL,
+ BasePAddr.uiAddr, NULL, ui32Bytes, "unknown", 0);
#endif
#if defined(DEBUG_LINUX_MEM_AREAS)
struct LinuxMemArea *psLinuxMemArea;
u32 ui32PageCount;
struct page **pvPageList;
- u32 i;
+ void *hBlockPageList;
+ s32 i;
+ enum PVRSRV_ERROR eError;
psLinuxMemArea = LinuxMemAreaStructAlloc();
if (!psLinuxMemArea)
goto failed_area_alloc;
ui32PageCount = RANGE_TO_PAGES(ui32Bytes);
- pvPageList =
- VMallocWrapper(sizeof(void *) * ui32PageCount, PVRSRV_HAP_CACHED);
- if (!pvPageList)
- goto failed_vmalloc;
+ eError = OSAllocMem(0, sizeof(*pvPageList) * ui32PageCount,
+ (void **)&pvPageList, &hBlockPageList);
+ if (eError != PVRSRV_OK)
+ goto failed_page_list_alloc;
for (i = 0; i < ui32PageCount; i++) {
- pvPageList[i] = alloc_pages(GFP_KERNEL, 0);
+ pvPageList[i] = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, 0);
if (!pvPageList[i])
goto failed_alloc_pages;
psLinuxMemArea->eAreaType = LINUX_MEM_AREA_ALLOC_PAGES;
psLinuxMemArea->uData.sPageList.pvPageList = pvPageList;
+ psLinuxMemArea->uData.sPageList.hBlockPageList = hBlockPageList;
psLinuxMemArea->ui32ByteSize = ui32Bytes;
+ psLinuxMemArea->ui32AreaFlags = ui32AreaFlags;
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+ INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MEM_AREAS)
DebugLinuxMemAreaRecordAdd(psLinuxMemArea, ui32AreaFlags);
failed_alloc_pages:
for (i--; i >= 0; i--)
__free_pages(pvPageList[i], 0);
- VFreeWrapper(pvPageList);
-failed_vmalloc:
+ OSFreeMem(0, sizeof(*pvPageList) * ui32PageCount, pvPageList,
+ hBlockPageList);
+failed_page_list_alloc:
LinuxMemAreaStructFree(psLinuxMemArea);
failed_area_alloc:
PVR_DPF(PVR_DBG_ERROR, "%s: failed", __func__);
{
u32 ui32PageCount;
struct page **pvPageList;
+ void *hBlockPageList;
u32 i;
PVR_ASSERT(psLinuxMemArea);
ui32PageCount = RANGE_TO_PAGES(psLinuxMemArea->ui32ByteSize);
pvPageList = psLinuxMemArea->uData.sPageList.pvPageList;
+ hBlockPageList = psLinuxMemArea->uData.sPageList.hBlockPageList;
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, pvPageList,
for (i = 0; i < ui32PageCount; i++)
__free_pages(pvPageList[i], 0);
- VFreeWrapper(psLinuxMemArea->uData.sPageList.pvPageList);
+
+ OSFreeMem(0, sizeof(*pvPageList) * ui32PageCount, pvPageList,
+ hBlockPageList);
LinuxMemAreaStructFree(psLinuxMemArea);
}
ui32ByteOffset);
default:
PVR_DPF(PVR_DBG_ERROR, "%s: Unsupported request for "
- "struct page from Linux memory "
- "area with type=%s",
+ "struct page from struct LinuxMemArea with type=%s",
LinuxMemAreaTypeToString(psLinuxMemArea->eAreaType));
return NULL;
}
}
-void *_KMapWrapper(struct page *psPage, char *pszFileName,
- u32 ui32Line)
-{
- void *pvRet;
-
-
- flush_cache_all();
-
- pvRet = kmap(psPage);
-
-#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
- if (pvRet)
- DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_KMAP,
- psPage,
- pvRet, 0, NULL, PAGE_SIZE, "unknown", 0);
-#endif
-
- return pvRet;
-}
-
-void _KUnMapWrapper(struct page *psPage, char *pszFileName,
- u32 ui32Line)
-{
-#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
- DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_KMAP, psPage,
- pszFileName, ui32Line);
-#endif
-
- kunmap(psPage);
-}
-
-struct kmem_cache *KMemCacheCreateWrapper(char *pszName,
- size_t Size,
- size_t Align, u32 ui32Flags)
-{
- return kmem_cache_create(pszName, Size, Align, ui32Flags, NULL);
-}
-
-void KMemCacheDestroyWrapper(struct kmem_cache *psCache)
-{
- kmem_cache_destroy(psCache);
-}
-
void *_KMemCacheAllocWrapper(struct kmem_cache *psCache,
gfp_t Flags,
char *pszFileName, u32 ui32Line)
pvRet = kmem_cache_alloc(psCache, Flags);
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
- DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE,
- pvRet,
- pvRet,
- 0,
- psCache,
- kmem_cache_size(psCache), pszFileName, ui32Line);
+ DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE, pvRet, pvRet,
+ 0, psCache, kmem_cache_size(psCache),
+ pszFileName, ui32Line);
#endif
return pvRet;
psLinuxMemArea->eAreaType = LINUX_MEM_AREA_SUB_ALLOC;
psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea =
- psParentLinuxMemArea;
+ psParentLinuxMemArea;
psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset = ui32ByteOffset;
psLinuxMemArea->ui32ByteSize = ui32Bytes;
+ psLinuxMemArea->ui32AreaFlags = psParentLinuxMemArea->ui32AreaFlags;
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+ INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MEM_AREAS)
{
struct DEBUG_LINUX_MEM_AREA_REC *psNewRecord;
const char *pi8FlagsString;
+ mutex_lock(&g_sDebugMutex);
+
if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC) {
g_LinuxMemAreaWaterMark += psLinuxMemArea->ui32ByteSize;
if (g_LinuxMemAreaWaterMark > g_LinuxMemAreaHighWaterMark)
psNewRecord = kmalloc(sizeof(struct DEBUG_LINUX_MEM_AREA_REC),
GFP_KERNEL);
if (psNewRecord) {
-
psNewRecord->psLinuxMemArea = psLinuxMemArea;
psNewRecord->ui32Flags = ui32Flags;
psNewRecord->pid = current->pid;
pi8FlagsString = HAPFlagsToString(ui32Flags);
if (strstr(pi8FlagsString, "UNKNOWN"))
- PVR_DPF(PVR_DBG_ERROR, "%s: Unexpected flags (0x%08lx) "
- "associated with psLinuxMemArea @ 0x%08lx",
+ PVR_DPF(PVR_DBG_ERROR, "%s: Unexpected flags "
+ "(0x%08lx) associated with psLinuxMemArea @ 0x%08lx",
__func__, ui32Flags, psLinuxMemArea);
+
+ mutex_unlock(&g_sDebugMutex);
}
static struct DEBUG_LINUX_MEM_AREA_REC *DebugLinuxMemAreaRecordFind(
{
struct DEBUG_LINUX_MEM_AREA_REC *psCurrentRecord;
+ mutex_lock(&g_sDebugMutex);
+
for (psCurrentRecord = g_LinuxMemAreaRecords;
- psCurrentRecord; psCurrentRecord = psCurrentRecord->psNext) {
+ psCurrentRecord; psCurrentRecord = psCurrentRecord->psNext)
if (psCurrentRecord->psLinuxMemArea == psLinuxMemArea)
- return psCurrentRecord;
+ goto exit_unlock;
- }
- return NULL;
+exit_unlock:
+ mutex_unlock(&g_sDebugMutex);
+
+ return psCurrentRecord;
}
static void DebugLinuxMemAreaRecordRemove(struct LinuxMemArea *psLinuxMemArea)
{
struct DEBUG_LINUX_MEM_AREA_REC **ppsCurrentRecord;
+ mutex_lock(&g_sDebugMutex);
+
if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC)
g_LinuxMemAreaWaterMark -= psLinuxMemArea->ui32ByteSize;
g_LinuxMemAreaCount--;
psNextRecord = (*ppsCurrentRecord)->psNext;
kfree(*ppsCurrentRecord);
*ppsCurrentRecord = psNextRecord;
- return;
+ goto exit_unlock;
}
PVR_DPF(PVR_DBG_ERROR,
- "%s: couldn't find an entry for psLinuxMemArea=%p\n",
- __func__, psLinuxMemArea);
+ "%s: couldn't find an entry for psLinuxMemArea=%p\n", __func__,
+ psLinuxMemArea);
+
+exit_unlock:
+ mutex_unlock(&g_sDebugMutex);
}
#endif
char *pAddr =
LinuxMemAreaToCpuVAddr(psLinuxMemArea->uData.
sSubAlloc.
- psParentLinuxMemArea);
+ psParentLinuxMemArea);
if (!pAddr)
return NULL;
return pAddr +
}
}
-struct IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(struct LinuxMemArea
- *psLinuxMemArea, u32 ui32ByteOffset)
+struct IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(
+ struct LinuxMemArea *psLinuxMemArea,
+ u32 ui32ByteOffset)
{
struct IMG_CPU_PHYADDR CpuPAddr;
{
if (psLinuxMemArea->uData.sExternalKV.bPhysContig) {
CpuPAddr =
- SysSysPAddrToCpuPAddr(psLinuxMemArea->uData.
+ SysSysPAddrToCpuPAddr(
+ psLinuxMemArea->uData.
sExternalKV.uPhysAddr.
- SysPhysAddr);
+ SysPhysAddr);
CpuPAddr.uiAddr += ui32ByteOffset;
} else {
u32 ui32PageIndex =
PHYS_TO_PFN(ui32ByteOffset);
struct IMG_SYS_PHYADDR SysPAddr =
psLinuxMemArea->uData.sExternalKV.uPhysAddr.
- pSysPhysAddr[ui32PageIndex];
+ pSysPhysAddr[ui32PageIndex];
CpuPAddr = SysSysPAddrToCpuPAddr(SysPAddr);
CpuPAddr.uiAddr +=
}
default:
PVR_DPF(PVR_DBG_ERROR,
- "%s: Unknown Linux memory area type (%d)\n",
+ "%s: Unknown struct LinuxMemArea type (%d)\n",
__func__, psLinuxMemArea->eAreaType);
}
return CpuPAddr;
}
+static void inv_cache_vmalloc(const struct LinuxMemArea *mem_area)
+{
+ struct page *pg;
+ void *kaddr;
+ size_t chunk;
+ u32 pg_cnt;
+ u32 pg_ofs;
+ u32 vaddr, vaddr_end;
+
+ vaddr = (u32)mem_area->uData.sVmalloc.pvVmallocAddress;
+ vaddr_end = vaddr + mem_area->ui32ByteSize;
+ pg_cnt = (PAGE_ALIGN(vaddr_end) - (vaddr & PAGE_MASK)) / PAGE_SIZE;
+
+ while (pg_cnt--) {
+ pg = pfn_to_page(VMallocToPhys((void *)vaddr) >> PAGE_SHIFT);
+ kaddr = page_address(pg);
+ pg_ofs = vaddr & ~PAGE_MASK;
+ kaddr += pg_ofs;
+ chunk = min_t(ssize_t, vaddr_end - vaddr, PAGE_SIZE - pg_ofs);
+ dma_cache_maint(kaddr, chunk, DMA_FROM_DEVICE);
+ vaddr += chunk;
+ }
+}
+
+static void inv_cache_page_list(const struct LinuxMemArea *mem_area)
+{
+ u32 pg_cnt;
+ struct page **pg_list;
+
+ pg_cnt = RANGE_TO_PAGES(mem_area->ui32ByteSize);
+ pg_list = mem_area->uData.sPageList.pvPageList;
+ while (pg_cnt--)
+ dma_cache_maint(page_address(*pg_list++), PAGE_SIZE,
+ DMA_FROM_DEVICE);
+}
+
+void inv_cache_mem_area(const struct LinuxMemArea *mem_area)
+{
+ switch (mem_area->eAreaType) {
+ case LINUX_MEM_AREA_VMALLOC:
+ inv_cache_vmalloc(mem_area);
+ break;
+ case LINUX_MEM_AREA_ALLOC_PAGES:
+ inv_cache_page_list(mem_area);
+ break;
+ case LINUX_MEM_AREA_IOREMAP:
+ case LINUX_MEM_AREA_EXTERNAL_KV:
+ case LINUX_MEM_AREA_IO:
+ case LINUX_MEM_AREA_SUB_ALLOC:
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Not implemented for type (%d)\n",
+ __func__, mem_area->eAreaType);
+ BUG();
+ default:
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Unknown LinuxMemArea type (%d)\n",
+ __func__, mem_area->eAreaType);
+ BUG();
+ }
+}
+
IMG_BOOL LinuxMemAreaPhysIsContig(struct LinuxMemArea *psLinuxMemArea)
{
switch (psLinuxMemArea->eAreaType) {
return IMG_FALSE;
case LINUX_MEM_AREA_SUB_ALLOC:
- PVR_DPF(PVR_DBG_WARNING,
- "%s is meaningless for Linux memory area type (%d)",
- __func__, psLinuxMemArea->eAreaType);
- break;
+ return LinuxMemAreaPhysIsContig(psLinuxMemArea->uData.sSubAlloc.
+ psParentLinuxMemArea);
default:
PVR_DPF(PVR_DBG_ERROR,
- "%s: Unknown Linux memory area type (%d)\n",
+ "%s: Unknown struct LinuxMemArea type (%d)\n",
__func__, psLinuxMemArea->eAreaType);
break;
}
return IMG_FALSE;
}
-enum LINUX_MEM_AREA_TYPE LinuxMemAreaRootType(struct LinuxMemArea
- *psLinuxMemArea)
-{
- if (psLinuxMemArea->eAreaType == LINUX_MEM_AREA_SUB_ALLOC)
- return LinuxMemAreaRootType(
- psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea);
- else
- return psLinuxMemArea->eAreaType;
-}
-
const char *LinuxMemAreaTypeToString(enum LINUX_MEM_AREA_TYPE eMemAreaType)
{
-
switch (eMemAreaType) {
case LINUX_MEM_AREA_IOREMAP:
return "LINUX_MEM_AREA_IOREMAP";
struct DEBUG_LINUX_MEM_AREA_REC *psRecord;
off_t Ret;
- LinuxLockMutex(&gPVRSRVLock);
+ mutex_lock(&g_sDebugMutex);
if (!off) {
if (count < 500) {
goto unlock_and_return;
}
Ret = printAppend(buffer, count, 0,
- "Number of Linux Memory Areas: %u\n"
+ "Number of Linux Memory Areas: %u\n"
"At the current water mark these areas "
- "correspond to %u bytes (excluding SUB areas)\n"
+ "correspond to %u bytes "
+ "(excluding SUB areas)\n"
"At the highest water mark these areas "
- "corresponded to %u bytes (excluding SUB areas)\n"
+ "corresponded to %u bytes "
+ "(excluding SUB areas)\n"
"\nDetails for all Linux Memory Areas:\n"
"%s %-24s %s %s %-8s %-5s %s\n",
g_LinuxMemAreaCount,
);
unlock_and_return:
-
- LinuxUnLockMutex(&gPVRSRVLock);
+ mutex_unlock(&g_sDebugMutex);
return Ret;
}
#endif
struct DEBUG_MEM_ALLOC_REC *psRecord;
off_t Ret;
- LinuxLockMutex(&gPVRSRVLock);
+ mutex_lock(&g_sDebugMutex);
if (!off) {
if (count < 1000) {
Ret = printAppend(buffer, count, 0, "%-60s: %d bytes\n",
"Current Water Mark of bytes allocated via kmalloc",
- g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMALLOC]);
+ g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMALLOC]);
Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"Highest Water Mark of bytes allocated via kmalloc",
- g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMALLOC]);
+ g_HighWaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_KMALLOC]);
Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"Current Water Mark of bytes allocated via vmalloc",
g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_VMALLOC]);
Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"Highest Water Mark of bytes allocated via vmalloc",
- g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_VMALLOC]);
+ g_HighWaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_VMALLOC]);
Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Current Water Mark of bytes allocated via alloc_pages",
- g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Highest Water Mark of bytes allocated via alloc_pages",
- g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Current Water Mark of bytes allocated via ioremap",
+ "Current Water Mark of bytes allocated via alloc_pages",
+ g_WaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES]);
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Highest Water Mark of bytes allocated via alloc_pages",
+ g_HighWaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES]);
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Current Water Mark of bytes allocated via ioremap",
g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_IOREMAP]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Highest Water Mark of bytes allocated via ioremap",
- g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_IOREMAP]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Current Water Mark of bytes reserved for \"IO\" memory areas",
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Highest Water Mark of bytes allocated via ioremap",
+ g_HighWaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_IOREMAP]);
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Current Water Mark of bytes reserved for "
+ "\"IO\" memory areas",
g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_IO]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Highest Water Mark of bytes allocated for \"IO\" memory areas",
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Highest Water Mark of bytes allocated for "
+ "\"IO\" memory areas",
g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_IO]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Current Water Mark of bytes allocated via kmem_cache_alloc",
- g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Highest Water Mark of bytes allocated via kmem_cache_alloc",
- g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Current Water Mark of bytes mapped via kmap",
- g_WaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMAP]);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
- "Highest Water Mark of bytes mapped via kmap",
- g_HighWaterMarkData[DEBUG_MEM_ALLOC_TYPE_KMAP]);
-
- Ret = printAppend(buffer, count, Ret, "\n");
-
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Current Water Mark of bytes allocated via "
+ "kmem_cache_alloc",
+ g_WaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE]);
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ "Highest Water Mark of bytes allocated via "
+ "kmem_cache_alloc",
+ g_HighWaterMarkData
+ [DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE]);
+ Ret = printAppend(buffer, count, Ret, "\n");
+
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"The Current Water Mark for memory allocated from system RAM",
g_SysRAMWaterMark);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"The Highest Water Mark for memory allocated from system RAM",
g_SysRAMHighWaterMark);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"The Current Water Mark for memory allocated from IO memory",
g_IOMemWaterMark);
- Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
+ Ret = printAppend(buffer, count, Ret, "%-60s: %d bytes\n",
"The Highest Water Mark for memory allocated from IO memory",
g_IOMemHighWaterMark);
if (psRecord->eAllocType != DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE)
Ret = printAppend(buffer, count, 0,
- "%-16s %-8p %08lx %-10d %-5d %-10s %s:%d\n",
+ "%-16s %-8p %08x %-10d %-5d %-10s %s:%d\n",
DebugMemAllocRecordTypeToString(psRecord->eAllocType),
psRecord->pvCpuVAddr, psRecord->ulCpuPAddr,
psRecord->ui32Bytes, psRecord->pid, "NULL",
psRecord->pszFileName, psRecord->ui32Line);
else
Ret = printAppend(buffer, count, 0,
- "%-16s %-8p %08lx %-10d %-5d %-10s %s:%d\n",
+ "%-16s %-8p %08x %-10d %-5d %-10s %s:%d\n",
DebugMemAllocRecordTypeToString(psRecord->eAllocType),
psRecord->pvCpuVAddr, psRecord->ulCpuPAddr,
psRecord->ui32Bytes, psRecord->pid,
psRecord->pszFileName, psRecord->ui32Line);
unlock_and_return:
-
- LinuxUnLockMutex(&gPVRSRVLock);
+ mutex_unlock(&g_sDebugMutex);
return Ret;
}
#endif
const char *HAPFlagsToString(u32 ui32Flags)
{
static char szFlags[50];
- u32 ui32Pos = 0;
+ s32 i32Pos = 0;
u32 ui32CacheTypeIndex, ui32MapTypeIndex;
char *apszCacheTypes[] = {
"UNCACHED",
ui32CacheTypeIndex = 2;
} else {
ui32CacheTypeIndex = 3;
- PVR_DPF(PVR_DBG_ERROR, "%s: unknown cache type (%d)",
- __func__,
- (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK));
+ PVR_DPF(PVR_DBG_ERROR, "%s: unknown cache type (%u)",
+ __func__, (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK));
}
if (ui32Flags & PVRSRV_HAP_KERNEL_ONLY) {
ui32MapTypeIndex = 4;
} else {
ui32MapTypeIndex = 5;
- PVR_DPF(PVR_DBG_ERROR, "%s: unknown map type (%d)",
+ PVR_DPF(PVR_DBG_ERROR, "%s: unknown map type (%u)",
__func__, (ui32Flags & PVRSRV_HAP_MAPTYPE_MASK));
}
- ui32Pos = sprintf(szFlags, "%s|", apszCacheTypes[ui32CacheTypeIndex]);
- sprintf(szFlags + ui32Pos, "%s", apszMapType[ui32MapTypeIndex]);
+ i32Pos = sprintf(szFlags, "%s|", apszCacheTypes[ui32CacheTypeIndex]);
+ if (i32Pos <= 0) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: sprintf for cache type %u failed (%d)", __func__,
+ ui32CacheTypeIndex, i32Pos);
+ szFlags[0] = 0;
+ } else {
+ sprintf(szFlags + i32Pos, "%s", apszMapType[ui32MapTypeIndex]);
+ }
return szFlags;
}
#ifndef __IMG_LINUX_MM_H__
#define __IMG_LINUX_MM_H__
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/version.h>
#include <linux/slab.h>
#include <linux/mm.h>
+#include <linux/list.h>
#include <linux/io.h>
-#define PHYS_TO_PFN(phys) ((phys) >> PAGE_SHIFT)
-#define PFN_TO_PHYS(pfn) ((pfn) << PAGE_SHIFT)
+#define PHYS_TO_PFN(phys) ((phys) >> PAGE_SHIFT)
+#define PFN_TO_PHYS(pfn) ((pfn) << PAGE_SHIFT)
-#define RANGE_TO_PAGES(range) (((range) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)
+#define RANGE_TO_PAGES(range) \
+ (((range) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)
#define ADDR_TO_PAGE_OFFSET(addr) (((unsigned long)(addr)) & (PAGE_SIZE - 1))
-#define REMAP_PFN_RANGE(vma, addr, pfn, size, prot) \
+#define REMAP_PFN_RANGE(vma, addr, pfn, size, prot) \
remap_pfn_range(vma, addr, pfn, size, prot)
-#define IO_REMAP_PFN_RANGE(vma, addr, pfn, size, prot) \
+#define IO_REMAP_PFN_RANGE(vma, addr, pfn, size, prot) \
io_remap_pfn_range(vma, addr, pfn, size, prot)
+#define VM_INSERT_PAGE(vma, addr, page) vm_insert_page(vma, addr, page)
+
static inline u32 VMallocToPhys(void *pCpuVAddr)
{
return page_to_phys(vmalloc_to_page(pCpuVAddr)) +
} sVmalloc;
struct _sPageList {
struct page **pvPageList;
+ void *hBlockPageList;
} sPageList;
struct _sSubAlloc {
struct LinuxMemArea *psParentLinuxMemArea;
} sSubAlloc;
} uData;
u32 ui32ByteSize;
+ u32 ui32AreaFlags;
+ IMG_BOOL bMMapRegistered;
+ struct list_head sMMapItem;
+ struct list_head sMMapOffsetStructList;
};
struct kmem_cache;
struct page *LinuxMemAreaOffsetToPage(struct LinuxMemArea *psLinuxMemArea,
u32 ui32ByteOffset);
-#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
-#define KMapWrapper(psPage) _KMapWrapper(psPage, __FILE__, __LINE__)
-#else
-#define KMapWrapper(psPage) _KMapWrapper(psPage, NULL, 0)
-#endif
-void *_KMapWrapper(struct page *psPage, char *pszFileName, u32 ui32Line);
-
-#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
-#define KUnMapWrapper(psPage) _KUnMapWrapper(psPage, __FILE__, __LINE__)
-#else
-#define KUnMapWrapper(psPage) _KUnMapWrapper(psPage, NULL, 0)
-#endif
-void _KUnMapWrapper(struct page *psPage, char *pszFileName,
- u32 ui32Line);
-
-struct kmem_cache *KMemCacheCreateWrapper(char *pszName, size_t Size,
- size_t Align, u32 ui32Flags);
-
-void KMemCacheDestroyWrapper(struct kmem_cache *psCache);
-
#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
#define KMemCacheAllocWrapper(psCache, Flags) \
_KMemCacheAllocWrapper(psCache, Flags, __FILE__, __LINE__)
PHYS_TO_PFN(LinuxMemAreaToCpuPAddr(psLinuxMemArea, \
ui32ByteOffset).uiAddr)
+void inv_cache_mem_area(const struct LinuxMemArea *mem_area);
+
IMG_BOOL LinuxMemAreaPhysIsContig(struct LinuxMemArea *psLinuxMemArea);
-enum LINUX_MEM_AREA_TYPE LinuxMemAreaRootType(
- struct LinuxMemArea *psLinuxMemArea);
+static inline struct LinuxMemArea *LinuxMemAreaRoot(struct LinuxMemArea
+ *psLinuxMemArea)
+{
+ if (psLinuxMemArea->eAreaType == LINUX_MEM_AREA_SUB_ALLOC)
+ return psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea;
+ else
+ return psLinuxMemArea;
+}
+
+static inline enum LINUX_MEM_AREA_TYPE LinuxMemAreaRootType(struct LinuxMemArea
+ *psLinuxMemArea)
+{
+ return LinuxMemAreaRoot(psLinuxMemArea)->eAreaType;
+}
const char *LinuxMemAreaTypeToString(enum LINUX_MEM_AREA_TYPE eMemAreaType);
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
+#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/mm.h>
#include <linux/module.h>
#include "services.h"
#include "servicesint.h"
#include "pvrmmap.h"
+#include "mutils.h"
#include "mmap.h"
#include "mm.h"
#include "pvr_debug.h"
#include "osfunc.h"
#include "proc.h"
+#include "mutex.h"
+#include "handle.h"
+#include "perproc.h"
+#include "env_perproc.h"
+#include "bridged_support.h"
-static struct KV_OFFSET_STRUCT *FindOffsetStructFromLinuxMemArea(
- struct LinuxMemArea *psLinuxMemArea);
-static u32 GetFirstFreePageAlignedNumber(void);
-static struct KV_OFFSET_STRUCT *FindOffsetStructByKVIndexAddress(
- void *pvVirtAddress, u32 ui32ByteSize);
-static void DeterminUsersSizeAndByteOffset(void *pvKVIndexAddress,
- struct LinuxMemArea *psLinuxMemArea, u32 *pui32RealByteSize,
- u32 *pui32ByteOffset);
-static struct KV_OFFSET_STRUCT *FindOffsetStructByMMapOffset(u32 ui32Offset);
-static IMG_BOOL DoMapToUser(struct LinuxMemArea *psLinuxMemArea,
- struct vm_area_struct *ps_vma, u32 ui32ByteOffset,
- u32 ui32Size);
-static IMG_BOOL CheckSize(struct LinuxMemArea *psLinuxMemArea, u32 ui32Size);
-
-#if defined(DEBUG_LINUX_MMAP_AREAS)
-static off_t PrintMMapRegistrations(char *buffer, size_t size, off_t off);
-#endif
+static struct mutex g_sMMapMutex;
-static void MMapVOpen(struct vm_area_struct *ps_vma);
-static void MMapVClose(struct vm_area_struct *ps_vma);
-
-static struct vm_operations_struct MMapIOOps = {
- .open = MMapVOpen,
- .close = MMapVClose,
-};
-
-static struct KV_OFFSET_STRUCT *g_psKVOffsetTable;
static struct kmem_cache *g_psMemmapCache;
+static LIST_HEAD(g_sMMapAreaList);
+static LIST_HEAD(g_sMMapOffsetStructList);
#if defined(DEBUG_LINUX_MMAP_AREAS)
static u32 g_ui32RegisteredAreas;
static u32 g_ui32TotalByteSize;
#endif
-static struct rw_semaphore g_mmap_sem;
+#define FIRST_PHYSICAL_PFN 0
+#define LAST_PHYSICAL_PFN 0x7ffffffful
+#define FIRST_SPECIAL_PFN (LAST_PHYSICAL_PFN + 1)
+#define LAST_SPECIAL_PFN 0xfffffffful
-void PVRMMapInit(void)
+#define MAX_MMAP_HANDLE 0x7ffffffful
+
+static inline IMG_BOOL PFNIsPhysical(u32 pfn)
{
- g_psKVOffsetTable = NULL;
+ return pfn >= FIRST_PHYSICAL_PFN && pfn <= LAST_PHYSICAL_PFN;
+}
- g_psMemmapCache = KMemCacheCreateWrapper("img-mmap",
- sizeof(struct KV_OFFSET_STRUCT), 0, 0);
- if (g_psMemmapCache) {
-#if defined(DEBUG_LINUX_MMAP_AREAS)
- CreateProcReadEntry("mmap", PrintMMapRegistrations);
-#endif
- } else {
- PVR_DPF(PVR_DBG_ERROR, "%s: failed to allocate kmem_cache",
- __func__);
- }
- init_rwsem(&g_mmap_sem);
+static inline IMG_BOOL PFNIsSpecial(u32 pfn)
+{
+ return pfn >= FIRST_SPECIAL_PFN && pfn <= LAST_SPECIAL_PFN;
}
-void PVRMMapCleanup(void)
+static inline void *MMapOffsetToHandle(u32 pfn)
{
- struct KV_OFFSET_STRUCT *psOffsetStruct;
+ if (PFNIsPhysical(pfn)) {
+ PVR_ASSERT(PFNIsPhysical(pfn));
+ return NULL;
+ }
- if (!g_psMemmapCache)
- return;
+ return (void *)(pfn - FIRST_SPECIAL_PFN);
+}
- if (g_psKVOffsetTable) {
- PVR_DPF(PVR_DBG_ERROR, "%s: BUG! g_psMemmapCache isn't empty!",
- __func__);
+static inline u32 HandleToMMapOffset(void *hHandle)
+{
+ u32 ulHandle = (u32) hHandle;
- for (psOffsetStruct = g_psKVOffsetTable; psOffsetStruct;
- psOffsetStruct = psOffsetStruct->psNext) {
- PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
- "Un-registering mmapable area: "
- "psLinuxMemArea=0x%p, CpuPAddr=0x%08lx\n",
- __func__, psOffsetStruct->psLinuxMemArea,
- LinuxMemAreaToCpuPAddr(psOffsetStruct->
- psLinuxMemArea,
- 0).uiAddr);
- PVRMMapRemoveRegisteredArea(psOffsetStruct->
- psLinuxMemArea);
+ if (PFNIsSpecial(ulHandle)) {
+ PVR_ASSERT(PFNIsSpecial(ulHandle));
+ return 0;
}
+
+ return ulHandle + FIRST_SPECIAL_PFN;
}
- RemoveProcEntry("mmap");
- KMemCacheDestroyWrapper(g_psMemmapCache);
- g_psMemmapCache = NULL;
- PVR_DPF(PVR_DBG_MESSAGE, "PVRMMapCleanup: KVOffsetTable deallocated");
+static inline IMG_BOOL LinuxMemAreaUsesPhysicalMap(
+ struct LinuxMemArea *psLinuxMemArea)
+{
+ return LinuxMemAreaPhysIsContig(psLinuxMemArea);
+}
+
+static inline u32 GetCurrentThreadID(void)
+{
+
+ return (u32) current->pid;
}
-enum PVRSRV_ERROR
-PVRMMapRegisterArea(const char *pszName,
- struct LinuxMemArea *psLinuxMemArea, u32 ui32AllocFlags)
+static struct KV_OFFSET_STRUCT *CreateOffsetStruct(struct LinuxMemArea
+ *psLinuxMemArea,
+ u32 ui32Offset,
+ u32 ui32RealByteSize)
{
struct KV_OFFSET_STRUCT *psOffsetStruct;
- enum PVRSRV_ERROR iError = PVRSRV_OK;
+#if defined(DEBUG) || defined(DEBUG_LINUX_MMAP_AREAS)
+ const char *pszName =
+ LinuxMemAreaTypeToString(LinuxMemAreaRootType(psLinuxMemArea));
+#endif
+
PVR_DPF(PVR_DBG_MESSAGE,
- "%s(%s, psLinuxMemArea=%p, ui32AllocFlags=0x%8lx)",
- __func__, pszName, psLinuxMemArea, ui32AllocFlags);
+ "%s(%s, psLinuxMemArea: 0x%p, ui32AllocFlags: 0x%8lx)",
+ __func__, pszName, psLinuxMemArea,
+ psLinuxMemArea->ui32AreaFlags);
- down_write(&g_mmap_sem);
- psOffsetStruct = FindOffsetStructFromLinuxMemArea(psLinuxMemArea);
- if (psOffsetStruct) {
- PVR_DPF(PVR_DBG_ERROR, "PVRMMapRegisterArea: "
- "psLinuxMemArea=%p is already registered",
- psOffsetStruct->psLinuxMemArea);
- iError = PVRSRV_ERROR_INVALID_PARAMS;
- goto register_exit;
- }
+ PVR_ASSERT(psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC
+ || LinuxMemAreaRoot(psLinuxMemArea)->eAreaType !=
+ LINUX_MEM_AREA_SUB_ALLOC);
+
+ PVR_ASSERT(psLinuxMemArea->bMMapRegistered);
psOffsetStruct = KMemCacheAllocWrapper(g_psMemmapCache, GFP_KERNEL);
- if (!psOffsetStruct) {
+ if (psOffsetStruct == NULL) {
PVR_DPF(PVR_DBG_ERROR, "PVRMMapRegisterArea: "
"Couldn't alloc another mapping record from cache");
- iError = PVRSRV_ERROR_OUT_OF_MEMORY;
- goto register_exit;
+ return NULL;
}
- psOffsetStruct->ui32MMapOffset = GetFirstFreePageAlignedNumber();
+ psOffsetStruct->ui32MMapOffset = ui32Offset;
psOffsetStruct->psLinuxMemArea = psLinuxMemArea;
-
- if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC) {
- psOffsetStruct->ui32AllocFlags = ui32AllocFlags;
- } else {
- struct KV_OFFSET_STRUCT *psParentOffsetStruct;
- psParentOffsetStruct =
- FindOffsetStructFromLinuxMemArea(psLinuxMemArea->uData.
- sSubAlloc.
- psParentLinuxMemArea);
- PVR_ASSERT(psParentOffsetStruct);
- psOffsetStruct->ui32AllocFlags =
- psParentOffsetStruct->ui32AllocFlags;
- }
-
+ psOffsetStruct->ui32Mapped = 0;
+ psOffsetStruct->ui32RealByteSize = ui32RealByteSize;
+ psOffsetStruct->ui32TID = GetCurrentThreadID();
+ psOffsetStruct->ui32PID = OSGetCurrentProcessIDKM();
+ psOffsetStruct->bOnMMapList = IMG_FALSE;
+ psOffsetStruct->ui32RefCount = 0;
+ psOffsetStruct->ui32UserVAddr = 0;
#if defined(DEBUG_LINUX_MMAP_AREAS)
psOffsetStruct->pszName = pszName;
- psOffsetStruct->pid = current->pid;
- psOffsetStruct->ui16Mapped = 0;
- psOffsetStruct->ui16Faults = 0;
-
- g_ui32RegisteredAreas++;
- if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC)
- g_ui32TotalByteSize += psLinuxMemArea->ui32ByteSize;
#endif
- psOffsetStruct->psNext = g_psKVOffsetTable;
+ list_add_tail(&psOffsetStruct->sAreaItem,
+ &psLinuxMemArea->sMMapOffsetStructList);
- g_psKVOffsetTable = psOffsetStruct;
-register_exit:
- up_write(&g_mmap_sem);
- return iError;
+ return psOffsetStruct;
}
-enum PVRSRV_ERROR PVRMMapRemoveRegisteredArea(
- struct LinuxMemArea *psLinuxMemArea)
+static void DestroyOffsetStruct(struct KV_OFFSET_STRUCT *psOffsetStruct)
{
- struct KV_OFFSET_STRUCT **ppsOffsetStruct, *psOffsetStruct;
- enum PVRSRV_ERROR iError = PVRSRV_OK;
-
- down_write(&g_mmap_sem);
- for (ppsOffsetStruct = &g_psKVOffsetTable;
- (psOffsetStruct = *ppsOffsetStruct);
- ppsOffsetStruct = &(*ppsOffsetStruct)->psNext) {
- if (psOffsetStruct->psLinuxMemArea == psLinuxMemArea)
- break;
-
- }
-
- if (!psOffsetStruct) {
- PVR_DPF(PVR_DBG_ERROR,
- "%s: Registration for psLinuxMemArea = 0x%p not found",
- __func__, psLinuxMemArea);
- iError = PVRSRV_ERROR_BAD_MAPPING;
- goto unregister_exit;
- }
-#if defined(DEBUG_LINUX_MMAP_AREAS)
+ list_del(&psOffsetStruct->sAreaItem);
- if (psOffsetStruct->ui16Mapped) {
- PVR_DPF(PVR_DBG_ERROR,
- "%s: Unregistering still-mapped area! "
- "(psLinuxMemArea=0x%p)\n",
- __func__, psOffsetStruct->psLinuxMemArea);
- iError = PVRSRV_ERROR_BAD_MAPPING;
- goto unregister_exit;
- }
-
- g_ui32RegisteredAreas--;
-
- if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC)
- g_ui32TotalByteSize -=
- psOffsetStruct->psLinuxMemArea->ui32ByteSize;
-#endif
+ if (psOffsetStruct->bOnMMapList)
+ list_del(&psOffsetStruct->sMMapItem);
PVR_DPF(PVR_DBG_MESSAGE, "%s: Table entry: "
"psLinuxMemArea=0x%08lX, CpuPAddr=0x%08lX", __func__,
psOffsetStruct->psLinuxMemArea,
LinuxMemAreaToCpuPAddr(psOffsetStruct->psLinuxMemArea, 0));
- *ppsOffsetStruct = psOffsetStruct->psNext;
-
KMemCacheFreeWrapper(g_psMemmapCache, psOffsetStruct);
-
-unregister_exit:
- up_write(&g_mmap_sem);
- return iError;
}
-static struct KV_OFFSET_STRUCT *FindOffsetStructFromLinuxMemArea(
- struct LinuxMemArea *psLinuxMemArea)
+static inline void DetermineUsersSizeAndByteOffset(struct LinuxMemArea
+ *psLinuxMemArea,
+ u32 *pui32RealByteSize,
+ u32 *pui32ByteOffset)
{
- struct KV_OFFSET_STRUCT *psOffsetStruct = NULL;
+ u32 ui32PageAlignmentOffset;
+ struct IMG_CPU_PHYADDR CpuPAddr;
- for (psOffsetStruct = g_psKVOffsetTable; psOffsetStruct;
- psOffsetStruct = psOffsetStruct->psNext) {
- if (psOffsetStruct->psLinuxMemArea == psLinuxMemArea)
- return psOffsetStruct;
+ CpuPAddr = LinuxMemAreaToCpuPAddr(psLinuxMemArea, 0);
+ ui32PageAlignmentOffset = ADDR_TO_PAGE_OFFSET(CpuPAddr.uiAddr);
- }
- return NULL;
+ *pui32ByteOffset = ui32PageAlignmentOffset;
+
+ *pui32RealByteSize =
+ PAGE_ALIGN(psLinuxMemArea->ui32ByteSize + ui32PageAlignmentOffset);
}
-static u32 GetFirstFreePageAlignedNumber(void)
+enum PVRSRV_ERROR PVRMMapOSMemHandleToMMapData(
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *hMHandle, u32 *pui32MMapOffset,
+ u32 *pui32ByteOffset, u32 *pui32RealByteSize,
+ u32 *pui32UserVAddr)
{
- struct KV_OFFSET_STRUCT *psCurrentRec;
- u32 ui32CurrentPageOffset;
+ struct LinuxMemArea *psLinuxMemArea;
+ struct KV_OFFSET_STRUCT *psOffsetStruct;
+ void *hOSMemHandle;
+ enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
- if (!g_psKVOffsetTable)
- return 0;
+ mutex_lock(&g_sMMapMutex);
- psCurrentRec = g_psKVOffsetTable;
- ui32CurrentPageOffset = (g_psKVOffsetTable->ui32MMapOffset);
+ PVR_ASSERT(PVRSRVGetMaxHandle(psPerProc->psHandleBase) <=
+ MAX_MMAP_HANDLE);
- while (psCurrentRec) {
- if (ui32CurrentPageOffset != (psCurrentRec->ui32MMapOffset))
- return ui32CurrentPageOffset;
- psCurrentRec = psCurrentRec->psNext;
- ui32CurrentPageOffset += PAGE_SIZE;
- }
+ eError =
+ PVRSRVLookupOSMemHandle(psPerProc->psHandleBase, &hOSMemHandle,
+ hMHandle);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: Lookup of handle 0x%lx failed",
+ __func__, hMHandle);
- return g_psKVOffsetTable->ui32MMapOffset + PAGE_SIZE;
-}
-
-enum PVRSRV_ERROR
-PVRMMapKVIndexAddressToMMapData(void *pvKVIndexAddress,
- u32 ui32Size,
- u32 *pui32MMapOffset,
- u32 *pui32ByteOffset,
- u32 *pui32RealByteSize)
-{
- struct KV_OFFSET_STRUCT *psOffsetStruct;
- enum PVRSRV_ERROR iError = PVRSRV_OK;
-
- down_read(&g_mmap_sem);
- psOffsetStruct =
- FindOffsetStructByKVIndexAddress(pvKVIndexAddress, ui32Size);
- if (!psOffsetStruct) {
- iError = PVRSRV_ERROR_BAD_MAPPING;
- goto indexaddress_exit;
+ goto exit_unlock;
}
- *pui32MMapOffset = psOffsetStruct->ui32MMapOffset;
+ psLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
- DeterminUsersSizeAndByteOffset(pvKVIndexAddress,
- psOffsetStruct->psLinuxMemArea,
+ DetermineUsersSizeAndByteOffset(psLinuxMemArea,
pui32RealByteSize, pui32ByteOffset);
-indexaddress_exit:
- up_read(&g_mmap_sem);
- return iError;
-}
+ list_for_each_entry(psOffsetStruct,
+ &psLinuxMemArea->sMMapOffsetStructList, sAreaItem) {
+ if (psPerProc->ui32PID == psOffsetStruct->ui32PID) {
+ PVR_ASSERT(*pui32RealByteSize ==
+ psOffsetStruct->ui32RealByteSize);
-static struct KV_OFFSET_STRUCT *FindOffsetStructByKVIndexAddress(
- void *pvKVIndexAddress, u32 ui32ByteSize)
-{
- struct KV_OFFSET_STRUCT *psOffsetStruct;
- u8 *pui8CpuVAddr;
- u8 *pui8IndexCpuVAddr = (u8 *)pvKVIndexAddress;
-
- for (psOffsetStruct = g_psKVOffsetTable; psOffsetStruct;
- psOffsetStruct = psOffsetStruct->psNext) {
- struct LinuxMemArea *psLinuxMemArea =
- psOffsetStruct->psLinuxMemArea;
-
- switch (psLinuxMemArea->eAreaType) {
- case LINUX_MEM_AREA_IOREMAP:
- pui8CpuVAddr =
- psLinuxMemArea->uData.sIORemap.pvIORemapCookie;
- break;
- case LINUX_MEM_AREA_VMALLOC:
- pui8CpuVAddr =
- psLinuxMemArea->uData.sVmalloc.pvVmallocAddress;
- break;
- case LINUX_MEM_AREA_EXTERNAL_KV:
- pui8CpuVAddr =
- psLinuxMemArea->uData.sExternalKV.pvExternalKV;
- break;
- default:
- pui8CpuVAddr = NULL;
- break;
- }
+ *pui32MMapOffset = psOffsetStruct->ui32MMapOffset;
+ *pui32UserVAddr = psOffsetStruct->ui32UserVAddr;
+ psOffsetStruct->ui32RefCount++;
- if (pui8CpuVAddr) {
- if (pui8IndexCpuVAddr >= pui8CpuVAddr &&
- (pui8IndexCpuVAddr + ui32ByteSize) <=
- (pui8CpuVAddr + psLinuxMemArea->ui32ByteSize))
- return psOffsetStruct;
- else
- pui8CpuVAddr = NULL;
- }
-
- if (pvKVIndexAddress == psOffsetStruct->psLinuxMemArea) {
- if (psLinuxMemArea->eAreaType ==
- LINUX_MEM_AREA_SUB_ALLOC)
- PVR_ASSERT(psLinuxMemArea->uData.sSubAlloc.
- psParentLinuxMemArea->eAreaType !=
- LINUX_MEM_AREA_SUB_ALLOC);
- return psOffsetStruct;
+ eError = PVRSRV_OK;
+ goto exit_unlock;
}
}
- printk(KERN_ERR "%s: Failed to find offset struct (KVAddress=%p)\n",
- __func__, pvKVIndexAddress);
- return NULL;
-}
-
-static void DeterminUsersSizeAndByteOffset(void *pvKVIndexAddress,
- struct LinuxMemArea *psLinuxMemArea,
- u32 *pui32RealByteSize,
- u32 *pui32ByteOffset)
-{
- u8 *pui8StartVAddr = NULL;
- u8 *pui8IndexCpuVAddr = (u8 *) pvKVIndexAddress;
- u32 ui32PageAlignmentOffset = 0;
- struct IMG_CPU_PHYADDR CpuPAddr;
- CpuPAddr = LinuxMemAreaToCpuPAddr(psLinuxMemArea, 0);
- ui32PageAlignmentOffset = ADDR_TO_PAGE_OFFSET(CpuPAddr.uiAddr);
+ *pui32UserVAddr = 0;
- if (pvKVIndexAddress != psLinuxMemArea &&
- (psLinuxMemArea->eAreaType == LINUX_MEM_AREA_IOREMAP
- || psLinuxMemArea->eAreaType == LINUX_MEM_AREA_VMALLOC
- || psLinuxMemArea->eAreaType == LINUX_MEM_AREA_EXTERNAL_KV)) {
- pui8StartVAddr = LinuxMemAreaToCpuVAddr(psLinuxMemArea);
- *pui32ByteOffset =
- (pui8IndexCpuVAddr - pui8StartVAddr) +
- ui32PageAlignmentOffset;
+ if (LinuxMemAreaUsesPhysicalMap(psLinuxMemArea)) {
+ *pui32MMapOffset = LinuxMemAreaToCpuPFN(psLinuxMemArea, 0);
+ PVR_ASSERT(PFNIsPhysical(*pui32MMapOffset));
} else {
- *pui32ByteOffset = ui32PageAlignmentOffset;
+ *pui32MMapOffset = HandleToMMapOffset(hMHandle);
+ PVR_ASSERT(PFNIsSpecial(*pui32MMapOffset));
}
- *pui32RealByteSize =
- PAGE_ALIGN(psLinuxMemArea->ui32ByteSize + ui32PageAlignmentOffset);
+ psOffsetStruct = CreateOffsetStruct(psLinuxMemArea, *pui32MMapOffset,
+ *pui32RealByteSize);
+ if (psOffsetStruct == NULL) {
+ eError = PVRSRV_ERROR_OUT_OF_MEMORY;
+ goto exit_unlock;
+ }
+
+ list_add_tail(&psOffsetStruct->sMMapItem, &g_sMMapOffsetStructList);
+ psOffsetStruct->bOnMMapList = IMG_TRUE;
+ psOffsetStruct->ui32RefCount++;
+ eError = PVRSRV_OK;
+
+exit_unlock:
+ mutex_unlock(&g_sMMapMutex);
+
+ return eError;
}
-int PVRMMap(struct file *pFile, struct vm_area_struct *ps_vma)
+enum PVRSRV_ERROR PVRMMapReleaseMMapData(
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *hMHandle, IMG_BOOL *pbMUnmap,
+ u32 *pui32RealByteSize, u32 *pui32UserVAddr)
{
- unsigned long ulBytes;
- struct KV_OFFSET_STRUCT *psCurrentRec = NULL;
- int iRetVal = 0;
+ struct LinuxMemArea *psLinuxMemArea;
+ struct KV_OFFSET_STRUCT *psOffsetStruct;
+ void *hOSMemHandle;
+ enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
+ u32 ui32PID = OSGetCurrentProcessIDKM();
- ulBytes = ps_vma->vm_end - ps_vma->vm_start;
- down_read(&g_mmap_sem);
- PVR_DPF(PVR_DBG_MESSAGE,
- "%s: Recieved mmap(2) request with a ui32MMapOffset=0x%08lx,"
- " and ui32ByteSize=%ld(0x%08lx)\n", __func__,
- PFN_TO_PHYS(ps_vma->vm_pgoff), ulBytes, ulBytes);
-
- if ((ps_vma->vm_flags & VM_WRITE) && !(ps_vma->vm_flags & VM_SHARED)
- ) {
- PVR_DPF(PVR_DBG_ERROR, "PVRMMap: "
- "Error - Cannot mmap non-shareable writable areas.");
- iRetVal = -EINVAL;
- goto pvrmmap_exit;
- }
+ mutex_lock(&g_sMMapMutex);
- psCurrentRec =
- FindOffsetStructByMMapOffset(PFN_TO_PHYS(ps_vma->vm_pgoff));
- if (!psCurrentRec) {
- PVR_DPF(PVR_DBG_ERROR, "PVRMMap: "
- "Error - Attempted to mmap unregistered area at vm_pgoff=%ld",
- ps_vma->vm_pgoff);
- iRetVal = -EINVAL;
- goto pvrmmap_exit;
- }
- PVR_DPF(PVR_DBG_MESSAGE, "%s: > psCurrentRec->psLinuxMemArea=%p\n",
- __func__, psCurrentRec->psLinuxMemArea);
- if (!CheckSize(psCurrentRec->psLinuxMemArea, ulBytes)) {
- iRetVal = -EINVAL;
- goto pvrmmap_exit;
- }
+ PVR_ASSERT(PVRSRVGetMaxHandle(psPerProc->psHandleBase) <=
+ MAX_MMAP_HANDLE);
- ps_vma->vm_flags |= VM_RESERVED;
- ps_vma->vm_flags |= VM_IO;
+ eError = PVRSRVLookupOSMemHandle(psPerProc->psHandleBase, &hOSMemHandle,
+ hMHandle);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: Lookup of handle 0x%lx failed",
+ __func__, hMHandle);
- ps_vma->vm_flags |= VM_DONTEXPAND;
+ goto exit_unlock;
+ }
- ps_vma->vm_private_data = (void *)psCurrentRec;
+ psLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
+
+ list_for_each_entry(psOffsetStruct,
+ &psLinuxMemArea->sMMapOffsetStructList, sAreaItem) {
+ if (psOffsetStruct->ui32PID == ui32PID) {
+ if (psOffsetStruct->ui32RefCount == 0) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: Attempt to "
+ "release mmap data with zero reference "
+ "count for offset struct 0x%p, "
+ "memory area 0x%p",
+ __func__, psOffsetStruct,
+ psLinuxMemArea);
+ eError = PVRSRV_ERROR_GENERIC;
+ goto exit_unlock;
+ }
- switch (psCurrentRec->ui32AllocFlags & PVRSRV_HAP_CACHETYPE_MASK) {
- case PVRSRV_HAP_CACHED:
+ psOffsetStruct->ui32RefCount--;
- break;
- case PVRSRV_HAP_WRITECOMBINE:
- ps_vma->vm_page_prot =
- pgprot_writecombine(ps_vma->vm_page_prot);
- break;
- case PVRSRV_HAP_UNCACHED:
- ps_vma->vm_page_prot = pgprot_noncached(ps_vma->vm_page_prot);
- break;
- default:
- PVR_DPF(PVR_DBG_ERROR, "%s: unknown cache type",
- __func__);
- }
+ *pbMUnmap = (psOffsetStruct->ui32RefCount == 0)
+ && (psOffsetStruct->ui32UserVAddr != 0);
- ps_vma->vm_ops = &MMapIOOps;
+ *pui32UserVAddr =
+ (*pbMUnmap) ? psOffsetStruct->ui32UserVAddr : 0;
+ *pui32RealByteSize =
+ (*pbMUnmap) ? psOffsetStruct->ui32RealByteSize : 0;
- if (!DoMapToUser(psCurrentRec->psLinuxMemArea, ps_vma, 0, ulBytes)) {
- iRetVal = -EAGAIN;
- goto pvrmmap_exit;
+ eError = PVRSRV_OK;
+ goto exit_unlock;
+ }
}
- MMapVOpen(ps_vma);
+ PVR_DPF(PVR_DBG_ERROR, "%s: Mapping data not found for handle "
+ "0x%lx (memory area 0x%p)",
+ __func__, hMHandle, psLinuxMemArea);
- PVR_DPF(PVR_DBG_MESSAGE, "%s: Mapped area at offset 0x%08lx\n",
- __func__, ps_vma->vm_pgoff);
+ eError = PVRSRV_ERROR_GENERIC;
-pvrmmap_exit:
- up_read(&g_mmap_sem);
- return iRetVal;
+exit_unlock:
+ mutex_unlock(&g_sMMapMutex);
+
+ return eError;
}
-static struct KV_OFFSET_STRUCT *FindOffsetStructByMMapOffset(u32 ui32MMapOffset)
+static inline struct KV_OFFSET_STRUCT *FindOffsetStructByOffset(u32 ui32Offset,
+ u32 ui32RealByteSize)
{
struct KV_OFFSET_STRUCT *psOffsetStruct;
-
- for (psOffsetStruct = g_psKVOffsetTable; psOffsetStruct;
- psOffsetStruct = psOffsetStruct->psNext) {
- if (psOffsetStruct->ui32MMapOffset == ui32MMapOffset)
- return psOffsetStruct;
-
+ u32 ui32TID = GetCurrentThreadID();
+ u32 ui32PID = OSGetCurrentProcessIDKM();
+
+ list_for_each_entry(psOffsetStruct, &g_sMMapOffsetStructList,
+ sMMapItem) {
+ if (ui32Offset == psOffsetStruct->ui32MMapOffset &&
+ ui32RealByteSize == psOffsetStruct->ui32RealByteSize &&
+ psOffsetStruct->ui32PID == ui32PID)
+ if (!PFNIsPhysical(ui32Offset) ||
+ psOffsetStruct->ui32TID == ui32TID)
+ return psOffsetStruct;
}
+
return NULL;
}
static IMG_BOOL DoMapToUser(struct LinuxMemArea *psLinuxMemArea,
- struct vm_area_struct *ps_vma,
- u32 ui32ByteOffset, u32 ui32ByteSize)
+ struct vm_area_struct *ps_vma, u32 ui32ByteOffset)
{
+ u32 ui32ByteSize;
+
if (psLinuxMemArea->eAreaType == LINUX_MEM_AREA_SUB_ALLOC)
- return DoMapToUser(psLinuxMemArea->
- uData.sSubAlloc.psParentLinuxMemArea,
- ps_vma,
- psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset +
- ui32ByteOffset, ui32ByteSize);
+ return DoMapToUser(LinuxMemAreaRoot(psLinuxMemArea), ps_vma,
+ psLinuxMemArea->uData.sSubAlloc.
+ ui32ByteOffset + ui32ByteOffset);
+ ui32ByteSize = ps_vma->vm_end - ps_vma->vm_start;
PVR_ASSERT(ADDR_TO_PAGE_OFFSET(ui32ByteSize) == 0);
+ if (PFNIsPhysical(ps_vma->vm_pgoff)) {
+ int result;
+
+ PVR_ASSERT(LinuxMemAreaPhysIsContig(psLinuxMemArea));
+ PVR_ASSERT(LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32ByteOffset)
+ == ps_vma->vm_pgoff);
- if (LinuxMemAreaPhysIsContig(psLinuxMemArea)) {
+ result =
+ IO_REMAP_PFN_RANGE(ps_vma, ps_vma->vm_start,
+ ps_vma->vm_pgoff, ui32ByteSize,
+ ps_vma->vm_page_prot);
- unsigned long pfn =
- LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32ByteOffset);
+ if (result == 0)
+ return IMG_TRUE;
- int result =
- IO_REMAP_PFN_RANGE(ps_vma, ps_vma->vm_start, pfn,
- ui32ByteSize, ps_vma->vm_page_prot);
- if (result != 0) {
- PVR_DPF(PVR_DBG_ERROR, "%s: Error - "
- "Failed to map contiguous physical "
- "address range (%d)",
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "%s: Failed to map contiguous physical address "
+ "range (%d), trying non-contiguous path",
__func__, result);
- return IMG_FALSE;
- }
- } else {
+ }
- unsigned long ulVMAPos = ps_vma->vm_start;
+ {
+ u32 ulVMAPos;
u32 ui32ByteEnd = ui32ByteOffset + ui32ByteSize;
u32 ui32PA;
for (ui32PA = ui32ByteOffset; ui32PA < ui32ByteEnd;
ui32PA += PAGE_SIZE) {
- unsigned long pfn =
- LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32PA);
+ u32 pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32PA);
+
+ if (!pfn_valid(pfn)) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Error - PFN invalid: 0x%lx",
+ __func__, pfn);
+ return IMG_FALSE;
+ }
+ }
+
+ ulVMAPos = ps_vma->vm_start;
+ for (ui32PA = ui32ByteOffset; ui32PA < ui32ByteEnd;
+ ui32PA += PAGE_SIZE) {
+ u32 pfn;
+ struct page *psPage;
+ int result;
+
+ pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32PA);
+ PVR_ASSERT(pfn_valid(pfn));
+
+ psPage = pfn_to_page(pfn);
- int result =
- REMAP_PFN_RANGE(ps_vma, ulVMAPos, pfn, PAGE_SIZE,
- ps_vma->vm_page_prot);
+ result = VM_INSERT_PAGE(ps_vma, ulVMAPos, psPage);
if (result != 0) {
- PVR_DPF(PVR_DBG_ERROR, "%s: Error - "
- "Failed to map discontiguous "
- "physical address range (%d)",
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Error - VM_INSERT_PAGE failed (%d)",
__func__, result);
return IMG_FALSE;
}
return IMG_TRUE;
}
-static IMG_BOOL
-CheckSize(struct LinuxMemArea *psLinuxMemArea, u32 ui32ByteSize)
+static IMG_BOOL CheckSize(struct LinuxMemArea *psLinuxMemArea, u32 ui32ByteSize)
{
struct IMG_CPU_PHYADDR CpuPAddr;
u32 ui32PageAlignmentOffset;
ui32RealByteSize =
PAGE_ALIGN(psLinuxMemArea->ui32ByteSize + ui32PageAlignmentOffset);
if (ui32RealByteSize < ui32ByteSize) {
- PVR_DPF(PVR_DBG_ERROR,
- "Cannot mmap %ld bytes from: "
- "%-8p %-8p %08lx %-8ld %-24s\n",
- ui32ByteSize,
- psLinuxMemArea,
+ PVR_DPF(PVR_DBG_ERROR, "Cannot mmap %ld bytes from: "
+ "%-8p %-8p %08lx %-8ld %-24s\n",
+ ui32ByteSize, psLinuxMemArea,
LinuxMemAreaToCpuVAddr(psLinuxMemArea),
LinuxMemAreaToCpuPAddr(psLinuxMemArea, 0).uiAddr,
psLinuxMemArea->ui32ByteSize,
return IMG_TRUE;
}
-static void MMapVOpen(struct vm_area_struct *ps_vma)
+static void MMapVOpenNoLock(struct vm_area_struct *ps_vma)
{
-#if defined(DEBUG_LINUX_MMAP_AREAS)
struct KV_OFFSET_STRUCT *psOffsetStruct =
(struct KV_OFFSET_STRUCT *)ps_vma->vm_private_data;
+
PVR_ASSERT(psOffsetStruct != NULL);
- psOffsetStruct->ui16Mapped++;
+ psOffsetStruct->ui32Mapped++;
+ PVR_ASSERT(!psOffsetStruct->bOnMMapList);
+
+ if (psOffsetStruct->ui32Mapped > 1) {
+ PVR_DPF(PVR_DBG_WARNING,
+ "%s: Offset structure 0x%p is being shared "
+ "across processes (psOffsetStruct->ui32Mapped: %lu)",
+ __func__, psOffsetStruct, psOffsetStruct->ui32Mapped);
+ PVR_ASSERT((ps_vma->vm_flags & VM_DONTCOPY) == 0);
+ }
+#if defined(DEBUG_LINUX_MMAP_AREAS)
PVR_DPF(PVR_DBG_MESSAGE,
- "%s: psLinuxMemArea=%p, KVAddress=%p "
- "MMapOffset=%ld, ui16Mapped=%d",
+ "%s: psLinuxMemArea 0x%p, KVAddress 0x%p MMapOffset %ld, ui32Mapped %d",
__func__,
psOffsetStruct->psLinuxMemArea,
LinuxMemAreaToCpuVAddr(psOffsetStruct->psLinuxMemArea),
- psOffsetStruct->ui32MMapOffset, psOffsetStruct->ui16Mapped);
+ psOffsetStruct->ui32MMapOffset, psOffsetStruct->ui32Mapped);
#endif
}
-static void MMapVClose(struct vm_area_struct *ps_vma)
+static void MMapVOpen(struct vm_area_struct *ps_vma)
+{
+ mutex_lock(&g_sMMapMutex);
+ MMapVOpenNoLock(ps_vma);
+ mutex_unlock(&g_sMMapMutex);
+}
+
+static void MMapVCloseNoLock(struct vm_area_struct *ps_vma)
{
-#if defined(DEBUG_LINUX_MMAP_AREAS)
struct KV_OFFSET_STRUCT *psOffsetStruct =
(struct KV_OFFSET_STRUCT *)ps_vma->vm_private_data;
- PVR_ASSERT(psOffsetStruct != NULL);
- psOffsetStruct->ui16Mapped--;
- PVR_DPF(PVR_DBG_MESSAGE,
- "%s: psLinuxMemArea=%p, CpuVAddr=%p "
- "ui32MMapOffset=%ld, ui16Mapped=%d",
+ PVR_ASSERT(psOffsetStruct != NULL);
+#if defined(DEBUG_LINUX_MMAP_AREAS)
+ PVR_DPF(PVR_DBG_MESSAGE, "%s: psLinuxMemArea "
+ "0x%p, CpuVAddr 0x%p ui32MMapOffset %ld, ui32Mapped %d",
__func__,
psOffsetStruct->psLinuxMemArea,
LinuxMemAreaToCpuVAddr(psOffsetStruct->psLinuxMemArea),
- psOffsetStruct->ui32MMapOffset, psOffsetStruct->ui16Mapped);
+ psOffsetStruct->ui32MMapOffset,
+ psOffsetStruct->ui32Mapped);
#endif
+ PVR_ASSERT(!psOffsetStruct->bOnMMapList);
+ psOffsetStruct->ui32Mapped--;
+ if (psOffsetStruct->ui32Mapped == 0) {
+ if (psOffsetStruct->ui32RefCount != 0)
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "%s: psOffsetStruct 0x%p has non-zero "
+ "reference count (ui32RefCount = %lu). "
+ "User mode address of start of mapping: 0x%lx",
+ __func__, psOffsetStruct,
+ psOffsetStruct->ui32RefCount,
+ psOffsetStruct->ui32UserVAddr);
+
+ DestroyOffsetStruct(psOffsetStruct);
+ }
+ ps_vma->vm_private_data = NULL;
+}
+
+static void MMapVClose(struct vm_area_struct *ps_vma)
+{
+ mutex_lock(&g_sMMapMutex);
+ MMapVCloseNoLock(ps_vma);
+ mutex_unlock(&g_sMMapMutex);
+}
+
+static struct vm_operations_struct MMapIOOps = {
+ .open = MMapVOpen,
+ .close = MMapVClose
+};
+
+int PVRMMap(struct file *pFile, struct vm_area_struct *ps_vma)
+{
+ u32 ui32ByteSize;
+ struct KV_OFFSET_STRUCT *psOffsetStruct = NULL;
+ int iRetVal = 0;
+
+ PVR_UNREFERENCED_PARAMETER(pFile);
+
+ mutex_lock(&g_sMMapMutex);
+
+ ui32ByteSize = ps_vma->vm_end - ps_vma->vm_start;
+
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "%s: Received mmap(2) request with ui32MMapOffset 0x%08lx,"
+ " and ui32ByteSize %ld(0x%08lx)", __func__, ps_vma->vm_pgoff,
+ ui32ByteSize, ui32ByteSize);
+
+ if ((ps_vma->vm_flags & VM_WRITE) && !(ps_vma->vm_flags & VM_SHARED)) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Cannot mmap non-shareable writable areas",
+ __func__);
+ iRetVal = -EINVAL;
+ goto unlock_and_return;
+ }
+
+ psOffsetStruct =
+ FindOffsetStructByOffset(ps_vma->vm_pgoff, ui32ByteSize);
+ if (psOffsetStruct == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Attempted to mmap unregistered area at vm_pgoff %ld",
+ __func__, ps_vma->vm_pgoff);
+ iRetVal = -EINVAL;
+ goto unlock_and_return;
+ }
+ list_del(&psOffsetStruct->sMMapItem);
+ psOffsetStruct->bOnMMapList = IMG_FALSE;
+
+ PVR_DPF(PVR_DBG_MESSAGE, "%s: Mapped psLinuxMemArea 0x%p\n",
+ __func__, psOffsetStruct->psLinuxMemArea);
+
+ if (!CheckSize(psOffsetStruct->psLinuxMemArea, ui32ByteSize)) {
+ iRetVal = -EINVAL;
+ goto unlock_and_return;
+ }
+
+ ps_vma->vm_flags |= VM_RESERVED;
+ ps_vma->vm_flags |= VM_IO;
+
+ ps_vma->vm_flags |= VM_DONTEXPAND;
+
+ ps_vma->vm_flags |= VM_DONTCOPY;
+
+ ps_vma->vm_private_data = (void *)psOffsetStruct;
+
+ switch (psOffsetStruct->psLinuxMemArea->
+ ui32AreaFlags & PVRSRV_HAP_CACHETYPE_MASK) {
+ case PVRSRV_HAP_CACHED:
+
+ break;
+ case PVRSRV_HAP_WRITECOMBINE:
+ ps_vma->vm_page_prot = PGPROT_WC(ps_vma->vm_page_prot);
+ break;
+ case PVRSRV_HAP_UNCACHED:
+ ps_vma->vm_page_prot = PGPROT_UC(ps_vma->vm_page_prot);
+ break;
+ default:
+ PVR_DPF(PVR_DBG_ERROR, "%s: unknown cache type", __func__);
+ iRetVal = -EINVAL;
+ goto unlock_and_return;
+ }
+
+ ps_vma->vm_ops = &MMapIOOps;
+
+ if (!DoMapToUser(psOffsetStruct->psLinuxMemArea, ps_vma, 0)) {
+ iRetVal = -EAGAIN;
+ goto unlock_and_return;
+ }
+
+ PVR_ASSERT(psOffsetStruct->ui32UserVAddr == 0);
+
+ psOffsetStruct->ui32UserVAddr = ps_vma->vm_start;
+
+ MMapVOpenNoLock(ps_vma);
+
+ PVR_DPF(PVR_DBG_MESSAGE, "%s: Mapped area at offset 0x%08lx\n",
+ __func__, ps_vma->vm_pgoff);
+
+unlock_and_return:
+ if (iRetVal != 0 && psOffsetStruct != NULL)
+ DestroyOffsetStruct(psOffsetStruct);
+
+ mutex_unlock(&g_sMMapMutex);
+
+ return iRetVal;
}
#if defined(DEBUG_LINUX_MMAP_AREAS)
+static off_t PrintMMapReg_helper(char *buffer, size_t size,
+ const struct KV_OFFSET_STRUCT *psOffsetStruct,
+ struct LinuxMemArea *psLinuxMemArea)
+{
+ off_t Ret;
+ u32 ui32RealByteSize;
+ u32 ui32ByteOffset;
+
+ PVR_ASSERT(psOffsetStruct->psLinuxMemArea == psLinuxMemArea);
+
+ DetermineUsersSizeAndByteOffset(psLinuxMemArea,
+ &ui32RealByteSize,
+ &ui32ByteOffset);
+
+ Ret = printAppend(buffer, size, 0,
+ "%-8p %08x %-8p %08x %08x "
+ "%-8d %-24s %-5u %-8s %08x(%s)\n",
+ psLinuxMemArea,
+ psOffsetStruct->ui32UserVAddr + ui32ByteOffset,
+ LinuxMemAreaToCpuVAddr(psLinuxMemArea),
+ LinuxMemAreaToCpuPAddr(psLinuxMemArea, 0).uiAddr,
+ psOffsetStruct->ui32MMapOffset,
+ psLinuxMemArea->ui32ByteSize,
+ LinuxMemAreaTypeToString(psLinuxMemArea->eAreaType),
+ psOffsetStruct->ui32PID,
+ psOffsetStruct->pszName,
+ psLinuxMemArea->ui32AreaFlags,
+ HAPFlagsToString(psLinuxMemArea->ui32AreaFlags));
+ return Ret;
+
+}
+
static off_t PrintMMapRegistrations(char *buffer, size_t size, off_t off)
{
- struct KV_OFFSET_STRUCT *psOffsetStruct;
+ struct LinuxMemArea *psLinuxMemArea;
off_t Ret;
- down_read(&g_mmap_sem);
+ mutex_lock(&g_sMMapMutex);
+
if (!off) {
Ret = printAppend(buffer, size, 0,
- "Allocations registered for mmap: %u\n"
- "In total these areas correspond to %u "
- "bytes (excluding SUB areas)\n"
- "psLinuxMemArea "
- "CpuVAddr "
- "CpuPAddr "
- "MMapOffset "
- "ByteLength "
- "LinuxMemType "
- "Pid Name Mapped Flags\n",
- g_ui32RegisteredAreas, g_ui32TotalByteSize);
+ "Allocations registered for mmap: %u\n"
+ "In total these areas correspond to %u bytes\n"
+ "psLinuxMemArea UserVAddr KernelVAddr "
+ "CpuPAddr MMapOffset ByteLength "
+ "LinuxMemType "
+ "Pid Name Flags\n",
+ g_ui32RegisteredAreas, g_ui32TotalByteSize);
goto unlock_and_return;
}
goto unlock_and_return;
}
- for (psOffsetStruct = g_psKVOffsetTable; --off && psOffsetStruct;
- psOffsetStruct = psOffsetStruct->psNext)
- ;
- if (!psOffsetStruct) {
- Ret = END_OF_FILE;
- goto unlock_and_return;
+ PVR_ASSERT(off != 0);
+ list_for_each_entry(psLinuxMemArea, &g_sMMapAreaList, sMMapItem) {
+ struct KV_OFFSET_STRUCT *psOffsetStruct;
+
+ list_for_each_entry(psOffsetStruct,
+ &psLinuxMemArea->sMMapOffsetStructList,
+ sAreaItem) {
+ off--;
+ if (off == 0) {
+ Ret = PrintMMapReg_helper(buffer, size,
+ psOffsetStruct, psLinuxMemArea);
+ goto unlock_and_return;
+ }
+ }
}
-
- Ret = printAppend(buffer, size, 0,
- "%-8p %-8p %08x %08x %-8d %-24s %-5d %-8s %-5u %08x(%s)\n",
- psOffsetStruct->psLinuxMemArea,
- LinuxMemAreaToCpuVAddr(psOffsetStruct->psLinuxMemArea),
- LinuxMemAreaToCpuPAddr(psOffsetStruct->psLinuxMemArea, 0).uiAddr,
- psOffsetStruct->ui32MMapOffset,
- psOffsetStruct->psLinuxMemArea->ui32ByteSize,
- LinuxMemAreaTypeToString(psOffsetStruct->psLinuxMemArea->eAreaType),
- psOffsetStruct->pid, psOffsetStruct->pszName,
- psOffsetStruct->ui16Mapped, psOffsetStruct->ui32AllocFlags,
- HAPFlagsToString(psOffsetStruct->ui32AllocFlags));
+ Ret = END_OF_FILE;
unlock_and_return:
- up_read(&g_mmap_sem);
+ mutex_unlock(&g_sMMapMutex);
return Ret;
}
#endif
+
+enum PVRSRV_ERROR PVRMMapRegisterArea(struct LinuxMemArea *psLinuxMemArea)
+{
+ enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
+#if defined(DEBUG) || defined(DEBUG_LINUX_MMAP_AREAS)
+ const char *pszName =
+ LinuxMemAreaTypeToString(LinuxMemAreaRootType(psLinuxMemArea));
+#endif
+
+ mutex_lock(&g_sMMapMutex);
+
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "%s(%s, psLinuxMemArea 0x%p, ui32AllocFlags 0x%8lx)",
+ __func__, pszName, psLinuxMemArea,
+ psLinuxMemArea->ui32AreaFlags);
+
+ PVR_ASSERT(psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC
+ || LinuxMemAreaRoot(psLinuxMemArea)->eAreaType !=
+ LINUX_MEM_AREA_SUB_ALLOC);
+
+ if (psLinuxMemArea->bMMapRegistered) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: psLinuxMemArea 0x%p is already registered",
+ __func__, psLinuxMemArea);
+ eError = PVRSRV_ERROR_INVALID_PARAMS;
+ goto exit_unlock;
+ }
+
+ list_add_tail(&psLinuxMemArea->sMMapItem, &g_sMMapAreaList);
+
+ psLinuxMemArea->bMMapRegistered = IMG_TRUE;
+
+#if defined(DEBUG_LINUX_MMAP_AREAS)
+ g_ui32RegisteredAreas++;
+
+ if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC)
+ g_ui32TotalByteSize += psLinuxMemArea->ui32ByteSize;
+#endif
+
+ eError = PVRSRV_OK;
+
+exit_unlock:
+ mutex_unlock(&g_sMMapMutex);
+
+ return eError;
+}
+
+enum PVRSRV_ERROR PVRMMapRemoveRegisteredArea(
+ struct LinuxMemArea *psLinuxMemArea)
+{
+ enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
+ struct KV_OFFSET_STRUCT *psOffsetStruct, *psTmpOffsetStruct;
+
+ mutex_lock(&g_sMMapMutex);
+
+ PVR_ASSERT(psLinuxMemArea->bMMapRegistered);
+
+ list_for_each_entry_safe(psOffsetStruct, psTmpOffsetStruct,
+ &psLinuxMemArea->sMMapOffsetStructList,
+ sAreaItem) {
+ if (psOffsetStruct->ui32Mapped != 0) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: psOffsetStruct "
+ "0x%p for memory area "
+ "0x0x%p is still mapped; "
+ "psOffsetStruct->ui32Mapped %lu",
+ __func__, psOffsetStruct, psLinuxMemArea,
+ psOffsetStruct->ui32Mapped);
+ eError = PVRSRV_ERROR_GENERIC;
+ goto exit_unlock;
+ } else {
+
+ PVR_DPF(PVR_DBG_WARNING,
+ "%s: psOffsetStruct 0x%p was never mapped",
+ __func__, psOffsetStruct);
+ }
+
+ PVR_ASSERT((psOffsetStruct->ui32Mapped == 0)
+ && psOffsetStruct->bOnMMapList);
+
+ DestroyOffsetStruct(psOffsetStruct);
+ }
+
+ list_del(&psLinuxMemArea->sMMapItem);
+
+ psLinuxMemArea->bMMapRegistered = IMG_FALSE;
+
+#if defined(DEBUG_LINUX_MMAP_AREAS)
+ g_ui32RegisteredAreas--;
+ if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC)
+ g_ui32TotalByteSize -= psLinuxMemArea->ui32ByteSize;
+#endif
+
+ eError = PVRSRV_OK;
+
+exit_unlock:
+ mutex_unlock(&g_sMMapMutex);
+ return eError;
+}
+
+enum PVRSRV_ERROR LinuxMMapPerProcessConnect(struct PVRSRV_ENV_PER_PROCESS_DATA
+ *psEnvPerProc)
+{
+ PVR_UNREFERENCED_PARAMETER(psEnvPerProc);
+
+ return PVRSRV_OK;
+}
+
+void LinuxMMapPerProcessDisconnect(struct PVRSRV_ENV_PER_PROCESS_DATA
+ *psEnvPerProc)
+{
+ struct KV_OFFSET_STRUCT *psOffsetStruct, *psTmpOffsetStruct;
+ IMG_BOOL bWarn = IMG_FALSE;
+ u32 ui32PID = OSGetCurrentProcessIDKM();
+
+ PVR_UNREFERENCED_PARAMETER(psEnvPerProc);
+
+ mutex_lock(&g_sMMapMutex);
+
+ list_for_each_entry_safe(psOffsetStruct, psTmpOffsetStruct,
+ &g_sMMapOffsetStructList, sMMapItem) {
+ if (psOffsetStruct->ui32PID == ui32PID) {
+ if (!bWarn) {
+ PVR_DPF(PVR_DBG_WARNING, "%s: process has "
+ "unmapped offset structures. "
+ "Removing them",
+ __func__);
+ bWarn = IMG_TRUE;
+ }
+ PVR_ASSERT(psOffsetStruct->ui32Mapped == 0);
+ PVR_ASSERT(psOffsetStruct->bOnMMapList);
+
+ DestroyOffsetStruct(psOffsetStruct);
+ }
+ }
+
+ mutex_unlock(&g_sMMapMutex);
+}
+
+enum PVRSRV_ERROR LinuxMMapPerProcessHandleOptions(struct PVRSRV_HANDLE_BASE
+ *psHandleBase)
+{
+ enum PVRSRV_ERROR eError = PVRSRV_OK;
+
+ eError = PVRSRVSetMaxHandle(psHandleBase, MAX_MMAP_HANDLE);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: failed to set handle limit (%d)",
+ __func__, eError);
+ return eError;
+ }
+
+ return eError;
+}
+
+void PVRMMapInit(void)
+{
+ mutex_init(&g_sMMapMutex);
+
+ g_psMemmapCache =
+ kmem_cache_create("img-mmap", sizeof(struct KV_OFFSET_STRUCT),
+ 0, 0, NULL);
+ if (!g_psMemmapCache) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: failed to allocate kmem_cache",
+ __func__);
+ goto error;
+ }
+#if defined(DEBUG_LINUX_MMAP_AREAS)
+ CreateProcReadEntry("mmap", PrintMMapRegistrations);
+#endif
+
+ return;
+
+error:
+ PVRMMapCleanup();
+ return;
+}
+
+void PVRMMapCleanup(void)
+{
+ enum PVRSRV_ERROR eError;
+
+ if (!list_empty(&g_sMMapAreaList)) {
+ struct LinuxMemArea *psLinuxMemArea, *psTmpMemArea;
+
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: Memory areas are still registered with MMap",
+ __func__);
+
+ PVR_TRACE("%s: Unregistering memory areas", __func__);
+ list_for_each_entry_safe(psLinuxMemArea, psTmpMemArea,
+ &g_sMMapAreaList, sMMapItem) {
+ eError = PVRMMapRemoveRegisteredArea(psLinuxMemArea);
+ if (eError != PVRSRV_OK)
+ PVR_DPF(PVR_DBG_ERROR,
+ "%s: PVRMMapRemoveRegisteredArea failed (%d)",
+ __func__, eError);
+ PVR_ASSERT(eError == PVRSRV_OK);
+
+ LinuxMemAreaDeepFree(psLinuxMemArea);
+ }
+ }
+ PVR_ASSERT(list_empty((&g_sMMapAreaList)));
+
+ RemoveProcEntry("mmap");
+
+ if (g_psMemmapCache) {
+ kmem_cache_destroy(g_psMemmapCache);
+ g_psMemmapCache = NULL;
+ }
+}
#define __MMAP_H__
#include <linux/mm.h>
+#include <linux/list.h>
+#include "perproc.h"
#include "mm.h"
struct KV_OFFSET_STRUCT {
+ u32 ui32Mapped;
u32 ui32MMapOffset;
+ u32 ui32RealByteSize;
struct LinuxMemArea *psLinuxMemArea;
- u32 ui32AllocFlags;
+ u32 ui32TID;
+ u32 ui32PID;
+ IMG_BOOL bOnMMapList;
+ u32 ui32RefCount;
+ u32 ui32UserVAddr;
#if defined(DEBUG_LINUX_MMAP_AREAS)
- pid_t pid;
const char *pszName;
- u16 ui16Mapped;
- u16 ui16Faults;
#endif
- struct KV_OFFSET_STRUCT *psNext;
+ struct list_head sMMapItem;
+ struct list_head sAreaItem;
};
void PVRMMapInit(void);
void PVRMMapCleanup(void);
-enum PVRSRV_ERROR PVRMMapRegisterArea(const char *pszName,
- struct LinuxMemArea *psLinuxMemArea,
- u32 ui32AllocFlags);
+
+enum PVRSRV_ERROR PVRMMapRegisterArea(struct LinuxMemArea *psLinuxMemArea);
+
enum PVRSRV_ERROR PVRMMapRemoveRegisteredArea(
- struct LinuxMemArea *psLinuxMemArea);
-enum PVRSRV_ERROR PVRMMapKVIndexAddressToMMapData(void *pvKVIndexAddress,
- u32 ui32Size, u32 *pui32MMapOffset,
- u32 *pui32ByteOffset, u32 *pui32RealByteSize);
+ struct LinuxMemArea *psLinuxMemArea);
+
+enum PVRSRV_ERROR PVRMMapOSMemHandleToMMapData(
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *hMHandle, u32 *pui32MMapOffset,
+ u32 *pui32ByteOffset, u32 *pui32RealByteSize,
+ u32 *pui32UserVAddr);
+
+enum PVRSRV_ERROR PVRMMapReleaseMMapData(
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *hMHandle, IMG_BOOL *pbMUnmap,
+ u32 *pui32RealByteSize, u32 *pui32UserVAddr);
+
int PVRMMap(struct file *pFile, struct vm_area_struct *ps_vma);
#endif
#include "ra.h"
#include "pdump_km.h"
#include "sgxapi_km.h"
+#include "sgx_bridge_km.h"
#include "sgxinfo.h"
#include "sgxinfokm.h"
#include "mmu.h"
-#include "sgx_bridge_km.h"
-struct MMU_PT_INFO {
+#define UINT32_MAX_VALUE 0xFFFFFFFFUL
+struct MMU_PT_INFO {
void *hPTPageOSMemHandle;
void *PTPageCpuVAddr;
u32 ui32ValidPTECount;
};
struct MMU_CONTEXT {
-
struct PVRSRV_DEVICE_NODE *psDeviceNode;
-
void *pvPDCpuVAddr;
struct IMG_DEV_PHYADDR sPDDevPAddr;
-
void *hPDOSMemHandle;
-
struct MMU_PT_INFO *apsPTInfoList[1024];
-
struct PVRSRV_SGXDEV_INFO *psDevInfo;
-
struct MMU_CONTEXT *psNext;
};
#if defined(PDUMP)
static void MMU_PDumpPageTables(struct MMU_HEAP *pMMUHeap,
- struct IMG_DEV_VIRTADDR DevVAddr,
- size_t uSize,
+ struct IMG_DEV_VIRTADDR DevVAddr, size_t uSize,
IMG_BOOL bForUnmap, void *hUniqueTag);
#endif
pMMUHeap->ui32PTBaseIndex =
(pMMUHeap->psDevArena->BaseDevVAddr.
uiAddr & (SGX_MMU_PD_MASK | SGX_MMU_PT_MASK)) >>
- SGX_MMU_PAGE_SHIFT;
+ SGX_MMU_PAGE_SHIFT;
pMMUHeap->ui32PTPageCount =
- (pMMUHeap->ui32PTEntryCount + SGX_MMU_PT_SIZE -
- 1) >> SGX_MMU_PT_SHIFT;
+ (pMMUHeap->ui32PTEntryCount + SGX_MMU_PT_SIZE - 1) >>
+ SGX_MMU_PT_SHIFT;
return IMG_TRUE;
}
if (SysAcquireData(&psSysData) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "_DeferredFreePageTables: "
- "ERROR call to SysAcquireData failed");
+ "ERROR call to SysAcquireData failed");
return;
}
ppsPTInfoList = &pMMUHeap->psMMUContext->apsPTInfoList[ui32PDIndex];
{
-
- PVR_ASSERT(ppsPTInfoList[ui32PTIndex] == NULL
- || ppsPTInfoList[ui32PTIndex]->ui32ValidPTECount ==
- 0);
+ PVR_ASSERT(ppsPTInfoList[ui32PTIndex] == NULL ||
+ ppsPTInfoList[ui32PTIndex]->ui32ValidPTECount ==
+ 0);
}
PDUMPCOMMENT("Free page table (page count == %08X)",
case DEVICE_MEMORY_HEAP_SHARED:
case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
{
-
struct MMU_CONTEXT *psMMUContext =
- (struct MMU_CONTEXT *)
+ (struct MMU_CONTEXT *)
pMMUHeap->psMMUContext->psDevInfo->pvMMUContextList;
while (psMMUContext) {
-
pui32PDEntry =
(u32 *) psMMUContext->pvPDCpuVAddr;
pui32PDEntry += ui32PDIndex;
-
pui32PDEntry[ui32PTIndex] = 0;
-
PDUMPMEM2(PVRSRV_DEVICE_TYPE_SGX,
(void *) &
pui32PDEntry[ui32PTIndex],
sizeof(u32), 0, IMG_FALSE,
PDUMP_PT_UNIQUETAG,
PDUMP_PT_UNIQUETAG);
-
psMMUContext = psMMUContext->psNext;
}
break;
pui32PDEntry =
(u32 *) pMMUHeap->psMMUContext->pvPDCpuVAddr;
pui32PDEntry += ui32PDIndex;
-
-
pui32PDEntry[ui32PTIndex] = 0;
-
PDUMPMEM2(PVRSRV_DEVICE_TYPE_SGX,
(void *) &pui32PDEntry[ui32PTIndex],
sizeof(u32), 0, IMG_FALSE,
}
default:
{
- PVR_DPF(PVR_DBG_ERROR, "_DeferredFreePagetable: "
- "ERROR invalid heap type");
+ PVR_DPF(PVR_DBG_ERROR,
+ "_DeferredFreePagetable: ERROR invalid heap type");
return;
}
}
PVRSRV_HAP_KERNEL_ONLY,
SGX_MMU_PAGE_SIZE,
ppsPTInfoList[ui32PTIndex]->
- PTPageCpuVAddr,
+ PTPageCpuVAddr,
ppsPTInfoList[ui32PTIndex]->
- hPTPageOSMemHandle);
+ hPTPageOSMemHandle);
} else {
struct IMG_SYS_PHYADDR sSysPAddr;
struct IMG_CPU_PHYADDR sCpuPAddr;
PTPageCpuVAddr,
SGX_MMU_PAGE_SIZE,
PVRSRV_HAP_WRITECOMBINE |
- PVRSRV_HAP_KERNEL_ONLY,
+ PVRSRV_HAP_KERNEL_ONLY,
ppsPTInfoList[ui32PTIndex]->
- hPTPageOSMemHandle);
+ hPTPageOSMemHandle);
RA_Free(pMMUHeap->psDevArena->
- psDeviceMemoryHeapInfo->
- psLocalDevMemArena, sSysPAddr.uiAddr,
- IMG_FALSE);
+ psDeviceMemoryHeapInfo->
+ psLocalDevMemArena,
+ sSysPAddr.uiAddr, IMG_FALSE);
}
pMMUHeap->ui32PTEntryCount -= i;
} else {
-
pMMUHeap->ui32PTEntryCount -= 1024;
}
ppsPTInfoList[ui32PTIndex], NULL);
ppsPTInfoList[ui32PTIndex] = NULL;
} else {
-
pMMUHeap->ui32PTEntryCount -= 1024;
}
u32 *pui32PDEntry;
struct MMU_PT_INFO **ppsPTInfoList;
struct SYS_DATA *psSysData;
+ struct IMG_DEV_VIRTADDR sHighDevVAddr;
PVR_ASSERT(DevVAddr.uiAddr < (1 << SGX_FEATURE_ADDRESS_SPACE_SIZE));
ui32PDIndex =
DevVAddr.uiAddr >> (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT);
+ if ((UINT32_MAX_VALUE - DevVAddr.uiAddr) <
+ (ui32Size + (1 << (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT)) - 1)) {
+
+ sHighDevVAddr.uiAddr = UINT32_MAX_VALUE;
+ } else {
+ sHighDevVAddr.uiAddr = DevVAddr.uiAddr + ui32Size +
+ (1 << (SGX_MMU_PAGE_SHIFT +
+ SGX_MMU_PT_SHIFT)) - 1;
+ }
+
ui32PTPageCount =
- (DevVAddr.uiAddr + ui32Size +
- (1 << (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT)) - 1)
- >> (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT);
+ sHighDevVAddr.uiAddr >> (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT);
+
ui32PTPageCount -= ui32PDIndex;
pui32PDEntry = (u32 *) pMMUHeap->psMMUContext->pvPDCpuVAddr;
(void **) &ppsPTInfoList[i], NULL);
if (ppsPTInfoList[i] == NULL) {
PVR_DPF(PVR_DBG_ERROR,
- "_DeferredAllocPagetables: "
- "ERROR call to OSAllocMem failed");
+ "_DeferredAllocPagetables: "
+ "ERROR call to OSAllocMem failed");
return IMG_FALSE;
}
OSMemSet(ppsPTInfoList[i], 0,
sizeof(struct MMU_PT_INFO));
}
- if (ppsPTInfoList[i]->hPTPageOSMemHandle == NULL
- && ppsPTInfoList[i]->PTPageCpuVAddr == NULL) {
+ if (ppsPTInfoList[i]->hPTPageOSMemHandle == NULL &&
+ ppsPTInfoList[i]->PTPageCpuVAddr == NULL) {
struct IMG_CPU_PHYADDR sCpuPAddr;
struct IMG_DEV_PHYADDR sDevPAddr;
if (pMMUHeap->psDevArena->psDeviceMemoryHeapInfo->
psLocalDevMemArena == NULL) {
- if (OSAllocPages
- (PVRSRV_HAP_WRITECOMBINE |
- PVRSRV_HAP_KERNEL_ONLY, SGX_MMU_PAGE_SIZE,
- (void **) &ppsPTInfoList[i]->
- PTPageCpuVAddr,
- &ppsPTInfoList[i]->hPTPageOSMemHandle) !=
+ if (OSAllocPages(PVRSRV_HAP_WRITECOMBINE |
+ PVRSRV_HAP_KERNEL_ONLY,
+ SGX_MMU_PAGE_SIZE,
+ SGX_MMU_PAGE_SIZE,
+ (void **)&ppsPTInfoList[i]->
+ PTPageCpuVAddr,
+ &ppsPTInfoList[i]->
+ hPTPageOSMemHandle) !=
PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "_DeferredAllocPagetables: "
- "ERROR call to OSAllocPages failed");
+ "_DeferredAllocPagetables: "
+ "ERROR call to OSAllocPages failed");
return IMG_FALSE;
}
- if (ppsPTInfoList[i]->PTPageCpuVAddr)
- sCpuPAddr = OSMapLinToCPUPhys(
- ppsPTInfoList[i]->PTPageCpuVAddr);
- else
-
- sCpuPAddr = OSMemHandleToCpuPAddr(
- ppsPTInfoList[i]->
- hPTPageOSMemHandle, 0);
- sDevPAddr = SysCpuPAddrToDevPAddr
- (PVRSRV_DEVICE_TYPE_SGX, sCpuPAddr);
+ if (ppsPTInfoList[i]->PTPageCpuVAddr) {
+ sCpuPAddr =
+ OSMapLinToCPUPhys(ppsPTInfoList[i]->
+ PTPageCpuVAddr);
+ } else {
+ sCpuPAddr =
+ OSMemHandleToCpuPAddr(
+ ppsPTInfoList[i]->
+ hPTPageOSMemHandle,
+ 0);
+ }
+ sDevPAddr =
+ SysCpuPAddrToDevPAddr
+ (PVRSRV_DEVICE_TYPE_SGX, sCpuPAddr);
} else {
struct IMG_SYS_PHYADDR sSysPAddr;
if (RA_Alloc(pMMUHeap->psDevArena->
psDeviceMemoryHeapInfo->psLocalDevMemArena,
- SGX_MMU_PAGE_SIZE, NULL, NULL, 0,
- SGX_MMU_PAGE_SIZE, 0,
+ SGX_MMU_PAGE_SIZE, NULL, 0,
+ SGX_MMU_PAGE_SIZE,
&(sSysPAddr.uiAddr)) != IMG_TRUE) {
PVR_DPF(PVR_DBG_ERROR,
- "_DeferredAllocPagetables: "
- "ERROR call to RA_Alloc failed");
+ "_DeferredAllocPagetables: "
+ "ERROR call to RA_Alloc failed");
return IMG_FALSE;
}
hPTPageOSMemHandle);
if (!ppsPTInfoList[i]->PTPageCpuVAddr) {
PVR_DPF(PVR_DBG_ERROR,
- "_DeferredAllocPagetables: "
- "ERROR failed to map page tables");
+ "_DeferredAllocPagetables: "
+ "ERROR failed to map page tables");
return IMG_FALSE;
}
- sDevPAddr =
- SysCpuPAddrToDevPAddr
- (PVRSRV_DEVICE_TYPE_SGX, sCpuPAddr);
+ sDevPAddr = SysCpuPAddrToDevPAddr
+ (PVRSRV_DEVICE_TYPE_SGX, sCpuPAddr);
}
case DEVICE_MEMORY_HEAP_SHARED:
case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
{
-
struct MMU_CONTEXT *psMMUContext =
(struct MMU_CONTEXT *)pMMUHeap->
- psMMUContext->psDevInfo->
- pvMMUContextList;
+ psMMUContext->psDevInfo->
+ pvMMUContextList;
while (psMMUContext) {
-
pui32PDEntry =
- (u32 *)
- psMMUContext->pvPDCpuVAddr;
+ (u32 *)psMMUContext->
+ pvPDCpuVAddr;
pui32PDEntry += ui32PDIndex;
pui32PDEntry[i] =
- sDevPAddr.
- uiAddr | SGX_MMU_PDE_VALID;
+ sDevPAddr.uiAddr |
+ SGX_MMU_PDE_VALID;
PDUMPMEM2
(PVRSRV_DEVICE_TYPE_SGX,
- (void *) &
- pui32PDEntry[i],
+ (void *)&pui32PDEntry[i],
sizeof(u32), 0,
IMG_FALSE,
PDUMP_PD_UNIQUETAG,
case DEVICE_MEMORY_HEAP_PERCONTEXT:
case DEVICE_MEMORY_HEAP_KERNEL:
{
-
- pui32PDEntry[i] =
- sDevPAddr.
- uiAddr | SGX_MMU_PDE_VALID;
+ pui32PDEntry[i] = sDevPAddr.uiAddr |
+ SGX_MMU_PDE_VALID;
PDUMPMEM2(PVRSRV_DEVICE_TYPE_SGX,
- (void *) &
- pui32PDEntry[i],
+ (void *)&pui32PDEntry[i],
sizeof(u32), 0,
IMG_FALSE, PDUMP_PD_UNIQUETAG,
PDUMP_PT_UNIQUETAG);
PVR_DPF(PVR_DBG_MESSAGE, "MMU_Initialise");
if (SysAcquireData(&psSysData) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "MMU_Initialise: "
- "ERROR call to SysAcquireData failed");
+ PVR_DPF(PVR_DBG_ERROR,
+ "MMU_Initialise: ERROR call to SysAcquireData failed");
return PVRSRV_ERROR_GENERIC;
}
if (psDeviceNode->psLocalDevMemArena == NULL) {
if (OSAllocPages
(PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_KERNEL_ONLY,
- SGX_MMU_PAGE_SIZE, &pvPDCpuVAddr,
+ SGX_MMU_PAGE_SIZE, SGX_MMU_PAGE_SIZE, &pvPDCpuVAddr,
&hPDOSMemHandle) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "MMU_Initialise: "
- "ERROR call to OSAllocPages failed");
+ "ERROR call to OSAllocPages failed");
return PVRSRV_ERROR_GENERIC;
}
if (pvPDCpuVAddr)
sCpuPAddr = OSMapLinToCPUPhys(pvPDCpuVAddr);
else
-
sCpuPAddr = OSMemHandleToCpuPAddr(hPDOSMemHandle, 0);
sPDDevPAddr =
SysCpuPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sCpuPAddr);
-
-
} else {
struct IMG_SYS_PHYADDR sSysPAddr;
if (RA_Alloc(psDeviceNode->psLocalDevMemArena,
- SGX_MMU_PAGE_SIZE, NULL, NULL, 0,
- SGX_MMU_PAGE_SIZE,
- 0, &(sSysPAddr.uiAddr)) != IMG_TRUE) {
+ SGX_MMU_PAGE_SIZE, NULL, 0, SGX_MMU_PAGE_SIZE,
+ &(sSysPAddr.uiAddr)) != IMG_TRUE) {
PVR_DPF(PVR_DBG_ERROR, "MMU_Initialise: "
"ERROR call to RA_Alloc failed");
return PVRSRV_ERROR_GENERIC;
}
}
-
if (bInvalidateDirectoryCache)
-
MMU_InvalidateDirectoryCache(psMMUContext->psDevInfo);
}
continue;
}
- pui32Tmp =
- (u32 *) ppsPTInfoList[0]->PTPageCpuVAddr;
+ pui32Tmp = (u32 *)ppsPTInfoList[0]->PTPageCpuVAddr;
if (!pui32Tmp)
continue;
- if (pui32Tmp[ui32PTIndex] & SGX_MMU_PTE_VALID)
+ if (pui32Tmp[ui32PTIndex] & SGX_MMU_PTE_VALID) {
ppsPTInfoList[0]->ui32ValidPTECount--;
- else
+ } else {
PVR_DPF(PVR_DBG_MESSAGE,
"MMU_UnmapPagesAndFreePTs: "
"Page is already invalid for alloc at "
- "VAddr:0x%08lX (VAddrIni:0x%08lX "
- "AllocPage:%u) PDIdx:%u PTIdx:%u",
+ "VAddr:0x%08lX "
+ "(VAddrIni:0x%08lX AllocPage:%u) "
+ "PDIdx:%u PTIdx:%u",
sTmpDevVAddr.uiAddr, sDevVAddr.uiAddr,
i, ui32PDIndex, ui32PTIndex);
+ }
- PVR_ASSERT((s32) ppsPTInfoList[0]->ui32ValidPTECount >=
+ PVR_ASSERT((s32)ppsPTInfoList[0]->ui32ValidPTECount >=
0);
-
-
pui32Tmp[ui32PTIndex] = 0;
}
if (ppsPTInfoList[0]
&& ppsPTInfoList[0]->ui32ValidPTECount == 0) {
_DeferredFreePageTable(psMMUHeap,
- ui32PDIndex -
- (psMMUHeap->
- ui32PTBaseIndex >>
- SGX_MMU_PT_SHIFT));
+ ui32PDIndex - (psMMUHeap->
+ ui32PTBaseIndex >>
+ SGX_MMU_PT_SHIFT));
bInvalidateDirectoryCache = IMG_TRUE;
}
sTmpDevVAddr.uiAddr += uPageSize;
}
- if (bInvalidateDirectoryCache)
+ if (bInvalidateDirectoryCache) {
MMU_InvalidateDirectoryCache(psMMUHeap->psMMUContext->
- psDevInfo);
- else
+ psDevInfo);
+ } else {
MMU_InvalidatePageTableCache(psMMUHeap->psMMUContext->
- psDevInfo);
+ psDevInfo);
+ }
#if defined(PDUMP)
MMU_PDumpPageTables(psMMUHeap, sDevVAddr, uPageSize * ui32PageCount,
#endif
}
-static void MMU_FreePageTables(void *pvMMUHeap,
- u32 ui32Start,
- u32 ui32End, void *hUniqueTag)
+static void MMU_FreePageTables(void *pvMMUHeap, u32 ui32Start, u32 ui32End,
+ void *hUniqueTag)
{
struct MMU_HEAP *pMMUHeap = (struct MMU_HEAP *)pvMMUHeap;
struct IMG_DEV_VIRTADDR Start;
}
OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct MMU_HEAP), (void **) &pMMUHeap, NULL);
+ sizeof(struct MMU_HEAP), (void **)&pMMUHeap, NULL);
if (pMMUHeap == NULL) {
PVR_DPF(PVR_DBG_ERROR,
"MMU_Create: ERROR call to OSAllocMem failed");
pMMUHeap->psVMArena = RA_Create(psDevArena->pszName,
psDevArena->BaseDevVAddr.uiAddr,
- psDevArena->ui32Size,
- NULL,
- SGX_MMU_PAGE_SIZE,
- NULL,
- NULL, MMU_FreePageTables, pMMUHeap);
+ psDevArena->ui32Size, NULL,
+ SGX_MMU_PAGE_SIZE, NULL, NULL,
+ MMU_FreePageTables, pMMUHeap);
if (pMMUHeap->psVMArena == NULL) {
PVR_DPF(PVR_DBG_ERROR,
}
}
-IMG_BOOL
-MMU_Alloc(struct MMU_HEAP *pMMUHeap,
- size_t uSize,
- size_t *pActualSize,
- u32 uFlags,
- u32 uDevVAddrAlignment, struct IMG_DEV_VIRTADDR *psDevVAddr)
+IMG_BOOL MMU_Alloc(struct MMU_HEAP *pMMUHeap, size_t uSize, u32 uFlags,
+ u32 uDevVAddrAlignment, struct IMG_DEV_VIRTADDR *psDevVAddr)
{
IMG_BOOL bStatus;
uSize, uFlags, uDevVAddrAlignment);
if ((uFlags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) == 0) {
- bStatus = RA_Alloc(pMMUHeap->psVMArena,
- uSize,
- pActualSize,
- NULL,
- 0,
- uDevVAddrAlignment,
- 0, &(psDevVAddr->uiAddr));
+ bStatus = RA_Alloc(pMMUHeap->psVMArena, uSize, NULL, 0,
+ uDevVAddrAlignment, &(psDevVAddr->uiAddr));
if (!bStatus) {
PVR_DPF(PVR_DBG_ERROR,
"MMU_Alloc: RA_Alloc of VMArena failed");
PVR_DPF(PVR_DBG_ERROR,
"MMU_Alloc: _DeferredAllocPagetables failed");
if ((uFlags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) == 0)
-
RA_Free(pMMUHeap->psVMArena, psDevVAddr->uiAddr,
IMG_FALSE);
}
return;
}
+ BUG();
+
PVR_DPF(PVR_DBG_ERROR,
"MMU_Free: Couldn't find DevVAddr %08X in a DevArena",
DevVAddr.uiAddr);
ui32PTDumpCount = 1024 - ui32PTIndex;
if (psPTInfo) {
- pui32PTEntry = (u32 *) psPTInfo->PTPageCpuVAddr;
+ pui32PTEntry = (u32 *)psPTInfo->PTPageCpuVAddr;
PDUMPMEM2(PVRSRV_DEVICE_TYPE_SGX,
- (void *) &pui32PTEntry[ui32PTIndex],
+ (void *)&pui32PTEntry[ui32PTIndex],
ui32PTDumpCount * sizeof(u32), 0,
IMG_FALSE, PDUMP_PT_UNIQUETAG, hUniqueTag);
}
if (((PVRSRV_MEM_READ | PVRSRV_MEM_WRITE) & ui32MemFlags) ==
(PVRSRV_MEM_READ | PVRSRV_MEM_WRITE))
-
ui32MMUFlags = 0;
else if (PVRSRV_MEM_READ & ui32MemFlags)
-
ui32MMUFlags |= SGX_MMU_PTE_READONLY;
- else
- if (PVRSRV_MEM_WRITE & ui32MemFlags)
-
+ else if (PVRSRV_MEM_WRITE & ui32MemFlags)
ui32MMUFlags |= SGX_MMU_PTE_WRITEONLY;
if (PVRSRV_MEM_CACHE_CONSISTENT & ui32MemFlags)
ui32MMUFlags |= SGX_MMU_PTE_CACHECONSISTENT;
-#if !defined(FIX_HW_BRN_25503)
if (PVRSRV_MEM_EDM_PROTECT & ui32MemFlags)
ui32MMUFlags |= SGX_MMU_PTE_EDMPROTECT;
-#endif
ui32Index = DevVAddr.uiAddr >> (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT);
if (pui32Tmp[ui32Index] & SGX_MMU_PTE_VALID)
- PVR_DPF(PVR_DBG_ERROR, "MMU_MapPage: "
- "Page is already valid for alloc at VAddr:0x%08lX PDIdx:%u PTIdx:%u",
- DevVAddr.uiAddr, DevVAddr.uiAddr >>
- (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT),
- ui32Index);
+ PVR_DPF(PVR_DBG_ERROR,
+ "MMU_MapPage: "
+ "Page is already valid for alloc at "
+ "VAddr:0x%08lX PDIdx:%u PTIdx:%u",
+ DevVAddr.uiAddr,
+ DevVAddr.uiAddr >> (SGX_MMU_PAGE_SHIFT +
+ SGX_MMU_PT_SHIFT), ui32Index);
PVR_ASSERT((pui32Tmp[ui32Index] & SGX_MMU_PTE_VALID) == 0);
| SGX_MMU_PTE_VALID | ui32MMUFlags;
}
-void MMU_MapScatter(struct MMU_HEAP *pMMUHeap,
- struct IMG_DEV_VIRTADDR DevVAddr,
- struct IMG_SYS_PHYADDR *psSysAddr,
- size_t uSize, u32 ui32MemFlags, void *hUniqueTag)
+void MMU_MapScatter(struct MMU_HEAP *pMMUHeap, struct IMG_DEV_VIRTADDR DevVAddr,
+ struct IMG_SYS_PHYADDR *psSysAddr, size_t uSize,
+ u32 ui32MemFlags, void *hUniqueTag)
{
#if defined(PDUMP)
struct IMG_DEV_VIRTADDR MapBaseDevVAddr;
DevVAddr.uiAddr += SGX_MMU_PAGE_SIZE;
PVR_DPF(PVR_DBG_MESSAGE, "MMU_MapScatter: "
- "devVAddr=%08X, SysAddr=%08X, size=0x%x/0x%x",
+ "devVAddr=%08X, SysAddr=%08X, size=0x%x/0x%x",
DevVAddr.uiAddr, sSysAddr.uiAddr, uCount, uSize);
}
#endif
}
-void MMU_MapPages(struct MMU_HEAP *pMMUHeap,
- struct IMG_DEV_VIRTADDR DevVAddr,
- struct IMG_SYS_PHYADDR SysPAddr,
- size_t uSize, u32 ui32MemFlags, void *hUniqueTag)
+void MMU_MapPages(struct MMU_HEAP *pMMUHeap, struct IMG_DEV_VIRTADDR DevVAddr,
+ struct IMG_SYS_PHYADDR SysPAddr, size_t uSize,
+ u32 ui32MemFlags, void *hUniqueTag)
{
struct IMG_DEV_PHYADDR DevPAddr;
#if defined(PDUMP)
DevPAddr = SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, SysPAddr);
-#if defined(FIX_HW_BRN_23281)
- if (ui32MemFlags & PVRSRV_MEM_INTERLEAVED)
- ui32VAdvance *= 2;
-#endif
-
if (ui32MemFlags & PVRSRV_MEM_DUMMY)
ui32PAdvance = 0;
PVR_ASSERT(((u32) uByteSize & (SGX_MMU_PAGE_SIZE - 1)) == 0);
pDevVAddr->uiAddr = MapBaseDevVAddr.uiAddr;
-#if defined(FIX_HW_BRN_23281)
- if (ui32MemFlags & PVRSRV_MEM_INTERLEAVED)
- ui32VAdvance *= 2;
-#endif
-
if (ui32MemFlags & PVRSRV_MEM_DUMMY)
ui32PAdvance = 0;
struct IMG_CPU_PHYADDR CpuPAddr;
struct IMG_DEV_PHYADDR DevPAddr;
- if (CpuVAddr) {
+ if (CpuVAddr)
CpuPAddr =
- OSMapLinToCPUPhys((void *) ((u32)
- CpuVAddr +
- uOffset));
- } else {
+ OSMapLinToCPUPhys((void *)((u32)CpuVAddr +
+ uOffset));
+ else
CpuPAddr = OSMemHandleToCpuPAddr(hOSMemHandle, uOffset);
- }
DevPAddr =
SysCpuPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, CpuPAddr);
- PVR_DPF(PVR_DBG_MESSAGE, "0x%x: "
- "CpuVAddr=%08X, CpuPAddr=%08X, DevVAddr=%08X, DevPAddr=%08X",
- uOffset, (u32) CpuVAddr + uOffset,
- CpuPAddr.uiAddr, MapDevVAddr.uiAddr, DevPAddr.uiAddr);
+ PVR_DPF(PVR_DBG_MESSAGE, "0x%x: CpuVAddr=%08X, "
+ "CpuPAddr=%08X, DevVAddr=%08X, DevPAddr=%08X",
+ uOffset, (u32)CpuVAddr + uOffset, CpuPAddr.uiAddr,
+ MapDevVAddr.uiAddr, DevPAddr.uiAddr);
MMU_MapPage(pMMUHeap, MapDevVAddr, DevPAddr, ui32MemFlags);
}
void MMU_UnmapPages(struct MMU_HEAP *psMMUHeap,
- struct IMG_DEV_VIRTADDR sDevVAddr, u32 ui32PageCount,
- void *hUniqueTag)
+ struct IMG_DEV_VIRTADDR sDevVAddr, u32 ui32PageCount,
+ void *hUniqueTag)
{
u32 uPageSize = HOST_PAGESIZE();
struct IMG_DEV_VIRTADDR sTmpDevVAddr;
SGX_MMU_PAGE_SHIFT;
if (!ppsPTInfoList[0]) {
- PVR_DPF(PVR_DBG_ERROR, "MMU_UnmapPages: "
- "ERROR Invalid PT for alloc at "
- "VAddr:0x%08lX (VaddrIni:0x%08lX "
- "AllocPage:%u) PDIdx:%u PTIdx:%u",
+ PVR_DPF(PVR_DBG_ERROR,
+ "MMU_UnmapPages: "
+ "ERROR Invalid PT for alloc at VAddr:0x%08lX "
+ "(VaddrIni:0x%08lX AllocPage:%u) PDIdx:%u "
+ "PTIdx:%u",
sTmpDevVAddr.uiAddr, sDevVAddr.uiAddr, i,
ui32PDIndex, ui32PTIndex);
continue;
}
- pui32Tmp = (u32 *) ppsPTInfoList[0]->PTPageCpuVAddr;
+ pui32Tmp = (u32 *)ppsPTInfoList[0]->PTPageCpuVAddr;
if (pui32Tmp[ui32PTIndex] & SGX_MMU_PTE_VALID)
ppsPTInfoList[0]->ui32ValidPTECount--;
else
- PVR_DPF(PVR_DBG_ERROR, "MMU_UnmapPages: "
- "Page is already invalid for "
- "alloc at VAddr:0x%08lX "
+ PVR_DPF(PVR_DBG_ERROR,
+ "MMU_UnmapPages: Page is already invalid "
+ "for alloc at VAddr:0x%08lX "
"(VAddrIni:0x%08lX AllocPage:%u) "
"PDIdx:%u PTIdx:%u",
sTmpDevVAddr.uiAddr, sDevVAddr.uiAddr, i,
PVR_ASSERT((s32) ppsPTInfoList[0]->ui32ValidPTECount >= 0);
-
pui32Tmp[ui32PTIndex] = 0;
sTmpDevVAddr.uiAddr += uPageSize;
if (!hDevCookie || !hDevMemContext || !psPDDevPAddr)
return PVRSRV_ERROR_INVALID_PARAMS;
- PVR_UNREFERENCED_PARAMETER(hDevCookie);
-
*psPDDevPAddr =
((struct BM_CONTEXT *)hDevMemContext)->psMMUContext->sPDDevPAddr;
eError =
OSAllocPages(PVRSRV_HAP_WRITECOMBINE |
PVRSRV_HAP_KERNEL_ONLY, 3 * SGX_MMU_PAGE_SIZE,
- (void **) &pui8MemBlock, &hOSMemHandle);
+ SGX_MMU_PAGE_SIZE, (void **)&pui8MemBlock,
+ &hOSMemHandle);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "MMU_BIFResetPDAlloc: "
"ERROR call to OSAllocPages failed");
return eError;
}
- if (pui8MemBlock)
+ if (pui8MemBlock) {
sMemBlockCpuPAddr = OSMapLinToCPUPhys(pui8MemBlock);
- else
+ } else {
sMemBlockCpuPAddr =
OSMemHandleToCpuPAddr(hOSMemHandle, 0);
+ }
} else {
-
- if (RA_Alloc(psLocalDevMemArena, 3 * SGX_MMU_PAGE_SIZE, NULL,
- NULL, 0, SGX_MMU_PAGE_SIZE, 0,
+ if (RA_Alloc(psLocalDevMemArena, 3 * SGX_MMU_PAGE_SIZE,
+ NULL, 0, SGX_MMU_PAGE_SIZE,
&(sMemBlockSysPAddr.uiAddr)) != IMG_TRUE) {
PVR_DPF(PVR_DBG_ERROR, "MMU_BIFResetPDAlloc: "
- "ERROR call to RA_Alloc failed");
+ "ERROR call to RA_Alloc failed");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
&hOSMemHandle);
if (!pui8MemBlock) {
PVR_DPF(PVR_DBG_ERROR, "MMU_BIFResetPDAlloc: "
- "ERROR failed to map page tables");
+ "ERROR failed to map page tables");
return PVRSRV_ERROR_BAD_MAPPING;
}
}
void MMU_Delete(struct MMU_HEAP *pMMU);
-IMG_BOOL MMU_Alloc(struct MMU_HEAP *pMMU, size_t uSize, size_t *pActualSize,
- u32 uFlags, u32 uDevVAddrAlignment,
- struct IMG_DEV_VIRTADDR *pDevVAddr);
+IMG_BOOL MMU_Alloc(struct MMU_HEAP *pMMU, size_t uSize, u32 uFlags,
+ u32 uDevVAddrAlignment, struct IMG_DEV_VIRTADDR *pDevVAddr);
void MMU_Free(struct MMU_HEAP *pMMU, struct IMG_DEV_VIRTADDR DevVAddr,
u32 ui32Size);
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
+#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include "kernelbuffer.h"
#include "syscommon.h"
#include "pvrmmap.h"
+#include "mutils.h"
#include "mm.h"
#include "mmap.h"
#include "mutex.h"
#include "perproc.h"
#include "handle.h"
#include "pvr_bridge_km.h"
+#include "sgx_bridge_km.h"
#include "proc.h"
#include "pvrmodule.h"
-#include "omaplfb.h"
-
-/* omaplfb.h defines these, but we use our own */
-#undef DRVNAME
-#undef DEVNAME
+#include "private_data.h"
+#include "lock.h"
#define DRVNAME "pvrsrvkm"
-#define DEVNAME "pvrsrvkm"
-MODULE_SUPPORTED_DEVICE(DEVNAME);
#ifdef DEBUG
static int debug = DBGPRIV_WARNING;
#include <linux/moduleparam.h>
module_param(debug, int, 0);
#endif
-static int AssignedMajorNumber;
-
-static int PVRSRVOpen(struct inode *pInode, struct file *pFile);
-static int PVRSRVRelease(struct inode *pInode, struct file *pFile);
-
struct mutex gPVRSRVLock;
-const static struct file_operations pvrsrv_fops = {
- .owner = THIS_MODULE,
- .unlocked_ioctl = PVRSRV_BridgeDispatchKM,
- .open = PVRSRVOpen,
- .release = PVRSRVRelease,
- .mmap = PVRMMap,
-};
+static int pvr_open(struct inode unref__ * inode, struct file *filp)
+{
+ struct PVRSRV_FILE_PRIVATE_DATA *priv;
+ void *block_alloc;
+ int ret = -ENOMEM;
+ enum PVRSRV_ERROR err;
+ u32 pid;
-#define LDM_DEV struct platform_device
-#define LDM_DRV struct platform_driver
+ mutex_lock(&gPVRSRVLock);
-static int PVRSRVDriverRemove(LDM_DEV *device);
-static int PVRSRVDriverProbe(LDM_DEV *device);
-static int PVRSRVDriverSuspend(LDM_DEV *device, pm_message_t state);
-static void PVRSRVDriverShutdown(LDM_DEV *device);
-static int PVRSRVDriverResume(LDM_DEV *device);
+ pid = OSGetCurrentProcessIDKM();
+ if (PVRSRVProcessConnect(pid) != PVRSRV_OK)
+ goto err_unlock;
-static LDM_DRV powervr_driver = {
- .driver = {
- .name = DRVNAME,
- },
- .probe = PVRSRVDriverProbe,
- .remove = PVRSRVDriverRemove,
- .suspend = PVRSRVDriverSuspend,
- .resume = PVRSRVDriverResume,
- .shutdown = PVRSRVDriverShutdown,
-};
+ err = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(*priv),
+ (void **)&priv, &block_alloc);
-static LDM_DEV *gpsPVRLDMDev;
+ if (err != PVRSRV_OK)
+ goto err_unlock;
-static void PVRSRVDeviceRelease(struct device *device);
+ priv->ui32OpenPID = pid;
+ priv->hBlockAlloc = block_alloc;
+ filp->private_data = priv;
-static struct platform_device powervr_device = {
- .name = DEVNAME,
- .id = -1,
- .dev = {
- .release = PVRSRVDeviceRelease}
-};
+ ret = 0;
+err_unlock:
+ mutex_unlock(&gPVRSRVLock);
+ return ret;
+}
-static int PVRSRVDriverProbe(LDM_DEV *pDevice)
+static int pvr_release(struct inode unref__ * inode, struct file *filp)
{
- struct SYS_DATA *psSysData;
-
- PVR_TRACE("PVRSRVDriverProbe(pDevice=%p)", pDevice);
+ struct PVRSRV_FILE_PRIVATE_DATA *priv;
- pDevice->dev.driver_data = NULL;
+ mutex_lock(&gPVRSRVLock);
+ priv = filp->private_data;
- if (SysAcquireData(&psSysData) != PVRSRV_OK) {
- gpsPVRLDMDev = pDevice;
+ PVRSRVProcessDisconnect(priv->ui32OpenPID);
- if (SysInitialise() != PVRSRV_OK)
- return -ENODEV;
- }
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(*priv),
+ priv, priv->hBlockAlloc);
+ mutex_unlock(&gPVRSRVLock);
return 0;
}
-static int PVRSRVDriverRemove(LDM_DEV *pDevice)
-{
- struct SYS_DATA *psSysData;
-
- PVR_TRACE("PVRSRVDriverRemove(pDevice=%p)", pDevice);
-
- if (SysAcquireData(&psSysData) == PVRSRV_OK) {
- SysDeinitialise(psSysData);
-
- gpsPVRLDMDev = NULL;
- }
-
- return 0;
-}
+static const struct file_operations pvr_fops = {
+ .owner = THIS_MODULE,
+ .unlocked_ioctl = PVRSRV_BridgeDispatchKM,
+ .open = pvr_open,
+ .release = pvr_release,
+ .mmap = PVRMMap,
+};
-static void PVRSRVDriverShutdown(LDM_DEV *pDevice)
+static void pvr_shutdown(struct platform_device *pdev)
{
- PVR_TRACE("PVRSRVDriverShutdown(pDevice=%p)", pDevice);
+ PVR_TRACE("pvr_shutdown(pdev=%p)", pdev);
(void)PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D3);
}
-static int PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state)
+static int pvr_suspend(struct platform_device *pdev, pm_message_t state)
{
- PVR_TRACE("PVRSRVDriverSuspend(pDevice=%p)", pDevice);
+ PVR_TRACE("pvr_suspend(pdev=%p)", pdev);
if (PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D3) != PVRSRV_OK)
return -EINVAL;
return 0;
}
-static int PVRSRVDriverResume(LDM_DEV *pDevice)
+static int pvr_resume(struct platform_device *pdev)
{
- PVR_TRACE("PVRSRVDriverResume(pDevice=%p)", pDevice);
+ PVR_TRACE("pvr_resume(pdev=%p)", pdev);
if (PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D0) != PVRSRV_OK)
return -EINVAL;
return 0;
}
-static void PVRSRVDeviceRelease(struct device *pDevice)
+static void pvr_dev_release(struct device *pdev)
{
- PVR_DPF(PVR_DBG_WARNING, "PVRSRVDeviceRelease(pDevice=%p)", pDevice);
+ PVR_DPF(PVR_DBG_WARNING, "pvr_dev_release(pdev=%p)", pdev);
}
-static int PVRSRVOpen(struct inode unref__ * pInode,
- struct file unref__ * pFile)
-{
- int Ret = 0;
-
- LinuxLockMutex(&gPVRSRVLock);
+static struct platform_device pvr_device = {
+ .name = DRVNAME,
+ .id = -1,
+ .dev = {
+ .release = pvr_dev_release
+ }
+};
- if (PVRSRVProcessConnect(OSGetCurrentProcessIDKM()) != PVRSRV_OK)
- Ret = -ENOMEM;
+static struct miscdevice pvr_miscdevice = {
+ .minor = MISC_DYNAMIC_MINOR,
+ .name = DRVNAME,
+ .fops = &pvr_fops,
+};
- LinuxUnLockMutex(&gPVRSRVLock);
+static int __devinit pvr_probe(struct platform_device *pdev)
+{
+ struct SYS_DATA *sysdata;
+ int ret;
- return Ret;
-}
+ PVR_TRACE("pvr_probe(pdev=%p)", pdev);
-static int PVRSRVRelease(struct inode unref__ * pInode,
- struct file unref__ * pFile)
-{
- int Ret = 0;
+ if (SysAcquireData(&sysdata) != PVRSRV_OK &&
+ SysInitialise() != PVRSRV_OK) {
+ ret = -ENODEV;
+ goto err_exit;
+ }
- LinuxLockMutex(&gPVRSRVLock);
+ ret = misc_register(&pvr_miscdevice);
+ if (ret < 0)
+ goto err_exit;
- PVRSRVProcessDisconnect(OSGetCurrentProcessIDKM());
+ return 0;
- LinuxUnLockMutex(&gPVRSRVLock);
+err_exit:
+ dev_err(&pdev->dev, "probe failed (%d)\n", ret);
- return Ret;
+ return ret;
}
-static int __init PVRCore_Init(void)
+static int __devexit pvr_remove(struct platform_device *pdev)
{
- int error;
-
- PVR_TRACE("PVRCore_Init");
+ struct SYS_DATA *sysdata;
+ int ret;
- AssignedMajorNumber = register_chrdev(0, DEVNAME, &pvrsrv_fops);
+ PVR_TRACE("pvr_remove(pdev=%p)", pdev);
- if (AssignedMajorNumber <= 0) {
- PVR_DPF(PVR_DBG_ERROR,
- "PVRCore_Init: unable to get major number");
-
- return -EBUSY;
+ ret = misc_deregister(&pvr_miscdevice);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "remove failed (%d)\n", ret);
+ return ret;
}
- PVR_TRACE("PVRCore_Init: major device %d", AssignedMajorNumber);
+ if (SysAcquireData(&sysdata) == PVRSRV_OK)
+ SysDeinitialise(sysdata);
- if (CreateProcEntries()) {
- unregister_chrdev(AssignedMajorNumber, DRVNAME);
+ return 0;
+}
- return -ENOMEM;
- }
- LinuxInitMutex(&gPVRSRVLock);
+static struct platform_driver pvr_driver = {
+ .driver = {
+ .name = DRVNAME,
+ },
+ .probe = pvr_probe,
+ .remove = __devexit_p(pvr_remove),
+ .suspend = pvr_suspend,
+ .resume = pvr_resume,
+ .shutdown = pvr_shutdown,
+};
-#ifdef DEBUG
- PVRDebugSetLevel(debug);
-#endif
+static int __init pvr_init(void)
+{
+ int error;
- if (LinuxMMInit() != PVRSRV_OK) {
- error = -ENOMEM;
- goto init_failed;
- }
+ pvr_dbg_init();
- LinuxBridgeInit();
+ PVR_TRACE("pvr_init");
- PVRMMapInit();
+ mutex_init(&gPVRSRVLock);
- error = platform_driver_register(&powervr_driver);
- if (error != 0) {
- PVR_DPF(PVR_DBG_ERROR, "PVRCore_Init: "
- "unable to register platform driver (%d)", error);
+#ifdef DEBUG
+ PVRDebugSetLevel(debug);
+#endif
- goto init_failed;
- }
+ error = CreateProcEntries();
+ if (error < 0)
+ goto err1;
- powervr_device.dev.devt = MKDEV(AssignedMajorNumber, 0);
+ error = -ENOMEM;
+ if (LinuxMMInit() != PVRSRV_OK)
+ goto err2;
- error = platform_device_register(&powervr_device);
- if (error != 0) {
- platform_driver_unregister(&powervr_driver);
+ if (LinuxBridgeInit() != PVRSRV_OK)
+ goto err3;
- PVR_DPF(PVR_DBG_ERROR, "PVRCore_Init: "
- "unable to register platform device (%d)", error);
+ PVRMMapInit();
- goto init_failed;
- }
+ error = platform_driver_register(&pvr_driver);
+ if (error < 0)
+ goto err4;
+ error = platform_device_register(&pvr_device);
+ if (error)
+ goto err5;
return 0;
-init_failed:
-
+err5:
+ platform_driver_unregister(&pvr_driver);
+err4:
PVRMMapCleanup();
+ LinuxBridgeDeInit();
+err3:
LinuxMMCleanup();
+err2:
RemoveProcEntries();
- unregister_chrdev(AssignedMajorNumber, DRVNAME);
+err1:
+ pr_err("%s: failed (%d)\n", __func__, error);
return error;
-
}
-static void __exit PVRCore_Cleanup(void)
+static void __exit pvr_cleanup(void)
{
- struct SYS_DATA *psSysData;
+ struct SYS_DATA *sysdata;
- PVR_TRACE("PVRCore_Cleanup");
+ PVR_TRACE("pvr_cleanup");
- SysAcquireData(&psSysData);
+ SysAcquireData(&sysdata);
- unregister_chrdev(AssignedMajorNumber, DRVNAME);
-
- platform_device_unregister(&powervr_device);
- platform_driver_unregister(&powervr_driver);
+ platform_device_unregister(&pvr_device);
+ platform_driver_unregister(&pvr_driver);
PVRMMapCleanup();
LinuxMMCleanup();
LinuxBridgeDeInit();
RemoveProcEntries();
- PVR_TRACE("PVRCore_Cleanup: unloading");
+ PVR_TRACE("pvr_cleanup: unloading");
+
+ pvr_dbg_cleanup();
}
-module_init(PVRCore_Init);
-module_exit(PVRCore_Cleanup);
+module_init(pvr_init);
+module_exit(pvr_cleanup);
+
+MODULE_SUPPORTED_DEVICE(DRVNAME);
+MODULE_ALIAS("platform:" DRVNAME);
+
extern struct mutex gPVRSRVLock;
-extern void LinuxInitMutex(struct mutex *psPVRSRVMutex);
-
-extern void LinuxLockMutex(struct mutex *psPVRSRVMutex);
-
-extern enum PVRSRV_ERROR LinuxLockMutexInterruptible(
- struct mutex *psPVRSRVMutex);
-
-extern s32 LinuxTryLockMutex(struct mutex *psPVRSRVMutex);
-
-extern void LinuxUnLockMutex(struct mutex *psPVRSRVMutex);
-
-extern IMG_BOOL LinuxIsLockedMutex(struct mutex *psPVRSRVMutex);
-
#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#ifndef __IMG_LINUX_MUTILS_H__
+#define __IMG_LINUX_MUTILS_H__
+
+#define PGPROT_WC(pv) pgprot_writecombine(pv)
+#define PGPROT_UC(pv) pgprot_noncached(pv)
+
+#define IOREMAP(pa, bytes) ioremap_cached(pa, bytes)
+#define IOREMAP_WC(pa, bytes) ioremap_wc(pa, bytes)
+#define IOREMAP_UC(pa, bytes) ioremap_nocache(pa, bytes)
+
+#endif
--- /dev/null
+/****************************************************************************
+ Name : ocpdefs.h
+ Author : PowerVR
+ Copyright : 2009 by Imagination Technologies Limited.
+ All rights reserved. No part of this software, either
+ material or conceptual may be copied or distributed,
+ transmitted, transcribed, stored in a retrieval system or
+ translated into any human or computer language in any form
+ by any means, electronic, mechanical, manual or otherwise,
+ or disclosed to third parties without the express written
+ permission of Imagination Technologies Limited,
+ Home Park Estate, Kings Langley, Hertfordshire,
+ WD4 8LZ, U.K.
+ Description :
+
+ Program Type :
+
+ Modifications :
+
+****************************************************************************/
+
+#ifndef _OCPDEFS_H_
+#define _OCPDEFS_H_
+
+#include "sysconfig.h"
+
+#define SYS_OMAP3430_OCP_REGS_SYS_PHYS_BASE \
+ (SYS_OMAP3430_SGX_REGS_SYS_PHYS_BASE + EUR_CR_OCP_REVISION)
+#define SYS_OMAP3430_OCP_REGS_SIZE 0x110
+
+/* Register EUR_CR_OCP_REVISION */
+#define EUR_CR_OCP_REVISION 0xFE00
+#define EUR_CR_OCP_REVISION_REV_MASK 0xFFFFFFFFUL
+#define EUR_CR_OCP_REVISION_REV_SHIFT 0
+#define EUR_CR_OCP_REVISION_REV_SIGNED 0
+
+/* Register EUR_CR_OCP_HWINFO */
+#define EUR_CR_OCP_HWINFO 0xFE04
+#define EUR_CR_OCP_HWINFO_SYS_BUS_WIDTH_MASK 0x00000003UL
+#define EUR_CR_OCP_HWINFO_SYS_BUS_WIDTH_SHIFT 0
+#define EUR_CR_OCP_HWINFO_SYS_BUS_WIDTH_SIGNED 0
+
+#define EUR_CR_OCP_HWINFO_MEM_BUS_WIDTH_MASK 0x00000004UL
+#define EUR_CR_OCP_HWINFO_MEM_BUS_WIDTH_SHIFT 2
+#define EUR_CR_OCP_HWINFO_MEM_BUS_WIDTH_SIGNED 0
+
+/* Register EUR_CR_OCP_SYSCONFIG */
+#define EUR_CR_OCP_SYSCONFIG 0xFE10
+#define EUR_CR_OCP_SYSCONFIG_IDLE_MODE_MASK 0x0000000CUL
+#define EUR_CR_OCP_SYSCONFIG_IDLE_MODE_SHIFT 2
+#define EUR_CR_OCP_SYSCONFIG_IDLE_MODE_SIGNED 0
+
+#define EUR_CR_OCP_SYSCONFIG_STANDBY_MODE_MASK 0x00000030UL
+#define EUR_CR_OCP_SYSCONFIG_STANDBY_MODE_SHIFT 4
+#define EUR_CR_OCP_SYSCONFIG_STANDBY_MODE_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQSTATUS_RAW_0 */
+#define EUR_CR_OCP_IRQSTATUS_RAW_0 0xFE24
+#define EUR_CR_OCP_IRQSTATUS_RAW_0_INIT_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQSTATUS_RAW_0_INIT_SHIFT 0
+#define EUR_CR_OCP_IRQSTATUS_RAW_0_INIT_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQSTATUS_RAW_1 */
+#define EUR_CR_OCP_IRQSTATUS_RAW_1 0xFE28
+#define EUR_CR_OCP_IRQSTATUS_RAW_1_TARGET_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQSTATUS_RAW_1_TARGET_SHIFT 0
+#define EUR_CR_OCP_IRQSTATUS_RAW_1_TARGET_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQSTATUS_RAW_2 */
+#define EUR_CR_OCP_IRQSTATUS_RAW_2 0xFE2C
+#define EUR_CR_OCP_IRQSTATUS_RAW_2_SGXCORE_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQSTATUS_RAW_2_SGXCORE_SHIFT 0
+#define EUR_CR_OCP_IRQSTATUS_RAW_2_SGXCORE_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQSTATUS_0 */
+#define EUR_CR_OCP_IRQSTATUS_0 0xFE30
+#define EUR_CR_OCP_IRQSTATUS_0_INIT_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQSTATUS_0_INIT_SHIFT 0
+#define EUR_CR_OCP_IRQSTATUS_0_INIT_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQSTATUS_1 */
+#define EUR_CR_OCP_IRQSTATUS_1 0xFE34
+#define EUR_CR_OCP_IRQSTATUS_1_TARGET_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQSTATUS_1_TARGET_SHIFT 0
+#define EUR_CR_OCP_IRQSTATUS_1_TARGET_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQSTATUS_2 */
+#define EUR_CR_OCP_IRQSTATUS_2 0xFE38
+#define EUR_CR_OCP_IRQSTATUS_2_SGXCORE_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQSTATUS_2_SGXCORE_SHIFT 0
+#define EUR_CR_OCP_IRQSTATUS_2_SGXCORE_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQENABLE_SET_0 */
+#define EUR_CR_OCP_IRQENABLE_SET_0 0xFE3C
+#define EUR_CR_OCP_IRQENABLE_SET_0_INIT_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQENABLE_SET_0_INIT_SHIFT 0
+#define EUR_CR_OCP_IRQENABLE_SET_0_INIT_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQENABLE_SET_1 */
+#define EUR_CR_OCP_IRQENABLE_SET_1 0xFE40
+#define EUR_CR_OCP_IRQENABLE_SET_1_TARGET_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQENABLE_SET_1_TARGET_SHIFT 0
+#define EUR_CR_OCP_IRQENABLE_SET_1_TARGET_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQENABLE_SET_2 */
+#define EUR_CR_OCP_IRQENABLE_SET_2 0xFE44
+#define EUR_CR_OCP_IRQENABLE_SET_2_SGXCORE_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQENABLE_SET_2_SGXCORE_SHIFT 0
+#define EUR_CR_OCP_IRQENABLE_SET_2_SGXCORE_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQENABLE_CLR_0 */
+#define EUR_CR_OCP_IRQENABLE_CLR_0 0xFE48
+#define EUR_CR_OCP_IRQENABLE_CLR_0_INIT_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQENABLE_CLR_0_INIT_SHIFT 0
+#define EUR_CR_OCP_IRQENABLE_CLR_0_INIT_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQENABLE_CLR_1 */
+#define EUR_CR_OCP_IRQENABLE_CLR_1 0xFE4C
+#define EUR_CR_OCP_IRQENABLE_CLR_1_TARGET_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQENABLE_CLR_1_TARGET_SHIFT 0
+#define EUR_CR_OCP_IRQENABLE_CLR_1_TARGET_SIGNED 0
+
+/* Register EUR_CR_OCP_IRQENABLE_CLR_2 */
+#define EUR_CR_OCP_IRQENABLE_CLR_2 0xFE50
+#define EUR_CR_OCP_IRQENABLE_CLR_2_SGXCORE_MASK 0x00000001UL
+#define EUR_CR_OCP_IRQENABLE_CLR_2_SGXCORE_SHIFT 0
+#define EUR_CR_OCP_IRQENABLE_CLR_2_SGXCORE_SIGNED 0
+
+/* Register EUR_CR_OCP_PAGE_CONFIG */
+#define EUR_CR_OCP_PAGE_CONFIG 0xFF00
+#define EUR_CR_OCP_PAGE_CONFIG_MEM_PAGE_SIZE_MASK 0x00000001UL
+#define EUR_CR_OCP_PAGE_CONFIG_MEM_PAGE_SIZE_SHIFT 0
+#define EUR_CR_OCP_PAGE_CONFIG_MEM_PAGE_SIZE_SIGNED 0
+
+#define EUR_CR_OCP_PAGE_CONFIG_MEM_PAGE_CHECK_ENABLE_MASK 0x00000004UL
+#define EUR_CR_OCP_PAGE_CONFIG_MEM_PAGE_CHECK_ENABLE_SHIFT 2
+#define EUR_CR_OCP_PAGE_CONFIG_MEM_PAGE_CHECK_ENABLE_SIGNED 0
+
+#define EUR_CR_OCP_PAGE_CONFIG_SIZE_MASK 0x00000018UL
+#define EUR_CR_OCP_PAGE_CONFIG_SIZE_SHIFT 3
+#define EUR_CR_OCP_PAGE_CONFIG_SIZE_SIGNED 0
+
+/* Register EUR_CR_OCP_INTERRUPT_EVENT */
+#define EUR_CR_OCP_INTERRUPT_EVENT 0xFF04
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_UNEXPECTED_MASK 0x00000001UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_UNEXPECTED_SHIFT 0
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_UNEXPECTED_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_UNUSED_TAG_MASK 0x00000002UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_UNUSED_TAG_SHIFT 1
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_UNUSED_TAG_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_ERROR_MASK 0x00000004UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_ERROR_SHIFT 2
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_RESP_ERROR_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_PAGE_CROSS_ERROR_MASK 0x00000008UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_PAGE_CROSS_ERROR_SHIFT 3
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_PAGE_CROSS_ERROR_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_READ_TAG_FIFO_OVR_MASK 0x00000010UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_READ_TAG_FIFO_OVR_SHIFT 4
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_READ_TAG_FIFO_OVR_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_MEM_REQ_FIFO_OVR_MASK 0x00000020UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_MEM_REQ_FIFO_OVR_SHIFT 5
+#define EUR_CR_OCP_INTERRUPT_EVENT_INIT_MEM_REQ_FIFO_OVR_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_RESP_FIFO_FULL_MASK 0x00000100UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_RESP_FIFO_FULL_SHIFT 8
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_RESP_FIFO_FULL_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_CMD_FIFO_FULL_MASK 0x00000200UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_CMD_FIFO_FULL_SHIFT 9
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_CMD_FIFO_FULL_SIGNED 0
+
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_INVALID_OCP_CMD_MASK 0x00000400UL
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_INVALID_OCP_CMD_SHIFT 10
+#define EUR_CR_OCP_INTERRUPT_EVENT_TARGET_INVALID_OCP_CMD_SIGNED 0
+
+/* Register EUR_CR_OCP_DEBUG_CONFIG */
+#define EUR_CR_OCP_DEBUG_CONFIG 0xFF08
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_TARGET_IDLE_MASK 0x00000003UL
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_TARGET_IDLE_SHIFT 0
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_TARGET_IDLE_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_INIT_IDLE_MASK 0x0000000CUL
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_INIT_IDLE_SHIFT 2
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_INIT_IDLE_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_PASS_DATA_MASK 0x00000010UL
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_PASS_DATA_SHIFT 4
+#define EUR_CR_OCP_DEBUG_CONFIG_FORCE_PASS_DATA_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_CONFIG_SELECT_INIT_IDLE_MASK 0x00000020UL
+#define EUR_CR_OCP_DEBUG_CONFIG_SELECT_INIT_IDLE_SHIFT 5
+#define EUR_CR_OCP_DEBUG_CONFIG_SELECT_INIT_IDLE_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_MASK 0x80000000UL
+#define EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_SHIFT 31
+#define EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_SIGNED 0
+
+/* Register EUR_CR_OCP_DEBUG_STATUS */
+#define EUR_CR_OCP_DEBUG_STATUS 0xFF0C
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_MCONNECT_MASK 0x00000003UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_MCONNECT_SHIFT 0
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_MCONNECT_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SCONNECT_MASK 0x00000004UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SCONNECT_SHIFT 2
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SCONNECT_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SIDLEREQ_MASK 0x00000008UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SIDLEREQ_SHIFT 3
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SIDLEREQ_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SDISCACK_MASK 0x00000030UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SDISCACK_SHIFT 4
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SDISCACK_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SIDLEACK_MASK 0x000000C0UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SIDLEACK_SHIFT 6
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_SIDLEACK_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MCONNECT0_MASK 0x00000300UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MCONNECT0_SHIFT 8
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MCONNECT0_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT0_MASK 0x00000400UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT0_SHIFT 10
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT0_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT1_MASK 0x00000800UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT1_SHIFT 11
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT1_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT2_MASK 0x00001000UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT2_SHIFT 12
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_SCONNECT2_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MDISCACK_MASK 0x00006000UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MDISCACK_SHIFT 13
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MDISCACK_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MDISCREQ_MASK 0x00008000UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MDISCREQ_SHIFT 15
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MDISCREQ_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MWAIT_MASK 0x00010000UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MWAIT_SHIFT 16
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MWAIT_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MSTANDBY_MASK 0x00020000UL
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MSTANDBY_SHIFT 17
+#define EUR_CR_OCP_DEBUG_STATUS_INIT_MSTANDBY_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_CMD_OUT_MASK 0x001C0000UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_CMD_OUT_SHIFT 18
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_CMD_OUT_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_WHICH_TARGET_REGISTER_MASK 0x03E00000UL
+#define EUR_CR_OCP_DEBUG_STATUS_WHICH_TARGET_REGISTER_SHIFT 21
+#define EUR_CR_OCP_DEBUG_STATUS_WHICH_TARGET_REGISTER_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_RESP_ERROR_MASK 0x04000000UL
+#define EUR_CR_OCP_DEBUG_STATUS_RESP_ERROR_SHIFT 26
+#define EUR_CR_OCP_DEBUG_STATUS_RESP_ERROR_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_FIFO_FULL_MASK 0x08000000UL
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_FIFO_FULL_SHIFT 27
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_FIFO_FULL_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_RESP_FIFO_FULL_MASK 0x10000000UL
+#define EUR_CR_OCP_DEBUG_STATUS_RESP_FIFO_FULL_SHIFT 28
+#define EUR_CR_OCP_DEBUG_STATUS_RESP_FIFO_FULL_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_IDLE_MASK 0x20000000UL
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_IDLE_SHIFT 29
+#define EUR_CR_OCP_DEBUG_STATUS_TARGET_IDLE_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_RESP_DEBUG_STATE_MASK 0x40000000UL
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_RESP_DEBUG_STATE_SHIFT 30
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_RESP_DEBUG_STATE_SIGNED 0
+
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_DEBUG_STATE_MASK 0x80000000UL
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_DEBUG_STATE_SHIFT 31
+#define EUR_CR_OCP_DEBUG_STATUS_CMD_DEBUG_STATE_SIGNED 0
+
+
+#endif /* _OCPDEFS_H_ */
+
+/*****************************************************************************
+ End of file (ocpdefs.h)
+*****************************************************************************/
#if !defined(__OEMFUNCS_H__)
#define __OEMFUNCS_H__
-#include <linux/file.h>
+#include <linux/fs.h>
struct PVRSRV_DC_OEM_JTABLE {
- long (*pfnOEMBridgeDispatch)(struct file *file, unsigned int cmd,
- unsigned long arg);
+ long (*pfnOEMBridgeDispatch)(struct file *, unsigned, unsigned long);
void *pvDummy1;
void *pvDummy2;
void *pvDummy3;
#ifndef __OMAPLFB_H__
#define __OMAPLFB_H__
-extern IMG_BOOL PVRGetDisplayClassJTable(
- struct PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable);
-
#define OMAPLCD_IRQ 25
#define OMAPLCD_SYSCONFIG 0x0410
struct OMAPLFB_BUFFER *psNext;
};
-struct OMAPLFB_VSYNC_FLIP_ITEM {
- void *hCmdComplete;
- struct IMG_SYS_PHYADDR *sSysAddr;
- u32 ui32SwapInterval;
- IMG_BOOL bValid;
- IMG_BOOL bFlipped;
- IMG_BOOL bCmdCompleted;
-};
-
struct OMAPLFB_SWAPCHAIN {
u32 ui32BufferCount;
struct OMAPLFB_BUFFER *psBuffer;
- struct OMAPLFB_VSYNC_FLIP_ITEM *psVSyncFlips;
- u32 ui32InsertIndex;
- u32 ui32RemoveIndex;
- void __iomem *pvRegs;
struct PVRSRV_DC_DISP2SRV_KMJTABLE *psPVRJTable;
- IMG_BOOL bFlushCommands;
- u32 ui32SetFlushStateRefCount;
IMG_BOOL bBlanked;
- spinlock_t *psSwapChainLock;
};
struct OMAPLFB_FBINFO {
struct OMAPLFB_FBINFO sFBInfo;
u32 ui32RefCount;
struct OMAPLFB_SWAPCHAIN *psSwapChain;
- IMG_BOOL bFlushCommands;
struct IMG_DEV_VIRTADDR sDisplayDevVAddr;
struct fb_info *psLINFBInfo;
struct notifier_block sLINNotifBlock;
- IMG_BOOL bDeviceSuspended;
- spinlock_t SwapChainLock;
};
#define OMAPLFB_PAGE_SIZE 4096
#define OMAPLFB_PAGE_MASK (OMAPLFB_PAGE_SIZE - 1)
#define OMAPLFB_PAGE_TRUNC (~OMAPLFB_PAGE_MASK)
-#define OMAPLFB_PAGE_ROUNDUP(x) \
- (((x) + OMAPLFB_PAGE_MASK) & OMAPLFB_PAGE_TRUNC)
+#define OMAPLFB_PAGE_ROUNDUP(x) (((x) + OMAPLFB_PAGE_MASK) & OMAPLFB_PAGE_TRUNC)
#ifdef DEBUG
#define DEBUG_PRINTK(x) printk x
void OMAPLFBFreeKernelMem(void *pvMem);
enum PVRSRV_ERROR OMAPLFBGetLibFuncAddr(char *szFunctionName,
IMG_BOOL (**ppfnFuncTable)(struct PVRSRV_DC_DISP2SRV_KMJTABLE *));
-enum PVRSRV_ERROR OMAPLFBInstallVSyncISR(struct OMAPLFB_SWAPCHAIN *psSwapChain);
-enum PVRSRV_ERROR OMAPLFBUninstallVSyncISR(
- struct OMAPLFB_SWAPCHAIN *psSwapChain);
-IMG_BOOL OMAPLFBVSyncIHandler(struct OMAPLFB_SWAPCHAIN *psSwapChain);
-void OMAPLFBEnableVSyncInterrupt(struct OMAPLFB_SWAPCHAIN *psSwapChain);
-void OMAPLFBDisableVSyncInterrupt(struct OMAPLFB_SWAPCHAIN *psSwapChain);
-void OMAPLFBEnableDisplayRegisterAccess(void);
-void OMAPLFBDisableDisplayRegisterAccess(void);
-void OMAPLFBFlip(struct OMAPLFB_SWAPCHAIN *psSwapChain, u32 aPhyAddr);
#endif
#include <linux/module.h>
#include <linux/string.h>
#include <linux/notifier.h>
-#include <linux/spinlock.h>
+
+#include <asm/div64.h>
+#include <video/sgx-util.h>
#include "img_defs.h"
#include "servicesext.h"
gpvAnchor = (void *) psDevInfo;
}
-static void FlushInternalVSyncQueue(struct OMAPLFB_SWAPCHAIN *psSwapChain)
-{
- struct OMAPLFB_VSYNC_FLIP_ITEM *psFlipItem;
- u32 ui32MaxIndex;
- u32 i;
-
- psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ui32RemoveIndex];
- ui32MaxIndex = psSwapChain->ui32BufferCount - 1;
-
- for (i = 0; i < psSwapChain->ui32BufferCount; i++) {
- if (!psFlipItem->bValid)
- continue;
-
- DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
- ": %s: Flushing swap buffer (index %u)\n",
- __func__, psSwapChain->ui32RemoveIndex));
-
- if (psFlipItem->bFlipped == IMG_FALSE)
-
- OMAPLFBFlip(psSwapChain,
- (u32) psFlipItem->sSysAddr);
-
- if (psFlipItem->bCmdCompleted == IMG_FALSE) {
- DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
- ": %s: Calling command complete for swap buffer (index %u)\n",
- __func__, psSwapChain->ui32RemoveIndex));
-
- psSwapChain->psPVRJTable->
- pfnPVRSRVCmdComplete(psFlipItem->hCmdComplete,
- IMG_TRUE);
- }
-
- psSwapChain->ui32RemoveIndex++;
-
- if (psSwapChain->ui32RemoveIndex > ui32MaxIndex)
- psSwapChain->ui32RemoveIndex = 0;
-
- psFlipItem->bFlipped = IMG_FALSE;
- psFlipItem->bCmdCompleted = IMG_FALSE;
- psFlipItem->bValid = IMG_FALSE;
-
- psFlipItem =
- &psSwapChain->psVSyncFlips[psSwapChain->ui32RemoveIndex];
- }
-
- psSwapChain->ui32InsertIndex = 0;
- psSwapChain->ui32RemoveIndex = 0;
-}
-
-static void SetFlushStateInternalNoLock(struct OMAPLFB_DEVINFO *psDevInfo,
- IMG_BOOL bFlushState)
-{
- struct OMAPLFB_SWAPCHAIN *psSwapChain = psDevInfo->psSwapChain;
-
- if (psSwapChain == NULL)
- return;
-
- if (bFlushState) {
- if (psSwapChain->ui32SetFlushStateRefCount == 0) {
- OMAPLFBDisableVSyncInterrupt(psSwapChain);
- psSwapChain->bFlushCommands = IMG_TRUE;
- FlushInternalVSyncQueue(psSwapChain);
- }
- psSwapChain->ui32SetFlushStateRefCount++;
- } else {
- if (psSwapChain->ui32SetFlushStateRefCount != 0) {
- psSwapChain->ui32SetFlushStateRefCount--;
- if (psSwapChain->ui32SetFlushStateRefCount == 0) {
- psSwapChain->bFlushCommands = IMG_FALSE;
- OMAPLFBEnableVSyncInterrupt(psSwapChain);
- }
- }
- }
-}
-
-static void SetFlushStateInternal(struct OMAPLFB_DEVINFO *psDevInfo,
- IMG_BOOL bFlushState)
-{
- unsigned long ulLockFlags;
-
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
- SetFlushStateInternalNoLock(psDevInfo, bFlushState);
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-}
-
-static void SetFlushStateExternal(struct OMAPLFB_DEVINFO *psDevInfo,
- IMG_BOOL bFlushState)
-{
- unsigned long ulLockFlags;
-
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
-
- if (psDevInfo->bFlushCommands != bFlushState) {
- psDevInfo->bFlushCommands = bFlushState;
- SetFlushStateInternalNoLock(psDevInfo, bFlushState);
- }
-
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-}
-
-static void SetDCState(void *hDevice, u32 ui32State)
-{
- struct OMAPLFB_DEVINFO *psDevInfo = (struct OMAPLFB_DEVINFO *)hDevice;
-
- switch (ui32State) {
- case DC_STATE_FLUSH_COMMANDS:
- SetFlushStateExternal(psDevInfo, IMG_TRUE);
- break;
- case DC_STATE_NO_FLUSH_COMMANDS:
- SetFlushStateExternal(psDevInfo, IMG_FALSE);
- break;
- default:
- break;
- }
-
- return;
-}
-
static int FrameBufferEvents(struct notifier_block *psNotif,
unsigned long event, void *data)
{
struct OMAPLFB_DEVINFO *psDevInfo;
struct OMAPLFB_SWAPCHAIN *psSwapChain;
struct fb_event *psFBEvent = (struct fb_event *)data;
- IMG_BOOL bBlanked;;
if (event != FB_EVENT_BLANK)
return 0;
psDevInfo = GetAnchorPtr();
psSwapChain = psDevInfo->psSwapChain;
-
- bBlanked = (*(int *)psFBEvent->data != 0);
-
- if (bBlanked != psSwapChain->bBlanked) {
- psSwapChain->bBlanked = bBlanked;
-
- if (bBlanked)
-
- SetFlushStateInternal(psDevInfo, IMG_TRUE);
- else
-
- SetFlushStateInternal(psDevInfo, IMG_FALSE);
- }
+ psSwapChain->bBlanked = (*(int *)psFBEvent->data != 0);
return 0;
}
struct OMAPLFB_DEVINFO *psDevInfo;
struct OMAPLFB_SWAPCHAIN *psSwapChain;
struct OMAPLFB_BUFFER *psBuffer;
- struct OMAPLFB_VSYNC_FLIP_ITEM *psVSyncFlips;
u32 i;
enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
- unsigned long ulLockFlags;
- u32 ui32BuffersToSkip;
PVR_UNREFERENCED_PARAMETER(ui32OEMFlags);
PVR_UNREFERENCED_PARAMETER(pui32SwapChainID);
- if (!hDevice
- || !psDstSurfAttrib
- || !psSrcSurfAttrib || !ppsSyncData || !phSwapChain)
+ if (!hDevice || !psDstSurfAttrib || !psSrcSurfAttrib ||
+ !ppsSyncData || !phSwapChain)
return PVRSRV_ERROR_INVALID_PARAMS;
psDevInfo = (struct OMAPLFB_DEVINFO *)hDevice;
psDevInfo->sFBInfo.ui32FBSize)
return PVRSRV_ERROR_TOOMANYBUFFERS;
- ui32BuffersToSkip =
- psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers - ui32BufferCount;
-
if (psDstSurfAttrib->pixelformat !=
- psDevInfo->sDisplayFormat.pixelformat
- || psDstSurfAttrib->sDims.ui32ByteStride !=
- psDevInfo->sDisplayDim.ui32ByteStride
- || psDstSurfAttrib->sDims.ui32Width !=
- psDevInfo->sDisplayDim.ui32Width
- || psDstSurfAttrib->sDims.ui32Height !=
- psDevInfo->sDisplayDim.ui32Height)
-
+ psDevInfo->sDisplayFormat.pixelformat ||
+ psDstSurfAttrib->sDims.ui32ByteStride !=
+ psDevInfo->sDisplayDim.ui32ByteStride ||
+ psDstSurfAttrib->sDims.ui32Width !=
+ psDevInfo->sDisplayDim.ui32Width ||
+ psDstSurfAttrib->sDims.ui32Height !=
+ psDevInfo->sDisplayDim.ui32Height)
return PVRSRV_ERROR_INVALID_PARAMS;
- if (psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat
- || psDstSurfAttrib->sDims.ui32ByteStride !=
- psSrcSurfAttrib->sDims.ui32ByteStride
- || psDstSurfAttrib->sDims.ui32Width !=
- psSrcSurfAttrib->sDims.ui32Width
- || psDstSurfAttrib->sDims.ui32Height !=
- psSrcSurfAttrib->sDims.ui32Height)
-
+ if (psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat ||
+ psDstSurfAttrib->sDims.ui32ByteStride !=
+ psSrcSurfAttrib->sDims.ui32ByteStride ||
+ psDstSurfAttrib->sDims.ui32Width !=
+ psSrcSurfAttrib->sDims.ui32Width ||
+ psDstSurfAttrib->sDims.ui32Height !=
+ psSrcSurfAttrib->sDims.ui32Height)
return PVRSRV_ERROR_INVALID_PARAMS;
PVR_UNREFERENCED_PARAMETER(ui32Flags);
goto ErrorFreeSwapChain;
}
- psVSyncFlips = (struct OMAPLFB_VSYNC_FLIP_ITEM *)
- OMAPLFBAllocKernelMem(sizeof(struct OMAPLFB_VSYNC_FLIP_ITEM) *
- ui32BufferCount);
- if (!psVSyncFlips) {
- eError = PVRSRV_ERROR_OUT_OF_MEMORY;
- goto ErrorFreeBuffers;
- }
-
psSwapChain->ui32BufferCount = ui32BufferCount;
psSwapChain->psBuffer = psBuffer;
- psSwapChain->psVSyncFlips = psVSyncFlips;
- psSwapChain->ui32InsertIndex = 0;
- psSwapChain->ui32RemoveIndex = 0;
psSwapChain->psPVRJTable = &psDevInfo->sPVRJTable;
- psSwapChain->psSwapChainLock = &psDevInfo->SwapChainLock;
for (i = 0; i < ui32BufferCount - 1; i++)
psBuffer[i].psNext = &psBuffer[i + 1];
psBuffer[i].psNext = &psBuffer[0];
for (i = 0; i < ui32BufferCount; i++) {
- u32 ui32SwapBuffer = i + ui32BuffersToSkip;
- u32 ui32BufferOffset =
- ui32SwapBuffer * psDevInfo->sFBInfo.ui32RoundedBufferSize;
+ u32 ui32BufferOffset = i *
+ psDevInfo->sFBInfo.ui32RoundedBufferSize;
psBuffer[i].psSyncData = ppsSyncData[i];
psDevInfo->sFBInfo.sCPUVAddr + ui32BufferOffset;
}
- for (i = 0; i < ui32BufferCount; i++) {
- psVSyncFlips[i].bValid = IMG_FALSE;
- psVSyncFlips[i].bFlipped = IMG_FALSE;
- psVSyncFlips[i].bCmdCompleted = IMG_FALSE;
- }
-
- OMAPLFBEnableDisplayRegisterAccess();
-
- psSwapChain->pvRegs =
- ioremap(psDevInfo->psLINFBInfo->fix.mmio_start,
- psDevInfo->psLINFBInfo->fix.mmio_len);
- if (psSwapChain->pvRegs == NULL) {
- printk(KERN_WARNING DRIVER_PREFIX
- ": Couldn't map registers needed for flipping\n");
- goto ErrorDisableDisplayRegisters;
- }
-
- if (OMAPLFBInstallVSyncISR(psSwapChain) != PVRSRV_OK) {
- printk(KERN_WARNING DRIVER_PREFIX
- ": ISR handler failed to register\n");
- goto ErrorUnmapRegisters;
- }
-
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
-
psDevInfo->psSwapChain = psSwapChain;
- psSwapChain->bFlushCommands = psDevInfo->bFlushCommands;
-
- if (psSwapChain->bFlushCommands) {
- psSwapChain->ui32SetFlushStateRefCount = 1;
- } else {
- psSwapChain->ui32SetFlushStateRefCount = 0;
- OMAPLFBEnableVSyncInterrupt(psSwapChain);
- }
-
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-
eError = EnableLFBEventNotification(psDevInfo);
if (eError != PVRSRV_OK) {
- printk(KERN_WARNING DRIVER_PREFIX
+ printk(DRIVER_PREFIX
": Couldn't enable framebuffer event notification\n");
- goto ErrorUninstallVSyncInterrupt;
+ goto ErrorFreeBuffer;
}
*phSwapChain = (void *) psSwapChain;
return PVRSRV_OK;
-ErrorUninstallVSyncInterrupt:
- if (OMAPLFBUninstallVSyncISR(psSwapChain) != PVRSRV_OK)
- printk(KERN_WARNING DRIVER_PREFIX
- ": Couldn't uninstall VSync ISR\n");
-ErrorUnmapRegisters:
- iounmap(psSwapChain->pvRegs);
-ErrorDisableDisplayRegisters:
- OMAPLFBDisableDisplayRegisterAccess();
- OMAPLFBFreeKernelMem(psVSyncFlips);
-ErrorFreeBuffers:
+ErrorFreeBuffer:
OMAPLFBFreeKernelMem(psBuffer);
ErrorFreeSwapChain:
OMAPLFBFreeKernelMem(psSwapChain);
{
struct OMAPLFB_DEVINFO *psDevInfo;
struct OMAPLFB_SWAPCHAIN *psSwapChain;
- unsigned long ulLockFlags;
enum PVRSRV_ERROR eError;
if (!hDevice || !hSwapChain)
printk(KERN_WARNING DRIVER_PREFIX
": Couldn't disable framebuffer event notification\n");
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
-
- OMAPLFBDisableVSyncInterrupt(psSwapChain);
-
- FlushInternalVSyncQueue(psSwapChain);
-
- OMAPLFBFlip(psSwapChain, psDevInfo->sFBInfo.sSysAddr.uiAddr);
-
psDevInfo->psSwapChain = NULL;
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-
- if (OMAPLFBUninstallVSyncISR(psSwapChain) != PVRSRV_OK) {
- printk(KERN_WARNING DRIVER_PREFIX
- ": Couldn't uninstall VSync ISR\n");
- return PVRSRV_ERROR_GENERIC;
- }
-
- iounmap(psSwapChain->pvRegs);
-
- OMAPLFBDisableDisplayRegisterAccess();
-
- OMAPLFBFreeKernelMem(psSwapChain->psVSyncFlips);
OMAPLFBFreeKernelMem(psSwapChain->psBuffer);
OMAPLFBFreeKernelMem(psSwapChain);
return PVRSRV_OK;
}
-static enum PVRSRV_ERROR SwapToDCBuffer(void *hDevice, void *hBuffer,
- u32 ui32SwapInterval, void *hPrivateTag,
- u32 ui32ClipRectCount,
- struct IMG_RECT *psClipRect)
-{
- struct OMAPLFB_DEVINFO *psDevInfo;
-
- PVR_UNREFERENCED_PARAMETER(ui32SwapInterval);
- PVR_UNREFERENCED_PARAMETER(hPrivateTag);
- PVR_UNREFERENCED_PARAMETER(psClipRect);
-
- if (!hDevice || !hBuffer || (ui32ClipRectCount != 0))
- return PVRSRV_ERROR_INVALID_PARAMS;
-
- psDevInfo = (struct OMAPLFB_DEVINFO *)hDevice;
-
- PVR_UNREFERENCED_PARAMETER(hBuffer);
-
- return PVRSRV_OK;
-}
-
-static enum PVRSRV_ERROR SwapToDCSystem(void *hDevice, void *hSwapChain)
-{
- struct OMAPLFB_DEVINFO *psDevInfo;
- struct OMAPLFB_SWAPCHAIN *psSwapChain;
- unsigned long ulLockFlags;
-
- if (!hDevice || !hSwapChain)
- return PVRSRV_ERROR_INVALID_PARAMS;
-
- psDevInfo = (struct OMAPLFB_DEVINFO *)hDevice;
- psSwapChain = (struct OMAPLFB_SWAPCHAIN *)hSwapChain;
- if (psSwapChain != psDevInfo->psSwapChain)
- return PVRSRV_ERROR_INVALID_PARAMS;
-
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
-
- FlushInternalVSyncQueue(psSwapChain);
-
- OMAPLFBFlip(psSwapChain, psDevInfo->sFBInfo.sSysAddr.uiAddr);
-
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-
- return PVRSRV_OK;
-}
-
-IMG_BOOL OMAPLFBVSyncIHandler(struct OMAPLFB_SWAPCHAIN *psSwapChain)
-{
- IMG_BOOL bStatus = IMG_FALSE;
- struct OMAPLFB_VSYNC_FLIP_ITEM *psFlipItem;
- u32 ui32MaxIndex;
- unsigned long ulLockFlags;
-
- psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ui32RemoveIndex];
- ui32MaxIndex = psSwapChain->ui32BufferCount - 1;
-
- spin_lock_irqsave(psSwapChain->psSwapChainLock, ulLockFlags);
-
- if (psSwapChain->bFlushCommands)
- goto ExitUnlock;
-
- while (psFlipItem->bValid) {
-
- if (psFlipItem->bFlipped) {
-
- if (!psFlipItem->bCmdCompleted) {
-
- psSwapChain->psPVRJTable->
- pfnPVRSRVCmdComplete(psFlipItem->
- hCmdComplete,
- IMG_TRUE);
-
- psFlipItem->bCmdCompleted = IMG_TRUE;
- }
-
- psFlipItem->ui32SwapInterval--;
-
- if (psFlipItem->ui32SwapInterval == 0) {
-
- psSwapChain->ui32RemoveIndex++;
-
- if (psSwapChain->ui32RemoveIndex >
- ui32MaxIndex)
- psSwapChain->ui32RemoveIndex = 0;
-
- psFlipItem->bCmdCompleted = IMG_FALSE;
- psFlipItem->bFlipped = IMG_FALSE;
-
- psFlipItem->bValid = IMG_FALSE;
- } else {
-
- break;
- }
- } else {
-
- OMAPLFBFlip(psSwapChain,
- (u32) psFlipItem->sSysAddr);
-
- psFlipItem->bFlipped = IMG_TRUE;
-
- break;
- }
-
- psFlipItem =
- &psSwapChain->psVSyncFlips[psSwapChain->ui32RemoveIndex];
- }
-
-ExitUnlock:
- spin_unlock_irqrestore(psSwapChain->psSwapChainLock, ulLockFlags);
-
- return bStatus;
-}
-
static IMG_BOOL ProcessFlip(void *hCmdCookie, u32 ui32DataSize, void *pvData)
{
struct DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
struct OMAPLFB_DEVINFO *psDevInfo;
struct OMAPLFB_BUFFER *psBuffer;
struct OMAPLFB_SWAPCHAIN *psSwapChain;
- struct OMAPLFB_VSYNC_FLIP_ITEM *psFlipItem;
- unsigned long ulLockFlags;
if (!hCmdCookie || !pvData)
return IMG_FALSE;
psBuffer = (struct OMAPLFB_BUFFER *)psFlipCmd->hExtBuffer;
psSwapChain = (struct OMAPLFB_SWAPCHAIN *)psFlipCmd->hExtSwapChain;
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
+ psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE);
- if (psDevInfo->bDeviceSuspended) {
- psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie,
- IMG_TRUE);
- goto ExitTrueUnlock;
- }
-
- if (psFlipCmd->ui32SwapInterval == 0 || psSwapChain->bFlushCommands) {
-
- OMAPLFBFlip(psSwapChain, psBuffer->sSysAddr.uiAddr);
-
- psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie,
- IMG_TRUE);
-
- goto ExitTrueUnlock;
- }
-
- psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ui32InsertIndex];
-
- if (!psFlipItem->bValid) {
- u32 ui32MaxIndex = psSwapChain->ui32BufferCount - 1;
-
- if (psSwapChain->ui32InsertIndex ==
- psSwapChain->ui32RemoveIndex) {
-
- OMAPLFBFlip(psSwapChain, psBuffer->sSysAddr.uiAddr);
-
- psFlipItem->bFlipped = IMG_TRUE;
- } else {
- psFlipItem->bFlipped = IMG_FALSE;
- }
-
- psFlipItem->hCmdComplete = hCmdCookie;
- psFlipItem->ui32SwapInterval = psFlipCmd->ui32SwapInterval;
- psFlipItem->sSysAddr = &psBuffer->sSysAddr;
- psFlipItem->bValid = IMG_TRUE;
+ return IMG_TRUE;
+}
- psSwapChain->ui32InsertIndex++;
- if (psSwapChain->ui32InsertIndex > ui32MaxIndex)
- psSwapChain->ui32InsertIndex = 0;
+static void CalcSwapChainSize(struct OMAPLFB_DEVINFO *psDevInfo)
+{
+ if (psDevInfo->sFBInfo.ui32RoundedBufferSize)
+ psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers =
+ psDevInfo->sFBInfo.ui32FBSize /
+ psDevInfo->sFBInfo.ui32RoundedBufferSize;
+ else
+ psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = 0;
- goto ExitTrueUnlock;
+ if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers == 0) {
+ psDevInfo->sDisplayInfo.ui32MaxSwapChains = 0;
+ psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 0;
+ } else {
+ psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1;
+ psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 3;
}
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
- return IMG_FALSE;
+ psDevInfo->sDisplayInfo.ui32MinSwapInterval = 0;
-ExitTrueUnlock:
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
- return IMG_TRUE;
+ DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
+ ": Maximum number of swap chain buffers: %u\n",
+ psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers));
}
static void SetDevinfo(struct OMAPLFB_DEVINFO *psDevInfo)
psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start;
psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base;
- psPVRFBInfo->ui32Width = psLINFBInfo->var.xres;
- psPVRFBInfo->ui32Height = psLINFBInfo->var.yres;
+ psPVRFBInfo->ui32Width = psLINFBInfo->var.xres_virtual;
psPVRFBInfo->ui32ByteStride = psLINFBInfo->fix.line_length;
psPVRFBInfo->ui32FBSize = FBSize;
- psPVRFBInfo->ui32BufferSize =
- psPVRFBInfo->ui32Height * psPVRFBInfo->ui32ByteStride;
+ /* Try double buffering */
+ psPVRFBInfo->ui32Height = psLINFBInfo->var.yres_virtual >> 1;
+ psPVRFBInfo->ui32BufferSize = psPVRFBInfo->ui32ByteStride *
+ psPVRFBInfo->ui32Height;
psPVRFBInfo->ui32RoundedBufferSize =
- OMAPLFB_PAGE_ROUNDUP(psPVRFBInfo->ui32BufferSize);
+ sgx_buffer_align(psPVRFBInfo->ui32ByteStride,
+ psPVRFBInfo->ui32BufferSize);
+
+ /* If the buffers aren't aligned assume single buffering */
+ if (psPVRFBInfo->ui32BufferSize != psPVRFBInfo->ui32RoundedBufferSize) {
+ psPVRFBInfo->ui32Height = psLINFBInfo->var.yres_virtual;
+ psPVRFBInfo->ui32BufferSize = psPVRFBInfo->ui32ByteStride *
+ psPVRFBInfo->ui32Height;
+ psPVRFBInfo->ui32RoundedBufferSize =
+ sgx_buffer_align(psPVRFBInfo->ui32ByteStride,
+ psPVRFBInfo->ui32BufferSize);
+ }
- if (psLINFBInfo->var.bits_per_pixel == 16)
+ CalcSwapChainSize(psDevInfo);
+
+ if (psLINFBInfo->var.bits_per_pixel == 16) {
if ((psLINFBInfo->var.red.length == 5) &&
(psLINFBInfo->var.green.length == 6) &&
(psLINFBInfo->var.blue.length == 5) &&
psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_RGB565;
else
printk("Unknown FB format\n");
- else
- if (psLINFBInfo->var.bits_per_pixel == 32)
- if ((psLINFBInfo->var.red.length == 8) &&
+ } else if (psLINFBInfo->var.bits_per_pixel == 32) {
+ if ((psLINFBInfo->var.transp.length == 8) &&
+ (psLINFBInfo->var.red.length == 8) &&
(psLINFBInfo->var.green.length == 8) &&
(psLINFBInfo->var.blue.length == 8) &&
+ (psLINFBInfo->var.transp.offset == 24) &&
(psLINFBInfo->var.red.offset == 16) &&
(psLINFBInfo->var.green.offset == 8) &&
(psLINFBInfo->var.blue.offset == 0) &&
- (psLINFBInfo->var.red.msb_right == 0)) {
+ (psLINFBInfo->var.red.msb_right == 0))
psPVRFBInfo->ePixelFormat =
PVRSRV_PIXEL_FORMAT_ARGB8888;
- } else {
+ else if ((psLINFBInfo->var.transp.length == 0) &&
+ (psLINFBInfo->var.red.length == 8) &&
+ (psLINFBInfo->var.green.length == 8) &&
+ (psLINFBInfo->var.blue.length == 8) &&
+ (psLINFBInfo->var.transp.offset == 0) &&
+ (psLINFBInfo->var.red.offset == 16) &&
+ (psLINFBInfo->var.green.offset == 8) &&
+ (psLINFBInfo->var.blue.offset == 0) &&
+ (psLINFBInfo->var.red.msb_right == 0))
+ psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_RGB888;
+ else
printk(KERN_ERR "Unknown FB format\n");
- }
- else
+ } else {
printk(KERN_ERR "Unknown FB format\n");
+ }
psDevInfo->sDisplayFormat.pixelformat = psDevInfo->sFBInfo.ePixelFormat;
psDevInfo->sDisplayDim.ui32Width = psDevInfo->sFBInfo.ui32Width;
acquire_console_sem();
+ fb_unregister_client(&gFBEventsData.notif);
+
psLINFBOwner = psLINFBInfo->fbops->owner;
if (psLINFBInfo->fbops->fb_release != NULL)
if (InitDev(psDevInfo) != PVRSRV_OK)
return PVRSRV_ERROR_INIT_FAILURE;
- if (OMAPLFBGetLibFuncAddr
- ("PVRGetDisplayClassJTable",
+ if (OMAPLFBGetLibFuncAddr("PVRGetDisplayClassJTable",
&pfnGetPVRJTable) != PVRSRV_OK)
return PVRSRV_ERROR_INIT_FAILURE;
if (!(*pfnGetPVRJTable) (&psDevInfo->sPVRJTable))
return PVRSRV_ERROR_INIT_FAILURE;
- spin_lock_init(&psDevInfo->SwapChainLock);
-
psDevInfo->psSwapChain = NULL;
- psDevInfo->bFlushCommands = IMG_FALSE;
- psDevInfo->bDeviceSuspended = IMG_FALSE;
- psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers =
- psDevInfo->sFBInfo.ui32FBSize /
- psDevInfo->sFBInfo.ui32RoundedBufferSize;
- if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers == 0) {
- psDevInfo->sDisplayInfo.ui32MaxSwapChains = 0;
- psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 0;
- } else {
- psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1;
- psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 3;
- }
- psDevInfo->sDisplayInfo.ui32MinSwapInterval = 0;
+ CalcSwapChainSize(psDevInfo);
strncpy(psDevInfo->sDisplayInfo.szDisplayName,
DISPLAY_DEVICE_NAME, MAX_DISPLAY_NAME_SIZE);
- DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
- ": Maximum number of swap chain buffers: %u\n",
- psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers));
-
psDevInfo->sDCJTable.ui32TableSize =
sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE);
+ psDevInfo->sDCJTable.owner = THIS_MODULE;
psDevInfo->sDCJTable.pfnOpenDCDevice = OpenDCDevice;
psDevInfo->sDCJTable.pfnCloseDCDevice = CloseDCDevice;
psDevInfo->sDCJTable.pfnEnumDCFormats = EnumDCFormats;
psDevInfo->sDCJTable.pfnSetDCDstColourKey = SetDCDstColourKey;
psDevInfo->sDCJTable.pfnSetDCSrcColourKey = SetDCSrcColourKey;
psDevInfo->sDCJTable.pfnGetDCBuffers = GetDCBuffers;
- psDevInfo->sDCJTable.pfnSwapToDCBuffer = SwapToDCBuffer;
- psDevInfo->sDCJTable.pfnSwapToDCSystem = SwapToDCSystem;
- psDevInfo->sDCJTable.pfnSetDCState = SetDCState;
+ psDevInfo->sDCJTable.pfnSetDCState = NULL;
if (psDevInfo->sPVRJTable.
pfnPVRSRVRegisterDCDevice(&psDevInfo->sDCJTable,
return PVRSRV_ERROR_GENERIC;
if (psJTable->
- pfnPVRSRVRemoveDCDevice(psDevInfo->ui32DeviceID) !=
+ pfnPVRSRVRemoveDCDevice(psDevInfo->ui32DeviceID) !=
PVRSRV_OK)
return PVRSRV_ERROR_GENERIC;
return PVRSRV_OK;
}
-void OMAPLFBDriverSuspend(void)
-{
- struct OMAPLFB_DEVINFO *psDevInfo = GetAnchorPtr();
- unsigned long ulLockFlags;
-
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
-
- if (psDevInfo->bDeviceSuspended)
- goto ExitUnlock;
- psDevInfo->bDeviceSuspended = IMG_TRUE;
-
- SetFlushStateInternalNoLock(psDevInfo, IMG_TRUE);
-
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-
- if (psDevInfo->psSwapChain != NULL)
- OMAPLFBDisableDisplayRegisterAccess();
-
- return;
-
-ExitUnlock:
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-}
-
-void OMAPLFBDriverResume(void)
-{
- struct OMAPLFB_DEVINFO *psDevInfo = GetAnchorPtr();
- unsigned long ulLockFlags;
-
- if (!psDevInfo->bDeviceSuspended)
- return;
-
- if (psDevInfo->psSwapChain != NULL)
- OMAPLFBEnableDisplayRegisterAccess();
-
- spin_lock_irqsave(&psDevInfo->SwapChainLock, ulLockFlags);
-
- SetFlushStateInternalNoLock(psDevInfo, IMG_FALSE);
-
- psDevInfo->bDeviceSuspended = IMG_FALSE;
-
- spin_unlock_irqrestore(&psDevInfo->SwapChainLock, ulLockFlags);
-}
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/version.h>
#include <linux/module.h>
#include <linux/io.h>
-/*#include <asm/arch-omap/display.h>*/
-
#include "img_defs.h"
#include "servicesext.h"
#include "kerneldisplay.h"
#include "omaplfb.h"
#include "pvrmodule.h"
-#include <mach/display.h>
+#include <plat/display.h>
MODULE_SUPPORTED_DEVICE(DEVNAME);
return PVRSRV_OK;
}
-void OMAPLFBEnableVSyncInterrupt(struct OMAPLFB_SWAPCHAIN *psSwapChain)
-{
-}
-
-void OMAPLFBDisableVSyncInterrupt(struct OMAPLFB_SWAPCHAIN *psSwapChain)
-{
-}
-
-static void OMAPLFBVSyncISR(void *arg, u32 mask)
-{
- (void)OMAPLFBVSyncIHandler((struct OMAPLFB_SWAPCHAIN *)arg);
-}
-
-
-enum PVRSRV_ERROR OMAPLFBInstallVSyncISR(struct OMAPLFB_SWAPCHAIN *psSwapChain)
-{
- if (omap_dispc_register_isr
- (OMAPLFBVSyncISR, psSwapChain, DISPC_IRQ_VSYNC) != 0)
- return PVRSRV_ERROR_OUT_OF_MEMORY;
-
- return PVRSRV_OK;
-}
-
-enum PVRSRV_ERROR OMAPLFBUninstallVSyncISR(
- struct OMAPLFB_SWAPCHAIN *psSwapChain)
-{
- omap_dispc_unregister_isr(OMAPLFBVSyncISR, psSwapChain,
- DISPC_IRQ_VSYNC);
- return PVRSRV_OK;
-}
-
-void OMAPLFBEnableDisplayRegisterAccess(void)
-{
- printk(KERN_WARNING DRIVER_PREFIX
- ": Attempting to call OMAPLFBEnableDisplayRegisterAccess\n");
- /*omap2_disp_get_dss(); */
-}
-
-void OMAPLFBDisableDisplayRegisterAccess(void)
-{
- printk(KERN_WARNING DRIVER_PREFIX
- ": Attempting to call OMAPLFBDisableDisplayRegisterAccess\n");
- /*omap2_disp_put_dss(); */
-}
-
-void OMAPLFBFlip(struct OMAPLFB_SWAPCHAIN *psSwapChain, u32 aPhyAddr)
-{
- omap_dispc_set_plane_ba0(OMAP_DSS_CHANNEL_LCD, OMAP_DSS_GFX, aPhyAddr);
-}
-
-
-static IMG_BOOL bDeviceSuspended;
-
-static void OMAPLFBCommonSuspend(void)
-{
- if (bDeviceSuspended)
- return;
-
- OMAPLFBDriverSuspend();
-
- bDeviceSuspended = IMG_TRUE;
-}
-
-static int OMAPLFBDriverSuspend_Entry(struct platform_device *unref__ pDevice,
- pm_message_t state unref__)
+static int OMAPLFBDriverSuspend_Entry(struct platform_device unref__ * pDevice,
+ pm_message_t unref__ state)
{
DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
": OMAPLFBDriverSuspend_Entry\n"));
-
- OMAPLFBCommonSuspend();
-
return 0;
}
-static int OMAPLFBDriverResume_Entry(struct platform_device *unref__ pDevice)
+static int OMAPLFBDriverResume_Entry(struct platform_device unref__ * pDevice)
{
DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": OMAPLFBDriverResume_Entry\n"));
-
- OMAPLFBDriverResume();
-
- bDeviceSuspended = IMG_FALSE;
-
return 0;
}
-static void OMAPLFBDriverShutdown_Entry(struct platform_device *unref__ pDevice)
+static void OMAPLFBDriverShutdown_Entry(struct platform_device unref__ *
+ pDevice)
{
DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
": OMAPLFBDriverShutdown_Entry\n"));
-
- OMAPLFBCommonSuspend();
}
-static void OMAPLFBDeviceRelease_Entry(struct device *unref__ pDevice)
+static void OMAPLFBDeviceRelease_Entry(struct device unref__ * pDevice)
{
DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX
": OMAPLFBDriverRelease_Entry\n"));
-
- OMAPLFBCommonSuspend();
}
static struct platform_driver omaplfb_driver = {
- .driver = {
+ .driver = {
.name = DRVNAME,
- },
- .suspend = OMAPLFBDriverSuspend_Entry,
- .resume = OMAPLFBDriverResume_Entry,
- .shutdown = OMAPLFBDriverShutdown_Entry,
+ },
+ .suspend = OMAPLFBDriverSuspend_Entry,
+ .resume = OMAPLFBDriverResume_Entry,
+ .shutdown = OMAPLFBDriverShutdown_Entry,
};
static struct platform_device omaplfb_device = {
- .name = DEVNAME,
- .id = -1,
- .dev = {
- .release = OMAPLFBDeviceRelease_Entry}
+ .name = DEVNAME,
+ .id = -1,
+ .dev = {
+ .release = OMAPLFBDeviceRelease_Entry
+ }
};
static int __init OMAPLFB_Init(void)
return -ENODEV;
}
error = platform_driver_register(&omaplfb_driver);
- if (error != 0) {
- printk(KERN_WARNING DRIVER_PREFIX ": OMAPLFB_Init: "
- "Unable to register platform driver (%d)\n",
+ if (error) {
+ printk(KERN_WARNING DRIVER_PREFIX
+ ": OMAPLFB_Init: Unable to register platform driver (%d)\n",
error);
goto ExitDeinit;
}
error = platform_device_register(&omaplfb_device);
- if (error != 0) {
- printk(KERN_WARNING DRIVER_PREFIX ": OMAPLFB_Init: "
- "Unable to register platform device (%d)\n",
+ if (error) {
+ printk(KERN_WARNING DRIVER_PREFIX
+ ": OMAPLFB_Init: Unable to register platform device (%d)\n",
error);
goto ExitDriverUnregister;
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/version.h>
#include <linux/io.h>
#include <asm/page.h>
#include <linux/timer.h>
#include <linux/capability.h>
#include <linux/uaccess.h>
+#include <linux/spinlock.h>
#include "img_types.h"
#include "services_headers.h"
}
#if !defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
-void OSFreeMem(u32 ui32Flags, u32 ui32Size,
- void *pvCpuVAddr, void *hBlockAlloc)
+void OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvCpuVAddr, void *hBlockAlloc)
#else
-void _OSFreeMem(u32 ui32Flags, u32 ui32Size,
- void *pvCpuVAddr, void *hBlockAlloc,
- char *pszFilename, u32 ui32Line)
+void _OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvCpuVAddr,
+ void *hBlockAlloc, char *pszFilename, u32 ui32Line)
#endif
{
PVR_UNREFERENCED_PARAMETER(ui32Flags);
}
}
-enum PVRSRV_ERROR OSAllocPages(u32 ui32AllocFlags,
- u32 ui32Size,
- void **ppvCpuVAddr, void **phOSMemHandle)
+enum PVRSRV_ERROR OSAllocPages(u32 ui32AllocFlags, u32 ui32Size,
+ u32 ui32PageSize, void **ppvCpuVAddr,
+ void **phOSMemHandle)
{
struct LinuxMemArea *psLinuxMemArea;
+ PVR_UNREFERENCED_PARAMETER(ui32PageSize);
switch (ui32AllocFlags & PVRSRV_HAP_MAPTYPE_MASK) {
case PVRSRV_HAP_KERNEL_ONLY:
}
case PVRSRV_HAP_SINGLE_PROCESS:
{
-
psLinuxMemArea =
NewAllocPagesLinuxMemArea(ui32Size, ui32AllocFlags);
if (!psLinuxMemArea)
return PVRSRV_ERROR_OUT_OF_MEMORY;
- PVRMMapRegisterArea("Import Arena", psLinuxMemArea,
- ui32AllocFlags);
+ PVRMMapRegisterArea(psLinuxMemArea);
break;
}
NewVMallocLinuxMemArea(ui32Size, ui32AllocFlags);
if (!psLinuxMemArea)
return PVRSRV_ERROR_OUT_OF_MEMORY;
- PVRMMapRegisterArea("Import Arena", psLinuxMemArea,
- ui32AllocFlags);
+ PVRMMapRegisterArea(psLinuxMemArea);
break;
}
default:
return PVRSRV_ERROR_INVALID_PARAMS;
}
+ if (ui32AllocFlags & (PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_UNCACHED))
+ inv_cache_mem_area(psLinuxMemArea);
+
*ppvCpuVAddr = LinuxMemAreaToCpuVAddr(psLinuxMemArea);
*phOSMemHandle = psLinuxMemArea;
}
enum PVRSRV_ERROR OSFreePages(u32 ui32AllocFlags, u32 ui32Bytes,
- void *pvCpuVAddr, void *hOSMemHandle)
+ void *pvCpuVAddr, void *hOSMemHandle)
{
struct LinuxMemArea *psLinuxMemArea;
+ PVR_UNREFERENCED_PARAMETER(ui32Bytes);
PVR_UNREFERENCED_PARAMETER(pvCpuVAddr);
psLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
case PVRSRV_HAP_MULTI_PROCESS:
if (PVRMMapRemoveRegisteredArea(psLinuxMemArea) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "OSFreePages(ui32AllocFlags=0x%08X, "
- "ui32Bytes=%ld, "
+ "OSFreePages(ui32AllocFlags=0x%08X, ui32Bytes=%ld, "
"pvCpuVAddr=%p, hOSMemHandle=%p) FAILED!",
ui32AllocFlags, ui32Bytes, pvCpuVAddr,
hOSMemHandle);
return PVRSRV_OK;
}
-enum PVRSRV_ERROR OSGetSubMemHandle(void *hOSMemHandle,
- u32 ui32ByteOffset,
- u32 ui32Bytes,
- u32 ui32Flags, void **phOSMemHandleRet)
+enum PVRSRV_ERROR OSGetSubMemHandle(void *hOSMemHandle, u32 ui32ByteOffset,
+ u32 ui32Bytes, u32 ui32Flags,
+ void **phOSMemHandleRet)
{
struct LinuxMemArea *psParentLinuxMemArea, *psLinuxMemArea;
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
psParentLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
if (ui32Flags & PVRSRV_HAP_KERNEL_ONLY)
return PVRSRV_OK;
- if (psParentLinuxMemArea->eAreaType == LINUX_MEM_AREA_IO) {
- eError = PVRMMapRegisterArea("Physical", psLinuxMemArea, 0);
+ eError = PVRMMapRegisterArea(psLinuxMemArea);
if (eError != PVRSRV_OK)
goto failed_register_area;
- } else if (psParentLinuxMemArea->eAreaType ==
- LINUX_MEM_AREA_ALLOC_PAGES) {
- eError = PVRMMapRegisterArea("Import Arena", psLinuxMemArea, 0);
- if (eError != PVRSRV_OK)
- goto failed_register_area;
- }
return PVRSRV_OK;
enum PVRSRV_ERROR OSReleaseSubMemHandle(void *hOSMemHandle, u32 ui32Flags)
{
- struct LinuxMemArea *psParentLinuxMemArea, *psLinuxMemArea;
+ struct LinuxMemArea *psLinuxMemArea;
enum PVRSRV_ERROR eError;
psLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
PVR_ASSERT(psLinuxMemArea->eAreaType == LINUX_MEM_AREA_SUB_ALLOC);
- psParentLinuxMemArea =
- psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea;
-
- if (!(ui32Flags & PVRSRV_HAP_KERNEL_ONLY)
- && (psParentLinuxMemArea->eAreaType == LINUX_MEM_AREA_IO
- || psParentLinuxMemArea->eAreaType ==
- LINUX_MEM_AREA_ALLOC_PAGES)
- ) {
+ if ((ui32Flags & PVRSRV_HAP_KERNEL_ONLY) == 0) {
eError = PVRMMapRemoveRegisteredArea(psLinuxMemArea);
if (eError != PVRSRV_OK)
return eError;
} else {
PVR_DPF(PVR_DBG_MESSAGE, "OSBreakResourceLock: "
"Resource is not locked for this process.");
- }
- else
- PVR_DPF(PVR_DBG_MESSAGE,
- "OSBreakResourceLock: Resource is not locked");
+ } else
+ PVR_DPF(PVR_DBG_MESSAGE, "OSBreakResourceLock: "
+ "Resource is not locked");
}
enum PVRSRV_ERROR OSCreateResource(struct PVRSRV_RESOURCE *psResource)
u32 OSClockus(void)
{
- unsigned long time, j = jiffies;
+ u32 time, j = jiffies;
time = j * (1000000 / HZ);
{
if (in_interrupt())
return KERNEL_ID;
- return task_tgid_nr(current);
+
+ return (u32) task_tgid_nr(current);
}
u32 OSGetPageSize(void)
{
struct PVRSRV_DEVICE_NODE *psDeviceNode;
IMG_BOOL bStatus = IMG_FALSE;
+ PVR_UNREFERENCED_PARAMETER(irq);
psDeviceNode = (struct PVRSRV_DEVICE_NODE *)dev_id;
if (!psDeviceNode) {
PVR_TRACE("Installing device LISR %s on IRQ %d with cookie %x",
pszISRName, ui32Irq, pvDeviceNode);
- if (request_irq(ui32Irq, DeviceISRWrapper, IRQF_SHARED, pszISRName,
- pvDeviceNode)) {
+ if (request_irq(ui32Irq, DeviceISRWrapper,
+ IRQF_SHARED, pszISRName, pvDeviceNode)) {
PVR_DPF(PVR_DBG_ERROR, "OSInstallDeviceLISR: "
- "Couldn't install device LISR on IRQ %d",
+ "Couldn't install device LISR on IRQ %d",
ui32Irq);
return PVRSRV_ERROR_GENERIC;
return eError;
}
+IMG_BOOL OSIsResourceLocked(struct PVRSRV_RESOURCE *psResource, u32 ui32ID)
+{
+ volatile u32 *pui32Access = (volatile u32 *)&psResource->ui32Lock;
+
+ return (*(volatile u32 *)pui32Access == 1) &&
+ (psResource->ui32ID == ui32ID) ? IMG_TRUE : IMG_FALSE;
+}
+
struct IMG_CPU_PHYADDR OSMapLinToCPUPhys(void *pvLinAddr)
{
struct IMG_CPU_PHYADDR CpuPAddr;
return NULL;
return pvIORemapCookie;
} else {
- PVR_DPF(PVR_DBG_ERROR,
- "OSMapPhysToLin should only be used with "
- "PVRSRV_HAP_KERNEL_ONLY "
+ PVR_DPF(PVR_DBG_ERROR, "OSMapPhysToLin "
+ "should only be used with PVRSRV_HAP_KERNEL_ONLY "
"(Use OSReservePhys otherwise)");
- *phOSMemHandle = (void *) 0;
return NULL;
}
- PVR_ASSERT(0);
- return NULL;
}
IMG_BOOL
ui32Bytes, pvLinAddr);
PVR_UNREFERENCED_PARAMETER(hPageAlloc);
+ PVR_UNREFERENCED_PARAMETER(ui32Bytes);
if (ui32MappingFlags & PVRSRV_HAP_KERNEL_ONLY) {
IOUnmapWrapper(pvLinAddr);
return IMG_TRUE;
} else {
- PVR_DPF(PVR_DBG_ERROR,
- "OSUnMapPhysToLin should only be used with "
- "PVRSRV_HAP_KERNEL_ONLY "
+ PVR_DPF(PVR_DBG_ERROR, "OSUnMapPhysToLin "
+ "should only be used with PVRSRV_HAP_KERNEL_ONLY "
" (Use OSUnReservePhys otherwise)");
return IMG_FALSE;
}
- PVR_ASSERT(0);
- return IMG_FALSE;
}
static enum PVRSRV_ERROR RegisterExternalMem(struct IMG_SYS_PHYADDR *pBasePAddr,
- void *pvCPUVAddr, u32 ui32Bytes,
- IMG_BOOL bPhysContig, u32 ui32MappingFlags,
- void **phOSMemHandle)
+ void *pvCPUVAddr, u32 ui32Bytes, IMG_BOOL bPhysContig,
+ u32 ui32MappingFlags, void **phOSMemHandle)
{
struct LinuxMemArea *psLinuxMemArea;
if (!psLinuxMemArea)
return PVRSRV_ERROR_GENERIC;
- PVRMMapRegisterArea("Physical", psLinuxMemArea,
- ui32MappingFlags);
+ PVRMMapRegisterArea(psLinuxMemArea);
break;
}
case PVRSRV_HAP_MULTI_PROCESS:
if (!psLinuxMemArea)
return PVRSRV_ERROR_GENERIC;
- PVRMMapRegisterArea("Physical", psLinuxMemArea,
- ui32MappingFlags);
+ PVRMMapRegisterArea(psLinuxMemArea);
break;
}
default:
}
enum PVRSRV_ERROR OSRegisterMem(struct IMG_CPU_PHYADDR BasePAddr,
- void *pvCPUVAddr,
- u32 ui32Bytes,
- u32 ui32MappingFlags, void **phOSMemHandle)
+ void *pvCPUVAddr, u32 ui32Bytes,
+ u32 ui32MappingFlags, void **phOSMemHandle)
{
struct IMG_SYS_PHYADDR SysPAddr = SysCpuPAddrToSysPAddr(BasePAddr);
}
enum PVRSRV_ERROR OSRegisterDiscontigMem(struct IMG_SYS_PHYADDR *pBasePAddr,
- void *pvCPUVAddr, u32 ui32Bytes,
- u32 ui32MappingFlags,
- void **phOSMemHandle)
+ void *pvCPUVAddr, u32 ui32Bytes,
+ u32 ui32MappingFlags,
+ void **phOSMemHandle)
{
return RegisterExternalMem(pBasePAddr, pvCPUVAddr, ui32Bytes,
IMG_FALSE, ui32MappingFlags, phOSMemHandle);
}
-enum PVRSRV_ERROR OSUnRegisterMem(void *pvCpuVAddr,
- u32 ui32Bytes,
- u32 ui32MappingFlags, void *hOSMemHandle)
+enum PVRSRV_ERROR OSUnRegisterMem(void *pvCpuVAddr, u32 ui32Bytes,
+ u32 ui32MappingFlags, void *hOSMemHandle)
{
struct LinuxMemArea *psLinuxMemArea = (struct LinuxMemArea *)
hOSMemHandle;
PVR_UNREFERENCED_PARAMETER(pvCpuVAddr);
+ PVR_UNREFERENCED_PARAMETER(ui32Bytes);
switch (ui32MappingFlags & PVRSRV_HAP_MAPTYPE_MASK) {
case PVRSRV_HAP_KERNEL_ONLY:
"%s(%p, %d, 0x%08X, %p) FAILED!",
__func__, pvCpuVAddr, ui32Bytes,
ui32MappingFlags, hOSMemHandle);
+ BUG();
return PVRSRV_ERROR_GENERIC;
}
break;
switch (ui32MappingFlags & PVRSRV_HAP_MAPTYPE_MASK) {
case PVRSRV_HAP_KERNEL_ONLY:
{
-
psLinuxMemArea =
NewIORemapLinuxMemArea(BasePAddr, ui32Bytes,
ui32MappingFlags);
ui32MappingFlags);
if (!psLinuxMemArea)
return PVRSRV_ERROR_GENERIC;
- PVRMMapRegisterArea("Physical", psLinuxMemArea,
- ui32MappingFlags);
+ PVRMMapRegisterArea(psLinuxMemArea);
break;
}
case PVRSRV_HAP_MULTI_PROCESS:
ui32MappingFlags);
if (!psLinuxMemArea)
return PVRSRV_ERROR_GENERIC;
- PVRMMapRegisterArea("Physical", psLinuxMemArea,
- ui32MappingFlags);
+ PVRMMapRegisterArea(psLinuxMemArea);
break;
}
default:
{
struct LinuxMemArea *psLinuxMemArea;
PVR_UNREFERENCED_PARAMETER(pvCpuVAddr);
+ PVR_UNREFERENCED_PARAMETER(ui32Bytes);
psLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
enum PVRSRV_ERROR OSBaseAllocContigMemory(u32 ui32Size, void **pvLinAddr,
struct IMG_CPU_PHYADDR *psPhysAddr)
{
+#if !defined(NO_HARDWARE)
PVR_UNREFERENCED_PARAMETER(ui32Size);
PVR_UNREFERENCED_PARAMETER(pvLinAddr);
PVR_UNREFERENCED_PARAMETER(psPhysAddr);
PVR_DPF(PVR_DBG_ERROR, "%s: Not available", __func__);
return PVRSRV_ERROR_OUT_OF_MEMORY;
+#else
+ void *pvKernLinAddr;
+
+#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
+ pvKernLinAddr = _KMallocWrapper(ui32Size, __FILE__, __LINE__);
+#else
+ pvKernLinAddr = KMallocWrapper(ui32Size);
+#endif
+ if (!pvKernLinAddr)
+ return PVRSRV_ERROR_OUT_OF_MEMORY;
+
+ *pvLinAddr = pvKernLinAddr;
+
+ psPhysAddr->uiAddr = virt_to_phys(pvKernLinAddr);
+
+ return PVRSRV_OK;
+#endif
}
enum PVRSRV_ERROR OSBaseFreeContigMemory(u32 ui32Size, void *pvLinAddr,
struct IMG_CPU_PHYADDR psPhysAddr)
{
+#if !defined(NO_HARDWARE)
PVR_UNREFERENCED_PARAMETER(ui32Size);
PVR_UNREFERENCED_PARAMETER(pvLinAddr);
- PVR_UNREFERENCED_PARAMETER(psPhysAddr);
+ PVR_UNREFERENCED_PARAMETER(psPhysAddr.uiAddr);
PVR_DPF(PVR_DBG_WARNING, "%s: Not available", __func__);
+#else
+ PVR_UNREFERENCED_PARAMETER(ui32Size);
+ PVR_UNREFERENCED_PARAMETER(psPhysAddr.uiAddr);
+
+ KFreeWrapper(pvLinAddr);
+#endif
return PVRSRV_OK;
}
u32 OSReadHWReg(void __iomem *pvLinRegBaseAddr, u32 ui32Offset)
{
+#if !defined(NO_HARDWARE)
return (u32)readl(pvLinRegBaseAddr + ui32Offset);
+#else
+ return *(u32 *)((u8 *) pvLinRegBaseAddr + ui32Offset);
+#endif
}
void OSWriteHWReg(void __iomem *pvLinRegBaseAddr, u32 ui32Offset, u32 ui32Value)
{
+#if !defined(NO_HARDWARE)
writel(ui32Value, pvLinRegBaseAddr + ui32Offset);
+#else
+ *(u32 *)((u8 *)pvLinRegBaseAddr + ui32Offset) = ui32Value;
+#endif
}
+#define OS_MAX_TIMERS 8
+
struct TIMER_CALLBACK_DATA {
+ IMG_BOOL bInUse;
void (*pfnTimerFunc)(void *);
void *pvData;
struct timer_list sTimer;
IMG_BOOL bActive;
};
+static struct TIMER_CALLBACK_DATA sTimers[OS_MAX_TIMERS];
+static DEFINE_SPINLOCK(sTimerStructLock);
static void OSTimerCallbackWrapper(unsigned long ui32Data)
{
struct TIMER_CALLBACK_DATA *psTimerCBData =
void *OSAddTimer(void (*pfnTimerFunc)(void *), void *pvData, u32 ui32MsTimeout)
{
struct TIMER_CALLBACK_DATA *psTimerCBData;
+ u32 ui32i;
+ unsigned long ulLockFlags;
if (!pfnTimerFunc) {
PVR_DPF(PVR_DBG_ERROR, "OSAddTimer: passed invalid callback");
return NULL;
}
- if (OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(struct TIMER_CALLBACK_DATA),
- (void **) &psTimerCBData, NULL) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "OSAddTimer: failed to allocate memory");
+ spin_lock_irqsave(&sTimerStructLock, ulLockFlags);
+ for (ui32i = 0; ui32i < OS_MAX_TIMERS; ui32i++) {
+ psTimerCBData = &sTimers[ui32i];
+ if (!psTimerCBData->bInUse) {
+ psTimerCBData->bInUse = IMG_TRUE;
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&sTimerStructLock, ulLockFlags);
+
+ if (ui32i >= OS_MAX_TIMERS) {
+ PVR_DPF(PVR_DBG_ERROR, "OSAddTimer: all timers are in use");
return NULL;
}
psTimerCBData->sTimer.data = (u32) psTimerCBData;
psTimerCBData->sTimer.expires = psTimerCBData->ui32Delay + jiffies;
- return (void *)psTimerCBData;
+ return (void *)(ui32i + 1);
+}
+
+static inline struct TIMER_CALLBACK_DATA *GetTimerStructure(void *hTimer)
+{
+ u32 ui32i = ((u32) hTimer) - 1;
+ PVR_ASSERT(ui32i < OS_MAX_TIMERS);
+ return &sTimers[ui32i];
}
enum PVRSRV_ERROR OSRemoveTimer(void *hTimer)
{
- struct TIMER_CALLBACK_DATA *psTimerCBData =
- (struct TIMER_CALLBACK_DATA *)hTimer;
+ struct TIMER_CALLBACK_DATA *psTimerCBData = GetTimerStructure(hTimer);
+
+ PVR_ASSERT(psTimerCBData->bInUse);
+ PVR_ASSERT(!psTimerCBData->bActive);
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(struct TIMER_CALLBACK_DATA),
- psTimerCBData, NULL);
+ /* free timer callback data struct */
+ psTimerCBData->bInUse = IMG_FALSE;
return PVRSRV_OK;
}
enum PVRSRV_ERROR OSEnableTimer(void *hTimer)
{
- struct TIMER_CALLBACK_DATA *psTimerCBData =
- (struct TIMER_CALLBACK_DATA *)hTimer;
+ struct TIMER_CALLBACK_DATA *psTimerCBData = GetTimerStructure(hTimer);
+
+ PVR_ASSERT(psTimerCBData->bInUse);
+ PVR_ASSERT(!psTimerCBData->bActive);
psTimerCBData->bActive = IMG_TRUE;
- psTimerCBData->sTimer.expires = psTimerCBData->ui32Delay + jiffies;
add_timer(&psTimerCBData->sTimer);
return PVRSRV_OK;
enum PVRSRV_ERROR OSDisableTimer(void *hTimer)
{
- struct TIMER_CALLBACK_DATA *psTimerCBData =
- (struct TIMER_CALLBACK_DATA *)hTimer;
+ struct TIMER_CALLBACK_DATA *psTimerCBData = GetTimerStructure(hTimer);
+
+ PVR_ASSERT(psTimerCBData->bInUse);
+ PVR_ASSERT(psTimerCBData->bActive);
psTimerCBData->bActive = IMG_FALSE;
if (psEventObject) {
if (pszName) {
-
strncpy(psEventObject->szName, pszName,
EVENTOBJNAME_MAXLENGTH);
} else {
-
static u16 ui16NameIndex;
snprintf(psEventObject->szName, EVENTOBJNAME_MAXLENGTH,
"PVRSRV_EVENTOBJECT_%d", ui16NameIndex++);
} else {
PVR_DPF(PVR_DBG_ERROR, "OSEventObjectCreate: "
- "psEventObject is not a valid pointer");
+ "psEventObject is not a valid pointer");
eError = PVRSRV_ERROR_GENERIC;
}
LinuxEventObjectListDestroy(psEventObject->hOSEventKM);
} else {
PVR_DPF(PVR_DBG_ERROR, "OSEventObjectDestroy: "
- "hOSEventKM is not a valid pointer");
+ "hOSEventKM is not a valid pointer");
eError = PVRSRV_ERROR_INVALID_PARAMS;
}
} else {
PVR_DPF(PVR_DBG_ERROR, "OSEventObjectDestroy: "
- "psEventObject is not a valid pointer");
+ "psEventObject is not a valid pointer");
eError = PVRSRV_ERROR_INVALID_PARAMS;
}
enum PVRSRV_ERROR OSEventObjectWait(void *hOSEventKM)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
if (hOSEventKM) {
eError =
LinuxEventObjectWait(hOSEventKM, EVENT_OBJECT_TIMEOUT_MS);
} else {
- PVR_DPF(PVR_DBG_ERROR, "OSEventObjectWait: "
- "hOSEventKM is not a valid handle");
+ PVR_DPF(PVR_DBG_ERROR,
+ "OSEventObjectWait: hOSEventKM is not a valid handle");
eError = PVRSRV_ERROR_INVALID_PARAMS;
}
} else {
PVR_DPF(PVR_DBG_ERROR, "OSEventObjectCreate: "
- "psEventObject is not a valid pointer");
+ "psEventObject is not a valid pointer");
eError = PVRSRV_ERROR_INVALID_PARAMS;
}
} else {
PVR_DPF(PVR_DBG_ERROR, "OSEventObjectDestroy: "
- "psEventObject is not a valid pointer");
+ "psEventObject is not a valid pointer");
eError = PVRSRV_ERROR_INVALID_PARAMS;
}
enum PVRSRV_ERROR OSEventObjectSignal(void *hOSEventKM)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
if (hOSEventKM) {
eError = LinuxEventObjectSignal(hOSEventKM);
} else {
PVR_DPF(PVR_DBG_ERROR, "OSEventObjectSignal: "
- "hOSEventKM is not a valid handle");
+ "hOSEventKM is not a valid handle");
eError = PVRSRV_ERROR_INVALID_PARAMS;
}
IMG_BOOL OSProcHasPrivSrvInit(void)
{
- return capable(CAP_SYS_MODULE) != 0;
+ return (capable(CAP_SYS_MODULE) != 0) ? IMG_TRUE : IMG_FALSE;
}
enum PVRSRV_ERROR OSCopyToUser(void *pvProcess, void __user *pvDest,
{
int linuxType;
- if (eVerification == PVR_VERIFY_READ)
+ if (eVerification == PVR_VERIFY_READ) {
linuxType = VERIFY_READ;
- else if (eVerification == PVR_VERIFY_WRITE)
+ } else {
+ PVR_ASSERT(eVerification == PVR_VERIFY_WRITE);
linuxType = VERIFY_WRITE;
- else {
- PVR_DPF(PVR_DBG_ERROR, "%s: Unknown eVerification", __func__);
- return PVRSRV_ERROR_GENERIC;
}
- return (IMG_BOOL)access_ok(linuxType, pvUserPtr, ui32Bytes);
+
+ return access_ok(linuxType, pvUserPtr, ui32Bytes);
}
enum eWrapMemType {
int iPageOffset;
int iContiguous;
#if defined(DEBUG)
- unsigned long ulStartAddr;
- unsigned long ulBeyondEndAddr;
+ u32 ulStartAddr;
+ u32 ulBeyondEndAddr;
struct vm_area_struct *psVMArea;
#endif
};
static void CheckPagesContiguous(struct sWrapMemInfo *psInfo)
{
- unsigned ui;
+ int i;
u32 ui32AddrChk;
BUG_ON(psInfo == NULL);
psInfo->iContiguous = 1;
- for (ui = 0, ui32AddrChk = psInfo->psPhysAddr[0].uiAddr;
- ui < psInfo->iNumPages; ui++, ui32AddrChk += PAGE_SIZE)
- if (psInfo->psPhysAddr[ui].uiAddr != ui32AddrChk) {
+ for (i = 0, ui32AddrChk = psInfo->psPhysAddr[0].uiAddr;
+ i < psInfo->iNumPages; i++, ui32AddrChk += PAGE_SIZE)
+ if (psInfo->psPhysAddr[i].uiAddr != ui32AddrChk) {
psInfo->iContiguous = 0;
break;
}
}
static struct page *CPUVAddrToPage(struct vm_area_struct *psVMArea,
- unsigned long ulCPUVAddr)
+ u32 ulCPUVAddr)
{
pgd_t *psPGD;
pud_t *psPUD;
pmd_t *psPMD;
pte_t *psPTE;
struct mm_struct *psMM = psVMArea->vm_mm;
- unsigned long ulPFN;
+ u32 ulPFN;
spinlock_t *psPTLock;
struct page *psPage;
psPage = NULL;
- psPTE = pte_offset_map_lock(psMM, psPMD, ulCPUVAddr, &psPTLock);
- if (pte_none(*psPTE) || !pte_present(*psPTE) || !pte_write(*psPTE))
+ psPTE = (pte_t *)pte_offset_map_lock(psMM, psPMD, ulCPUVAddr,
+ &psPTLock);
+ if ((pte_none(*psPTE) != 0) || (pte_present(*psPTE) == 0) ||
+ (pte_write(*psPTE) == 0))
goto exit_unlock;
ulPFN = pte_pfn(*psPTE);
return psPage;
}
-enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem, IMG_BOOL bUseLock)
+enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem)
{
struct sWrapMemInfo *psInfo = (struct sWrapMemInfo *)hOSWrapMem;
- unsigned ui;
+ int i;
BUG_ON(psInfo == NULL);
-#if defined(DEBUG)
- switch (psInfo->eType) {
- case WRAP_TYPE_FIND_VMA_PAGES:
-
- case WRAP_TYPE_FIND_VMA_PFN:
- {
- struct vm_area_struct *psVMArea;
-
- if (bUseLock)
- down_read(¤t->mm->mmap_sem);
-
- psVMArea = find_vma(current->mm, psInfo->ulStartAddr);
- if (psVMArea == NULL) {
- printk(KERN_WARNING ": OSCpuVToPageListRelease:"
- " Couldn't find memory region containing start address %lx",
- psInfo->ulStartAddr);
-
- if (bUseLock)
- up_read(¤t->mm->mmap_sem);
-
- break;
- }
-
- if (psInfo->psVMArea != psVMArea)
- printk(KERN_WARNING ": OSCpuVToPageListRelease:"
- " vm_area_struct has a different "
- "address from the one used in "
- "ImportMem (%p != %p)",
- psVMArea, psInfo->psVMArea);
-
- if (psInfo->ulStartAddr < psVMArea->vm_start)
- printk(KERN_WARNING ": OSCpuVToPageListRelease:"
- " Start address %lx is outside of "
- "the region returned by find_vma",
- psInfo->ulStartAddr);
-
- if (psInfo->ulBeyondEndAddr > psVMArea->vm_end)
- printk(KERN_WARNING ": OSCpuVToPageListRelease:"
- " End address %lx is outside of the "
- "region returned by find_vma",
- psInfo->ulBeyondEndAddr);
-
- if ((psVMArea->vm_flags & (VM_IO | VM_RESERVED)) !=
- (VM_IO | VM_RESERVED))
- printk(KERN_WARNING ": OSCpuVToPageListRelease:"
- " Memory region does not represent "
- "memory mapped I/O (VMA flags: 0x%lx)",
- psVMArea->vm_flags);
-
- if ((psVMArea->vm_flags & (VM_READ | VM_WRITE)) !=
- (VM_READ | VM_WRITE))
- printk(KERN_WARNING ": OSCpuVToPageListRelease:"
- " OSWrapMemReleasePages: "
- "No read/write access to memory region "
- "(VMA flags: 0x%lx)",
- psVMArea->vm_flags);
-
- if (bUseLock)
- up_read(¤t->mm->mmap_sem);
-
- break;
- }
- default:
- break;
- }
-#endif
-
switch (psInfo->eType) {
case WRAP_TYPE_CLEANUP:
break;
break;
case WRAP_TYPE_GET_USER_PAGES:
{
- for (ui = 0; ui < psInfo->iNumPages; ui++) {
- struct page *psPage = psInfo->ppsPages[ui];
+ for (i = 0; i < psInfo->iNumPages; i++) {
+ struct page *psPage = psInfo->ppsPages[i];
if (!PageReserved(psPage))
- ;
- {
SetPageDirty(psPage);
- }
page_cache_release(psPage);
}
break;
}
case WRAP_TYPE_FIND_VMA_PAGES:
{
- for (ui = 0; ui < psInfo->iNumPages; ui++)
- put_page_testzero(psInfo->ppsPages[ui]);
+ for (i = 0; i < psInfo->iNumPages; i++)
+ put_page_testzero(psInfo->ppsPages[i]);
break;
}
default:
{
- printk(KERN_WARNING ": OSCpuVToPageListRelease: "
- "Unknown wrap type (%d)", psInfo->eType);
+ PVR_DPF(PVR_DBG_ERROR,
+ "OSReleasePhysPageAddr: Unknown wrap type (%d)",
+ psInfo->eType);
return PVRSRV_ERROR_GENERIC;
}
}
return PVRSRV_OK;
}
-enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr,
- u32 ui32Bytes,
- struct IMG_SYS_PHYADDR *psSysPAddr,
- void **phOSWrapMem,
- IMG_BOOL bUseLock)
+enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr, u32 ui32Bytes,
+ struct IMG_SYS_PHYADDR *psSysPAddr,
+ void **phOSWrapMem)
{
- unsigned long ulStartAddrOrig = (unsigned long)pvCPUVAddr;
- unsigned long ulAddrRangeOrig = (unsigned long)ui32Bytes;
- unsigned long ulBeyondEndAddrOrig = ulStartAddrOrig + ulAddrRangeOrig;
- unsigned long ulStartAddr;
- unsigned long ulAddrRange;
- unsigned long ulBeyondEndAddr;
- unsigned long ulAddr;
+ u32 ulStartAddrOrig = (u32) pvCPUVAddr;
+ u32 ulAddrRangeOrig = (u32) ui32Bytes;
+ u32 ulBeyondEndAddrOrig = ulStartAddrOrig + ulAddrRangeOrig;
+ u32 ulStartAddr;
+ u32 ulAddrRange;
+ u32 ulBeyondEndAddr;
+ u32 ulAddr;
int iNumPagesMapped;
- unsigned ui;
+ int i;
struct vm_area_struct *psVMArea;
struct sWrapMemInfo *psInfo;
psInfo = kmalloc(sizeof(*psInfo), GFP_KERNEL);
if (psInfo == NULL) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "Couldn't allocate information structure\n");
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "Couldn't allocate information structure");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
memset(psInfo, 0, sizeof(*psInfo));
psInfo->ulBeyondEndAddr = ulBeyondEndAddrOrig;
#endif
- psInfo->iNumPages = ulAddrRange >> PAGE_SHIFT;
- psInfo->iPageOffset = ulStartAddrOrig & ~PAGE_MASK;
+ psInfo->iNumPages = (int)(ulAddrRange >> PAGE_SHIFT);
+ psInfo->iPageOffset = (int)(ulStartAddrOrig & ~PAGE_MASK);
psInfo->psPhysAddr =
- kmalloc(psInfo->iNumPages * sizeof(*psInfo->psPhysAddr),
+ kmalloc((size_t) psInfo->iNumPages * sizeof(*psInfo->psPhysAddr),
GFP_KERNEL);
if (psInfo->psPhysAddr == NULL) {
- printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't allocate page array\n");
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "Couldn't allocate page array");
goto error_free;
}
psInfo->ppsPages =
- kmalloc(psInfo->iNumPages * sizeof(*psInfo->ppsPages), GFP_KERNEL);
+ kmalloc((size_t) psInfo->iNumPages * sizeof(*psInfo->ppsPages),
+ GFP_KERNEL);
if (psInfo->ppsPages == NULL) {
- printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't allocate page array\n");
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "Couldn't allocate page array");
goto error_free;
}
- if (bUseLock)
- down_read(¤t->mm->mmap_sem);
+ down_read(¤t->mm->mmap_sem);
- iNumPagesMapped =
- get_user_pages(current, current->mm, ulStartAddr, psInfo->iNumPages,
- 1, 0, psInfo->ppsPages, NULL);
-
- if (bUseLock)
- up_read(¤t->mm->mmap_sem);
+ iNumPagesMapped = get_user_pages(current, current->mm, ulStartAddr,
+ psInfo->iNumPages, 1, 0,
+ psInfo->ppsPages, NULL);
+ up_read(¤t->mm->mmap_sem);
if (iNumPagesMapped >= 0) {
-
if (iNumPagesMapped != psInfo->iNumPages) {
- printk(KERN_WARNING ": OSCpuVToPageList: Couldn't "
- "map all the pages needed "
- "(wanted: %d, got %d \n)",
+ PVR_TRACE("OSAcquirePhysPageAddr: "
+ "Couldn't map all the pages needed "
+ "(wanted: %d, got %d)",
psInfo->iNumPages, iNumPagesMapped);
- for (ui = 0; ui < iNumPagesMapped; ui++)
- page_cache_release(psInfo->ppsPages[ui]);
+ for (i = 0; i < iNumPagesMapped; i++)
+ page_cache_release(psInfo->ppsPages[i]);
goto error_free;
}
- for (ui = 0; ui < psInfo->iNumPages; ui++) {
+ for (i = 0; i < psInfo->iNumPages; i++) {
struct IMG_CPU_PHYADDR CPUPhysAddr;
CPUPhysAddr.uiAddr =
- page_to_pfn(psInfo->ppsPages[ui]) << PAGE_SHIFT;
- psInfo->psPhysAddr[ui] =
+ page_to_pfn(psInfo->ppsPages[i]) << PAGE_SHIFT;
+ psInfo->psPhysAddr[i] =
SysCpuPAddrToSysPAddr(CPUPhysAddr);
- psSysPAddr[ui] = psInfo->psPhysAddr[ui];
+ psSysPAddr[i] = psInfo->psPhysAddr[i];
}
goto exit_check;
}
- printk(KERN_WARNING ": OSCpuVToPageList: get_user_pages failed (%d), "
- "trying something else \n",
+ PVR_TRACE("OSAcquirePhysPageAddr: "
+ "get_user_pages failed (%d), trying something else",
iNumPagesMapped);
- if (bUseLock)
- down_read(¤t->mm->mmap_sem);
+ down_read(¤t->mm->mmap_sem);
psVMArea = find_vma(current->mm, ulStartAddrOrig);
if (psVMArea == NULL) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "Couldn't find memory region containing "
- "start address %lx \n",
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "Couldn't find memory region "
+ "containing start address %lx",
ulStartAddrOrig);
goto error_release_mmap_sem;
#endif
if (ulStartAddrOrig < psVMArea->vm_start) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
"Start address %lx is outside of the "
- "region returned by find_vma\n",
+ "region returned by find_vma",
ulStartAddrOrig);
goto error_release_mmap_sem;
}
if (ulBeyondEndAddrOrig > psVMArea->vm_end) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "End address %lx is outside of the "
- "region returned by find_vma\n",
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "End address %lx is outside of the region "
+ "returned by find_vma",
ulBeyondEndAddrOrig);
goto error_release_mmap_sem;
}
if ((psVMArea->vm_flags & (VM_IO | VM_RESERVED)) !=
(VM_IO | VM_RESERVED)) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "Memory region does not represent "
- "memory mapped I/O (VMA flags: 0x%lx)\n",
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "Memory region does not represent memory "
+ "mapped I/O (VMA flags: 0x%lx)",
psVMArea->vm_flags);
goto error_release_mmap_sem;
}
if ((psVMArea->vm_flags & (VM_READ | VM_WRITE)) !=
(VM_READ | VM_WRITE)) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "No read/write access to memory region "
- "(VMA flags: 0x%lx)\n",
+ PVR_DPF(PVR_DBG_ERROR, "OSAcquirePhysPageAddr: "
+ "No read/write access to memory region "
+ "(VMA flags: 0x%lx)",
psVMArea->vm_flags);
goto error_release_mmap_sem;
}
- for (ulAddr = ulStartAddrOrig, ui = 0; ulAddr < ulBeyondEndAddrOrig;
- ulAddr += PAGE_SIZE, ui++) {
+ for (ulAddr = ulStartAddrOrig, i = 0; ulAddr < ulBeyondEndAddrOrig;
+ ulAddr += PAGE_SIZE, i++) {
struct page *psPage;
- BUG_ON(ui >= psInfo->iNumPages);
+ BUG_ON(i >= psInfo->iNumPages);
psPage = CPUVAddrToPage(psVMArea, ulAddr);
if (psPage == NULL) {
- unsigned uj;
+ int j;
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "Couldn't lookup page structure for "
- "address 0x%lx, trying something else\n",
+ PVR_TRACE("OSAcquirePhysPageAddr: "
+ "Couldn't lookup page structure "
+ "for address 0x%lx, trying something else",
ulAddr);
- for (uj = 0; uj < ui; uj++)
- put_page_testzero(psInfo->ppsPages[uj]);
+ for (j = 0; j < i; j++)
+ put_page_testzero(psInfo->ppsPages[j]);
break;
}
- psInfo->ppsPages[ui] = psPage;
+ psInfo->ppsPages[i] = psPage;
}
- BUG_ON(ui > psInfo->iNumPages);
- if (ui == psInfo->iNumPages) {
-
- for (ui = 0; ui < psInfo->iNumPages; ui++) {
- struct page *psPage = psInfo->ppsPages[ui];
+ BUG_ON(i > psInfo->iNumPages);
+ if (i == psInfo->iNumPages) {
+ for (i = 0; i < psInfo->iNumPages; i++) {
+ struct page *psPage = psInfo->ppsPages[i];
struct IMG_CPU_PHYADDR CPUPhysAddr;
CPUPhysAddr.uiAddr = page_to_pfn(psPage) << PAGE_SHIFT;
- psInfo->psPhysAddr[ui] =
+ psInfo->psPhysAddr[i] =
SysCpuPAddrToSysPAddr(CPUPhysAddr);
- psSysPAddr[ui] = psInfo->psPhysAddr[ui];
+ psSysPAddr[i] = psInfo->psPhysAddr[i];
}
psInfo->eType = WRAP_TYPE_FIND_VMA_PAGES;
} else {
if ((psVMArea->vm_flags & VM_PFNMAP) == 0) {
- printk(KERN_WARNING ": OSCpuVToPageList: "
- "Region isn't a raw PFN mapping. Giving up.\n");
+ PVR_DPF(PVR_DBG_WARNING, "OSAcquirePhysPageAddr: "
+ "Region isn't a raw PFN mapping. "
+ "Giving up.");
goto error_release_mmap_sem;
}
- for (ulAddr = ulStartAddrOrig, ui = 0;
- ulAddr < ulBeyondEndAddrOrig; ulAddr += PAGE_SIZE, ui++) {
+ for (ulAddr = ulStartAddrOrig, i = 0;
+ ulAddr < ulBeyondEndAddrOrig; ulAddr += PAGE_SIZE, i++) {
struct IMG_CPU_PHYADDR CPUPhysAddr;
- CPUPhysAddr.uiAddr =
- ((ulAddr - psVMArea->vm_start) +
+ CPUPhysAddr.uiAddr = ((ulAddr - psVMArea->vm_start) +
(psVMArea->vm_pgoff << PAGE_SHIFT)) & PAGE_MASK;
- psInfo->psPhysAddr[ui] =
+ psInfo->psPhysAddr[i] =
SysCpuPAddrToSysPAddr(CPUPhysAddr);
- psSysPAddr[ui] = psInfo->psPhysAddr[ui];
+ psSysPAddr[i] = psInfo->psPhysAddr[i];
}
- BUG_ON(ui != psInfo->iNumPages);
+ BUG_ON(i != psInfo->iNumPages);
psInfo->eType = WRAP_TYPE_FIND_VMA_PFN;
- printk(KERN_WARNING
- ": OSCpuVToPageList: Region can't be locked down\n");
+ PVR_DPF(PVR_DBG_WARNING, "OSAcquirePhysPageAddr: "
+ "Region can't be locked down");
}
- if (bUseLock)
- up_read(¤t->mm->mmap_sem);
+ up_read(¤t->mm->mmap_sem);
exit_check:
CheckPagesContiguous(psInfo);
return PVRSRV_OK;
error_release_mmap_sem:
- if (bUseLock)
- up_read(¤t->mm->mmap_sem);
+ up_read(¤t->mm->mmap_sem);
error_free:
psInfo->eType = WRAP_TYPE_CLEANUP;
- OSReleasePhysPageAddr((void *) psInfo, bUseLock);
+ OSReleasePhysPageAddr((void *)psInfo);
return PVRSRV_ERROR_GENERIC;
}
#ifndef __OSFUNC_H__
#define __OSFUNC_H__
-
-#ifdef __KERNEL__
+#if defined(__KERNEL__)
+#include <linux/hardirq.h>
#include <linux/string.h>
#endif
-#define KERNEL_ID 0xffffffffL
-#define POWER_MANAGER_ID 0xfffffffeL
-#define ISR_ID 0xfffffffdL
-#define TIMER_ID 0xfffffffcL
+#define PVRSRV_PAGEABLE_SELECT PVRSRV_OS_PAGEABLE_HEAP
+
+#define KERNEL_ID 0xffffffffL
+#define POWER_MANAGER_ID 0xfffffffeL
+#define ISR_ID 0xfffffffdL
+#define TIMER_ID 0xfffffffcL
-#define HOST_PAGESIZE OSGetPageSize
-#define HOST_PAGEMASK (~(HOST_PAGESIZE()-1))
-#define HOST_PAGEALIGN(addr) (((addr)+HOST_PAGESIZE()-1)&HOST_PAGEMASK)
+#define HOST_PAGESIZE OSGetPageSize
+#define HOST_PAGEMASK (~(HOST_PAGESIZE()-1))
+
+#define HOST_PAGEALIGN(addr) (((addr) + HOST_PAGESIZE() - 1) & \
+ HOST_PAGEMASK)
#define PVRSRV_OS_HEAP_MASK 0xf
#define PVRSRV_OS_PAGEABLE_HEAP 0x1
enum PVRSRV_ERROR OSCleanupPerf(void *pvSysData);
struct IMG_CPU_PHYADDR OSMapLinToCPUPhys(void *pvLinAddr);
void OSMemCopy(void *pvDst, void *pvSrc, u32 ui32Size);
-void __iomem *OSMapPhysToLin(struct IMG_CPU_PHYADDR BasePAddr, u32 ui32Bytes,
- u32 ui32Flags, void **phOSMemHandle);
-IMG_BOOL OSUnMapPhysToLin(void __iomem *pvLinAddr, u32 ui32Bytes, u32 ui32Flags,
- void *hOSMemHandle);
+void __iomem *OSMapPhysToLin(struct IMG_CPU_PHYADDR BasePAddr,
+ u32 ui32Bytes, u32 ui32MappingFlags, void **phOSMemHandle);
+IMG_BOOL OSUnMapPhysToLin(void __iomem *pvLinAddr, u32 ui32Bytes,
+ u32 ui32MappingFlags, void *hPageAlloc);
enum PVRSRV_ERROR OSReservePhys(struct IMG_CPU_PHYADDR BasePAddr, u32 ui32Bytes,
u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle);
static inline enum PVRSRV_ERROR OSReserveDiscontigPhys(
struct IMG_SYS_PHYADDR *pBasePAddr, u32 ui32Bytes,
- u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle) {
+ u32 ui32Flags, void **ppvCpuVAddr, void **phOSMemHandle)
+{
*ppvCpuVAddr = NULL;
return OSRegisterDiscontigMem(pBasePAddr, *ppvCpuVAddr, ui32Bytes,
ui32Flags, phOSMemHandle);
}
static inline enum PVRSRV_ERROR OSUnReserveDiscontigPhys(void *pvCpuVAddr,
- u32 ui32Bytes, u32 ui32Flags, void *hOSMemHandle) {
+ u32 ui32Bytes, u32 ui32Flags, void *hOSMemHandle)
+{
OSUnRegisterDiscontigMem(pvCpuVAddr, ui32Bytes, ui32Flags,
- hOSMemHandle);
+ hOSMemHandle);
return PVRSRV_OK;
}
u32 OSGetCurrentThreadID(void);
void OSMemSet(void *pvDest, u8 ui8Value, u32 ui32Size);
-#ifdef DEBUG_LINUX_MEMORY_ALLOCATIONS
+#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
enum PVRSRV_ERROR _OSAllocMem(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
void **phBlockAlloc, char *pszFilename, u32 ui32Line);
#define OSAllocMem(ui32Flags, ui32Size, ppvLinAddr, phBlockAlloc) \
#else
enum PVRSRV_ERROR OSAllocMem(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
void **phBlockAlloc);
-void OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
- void *hBlockAlloc);
+void OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr, void *hBlockAlloc);
#endif
-enum PVRSRV_ERROR OSAllocPages(u32 ui32Flags, u32 ui32Size, void **ppvLinAddr,
- void **phPageAlloc);
+enum PVRSRV_ERROR OSAllocPages(u32 ui32Flags, u32 ui32Size, u32 ui32PageSize,
+ void **ppvLinAddr, void **phPageAlloc);
enum PVRSRV_ERROR OSFreePages(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
void *hPageAlloc);
struct IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(void *hOSMemHandle,
u32 ui32ID);
enum PVRSRV_ERROR OSUnlockResource(struct PVRSRV_RESOURCE *psResource,
u32 ui32ID);
+IMG_BOOL OSIsResourceLocked(struct PVRSRV_RESOURCE *psResource, u32 ui32ID);
enum PVRSRV_ERROR OSCreateResource(struct PVRSRV_RESOURCE *psResource);
enum PVRSRV_ERROR OSDestroyResource(struct PVRSRV_RESOURCE *psResource);
void OSBreakResourceLock(struct PVRSRV_RESOURCE *psResource, u32 ui32ID);
enum PVRSRV_ERROR OSGetSysMemSize(u32 *pui32Bytes);
+enum HOST_PCI_INIT_FLAGS {
+ HOST_PCI_INIT_FLAG_BUS_MASTER = 0x00000001,
+ HOST_PCI_INIT_FLAG_MSI = 0x00000002,
+ HOST_PCI_INIT_FLAG_FORCE_I32 = 0x7fffffff
+};
+
enum PVRSRV_ERROR OSScheduleMISR(void *pvSysData);
IMG_BOOL OSProcHasPrivSrvInit(void);
enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr, u32 ui32Bytes,
struct IMG_SYS_PHYADDR *psSysPAddr,
- void **phOSWrapMem, IMG_BOOL bUseLock);
-enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem, IMG_BOOL bUseLock);
-
+ void **phOSWrapMem);
+enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem);
+
+#if defined(__KERNEL__)
+#define OS_SUPPORTS_IN_LISR
+static inline IMG_BOOL OSInLISR(void unref__ * pvSysData)
+{
+ return in_irq();
+}
+#endif
#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#include "services_headers.h"
+#include "osperproc.h"
+
+#include "env_perproc.h"
+#include "proc.h"
+
+enum PVRSRV_ERROR OSPerProcessPrivateDataInit(void **phOsPrivateData)
+{
+ enum PVRSRV_ERROR eError;
+ void *hBlockAlloc;
+ struct PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc;
+
+ eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_ENV_PER_PROCESS_DATA),
+ phOsPrivateData, &hBlockAlloc);
+
+ if (eError != PVRSRV_OK) {
+ *phOsPrivateData = NULL;
+
+ PVR_DPF(PVR_DBG_ERROR, "%s: OSAllocMem failed (%d)", __func__,
+ eError);
+ return eError;
+ }
+
+ psEnvPerProc = (struct PVRSRV_ENV_PER_PROCESS_DATA *)*phOsPrivateData;
+ OSMemSet(psEnvPerProc, 0, sizeof(*psEnvPerProc));
+
+ psEnvPerProc->hBlockAlloc = hBlockAlloc;
+
+ LinuxMMapPerProcessConnect(psEnvPerProc);
+
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR OSPerProcessPrivateDataDeInit(void *hOsPrivateData)
+{
+ struct PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc;
+
+ if (hOsPrivateData == NULL)
+ return PVRSRV_OK;
+
+ psEnvPerProc = (struct PVRSRV_ENV_PER_PROCESS_DATA *)hOsPrivateData;
+
+ LinuxMMapPerProcessDisconnect(psEnvPerProc);
+
+ RemovePerProcessProcDir(psEnvPerProc);
+
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_ENV_PER_PROCESS_DATA),
+ hOsPrivateData, psEnvPerProc->hBlockAlloc);
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR OSPerProcessSetHandleOptions(struct PVRSRV_HANDLE_BASE
+ *psHandleBase)
+{
+ return LinuxMMapPerProcessHandleOptions(psHandleBase);
+}
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#ifndef __OSPERPROC_H__
+#define __OSPERPROC_H__
+
+enum PVRSRV_ERROR OSPerProcessPrivateDataInit(void **phOsPrivateData);
+enum PVRSRV_ERROR OSPerProcessPrivateDataDeInit(void *hOsPrivateData);
+
+enum PVRSRV_ERROR OSPerProcessSetHandleOptions(
+ struct PVRSRV_HANDLE_BASE *psHandleBase);
+
+#endif
#include "pvr_bridge_km.h"
#include "sgx_bridge_km.h"
#include "pdump_km.h"
-
+#include "sgxutils.h"
static struct RESMAN_ITEM *psResItemCreateSharedPB;
static struct PVRSRV_PER_PROCESS_DATA *psPerProcCreateSharedPB;
struct PVRSRV_STUB_PBDESC *psStubPBDesc;
struct PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = NULL;
struct PVRSRV_SGXDEV_INFO *psSGXDevInfo;
- enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
+ enum PVRSRV_ERROR eError;
psSGXDevInfo = ((struct PVRSRV_DEVICE_NODE *)hDevCookie)->pvDevice;
psStubPBDesc = psSGXDevInfo->psStubPBDescListKM;
if (psStubPBDesc != NULL) {
- if (psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize)
+ u32 i;
+ struct RESMAN_ITEM *psResItem;
+
+ if (psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize) {
PVR_DPF(PVR_DBG_WARNING, "SGXFindSharedPBDescKM: "
"Shared PB requested with different size "
"(0x%x) from existing shared PB (0x%x) - "
"requested size ignored",
ui32TotalPBSize,
psStubPBDesc->ui32TotalPBSize);
- {
- u32 i;
- struct RESMAN_ITEM *psResItem;
-
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(struct PVRSRV_KERNEL_MEM_INFO *)*
- psStubPBDesc->ui32SubKernelMemInfosCount,
- (void **) &
- ppsSharedPBDescSubKernelMemInfos,
- NULL) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "SGXFindSharedPBDescKM:"
- " OSAllocMem failed");
+ }
+
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
+ psStubPBDesc->ui32SubKernelMemInfosCount,
+ (void **) &ppsSharedPBDescSubKernelMemInfos,
+ NULL) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXFindSharedPBDescKM: OSAllocMem failed");
+
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto ExitNotFound;
}
psResItem = ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_SHARED_PB_DESC,
- psStubPBDesc,
- 0,
+ psStubPBDesc, 0,
&SGXCleanupSharedPBDescCallback);
if (psResItem == NULL) {
psStubPBDesc->ui32SubKernelMemInfosCount,
ppsSharedPBDescSubKernelMemInfos, NULL);
- PVR_DPF(PVR_DBG_ERROR, "SGXFindSharedPBDescKM:"
- " ResManRegisterRes failed");
-
+ PVR_DPF(PVR_DBG_ERROR, "SGXFindSharedPBDescKM: "
+ "ResManRegisterRes failed");
eError = PVRSRV_ERROR_GENERIC;
goto ExitNotFound;
}
for (i = 0;
i < psStubPBDesc->ui32SubKernelMemInfosCount;
- i++)
+ i++) {
ppsSharedPBDescSubKernelMemInfos[i] =
psStubPBDesc->ppsSubKernelMemInfos[i];
+ }
psStubPBDesc->ui32RefCount++;
*phSharedPBDesc = (void *) psResItem;
return PVRSRV_OK;
}
- }
- eError = PVRSRV_OK;
- if (bLockOnFailure) {
- if (psResItemCreateSharedPB == NULL) {
- psResItemCreateSharedPB =
- ResManRegisterRes(psPerProc->hResManContext,
+ eError = PVRSRV_OK;
+ if (bLockOnFailure) {
+ if (psResItemCreateSharedPB == NULL) {
+ psResItemCreateSharedPB =
+ ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_SHARED_PB_DESC_CREATE_LOCK,
psPerProc, 0,
&SGXCleanupSharedPBDescCreateLockCallback);
if (psResItemCreateSharedPB == NULL) {
- PVR_DPF(PVR_DBG_ERROR, "SGXFindSharedPBDescKM:"
- " ResManRegisterRes failed");
+ PVR_DPF(PVR_DBG_ERROR, "SGXFindSharedPBDescKM: "
+ "ResManRegisterRes failed");
eError = PVRSRV_ERROR_GENERIC;
goto ExitNotFound;
return eError;
}
-static enum PVRSRV_ERROR
-SGXCleanupSharedPBDescKM(struct PVRSRV_STUB_PBDESC *psStubPBDescIn)
+static enum PVRSRV_ERROR SGXCleanupSharedPBDescKM(
+ struct PVRSRV_STUB_PBDESC *psStubPBDescIn)
{
struct PVRSRV_STUB_PBDESC **ppsStubPBDesc;
u32 i;
+ struct PVRSRV_DEVICE_NODE *psDeviceNode;
struct PVRSRV_SGXDEV_INFO *psSGXDevInfo;
- psSGXDevInfo = (struct PVRSRV_SGXDEV_INFO *)
- ((struct PVRSRV_DEVICE_NODE *)psStubPBDescIn->hDevCookie)->
- pvDevice;
+ psDeviceNode = (struct PVRSRV_DEVICE_NODE *)psStubPBDescIn->hDevCookie;
+ psSGXDevInfo = (struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
for (ppsStubPBDesc = (struct PVRSRV_STUB_PBDESC **)
&psSGXDevInfo->psStubPBDescListKM;
PVR_ASSERT((s32) psStubPBDesc->ui32RefCount >= 0);
if (psStubPBDesc->ui32RefCount == 0) {
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)
- psSGXDevInfo->psSGXHostCtl;
-#if defined(PDUMP)
- void *hUniqueTag = MAKEUNIQUETAG(
- psSGXDevInfo->psKernelSGXHostCtlMemInfo);
-#endif
- psSGXHostCtl->sTAHWPBDesc.uiAddr = 0;
- psSGXHostCtl->s3DHWPBDesc.uiAddr = 0;
-
- PDUMPCOMMENT("TA/3D CCB Control - "
- "Reset HW PBDesc records");
- PDUMPMEM(NULL,
- psSGXDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL,
- sTAHWPBDesc),
- sizeof(struct IMG_DEV_VIRTADDR),
- PDUMP_FLAGS_CONTINUOUS, hUniqueTag);
- PDUMPMEM(NULL,
- psSGXDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL,
- s3DHWPBDesc),
- sizeof(struct IMG_DEV_VIRTADDR),
- PDUMP_FLAGS_CONTINUOUS, hUniqueTag);
-
*ppsStubPBDesc = psStubPBDesc->psNext;
for (i = 0;
sizeof(struct PVRSRV_STUB_PBDESC),
psStubPBDesc, NULL);
+ SGXCleanupRequest(psDeviceNode, NULL,
+ PVRSRV_USSE_EDM_RESMAN_CLEANUP_SHAREDPBDESC);
}
return PVRSRV_OK;
}
#ifdef DEBUG
struct PVRSRV_PER_PROCESS_DATA *psPerProc =
(struct PVRSRV_PER_PROCESS_DATA *)pvParam;
+ PVR_ASSERT(psPerProc == psPerProcCreateSharedPB);
#else
PVR_UNREFERENCED_PARAMETER(pvParam);
#endif
PVR_UNREFERENCED_PARAMETER(ui32Param);
- PVR_ASSERT(psPerProc == psPerProcCreateSharedPB);
-
psPerProcCreateSharedPB = NULL;
psResItemCreateSharedPB = NULL;
PVR_ASSERT(hSharedPBDesc != NULL);
ResManFreeResByPtr(hSharedPBDesc);
+
return PVRSRV_OK;
}
psStubPBDesc = psSGXDevInfo->psStubPBDescListKM;
if (psStubPBDesc != NULL) {
- if (psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize)
+ if (psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize) {
PVR_DPF(PVR_DBG_WARNING, "SGXAddSharedPBDescKM: "
"Shared PB requested with different size "
"(0x%x) from existing shared PB (0x%x) - "
ui32TotalPBSize,
psStubPBDesc->ui32TotalPBSize);
- {
+ }
- psResItem = ResManRegisterRes(psPerProc->hResManContext,
+ psResItem = ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_SHARED_PB_DESC,
psStubPBDesc, 0,
&SGXCleanupSharedPBDescCallback);
- if (psResItem == NULL) {
- PVR_DPF(PVR_DBG_ERROR,
+ if (psResItem == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
"SGXAddSharedPBDescKM: "
"Failed to register existing shared "
"PBDesc with the resource manager");
- goto NoAddKeepPB;
- }
-
- psStubPBDesc->ui32RefCount++;
-
- *phSharedPBDesc = (void *) psResItem;
- eRet = PVRSRV_OK;
goto NoAddKeepPB;
}
+
+ psStubPBDesc->ui32RefCount++;
+
+ *phSharedPBDesc = (void *) psResItem;
+ eRet = PVRSRV_OK;
+ goto NoAddKeepPB;
}
if (OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
psStubPBDesc->ppsSubKernelMemInfos[i] =
ppsSharedPBDescSubKernelMemInfos[i];
if (PVRSRVDissociateMemFromResmanKM
- (ppsSharedPBDescSubKernelMemInfos[i])
- != PVRSRV_OK) {
+ (ppsSharedPBDescSubKernelMemInfos[i]) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "SGXAddSharedPBDescKM: "
"Failed to dissociate shared PBDesc "
"from process");
NoAdd:
if (psStubPBDesc) {
- if (psStubPBDesc->ppsSubKernelMemInfos)
+ if (psStubPBDesc->ppsSubKernelMemInfos) {
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
ui32SharedPBDescSubKernelMemInfosCount,
psStubPBDesc->ppsSubKernelMemInfos, NULL);
+ }
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
sizeof(struct PVRSRV_STUB_PBDESC), psStubPBDesc,
NULL);
******************************************************************************/
#if defined(PDUMP)
+#include <asm/atomic.h>
+#include <stdarg.h>
#include "sgxdefs.h"
#include "services_headers.h"
static u32 DbgWrite(struct DBG_STREAM *psStream, u8 *pui8Data,
u32 ui32BCount, u32 ui32Flags);
-#define PDUMP_DATAMASTER_PIXEL (1)
+#define PDUMP_DATAMASTER_PIXEL 1
-#define MIN(a, b) (a > b ? b : a)
+#define MIN(a, b) (a > b ? b : a)
-#define MAX_FILE_SIZE 0x40000000
+#define MAX_FILE_SIZE 0x40000000
-static u32 gui32PDumpSuspended;
+static atomic_t gsPDumpSuspended = ATOMIC_INIT(0);
static struct DBGKM_SERVICE_TABLE *gpfnDbgDrv;
#define PDUMP_STREAM_PARAM2 0
-#define PDUMP_STREAM_SCRIPT2 1
-#define PDUMP_STREAM_DRIVERINFO 2
+#define PDUMP_STREAM_SCRIPT2 1
+#define PDUMP_STREAM_DRIVERINFO 2
#define PDUMP_NUM_STREAMS 3
-char *pszStreamName[PDUMP_NUM_STREAMS] = { "ParamStream2",
+static char *pszStreamName[PDUMP_NUM_STREAMS] = { "ParamStream2",
"ScriptStream2",
"DriverInfoStream"
};
#define __PDBG_PDUMP_STATE_GET_MSG_STRING(ERROR) \
char *pszMsg = gsDBGPdumpState.pszMsg; \
- if (!pszMsg) \
+ if ((!pszMsg) || PDumpSuspended()) \
return ERROR
#define __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(ERROR) \
char *pszScript = gsDBGPdumpState.pszScript; \
- if (!pszScript) \
+ if ((!pszScript) || PDumpSuspended()) \
return ERROR
#define __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(ERROR) \
char *pszScript = gsDBGPdumpState.pszScript; \
char *pszFile = gsDBGPdumpState.pszFile; \
- if (!pszScript || !pszFile) \
+ if ((!pszScript) || (!pszFile) || PDumpSuspended()) \
return ERROR
struct PDBG_PDUMP_STATE {
#define SZ_SCRIPT_SIZE_MAX (PVRSRV_PDUMP_MAX_COMMENT_SIZE - 1)
#define SZ_FILENAME_SIZE_MAX (PVRSRV_PDUMP_MAX_COMMENT_SIZE - 1)
+static inline IMG_BOOL PDumpSuspended(void)
+{
+ return atomic_read(&gsPDumpSuspended) != 0;
+}
+
void PDumpInit(void)
{
u32 i = 0;
return;
if (!gsDBGPdumpState.pszFile)
- if (OSAllocMem
- (PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX,
- (void **) &gsDBGPdumpState.pszFile,
- 0) != PVRSRV_OK)
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ SZ_FILENAME_SIZE_MAX,
+ (void **)&gsDBGPdumpState.pszFile,
+ NULL) != PVRSRV_OK)
goto init_failed;
if (!gsDBGPdumpState.pszMsg)
- if (OSAllocMem
- (PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX,
- (void **) &gsDBGPdumpState.pszMsg,
- 0) != PVRSRV_OK)
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ SZ_MSG_SIZE_MAX,
+ (void **)&gsDBGPdumpState.pszMsg,
+ NULL) != PVRSRV_OK)
goto init_failed;
if (!gsDBGPdumpState.pszScript)
- if (OSAllocMem
- (PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX,
- (void **) &gsDBGPdumpState.pszScript,
- 0) != PVRSRV_OK)
+ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ SZ_SCRIPT_SIZE_MAX,
+ (void **)&gsDBGPdumpState.pszScript,
+ NULL) != PVRSRV_OK)
goto init_failed;
for (i = 0; i < PDUMP_NUM_STREAMS; i++) {
if (gsDBGPdumpState.pszFile) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX,
- (void *) gsDBGPdumpState.pszFile, 0);
+ (void *)gsDBGPdumpState.pszFile, NULL);
gsDBGPdumpState.pszFile = NULL;
}
if (gsDBGPdumpState.pszScript) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX,
- (void *) gsDBGPdumpState.pszScript, 0);
+ (void *)gsDBGPdumpState.pszScript, NULL);
gsDBGPdumpState.pszScript = NULL;
}
if (gsDBGPdumpState.pszMsg) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX,
- (void *) gsDBGPdumpState.pszMsg, 0);
+ (void *)gsDBGPdumpState.pszMsg, NULL);
gsDBGPdumpState.pszMsg = NULL;
}
if (gsDBGPdumpState.pszFile) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX,
- (void *) gsDBGPdumpState.pszFile, 0);
+ (void *)gsDBGPdumpState.pszFile, NULL);
gsDBGPdumpState.pszFile = NULL;
}
if (gsDBGPdumpState.pszScript) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX,
- (void *) gsDBGPdumpState.pszScript, 0);
+ (void *)gsDBGPdumpState.pszScript, NULL);
gsDBGPdumpState.pszScript = NULL;
}
if (gsDBGPdumpState.pszMsg) {
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX,
- (void *) gsDBGPdumpState.pszMsg, 0);
+ (void *)gsDBGPdumpState.pszMsg, NULL);
gsDBGPdumpState.pszMsg = NULL;
}
gpfnDbgDrv = NULL;
}
-void PDumpEndInitPhase(void)
+enum PVRSRV_ERROR PDumpStartInitPhaseKM(void)
{
u32 i;
- PDUMPCOMMENT("End of Init Phase");
+ if (gpfnDbgDrv) {
+ PDUMPCOMMENT("Start Init Phase");
+ for (i = 0; i < PDUMP_NUM_STREAMS; i++)
+ gpfnDbgDrv->pfnStartInitPhase(gsDBGPdumpState.
+ psStream[i]);
+ }
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR PDumpStopInitPhaseKM(void)
+{
+ u32 i;
- for (i = 0; i < PDUMP_NUM_STREAMS; i++)
- gpfnDbgDrv->pfnEndInitPhase(gsDBGPdumpState.psStream[i]);
+ if (gpfnDbgDrv) {
+ PDUMPCOMMENT("Stop Init Phase");
+
+ for (i = 0; i < PDUMP_NUM_STREAMS; i++)
+ gpfnDbgDrv->pfnStopInitPhase(gsDBGPdumpState.
+ psStream[i]);
+ }
+ return PVRSRV_OK;
}
void PDumpComment(char *pszFormat, ...)
{
+ va_list ap;
+
__PDBG_PDUMP_STATE_GET_MSG_STRING();
- vsnprintf(pszMsg, SZ_MSG_SIZE_MAX, pszFormat,
- (char *) (&pszFormat + 1));
+ va_start(ap, pszFormat);
+ vsnprintf(pszMsg, SZ_MSG_SIZE_MAX, pszFormat, ap);
+ va_end(ap);
PDumpCommentKM(pszMsg, PDUMP_FLAGS_CONTINUOUS);
}
void PDumpCommentWithFlags(u32 ui32Flags, char *pszFormat, ...)
{
+ va_list ap;
+
__PDBG_PDUMP_STATE_GET_MSG_STRING();
- vsnprintf(pszMsg, SZ_MSG_SIZE_MAX, pszFormat,
- (char *) (&pszFormat + 1));
+ va_start(ap, pszFormat);
+ vsnprintf(pszMsg, SZ_MSG_SIZE_MAX, pszFormat, ap);
+ va_end(ap);
PDumpCommentKM(pszMsg, ui32Flags);
}
IMG_BOOL PDumpIsCaptureFrameKM(void)
{
- return gpfnDbgDrv->pfnIsCaptureFrame(
- gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2],
- IMG_FALSE);
+ if (PDumpSuspended())
+ return IMG_FALSE;
+ return gpfnDbgDrv->pfnIsCaptureFrame(gsDBGPdumpState.
+ psStream[PDUMP_STREAM_SCRIPT2],
+ IMG_FALSE);
}
enum PVRSRV_ERROR PDumpRegWithFlagsKM(u32 ui32Reg, u32 ui32Data, u32 ui32Flags)
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING(PVRSRV_ERROR_GENERIC);
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXREG:0x%8.8lX 0x%8.8lX\r\n", ui32Reg, ui32Data);
+ "WRW :SGXREG:0x%8.8X 0x%8.8X\r\n", ui32Reg, ui32Data);
PDumpWriteString2(pszScript, ui32Flags);
return PVRSRV_OK;
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXREG:0x%8.8lX 0x%8.8lX\r\n", ui32Reg, ui32Data);
+ "WRW :SGXREG:0x%8.8X 0x%8.8X\r\n", ui32Reg, ui32Data);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
}
enum PVRSRV_ERROR PDumpRegPolWithFlagsKM(u32 ui32RegAddr, u32 ui32RegValue,
u32 ui32Mask, u32 ui32Flags)
{
-#define POLL_DELAY 1000
+#define POLL_DELAY 1000
#define POLL_COUNT_LONG (2000000000 / POLL_DELAY)
#define POLL_COUNT_SHORT (1000000 / POLL_DELAY)
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING(PVRSRV_ERROR_GENERIC);
if (((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
- (ui32RegValue & ui32Mask & EUR_CR_EVENT_STATUS_TA_FINISHED_MASK))
- || ((ui32RegAddr == EUR_CR_EVENT_STATUS)
- && (ui32RegValue & ui32Mask &
- EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_MASK))
- || ((ui32RegAddr == EUR_CR_EVENT_STATUS)
- && (ui32RegValue & ui32Mask &
- EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_MASK)))
+ (ui32RegValue & ui32Mask &
+ EUR_CR_EVENT_STATUS_TA_FINISHED_MASK)) ||
+ ((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
+ (ui32RegValue & ui32Mask &
+ EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_MASK)) ||
+ ((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
+ (ui32RegValue & ui32Mask &
+ EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_MASK)))
ui32PollCount = POLL_COUNT_LONG;
else
ui32PollCount = POLL_COUNT_SHORT;
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "POL :SGXREG:0x%8.8lX 0x%8.8lX 0x%8.8lX %d %lu %d\r\n",
+ "POL :SGXREG:0x%8.8X 0x%8.8X 0x%8.8X %d %u %d\r\n",
ui32RegAddr, ui32RegValue, ui32Mask, 0, ui32PollCount,
POLL_DELAY);
PDumpWriteString2(pszScript, ui32Flags);
void PDumpMallocPages(enum PVRSRV_DEVICE_TYPE eDeviceType, u32 ui32DevVAddr,
void *pvLinAddr, void *hOSMemHandle, u32 ui32NumBytes,
- void *hUniqueTag)
+ u32 ui32PageSize, void *hUniqueTag)
{
u32 ui32Offset;
u32 ui32NumPages;
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
PVR_UNREFERENCED_PARAMETER(pvLinAddr);
- PVR_ASSERT(((u32) ui32DevVAddr & (SGX_MMU_PAGE_SIZE - 1)) == 0);
+ PVR_ASSERT(((u32) ui32DevVAddr & (ui32PageSize - 1)) == 0);
PVR_ASSERT(hOSMemHandle);
- PVR_ASSERT(((u32) ui32NumBytes & (SGX_MMU_PAGE_SIZE - 1)) == 0);
+ PVR_ASSERT(((u32) ui32NumBytes & (ui32PageSize - 1)) == 0);
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "-- MALLOC :SGXMEM:VA_%8.8lX 0x%8.8lX %lu\r\n", ui32DevVAddr,
- ui32NumBytes, SGX_MMU_PAGE_SIZE);
+ "-- MALLOC :SGXMEM:VA_%8.8X 0x%8.8X %u\r\n", ui32DevVAddr,
+ ui32NumBytes, ui32PageSize);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
ui32Offset = 0;
- ui32NumPages = ui32NumBytes >> SGX_MMU_PAGE_SHIFT;
+ ui32NumPages = ui32NumBytes / ui32PageSize;
while (ui32NumPages--) {
sCpuPAddr = OSMemHandleToCpuPAddr(hOSMemHandle, ui32Offset);
- PVR_ASSERT((sCpuPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1)) == 0);
- ui32Offset += SGX_MMU_PAGE_SIZE;
+ PVR_ASSERT((sCpuPAddr.uiAddr & (ui32PageSize - 1)) == 0);
+ ui32Offset += ui32PageSize;
sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
- ui32Page = sDevPAddr.uiAddr >> SGX_MMU_PAGE_SHIFT;
+ ui32Page = sDevPAddr.uiAddr / ui32PageSize;
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "MALLOC :SGXMEM:PA_%p%8.8lX %lu %lu 0x%8.8lX\r\n",
- hUniqueTag, ui32Page * SGX_MMU_PAGE_SIZE,
- SGX_MMU_PAGE_SIZE, SGX_MMU_PAGE_SIZE,
- ui32Page * SGX_MMU_PAGE_SIZE);
+ "MALLOC :SGXMEM:PA_%8.8X%8.8X %u %u 0x%8.8X\r\n",
+ (u32)hUniqueTag, ui32Page * ui32PageSize,
+ ui32PageSize, ui32PageSize, ui32Page * ui32PageSize);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
}
}
void PDumpMallocPageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
- void *pvLinAddr, u32 ui32NumBytes,
- void *hUniqueTag)
+ void *pvLinAddr, u32 ui32PTSize, void *hUniqueTag)
{
u8 *pui8LinAddr;
u32 ui32NumPages;
u32 ui32Page;
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
- PVR_ASSERT(((u32) pvLinAddr & (SGX_MMU_PAGE_SIZE - 1)) == 0);
- PVR_ASSERT(((u32) ui32NumBytes & (SGX_MMU_PAGE_SIZE - 1)) == 0);
+ PVR_ASSERT(((u32) pvLinAddr & (ui32PTSize - 1)) == 0);
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "-- MALLOC :SGXMEM:PAGE_TABLE 0x%8.8lX %lu\r\n", ui32NumBytes,
+ "-- MALLOC :SGXMEM:PAGE_TABLE 0x%8.8X %lu\r\n", ui32PTSize,
SGX_MMU_PAGE_SIZE);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
pui8LinAddr = (u8 *) pvLinAddr;
- ui32NumPages = ui32NumBytes >> SGX_MMU_PAGE_SHIFT;
+
+ ui32NumPages = 1;
+
while (ui32NumPages--) {
sCpuPAddr = OSMapLinToCPUPhys(pui8LinAddr);
sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
ui32Page = sDevPAddr.uiAddr >> SGX_MMU_PAGE_SHIFT;
- pui8LinAddr += SGX_MMU_PAGE_SIZE;
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "MALLOC :SGXMEM:PA_%p%8.8lX 0x%lX %lu 0x%8.8lX\r\n",
- hUniqueTag, ui32Page * SGX_MMU_PAGE_SIZE,
+ "MALLOC :SGXMEM:PA_%8.8X%8.8lX 0x%lX %lu 0x%8.8lX\r\n",
+ (u32)hUniqueTag, ui32Page * SGX_MMU_PAGE_SIZE,
SGX_MMU_PAGE_SIZE, SGX_MMU_PAGE_SIZE,
ui32Page * SGX_MMU_PAGE_SIZE);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
+ pui8LinAddr += SGX_MMU_PAGE_SIZE;
}
}
void PDumpFreePages(struct BM_HEAP *psBMHeap, struct IMG_DEV_VIRTADDR sDevVAddr,
- u32 ui32NumBytes, void *hUniqueTag, IMG_BOOL bInterleaved)
+ u32 ui32NumBytes, u32 ui32PageSize, void *hUniqueTag,
+ IMG_BOOL bInterleaved)
{
u32 ui32NumPages, ui32PageCounter;
struct IMG_DEV_PHYADDR sDevPAddr;
struct PVRSRV_DEVICE_NODE *psDeviceNode;
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
- PVR_ASSERT(((u32) sDevVAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1)) ==
- 0);
- PVR_ASSERT(((u32) ui32NumBytes & (SGX_MMU_PAGE_SIZE - 1)) == 0);
+ PVR_ASSERT(((u32) sDevVAddr.uiAddr & (ui32PageSize - 1)) == 0);
+ PVR_ASSERT(((u32) ui32NumBytes & (ui32PageSize - 1)) == 0);
- snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "-- FREE :SGXMEM:VA_%8.8lX\r\n",
+ snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "-- FREE :SGXMEM:VA_%8.8X\r\n",
sDevVAddr.uiAddr);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
- ui32NumPages = ui32NumBytes >> SGX_MMU_PAGE_SHIFT;
+ ui32NumPages = ui32NumBytes / ui32PageSize;
psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
for (ui32PageCounter = 0; ui32PageCounter < ui32NumPages;
ui32PageCounter++) {
sDevVAddr);
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "FREE :SGXMEM:PA_%p%8.8lX\r\n", hUniqueTag,
- sDevPAddr.uiAddr);
+ "FREE :SGXMEM:PA_%8.8X%8.8X\r\n",
+ (u32)hUniqueTag, sDevPAddr.uiAddr);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
} else {
}
- sDevVAddr.uiAddr += SGX_MMU_PAGE_SIZE;
+ sDevVAddr.uiAddr += ui32PageSize;
}
}
-void PDumpFreePageTable(enum PVRSRV_DEVICE_TYPE eDeviceType, void *pvLinAddr,
- u32 ui32NumBytes, void *hUniqueTag)
+void PDumpFreePageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
+ void *pvLinAddr, u32 ui32PTSize, void *hUniqueTag)
{
u8 *pui8LinAddr;
u32 ui32NumPages;
u32 ui32Page;
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
- PVR_ASSERT(((u32) pvLinAddr & (SGX_MMU_PAGE_SIZE - 1)) == 0);
- PVR_ASSERT(((u32) ui32NumBytes & (SGX_MMU_PAGE_SIZE - 1)) == 0);
+ PVR_ASSERT(((u32) pvLinAddr & (ui32PTSize - 1)) == 0);
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
"-- FREE :SGXMEM:PAGE_TABLE\r\n");
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
pui8LinAddr = (u8 *) pvLinAddr;
- ui32NumPages = ui32NumBytes >> SGX_MMU_PAGE_SHIFT;
+
+ ui32NumPages = 1;
+
while (ui32NumPages--) {
sCpuPAddr = OSMapLinToCPUPhys(pui8LinAddr);
sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
pui8LinAddr += SGX_MMU_PAGE_SIZE;
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "FREE :SGXMEM:PA_%p%8.8lX\r\n", hUniqueTag,
+ "FREE :SGXMEM:PA_%8.8X%8.8lX\r\n", (u32)hUniqueTag,
ui32Page * SGX_MMU_PAGE_SIZE);
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
}
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXREG:0x%8.8lX :SGXMEM:PA_%p%8.8lX:0x%8.8lX\r\n",
- ui32Reg,
- hUniqueTag,
- ui32Data & ~(SGX_MMU_PAGE_SIZE - 1),
+ "WRW :SGXREG:0x%8.8X :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
+ ui32Reg, (u32)hUniqueTag, ui32Data & ~(SGX_MMU_PAGE_SIZE - 1),
ui32Data & (SGX_MMU_PAGE_SIZE - 1));
PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
}
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXREG:0x%8.8lX :SGXMEM:PA_%p%8.8lX:0x%8.8lX\r\n",
- ui32Reg,
- hUniqueTag,
- ui32Data & ~(SGX_MMU_PAGE_SIZE - 1),
+ "WRW :SGXREG:0x%8.8X :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
+ ui32Reg, (u32) hUniqueTag, ui32Data & ~(SGX_MMU_PAGE_SIZE - 1),
ui32Data & (SGX_MMU_PAGE_SIZE - 1));
PDumpWriteString2(pszScript, ui32Flags);
}
if (gsDBGPdumpState.ui32ParamFileNum == 0)
snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
else
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%lu.prm",
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
gsDBGPdumpState.ui32ParamFileNum);
ui32Flags = 0;
sDevPAddr.uiAddr += ui32PageOffset;
snprintf(pszScript,
- SZ_SCRIPT_SIZE_MAX,
- "POL :SGXMEM:PA_%p%8.8lX:0x%8.8lX 0x%8.8lX 0x%8.8lX %d %d %d\r\n",
- hUniqueTag,
- sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
+ SZ_SCRIPT_SIZE_MAX, "POL :SGXMEM:"
+ "PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X 0x%8.8X %d %d %d\r\n",
+ (u32)hUniqueTag, sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
ui32Value, ui32Mask, eOperator, MEMPOLL_COUNT, MEMPOLL_DELAY);
PDumpWriteString2(pszScript, ui32Flags);
void *hUniqueTag)
{
u32 ui32PageByteOffset;
- u8 *pui8DataLinAddr;
+ u8 *pui8DataLinAddr = NULL;
struct IMG_DEV_VIRTADDR sDevVPageAddr;
struct IMG_DEV_VIRTADDR sDevVAddr;
struct IMG_DEV_PHYADDR sDevPAddr;
u32 ui32ParamOutPos;
u32 ui32CurrentOffset;
u32 ui32BytesRemaining;
- struct LinuxMemArea *psLinuxMemArea;
- enum LINUX_MEM_AREA_TYPE eRootAreaType;
- char *pui8TransientCpuVAddr;
__PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(PVRSRV_ERROR_GENERIC);
PVR_ASSERT((ui32Offset + ui32Bytes) <= psMemInfo->ui32AllocSize);
- if (ui32Bytes == 0 || gui32PDumpSuspended)
+ if (ui32Bytes == 0)
return PVRSRV_OK;
if (pvAltLinAddr) {
pui8DataLinAddr = pvAltLinAddr;
- } else if (psMemInfo->pvLinAddrKM) {
- pui8DataLinAddr =
- (u8 *) psMemInfo->pvLinAddrKM + ui32Offset;
} else {
- pui8DataLinAddr = 0;
- psLinuxMemArea =
- (struct LinuxMemArea *)psMemInfo->sMemBlk.hOSMemHandle;
- eRootAreaType = LinuxMemAreaRootType(psLinuxMemArea);
+ if (psMemInfo->pvLinAddrKM)
+ pui8DataLinAddr =
+ (u8 *) psMemInfo->pvLinAddrKM + ui32Offset;
+
}
+ PVR_ASSERT(pui8DataLinAddr);
+
ui32ParamOutPos =
gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
psStream[PDUMP_STREAM_PARAM2]);
- if (pui8DataLinAddr) {
- if (!PDumpWriteILock
- (gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2],
+ if (!PDumpWriteILock(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2],
pui8DataLinAddr, ui32Bytes, ui32Flags))
return PVRSRV_ERROR_GENERIC;
- } else if (eRootAreaType == LINUX_MEM_AREA_IO) {
-
- CpuPAddr =
- OSMemHandleToCpuPAddr(psMemInfo->sMemBlk.hOSMemHandle,
- ui32Offset);
- pui8TransientCpuVAddr =
- IORemapWrapper(CpuPAddr, ui32Bytes, PVRSRV_HAP_CACHED);
- if (!PDumpWriteILock
- (gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2],
- pui8TransientCpuVAddr, ui32Bytes, ui32Flags)) {
- IOUnmapWrapper(pui8TransientCpuVAddr);
- return PVRSRV_ERROR_GENERIC;
- }
- IOUnmapWrapper(pui8TransientCpuVAddr);
- } else {
-
- PVR_ASSERT(eRootAreaType == LINUX_MEM_AREA_ALLOC_PAGES);
-
- ui32BytesRemaining = ui32Bytes;
- ui32CurrentOffset = ui32Offset;
-
- while (ui32BytesRemaining > 0) {
- u32 ui32BlockBytes =
- MIN(ui32BytesRemaining, PAGE_SIZE);
- struct page *psCurrentPage = NULL;
-
- CpuPAddr =
- OSMemHandleToCpuPAddr(psMemInfo->sMemBlk.
- hOSMemHandle,
- ui32CurrentOffset);
-
- if (CpuPAddr.uiAddr & (PAGE_SIZE - 1))
- ui32BlockBytes =
- MIN(ui32BytesRemaining,
- PAGE_ALIGN(CpuPAddr.uiAddr) -
- CpuPAddr.uiAddr);
-
- psCurrentPage =
- LinuxMemAreaOffsetToPage(psLinuxMemArea,
- ui32CurrentOffset);
- pui8TransientCpuVAddr = KMapWrapper(psCurrentPage);
- pui8TransientCpuVAddr += (CpuPAddr.uiAddr & ~PAGE_MASK);
- if (!pui8TransientCpuVAddr)
- return PVRSRV_ERROR_GENERIC;
-
- if (!PDumpWriteILock
- (gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2],
- pui8TransientCpuVAddr, ui32BlockBytes,
- ui32Flags)) {
- KUnMapWrapper(psCurrentPage);
- return PVRSRV_ERROR_GENERIC;
- }
- KUnMapWrapper(psCurrentPage);
-
- ui32BytesRemaining -= ui32BlockBytes;
- ui32CurrentOffset += ui32BlockBytes;
- }
- PVR_ASSERT(ui32BytesRemaining == 0);
-
- }
-
- if (gsDBGPdumpState.ui32ParamFileNum == 0)
+ if (gsDBGPdumpState.ui32ParamFileNum == 0) {
snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
- else
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%lu.prm",
+ } else {
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
gsDBGPdumpState.ui32ParamFileNum);
+ }
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "-- LDB :SGXMEM:VA_%8.8lX:0x%8.8lX 0x%8.8lX 0x%8.8lX %s\r\n",
+ "-- LDB :SGXMEM:VA_%8.8X:0x%8.8X 0x%8.8X 0x%8.8X %s\r\n",
psMemInfo->sDevVAddr.uiAddr,
ui32Offset, ui32Bytes, ui32ParamOutPos, pszFile);
PDumpWriteString2(pszScript, ui32Flags);
}
snprintf(pszScript,
- SZ_SCRIPT_SIZE_MAX,
- "LDB :SGXMEM:PA_%p%8.8lX:0x%8.8lX 0x%8.8lX "
- "0x%8.8lX %s\r\n",
- hUniqueTag,
+ SZ_SCRIPT_SIZE_MAX, "LDB :SGXMEM:"
+ "PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X 0x%8.8X %s\r\n",
+ (u32) hUniqueTag,
sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
ui32BlockBytes, ui32ParamOutPos, pszFile);
if (!pvLinAddr)
return PVRSRV_ERROR_GENERIC;
- if (gui32PDumpSuspended)
- return PVRSRV_OK;
-
ui32ParamOutPos =
gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
psStream[PDUMP_STREAM_PARAM2]);
if (gsDBGPdumpState.ui32ParamFileNum == 0)
snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
else
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%lu.prm",
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
gsDBGPdumpState.ui32ParamFileNum);
}
ui32PageOffset = (u32) pvLinAddr & (HOST_PAGESIZE() - 1);
ui32NumPages =
- (ui32PageOffset + ui32Bytes + HOST_PAGESIZE() -
- 1) / HOST_PAGESIZE();
+ (ui32PageOffset + ui32Bytes + HOST_PAGESIZE() - 1) /
+ HOST_PAGESIZE();
pui8LinAddr = (u8 *) pvLinAddr;
while (ui32NumPages--) {
sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
if (ui32PageOffset + ui32Bytes > HOST_PAGESIZE())
-
ui32BlockBytes = HOST_PAGESIZE() - ui32PageOffset;
else
-
ui32BlockBytes = ui32Bytes;
if (bInitialisePages) {
snprintf(pszScript,
- SZ_SCRIPT_SIZE_MAX,
- "LDB :SGXMEM:PA_%p%8.8lX:0x%8.8lX 0x%8.8lX "
- "0x%8.8lX %s\r\n",
- hUniqueTag1,
+ SZ_SCRIPT_SIZE_MAX, "LDB :SGXMEM:"
+ "PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X "
+ "0x%8.8X %s\r\n",
+ (u32) hUniqueTag1,
sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
ui32BlockBytes, ui32ParamOutPos, pszFile);
if ((ui32PTE & SGX_MMU_PDE_ADDR_MASK) != 0) {
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXMEM:PA_%p%8.8lX:"
- "0x%8.8lX :SGXMEM:"
- "PA_%p%8.8lX:0x%8.8lX\r\n",
- hUniqueTag1,
+"WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
+ (u32)hUniqueTag1,
(sDevPAddr.uiAddr +
- ui32Offset) &
- ~(SGX_MMU_PAGE_SIZE - 1),
+ ui32Offset) &
+ ~(SGX_MMU_PAGE_SIZE - 1),
(sDevPAddr.uiAddr +
- ui32Offset) &
- (SGX_MMU_PAGE_SIZE - 1),
- hUniqueTag2,
+ ui32Offset) &
+ (SGX_MMU_PAGE_SIZE - 1),
+ (u32)hUniqueTag2,
ui32PTE &
- SGX_MMU_PDE_ADDR_MASK,
+ SGX_MMU_PDE_ADDR_MASK,
ui32PTE &
- ~SGX_MMU_PDE_ADDR_MASK);
+ ~SGX_MMU_PDE_ADDR_MASK);
} else {
PVR_ASSERT(!
(ui32PTE &
SGX_MMU_PTE_VALID));
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXMEM:PA_%p%8.8lX:"
- "0x%8.8lX 0x%8.8lX%p\r\n",
- hUniqueTag1,
+ "WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X%8.8X\r\n",
+ (u32) hUniqueTag1,
(sDevPAddr.uiAddr +
- ui32Offset) &
- ~(SGX_MMU_PAGE_SIZE - 1),
+ ui32Offset) &
+ ~(SGX_MMU_PAGE_SIZE - 1),
(sDevPAddr.uiAddr +
- ui32Offset) &
- (SGX_MMU_PAGE_SIZE - 1),
- ui32PTE, hUniqueTag2);
+ ui32Offset) &
+ (SGX_MMU_PAGE_SIZE - 1),
+ ui32PTE, (u32)hUniqueTag2);
}
PDumpWriteString2(pszScript,
PDUMP_FLAGS_CONTINUOUS);
if (gsDBGPdumpState.ui32ParamFileNum == 0)
snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
else
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%lu.prm",
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
gsDBGPdumpState.ui32ParamFileNum);
CpuPAddr =
if ((sPDDevPAddr.uiAddr & SGX_MMU_PDE_ADDR_MASK) != 0) {
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXMEM:PA_%p%8.8lX:0x%8.8lX :"
- "SGXMEM:PA_%p%8.8lX:0x%8.8lX\r\n",
- hUniqueTag1,
+"WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
+ (u32) hUniqueTag1,
sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
- hUniqueTag2,
+ (u32)hUniqueTag2,
sPDDevPAddr.uiAddr & SGX_MMU_PDE_ADDR_MASK,
sPDDevPAddr.uiAddr & ~SGX_MMU_PDE_ADDR_MASK);
} else {
PVR_ASSERT(!(sDevPAddr.uiAddr & SGX_MMU_PTE_VALID));
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "WRW :SGXMEM:PA_%p%8.8lX:0x%8.8lX 0x%8.8lX\r\n",
- hUniqueTag1,
+ "WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X\r\n",
+ (u32)hUniqueTag1,
sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
sPDDevPAddr.uiAddr);
{
u32 ui32Stream;
- for (ui32Stream = 0; ui32Stream < PDUMP_NUM_STREAMS; ui32Stream++) {
+ for (ui32Stream = 0; ui32Stream < PDUMP_NUM_STREAMS; ui32Stream++)
if (gsDBGPdumpState.psStream[ui32Stream])
DbgSetFrame(gsDBGPdumpState.psStream[ui32Stream],
ui32Frame);
- }
-
return PVRSRV_OK;
}
-enum PVRSRV_ERROR PDumpGetFrameKM(u32 *pui32Frame)
+static enum PVRSRV_ERROR PDumpGetFrameKM(u32 *pui32Frame)
{
*pui32Frame =
DbgGetFrame(gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2]);
PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags,
"\r\n-- Dump bitmap of render\r\n");
- snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "SII %s %s.bin :SGXMEM:v:0x%08lX 0x%08lX 0x%08lX 0x%08X "
- "0x%08lX 0x%08lX 0x%08lX 0x%08X\r\n",
+ snprintf(pszScript,
+ SZ_SCRIPT_SIZE_MAX,
+ "SII %s %s.bin :SGXMEM:v:0x%08X 0x%08X "
+ "0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\r\n",
pszFileName, pszFileName, sDevBaseAddr.uiAddr, ui32Size,
ui32FileOffset, ePixelFormat, ui32Width, ui32Height,
ui32StrideInBytes, eMemFormat);
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "SAB :SGXREG:0x%08lX 0x%08lX %s\r\n",
+ "SAB :SGXREG:0x%08X 0x%08X %s\r\n",
ui32Address, ui32FileOffset, pszFileName);
PDumpWriteString2(pszScript, ui32PDumpFlags);
u32 ui32Written = 0;
u32 ui32Off = 0;
- if (!psStream || gui32PDumpSuspended || (ui32Flags & PDUMP_FLAGS_NEVER))
+ if (!psStream || PDumpSuspended() || (ui32Flags & PDUMP_FLAGS_NEVER))
return IMG_TRUE;
if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) {
{
u32 ui32BytesWritten;
- if (ui32Flags & PDUMP_FLAGS_CONTINUOUS)
-
+ if (ui32Flags & PDUMP_FLAGS_CONTINUOUS) {
if ((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) &&
(psStream->ui32Start == 0xFFFFFFFF) &&
(psStream->ui32End == 0xFFFFFFFF) &&
- psStream->bInitPhaseComplete) {
+ psStream->bInitPhaseComplete)
ui32BytesWritten = ui32BCount;
- } else {
+ else
ui32BytesWritten =
gpfnDbgDrv->pfnDBGDrivWrite2(psStream, pui8Data,
ui32BCount, 1);
- }
- else
- if (ui32Flags & PDUMP_FLAGS_LASTFRAME) {
- u32 ui32DbgFlags;
+ } else if (ui32Flags & PDUMP_FLAGS_LASTFRAME) {
+ u32 ui32DbgFlags;
- ui32DbgFlags = 0;
- if (ui32Flags & PDUMP_FLAGS_RESETLFBUFFER)
- ui32DbgFlags |= WRITELF_FLAGS_RESETBUF;
+ ui32DbgFlags = 0;
+ if (ui32Flags & PDUMP_FLAGS_RESETLFBUFFER)
+ ui32DbgFlags |= WRITELF_FLAGS_RESETBUF;
- ui32BytesWritten =
- gpfnDbgDrv->pfnWriteLF(psStream, pui8Data,
+ ui32BytesWritten =
+ gpfnDbgDrv->pfnWriteLF(psStream, pui8Data,
ui32BCount, 1, ui32DbgFlags);
- } else {
+ } else {
ui32BytesWritten =
gpfnDbgDrv->pfnWriteBINCM(psStream, pui8Data,
ui32BCount, 1);
- }
+ }
return ui32BytesWritten;
}
PDUMPCOMMENTWITHFLAGS(ui32Flags,
"\r\n-- Dump 3D signature registers\r\n");
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%lu_3d.sig",
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%u_3d.sig",
ui32DumpFrameNum);
for (i = 0; i < ui32NumRegisters; i++) {
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
- "SAB :SGXREG:0x%08lX 0x%08lX %s\r\n", ui32Address,
+ "SAB :SGXREG:0x%08X 0x%08X %s\r\n", ui32Address,
*pui32FileOffset, pszFileName);
PDumpWriteString2(pszScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
PDUMPCOMMENTWITHFLAGS(bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0,
"\r\n-- Dump counter registers\r\n");
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%lu.perf",
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%u.perf",
ui32DumpFrameNum);
ui32FileOffset = 0;
&ui32FileOffset, bLastFrame);
}
-void PDumpTASignatureRegisters(u32 ui32DumpFrameNum,
- u32 ui32TAKickCount,
- IMG_BOOL bLastFrame,
- u32 *pui32Registers,
+void PDumpTASignatureRegisters(u32 ui32DumpFrameNum, u32 ui32TAKickCount,
+ IMG_BOOL bLastFrame, u32 *pui32Registers,
u32 ui32NumRegisters)
{
u32 ui32FileOffset, ui32Flags;
ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
PDUMPCOMMENTWITHFLAGS(ui32Flags,
"\r\n-- Dump TA signature registers\r\n");
- snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%lu_ta.sig",
+ snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%u_ta.sig",
ui32DumpFrameNum);
ui32FileOffset = ui32TAKickCount * ui32NumRegisters * sizeof(u32);
{
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
- snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%lX\r\n",
+ snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%X\r\n",
ui32RegOffset);
PDumpWriteString2(pszScript, ui32Flags);
}
-void PDumpCycleCountRegRead(const u32 ui32RegOffset,
- IMG_BOOL bLastFrame)
+void PDumpCycleCountRegRead(const u32 ui32RegOffset, IMG_BOOL bLastFrame)
{
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
- snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%lX\r\n",
+ snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%X\r\n",
ui32RegOffset);
PDumpWriteString2(pszScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
}
+void PDumpHWPerfCBKM(char *pszFileName, u32 ui32FileOffset,
+ struct IMG_DEV_VIRTADDR sDevBaseAddr, u32 ui32Size,
+ u32 ui32PDumpFlags)
+{
+ __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
+ PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags,
+ "\r\n-- Dump Hardware Performance Circular Buffer\r\n");
+
+ snprintf(pszScript,
+ SZ_SCRIPT_SIZE_MAX,
+ "SAB :SGXMEM:v:0x%08X 0x%08X 0x%08X %s.bin\r\n",
+ sDevBaseAddr.uiAddr, ui32Size, ui32FileOffset, pszFileName);
+
+ PDumpWriteString2(pszScript, ui32PDumpFlags);
+}
+
void PDumpCBP(struct PVRSRV_KERNEL_MEM_INFO *psROffMemInfo,
u32 ui32ROffOffset, u32 ui32WPosVal, u32 ui32PacketSize,
u32 ui32BufferSize, u32 ui32Flags, void *hUniqueTag)
snprintf(pszScript,
SZ_SCRIPT_SIZE_MAX,
- "CBP :SGXMEM:PA_%p%8.8lX:0x%8.8lX 0x%8.8lX 0x%8.8lX "
- "0x%8.8lX\r\n",
- hUniqueTag,
+ "CBP :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X 0x%8.8X 0x%8.8X\r\n",
+ (u32) hUniqueTag,
sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
ui32WPosVal, ui32PacketSize, ui32BufferSize);
{
__PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
- sprintf(pszScript, "IDL %lu\r\n", ui32Clocks);
+ sprintf(pszScript, "IDL %u\r\n", ui32Clocks);
PDumpWriteString2(pszScript, ui32Flags);
}
void PDumpSuspendKM(void)
{
- gui32PDumpSuspended++;
+ atomic_inc(&gsPDumpSuspended);
}
void PDumpResumeKM(void)
{
- gui32PDumpSuspended--;
+ atomic_dec(&gsPDumpSuspended);
}
#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#if defined(PDUMP)
+#include "services_headers.h"
+#include "pdump_km.h"
+
+#if !defined(PDUMP_TEMP_BUFFER_SIZE)
+#define PDUMP_TEMP_BUFFER_SIZE (64 * 1024L)
+#endif
+
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+#define PTR_PLUS(t, p, x) ((t *)(((char *)(p)) + (x)))
+#define VPTR_PLUS(p, x) PTR_PLUS(void, p, x)
+#define VPTR_INC(p, x) (p = VPTR_PLUS(p, x))
+#define MAX_PDUMP_MMU_CONTEXTS 10
+static void *gpvTempBuffer;
+static void *ghTempBufferBlockAlloc;
+static u16 gui16MMUContextUsage;
+
+static void *GetTempBuffer(void)
+{
+ if (gpvTempBuffer == NULL) {
+ enum PVRSRV_ERROR eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ PDUMP_TEMP_BUFFER_SIZE,
+ &gpvTempBuffer,
+ &ghTempBufferBlockAlloc);
+ if (eError != PVRSRV_OK)
+ PVR_DPF(PVR_DBG_ERROR,
+ "GetTempBuffer: OSAllocMem failed: %d",
+ eError);
+ }
+
+ return gpvTempBuffer;
+}
+
+static void FreeTempBuffer(void)
+{
+ if (gpvTempBuffer != NULL) {
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, PDUMP_TEMP_BUFFER_SIZE,
+ gpvTempBuffer, ghTempBufferBlockAlloc);
+ gpvTempBuffer = NULL;
+ }
+}
+
+void PDumpInitCommon(void)
+{
+ (void)GetTempBuffer();
+ PDumpInit();
+}
+
+void PDumpDeInitCommon(void)
+{
+ FreeTempBuffer();
+ PDumpDeInit();
+}
+
+enum PVRSRV_ERROR PDumpMemUM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ void *pvAltLinAddrUM, void *pvLinAddrUM,
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
+ u32 ui32Offset, u32 ui32Bytes, u32 ui32Flags,
+ void *hUniqueTag)
+{
+ void *pvAddrUM;
+ void *pvAddrKM;
+ u32 ui32BytesDumped;
+ u32 ui32CurrentOffset;
+
+ if (psMemInfo->pvLinAddrKM != NULL && pvAltLinAddrUM == NULL)
+ return PDumpMemKM(NULL, psMemInfo, ui32Offset, ui32Bytes,
+ ui32Flags, hUniqueTag);
+
+ pvAddrUM = (pvAltLinAddrUM != NULL) ? pvAltLinAddrUM :
+ ((pvLinAddrUM != NULL) ? VPTR_PLUS(pvLinAddrUM,
+ ui32Offset) : NULL);
+
+ pvAddrKM = GetTempBuffer();
+
+ PVR_ASSERT(pvAddrUM != NULL && pvAddrKM != NULL);
+ if (pvAddrUM == NULL || pvAddrKM == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "PDumpMemUM: Nothing to dump");
+ return PVRSRV_ERROR_GENERIC;
+ }
+
+ if (ui32Bytes > PDUMP_TEMP_BUFFER_SIZE)
+ PDumpCommentWithFlags(ui32Flags,
+ "Dumping 0x%8.8lx bytes of memory, in blocks of 0x%8.8lx bytes",
+ ui32Bytes, (u32) PDUMP_TEMP_BUFFER_SIZE);
+
+ ui32CurrentOffset = ui32Offset;
+ for (ui32BytesDumped = 0; ui32BytesDumped < ui32Bytes;) {
+ enum PVRSRV_ERROR eError;
+ u32 ui32BytesToDump =
+ MIN(PDUMP_TEMP_BUFFER_SIZE, ui32Bytes - ui32BytesDumped);
+
+ eError = OSCopyFromUser(psPerProc,
+ pvAddrKM, pvAddrUM, ui32BytesToDump);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpMemUM: OSCopyFromUser failed (%d), eError");
+ return PVRSRV_ERROR_GENERIC;
+ }
+
+ eError = PDumpMemKM(pvAddrKM, psMemInfo, ui32CurrentOffset,
+ ui32BytesToDump, ui32Flags, hUniqueTag);
+
+ if (eError != PVRSRV_OK) {
+ if (ui32BytesDumped != 0)
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpMemUM: PDumpMemKM failed (%d)",
+ eError);
+ PVR_ASSERT(ui32BytesDumped == 0);
+ return eError;
+ }
+
+ VPTR_INC(pvAddrUM, ui32BytesToDump);
+ ui32CurrentOffset += ui32BytesToDump;
+ ui32BytesDumped += ui32BytesToDump;
+ }
+
+ return PVRSRV_OK;
+}
+
+static enum PVRSRV_ERROR _PdumpAllocMMUContext(u32 *pui32MMUContextID)
+{
+ u32 i;
+
+ for (i = 0; i < MAX_PDUMP_MMU_CONTEXTS; i++)
+ if ((gui16MMUContextUsage & (1UL << i)) == 0) {
+ gui16MMUContextUsage |= 1UL << i;
+ *pui32MMUContextID = i;
+ return PVRSRV_OK;
+ }
+
+ PVR_DPF(PVR_DBG_ERROR,
+ "_PdumpAllocMMUContext: no free MMU context ids");
+
+ return PVRSRV_ERROR_GENERIC;
+}
+
+static enum PVRSRV_ERROR _PdumpFreeMMUContext(u32 ui32MMUContextID)
+{
+ if (ui32MMUContextID < MAX_PDUMP_MMU_CONTEXTS) {
+
+ gui16MMUContextUsage &= ~(1UL << ui32MMUContextID);
+ return PVRSRV_OK;
+ }
+
+ PVR_DPF(PVR_DBG_ERROR,
+ "_PdumpFreeMMUContext: MMU context ids invalid");
+
+ return PVRSRV_ERROR_GENERIC;
+}
+
+enum PVRSRV_ERROR PDumpSetMMUContext(enum PVRSRV_DEVICE_TYPE eDeviceType,
+ char *pszMemSpace, u32 *pui32MMUContextID,
+ u32 ui32MMUType, void *hUniqueTag1,
+ void *pvPDCPUAddr)
+{
+ u8 *pui8LinAddr = (u8 *) pvPDCPUAddr;
+ struct IMG_CPU_PHYADDR sCpuPAddr;
+ struct IMG_DEV_PHYADDR sDevPAddr;
+ u32 ui32MMUContextID;
+ enum PVRSRV_ERROR eError;
+
+ eError = _PdumpAllocMMUContext(&ui32MMUContextID);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpSetMMUContext: _PdumpAllocMMUContext failed: %d",
+ eError);
+ return eError;
+ }
+
+ sCpuPAddr = OSMapLinToCPUPhys(pui8LinAddr);
+ sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
+
+ sDevPAddr.uiAddr &= ~PVRSRV_4K_PAGE_SIZE;
+
+ PDumpComment("Set MMU Context\r\n");
+
+ PDumpComment("MMU :%s:v%d %d :%s:PA_%8.8lX%8.8lX\r\n",
+ pszMemSpace, ui32MMUContextID, ui32MMUType, pszMemSpace,
+ hUniqueTag1, sDevPAddr.uiAddr);
+
+ *pui32MMUContextID = ui32MMUContextID;
+
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR PDumpClearMMUContext(enum PVRSRV_DEVICE_TYPE eDeviceType,
+ char *pszMemSpace,
+ u32 ui32MMUContextID, u32 ui32MMUType)
+{
+ enum PVRSRV_ERROR eError;
+
+ PVR_UNREFERENCED_PARAMETER(eDeviceType);
+
+ PDumpComment("Clear MMU Context\r\n");
+
+ PDumpComment("MMU :%s:v%d %d\r\n",
+ pszMemSpace, ui32MMUContextID, ui32MMUType);
+
+ eError = _PdumpFreeMMUContext(ui32MMUContextID);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PDumpClearMMUContext: _PdumpFreeMMUContext failed: %d",
+ eError);
+ return eError;
+ }
+
+ return PVRSRV_OK;
+}
+
+#endif
#define PDUMP_PT_UNIQUETAG ((void *)0)
#ifndef PDUMP
-#define MAKEUNIQUETAG(hMemInfo) 0
+#define MAKEUNIQUETAG(hMemInfo) (0)
#endif
#ifdef PDUMP
#define PDUMP_REG_FUNC_NAME PDumpReg
-enum PVRSRV_ERROR PDumpMemPolKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- u32 ui32Offset, u32 ui32Value, u32 ui32Mask,
- enum PDUMP_POLL_OPERATOR eOperator, IMG_BOOL bLastFrame,
- IMG_BOOL bOverwrite, void *hUniqueTag);
+enum PVRSRV_ERROR PDumpMemPolKM(struct PVRSRV_KERNEL_MEM_INFO
+ *psMemInfo, u32 ui32Offset,
+ u32 ui32Value, u32 ui32Mask,
+ enum PDUMP_POLL_OPERATOR eOperator,
+ IMG_BOOL bLastFrame,
+ IMG_BOOL bOverwrite,
+ void *hUniqueTag);
+
+enum PVRSRV_ERROR PDumpMemUM(struct PVRSRV_PER_PROCESS_DATA
+ *psProcData, void *pvAltLinAddr,
+ void *pvLinAddr,
+ struct PVRSRV_KERNEL_MEM_INFO
+ *psMemInfo, u32 ui32Offset,
+ u32 ui32Bytes, u32 ui32Flags,
+ void *hUniqueTag);
enum PVRSRV_ERROR PDumpMemKM(void *pvAltLinAddr,
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo, u32 ui32Offset,
u32 ui32Length, u32 ui32Flags, void *hUniqueTag);
enum PVRSRV_ERROR PDumpMem2KM(enum PVRSRV_DEVICE_TYPE eDeviceType,
- void *pvLinAddr, u32 ui32Bytes, u32 ui32Flags,
- IMG_BOOL bInitialisePages, void *hUniqueTag1,
- void *hUniqueTag2);
-
+ void *pvLinAddr,
+ u32 ui32Bytes,
+ u32 ui32Flags,
+ IMG_BOOL bInitialisePages,
+ void *hUniqueTag1, void *hUniqueTag2);
+void PDumpInitCommon(void);
+void PDumpDeInitCommon(void);
void PDumpInit(void);
void PDumpDeInit(void);
+enum PVRSRV_ERROR PDumpStartInitPhaseKM(void);
+enum PVRSRV_ERROR PDumpStopInitPhaseKM(void);
enum PVRSRV_ERROR PDumpSetFrameKM(u32 ui32Frame);
enum PVRSRV_ERROR PDumpCommentKM(char *pszComment, u32 ui32Flags);
enum PVRSRV_ERROR PDumpDriverInfoKM(char *pszString, u32 ui32Flags);
struct IMG_DEV_VIRTADDR sDevBaseAddr, u32 ui32Size,
enum PDUMP_PIXEL_FORMAT ePixelFormat,
enum PDUMP_MEM_FORMAT eMemFormat, u32 ui32PDumpFlags);
-
+void PDumpHWPerfCBKM(char *pszFileName, u32 ui32FileOffset,
+ struct IMG_DEV_VIRTADDR sDevBaseAddr,
+ u32 ui32Size, u32 ui32PDumpFlags);
enum PVRSRV_ERROR PDumpReadRegKM(char *pszFileName, u32 ui32FileOffset,
u32 ui32Address, u32 ui32Size, u32 ui32PDumpFlags);
-
void PDUMP_REG_FUNC_NAME(u32 dwReg, u32 dwData);
void PDumpMsvdxRegRead(const char *const pRegRegion, const u32 dwRegOffset);
enum PVRSRV_ERROR PDumpRegPolKM(u32 ui32RegAddr, u32 ui32RegValue,
u32 ui32Mask);
enum PVRSRV_ERROR PDumpRegPolWithFlagsKM(u32 ui32RegAddr, u32 ui32RegValue,
- u32 ui32Mask, u32 ui32Flags);
+ u32 ui32Mask, u32 ui32Flags);
IMG_BOOL PDumpIsLastCaptureFrameKM(void);
IMG_BOOL PDumpIsCaptureFrameKM(void);
-void PDumpMallocPages(enum PVRSRV_DEVICE_TYPE eDeviceType, u32 ui32DevVAddr,
- void *pvLinAddr, void *hOSMemHandle, u32 ui32NumBytes,
- void *hUniqueTag);
+void PDumpMallocPages(enum PVRSRV_DEVICE_TYPE eDeviceType,
+ u32 ui32DevVAddr, void *pvLinAddr, void *hOSMemHandle,
+ u32 ui32NumBytes, u32 ui32PageSize, void *hUniqueTag);
void PDumpMallocPagesPhys(enum PVRSRV_DEVICE_TYPE eDeviceType,
u32 ui32DevVAddr, u32 *pui32PhysPages, u32 ui32NumPages,
void *hUniqueTag);
void PDumpMallocPageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
void *pvLinAddr, u32 ui32NumBytes, void *hUniqueTag);
+enum PVRSRV_ERROR PDumpSetMMUContext(enum PVRSRV_DEVICE_TYPE eDeviceType,
+ char *pszMemSpace, u32 *pui32MMUContextID,
+ u32 ui32MMUType, void *hUniqueTag1,
+ void *pvPDCPUAddr);
+enum PVRSRV_ERROR PDumpClearMMUContext(enum PVRSRV_DEVICE_TYPE eDeviceType,
+ char *pszMemSpace,
+ u32 ui32MMUContextID, u32 ui32MMUType);
void PDumpFreePages(struct BM_HEAP *psBMHeap,
- struct IMG_DEV_VIRTADDR sDevVAddr,
- u32 ui32NumBytes, void *hUniqueTag, IMG_BOOL bInterleaved);
+ struct IMG_DEV_VIRTADDR sDevVAddr, u32 ui32NumBytes,
+ u32 ui32PageSize, void *hUniqueTag, IMG_BOOL bInterleaved);
void PDumpFreePageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
void *pvLinAddr, u32 ui32NumBytes, void *hUniqueTag);
void PDumpPDReg(u32 ui32Reg, u32 ui32dwData, void *hUniqueTag);
void PDumpCounterRegisters(u32 ui32DumpFrameNum, IMG_BOOL bLastFrame,
u32 *pui32Registers, u32 ui32NumRegisters);
-void PDumpEndInitPhase(void);
-
-void PDumpCBP(struct PVRSRV_KERNEL_MEM_INFO *psROffMemInfo, u32 ui32ROffOffset,
- u32 ui32WPosVal, u32 ui32PacketSize, u32 ui32BufferSize,
- u32 ui32Flags, void *hUniqueTag);
+void PDumpCBP(struct PVRSRV_KERNEL_MEM_INFO *psROffMemInfo,
+ u32 ui32ROffOffset,
+ u32 ui32WPosVal,
+ u32 ui32PacketSize,
+ u32 ui32BufferSize, u32 ui32Flags, void *hUniqueTag);
void PDumpIDLWithFlags(u32 ui32Clocks, u32 ui32Flags);
void PDumpIDL(u32 ui32Clocks);
#define PDUMPMEMPOL PDumpMemPolKM
#define PDUMPMEM PDumpMemKM
#define PDUMPMEM2 PDumpMem2KM
-#define PDUMPINIT PDumpInit
-#define PDUMPDEINIT PDumpDeInit
+#define PDUMPMEMUM PDumpMemUM
+#define PDUMPINIT PDumpInitCommon
+#define PDUMPDEINIT PDumpDeInitCommon
#define PDUMPISLASTFRAME PDumpIsLastCaptureFrameKM
#define PDUMPTESTFRAME PDumpIsCaptureFrameKM
#define PDUMPTESTNEXTFRAME PDumpTestNextFrame
#define PDUMPREGPOLWITHFLAGS PDumpRegPolWithFlagsKM
#define PDUMPMALLOCPAGES PDumpMallocPages
#define PDUMPMALLOCPAGETABLE PDumpMallocPageTable
+#define PDUMPSETMMUCONTEXT PDumpSetMMUContext
+#define PDUMPCLEARMMUCONTEXT PDumpClearMMUContext
#define PDUMPFREEPAGES PDumpFreePages
#define PDUMPFREEPAGETABLE PDumpFreePageTable
#define PDUMPPDREG PDumpPDReg
#define PDUMPPDREGWITHFLAGS PDumpPDRegWithFlags
#define PDUMPCBP PDumpCBP
#define PDUMPMALLOCPAGESPHYS PDumpMallocPagesPhys
-#define PDUMPENDINITPHASE PDumpEndInitPhase
+#define PDUMPENDINITPHASE PDumpStopInitPhaseKM
#define PDUMPMSVDXREGWRITE PDumpMsvdxRegWrite
#define PDUMPMSVDXREGREAD PDumpMsvdxRegRead
#define PDUMPMSVDXPOL PDumpMsvdxRegPol
#define PDUMPMEMPOL(args...)
#define PDUMPMEM(args...)
#define PDUMPMEM2(args...)
+#define PDUMPMEMUM(args...)
#define PDUMPINIT(args...)
#define PDUMPDEINIT(args...)
#define PDUMPISLASTFRAME(args...)
#define PDUMPREGPOLWITHFLAGS(args...)
#define PDUMPMALLOCPAGES(args...)
#define PDUMPMALLOCPAGETABLE(args...)
+#define PDUMPSETMMUCONTEXT(args...)
+#define PDUMPCLEARMMUCONTEXT(args...)
#define PDUMPFREEPAGES(args...)
#define PDUMPFREEPAGETABLE(args...)
#define PDUMPPDREG(args...)
#define __PDUMPDEFS_H__
enum PDUMP_PIXEL_FORMAT {
- PVRSRV_PDUMP_PIXEL_FORMAT_RGB8 = 1,
- PVRSRV_PDUMP_PIXEL_FORMAT_RGB332 = 2,
- PVRSRV_PDUMP_PIXEL_FORMAT_KRGB555 = 3,
- PVRSRV_PDUMP_PIXEL_FORMAT_RGB565 = 4,
- PVRSRV_PDUMP_PIXEL_FORMAT_ARGB4444 = 5,
- PVRSRV_PDUMP_PIXEL_FORMAT_ARGB1555 = 6,
- PVRSRV_PDUMP_PIXEL_FORMAT_RGB888 = 7,
- PVRSRV_PDUMP_PIXEL_FORMAT_ARGB8888 = 8,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV8 = 9,
- PVRSRV_PDUMP_PIXEL_FORMAT_AYUV4444 = 10,
- PVRSRV_PDUMP_PIXEL_FORMAT_VY0UY1_8888 = 11,
- PVRSRV_PDUMP_PIXEL_FORMAT_UY0VY1_8888 = 12,
- PVRSRV_PDUMP_PIXEL_FORMAT_Y0UY1V_8888 = 13,
- PVRSRV_PDUMP_PIXEL_FORMAT_Y0VY1U_8888 = 14,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV888 = 15,
- PVRSRV_PDUMP_PIXEL_FORMAT_UYVY10101010 = 16,
- PVRSRV_PDUMP_PIXEL_FORMAT_VYAUYA8888 = 17,
- PVRSRV_PDUMP_PIXEL_FORMAT_AYUV8888 = 18,
- PVRSRV_PDUMP_PIXEL_FORMAT_AYUV2101010 = 19,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV101010 = 20,
- PVRSRV_PDUMP_PIXEL_FORMAT_PL12Y8 = 21,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV_IMC2 = 22,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV_YV12 = 23,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV_PL8 = 24,
- PVRSRV_PDUMP_PIXEL_FORMAT_YUV_PL12 = 25,
- PVRSRV_PDUMP_PIXEL_FORMAT_422PL12YUV8 = 26,
- PVRSRV_PDUMP_PIXEL_FORMAT_420PL12YUV8 = 27,
- PVRSRV_PDUMP_PIXEL_FORMAT_PL12Y10 = 28,
- PVRSRV_PDUMP_PIXEL_FORMAT_422PL12YUV10 = 29,
- PVRSRV_PDUMP_PIXEL_FORMAT_420PL12YUV10 = 30,
- PVRSRV_PDUMP_PIXEL_FORMAT_ABGR8888 = 31,
- PVRSRV_PDUMP_PIXEL_FORMAT_BGRA8888 = 32,
- PVRSRV_PDUMP_PIXEL_FORMAT_ARGB8332 = 33,
- PVRSRV_PDUMP_PIXEL_FORMAT_RGB555 = 34,
- PVRSRV_PDUMP_PIXEL_FORMAT_F16 = 35,
- PVRSRV_PDUMP_PIXEL_FORMAT_F32 = 36,
- PVRSRV_PDUMP_PIXEL_FORMAT_L16 = 37,
- PVRSRV_PDUMP_PIXEL_FORMAT_L32 = 38,
+ PVRSRV_PDUMP_PIXEL_FORMAT_RGB8 = 1,
+ PVRSRV_PDUMP_PIXEL_FORMAT_RGB332 = 2,
+ PVRSRV_PDUMP_PIXEL_FORMAT_KRGB555 = 3,
+ PVRSRV_PDUMP_PIXEL_FORMAT_RGB565 = 4,
+ PVRSRV_PDUMP_PIXEL_FORMAT_ARGB4444 = 5,
+ PVRSRV_PDUMP_PIXEL_FORMAT_ARGB1555 = 6,
+ PVRSRV_PDUMP_PIXEL_FORMAT_RGB888 = 7,
+ PVRSRV_PDUMP_PIXEL_FORMAT_ARGB8888 = 8,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV8 = 9,
+ PVRSRV_PDUMP_PIXEL_FORMAT_AYUV4444 = 10,
+ PVRSRV_PDUMP_PIXEL_FORMAT_VY0UY1_8888 = 11,
+ PVRSRV_PDUMP_PIXEL_FORMAT_UY0VY1_8888 = 12,
+ PVRSRV_PDUMP_PIXEL_FORMAT_Y0UY1V_8888 = 13,
+ PVRSRV_PDUMP_PIXEL_FORMAT_Y0VY1U_8888 = 14,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV888 = 15,
+ PVRSRV_PDUMP_PIXEL_FORMAT_UYVY10101010 = 16,
+ PVRSRV_PDUMP_PIXEL_FORMAT_VYAUYA8888 = 17,
+ PVRSRV_PDUMP_PIXEL_FORMAT_AYUV8888 = 18,
+ PVRSRV_PDUMP_PIXEL_FORMAT_AYUV2101010 = 19,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV101010 = 20,
+ PVRSRV_PDUMP_PIXEL_FORMAT_PL12Y8 = 21,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV_IMC2 = 22,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV_YV12 = 23,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV_PL8 = 24,
+ PVRSRV_PDUMP_PIXEL_FORMAT_YUV_PL12 = 25,
+ PVRSRV_PDUMP_PIXEL_FORMAT_422PL12YUV8 = 26,
+ PVRSRV_PDUMP_PIXEL_FORMAT_420PL12YUV8 = 27,
+ PVRSRV_PDUMP_PIXEL_FORMAT_PL12Y10 = 28,
+ PVRSRV_PDUMP_PIXEL_FORMAT_422PL12YUV10 = 29,
+ PVRSRV_PDUMP_PIXEL_FORMAT_420PL12YUV10 = 30,
+ PVRSRV_PDUMP_PIXEL_FORMAT_ABGR8888 = 31,
+ PVRSRV_PDUMP_PIXEL_FORMAT_BGRA8888 = 32,
+ PVRSRV_PDUMP_PIXEL_FORMAT_ARGB8332 = 33,
+ PVRSRV_PDUMP_PIXEL_FORMAT_RGB555 = 34,
+ PVRSRV_PDUMP_PIXEL_FORMAT_F16 = 35,
+ PVRSRV_PDUMP_PIXEL_FORMAT_F32 = 36,
+ PVRSRV_PDUMP_PIXEL_FORMAT_L16 = 37,
+ PVRSRV_PDUMP_PIXEL_FORMAT_L32 = 38,
- PVRSRV_PDUMP_PIXEL_FORMAT_FORCE_I32 = 0x7fffffff
+ PVRSRV_PDUMP_PIXEL_FORMAT_FORCE_I32 = 0x7fffffff
};
enum PDUMP_MEM_FORMAT {
- PVRSRV_PDUMP_MEM_FORMAT_STRIDE = 0,
- PVRSRV_PDUMP_MEM_FORMAT_RESERVED = 1,
- PVRSRV_PDUMP_MEM_FORMAT_TILED = 8,
- PVRSRV_PDUMP_MEM_FORMAT_TWIDDLED = 9,
- PVRSRV_PDUMP_MEM_FORMAT_HYBRID = 10,
+ PVRSRV_PDUMP_MEM_FORMAT_STRIDE = 0,
+ PVRSRV_PDUMP_MEM_FORMAT_RESERVED = 1,
+ PVRSRV_PDUMP_MEM_FORMAT_TILED = 8,
+ PVRSRV_PDUMP_MEM_FORMAT_TWIDDLED = 9,
+ PVRSRV_PDUMP_MEM_FORMAT_HYBRID = 10,
- PVRSRV_PDUMP_MEM_FORMAT_FORCE_I32 = 0x7fffffff
+ PVRSRV_PDUMP_MEM_FORMAT_FORCE_I32 = 0x7fffffff
};
enum PDUMP_POLL_OPERATOR {
- PDUMP_POLL_OPERATOR_EQUAL = 0,
- PDUMP_POLL_OPERATOR_LESS = 1,
- PDUMP_POLL_OPERATOR_LESSEQUAL = 2,
- PDUMP_POLL_OPERATOR_GREATER = 3,
- PDUMP_POLL_OPERATOR_GREATEREQUAL = 4,
- PDUMP_POLL_OPERATOR_NOTEQUAL = 5,
+ PDUMP_POLL_OPERATOR_EQUAL = 0,
+ PDUMP_POLL_OPERATOR_LESS = 1,
+ PDUMP_POLL_OPERATOR_LESSEQUAL = 2,
+ PDUMP_POLL_OPERATOR_GREATER = 3,
+ PDUMP_POLL_OPERATOR_GREATEREQUAL = 4,
+ PDUMP_POLL_OPERATOR_NOTEQUAL = 5,
};
#endif
#include "resman.h"
#include "handle.h"
#include "perproc.h"
+#include "osperproc.h"
#define HASH_TAB_INIT_SIZE 32
PVR_ASSERT(psPerProc != NULL);
+ if (psPerProc == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "FreePerProcessData: invalid parameter");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
uiPerProc = HASH_Remove(psHashTab, (u32)psPerProc->ui32PID);
if (uiPerProc == 0) {
PVR_DPF(PVR_DBG_ERROR, "FreePerProcessData: "
- "Couldn't find process in per-process data hash table");
+ "Couldn't find process in per-process data hash table");
PVR_ASSERT(psPerProc->ui32PID == 0);
} else {
}
}
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(*psPerProc),
- psPerProc, psPerProc->hBlockAlloc);
+ eError = OSPerProcessPrivateDataDeInit(psPerProc->hOsPrivateData);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "FreePerProcessData: "
+ "OSPerProcessPrivateDataDeInit failed (%d)",
+ eError);
+ return eError;
+ }
+
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(*psPerProc), psPerProc,
+ psPerProc->hBlockAlloc);
return PVRSRV_OK;
}
&hBlockAlloc);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: "
- "Couldn't allocate per-process data (%d)",
+ "Couldn't allocate per-process data (%d)",
eError);
return eError;
}
psPerProc->ui32PID = ui32PID;
psPerProc->ui32RefCount = 0;
+ eError =
+ OSPerProcessPrivateDataInit(&psPerProc->hOsPrivateData);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: "
+ "OSPerProcessPrivateDataInit failed (%d)",
+ eError);
+ goto failure;
+ }
+
eError = PVRSRVAllocHandle(KERNEL_HANDLE_BASE,
&psPerProc->hPerProcData,
psPerProc,
goto failure;
}
- eError = PVRSRVAllocHandleBase(&psPerProc->psHandleBase,
- ui32PID);
+ eError = PVRSRVAllocHandleBase(&psPerProc->psHandleBase);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: "
"Couldn't allocate handle base for process (%d)",
goto failure;
}
- eError = PVRSRVResManConnect(psPerProc,
- &psPerProc->hResManContext);
+ eError = OSPerProcessSetHandleOptions(psPerProc->psHandleBase);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: "
+ "Couldn't set handle options (%d)",
+ eError);
+ goto failure;
+ }
+
+ eError =
+ PVRSRVResManConnect(psPerProc, &psPerProc->hResManContext);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: "
"Couldn't register with the resource manager");
(u32)ui32PID);
if (psPerProc == NULL) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataDealloc: "
- "Couldn't locate per-process data for PID %u",
+ "Couldn't locate per-process data for PID %u",
ui32PID);
} else {
psPerProc->ui32RefCount--;
eError = FreePerProcessData(psPerProc);
if (eError != PVRSRV_OK)
PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVPerProcessDataDisconnect: "
- "Error freeing per-process data");
+ "PVRSRVPerProcessDataDisconnect: "
+ "Error freeing per-process data");
}
}
+
+ eError = PVRSRVPurgeHandles(KERNEL_HANDLE_BASE);
+ if (eError != PVRSRV_OK)
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVPerProcessDataDisconnect: "
+ "Purge of global handle pool failed (%d)",
+ eError);
}
enum PVRSRV_ERROR PVRSRVPerProcessDataInit(void)
enum PVRSRV_ERROR PVRSRVPerProcessDataInit(void);
enum PVRSRV_ERROR PVRSRVPerProcessDataDeInit(void);
+static inline struct PVRSRV_PER_PROCESS_DATA *PVRSRVFindPerProcessData(void)
+{
+ return PVRSRVPerProcessData(OSGetCurrentProcessIDKM());
+}
+
+static inline void *PVRSRVProcessPrivateData(struct PVRSRV_PER_PROCESS_DATA
+ *psPerProc)
+{
+ return (psPerProc != NULL) ? psPerProc->hOsPrivateData : NULL;
+}
+
+static inline void *PVRSRVPerProcessPrivateData(u32 ui32PID)
+{
+ return PVRSRVProcessPrivateData(PVRSRVPerProcessData(ui32PID));
+}
+
+static inline void *PVRSRVFindPerProcessPrivateData(void)
+{
+ return PVRSRVProcessPrivateData(PVRSRVFindPerProcessData());
+}
+
#endif
*
******************************************************************************/
#include "services_headers.h"
+#include "pdump_km.h"
#include <linux/kernel.h>
#include <linux/mutex.h>
#include <linux/sched.h>
#include <linux/wait.h>
-static IMG_BOOL gbInitServerRunning = IMG_FALSE;
-static IMG_BOOL gbInitServerRan = IMG_FALSE;
-static IMG_BOOL gbInitSuccessful = IMG_FALSE;
+static IMG_BOOL gbInitServerRunning;
+static IMG_BOOL gbInitServerRan;
+static IMG_BOOL gbInitSuccessful;
static DEFINE_MUTEX(hPowerAndFreqLock);
static DECLARE_WAIT_QUEUE_HEAD(hDvfsWq);
static IMG_BOOL gbDvfsActive;
psPowerDevice = psSysData->psPowerDeviceList;
while (psPowerDevice) {
- if (bAllDevices
- || (ui32DeviceIndex == psPowerDevice->ui32DeviceIndex)) {
+ if (bAllDevices ||
+ (ui32DeviceIndex == psPowerDevice->ui32DeviceIndex)) {
eNewDevicePowerState =
- (eNewPowerState ==
- PVRSRV_POWER_Unspecified) ? psPowerDevice->
- eDefaultPowerState : eNewPowerState;
+ (eNewPowerState == PVRSRV_POWER_Unspecified) ?
+ psPowerDevice->eDefaultPowerState :
+ eNewPowerState;
if (psPowerDevice->eCurrentPowerState !=
eNewDevicePowerState) {
if (psPowerDevice->pfnPrePower != NULL) {
-
eError =
psPowerDevice->
pfnPrePower(psPowerDevice->
psPowerDevice->
eCurrentPowerState);
if (eError != PVRSRV_OK) {
- pr_err("pfnPrePower failed "
- "(%u)\n", eError);
+ pr_err
+ ("pfnPrePower failed (%u)\n",
+ eError);
return eError;
}
}
- eError =
- SysDevicePrePowerState(psPowerDevice->
- ui32DeviceIndex,
- eNewDevicePowerState,
- psPowerDevice->
- eCurrentPowerState);
+ eError = SysDevicePrePowerState(
+ psPowerDevice->ui32DeviceIndex,
+ eNewDevicePowerState,
+ psPowerDevice->eCurrentPowerState);
if (eError != PVRSRV_OK) {
pr_err("SysDevicePrePowerState failed "
"(%u)\n", eError);
if (psPowerDevice->eCurrentPowerState !=
eNewDevicePowerState) {
-
eError = SysDevicePostPowerState(
psPowerDevice->ui32DeviceIndex,
eNewDevicePowerState,
psPowerDevice->eCurrentPowerState);
if (eError != PVRSRV_OK) {
- pr_err("SysDevicePostPowerState failed "
- "(%u)\n", eError);
+ pr_err("SysDevicePostPowerState "
+ "failed (%u)\n", eError);
return eError;
}
psPowerDevice->
eCurrentPowerState);
if (eError != PVRSRV_OK) {
- pr_err(
- "pfnPostPower failed (%u)\n",
- eError);
+ pr_err
+ ("pfnPostPower failed "
+ "(%u)\n", eError);
return eError;
}
}
eError = PVRSRVPowerLock(ui32CallerID, IMG_FALSE);
if (eError != PVRSRV_OK)
return eError;
+#if defined(PDUMP)
+ if (eNewPowerState == PVRSRV_POWER_Unspecified) {
+ eError =
+ PVRSRVDevicePrePowerStateKM(IMG_FALSE, ui32DeviceIndex,
+ PVRSRV_POWER_STATE_D0);
+ if (eError != PVRSRV_OK)
+ goto Exit;
+ eError =
+ PVRSRVDevicePostPowerStateKM(IMG_FALSE, ui32DeviceIndex,
+ PVRSRV_POWER_STATE_D0);
+ if (eError != PVRSRV_OK)
+ goto Exit;
- eError =
- PVRSRVDevicePrePowerStateKM(IMG_FALSE, ui32DeviceIndex,
- eNewPowerState);
- if (eError != PVRSRV_OK)
+ PDUMPSUSPEND();
+ }
+#endif
+
+ eError = PVRSRVDevicePrePowerStateKM(IMG_FALSE, ui32DeviceIndex,
+ eNewPowerState);
+ if (eError != PVRSRV_OK) {
+ if (eNewPowerState == PVRSRV_POWER_Unspecified)
+ PDUMPRESUME();
goto Exit;
+ }
- eError =
- PVRSRVDevicePostPowerStateKM(IMG_FALSE, ui32DeviceIndex,
+ eError = PVRSRVDevicePostPowerStateKM(IMG_FALSE, ui32DeviceIndex,
eNewPowerState);
+ if (eNewPowerState == PVRSRV_POWER_Unspecified)
+ PDUMPRESUME();
+
Exit:
- if (eError != PVRSRV_OK)
+ if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVSetDevicePowerStateKM : "
- "Transition to %d FAILED 0x%x",
+ "Transition to %d FAILED 0x%x",
eNewPowerState, eError);
+ }
if (!bRetainMutex || (eError != PVRSRV_OK))
PVRSRVPowerUnlock(ui32CallerID);
enum PVRSRV_ERROR PVRSRVSystemPrePowerStateKM(
enum PVR_POWER_STATE eNewPowerState)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
struct SYS_DATA *psSysData;
enum PVR_POWER_STATE eNewDevicePowerState;
if (_IsSystemStatePowered(eNewPowerState) !=
_IsSystemStatePowered(psSysData->eCurrentPowerState)) {
if (_IsSystemStatePowered(eNewPowerState))
-
eNewDevicePowerState = PVRSRV_POWER_Unspecified;
else
eNewDevicePowerState = PVRSRV_POWER_STATE_D3;
- eError =
- PVRSRVDevicePrePowerStateKM(IMG_TRUE, 0,
+ eError = PVRSRVDevicePrePowerStateKM(IMG_TRUE, 0,
eNewDevicePowerState);
if (eError != PVRSRV_OK)
goto ErrorExit;
}
if (eNewPowerState != psSysData->eCurrentPowerState) {
-
eError = SysSystemPrePowerState(eNewPowerState);
if (eError != PVRSRV_OK)
goto ErrorExit;
ErrorExit:
PVR_DPF(PVR_DBG_ERROR, "PVRSRVSystemPrePowerStateKM: "
- "Transition from %d to %d FAILED 0x%x",
+ "Transition from %d to %d FAILED 0x%x",
psSysData->eCurrentPowerState, eNewPowerState, eError);
psSysData->eFailedPowerState = eNewPowerState;
enum PVRSRV_ERROR PVRSRVSystemPostPowerStateKM(
enum PVR_POWER_STATE eNewPowerState)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
struct SYS_DATA *psSysData;
enum PVR_POWER_STATE eNewDevicePowerState;
goto Exit;
if (eNewPowerState != psSysData->eCurrentPowerState) {
-
eError = SysSystemPostPowerState(eNewPowerState);
if (eError != PVRSRV_OK)
goto Exit;
if (_IsSystemStatePowered(eNewPowerState) !=
_IsSystemStatePowered(psSysData->eCurrentPowerState)) {
if (_IsSystemStatePowered(eNewPowerState))
-
eNewDevicePowerState = PVRSRV_POWER_Unspecified;
else
eNewDevicePowerState = PVRSRV_POWER_STATE_D3;
}
PVR_DPF(PVR_DBG_WARNING, "PVRSRVSystemPostPowerStateKM: "
- "System Power Transition from %d to %d OK",
+ "System Power Transition from %d to %d OK",
psSysData->eCurrentPowerState, eNewPowerState);
psSysData->eCurrentPowerState = eNewPowerState;
if (_IsSystemStatePowered(eNewPowerState) &&
PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL))
-
PVRSRVCommandCompleteCallbacks();
return eError;
ErrorExit:
- PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVSetPowerStateKM: Transition from %d to %d FAILED 0x%x",
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVSetPowerStateKM: "
+ "Transition from %d to %d FAILED 0x%x",
psSysData->eCurrentPowerState, eNewPowerState, eError);
psSysData->eFailedPowerState = eNewPowerState;
}
enum PVRSRV_ERROR PVRSRVRegisterPowerDevice(u32 ui32DeviceIndex,
- enum PVRSRV_ERROR (*pfnPrePower)(void *, enum PVR_POWER_STATE,
- enum PVR_POWER_STATE),
- enum PVRSRV_ERROR (*pfnPostPower)(void *, enum PVR_POWER_STATE,
- enum PVR_POWER_STATE),
- enum PVRSRV_ERROR (*pfnPreClockSpeedChange)(void *, IMG_BOOL,
- enum PVR_POWER_STATE),
- enum PVRSRV_ERROR (*pfnPostClockSpeedChange)(void *, IMG_BOOL,
- enum PVR_POWER_STATE),
- void *hDevCookie, enum PVR_POWER_STATE eCurrentPowerState,
- enum PVR_POWER_STATE eDefaultPowerState)
+ enum PVRSRV_ERROR (*pfnPrePower)(void *, enum PVR_POWER_STATE,
+ enum PVR_POWER_STATE),
+ enum PVRSRV_ERROR (*pfnPostPower)(void *, enum PVR_POWER_STATE,
+ enum PVR_POWER_STATE),
+ enum PVRSRV_ERROR (*pfnPreClockSpeedChange)(void *, IMG_BOOL,
+ enum PVR_POWER_STATE),
+ enum PVRSRV_ERROR (*pfnPostClockSpeedChange)(void *, IMG_BOOL,
+ enum PVR_POWER_STATE),
+ void *hDevCookie, enum PVR_POWER_STATE eCurrentPowerState,
+ enum PVR_POWER_STATE eDefaultPowerState)
{
enum PVRSRV_ERROR eError;
struct SYS_DATA *psSysData;
sizeof(struct PVRSRV_POWER_DEV),
(void **) &psPowerDevice, NULL);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVRegisterPowerDevice: alloc failed");
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterPowerDevice: "
+ "Failed to alloc struct PVRSRV_POWER_DEV");
return eError;
}
while (psCurrent)
if (psCurrent->ui32DeviceIndex == ui32DeviceIndex) {
-
if (psPrevious)
psPrevious->psNext = psCurrent->psNext;
else
-
psSysData->psPowerDeviceList =
psCurrent->psNext;
-
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct PVRSRV_POWER_DEV), psCurrent,
NULL);
-
break;
} else {
psPrevious = psCurrent;
psCurrent = psCurrent->psNext;
}
-
return PVRSRV_OK;
}
if (eError != PVRSRV_OK)
return IMG_FALSE;
+ if (OSIsResourceLocked(&psSysData->sPowerStateChangeResource,
+ KERNEL_ID) ||
+ OSIsResourceLocked(&psSysData->sPowerStateChangeResource, ISR_ID))
+ return IMG_FALSE;
+
psPowerDevice = psSysData->psPowerDeviceList;
while (psPowerDevice) {
if (psPowerDevice->ui32DeviceIndex == ui32DeviceIndex)
- return (IMG_BOOL)
- (psPowerDevice->eCurrentPowerState ==
+ return (IMG_BOOL)(psPowerDevice->eCurrentPowerState ==
PVRSRV_POWER_STATE_D0);
-
psPowerDevice = psPowerDevice->psNext;
}
PVR_UNREFERENCED_PARAMETER(pvInfo);
- SysAcquireData(&psSysData);
+ eError = SysAcquireData(&psSysData);
+ if (eError != PVRSRV_OK)
+ return eError;
psPowerDevice = psSysData->psPowerDeviceList;
while (psPowerDevice) {
"PVRSRVDevicePreClockSpeedChange : "
"Device %lu failed, error:0x%lx",
ui32DeviceIndex, eError);
+ break;
}
}
-
psPowerDevice = psPowerDevice->psNext;
}
+
+ if (bIdleDevice && eError != PVRSRV_OK)
+ PVRSRVPowerUnlock(KERNEL_ID);
+
return eError;
}
-void PVRSRVDevicePostClockSpeedChange(u32 ui32DeviceIndex,
- IMG_BOOL bIdleDevice,
- void *pvInfo)
+void PVRSRVDevicePostClockSpeedChange(u32 ui32DeviceIndex, IMG_BOOL bIdleDevice,
+ void *pvInfo)
{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
+ enum PVRSRV_ERROR eError;
struct SYS_DATA *psSysData;
struct PVRSRV_POWER_DEV *psPowerDevice;
PVR_UNREFERENCED_PARAMETER(pvInfo);
- SysAcquireData(&psSysData);
+ eError = SysAcquireData(&psSysData);
+ if (eError != PVRSRV_OK)
+ return;
psPowerDevice = psSysData->psPowerDeviceList;
while (psPowerDevice) {
eCurrentPowerState);
if (eError != PVRSRV_OK) {
pr_err
- ("pfnPostClockSpeedChange failed\n");
+ ("pfnPostClockSpeedChange "
+ "failed\n");
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVDevicePostClockSpeedChange : "
"Device %lu failed, error:0x%lx",
ui32DeviceIndex, eError);
}
}
-
psPowerDevice = psPowerDevice->psNext;
}
}
struct PVRSRV_POWER_DEV {
enum PVRSRV_ERROR (*pfnPrePower)(void *, enum PVR_POWER_STATE,
- enum PVR_POWER_STATE);
+ enum PVR_POWER_STATE);
enum PVRSRV_ERROR (*pfnPostPower)(void *, enum PVR_POWER_STATE,
- enum PVR_POWER_STATE);
- enum PVRSRV_ERROR (*pfnPreClockSpeedChange)(void *, IMG_BOOL,
enum PVR_POWER_STATE);
+ enum PVRSRV_ERROR (*pfnPreClockSpeedChange)(void *, IMG_BOOL,
+ enum PVR_POWER_STATE);
enum PVRSRV_ERROR (*pfnPostClockSpeedChange)(void *, IMG_BOOL,
- enum PVR_POWER_STATE);
+ enum PVR_POWER_STATE);
void *hDevCookie;
u32 ui32DeviceIndex;
enum PVR_POWER_STATE eDefaultPowerState;
enum PVRSRV_ERROR PVRSRVSetPowerStateKM(enum PVR_POWER_STATE ePVRState);
enum PVRSRV_ERROR PVRSRVRegisterPowerDevice(u32 ui32DeviceIndex,
- enum PVRSRV_ERROR (*pfnPrePower)(void *, enum PVR_POWER_STATE,
- enum PVR_POWER_STATE),
- enum PVRSRV_ERROR (*pfnPostPower)(void *, enum PVR_POWER_STATE,
- enum PVR_POWER_STATE),
- enum PVRSRV_ERROR (*pfnPreClockSpeedChange)(void *, IMG_BOOL,
- enum PVR_POWER_STATE),
- enum PVRSRV_ERROR (*pfnPostClockSpeedChange)(void *, IMG_BOOL,
- enum PVR_POWER_STATE),
- void *hDevCookie, enum PVR_POWER_STATE eCurrentPowerState,
- enum PVR_POWER_STATE eDefaultPowerState);
+ enum PVRSRV_ERROR (*pfnPrePower)(void *, enum PVR_POWER_STATE,
+ enum PVR_POWER_STATE),
+ enum PVRSRV_ERROR (*pfnPostPower)(void *, enum PVR_POWER_STATE,
+ enum PVR_POWER_STATE),
+ enum PVRSRV_ERROR (*pfnPreClockSpeedChange)(void *, IMG_BOOL,
+ enum PVR_POWER_STATE),
+ enum PVRSRV_ERROR (*pfnPostClockSpeedChange)(void *, IMG_BOOL,
+ enum PVR_POWER_STATE),
+ void *hDevCookie, enum PVR_POWER_STATE eCurrentPowerState,
+ enum PVR_POWER_STATE eDefaultPowerState);
enum PVRSRV_ERROR PVRSRVRemovePowerDevice(u32 ui32DeviceIndex);
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#ifndef __INCLUDED_PRIVATE_DATA_H_
+#define __INCLUDED_PRIVATE_DATA_H_
+
+struct PVRSRV_FILE_PRIVATE_DATA {
+ u32 ui32OpenPID;
+ void *hBlockAlloc;
+};
+
+#endif
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/init.h>
#include <linux/module.h>
#include <linux/version.h>
#include "pvr_debug.h"
#include "pvrversion.h"
#include "proc.h"
+#include "perproc.h"
+#include "env_perproc.h"
+
+/* The proc entry for our /proc/pvr directory */
static struct proc_dir_entry *dir;
static off_t procDumpSysNodes(char *buf, size_t size, off_t off);
static off_t procDumpVersion(char *buf, size_t size, off_t off);
+static const char PVRProcDirRoot[] = "pvr";
+
off_t printAppend(char *buffer, size_t size, off_t off, const char *format, ...)
{
int n;
int space = size - off;
va_list ap;
+ PVR_ASSERT(space >= 0);
+
va_start(ap, format);
n = vsnprintf(buffer + off, space, format, ap);
va_end(ap);
- if (n > space || n < 0)
- return size;
- else
+ if (n >= space || n < 0) {
+
+ buffer[size - 1] = 0;
+ return size - 1;
+ } else {
return off + n;
}
+}
static int pvr_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data)
return len;
}
-int CreateProcEntry(const char *name, read_proc_t rhandler,
- write_proc_t whandler, void *data)
+static int CreateProcEntryInDir(struct proc_dir_entry *pdir, const char *name,
+ read_proc_t rhandler, write_proc_t whandler,
+ void *data)
{
struct proc_dir_entry *file;
mode_t mode;
- if (!dir) {
- PVR_DPF(PVR_DBG_ERROR, "CreateProcEntry: "
- "cannot make proc entry /proc/pvr/%s: no parent",
- name);
+ if (!pdir) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreateProcEntryInDir: parent directory doesn't exist");
+
return -ENOMEM;
}
if (whandler)
mode |= S_IWUSR;
- file = create_proc_entry(name, mode, dir);
+ file = create_proc_entry(name, mode, pdir);
if (file) {
- file->owner = THIS_MODULE;
file->read_proc = rhandler;
file->write_proc = whandler;
file->data = data;
- PVR_DPF(PVR_DBG_MESSAGE, "Created /proc/pvr/%s", name);
+ PVR_DPF(PVR_DBG_MESSAGE, "Created proc entry %s in %s", name,
+ pdir->name);
return 0;
}
- PVR_DPF(PVR_DBG_ERROR, "CreateProcEntry: "
- "cannot make proc entry /proc/pvr/%s: no memory", name);
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreateProcEntry: cannot create proc entry %s in %s", name,
+ pdir->name);
return -ENOMEM;
}
+int CreateProcEntry(const char *name, read_proc_t rhandler,
+ write_proc_t whandler, void *data)
+{
+ return CreateProcEntryInDir(dir, name, rhandler, whandler, data);
+}
+
+int CreatePerProcessProcEntry(const char *name, read_proc_t rhandler,
+ write_proc_t whandler, void *data)
+{
+ struct PVRSRV_ENV_PER_PROCESS_DATA *psPerProc;
+ u32 ui32PID;
+
+ if (!dir) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreatePerProcessProcEntries: /proc/%s doesn't exist",
+ PVRProcDirRoot);
+
+ return -ENOMEM;
+ }
+
+ ui32PID = OSGetCurrentProcessIDKM();
+
+ psPerProc = PVRSRVPerProcessPrivateData(ui32PID);
+ if (!psPerProc) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreatePerProcessProcEntries: no per process data");
+
+ return -ENOMEM;
+ }
+
+ if (!psPerProc->psProcDir) {
+ char dirname[16];
+ int ret;
+
+ ret = snprintf(dirname, sizeof(dirname), "%u", ui32PID);
+
+ if (ret <= 0 || ret >= sizeof(dirname)) {
+ PVR_DPF(PVR_DBG_ERROR, "CreatePerProcessProcEntries: "
+ "couldn't generate per process proc "
+ "directory name \"%u\"",
+ ui32PID);
+
+ return -ENOMEM;
+ } else {
+ psPerProc->psProcDir = proc_mkdir(dirname, dir);
+ if (!psPerProc->psProcDir) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreatePerProcessProcEntries: "
+ "couldn't create per process proc "
+ "directory /proc/%s/%u",
+ PVRProcDirRoot, ui32PID);
+
+ return -ENOMEM;
+ }
+ }
+ }
+
+ return CreateProcEntryInDir(psPerProc->psProcDir, name, rhandler,
+ whandler, data);
+}
+
int CreateProcReadEntry(const char *name,
off_t (handler)(char *, size_t, off_t))
{
if (!dir) {
PVR_DPF(PVR_DBG_ERROR, "CreateProcReadEntry: "
- "cannot make proc entry /proc/pvr/%s: no parent",
- name);
+ "cannot make proc entry /proc/%s/%s: no parent",
+ PVRProcDirRoot, name);
return -ENOMEM;
}
create_proc_read_entry(name, S_IFREG | S_IRUGO, dir, pvr_read_proc,
(void *)handler);
- if (file) {
- file->owner = THIS_MODULE;
-
+ if (file)
return 0;
- }
PVR_DPF(PVR_DBG_ERROR, "CreateProcReadEntry: "
- "cannot make proc entry /proc/pvr/%s: no memory",
- name);
+ "cannot make proc entry /proc/%s/%s: no memory",
+ PVRProcDirRoot, name);
return -ENOMEM;
}
int CreateProcEntries(void)
{
- dir = proc_mkdir("pvr", NULL);
+ dir = proc_mkdir(PVRProcDirRoot, NULL);
if (!dir) {
- PVR_DPF(PVR_DBG_ERROR, "CreateProcEntries: "
- "cannot make /proc/pvr directory");
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreateProcEntries: cannot make /proc/%s directory",
+ PVRProcDirRoot);
return -ENOMEM;
}
CreateProcReadEntry("version", procDumpVersion) ||
CreateProcReadEntry("nodes", procDumpSysNodes)) {
PVR_DPF(PVR_DBG_ERROR,
- "CreateProcEntries: couldn't make /proc/pvr files");
+ "CreateProcEntries: couldn't make /proc/%s files",
+ PVRProcDirRoot);
return -ENOMEM;
}
#ifdef DEBUG
if (CreateProcEntry
("debug_level", PVRDebugProcGetLevel, PVRDebugProcSetLevel, NULL)) {
- PVR_DPF(PVR_DBG_ERROR, "CreateProcEntries: "
- "couldn't make /proc/pvr/debug_level");
+ PVR_DPF(PVR_DBG_ERROR,
+ "CreateProcEntries: couldn't make /proc/%s/debug_level",
+ PVRProcDirRoot);
return -ENOMEM;
}
void RemoveProcEntry(const char *name)
{
- if (dir)
+ if (dir) {
remove_proc_entry(name, dir);
+ PVR_DPF(PVR_DBG_MESSAGE, "Removing /proc/%s/%s",
+ PVRProcDirRoot, name);
+ }
+}
+
+void RemovePerProcessProcEntry(const char *name)
+{
+ struct PVRSRV_ENV_PER_PROCESS_DATA *psPerProc =
+ PVRSRVFindPerProcessPrivateData();
+
+ if (!psPerProc) {
+ PVR_DPF(PVR_DBG_ERROR, "CreatePerProcessProcEntries: "
+ "can't remove %s, no per process data",
+ name);
+ return;
+ }
- PVR_DPF(PVR_DBG_MESSAGE, "Removing /proc/pvr/%s", name);
+ if (psPerProc->psProcDir) {
+ remove_proc_entry(name, psPerProc->psProcDir);
+
+ PVR_DPF(PVR_DBG_MESSAGE, "Removing proc entry %s from %s",
+ name, psPerProc->psProcDir->name);
+ }
+}
+
+void RemovePerProcessProcDir(struct PVRSRV_ENV_PER_PROCESS_DATA *psPerProc)
+{
+ if (psPerProc->psProcDir) {
+ while (psPerProc->psProcDir->subdir) {
+ PVR_DPF(PVR_DBG_WARNING,
+ "Belatedly removing /proc/%s/%s/%s",
+ PVRProcDirRoot, psPerProc->psProcDir->name,
+ psPerProc->psProcDir->subdir->name);
+
+ RemoveProcEntry(psPerProc->psProcDir->subdir->name);
+ }
+ RemoveProcEntry(psPerProc->psProcDir->name);
+ }
}
void RemoveProcEntries(void)
RemoveProcEntry("version");
while (dir->subdir) {
- PVR_DPF(PVR_DBG_WARNING, "Belatedly removing /proc/pvr/%s",
- dir->subdir->name);
+ PVR_DPF(PVR_DBG_WARNING, "Belatedly removing /proc/%s/%s",
+ PVRProcDirRoot, dir->subdir->name);
RemoveProcEntry(dir->subdir->name);
}
- remove_proc_entry("pvr", NULL);
+ remove_proc_entry(PVRProcDirRoot, NULL);
}
static off_t procDumpVersion(char *buf, size_t size, off_t off)
}
}
-static
-off_t procDumpSysNodes(char *buf, size_t size, off_t off)
+static off_t procDumpSysNodes(char *buf, size_t size, off_t off)
{
struct SYS_DATA *psSysData;
struct PVRSRV_DEVICE_NODE *psDevNode;
return 0;
if (off == 0)
- return printAppend(buf, size, 0, "Registered nodes\n"
- "Addr Type Class Index Ref pvDev "
- "Size Res\n");
+ return printAppend(buf, size, 0,
+ "Registered nodes\n"
+ "Addr Type Class Index Ref pvDev Size Res\n");
if (SysAcquireData(&psSysData) != PVRSRV_OK)
return PVRSRV_ERROR_GENERIC;
off_t (handler)(char *, size_t, off_t));
int CreateProcEntry(const char *name, read_proc_t rhandler,
write_proc_t whandler, void *data);
+
+int CreatePerProcessProcEntry(const char *name, read_proc_t rhandler,
+ write_proc_t whandler, void *data);
+
void RemoveProcEntry(const char *name);
+
+void RemovePerProcessProcEntry(const char *name);
+
void RemoveProcEntries(void);
#endif
_IOWR(PVRSRV_IOC_GID, INDEX, struct PVRSRV_BRIDGE_PACKAGE)
-#define PVRSRV_BRIDGE_CORE_CMD_FIRST 0
+#define PVRSRV_BRIDGE_CORE_CMD_FIRST 0
#define PVRSRV_BRIDGE_ENUM_DEVICES \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+0)
#define PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+9)
#define PVRSRV_BRIDGE_DESTROY_COMMANDQUEUE \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+10)
-#define PVRSRV_BRIDGE_KV_TO_MMAP_DATA \
+#define PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+11)
#define PVRSRV_BRIDGE_CONNECT_SERVICES \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+12)
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+24)
#define PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+25)
-#define PVRSRV_BRIDGE_CACHE_FLUSH_DRM \
+#define PVRSRV_BRIDGE_EXPORT_DEVICEMEM \
PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+26)
+#define PVRSRV_BRIDGE_RELEASE_MMAP_DATA \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+27)
+#define PVRSRV_BRIDGE_CACHE_FLUSH_DRM \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+28)
#define PVRSRV_BRIDGE_CORE_CMD_LAST \
- (PVRSRV_BRIDGE_CORE_CMD_FIRST+26)
+ (PVRSRV_BRIDGE_CORE_CMD_FIRST+28)
#define PVRSRV_BRIDGE_SIM_CMD_FIRST \
(PVRSRV_BRIDGE_CORE_CMD_LAST+1)
PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+14)
#define PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR \
PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+15)
-#define PVRSRV_BRIDGE_PDUMP_BUFFER_ARRAY \
- PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+16)
#define PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+16)
+#define PVRSRV_BRIDGE_PDUMP_STARTINITPHASE \
PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+17)
-#define PVRSRV_BRIDGE_PDUMP_3D_SIGNATURE_REGISTERS \
+#define PVRSRV_BRIDGE_PDUMP_STOPINITPHASE \
PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+18)
-#define PVRSRV_BRIDGE_PDUMP_COUNTER_REGISTERS \
- PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+19)
-#define PVRSRV_BRIDGE_PDUMP_TA_SIGNATURE_REGISTERS \
- PVRSRV_IOWR(PVRSRV_BRIDGE_PDUMP_CMD_FIRST+20)
#define PVRSRV_BRIDGE_PDUMP_CMD_LAST \
- (PVRSRV_BRIDGE_PDUMP_CMD_FIRST+20)
+ (PVRSRV_BRIDGE_PDUMP_CMD_FIRST+18)
#else
-#define PVRSRV_BRIDGE_PDUMP_CMD_LAST \
- PVRSRV_BRIDGE_OVERLAY_CMD_LAST
+#define PVRSRV_BRIDGE_PDUMP_CMD_LAST PVRSRV_BRIDGE_OVERLAY_CMD_LAST
#endif
#define PVRSRV_BRIDGE_OEM_CMD_FIRST \
#define PVRSRV_BRIDGE_EVENT_OBJECT_CMD_LAST \
(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+2)
-#define PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD \
+#define PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST \
(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_LAST+1)
+#define PVRSRV_BRIDGE_MODIFY_SYNC_OPS \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+0)
+#define PVRSRV_BRIDGE_SYNC_OPS_CMD_LAST \
+ (PVRSRV_BRIDGE_SYNC_OPS_CMD_FIRST+0)
+
+#define PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD \
+ (PVRSRV_BRIDGE_SYNC_OPS_CMD_LAST+1)
#define PVRSRV_KERNEL_MODE_CLIENT 1
u32 ui32BridgeFlags;
void *hDevCookie;
u32 ui32Type;
- void *pvVirt;
+ u32 ui32Virt;
u32 ui32Length;
};
void *hDevCookie;
struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
struct PVRSRV_CLIENT_MEM_INFO sClientMemInfo;
+
+};
+
+struct PVRSRV_BRIDGE_IN_EXPORTDEVICEMEM {
+ u32 ui32BridgeFlags;
+ void *hDevCookie;
+ struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
+
};
struct PVRSRV_BRIDGE_IN_GETFREEDEVICEMEM {
u32 ui32BridgeFlags;
void *hDevCookie;
struct PVRSRV_QUEUE_INFO *psQueueInfo;
+
};
-struct PVRSRV_BRIDGE_IN_KV_TO_MMAP_DATA {
+struct PVRSRV_BRIDGE_IN_MHANDLE_TO_MMAP_DATA {
u32 ui32BridgeFlags;
- void *pvKVIndexAddress;
- u32 ui32Bytes;
+ void *hMHandle;
+};
+
+struct PVRSRV_BRIDGE_IN_RELEASE_MMAP_DATA {
+ u32 ui32BridgeFlags;
+ void *hMHandle;
};
struct PVRSRV_BRIDGE_IN_RESERVE_DEV_VIRTMEM {
struct PVRSRV_BRIDGE_IN_MAP_DEV_MEMORY {
u32 ui32BridgeFlags;
- struct PVRSRV_KERNEL_MEM_INFO *psSrcKernelMemInfo;
+ void *hKernelMemInfo;
void *hDstDevMemHeap;
};
struct PVRSRV_BRIDGE_IN_MAP_DEVICECLASS_MEMORY {
u32 ui32BridgeFlags;
void *hDeviceClassBuffer;
+ void *hDevMemContext;
+
};
struct PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY {
struct PVRSRV_BRIDGE_IN_PDUMP_DUMPMEM {
u32 ui32BridgeFlags;
+ void *pvLinAddr;
void *pvAltLinAddr;
struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
u32 ui32Offset;
struct PVRSRV_BRIDGE_IN_WRAP_EXT_MEMORY {
u32 ui32BridgeFlags;
void *hDevCookie;
+ void *hDevMemContext;
void *pvLinAddr;
u32 ui32ByteSize;
u32 ui32PageOffset;
u32 ui32BridgeFlags;
void *hKernelMemInfo;
struct PVRSRV_CLIENT_MEM_INFO sClientMemInfo;
+ struct PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo;
+
};
#define PVRSRV_MAX_DC_DISPLAY_FORMATS 10
#define PVRSRV_MAX_DC_DISPLAY_DIMENSIONS 10
#define PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS 4
-#define PVRSRV_MAX_DC_CLIP_RECTS 32
+#define PVRSRV_MAX_DC_CLIP_RECTS 32
struct PVRSRV_BRIDGE_OUT_ENUM_DISPCLASS_FORMATS {
enum PVRSRV_ERROR eError;
struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
struct PVRSRV_CLIENT_MEM_INFO sClientMemInfo;
struct PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo;
+
+};
+
+struct PVRSRV_BRIDGE_OUT_EXPORTDEVICEMEM {
+ enum PVRSRV_ERROR eError;
+ void *hMemInfo;
+
};
struct PVRSRV_BRIDGE_OUT_MAPMEMINFOTOUSER {
};
#include "pvrmmap.h"
-struct PVRSRV_BRIDGE_OUT_KV_TO_MMAP_DATA {
+struct PVRSRV_BRIDGE_OUT_MHANDLE_TO_MMAP_DATA {
enum PVRSRV_ERROR eError;
-
u32 ui32MMapOffset;
-
u32 ui32ByteOffset;
+ u32 ui32RealByteSize;
+ u32 ui32UserVAddr;
+};
+struct PVRSRV_BRIDGE_OUT_RELEASE_MMAP_DATA {
+ enum PVRSRV_ERROR eError;
+ IMG_BOOL bMUnmap;
+ u32 ui32UserVAddr;
u32 ui32RealByteSize;
};
void *hOSEventKM;
};
+struct PVRSRV_BRIDGE_IN_MODIFY_SYNC_OPS {
+ u32 ui32BridgeFlags;
+ void *hKernelSyncInfo;
+ u32 ui32ModifyFlags;
+
+};
+
+struct PVRSRV_BRIDGE_OUT_MODIFY_SYNC_OPS {
+ enum PVRSRV_ERROR eError;
+ u32 ui32ReadOpsPending;
+ u32 ui32ReadOpsComplete;
+ u32 ui32WriteOpsPending;
+ u32 ui32WriteOpsComplete;
+
+};
+
#endif
#include "syscommon.h"
#include "pvr_debug.h"
#include "proc.h"
+#include "private_data.h"
#include "sgx_bridge.h"
struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY *psEntry;
off_t Ret;
- LinuxLockMutex(&gPVRSRVLock);
+ mutex_lock(&gPVRSRVLock);
if (!off) {
if (count < 500) {
goto unlock_and_return;
}
Ret = printAppend(buffer, count, 0,
- "Total ioctl call count = %u\n"
- "Total number of bytes copied via copy_from_user = %u\n"
- "Total number of bytes copied via copy_to_user = %u\n"
- "Total number of bytes copied via copy_*_user = %u\n\n"
- "%-45s | %-40s | %10s | %20s | %10s\n",
+ "Total ioctl call count = %u\n"
+ "Total number of bytes copied via copy_from_user = %u\n"
+ "Total number of bytes copied via copy_to_user = %u\n"
+ "Total number of bytes copied via copy_*_user = %u\n\n"
+ "%-45s | %-40s | %10s | %20s | %10s\n",
g_BridgeGlobalStats.ui32IOCTLCount,
- g_BridgeGlobalStats.
- ui32TotalCopyFromUserBytes,
- g_BridgeGlobalStats.ui32TotalCopyToUserBytes,
- g_BridgeGlobalStats.
- ui32TotalCopyFromUserBytes +
+ g_BridgeGlobalStats.ui32TotalCopyFromUserBytes,
g_BridgeGlobalStats.ui32TotalCopyToUserBytes,
+ g_BridgeGlobalStats.ui32TotalCopyFromUserBytes +
+ g_BridgeGlobalStats.ui32TotalCopyToUserBytes,
"Bridge Name", "Wrapper Function",
"Call Count", "copy_from_user Bytes",
"copy_to_user Bytes");
psEntry->ui32CopyToUserTotalBytes);
unlock_and_return:
- LinuxUnLockMutex(&gPVRSRVLock);
+ mutex_unlock(&gPVRSRVLock);
return Ret;
}
#endif
struct PVRSRV_PER_PROCESS_DATA *psPerProc;
int err = -EFAULT;
- LinuxLockMutex(&gPVRSRVLock);
+ mutex_lock(&gPVRSRVLock);
if (!OSAccessOK(PVR_VERIFY_WRITE, psBridgePackageUM,
sizeof(struct PVRSRV_BRIDGE_PACKAGE))) {
sBridgePackageKM.ui32BridgeID);
err = BridgedDispatchKM(psPerProc, &sBridgePackageKM);
+ if (err != PVRSRV_OK)
+ goto unlock_and_return;
unlock_and_return:
- LinuxUnLockMutex(&gPVRSRVLock);
+ mutex_unlock(&gPVRSRVLock);
return err;
}
#ifndef __PVR_BRIDGE_KM_H_
#define __PVR_BRIDGE_KM_H_
-#include <linux/file.h>
+#include <linux/fs.h> /* for struct file */
-#include "kernelbuffer.h"
#include "pvr_bridge.h"
#include "perproc.h"
struct PVRSRV_KERNEL_MEM_INFO *psMemInfo);
enum PVRSRV_ERROR PVRSRVWrapExtMemoryKM(void *hDevCookie,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc, u32 ui32ByteSize,
- u32 ui32PageOffset, IMG_BOOL bPhysContig,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc, void *hDevMemContext,
+ u32 ui32ByteSize, u32 ui32PageOffset, IMG_BOOL bPhysContig,
struct IMG_SYS_PHYADDR *psSysAddr, void *pvLinAddr,
struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo);
-enum PVRSRV_ERROR PVRSRVIsWrappedExtMemoryKM(void *hDevCookie,
- struct PVRSRV_PER_PROCESS_DATA *psPerProc, u32 *pui32ByteSize,
- void **pvLinAddr);
-
-enum PVRSRV_ERROR PVRSRVUnwrapExtMemoryKM(
- struct PVRSRV_KERNEL_MEM_INFO *psMemInfo);
+enum PVRSRV_ERROR PVRSRVUnwrapExtMemoryKM(struct PVRSRV_KERNEL_MEM_INFO
+ *psMemInfo);
enum PVRSRV_ERROR PVRSRVEnumerateDCKM(enum PVRSRV_DEVICE_CLASS DeviceClass,
u32 *pui32DevCount, u32 *pui32DevID);
enum PVRSRV_ERROR PVRSRVGetBCInfoKM(void *hDeviceKM,
struct BUFFER_INFO *psBufferInfo);
-enum PVRSRV_ERROR PVRSRVGetBCBufferKM(void *hDeviceKM, u32 ui32BufferIndex,
- void **phBuffer);
-extern IMG_BOOL PVRGetBufferClassJTable(
- struct PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable);
+enum PVRSRV_ERROR PVRSRVGetBCBufferKM(void *hDeviceKM,
+ u32 ui32BufferIndex, void **phBuffer);
enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
- struct PVRSRV_PER_PROCESS_DATA *psPerProc,
+ struct PVRSRV_PER_PROCESS_DATA *psPerProc, void *hDevMemContext,
void *hDeviceClassBuffer,
struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo, void **phOSMapInfo);
enum PVRSRV_ERROR PVRSRVDissociateMemFromResmanKM(
struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo);
-long PVRSRV_BridgeDispatchKM(struct file *file, unsigned int cmd,
- unsigned long arg);
+long PVRSRV_BridgeDispatchKM(struct file *, unsigned, unsigned long);
#endif
*
******************************************************************************/
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/kernel.h>
+#include <linux/hardirq.h>
#include <linux/module.h>
+#include <linux/spinlock.h>
#include <linux/tty.h>
+#include <linux/debugfs.h>
#include <stdarg.h>
#include "img_types.h"
+#include "servicesext.h"
#include "pvr_debug.h"
#include "proc.h"
-
-#if defined(DEBUG) || defined(TIMING)
+#include "mutex.h"
+#include "syscommon.h"
+#include "sgxinfokm.h"
+#include "sgxutils.h"
u32 gPVRDebugLevel = DBGPRIV_WARNING;
-#define PVR_STRING_TERMINATOR '\0'
-#define PVR_IS_FILE_SEPARATOR(character) \
- (((character) == '\\') || ((character) == '/'))
+#define PVR_MAX_MSG_LEN PVR_MAX_DEBUG_MESSAGE_LEN
+
+static char gszBufferNonIRQ[PVR_MAX_MSG_LEN + 1];
+
+static char gszBufferIRQ[PVR_MAX_MSG_LEN + 1];
+static struct mutex gsDebugMutexNonIRQ;
+static DEFINE_SPINLOCK(gsDebugLockIRQ);
+#define USE_SPIN_LOCK (in_interrupt() || !preemptible())
+static inline void GetBufferLock(unsigned long *pulLockFlags)
+{
+ if (USE_SPIN_LOCK)
+ spin_lock_irqsave(&gsDebugLockIRQ, *pulLockFlags);
+ else
+ mutex_lock(&gsDebugMutexNonIRQ);
+}
+
+static inline void ReleaseBufferLock(unsigned long ulLockFlags)
+{
+ if (USE_SPIN_LOCK)
+ spin_unlock_irqrestore(&gsDebugLockIRQ, ulLockFlags);
+ else
+ mutex_unlock(&gsDebugMutexNonIRQ);
+}
+
+static inline void SelectBuffer(char **ppszBuf, u32 *pui32BufSiz)
+{
+ if (USE_SPIN_LOCK) {
+ *ppszBuf = gszBufferIRQ;
+ *pui32BufSiz = sizeof(gszBufferIRQ);
+ } else {
+ *ppszBuf = gszBufferNonIRQ;
+ *pui32BufSiz = sizeof(gszBufferNonIRQ);
+ }
+}
+
+static IMG_BOOL VBAppend(char *pszBuf, u32 ui32BufSiz, const char *pszFormat,
+ va_list VArgs)
+{
+ u32 ui32Used;
+ u32 ui32Space;
+ s32 i32Len;
+ ui32Used = strlen(pszBuf);
+ BUG_ON(ui32Used >= ui32BufSiz);
+ ui32Space = ui32BufSiz - ui32Used;
+ i32Len = vsnprintf(&pszBuf[ui32Used], ui32Space, pszFormat, VArgs);
+ pszBuf[ui32BufSiz - 1] = 0;
+ return i32Len < 0 || i32Len >= ui32Space;
+}
+
+static IMG_BOOL BAppend(char *pszBuf, u32 ui32BufSiz, const char *pszFormat,
+ ...)
+{
+ va_list VArgs;
+ IMG_BOOL bTrunc;
+
+ va_start(VArgs, pszFormat);
+
+ bTrunc = VBAppend(pszBuf, ui32BufSiz, pszFormat, VArgs);
+
+ va_end(VArgs);
+
+ return bTrunc;
+}
void PVRSRVDebugPrintf(u32 ui32DebugLevel,
const char *pszFileName,
- u32 ui32Line, const char *pszFormat, ...
- )
+ u32 ui32Line, const char *pszFormat, ...)
{
IMG_BOOL bTrace, bDebug;
char *pszLeafName;
if (bTrace || bDebug) {
va_list vaArgs;
- static char szBuffer[256];
+ unsigned long ulLockFlags = 0; /* suppress gc warning */
+ char *pszBuf;
+ u32 ui32BufSiz;
+ SelectBuffer(&pszBuf, &ui32BufSiz);
va_start(vaArgs, pszFormat);
+ GetBufferLock(&ulLockFlags);
+
if (bDebug) {
switch (ui32DebugLevel) {
case DBGPRIV_FATAL:
- {
- strcpy(szBuffer, "PVR_K:(Fatal): ");
- break;
- }
+ strncpy(pszBuf, "PVR_K:(Fatal): ",
+ (ui32BufSiz - 1));
+ break;
case DBGPRIV_ERROR:
- {
- strcpy(szBuffer, "PVR_K:(Error): ");
- break;
- }
+ strncpy(pszBuf, "PVR_K:(Error): ",
+ (ui32BufSiz - 1));
+ break;
case DBGPRIV_WARNING:
- {
- strcpy(szBuffer, "PVR_K:(Warning): ");
- break;
- }
+ strncpy(pszBuf, "PVR_K:(Warning): ",
+ (ui32BufSiz - 1));
+ break;
case DBGPRIV_MESSAGE:
- {
- strcpy(szBuffer, "PVR_K:(Message): ");
- break;
- }
+ strncpy(pszBuf, "PVR_K:(Message): ",
+ (ui32BufSiz - 1));
+ break;
case DBGPRIV_VERBOSE:
- {
- strcpy(szBuffer, "PVR_K:(Verbose): ");
- break;
- }
+ strncpy(pszBuf, "PVR_K:(Verbose): ",
+ (ui32BufSiz - 1));
+ break;
default:
- {
- strcpy(szBuffer,
- "PVR_K:(Unknown message level)");
- break;
- }
+ strncpy(pszBuf,
+ "PVR_K:(Unknown message level)",
+ (ui32BufSiz - 1));
+ break;
}
} else {
- strcpy(szBuffer, "PVR_K: ");
+ strncpy(pszBuf, "PVR_K: ", (ui32BufSiz - 1));
}
- vsprintf(&szBuffer[strlen(szBuffer)], pszFormat, vaArgs);
-
- if (!bTrace)
- sprintf(&szBuffer[strlen(szBuffer)], " [%d, %s]",
- (int)ui32Line, pszFileName);
-
- printk(KERN_INFO "%s\n", szBuffer);
+ if (VBAppend(pszBuf, ui32BufSiz, pszFormat, vaArgs)) {
+ printk(KERN_INFO "PVR_K:(Message Truncated): %s\n",
+ pszBuf);
+ } else {
+ if (!bTrace) {
+ if (BAppend
+ (pszBuf, ui32BufSiz, " [%lu, %s]", ui32Line,
+ pszFileName))
+ printk(KERN_INFO
+ "PVR_K:(Message Truncated): %s\n",
+ pszBuf);
+ else
+ printk(KERN_INFO "%s\n", pszBuf);
+ }
+ }
+ ReleaseBufferLock(ulLockFlags);
va_end(vaArgs);
}
}
void PVRSRVTrace(const char *pszFormat, ...)
{
- static char szMessage[PVR_MAX_DEBUG_MESSAGE_LEN + 1];
- char *pszEndOfMessage = NULL;
- va_list ArgList;
-
- strncpy(szMessage, "PVR: ", PVR_MAX_DEBUG_MESSAGE_LEN);
-
- pszEndOfMessage = &szMessage[strlen(szMessage)];
+ va_list VArgs;
+ unsigned long ulLockFlags = 0; /* suppress gcc warning */
+ char *pszBuf;
+ u32 ui32BufSiz;
- va_start(ArgList, pszFormat);
- vsprintf(pszEndOfMessage, pszFormat, ArgList);
- va_end(ArgList);
+ SelectBuffer(&pszBuf, &ui32BufSiz);
- strcat(szMessage, "\n");
-
- printk(KERN_INFO "%s", szMessage);
+ va_start(VArgs, pszFormat);
+ GetBufferLock(&ulLockFlags);
+ strncpy(pszBuf, "PVR: ", (ui32BufSiz - 1));
+ if (VBAppend(pszBuf, ui32BufSiz, pszFormat, VArgs))
+ printk(KERN_INFO "PVR_K:(Message Truncated): %s\n", pszBuf);
+ else
+ printk(KERN_INFO "%s\n", pszBuf);
+ ReleaseBufferLock(ulLockFlags);
+ va_end(VArgs);
}
void PVRDebugSetLevel(u32 uDebugLevel)
{
printk(KERN_INFO "PVR: Setting Debug Level = 0x%x\n",
- (unsigned int)uDebugLevel);
+ (unsigned)uDebugLevel);
gPVRDebugLevel = uDebugLevel;
}
return 0;
}
+#ifdef CONFIG_DEBUG_FS
+
+static struct dentry *debugfs_dentry;
+static u32 pvr_reset;
+
+static struct PVRSRV_DEVICE_NODE *get_sgx_node(void)
+{
+ struct SYS_DATA *sysdata;
+ struct PVRSRV_DEVICE_NODE *node;
+
+ if (SysAcquireData(&sysdata) != PVRSRV_OK)
+ return NULL;
+
+ for (node = sysdata->psDeviceNodeList; node; node = node->psNext)
+ if (node->sDevId.eDeviceType == PVRSRV_DEVICE_TYPE_SGX)
+ break;
+
+ return node;
+}
+
+static int pvr_dbg_reset(void *data, u64 val)
+{
+ struct PVRSRV_DEVICE_NODE *node;
+ enum PVRSRV_ERROR err;
+
+ if (val != 1)
+ return 0;
+
+ node = get_sgx_node();
+ if (!node)
+ return -ENODEV;
+
+ err = PVRSRVSetDevicePowerStateKM(node->sDevId.ui32DeviceIndex,
+ PVRSRV_POWER_STATE_D0,
+ KERNEL_ID, IMG_TRUE);
+ if (err != PVRSRV_OK)
+ return -EIO;
+
+ /*
+ * Yes, this is kinda braindead. KERNEL_ID, IMG_TRUE above means
+ * take the power lock - not just try lock - and keep it. TIMER_ID
+ * here means that we have already the power lock, so don't take it.
+ * Also - regardless of the ID - the following will release the lock.
+ * Finally we pass KERNEL_ID again to take and release the lock.
+ * Yay!
+ */
+ HWRecoveryResetSGX(node, 0, TIMER_ID);
+
+ SGXTestActivePowerEvent(node, KERNEL_ID);
+
+ return 0;
+}
+
+static int pvr_dbg_set(void *data, u64 val)
+{
+ u32 *var = data;
+
+ if (var == &pvr_reset)
+ return pvr_dbg_reset(data, val);
+
+ BUG();
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(pvr_dbg_fops, NULL, pvr_dbg_set, "%llu\n");
+
+static int pvr_init_debugfs(void)
+{
+ debugfs_dentry = debugfs_create_file("reset_sgx", S_IWUGO, NULL,
+ &pvr_reset, &pvr_dbg_fops);
+
+ return debugfs_dentry ? 0 : -ENODEV;
+}
+
+static void pvr_cleanup_debugfs(void)
+{
+ debugfs_remove(debugfs_dentry);
+}
+
+#else /* !CONFIG_DEBUG_FS */
+
+static int pvr_init_debugfs(void)
+{
+ return 0;
+}
+
+static void pvr_cleanup_debugfs(void) { }
+
#endif
+
+void pvr_dbg_init(void)
+{
+ mutex_init(&gsDebugMutexNonIRQ);
+ pvr_init_debugfs();
+}
+
+void pvr_dbg_cleanup(void)
+{
+ pvr_cleanup_debugfs();
+}
+
#ifndef __PVR_DEBUG_H__
#define __PVR_DEBUG_H__
-#include <linux/file.h>
+#include <linux/fs.h>
#include "img_types.h"
-
#define PVR_MAX_DEBUG_MESSAGE_LEN 512
-#define DBGPRIV_FATAL 0x01
-#define DBGPRIV_ERROR 0x02
-#define DBGPRIV_WARNING 0x04
-#define DBGPRIV_MESSAGE 0x08
-#define DBGPRIV_VERBOSE 0x10
-#define DBGPRIV_CALLTRACE 0x20
-#define DBGPRIV_ALLOC 0x40
-#define DBGPRIV_ALLLEVELS (DBGPRIV_FATAL | DBGPRIV_ERROR | \
- DBGPRIV_WARNING | DBGPRIV_MESSAGE | \
- DBGPRIV_VERBOSE)
-
-#define PVR_DBG_FATAL DBGPRIV_FATAL
-#define PVR_DBG_ERROR DBGPRIV_ERROR
-#define PVR_DBG_WARNING DBGPRIV_WARNING
-#define PVR_DBG_MESSAGE DBGPRIV_MESSAGE
-#define PVR_DBG_VERBOSE DBGPRIV_VERBOSE
-#define PVR_DBG_CALLTRACE DBGPRIV_CALLTRACE
-#define PVR_DBG_ALLOC DBGPRIV_ALLOC
+#define DBGPRIV_FATAL 0x01UL
+#define DBGPRIV_ERROR 0x02UL
+#define DBGPRIV_WARNING 0x04UL
+#define DBGPRIV_MESSAGE 0x08UL
+#define DBGPRIV_VERBOSE 0x10UL
+#define DBGPRIV_CALLTRACE 0x20UL
+#define DBGPRIV_ALLOC 0x40UL
+#define DBGPRIV_ALLLEVELS (DBGPRIV_FATAL | DBGPRIV_ERROR | \
+ DBGPRIV_WARNING | DBGPRIV_MESSAGE | \
+ DBGPRIV_VERBOSE)
+
+#define PVR_DBG_FATAL DBGPRIV_FATAL
+#define PVR_DBG_ERROR DBGPRIV_ERROR
+#define PVR_DBG_WARNING DBGPRIV_WARNING
+#define PVR_DBG_MESSAGE DBGPRIV_MESSAGE
+#define PVR_DBG_VERBOSE DBGPRIV_VERBOSE
+#define PVR_DBG_CALLTRACE DBGPRIV_CALLTRACE
+#define PVR_DBG_ALLOC DBGPRIV_ALLOC
#if defined(DEBUG)
-#define PVR_ASSERT(EXPR) \
- do { \
- if (!(EXPR)) \
- PVRSRVDebugAssertFail(__FILE__, __LINE__); \
+
+#define PVR_ASSERT(EXPR) \
+ do { \
+ if (!(EXPR)) \
+ PVRSRVDebugAssertFail(__FILE__, __LINE__); \
} while (0)
-#define PVR_DPF(level, fmt, ...) \
+#define PVR_DPF(level, fmt, ...) \
PVRSRVDebugPrintf(level, __FILE__, __LINE__, fmt, ## __VA_ARGS__)
-#define PVR_TRACE(fmt, ...) PVRSRVTrace(fmt, ## __VA_ARGS__)
-extern u32 gPVRDebugLevel;
+#define PVR_TRACE(fmt, ...) \
+ PVRSRVTrace(fmt, ##__VA_ARGS__)
void PVRSRVDebugAssertFail(const char *pszFile, u32 ui32Line);
void PVRSRVDebugPrintf(u32 ui32DebugLevel, const char *pszFileName,
u32 ui32Line, const char *pszFormat, ...);
void PVRSRVTrace(const char *pszFormat, ...);
-void PVRDebugSetLevel(u32 uDebugLevel);
+
int PVRDebugProcSetLevel(struct file *file, const char __user *buffer,
unsigned long count, void *data);
int PVRDebugProcGetLevel(char *page, char **start, off_t off, int count,
int *eof, void *data);
+void PVRDebugSetLevel(u32 uDebugLevel);
+
+void pvr_dbg_init(void);
+void pvr_dbg_cleanup(void);
-#define PVR_DBG_BREAK do { } while (0)
+#define PVR_DBG_BREAK
#else
#define PVR_ASSERT(EXPR) do { } while (0)
#define PVR_DPF(level, fmt, ...) do { } while (0)
-#define PVR_TRACE(fmt, ...) PVRSRVTrace(fmt, ## __VA_ARGS__)
-#define PVR_DBG_BREAK do { } while (0)
+#define PVR_TRACE(fmt, ...) \
+ PVRSRVTrace(fmt, ##__VA_ARGS__)
+#define PVR_DBG_BREAK do { } while (0)
void PVRSRVTrace(const char *pszFormat, ...);
#define PVR_TRACE(fmt, ...) do { } while (0)
#define PVR_DBG_BREAK do { } while (0)
+static inline void pvr_dbg_init(void) {};
+static inline void pvr_dbg_cleanup(void) {};
+
#endif
#endif
#define _PVRCONFIG_H
#define SGX530 1
-#define SGX_CORE_REV 121
#ifdef CONFIG_PVR_DEBUG
# define PVR_BUILD_TYPE "debug"
# define PVR_BUILD_TYPE "release"
#endif
+#ifdef CONFIG_PVR_NO_HARDWARE
+# define NO_HARDWARE 1
+#endif
+
#ifdef DEBUG
# define DEBUG_LINUX_MEMORY_ALLOCATIONS 1
# define DEBUG_LINUX_MEM_AREAS 1
# define DEBUG_LINUX_MMAP_AREAS 1
# define DEBUG_BRIDGE_KM 1
+
+# if (defined CONFIG_PVR_DEBUG_PDUMP) || (defined CONFIG_PVR_DEBUG_PDUMP_MODULE)
+# define PDUMP 1
+# endif
+
+#endif
+
+#ifdef CONFIG_PVR_EDM_DEBUG
+# define PVRSRV_USSE_EDM_STATUS_DEBUG 1
#endif
#endif
#ifndef __PVRMMAP_H__
#define __PVRMMAP_H__
-enum PVRSRV_ERROR PVRMMAPMapKernelPtr(void *hModule, void **ppvLinAddr,
- void *pvKVIndexAddress, u32 ui32Bytes);
-IMG_BOOL PVRMMAPRemoveMapping(void *pvUserAddress, u32 ui32Bytes);
+enum PVRSRV_ERROR PVRPMapKMem(void *hModule, void **ppvLinAddr,
+ void *pvLinAddrKM, void **phMappingInfo,
+ void *hMHandle);
+
+IMG_BOOL PVRUnMapKMem(void *hModule, void *hMappingInfo, void *hMHandle);
#endif
*
******************************************************************************/
+#include <linux/io.h>
+
#include "services_headers.h"
#include "buffer_manager.h"
+#include "pvr_bridge_km.h"
#include "handle.h"
#include "perproc.h"
#include "pdump_km.h"
#include "ra.h"
-#include "pvr_bridge_km.h"
+#include "pvrversion.h"
enum PVRSRV_ERROR AllocateDeviceID(struct SYS_DATA *psSysData, u32 *pui32DevID)
{
struct SYS_DEVICE_ID *psDeviceWalker;
psDeviceEnd = psDeviceWalker + psSysData->ui32NumDevices;
while (psDeviceWalker < psDeviceEnd) {
-
if ((psDeviceWalker->uiID == ui32DevID) &&
- (psDeviceWalker->bInUse)
- ) {
+ (psDeviceWalker->bInUse)) {
psDeviceWalker->bInUse = IMG_FALSE;
return PVRSRV_OK;
}
if (eError != PVRSRV_OK)
goto Error;
- gpsSysData->eCurrentPowerState = PVRSRV_POWER_STATE_D0;
- gpsSysData->eFailedPowerState = PVRSRV_POWER_Unspecified;
+ psSysData->eCurrentPowerState = PVRSRV_POWER_STATE_D0;
+ psSysData->eFailedPowerState = PVRSRV_POWER_Unspecified;
- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+#if defined(PDUMP)
+ psSysData->bPowerUpPDumped = IMG_FALSE;
+#endif
+
+ if (OSAllocMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_EVENTOBJECT),
(void **) &psSysData->psGlobalEventObject,
NULL) != PVRSRV_OK)
goto Error;
- if (OSEventObjectCreate
- ("PVRSRV_GLOBAL_EVENTOBJECT",
- psSysData->psGlobalEventObject) != PVRSRV_OK)
+ if (OSEventObjectCreate("PVRSRV_GLOBAL_EVENTOBJECT",
+ psSysData->psGlobalEventObject) != PVRSRV_OK)
goto Error;
return eError;
PVR_UNREFERENCED_PARAMETER(psSysData);
+ if (psSysData == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVDeInit: "
+ "PVRSRVHandleDeInit failed - invalid param");
+ return;
+ }
+
if (psSysData->psGlobalEventObject) {
OSEventObjectDestroy(psSysData->psGlobalEventObject);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ OSFreeMem(PVRSRV_PAGEABLE_SELECT,
sizeof(struct PVRSRV_EVENTOBJECT),
psSysData->psGlobalEventObject, NULL);
}
sizeof(struct PVRSRV_DEVICE_NODE),
(void **) &psDeviceNode, NULL) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDevice : "
- "Failed to alloc memory for "
- "psDeviceNode");
+ "Failed to alloc memory for psDeviceNode");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psDeviceNode, 0, sizeof(struct PVRSRV_DEVICE_NODE));
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
sizeof(struct PVRSRV_DEVICE_NODE), psDeviceNode,
NULL);
- PVR_DPF(PVR_DBG_ERROR,
- "PVRSRVRegisterDevice : Failed to register device");
+ PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDevice : "
+ "Failed to register device");
return PVRSRV_ERROR_DEVICE_REGISTER_FAILED;
}
eError = PVRSRVResManConnect(NULL, &psDeviceNode->hResManContext);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVInitialiseDevice: "
- "Failed PVRSRVResManConnect call");
+ "Failed PVRSRVResManConnect call");
return eError;
}
eError = psDeviceNode->pfnInitDevice(psDeviceNode);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVInitialiseDevice: "
- "Failed InitDevice call");
+ "Failed InitDevice call");
return eError;
}
}
eError = SysAcquireData(&psSysData);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVFinaliseSystem: "
- "Failed to get SysData");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVFinaliseSystem: Failed to get SysData");
return eError;
}
if (bInitSuccessful) {
eError = SysFinalise();
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVFinaliseSystem: "
- "SysFinalise failed (%d)", eError);
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVFinaliseSystem: SysFinalise failed (%d)",
+ eError);
return eError;
}
KERNEL_ID, IMG_FALSE);
if (eError != PVRSRV_OK)
PVR_DPF(PVR_DBG_ERROR, "PVRSRVFinaliseSystem: "
- "Failed PVRSRVSetDevicePowerStateKM call "
- "(device index: %d)",
+ "Failed PVRSRVSetDevicePowerStateKM "
+ "call (device index: %d)",
psDeviceNode->sDevId.ui32DeviceIndex);
psDeviceNode = psDeviceNode->psNext;
}
- }
- PDUMPENDINITPHASE();
+ psDeviceNode = psSysData->psDeviceNodeList;
+ while (psDeviceNode) {
+ if (psDeviceNode->pfnInitDeviceCompatCheck) {
+ eError = PVRSRVDevInitCompatCheck(psDeviceNode);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVFinaliseSystem: "
+ "Failed PVRSRVDevInitCompatCheck "
+ "call (device index: %d)",
+ psDeviceNode->sDevId.
+ ui32DeviceIndex);
+ return eError;
+ }
+ }
+ psDeviceNode = psDeviceNode->psNext;
+
+ }
+
+ }
return PVRSRV_OK;
}
+enum PVRSRV_ERROR PVRSRVDevInitCompatCheck(struct PVRSRV_DEVICE_NODE
+ *psDeviceNode)
+{
+
+ return psDeviceNode->pfnInitDeviceCompatCheck(psDeviceNode);
+}
+
enum PVRSRV_ERROR PVRSRVAcquireDeviceDataKM(u32 ui32DevIndex,
enum PVRSRV_DEVICE_TYPE eDeviceType,
void **phDevCookie)
psDeviceNode = psSysData->psDeviceNodeList;
- if (eDeviceType != PVRSRV_DEVICE_TYPE_UNKNOWN)
+ if (eDeviceType != PVRSRV_DEVICE_TYPE_UNKNOWN) {
while (psDeviceNode) {
if (psDeviceNode->sDevId.eDeviceType == eDeviceType)
goto FoundDevice;
psDeviceNode = psDeviceNode->psNext;
}
- else
+ } else {
while (psDeviceNode) {
if (psDeviceNode->sDevId.ui32DeviceIndex ==
- ui32DevIndex)
+ ui32DevIndex) {
goto FoundDevice;
+ }
psDeviceNode = psDeviceNode->psNext;
}
+ }
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVAcquireDeviceDataKM: requested device is not present");
}
ResManFreeResByCriteria(psDeviceNode->hResManContext,
- RESMAN_CRITERIA_RESTYPE,
- RESMAN_TYPE_DEVICEMEM_ALLOCATION,
- NULL, 0);
+ RESMAN_CRITERIA_RESTYPE,
+ RESMAN_TYPE_DEVICEMEM_ALLOCATION,
+ NULL, 0);
if (psDeviceNode->pfnDeInitDevice != NULL) {
eError = psDeviceNode->pfnDeInitDevice(psDeviceNode);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVDeinitialiseDevice: "
- "Failed DeInitDevice call");
+ "Failed DeInitDevice call");
return eError;
}
}
return PVRSRV_OK;
}
-enum PVRSRV_ERROR PollForValueKM(volatile u32 *pui32LinMemAddr,
+enum PVRSRV_ERROR PollForValueKM(u32 __iomem *pui32LinMemAddr,
u32 ui32Value, u32 ui32Mask, u32 ui32Waitus,
u32 ui32Tries)
{
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0, uiCurrent = 0, uiMaxTime;
+ u32 uiMaxTime;
uiMaxTime = ui32Tries * ui32Waitus;
- do {
- if ((*pui32LinMemAddr & ui32Mask) == ui32Value)
+ LOOP_UNTIL_TIMEOUT(uiMaxTime) {
+ if ((readl(pui32LinMemAddr) & ui32Mask) == ui32Value)
return PVRSRV_OK;
-
- if (bStart == IMG_FALSE) {
- bStart = IMG_TRUE;
- uiStart = OSClockus();
- }
-
OSWaitus(ui32Waitus);
-
- uiCurrent = OSClockus();
- if (uiCurrent < uiStart)
-
- uiStart = 0;
-
- } while ((uiCurrent - uiStart) < uiMaxTime);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
return PVRSRV_ERROR_GENERIC;
}
return PVRSRV_ERROR_INVALID_PARAMS;
}
- if (psMiscInfo->ui32StateRequest &
- ~(PVRSRV_MISC_INFO_TIMER_PRESENT |
+ psMiscInfo->ui32StatePresent = 0;
+
+ if (psMiscInfo->ui32StateRequest & ~(
+ PVRSRV_MISC_INFO_TIMER_PRESENT |
PVRSRV_MISC_INFO_CLOCKGATE_PRESENT |
PVRSRV_MISC_INFO_MEMSTATS_PRESENT |
- PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT)) {
+ PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT |
+ PVRSRV_MISC_INFO_DDKVERSION_PRESENT)) {
PVR_DPF(PVR_DBG_ERROR,
"PVRSRVGetMiscInfoKM: invalid state request flags");
return PVRSRV_ERROR_INVALID_PARAMS;
return eError;
}
- psMiscInfo->ui32StatePresent = 0;
-
- if ((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_TIMER_PRESENT)
- && psSysData->pvSOCTimerRegisterKM) {
+ if (((psMiscInfo->ui32StateRequest &
+ PVRSRV_MISC_INFO_TIMER_PRESENT) != 0UL) &&
+ (psSysData->pvSOCTimerRegisterKM != NULL)) {
psMiscInfo->ui32StatePresent |= PVRSRV_MISC_INFO_TIMER_PRESENT;
psMiscInfo->pvSOCTimerRegisterKM =
psSysData->pvSOCTimerRegisterKM;
psMiscInfo->hSOCTimerRegisterOSMemHandle =
psSysData->hSOCTimerRegisterOSMemHandle;
+ } else {
+ psMiscInfo->pvSOCTimerRegisterKM = NULL;
+ psMiscInfo->hSOCTimerRegisterOSMemHandle = NULL;
}
- if ((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_CLOCKGATE_PRESENT)
- && psSysData->pvSOCClockGateRegsBase) {
+ if (((psMiscInfo->ui32StateRequest &
+ PVRSRV_MISC_INFO_CLOCKGATE_PRESENT) != 0UL) &&
+ (psSysData->pvSOCClockGateRegsBase != NULL)) {
psMiscInfo->ui32StatePresent |=
PVRSRV_MISC_INFO_CLOCKGATE_PRESENT;
psMiscInfo->pvSOCClockGateRegs =
psSysData->ui32SOCClockGateRegsSize;
}
- if ((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_MEMSTATS_PRESENT)
- && psMiscInfo->pszMemoryStr) {
+ if (((psMiscInfo->ui32StateRequest &
+ PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0UL) &&
+ (psMiscInfo->pszMemoryStr != NULL)) {
struct RA_ARENA **ppArena;
struct BM_HEAP *psBMHeap;
struct BM_CONTEXT *psBMContext;
psDeviceNode->sDevMemoryInfo.
pBMKernelContext->psBMHeap;
while (psBMHeap) {
- if (psBMHeap->pImportArena)
+ if (psBMHeap->pImportArena) {
RA_GetStats(psBMHeap->
- pImportArena,
+ pImportArena,
&pszStr,
&ui32StrLen);
+ }
- if (psBMHeap->pVMArena)
+ if (psBMHeap->pVMArena) {
RA_GetStats(psBMHeap->pVMArena,
&pszStr,
&ui32StrLen);
+ }
psBMHeap = psBMHeap->psNext;
}
}
CHECK_SPACE(ui32StrLen);
i32Count =
OSSNPrintf(pszStr, 100,
- "\nApplication Context "
- "(hDevMemContext) 0x%08X:\n",
+ "\nApplication Context (hDevMemContext) 0x%08X:\n",
(void *)psBMContext);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
psBMHeap = psBMContext->psBMHeap;
while (psBMHeap) {
- if (psBMHeap->pImportArena)
+ if (psBMHeap->pImportArena) {
RA_GetStats(psBMHeap->
- pImportArena,
+ pImportArena,
&pszStr,
&ui32StrLen);
+ }
- if (psBMHeap->pVMArena)
+ if (psBMHeap->pVMArena) {
RA_GetStats(psBMHeap->pVMArena,
&pszStr,
&ui32StrLen);
+ }
psBMHeap = psBMHeap->psNext;
}
psBMContext = psBMContext->psNext;
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
}
- if ((psMiscInfo->ui32StateRequest &
- PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) &&
- psSysData->psGlobalEventObject) {
+ if (((psMiscInfo->ui32StateRequest &
+ PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) != 0UL) &&
+ (psSysData->psGlobalEventObject != NULL)) {
psMiscInfo->ui32StatePresent |=
PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT;
psMiscInfo->sGlobalEventObject =
*psSysData->psGlobalEventObject;
}
+ if (((psMiscInfo->ui32StateRequest &
+ PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0UL) &&
+ ((psMiscInfo->ui32StateRequest &
+ PVRSRV_MISC_INFO_MEMSTATS_PRESENT) == 0UL) &&
+ (psMiscInfo->pszMemoryStr != NULL)) {
+ char *pszStr;
+ u32 ui32StrLen;
+ u32 ui32LenStrPerNum = 12;
+ s32 i32Count;
+ int i;
+ psMiscInfo->ui32StatePresent |=
+ PVRSRV_MISC_INFO_DDKVERSION_PRESENT;
+
+ psMiscInfo->aui32DDKVersion[0] = PVRVERSION_MAJ;
+ psMiscInfo->aui32DDKVersion[1] = PVRVERSION_MIN;
+ psMiscInfo->aui32DDKVersion[2] = PVRVERSION_BRANCH;
+ psMiscInfo->aui32DDKVersion[3] = PVRVERSION_BUILD;
+
+ pszStr = psMiscInfo->pszMemoryStr;
+ ui32StrLen = psMiscInfo->ui32MemoryStrLen;
+
+ for (i = 0; i < 4; i++) {
+ if (ui32StrLen < ui32LenStrPerNum)
+ return PVRSRV_ERROR_INVALID_PARAMS;
+
+ i32Count = OSSNPrintf(pszStr, ui32LenStrPerNum, "%ld",
+ psMiscInfo->aui32DDKVersion[i]);
+ UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
+ if (i != 3) {
+ i32Count = OSSNPrintf(pszStr, 2, ".");
+ UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
+ }
+ }
+ }
+
return PVRSRV_OK;
}
if (psDeviceNode->pfnDeviceISR != NULL)
if (ui32InterruptSource & psDeviceNode->
ui32SOCInterruptBit) {
- if ((*psDeviceNode->
- pfnDeviceISR) (psDeviceNode->pvISRData))
-
+ if ((*psDeviceNode->pfnDeviceISR)
+ (psDeviceNode->pvISRData))
bStatus = IMG_TRUE;
ui32ClearInterrupts |=
psDeviceNode = psSysData->psDeviceNodeList;
while (psDeviceNode != NULL) {
if (psDeviceNode->pfnDeviceMISR != NULL)
- (*psDeviceNode->pfnDeviceMISR) (psDeviceNode->
- pvISRData);
+ (*psDeviceNode->pfnDeviceMISR)(psDeviceNode->
+ pvISRData);
psDeviceNode = psDeviceNode->psNext;
}
#ifndef _PVRVERSION_H_
#define _PVRVERSION_H_
-#define PVRVERSION_MAJ 1
-#define PVRVERSION_MIN 3
-#define PVRVERSION_BRANCH 13
-#define PVRVERSION_BUILD 1607
-#define PVRVERSION_STRING "1.3.13.1607"
-#define PVRVERSION_FILE "eurasiacon.pj"
+#define PVRVERSION_MAJ 1
+#define PVRVERSION_MIN 4
+#define PVRVERSION_BRANCH 14
+#define PVRVERSION_BUILD 2514
+#define PVRVERSION_STRING "1.4.14.2514"
+#define PVRVERSION_FILE "eurasiacon.pj"
#endif
struct PVRSRV_COMMAND *psCmd;
while (ui32ReadOffset != ui32WriteOffset) {
- psCmd =
- (struct PVRSRV_COMMAND *)((u32) psQueue->pvLinQueueKM +
+ psCmd = (struct PVRSRV_COMMAND *)((u32) psQueue->pvLinQueueKM +
ui32ReadOffset);
- off =
- printAppend(buffer, size, off,
+ off = printAppend(buffer, size, off,
"%p %p %5u %6u %3u %5u %2u %2u %3u \n",
psQueue, psCmd, psCmd->ui32ProcessID,
psCmd->CommandType, psCmd->ui32CmdSize,
if (!off)
return printAppend(buffer, size, 0,
- "Command Queues\n"
- "Queue CmdPtr Pid Command Size DevInd "
- "DSC SSC #Data ...\n");
+ "Command Queues\nQueue CmdPtr "
+ "Pid Command Size DevInd DSC SSC #Data ...\n");
for (psQueue = psSysData->psQueueList; --off && psQueue;
psQueue = psQueue->psNextKM)
sizeof(struct PVRSRV_QUEUE_INFO),
(void **) &psQueueInfo, &hMemBlock) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateCommandQueueKM: "
- "Failed to alloc queue struct");
+ "Failed to alloc queue struct");
goto ErrorExit;
}
OSMemSet(psQueueInfo, 0, sizeof(struct PVRSRV_QUEUE_INFO));
ui32Power2QueueSize + PVRSRV_MAX_CMD_SIZE,
&psQueueInfo->pvLinQueueKM, &hMemBlock) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateCommandQueueKM: "
- "Failed to alloc queue buffer");
+ "Failed to alloc queue buffer");
goto ErrorExit;
}
struct SYS_DATA *psSysData;
enum PVRSRV_ERROR eError;
IMG_BOOL bTimeout = IMG_TRUE;
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0;
eError = SysAcquireData(&psSysData);
if (eError != PVRSRV_OK)
psQueue = psSysData->psQueueList;
- do {
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
if (psQueueInfo->ui32ReadOffset ==
psQueueInfo->ui32WriteOffset) {
bTimeout = IMG_FALSE;
break;
}
-
- if (bStart == IMG_FALSE) {
- bStart = IMG_TRUE;
- uiStart = OSClockus();
- }
OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- } while ((OSClockus() - uiStart) < MAX_HW_TIME_US);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
if (bTimeout) {
-
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVDestroyCommandQueueKM : "
- "Failed to empty queue");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVDestroyCommandQueueKM : Failed to empty queue");
eError = PVRSRV_ERROR_CANNOT_FLUSH_QUEUE;
+ goto ErrorExit;
}
eError = OSLockResource(&psSysData->sQProcessResource, KERNEL_ID);
u32 ui32ParamSize, void **ppvSpace)
{
IMG_BOOL bTimeout = IMG_TRUE;
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0, uiCurrent = 0;
ui32ParamSize = (ui32ParamSize + 3) & 0xFFFFFFFC;
return PVRSRV_ERROR_CMD_TOO_BIG;
}
- do {
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
if (GET_SPACE_IN_CMDQ(psQueue) > ui32ParamSize) {
bTimeout = IMG_FALSE;
break;
}
-
- if (bStart == IMG_FALSE) {
- bStart = IMG_TRUE;
- uiStart = OSClockus();
- }
OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
-
- uiCurrent = OSClockus();
- if (uiCurrent < uiStart)
-
- uiStart = 0;
- } while ((uiCurrent - uiStart) < MAX_HW_TIME_US);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
if (bTimeout == IMG_TRUE) {
*ppvSpace = NULL;
return PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE;
} else {
- *ppvSpace =
- (void *) (psQueue->ui32WriteOffset +
- (u32) psQueue->pvLinQueueUM);
+ *ppvSpace = (void *)(psQueue->ui32WriteOffset +
+ (u32)psQueue->pvLinQueueUM);
}
return PVRSRV_OK;
enum PVRSRV_ERROR PVRSRVSubmitCommandKM(struct PVRSRV_QUEUE_INFO *psQueue,
struct PVRSRV_COMMAND *psCommand)
{
- if (psCommand->ui32DstSyncCount > 0)
+
+ if (psCommand->ui32DstSyncCount > 0) {
psCommand->psDstSync = (struct PVRSRV_SYNC_OBJECT *)
- (((u8 *) psQueue->pvLinQueueKM) +
- psQueue->ui32WriteOffset +
- sizeof(struct PVRSRV_COMMAND));
+ (((u8 *)psQueue->pvLinQueueKM) +
+ psQueue->ui32WriteOffset +
+ sizeof(struct PVRSRV_COMMAND));
+ }
- if (psCommand->ui32SrcSyncCount > 0)
+ if (psCommand->ui32SrcSyncCount > 0) {
psCommand->psSrcSync = (struct PVRSRV_SYNC_OBJECT *)
- (((u8 *) psQueue->pvLinQueueKM) +
- psQueue->ui32WriteOffset +
- sizeof(struct PVRSRV_COMMAND) +
- (psCommand->ui32DstSyncCount *
- sizeof(struct PVRSRV_SYNC_OBJECT)));
+ (((u8 *)psQueue->pvLinQueueKM) +
+ psQueue->ui32WriteOffset +
+ sizeof(struct PVRSRV_COMMAND) +
+ (psCommand->ui32DstSyncCount *
+ sizeof(struct PVRSRV_SYNC_OBJECT)));
+ }
psCommand->pvData = (struct PVRSRV_SYNC_OBJECT *)
- (((u8 *) psQueue->pvLinQueueKM) +
+ (((u8 *)psQueue->pvLinQueueKM) +
psQueue->ui32WriteOffset +
sizeof(struct PVRSRV_COMMAND) +
(psCommand->ui32DstSyncCount *
}
static enum PVRSRV_ERROR PVRSRVProcessCommand(struct SYS_DATA *psSysData,
- struct PVRSRV_COMMAND *psCommand,
- IMG_BOOL bFlush)
+ struct PVRSRV_COMMAND *psCommand,
+ IMG_BOOL bFlush)
{
struct PVRSRV_SYNC_OBJECT *psWalkerObj;
struct PVRSRV_SYNC_OBJECT *psEndObj;
ui32ReadOpsComplete = psSyncData->ui32ReadOpsComplete;
if ((ui32WriteOpsComplete != psWalkerObj->ui32WriteOpsPending)
- || (ui32ReadOpsComplete != psWalkerObj->ui32ReadOpsPending))
+ || (ui32ReadOpsComplete !=
+ psWalkerObj->ui32ReadOpsPending)) {
if (!bFlush ||
!SYNCOPS_STALE(ui32WriteOpsComplete,
- psWalkerObj->ui32WriteOpsPending)
- || !SYNCOPS_STALE(ui32ReadOpsComplete,
- psWalkerObj->
- ui32ReadOpsPending))
+ psWalkerObj->ui32WriteOpsPending) ||
+ !SYNCOPS_STALE(ui32ReadOpsComplete,
+ psWalkerObj->ui32ReadOpsPending)) {
return PVRSRV_ERROR_FAILED_DEPENDENCIES;
+ }
+ }
psWalkerObj++;
}
ui32ReadOpsComplete = psSyncData->ui32ReadOpsComplete;
ui32WriteOpsComplete = psSyncData->ui32WriteOpsComplete;
- if ((ui32WriteOpsComplete != psWalkerObj->ui32WriteOpsPending)
- || (ui32ReadOpsComplete !=
- psWalkerObj->ui32ReadOpsPending)) {
- if (!bFlush && SYNCOPS_STALE(ui32WriteOpsComplete,
- psWalkerObj->ui32WriteOpsPending) &&
+ if ((ui32WriteOpsComplete !=
+ psWalkerObj->ui32WriteOpsPending) ||
+ (ui32ReadOpsComplete !=
+ psWalkerObj->ui32ReadOpsPending)) {
+ if (!bFlush &&
+ SYNCOPS_STALE(ui32WriteOpsComplete,
+ psWalkerObj->ui32WriteOpsPending) &&
SYNCOPS_STALE(ui32ReadOpsComplete,
- psWalkerObj->ui32ReadOpsPending))
+ psWalkerObj->ui32ReadOpsPending)) {
PVR_DPF(PVR_DBG_WARNING,
- "PVRSRVProcessCommand: "
- "Stale syncops psSyncData:0x%x "
- "ui32WriteOpsComplete:0x%x "
- "ui32WriteOpsPending:0x%x",
+ "PVRSRVProcessCommand: Stale syncops psSyncData:0x%x "
+ "ui32WriteOpsComplete:0x%x ui32WriteOpsPending:0x%x",
psSyncData, ui32WriteOpsComplete,
psWalkerObj->ui32WriteOpsPending);
+ }
- if (!bFlush || !SYNCOPS_STALE(ui32WriteOpsComplete,
- psWalkerObj->ui32WriteOpsPending) ||
+ if (!bFlush ||
+ !SYNCOPS_STALE(ui32WriteOpsComplete,
+ psWalkerObj->ui32WriteOpsPending) ||
!SYNCOPS_STALE(ui32ReadOpsComplete,
- psWalkerObj->ui32ReadOpsPending))
+ psWalkerObj->ui32ReadOpsPending)) {
return PVRSRV_ERROR_FAILED_DEPENDENCIES;
+ }
}
psWalkerObj++;
}
"Couldn't acquire queue processing "
"lock for FLUSH");
} else {
- PVR_DPF(PVR_DBG_MESSAGE, "PVRSRVProcessQueues:"
- " Couldn't acquire queue processing lock");
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "PVRSRVProcessQueues: "
+ "Couldn't acquire queue "
+ "processing lock");
}
} else {
PVR_DPF(PVR_DBG_MESSAGE, "PVRSRVProcessQueues: "
- "Queue processing lock-acquire failed when "
- "called from the Services driver.");
- PVR_DPF(PVR_DBG_MESSAGE, " "
- "This is due to MISR queue processing being "
- "interrupted by the Services driver.");
+ "Queue processing lock-acquire failed "
+ "when called from the Services driver.");
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "This is due to MISR queue processing "
+ "being interrupted by the Services driver.");
}
return PVRSRV_OK;
if (SysAcquireData(&psSysData) != PVRSRV_OK)
return;
- for (i = 0; i < psCmdCompleteData->ui32DstSyncCount; i++)
+ for (i = 0; i < psCmdCompleteData->ui32DstSyncCount; i++) {
psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->psSyncData->
ui32WriteOpsComplete++;
+ }
- for (i = 0; i < psCmdCompleteData->ui32SrcSyncCount; i++)
+ for (i = 0; i < psCmdCompleteData->ui32SrcSyncCount; i++) {
psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->psSyncData->
ui32ReadOpsComplete++;
+ }
psCmdCompleteData->bInUse = IMG_FALSE;
if (SysAcquireData(&psSysData) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVCommandCompleteCallbacks: "
- "SysAcquireData failed");
+ "SysAcquireData failed");
return;
}
psDeviceNode = psSysData->psDeviceNodeList;
while (psDeviceNode != NULL) {
if (psDeviceNode->pfnDeviceCommandComplete != NULL)
-
- (*psDeviceNode->
- pfnDeviceCommandComplete) (psDeviceNode);
+ (*psDeviceNode->pfnDeviceCommandComplete)(psDeviceNode);
psDeviceNode = psDeviceNode->psNext;
}
}
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32CmdCount *
sizeof(IMG_BOOL (*)(void *, u32, void *)),
- (void **) &psSysData->ppfnCmdProcList[ui32DevIndex],
+ (void **)&psSysData->ppfnCmdProcList[ui32DevIndex],
NULL);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
(void **) &psSysData->
ppsCmdCompleteData[ui32DevIndex], NULL);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterCmdProcListKM: "
- "Failed to alloc CC data");
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVRegisterCmdProcListKM: Failed to alloc CC data");
goto ErrorExit;
}
- /*
- clear the list to ensure that we don't try to access
- uninitialised pointer in the 'error' execution path
- */
+
+ /* clear the list to ensure that we don't try to access uninitialised
+ * pointer in the 'error' execution path */
OSMemSet(psSysData->ppsCmdCompleteData[ui32DevIndex], 0x00,
ui32AllocSize);
eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
ui32AllocSize,
(void **)&psSysData->
- ppsCmdCompleteData[ui32DevIndex][i],
+ ppsCmdCompleteData[ui32DevIndex][i],
NULL);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterCmdProcListKM: "
- "Failed to alloc cmd %d", i);
+ "Failed to alloc cmd %d",
+ i);
goto ErrorExit;
}
psCmdCompleteData->psSrcSync = (struct PVRSRV_SYNC_OBJECT *)
(((u32) psCmdCompleteData->psDstSync) +
(sizeof(struct PVRSRV_SYNC_OBJECT) *
- ui32MaxSyncsPerCmd[i][0]));
+ ui32MaxSyncsPerCmd[i][0]));
psCmdCompleteData->ui32AllocSize = ui32AllocSize;
}
ErrorExit:
if (psSysData->ppsCmdCompleteData[ui32DevIndex] != NULL) {
- for (i = 0; i < ui32CmdCount; i++)
+ for (i = 0; i < ui32CmdCount; i++) {
if (psSysData->ppsCmdCompleteData[ui32DevIndex][i] !=
NULL) {
psCmdCompleteData =
psSysData->
- ppsCmdCompleteData[ui32DevIndex][i];
+ ppsCmdCompleteData[ui32DevIndex][i];
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
psCmdCompleteData->ui32AllocSize,
psCmdCompleteData, NULL);
}
+ }
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
ui32CmdCount * sizeof(struct COMMAND_COMPLETE_DATA *),
NULL);
}
- if (psSysData->ppfnCmdProcList[ui32DevIndex] != NULL)
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- ui32CmdCount *
- sizeof(IMG_BOOL (*)(void *, u32, void *)),
+ if (psSysData->ppfnCmdProcList[ui32DevIndex] != NULL) {
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, 0,
psSysData->ppfnCmdProcList[ui32DevIndex], NULL);
+ }
return eError;
}
return eError;
}
- if (psSysData->ppsCmdCompleteData[ui32DevIndex] != NULL) {
- for (i = 0; i < ui32CmdCount; i++)
+ if (psSysData->ppsCmdCompleteData[ui32DevIndex] == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "PVRSRVRemoveCmdProcListKM: Invalid command array");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ } else {
+ for (i = 0; i < ui32CmdCount; i++) {
if (psSysData->ppsCmdCompleteData[ui32DevIndex][i] !=
NULL) {
psCmdCompleteData->ui32AllocSize,
psCmdCompleteData, NULL);
}
+ }
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
ui32CmdCount * sizeof(struct COMMAND_COMPLETE_DATA *),
psSysData->ppsCmdCompleteData[ui32DevIndex], NULL);
}
- if (psSysData->ppfnCmdProcList[ui32DevIndex] != NULL)
+ if (psSysData->ppfnCmdProcList[ui32DevIndex] != NULL) {
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
ui32CmdCount *
sizeof(IMG_BOOL (*)(void *, u32, void *)),
psSysData->ppfnCmdProcList[ui32DevIndex], NULL);
+ }
return PVRSRV_OK;
}
enum PVRSRV_ERROR PVRSRVProcessQueues(u32 ui32CallerID, IMG_BOOL bFlush);
-#ifdef __KERNEL__
+#if defined(__KERNEL__)
#include <linux/types.h>
-/*
- HACK: The header was included already in img_types.h, but there we keep the
- original value of __inline__. Without that include we'd have at this point
- __inline = __inline __attribute__((always_inline)). Keep it the old way for
- now to avoid introducing changes related to this.
- */
-#undef inline
-#define inline inline __attribute__((always_inline))
-
off_t QueuePrintQueues(char *buffer, size_t size, off_t off);
#endif
#include "proc.h"
-#define MINIMUM_HASH_SIZE (64)
+#define MINIMUM_HASH_SIZE 64
struct BT {
enum bt_type {
struct BM_MAPPING *psMapping;
};
+struct BT;
struct RA_ARENA {
char *name;
u32 uQuantum;
IMG_BOOL(*pImportAlloc)(void *, size_t uSize, size_t *pActualSize,
- struct BM_MAPPING **ppsMapping, u32 uFlags, u32 *pBase);
+ struct BM_MAPPING **ppsMapping, u32 uFlags,
+ u32 *pBase);
void (*pImportFree)(void *, u32, struct BM_MAPPING *psMapping);
void (*pBackingStoreFree)(void *, u32, u32, void *);
void *pImportHandle;
-#define FREE_TABLE_LIMIT 32
+#define FREE_TABLE_LIMIT 32
struct BT *aHeadFree[FREE_TABLE_LIMIT];
struct BT *pHeadSegment;
struct BT *pTailSegment;
#define PROC_NAME_SIZE 32
char szProcInfoName[PROC_NAME_SIZE];
char szProcSegsName[PROC_NAME_SIZE];
+ IMG_BOOL bInitProcEntry;
#endif
};
void *data);
#endif
+#if defined(CONFIG_PROC_FS) && defined(DEBUG)
+static char *ReplaceSpaces(char *const pS)
+{
+ char *pT;
+
+ for (pT = pS; *pT != 0; pT++)
+ if (*pT == ' ' || *pT == '\t')
+ *pT = '_';
+
+ return pS;
+}
+#endif
+
static IMG_BOOL _RequestAllocFail(void *_h, size_t _uSize, size_t *_pActualSize,
- struct BM_MAPPING **_ppsMapping, u32 _uFlags, u32 *_pBase)
+ struct BM_MAPPING **_ppsMapping,
+ u32 _uFlags, u32 *_pBase)
{
PVR_UNREFERENCED_PARAMETER(_h);
PVR_UNREFERENCED_PARAMETER(_uSize);
return l;
}
-static void _SegmentListInsertAfter(struct RA_ARENA *pArena,
- struct BT *pInsertionPoint, struct BT *pBT)
+static enum PVRSRV_ERROR _SegmentListInsertAfter(struct RA_ARENA *pArena,
+ struct BT *pInsertionPoint,
+ struct BT *pBT)
{
PVR_ASSERT(pArena != NULL);
PVR_ASSERT(pInsertionPoint != NULL);
+ if ((pInsertionPoint == NULL) || (pArena == NULL)) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_SegmentListInsertAfter: invalid parameters");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
pBT->pNextSegment = pInsertionPoint->pNextSegment;
pBT->pPrevSegment = pInsertionPoint;
if (pInsertionPoint->pNextSegment == NULL)
else
pInsertionPoint->pNextSegment->pPrevSegment = pBT;
pInsertionPoint->pNextSegment = pBT;
+
+ return PVRSRV_OK;
}
-static void _SegmentListInsert(struct RA_ARENA *pArena, struct BT *pBT)
+static enum PVRSRV_ERROR _SegmentListInsert(struct RA_ARENA *pArena,
+ struct BT *pBT)
{
+ enum PVRSRV_ERROR eError = PVRSRV_OK;
if (pArena->pHeadSegment == NULL) {
pArena->pHeadSegment = pArena->pTailSegment = pBT;
pBT->pNextSegment = pBT->pPrevSegment = NULL;
} else {
struct BT *pBTScan;
- pBTScan = pArena->pHeadSegment;
- while (pBTScan->pNextSegment != NULL
- && pBT->base >= pBTScan->pNextSegment->base)
- pBTScan = pBTScan->pNextSegment;
- _SegmentListInsertAfter(pArena, pBTScan, pBT);
+ if (pBT->base < pArena->pHeadSegment->base) {
+ pBT->pNextSegment = pArena->pHeadSegment;
+ pArena->pHeadSegment->pPrevSegment = pBT;
+ pArena->pHeadSegment = pBT;
+ pBT->pPrevSegment = NULL;
+ } else {
+ pBTScan = pArena->pHeadSegment;
+
+ while ((pBTScan->pNextSegment != NULL) &&
+ (pBT->base >= pBTScan->pNextSegment->base))
+ pBTScan = pBTScan->pNextSegment;
+
+ eError = _SegmentListInsertAfter(pArena, pBTScan, pBT);
+ if (eError != PVRSRV_OK)
+ return eError;
+ }
}
+ return eError;
}
static void _SegmentListRemove(struct RA_ARENA *pArena, struct BT *pBT)
PVR_ASSERT(pArena != NULL);
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_SegmentSplit: invalid parameter - pArena");
+ return NULL;
+ }
+
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct BT),
(void **) &pNeighbour, NULL) != PVRSRV_OK)
{
struct BT *pBT;
PVR_ASSERT(pArena != NULL);
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_InsertResource: invalid parameter - pArena");
+ return NULL;
+ }
+
pBT = _BuildBT(base, uSize);
if (pBT != NULL) {
- _SegmentListInsert(pArena, pBT);
+ if (_SegmentListInsert(pArena, pBT) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_InsertResource: call to _SegmentListInsert failed");
+ return NULL;
+ }
_FreeListInsert(pArena, pBT);
#ifdef RA_STATS
pArena->sStatistics.uTotalResourceCount += uSize;
static struct BT *_InsertResourceSpan(struct RA_ARENA *pArena, u32 base,
size_t uSize)
{
+ enum PVRSRV_ERROR eError;
struct BT *pSpanStart;
struct BT *pSpanEnd;
struct BT *pBT;
PVR_ASSERT(pArena != NULL);
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_InsertResourceSpan: invalid parameter - pArena");
+ return NULL;
+ }
PVR_DPF(PVR_DBG_MESSAGE,
"RA_InsertResourceSpan: arena='%s', base=0x%x, size=0x%x",
if (pBT == NULL)
goto fail_bt;
- _SegmentListInsert(pArena, pSpanStart);
- _SegmentListInsertAfter(pArena, pSpanStart, pBT);
+ eError = _SegmentListInsert(pArena, pSpanStart);
+ if (eError != PVRSRV_OK)
+ goto fail_SegListInsert;
+
+ eError = _SegmentListInsertAfter(pArena, pSpanStart, pBT);
+ if (eError != PVRSRV_OK)
+ goto fail_SegListInsert;
+
_FreeListInsert(pArena, pBT);
- _SegmentListInsertAfter(pArena, pBT, pSpanEnd);
+
+ eError = _SegmentListInsertAfter(pArena, pBT, pSpanEnd);
+ if (eError != PVRSRV_OK)
+ goto fail_SegListInsert;
+
#ifdef RA_STATS
pArena->sStatistics.uTotalResourceCount += uSize;
#endif
return pBT;
+fail_SegListInsert:
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BT), pBT, NULL);
fail_bt:
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct BT), pSpanEnd, NULL);
fail_end:
PVR_ASSERT(pArena != NULL);
PVR_ASSERT(pBT != NULL);
+ if ((pArena == NULL) || (pBT == NULL)) {
+ PVR_DPF(PVR_DBG_ERROR, "_FreeBT: invalid parameter");
+ return;
+ }
#ifdef RA_STATS
pArena->sStatistics.uLiveSegmentCount--;
pArena->sStatistics.uFreeSegmentCount++;
uOrigSize = pBT->uSize;
pNeighbour = pBT->pPrevSegment;
- if (pNeighbour != NULL
- && pNeighbour->type == btt_free
- && pNeighbour->base + pNeighbour->uSize == pBT->base) {
+ if (pNeighbour != NULL && pNeighbour->type == btt_free &&
+ pNeighbour->base + pNeighbour->uSize == pBT->base) {
_FreeListRemove(pArena, pNeighbour);
_SegmentListRemove(pArena, pNeighbour);
pBT->base = pNeighbour->base;
}
pNeighbour = pBT->pNextSegment;
- if (pNeighbour != NULL
- && pNeighbour->type == btt_free
- && pBT->base + pBT->uSize == pNeighbour->base) {
+ if (pNeighbour != NULL && pNeighbour->type == btt_free &&
+ pBT->base + pBT->uSize == pNeighbour->base) {
_FreeListRemove(pArena, pNeighbour);
_SegmentListRemove(pArena, pNeighbour);
pBT->uSize += pNeighbour->uSize;
if (uRoundedStart < pBT->base)
uRoundedStart += pArena->uQuantum;
- uRoundedEnd =
- ((uOrigBase + uOrigSize + pArena->uQuantum -
+ uRoundedEnd = ((uOrigBase + uOrigSize + pArena->uQuantum -
1) / pArena->uQuantum) * pArena->uQuantum;
if (uRoundedEnd > (pBT->base + pBT->uSize))
(void *) 0);
}
- if (pBT->pNextSegment != NULL && pBT->pNextSegment->type == btt_span
- && pBT->pPrevSegment != NULL
- && pBT->pPrevSegment->type == btt_span) {
+ if (pBT->pNextSegment != NULL && pBT->pNextSegment->type == btt_span &&
+ pBT->pPrevSegment != NULL && pBT->pPrevSegment->type == btt_span) {
struct BT *next = pBT->pNextSegment;
struct BT *prev = pBT->pPrevSegment;
_SegmentListRemove(pArena, next);
_FreeListInsert(pArena, pBT);
}
+static int alloc_from_bt(struct RA_ARENA *arena, struct BT *bt, u32 start,
+ size_t size, u32 align,
+ struct BM_MAPPING **new_mapping, u32 *new_base)
+{
+ _FreeListRemove(arena, bt);
+ PVR_ASSERT(bt->type == btt_free);
+#ifdef RA_STATS
+ arena->sStatistics.uLiveSegmentCount++;
+ arena->sStatistics.uFreeSegmentCount--;
+ arena->sStatistics.uFreeResourceCount -= bt->uSize;
+#endif
+ if (start > bt->base) {
+ struct BT *next_bt;
+
+ next_bt = _SegmentSplit(arena, bt, start - bt->base);
+
+ if (!next_bt) {
+ PVR_DPF(PVR_DBG_ERROR, "_AttemptAllocAligned: "
+ "Front split failed");
+
+ _FreeListInsert(arena, bt);
+ return -1;
+ }
+
+ _FreeListInsert(arena, bt);
+#ifdef RA_STATS
+ arena->sStatistics.uFreeSegmentCount++;
+ arena->sStatistics.uFreeResourceCount += bt->uSize;
+#endif
+ bt = next_bt;
+ }
+
+ if (bt->uSize > size) {
+ struct BT *next_bt;
+ next_bt = _SegmentSplit(arena, bt, size);
+
+ if (!next_bt) {
+ PVR_DPF(PVR_DBG_ERROR, "_AttemptAllocAligned: "
+ "Back split failed");
+
+ _FreeListInsert(arena, bt);
+ return -1;
+ }
+
+ _FreeListInsert(arena, next_bt);
+#ifdef RA_STATS
+ arena->sStatistics.uFreeSegmentCount++;
+ arena->sStatistics.uFreeResourceCount += next_bt->uSize;
+#endif
+ }
+
+ bt->type = btt_live;
+
+ if (!HASH_Insert(arena->pSegmentHash, bt->base, (u32)bt)) {
+ _FreeBT(arena, bt, IMG_FALSE);
+ return -1;
+ }
+
+ if (new_mapping)
+ *new_mapping = bt->psMapping;
+
+ *new_base = bt->base;
+
+ return 0;
+}
+
static IMG_BOOL _AttemptAllocAligned(struct RA_ARENA *pArena, size_t uSize,
struct BM_MAPPING **ppsMapping, u32 uFlags, u32 uAlignment,
- u32 uAlignmentOffset, u32 *base)
+ u32 *base)
{
u32 uIndex;
PVR_ASSERT(pArena != NULL);
-
- PVR_UNREFERENCED_PARAMETER(uFlags);
-
- if (uAlignment > 1)
- uAlignmentOffset %= uAlignment;
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "_AttemptAllocAligned: invalid parameter - pArena");
+ return IMG_FALSE;
+ }
uIndex = pvr_log2(uSize);
while (uIndex < FREE_TABLE_LIMIT && pArena->aHeadFree[uIndex] == NULL)
uIndex++;
- while (uIndex < FREE_TABLE_LIMIT) {
- if (pArena->aHeadFree[uIndex] != NULL) {
- struct BT *pBT;
+ for (; uIndex < FREE_TABLE_LIMIT; uIndex++) {
+ struct BT *pBT;
+
+ pBT = pArena->aHeadFree[uIndex];
+ if (!pBT)
+ continue;
+
+ for (; pBT != NULL; pBT = pBT->pNextFree) {
+ u32 aligned_base;
+
+ if (uAlignment > 1)
+ aligned_base = (pBT->base + uAlignment -
+ 1) / uAlignment * uAlignment;
+ else
+ aligned_base = pBT->base;
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "RA_AttemptAllocAligned: pBT-base=0x%x "
+ "pBT-size=0x%x alignedbase=0x%x size=0x%x",
+ pBT->base, pBT->uSize, aligned_base, uSize);
+
+ if (pBT->base + pBT->uSize < aligned_base + uSize)
+ continue;
- pBT = pArena->aHeadFree[uIndex];
- while (pBT != NULL) {
- u32 aligned_base;
-
- if (uAlignment > 1)
- aligned_base =
- (pBT->base + uAlignmentOffset +
- uAlignment - 1) / uAlignment *
- uAlignment - uAlignmentOffset;
- else
- aligned_base = pBT->base;
+ if (pBT->psMapping && pBT->psMapping->ui32Flags !=
+ uFlags) {
PVR_DPF(PVR_DBG_MESSAGE,
- "RA_AttemptAllocAligned: pBT-base=0x%x "
- "pBT-size=0x%x alignedbase=0x%x size=0x%x",
- pBT->base, pBT->uSize, aligned_base, uSize);
-
- if (pBT->base + pBT->uSize >=
- aligned_base + uSize) {
- if (!pBT->psMapping ||
- pBT->psMapping->ui32Flags ==
- uFlags) {
- _FreeListRemove(pArena, pBT);
- PVR_ASSERT(pBT->type ==
- btt_free);
-#ifdef RA_STATS
- pArena->sStatistics.
- uLiveSegmentCount++;
- pArena->sStatistics.
- uFreeSegmentCount--;
- pArena->sStatistics.
- uFreeResourceCount -=
- pBT->uSize;
-#endif
- if (aligned_base > pBT->base) {
- struct BT *pNeighbour;
-
- pNeighbour =
- _SegmentSplit
- (pArena, pBT,
- aligned_base -
- pBT->base);
-
- if (pNeighbour ==
- NULL) {
- PVR_DPF(
- PVR_DBG_ERROR,
- "_AttemptAlloc"
- "Aligned: "
- "Front split "
- "failed");
-
- _FreeListInsert
- (pArena,
- pBT);
- return
- IMG_FALSE;
- }
-
- _FreeListInsert(pArena,
- pBT);
-#ifdef RA_STATS
- pArena->sStatistics.
- uFreeSegmentCount++;
- pArena->sStatistics.
- uFreeResourceCount +=
- pBT->uSize;
-#endif
- pBT = pNeighbour;
- }
-
- if (pBT->uSize > uSize) {
- struct BT *pNeighbour;
- pNeighbour =
- _SegmentSplit
- (pArena, pBT,
- uSize);
-
- if (pNeighbour ==
- NULL) {
- PVR_DPF(
- PVR_DBG_ERROR,
- "_AttemptAlloc"
- "Aligned:"
- " Back split "
- "failed");
-
- _FreeListInsert
- (pArena,
- pBT);
- return
- IMG_FALSE;
- }
-
- _FreeListInsert(pArena,
- pNeighbour);
-#ifdef RA_STATS
- pArena->sStatistics.
- uFreeSegmentCount++;
- pArena->sStatistics.
- uFreeResourceCount +=
- pNeighbour->uSize;
-#endif
- }
-
- pBT->type = btt_live;
-
- if (!HASH_Insert(
- pArena->pSegmentHash,
- pBT->base, (u32)pBT)) {
- _FreeBT(pArena, pBT,
- IMG_FALSE);
- return IMG_FALSE;
- }
-
- if (ppsMapping != NULL)
- *ppsMapping =
- pBT->psMapping;
-
- *base = pBT->base;
-
- return IMG_TRUE;
- } else {
- PVR_DPF(PVR_DBG_MESSAGE,
- "AttemptAllocAligned: "
- "mismatch in flags. "
- "Import has %x, request "
- "was %x",
- pBT->psMapping->ui32Flags,
- uFlags);
-
- }
- }
- pBT = pBT->pNextFree;
+ "AttemptAllocAligned: mismatch in "
+ "flags. Import has %x, request was %x",
+ pBT->psMapping->ui32Flags, uFlags);
+ continue;
}
+ if (alloc_from_bt(pArena, pBT, aligned_base, uSize,
+ uFlags, ppsMapping, base) < 0)
+ return IMG_FALSE;
+
+ return IMG_TRUE;
}
- uIndex++;
}
return IMG_FALSE;
}
struct RA_ARENA *RA_Create(char *name, u32 base, size_t uSize,
- struct BM_MAPPING *psMapping, size_t uQuantum,
- IMG_BOOL(*alloc) (void *, size_t uSize,
- size_t *pActualSize,
- struct BM_MAPPING **ppsMapping,
- u32 _flags, u32 *pBase),
- void(*free) (void *, u32, struct BM_MAPPING *psMapping),
- void(*backingstore_free) (void *, u32, u32, void *),
- void *pImportHandle)
+ struct BM_MAPPING *psMapping, size_t uQuantum,
+ IMG_BOOL(*imp_alloc) (void *, size_t uSize,
+ size_t *pActualSize,
+ struct BM_MAPPING **ppsMapping,
+ u32 _flags, u32 *pBase),
+ void (*imp_free) (void *, u32, struct BM_MAPPING *),
+ void(*backingstore_free) (void *, u32, u32, void *),
+ void *pImportHandle)
{
struct RA_ARENA *pArena;
struct BT *pBT;
int i;
PVR_DPF(PVR_DBG_MESSAGE, "RA_Create: "
- "name='%s', base=0x%x, uSize=0x%x, alloc=0x%x, free=0x%x",
- name, base, uSize, alloc, free);
+ "name='%s', base=0x%x, uSize=0x%x, alloc=0x%x, free=0x%x",
+ name, base, uSize, imp_alloc, imp_free);
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(*pArena),
goto arena_fail;
pArena->name = name;
- pArena->pImportAlloc = alloc != NULL ? alloc : _RequestAllocFail;
- pArena->pImportFree = free;
+ pArena->pImportAlloc =
+ (imp_alloc != NULL) ? imp_alloc : _RequestAllocFail;
+ pArena->pImportFree = imp_free;
pArena->pBackingStoreFree = backingstore_free;
pArena->pImportHandle = pImportHandle;
for (i = 0; i < FREE_TABLE_LIMIT; i++)
#if defined(CONFIG_PROC_FS) && defined(DEBUG)
if (strcmp(pArena->name, "") != 0) {
- sprintf(pArena->szProcInfoName, "ra_info_%s", pArena->name);
- CreateProcEntry(pArena->szProcInfoName, RA_DumpInfo, NULL,
- pArena);
- sprintf(pArena->szProcSegsName, "ra_segs_%s", pArena->name);
- CreateProcEntry(pArena->szProcSegsName, RA_DumpSegs, NULL,
- pArena);
+ int ret;
+ int (*pfnCreateProcEntry) (const char *, read_proc_t,
+ write_proc_t, void *);
+
+ pArena->bInitProcEntry =
+ !PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL);
+
+ pfnCreateProcEntry = pArena->bInitProcEntry ? CreateProcEntry :
+ CreatePerProcessProcEntry;
+
+ ret = snprintf(pArena->szProcInfoName,
+ sizeof(pArena->szProcInfoName), "ra_info_%s",
+ pArena->name);
+ if (ret > 0 && ret < sizeof(pArena->szProcInfoName)) {
+ (void)pfnCreateProcEntry(ReplaceSpaces
+ (pArena->szProcInfoName),
+ RA_DumpInfo, NULL, pArena);
+ } else {
+ pArena->szProcInfoName[0] = 0;
+ PVR_DPF(PVR_DBG_ERROR, "RA_Create: "
+ "couldn't create ra_info proc entry for arena %s",
+ pArena->name);
+ }
+
+ ret = snprintf(pArena->szProcSegsName,
+ sizeof(pArena->szProcSegsName), "ra_segs_%s",
+ pArena->name);
+ if (ret > 0 && ret < sizeof(pArena->szProcInfoName)) {
+ (void)pfnCreateProcEntry(ReplaceSpaces
+ (pArena->szProcSegsName),
+ RA_DumpSegs, NULL, pArena);
+ } else {
+ pArena->szProcSegsName[0] = 0;
+ PVR_DPF(PVR_DBG_ERROR, "RA_Create: "
+ "couldn't create ra_segs proc entry for arena %s",
+ pArena->name);
+ }
}
#endif
u32 uIndex;
PVR_ASSERT(pArena != NULL);
+
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "RA_Delete: invalid parameter - pArena");
+ return;
+ }
+
PVR_DPF(PVR_DBG_MESSAGE, "RA_Delete: name='%s'", pArena->name);
for (uIndex = 0; uIndex < FREE_TABLE_LIMIT; uIndex++)
#endif
}
#if defined(CONFIG_PROC_FS) && defined(DEBUG)
- RemoveProcEntry(pArena->szProcInfoName);
- RemoveProcEntry(pArena->szProcSegsName);
+ {
+ void (*pfnRemoveProcEntry) (const char *);
+
+ pfnRemoveProcEntry =
+ pArena->
+ bInitProcEntry ? RemoveProcEntry :
+ RemovePerProcessProcEntry;
+
+ if (pArena->szProcInfoName[0] != 0)
+ pfnRemoveProcEntry(pArena->szProcInfoName);
+
+ if (pArena->szProcSegsName[0] != 0)
+ pfnRemoveProcEntry(pArena->szProcSegsName);
+ }
#endif
HASH_Delete(pArena->pSegmentHash);
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct RA_ARENA), pArena,
NULL);
}
+IMG_BOOL RA_TestDelete(struct RA_ARENA *pArena)
+{
+ PVR_ASSERT(pArena != NULL);
+
+ if (pArena != NULL)
+ while (pArena->pHeadSegment != NULL) {
+ struct BT *pBT = pArena->pHeadSegment;
+ if (pBT->type != btt_free)
+ return IMG_FALSE;
+ }
+
+ return IMG_TRUE;
+}
+
IMG_BOOL RA_Add(struct RA_ARENA *pArena, u32 base, size_t uSize)
{
PVR_ASSERT(pArena != NULL);
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "RA_Add: invalid parameter - pArena");
+ return IMG_FALSE;
+ }
+
PVR_DPF(PVR_DBG_MESSAGE,
"RA_Add: name='%s', base=0x%x, size=0x%x", pArena->name, base,
uSize);
- uSize =
- (uSize + pArena->uQuantum -
- 1) / pArena->uQuantum * pArena->uQuantum;
+ uSize = (uSize + pArena->uQuantum - 1) /
+ pArena->uQuantum * pArena->uQuantum;
return (IMG_BOOL)(_InsertResource(pArena, base, uSize) != NULL);
}
IMG_BOOL RA_Alloc(struct RA_ARENA *pArena, size_t uRequestSize,
- size_t *pActualSize, struct BM_MAPPING **ppsMapping,
- u32 uFlags, u32 uAlignment, u32 uAlignmentOffset, u32 *base)
+ struct BM_MAPPING **ppsMapping, u32 uFlags, u32 uAlignment,
+ u32 *base)
{
- IMG_BOOL bResult = IMG_FALSE;
+ IMG_BOOL bResult;
size_t uSize = uRequestSize;
PVR_ASSERT(pArena != NULL);
-
- if (pActualSize != NULL)
- *pActualSize = uSize;
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "RA_Alloc: invalid parameter - pArena");
+ return IMG_FALSE;
+ }
PVR_DPF(PVR_DBG_MESSAGE, "RA_Alloc: "
- "arena='%s', size=0x%x(0x%x), alignment=0x%x, offset=0x%x",
- pArena->name, uSize, uRequestSize, uAlignment,
- uAlignmentOffset);
+ "arena='%s', size=0x%x(0x%x), alignment=0x%x",
+ pArena->name, uSize, uRequestSize, uAlignment);
bResult = _AttemptAllocAligned(pArena, uSize, ppsMapping, uFlags,
- uAlignment, uAlignmentOffset, base);
+ uAlignment, base);
if (!bResult) {
struct BM_MAPPING *psImportMapping;
u32 import_base;
uImportSize += (uAlignment - 1);
uImportSize =
- ((uImportSize + pArena->uQuantum -
- 1) / pArena->uQuantum) * pArena->uQuantum;
+ ((uImportSize + pArena->uQuantum - 1) /
+ pArena->uQuantum) * pArena->uQuantum;
bResult =
pArena->pImportAlloc(pArena->pImportHandle, uImportSize,
&import_base);
if (bResult) {
struct BT *pBT;
- pBT =
- _InsertResourceSpan(pArena, import_base,
+ pBT = _InsertResourceSpan(pArena, import_base,
uImportSize);
if (pBT == NULL) {
-
pArena->pImportFree(pArena->pImportHandle,
import_base,
psImportMapping);
PVR_DPF(PVR_DBG_MESSAGE, "RA_Alloc: "
- "name='%s', size=0x%x failed!",
+ "name='%s', size=0x%x failed!",
pArena->name, uSize);
return IMG_FALSE;
pArena->sStatistics.uImportCount++;
pArena->sStatistics.uSpanCount++;
#endif
- bResult =
- _AttemptAllocAligned(pArena, uSize, ppsMapping,
- uFlags, uAlignment,
- uAlignmentOffset, base);
+ bResult = _AttemptAllocAligned(pArena, uSize,
+ ppsMapping, uFlags, uAlignment,
+ base);
if (!bResult)
PVR_DPF(PVR_DBG_MESSAGE, "RA_Alloc: "
- "name='%s' uAlignment failed!",
+ "name='%s' uAlignment failed!",
pArena->name);
}
}
PVR_ASSERT(pArena != NULL);
+ if (pArena == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "RA_Free: invalid parameter - pArena");
+ return;
+ }
PVR_DPF(PVR_DBG_MESSAGE,
"RA_Free: name='%s', base=0x%x", pArena->name, base);
pBT = (struct BT *)psSegDetails->hSegment;
} else {
struct RA_ARENA *pArena = (struct RA_ARENA *)hArena;
-
pBT = pArena->pHeadSegment;
}
}
#endif
+#if defined(ENABLE_RA_DUMP)
+void RA_Dump(struct RA_ARENA *pArena)
+{
+ struct BT *pBT;
+ PVR_ASSERT(pArena != NULL);
+ PVR_DPF(PVR_DBG_MESSAGE, "Arena '%s':", pArena->name);
+ PVR_DPF(PVR_DBG_MESSAGE,
+ " alloc=%08X free=%08X handle=%08X quantum=%d",
+ pArena->pImportAlloc, pArena->pImportFree,
+ pArena->pImportHandle, pArena->uQuantum);
+ PVR_DPF(PVR_DBG_MESSAGE, " segment Chain:");
+ if (pArena->pHeadSegment != NULL &&
+ pArena->pHeadSegment->pPrevSegment != NULL)
+ PVR_DPF(PVR_DBG_MESSAGE,
+ " error: head boundary tag has invalid pPrevSegment");
+ if (pArena->pTailSegment != NULL &&
+ pArena->pTailSegment->pNextSegment != NULL)
+ PVR_DPF(PVR_DBG_MESSAGE,
+ " error: tail boundary tag has invalid pNextSegment");
+
+ for (pBT = pArena->pHeadSegment; pBT != NULL; pBT = pBT->pNextSegment)
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "\tbase=0x%x size=0x%x type=%s ref=%08X",
+ (u32) pBT->base, pBT->uSize, _BTType(pBT->type),
+ pBT->pRef);
+
+}
+#endif
+
#if defined(CONFIG_PROC_FS) && defined(DEBUG)
static int RA_DumpSegs(char *page, char **start, off_t off, int count, int *eof,
void *data)
;
if (pBT)
len = printAppend(page, count, 0, "%08x %8x %4s %08x\n",
- (unsigned int)pBT->base,
- (unsigned int)pBT->uSize, _BTType(pBT->type),
- (unsigned int)pBT->psMapping);
+ (unsigned)pBT->base, (unsigned)pBT->uSize,
+ _BTType(pBT->type), (unsigned)pBT->psMapping);
else
*eof = 1;
return len;
pArena->uQuantum);
break;
case 1:
- len =
- printAppend(page, count, 0, "import_handle\t\t%08X\n",
- (unsigned int)pArena->pImportHandle);
+ len = printAppend(page, count, 0, "import_handle\t\t%08X\n",
+ (unsigned)pArena->pImportHandle);
break;
#ifdef RA_STATS
case 2:
len = printAppend(page, count, 0,
"free resource count\t%u (0x%x)\n",
pArena->sStatistics.uFreeResourceCount,
- (unsigned int)pArena->sStatistics.
+ (unsigned)pArena->sStatistics.
uFreeResourceCount);
break;
case 6:
#endif
#ifdef RA_STATS
-enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena,
- char **ppszStr, u32 *pui32StrLen)
+enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena, char **ppszStr,
+ u32 *pui32StrLen)
{
char *pszStr = *ppszStr;
u32 ui32StrLen = *pui32StrLen;
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100,
+ i32Count = OSSNPrintf(pszStr, 100,
" allocCB=%08X freeCB=%08X handle=%08X quantum=%d\n",
pArena->pImportAlloc, pArena->pImportFree,
pArena->pImportHandle, pArena->uQuantum);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "span count\t\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "span count\t\t%lu\n",
pArena->sStatistics.uSpanCount);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "live segment count\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "live segment count\t%lu\n",
pArena->sStatistics.uLiveSegmentCount);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "free segment count\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "free segment count\t%lu\n",
pArena->sStatistics.uFreeSegmentCount);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
i32Count = OSSNPrintf(pszStr, 100, "free resource count\t%lu (0x%x)\n",
pArena->sStatistics.uFreeResourceCount,
- (unsigned int)pArena->sStatistics.
- uFreeResourceCount);
+ (unsigned)pArena->sStatistics.uFreeResourceCount);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "total allocs\t\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "total allocs\t\t%lu\n",
pArena->sStatistics.uCumulativeAllocs);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "total frees\t\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "total frees\t\t%lu\n",
pArena->sStatistics.uCumulativeFrees);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "import count\t\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "import count\t\t%lu\n",
pArena->sStatistics.uImportCount);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100, "export count\t\t%lu\n",
+ i32Count = OSSNPrintf(pszStr, 100, "export count\t\t%lu\n",
pArena->sStatistics.uExportCount);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
if (pArena->pHeadSegment != NULL &&
pArena->pHeadSegment->pPrevSegment != NULL) {
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100,
+ i32Count = OSSNPrintf(pszStr, 100,
" error: head boundary tag has invalid pPrevSegment\n");
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
}
if (pArena->pTailSegment != NULL &&
pArena->pTailSegment->pNextSegment != NULL) {
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100,
+ i32Count = OSSNPrintf(pszStr, 100,
" error: tail boundary tag has invalid pNextSegment\n");
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
}
for (pBT = pArena->pHeadSegment; pBT != NULL;
pBT = pBT->pNextSegment) {
CHECK_SPACE(ui32StrLen);
- i32Count =
- OSSNPrintf(pszStr, 100,
+ i32Count = OSSNPrintf(pszStr, 100,
"\tbase=0x%x size=0x%x type=%s ref=%08X\n",
- (unsigned long)pBT->base, pBT->uSize,
- _BTType(pBT->type), pBT->psMapping);
+ (u32) pBT->base, pBT->uSize, _BTType(pBT->type),
+ pBT->psMapping);
UPDATE_SPACE(pszStr, i32Count, ui32StrLen);
}
u32 uImportCount;
u32 uExportCount;
};
+struct RA_STATISTICS;
struct RA_SEGMENT_DETAILS {
u32 uiSize;
struct IMG_CPU_PHYADDR sCpuPhyAddr;
void *hSegment;
};
+struct RA_SEGMENT_DETAILS;
struct RA_ARENA *RA_Create(char *name, u32 base, size_t uSize,
- struct BM_MAPPING *psMapping, size_t uQuantum,
- IMG_BOOL (*alloc)(void *_h, size_t uSize,
- size_t *pActualSize,
- struct BM_MAPPING **ppsMapping,
- u32 uFlags, u32 *pBase),
- void (*free)(void *, u32, struct BM_MAPPING *psMapping),
- void (*backingstore_free)(void *, u32, u32, void *),
- void *import_handle);
+ struct BM_MAPPING *psMapping, size_t uQuantum,
+ IMG_BOOL(*imp_alloc)(void *_h, size_t uSize,
+ size_t *pActualSize,
+ struct BM_MAPPING **ppsMapping,
+ u32 uFlags, u32 *pBase),
+ void (*imp_free)(void *, u32, struct BM_MAPPING *),
+ void (*backingstore_free)(void *, u32, u32, void *),
+ void *import_handle);
void RA_Delete(struct RA_ARENA *pArena);
+IMG_BOOL RA_TestDelete(struct RA_ARENA *pArena);
+
IMG_BOOL RA_Add(struct RA_ARENA *pArena, u32 base, size_t uSize);
-IMG_BOOL RA_Alloc(struct RA_ARENA *pArena, size_t uSize, size_t *pActualSize,
+IMG_BOOL RA_Alloc(struct RA_ARENA *pArena, size_t uSize,
struct BM_MAPPING **ppsMapping, u32 uFlags, u32 uAlignment,
- u32 uAlignmentOffset, u32 *pBase);
+ u32 *pBase);
void RA_Free(struct RA_ARENA *pArena, u32 base, IMG_BOOL bFreeBackingStore);
IMG_BOOL RA_GetNextLiveSegment(void *hArena,
struct RA_SEGMENT_DETAILS *psSegDetails);
-enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena,
- char **ppszStr, u32 *pui32StrLen);
+enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena, char **ppszStr,
+ u32 *pui32StrLen);
#endif
*
******************************************************************************/
-#include "services_headers.h"
-#include "resman.h"
-
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
#include <linux/version.h>
#include <linux/sched.h>
#include <linux/hardirq.h>
#include <linux/semaphore.h>
+#include "services_headers.h"
+#include "resman.h"
+
static DECLARE_MUTEX(lock);
#define ACQUIRE_SYNC_OBJ do { \
if (in_interrupt()) { \
printk(KERN_ERR "ISR cannot take RESMAN mutex\n"); \
BUG(); \
- } else { \
+ } else \
down(&lock); \
- } \
} while (0)
#define RELEASE_SYNC_OBJ up(&lock)
IMG_BOOL bExecuteCallback);
static int FreeResourceByCriteria(struct RESMAN_CONTEXT *psContext,
- u32 ui32SearchCriteria,
- u32 ui32ResType, void *pvParam,
- u32 ui32Param,
- IMG_BOOL bExecuteCallback);
+ u32 ui32SearchCriteria,
+ u32 ui32ResType, void *pvParam,
+ u32 ui32Param,
+ IMG_BOOL bExecuteCallback);
#ifdef DEBUG
static void ValidateResList(struct RESMAN_LIST *psResList);
void ResManDeInit(void)
{
if (gpsResList != NULL)
-
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*gpsResList),
gpsResList, NULL);
}
(void **) &psResManContext, NULL);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "PVRSRVResManConnect: "
- "ERROR allocating new RESMAN context struct");
+ "ERROR allocating new RESMAN context struct");
+
VALIDATERESLIST();
RELEASE_SYNC_OBJ;
int freed;
freed = FreeResourceByCriteria(ctx, RESMAN_CRITERIA_RESTYPE, restype,
- NULL, 0, IMG_TRUE);
+ NULL, 0, IMG_TRUE);
if (freed && warn_unfreed_res())
- PVR_DPF(PVR_DBG_WARNING, "pvr: %s: cleaning up %d "
- "unfreed resource of type %d\n",
- current->comm, freed, restype);
+ PVR_DPF(DBGPRIV_WARNING, "pvr: %s: cleaning up %d "
+ "unfreed resource of type %d\n",
+ current->comm, freed, restype);
return freed;
}
-
void PVRSRVResManDisconnect(struct RESMAN_CONTEXT *ctx, IMG_BOOL bKernelContext)
{
if (!bKernelContext) {
int i = 0;
+
i += free_one_res(ctx, RESMAN_TYPE_OS_USERMODE_MAPPING);
i += free_one_res(ctx, RESMAN_TYPE_EVENT_OBJECT);
i += free_one_res(ctx, RESMAN_TYPE_HW_RENDER_CONTEXT);
i += free_one_res(ctx, RESMAN_TYPE_DEVICEMEM_CONTEXT);
if (i && warn_unfreed_res())
- printk(KERN_DEBUG "pvr: %s: cleaning up %d "
- "unfreed resources\n",
- current->comm, i);
-
+ pr_warning("pvr: %s: cleaning up %d "
+ "unfreed resources\n",
+ current->comm, i);
}
PVR_ASSERT(ctx->psResItemList == NULL);
}
struct RESMAN_ITEM *ResManRegisterRes(struct RESMAN_CONTEXT *psResManContext,
- u32 ui32ResType, void *pvParam, u32 ui32Param,
- enum PVRSRV_ERROR (*pfnFreeResource)(void *pvParam,
- u32 ui32Param))
+ u32 ui32ResType, void *pvParam,
+ u32 ui32Param,
+ enum PVRSRV_ERROR (*pfnFreeResource)
+ (void *pvParam, u32 ui32Param))
{
struct RESMAN_ITEM *psNewResItem;
PVR_ASSERT(psResManContext != NULL);
PVR_ASSERT(ui32ResType != 0);
+ if (psResManContext == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "ResManRegisterRes: "
+ "invalid parameter - psResManContext");
+ return (struct RESMAN_ITEM *)NULL;
+ }
+
ACQUIRE_SYNC_OBJ;
VALIDATERESLIST();
}
void ResManFreeResByCriteria(struct RESMAN_CONTEXT *psResManContext,
- u32 ui32SearchCriteria,
- u32 ui32ResType,
- void *pvParam, u32 ui32Param)
+ u32 ui32SearchCriteria, u32 ui32ResType,
+ void *pvParam, u32 ui32Param)
{
PVR_ASSERT(psResManContext != NULL);
psResManContext, ui32SearchCriteria, ui32ResType,
(u32) pvParam, ui32Param);
- FreeResourceByCriteria(psResManContext, ui32SearchCriteria,
+ (void)FreeResourceByCriteria(psResManContext, ui32SearchCriteria,
ui32ResType, pvParam, ui32Param,
IMG_TRUE);
RELEASE_SYNC_OBJ;
}
-void ResManDissociateRes(struct RESMAN_ITEM *psResItem,
+enum PVRSRV_ERROR ResManDissociateRes(struct RESMAN_ITEM *psResItem,
struct RESMAN_CONTEXT *psNewResManContext)
{
PVR_ASSERT(psResItem != NULL);
+
+ if (psResItem == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "ResManDissociateRes: invalid parameter - psResItem");
+ PVR_DBG_BREAK;
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+#ifdef DEBUG
PVR_ASSERT(psResItem->ui32Signature == RESMAN_SIGNATURE);
+#endif
if (psNewResManContext != NULL) {
-
if (psResItem->psNext)
psResItem->psNext->ppsThis = psResItem->ppsThis;
*psResItem->ppsThis = psResItem->psNext;
} else {
FreeResourceByPtr(psResItem, IMG_FALSE);
}
+
+ return PVRSRV_OK;
}
-IMG_INTERNAL enum PVRSRV_ERROR ResManFindResourceByPtr(
+enum PVRSRV_ERROR ResManFindResourceByPtr(
struct RESMAN_CONTEXT *psResManContext,
struct RESMAN_ITEM *psItem)
{
PVR_ASSERT(psResManContext != NULL);
PVR_ASSERT(psItem != NULL);
+
+ if ((psItem == NULL) || (psResManContext == NULL)) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "ResManFindResourceByPtr: invalid parameter");
+ PVR_DBG_BREAK;
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+#ifdef DEBUG
PVR_ASSERT(psItem->ui32Signature == RESMAN_SIGNATURE);
+#endif
ACQUIRE_SYNC_OBJ;
psCurItem = psResManContext->psResItemList;
while (psCurItem != NULL) {
-
if (psCurItem != psItem) {
-
psCurItem = psCurItem->psNext;
} else {
-
RELEASE_SYNC_OBJ;
return PVRSRV_OK;
}
static void FreeResourceByPtr(struct RESMAN_ITEM *psItem,
IMG_BOOL bExecuteCallback)
{
- PVR_ASSERT(psItem != NULL);
PVR_ASSERT(psItem->ui32Signature == RESMAN_SIGNATURE);
PVR_DPF(PVR_DBG_MESSAGE,
RELEASE_SYNC_OBJ;
if (bExecuteCallback &&
- psItem->pfnFreeResource(psItem->pvParam, psItem->ui32Param) !=
+ psItem->pfnFreeResource(psItem->pvParam, psItem->ui32Param) !=
PVRSRV_OK)
PVR_DPF(PVR_DBG_ERROR, "FreeResourceByPtr: "
- "ERROR calling FreeResource function");
+ "ERROR calling FreeResource function");
ACQUIRE_SYNC_OBJ;
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct RESMAN_ITEM),
- psItem, NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct RESMAN_ITEM), psItem,
+ NULL);
}
static int FreeResourceByCriteria(struct RESMAN_CONTEXT *psResManContext,
psCurItem = psResManContext->psResItemList;
while (psCurItem != NULL) {
-
bMatch = IMG_TRUE;
- if ((ui32SearchCriteria & RESMAN_CRITERIA_RESTYPE) &&
- psCurItem->ui32ResType != ui32ResType)
+ if (((ui32SearchCriteria & RESMAN_CRITERIA_RESTYPE) != 0UL) &&
+ (psCurItem->ui32ResType != ui32ResType))
bMatch = IMG_FALSE;
- else if ((ui32SearchCriteria & RESMAN_CRITERIA_PVOID_PARAM) &&
- psCurItem->pvParam != pvParam)
+ else if (((ui32SearchCriteria & RESMAN_CRITERIA_PVOID_PARAM) !=
+ 0UL) && (psCurItem->pvParam != pvParam))
bMatch = IMG_FALSE;
-
- else
- if ((ui32SearchCriteria & RESMAN_CRITERIA_UI32_PARAM) &&
- psCurItem->ui32Param != ui32Param)
+ else if (((ui32SearchCriteria & RESMAN_CRITERIA_UI32_PARAM) !=
+ 0UL) && (psCurItem->ui32Param != ui32Param))
bMatch = IMG_FALSE;
if (!bMatch) {
-
psCurItem = psCurItem->psNext;
} else {
-
FreeResourceByPtr(psCurItem, bExecuteCallback);
psCurItem = psResManContext->psResItemList;
freed++;
ppsThisContext = &psResList->psContextList;
while (psCurContext != NULL) {
-
PVR_ASSERT(psCurContext->ui32Signature == RESMAN_SIGNATURE);
if (psCurContext->ppsThis != ppsThisContext) {
- PVR_DPF(PVR_DBG_WARNING,
- "psCC=%08X psCC->ppsThis=%08X "
- "psCC->psNext=%08X ppsTC=%08X",
+ PVR_DPF(PVR_DBG_WARNING, "psCC=%08X "
+ "psCC->ppsThis=%08X psCC->psNext=%08X ppsTC=%08X",
psCurContext, psCurContext->ppsThis,
psCurContext->psNext, ppsThisContext);
PVR_ASSERT(psCurContext->ppsThis == ppsThisContext);
PVR_ASSERT(psCurItem->ui32Signature ==
RESMAN_SIGNATURE);
if (psCurItem->ppsThis != ppsThisItem) {
- PVR_DPF(PVR_DBG_WARNING,
- "psCurItem=%08X "
- "psCurItem->ppsThis=%08X "
- "psCurItem->psNext=%08X "
- "ppsThisItem=%08X",
+ PVR_DPF(PVR_DBG_WARNING, "psCurItem=%08X "
+ "psCurItem->ppsThis=%08X "
+ "psCurItem->psNext=%08X "
+ "ppsThisItem=%08X",
psCurItem, psCurItem->ppsThis,
psCurItem->psNext, ppsThisItem);
PVR_ASSERT(psCurItem->ppsThis == ppsThisItem);
};
#define RESMAN_CRITERIA_ALL 0x00000000
-#define RESMAN_CRITERIA_RESTYPE 0x00000001
-#define RESMAN_CRITERIA_PVOID_PARAM 0x00000002
-#define RESMAN_CRITERIA_UI32_PARAM 0x00000004
-
+#define RESMAN_CRITERIA_RESTYPE 0x00000001
+#define RESMAN_CRITERIA_PVOID_PARAM 0x00000002
+#define RESMAN_CRITERIA_UI32_PARAM 0x00000004
struct RESMAN_ITEM;
struct RESMAN_CONTEXT;
void ResManDeInit(void);
struct RESMAN_ITEM *ResManRegisterRes(struct RESMAN_CONTEXT *hResManContext,
- u32 ui32ResType, void *pvParam, u32 ui32Param,
- enum PVRSRV_ERROR (*pfnFreeResource)(void *pvParam, u32 ui32Param));
+ u32 ui32ResType, void *pvParam,
+ u32 ui32Param,
+ enum PVRSRV_ERROR (*pfnFreeResource)
+ (void *pvParam, u32 ui32Param));
void ResManFreeResByPtr(struct RESMAN_ITEM *psResItem);
u32 ui32SearchCriteria, u32 ui32ResType, void *pvParam,
u32 ui32Param);
-void ResManDissociateRes(struct RESMAN_ITEM *psResItem,
- struct RESMAN_CONTEXT *psNewResManContext);
+enum PVRSRV_ERROR ResManDissociateRes(struct RESMAN_ITEM *psResItem,
+ struct RESMAN_CONTEXT
+ *psNewResManContext);
enum PVRSRV_ERROR ResManFindResourceByPtr(struct RESMAN_CONTEXT *hResManContext,
struct RESMAN_ITEM *psItem);
struct SYS_DATA;
-#define PVRSRV_MAX_CMD_SIZE 1024
-
-#define PVRSRV_MAX_DEVICES 16
-
-#define EVENTOBJNAME_MAXLENGTH 50
-
-#define PVRSRV_MEM_READ (1UL<<0)
-#define PVRSRV_MEM_WRITE (1UL<<1)
-#define PVRSRV_MEM_CACHE_CONSISTENT (1UL<<2)
-#define PVRSRV_MEM_NO_SYNCOBJ (1UL<<3)
-#define PVRSRV_MEM_INTERLEAVED (1UL<<4)
-#define PVRSRV_MEM_DUMMY (1UL<<5)
-#define PVRSRV_MEM_EDM_PROTECT (1UL<<6)
-#define PVRSRV_MEM_ZERO (1UL<<7)
-#define PVRSRV_MEM_USER_SUPPLIED_DEVVADDR (1UL<<8)
-#define PVRSRV_MEM_RAM_BACKED_ALLOCATION (1UL<<9)
-#define PVRSRV_MEM_NO_RESMAN (1UL<<10)
-
-#define PVRSRV_HAP_CACHED (1UL<<12)
-#define PVRSRV_HAP_UNCACHED (1UL<<13)
-#define PVRSRV_HAP_WRITECOMBINE (1UL<<14)
-#define PVRSRV_HAP_CACHETYPE_MASK \
- (PVRSRV_HAP_CACHED|PVRSRV_HAP_UNCACHED|PVRSRV_HAP_WRITECOMBINE)
-#define PVRSRV_HAP_KERNEL_ONLY (1UL<<15)
-#define PVRSRV_HAP_SINGLE_PROCESS (1UL<<16)
-#define PVRSRV_HAP_MULTI_PROCESS (1UL<<17)
-#define PVRSRV_HAP_FROM_EXISTING_PROCESS (1UL<<18)
-#define PVRSRV_HAP_NO_CPU_VIRTUAL (1UL<<19)
-#define PVRSRV_HAP_MAPTYPE_MASK (PVRSRV_HAP_KERNEL_ONLY \
- |PVRSRV_HAP_SINGLE_PROCESS \
- |PVRSRV_HAP_MULTI_PROCESS \
- |PVRSRV_HAP_FROM_EXISTING_PROCESS \
- |PVRSRV_HAP_NO_CPU_VIRTUAL)
-#define PVRSRV_MEM_BACKINGSTORE_FIELD_SHIFT (24)
-
-#define PVRSRV_MAP_NOUSERVIRTUAL (1UL<<27)
-
-#define PVRSRV_NO_CONTEXT_LOSS 0
-#define PVRSRV_SEVERE_LOSS_OF_CONTEXT 1
-#define PVRSRV_PRE_STATE_CHANGE_MASK 0x80
-
-#define PVRSRV_DEFAULT_DEV_COOKIE (1)
-
-#define PVRSRV_MISC_INFO_TIMER_PRESENT (1UL<<0)
-#define PVRSRV_MISC_INFO_CLOCKGATE_PRESENT (1UL<<1)
-#define PVRSRV_MISC_INFO_MEMSTATS_PRESENT (1UL<<2)
-#define PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT (1UL<<3)
+#define PVRSRV_4K_PAGE_SIZE 4096UL
+
+#define PVRSRV_MAX_CMD_SIZE 1024
+
+#define PVRSRV_MAX_DEVICES 16
+
+#define EVENTOBJNAME_MAXLENGTH 50
+
+#define PVRSRV_MEM_READ (1UL<<0)
+#define PVRSRV_MEM_WRITE (1UL<<1)
+#define PVRSRV_MEM_CACHE_CONSISTENT (1UL<<2)
+#define PVRSRV_MEM_NO_SYNCOBJ (1UL<<3)
+#define PVRSRV_MEM_INTERLEAVED (1UL<<4)
+#define PVRSRV_MEM_DUMMY (1UL<<5)
+#define PVRSRV_MEM_EDM_PROTECT (1UL<<6)
+#define PVRSRV_MEM_ZERO (1UL<<7)
+#define PVRSRV_MEM_USER_SUPPLIED_DEVVADDR (1UL<<8)
+#define PVRSRV_MEM_RAM_BACKED_ALLOCATION (1UL<<9)
+#define PVRSRV_MEM_NO_RESMAN (1UL<<10)
+#define PVRSRV_MEM_EXPORTED (1UL<<11)
+
+#define PVRSRV_HAP_CACHED (1UL<<12)
+#define PVRSRV_HAP_UNCACHED (1UL<<13)
+#define PVRSRV_HAP_WRITECOMBINE (1UL<<14)
+#define PVRSRV_HAP_CACHETYPE_MASK (PVRSRV_HAP_CACHED | \
+ PVRSRV_HAP_UNCACHED | \
+ PVRSRV_HAP_WRITECOMBINE)
+#define PVRSRV_HAP_KERNEL_ONLY (1UL<<15)
+#define PVRSRV_HAP_SINGLE_PROCESS (1UL<<16)
+#define PVRSRV_HAP_MULTI_PROCESS (1UL<<17)
+#define PVRSRV_HAP_FROM_EXISTING_PROCESS (1UL<<18)
+#define PVRSRV_HAP_NO_CPU_VIRTUAL (1UL<<19)
+#define PVRSRV_HAP_MAPTYPE_MASK (PVRSRV_HAP_KERNEL_ONLY | \
+ PVRSRV_HAP_SINGLE_PROCESS | \
+ PVRSRV_HAP_MULTI_PROCESS | \
+ PVRSRV_HAP_FROM_EXISTING_PROCESS | \
+ PVRSRV_HAP_NO_CPU_VIRTUAL)
+#define PVRSRV_MEM_BACKINGSTORE_FIELD_SHIFT 24
+
+#define PVRSRV_MAP_NOUSERVIRTUAL (1UL << 27)
+
+#define PVRSRV_NO_CONTEXT_LOSS 0
+#define PVRSRV_SEVERE_LOSS_OF_CONTEXT 1
+#define PVRSRV_PRE_STATE_CHANGE_MASK 0x80
+
+#define PVRSRV_DEFAULT_DEV_COOKIE 1
+
+#define PVRSRV_MISC_INFO_TIMER_PRESENT (1UL << 0)
+#define PVRSRV_MISC_INFO_CLOCKGATE_PRESENT (1UL << 1)
+#define PVRSRV_MISC_INFO_MEMSTATS_PRESENT (1UL << 2)
+#define PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT (1UL << 3)
+#define PVRSRV_MISC_INFO_DDKVERSION_PRESENT (1UL << 4)
#define PVRSRV_PDUMP_MAX_FILENAME_SIZE 20
#define PVRSRV_PDUMP_MAX_COMMENT_SIZE 200
#define PVRSRV_MAPEXTMEMORY_FLAGS_ALTERNATEVA 0x00000001
#define PVRSRV_MAPEXTMEMORY_FLAGS_PHYSCONTIG 0x00000002
+#define PVRSRV_MODIFYSYNCOPS_FLAGS_WOP_INC 0x00000001
+#define PVRSRV_MODIFYSYNCOPS_FLAGS_ROP_INC 0x00000002
+#define PVRSRV_MODIFYSYNCOPS_FLAGS_WOC_INC 0x00000004
+#define PVRSRV_MODIFYSYNCOPS_FLAGS_ROC_INC 0x00000008
+
enum PVRSRV_DEVICE_TYPE {
PVRSRV_DEVICE_TYPE_UNKNOWN = 0,
PVRSRV_DEVICE_TYPE_MBX1 = 1,
PVRSRV_DEVICE_TYPE_MSVDX = 6,
PVRSRV_DEVICE_TYPE_SGX = 7,
- PVRSRV_DEVICE_TYPE_EXT = 8,
- PVRSRV_DEVICE_TYPE_LAST = 8,
+
+ PVRSRV_DEVICE_TYPE_VGX = 8,
+
+ PVRSRV_DEVICE_TYPE_EXT = 9,
+
+ PVRSRV_DEVICE_TYPE_LAST = 9,
+
PVRSRV_DEVICE_TYPE_FORCE_I32 = 0x7fffffff
};
-#define HEAP_ID(_dev_ , _dev_heap_idx_) \
+#define HEAP_ID(_dev_ , _dev_heap_idx_) \
(((_dev_) << 24) | ((_dev_heap_idx_) & ((1 << 24) - 1)))
-#define HEAP_IDX(_heap_id_) \
+
+#define HEAP_IDX(_heap_id_) \
((_heap_id_) & ((1 << 24) - 1))
-#define HEAP_DEV(_heap_id_) \
+
+#define HEAP_DEV(_heap_id_) \
((_heap_id_) >> 24)
+#define PVRSRV_UNDEFINED_HEAP_ID (~0LU)
+
enum IMG_MODULE_ID {
- IMG_EGL = 0x00000001,
- IMG_OPENGLES1 = 0x00000002,
- IMG_OPENGLES2 = 0x00000003,
- IMG_D3DM = 0x00000004,
- IMG_SRV_UM = 0x00000005,
- IMG_OPENVG = 0x00000006,
- IMG_SRVCLIENT = 0x00000007,
- IMG_VISTAKMD = 0x00000008,
- IMG_VISTA3DNODE = 0x00000009,
- IMG_VISTAMVIDEONODE = 0x0000000A,
- IMG_VISTAVPBNODE = 0x0000000B,
- IMG_OPENGL = 0x0000000C,
- IMG_D3D = 0x0000000D
+ IMG_EGL = 0x00000001,
+ IMG_OPENGLES1 = 0x00000002,
+ IMG_OPENGLES2 = 0x00000003,
+ IMG_D3DM = 0x00000004,
+ IMG_SRV_UM = 0x00000005,
+ IMG_OPENVG = 0x00000006,
+ IMG_SRVCLIENT = 0x00000007,
+ IMG_VISTAKMD = 0x00000008,
+ IMG_VISTA3DNODE = 0x00000009,
+ IMG_VISTAMVIDEONODE = 0x0000000A,
+ IMG_VISTAVPBNODE = 0x0000000B,
+ IMG_OPENGL = 0x0000000C,
+ IMG_D3D = 0x0000000D
};
struct PVRSRV_CONNECTION {
struct PVRSRV_MEMBLK {
struct IMG_DEV_VIRTADDR sDevVirtAddr;
void *hOSMemHandle;
+ void *hOSWrapMem;
void *hBuffer;
void *hResItem;
+ struct IMG_SYS_PHYADDR *psIntSysPAddr;
};
struct PVRSRV_KERNEL_MEM_INFO;
void *pvSOCTimerRegisterKM;
void *pvSOCTimerRegisterUM;
void *hSOCTimerRegisterOSMemHandle;
+ void *hSOCTimerRegisterMappingInfo;
void *pvSOCClockGateRegs;
u32 ui32SOCClockGateRegsSize;
struct PVRSRV_EVENTOBJECT sGlobalEventObject;
void *hOSGlobalEvent;
+ u32 aui32DDKVersion[4];
};
enum PVRSRV_ERROR AllocateDeviceID(struct SYS_DATA *psSysData, u32 *pui32DevID);
#ifndef SERVICES_HEADERS_H
#define SERVICES_HEADERS_H
-
#include "img_defs.h"
#include "services.h"
#include "servicesint.h"
#include "img_types.h"
-#define PVRSRV_LOCKFLG_READONLY (1)
+#define PVRSRV_LOCKFLG_READONLY 1
enum PVRSRV_ERROR {
- PVRSRV_OK = 0,
- PVRSRV_ERROR_GENERIC = 1,
- PVRSRV_ERROR_OUT_OF_MEMORY = 2,
- PVRSRV_ERROR_TOO_FEW_BUFFERS = 3,
- PVRSRV_ERROR_SYMBOL_NOT_FOUND = 4,
- PVRSRV_ERROR_OUT_OF_HSPACE = 5,
- PVRSRV_ERROR_INVALID_PARAMS = 6,
- PVRSRV_ERROR_TILE_MAP_FAILED = 7,
- PVRSRV_ERROR_INIT_FAILURE = 8,
- PVRSRV_ERROR_CANT_REGISTER_CALLBACK = 9,
- PVRSRV_ERROR_INVALID_DEVICE = 10,
- PVRSRV_ERROR_NOT_OWNER = 11,
- PVRSRV_ERROR_BAD_MAPPING = 12,
- PVRSRV_ERROR_TIMEOUT = 13,
- PVRSRV_ERROR_NO_PRIMARY = 14,
- PVRSRV_ERROR_FLIP_CHAIN_EXISTS = 15,
- PVRSRV_ERROR_CANNOT_ACQUIRE_SYSDATA = 16,
- PVRSRV_ERROR_SCENE_INVALID = 17,
- PVRSRV_ERROR_STREAM_ERROR = 18,
- PVRSRV_ERROR_INVALID_INTERRUPT = 19,
- PVRSRV_ERROR_FAILED_DEPENDENCIES = 20,
- PVRSRV_ERROR_CMD_NOT_PROCESSED = 21,
- PVRSRV_ERROR_CMD_TOO_BIG = 22,
- PVRSRV_ERROR_DEVICE_REGISTER_FAILED = 23,
- PVRSRV_ERROR_FIFO_SPACE = 24,
- PVRSRV_ERROR_TA_RECOVERY = 25,
- PVRSRV_ERROR_INDOSORLOWPOWER = 26,
- PVRSRV_ERROR_TOOMANYBUFFERS = 27,
- PVRSRV_ERROR_NOT_SUPPORTED = 28,
- PVRSRV_ERROR_PROCESSING_BLOCKED = 29,
-
- PVRSRV_ERROR_CANNOT_FLUSH_QUEUE = 31,
- PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE = 32,
- PVRSRV_ERROR_CANNOT_GET_RENDERDETAILS = 33,
- PVRSRV_ERROR_RETRY = 34,
-
- PVRSRV_ERROR_FORCE_I32 = 0x7fffffff
+ PVRSRV_OK = 0,
+ PVRSRV_ERROR_GENERIC = 1,
+ PVRSRV_ERROR_OUT_OF_MEMORY = 2,
+ PVRSRV_ERROR_TOO_FEW_BUFFERS = 3,
+ PVRSRV_ERROR_SYMBOL_NOT_FOUND = 4,
+ PVRSRV_ERROR_OUT_OF_HSPACE = 5,
+ PVRSRV_ERROR_INVALID_PARAMS = 6,
+ PVRSRV_ERROR_TILE_MAP_FAILED = 7,
+ PVRSRV_ERROR_INIT_FAILURE = 8,
+ PVRSRV_ERROR_CANT_REGISTER_CALLBACK = 9,
+ PVRSRV_ERROR_INVALID_DEVICE = 10,
+ PVRSRV_ERROR_NOT_OWNER = 11,
+ PVRSRV_ERROR_BAD_MAPPING = 12,
+ PVRSRV_ERROR_TIMEOUT = 13,
+ PVRSRV_ERROR_NO_PRIMARY = 14,
+ PVRSRV_ERROR_FLIP_CHAIN_EXISTS = 15,
+ PVRSRV_ERROR_CANNOT_ACQUIRE_SYSDATA = 16,
+ PVRSRV_ERROR_SCENE_INVALID = 17,
+ PVRSRV_ERROR_STREAM_ERROR = 18,
+ PVRSRV_ERROR_INVALID_INTERRUPT = 19,
+ PVRSRV_ERROR_FAILED_DEPENDENCIES = 20,
+ PVRSRV_ERROR_CMD_NOT_PROCESSED = 21,
+ PVRSRV_ERROR_CMD_TOO_BIG = 22,
+ PVRSRV_ERROR_DEVICE_REGISTER_FAILED = 23,
+ PVRSRV_ERROR_FIFO_SPACE = 24,
+ PVRSRV_ERROR_TA_RECOVERY = 25,
+ PVRSRV_ERROR_INDOSORLOWPOWER = 26,
+ PVRSRV_ERROR_TOOMANYBUFFERS = 27,
+ PVRSRV_ERROR_NOT_SUPPORTED = 28,
+ PVRSRV_ERROR_PROCESSING_BLOCKED = 29,
+
+ PVRSRV_ERROR_CANNOT_FLUSH_QUEUE = 31,
+ PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE = 32,
+ PVRSRV_ERROR_CANNOT_GET_RENDERDETAILS = 33,
+ PVRSRV_ERROR_RETRY = 34,
+
+ PVRSRV_ERROR_DDK_VERSION_MISMATCH = 35,
+ PVRSRV_ERROR_BUILD_MISMATCH = 36,
+
+ PVRSRV_ERROR_FORCE_I32 = 0x7fffffff
};
enum PVRSRV_DEVICE_CLASS {
PVRSRV_POWER_STATE_FORCE_I32 = 0x7fffffff
};
-
-
enum PVRSRV_PIXEL_FORMAT {
PVRSRV_PIXEL_FORMAT_UNKNOWN = 0,
PVRSRV_PIXEL_FORMAT_RGB565 = 1,
PVRSRV_PIXEL_FORMAT_RGB555 = 2,
PVRSRV_PIXEL_FORMAT_RGB888 = 3,
PVRSRV_PIXEL_FORMAT_BGR888 = 4,
- PVRSRV_PIXEL_FORMAT_YUV420 = 5,
- PVRSRV_PIXEL_FORMAT_YUV444 = 6,
- PVRSRV_PIXEL_FORMAT_VUY444 = 7,
PVRSRV_PIXEL_FORMAT_GREY_SCALE = 8,
- PVRSRV_PIXEL_FORMAT_YUYV = 9,
- PVRSRV_PIXEL_FORMAT_YVYU = 10,
- PVRSRV_PIXEL_FORMAT_UYVY = 11,
- PVRSRV_PIXEL_FORMAT_VYUY = 12,
PVRSRV_PIXEL_FORMAT_PAL12 = 13,
PVRSRV_PIXEL_FORMAT_PAL8 = 14,
PVRSRV_PIXEL_FORMAT_PAL4 = 15,
PVRSRV_PIXEL_FORMAT_ABGR8888 = 21,
PVRSRV_PIXEL_FORMAT_YV12 = 22,
PVRSRV_PIXEL_FORMAT_I420 = 23,
- PVRSRV_PIXEL_FORMAT_DXT1 = 24,
PVRSRV_PIXEL_FORMAT_IMC2 = 25,
PVRSRV_PIXEL_FORMAT_XRGB8888,
PVRSRV_PIXEL_FORMAT_XBGR8888,
PVRSRV_PIXEL_FORMAT_XRGB4444,
- PVRSRV_PIXEL_FORMAT_G16R16,
- PVRSRV_PIXEL_FORMAT_G16R16F,
PVRSRV_PIXEL_FORMAT_ARGB8332,
PVRSRV_PIXEL_FORMAT_A2RGB10,
PVRSRV_PIXEL_FORMAT_A2BGR10,
- PVRSRV_PIXEL_FORMAT_B10GR11,
- PVRSRV_PIXEL_FORMAT_GR88,
- PVRSRV_PIXEL_FORMAT_ABGR16,
- PVRSRV_PIXEL_FORMAT_ABGR32,
- PVRSRV_PIXEL_FORMAT_BGR32,
- PVRSRV_PIXEL_FORMAT_GR32,
- PVRSRV_PIXEL_FORMAT_ABGR16F,
- PVRSRV_PIXEL_FORMAT_ABGR32F,
- PVRSRV_PIXEL_FORMAT_R32,
- PVRSRV_PIXEL_FORMAT_R32F,
- PVRSRV_PIXEL_FORMAT_R8,
- PVRSRV_PIXEL_FORMAT_A8,
PVRSRV_PIXEL_FORMAT_P8,
PVRSRV_PIXEL_FORMAT_L8,
PVRSRV_PIXEL_FORMAT_A8L8,
PVRSRV_PIXEL_FORMAT_A4L4,
- PVRSRV_PIXEL_FORMAT_R1,
PVRSRV_PIXEL_FORMAT_L16,
- PVRSRV_PIXEL_FORMAT_R16,
- PVRSRV_PIXEL_FORMAT_R16F,
PVRSRV_PIXEL_FORMAT_L6V5U5,
PVRSRV_PIXEL_FORMAT_V8U8,
PVRSRV_PIXEL_FORMAT_V16U16,
PVRSRV_PIXEL_FORMAT_D16,
PVRSRV_PIXEL_FORMAT_D24S8,
PVRSRV_PIXEL_FORMAT_D24X8,
- PVRSRV_PIXEL_FORMAT_D32F,
- PVRSRV_PIXEL_FORMAT_R8G8_B8G8,
- PVRSRV_PIXEL_FORMAT_G8R8_G8B8,
- PVRSRV_PIXEL_FORMAT_YUY2,
+
+ PVRSRV_PIXEL_FORMAT_ABGR16,
+ PVRSRV_PIXEL_FORMAT_ABGR16F,
+ PVRSRV_PIXEL_FORMAT_ABGR32,
+ PVRSRV_PIXEL_FORMAT_ABGR32F,
+ PVRSRV_PIXEL_FORMAT_B10GR11,
+ PVRSRV_PIXEL_FORMAT_GR88,
+ PVRSRV_PIXEL_FORMAT_BGR32,
+ PVRSRV_PIXEL_FORMAT_GR32,
+ PVRSRV_PIXEL_FORMAT_E5BGR9,
+
+ PVRSRV_PIXEL_FORMAT_DXT1,
PVRSRV_PIXEL_FORMAT_DXT23,
PVRSRV_PIXEL_FORMAT_DXT45,
- PVRSRV_PIXEL_FORMAT_G32R32F,
+
+ PVRSRV_PIXEL_FORMAT_R8G8_B8G8,
+ PVRSRV_PIXEL_FORMAT_G8R8_G8B8,
+
PVRSRV_PIXEL_FORMAT_NV11,
PVRSRV_PIXEL_FORMAT_NV12,
+ PVRSRV_PIXEL_FORMAT_YUY2,
+ PVRSRV_PIXEL_FORMAT_YUV420,
+ PVRSRV_PIXEL_FORMAT_YUV444,
+ PVRSRV_PIXEL_FORMAT_VUY444,
+ PVRSRV_PIXEL_FORMAT_YUYV,
+ PVRSRV_PIXEL_FORMAT_YVYU,
+ PVRSRV_PIXEL_FORMAT_UYVY,
+ PVRSRV_PIXEL_FORMAT_VYUY,
+
+ PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY,
+ PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YUYV,
+ PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YVYU,
+ PVRSRV_PIXEL_FORMAT_FOURCC_ORG_VYUY,
+
+ PVRSRV_PIXEL_FORMAT_A32B32G32R32,
+ PVRSRV_PIXEL_FORMAT_A32B32G32R32F,
+ PVRSRV_PIXEL_FORMAT_A32B32G32R32_UINT,
+ PVRSRV_PIXEL_FORMAT_A32B32G32R32_SINT,
+
+ PVRSRV_PIXEL_FORMAT_B32G32R32,
+ PVRSRV_PIXEL_FORMAT_B32G32R32F,
+ PVRSRV_PIXEL_FORMAT_B32G32R32_UINT,
+ PVRSRV_PIXEL_FORMAT_B32G32R32_SINT,
+
+ PVRSRV_PIXEL_FORMAT_G32R32,
+ PVRSRV_PIXEL_FORMAT_G32R32F,
+ PVRSRV_PIXEL_FORMAT_G32R32_UINT,
+ PVRSRV_PIXEL_FORMAT_G32R32_SINT,
+
+ PVRSRV_PIXEL_FORMAT_D32F,
+ PVRSRV_PIXEL_FORMAT_R32,
+ PVRSRV_PIXEL_FORMAT_R32F,
+ PVRSRV_PIXEL_FORMAT_R32_UINT,
+ PVRSRV_PIXEL_FORMAT_R32_SINT,
+
+ PVRSRV_PIXEL_FORMAT_A16B16G16R16,
+ PVRSRV_PIXEL_FORMAT_A16B16G16R16F,
+ PVRSRV_PIXEL_FORMAT_A16B16G16R16_SINT,
+ PVRSRV_PIXEL_FORMAT_A16B16G16R16_SNORM,
+ PVRSRV_PIXEL_FORMAT_A16B16G16R16_UINT,
+ PVRSRV_PIXEL_FORMAT_A16B16G16R16_UNORM,
+
+ PVRSRV_PIXEL_FORMAT_G16R16,
+ PVRSRV_PIXEL_FORMAT_G16R16F,
+ PVRSRV_PIXEL_FORMAT_G16R16_UINT,
+ PVRSRV_PIXEL_FORMAT_G16R16_UNORM,
+ PVRSRV_PIXEL_FORMAT_G16R16_SINT,
+ PVRSRV_PIXEL_FORMAT_G16R16_SNORM,
+
+ PVRSRV_PIXEL_FORMAT_R16,
+ PVRSRV_PIXEL_FORMAT_R16F,
+ PVRSRV_PIXEL_FORMAT_R16_UINT,
+ PVRSRV_PIXEL_FORMAT_R16_UNORM,
+ PVRSRV_PIXEL_FORMAT_R16_SINT,
+ PVRSRV_PIXEL_FORMAT_R16_SNORM,
+
+ PVRSRV_PIXEL_FORMAT_A8B8G8R8,
+ PVRSRV_PIXEL_FORMAT_A8B8G8R8_UINT,
+ PVRSRV_PIXEL_FORMAT_A8B8G8R8_UNORM,
+ PVRSRV_PIXEL_FORMAT_A8B8G8R8_SINT,
+ PVRSRV_PIXEL_FORMAT_A8B8G8R8_SNORM,
+
+ PVRSRV_PIXEL_FORMAT_G8R8,
+ PVRSRV_PIXEL_FORMAT_G8R8_UINT,
+ PVRSRV_PIXEL_FORMAT_G8R8_UNORM,
+ PVRSRV_PIXEL_FORMAT_G8R8_SINT,
+ PVRSRV_PIXEL_FORMAT_G8R8_SNORM,
+
+ PVRSRV_PIXEL_FORMAT_A8,
+ PVRSRV_PIXEL_FORMAT_R8,
+ PVRSRV_PIXEL_FORMAT_R8_UINT,
+ PVRSRV_PIXEL_FORMAT_R8_UNORM,
+ PVRSRV_PIXEL_FORMAT_R8_SINT,
+ PVRSRV_PIXEL_FORMAT_R8_SNORM,
+
+ PVRSRV_PIXEL_FORMAT_A2B10G10R10,
+ PVRSRV_PIXEL_FORMAT_A2B10G10R10_UNORM,
+ PVRSRV_PIXEL_FORMAT_A2B10G10R10_UINT,
+
+ PVRSRV_PIXEL_FORMAT_B10G11R11,
+ PVRSRV_PIXEL_FORMAT_B10G11R11F,
+
PVRSRV_PIXEL_FORMAT_X24G8R32,
PVRSRV_PIXEL_FORMAT_G8R24,
- PVRSRV_PIXEL_FORMAT_E5BGR9,
+ PVRSRV_PIXEL_FORMAT_E5B9G9R9,
+ PVRSRV_PIXEL_FORMAT_R1,
PVRSRV_PIXEL_FORMAT_BC1,
+ PVRSRV_PIXEL_FORMAT_BC1_UNORM,
+ PVRSRV_PIXEL_FORMAT_BC1_SRGB,
PVRSRV_PIXEL_FORMAT_BC2,
+ PVRSRV_PIXEL_FORMAT_BC2_UNORM,
+ PVRSRV_PIXEL_FORMAT_BC2_SRGB,
PVRSRV_PIXEL_FORMAT_BC3,
+ PVRSRV_PIXEL_FORMAT_BC3_UNORM,
+ PVRSRV_PIXEL_FORMAT_BC3_SRGB,
PVRSRV_PIXEL_FORMAT_BC4,
+ PVRSRV_PIXEL_FORMAT_BC4_UNORM,
+ PVRSRV_PIXEL_FORMAT_BC4_SNORM,
PVRSRV_PIXEL_FORMAT_BC5,
-
- PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY,
- PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YUYV,
- PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YVYU,
- PVRSRV_PIXEL_FORMAT_FOURCC_ORG_VYUY,
+ PVRSRV_PIXEL_FORMAT_BC5_UNORM,
+ PVRSRV_PIXEL_FORMAT_BC5_SNORM,
PVRSRV_PIXEL_FORMAT_FORCE_I32 = 0x7fffffff,
};
PVRSRV_COLOURSPACE_FORMAT_MASK = 0x000F0000,
};
+enum PVRSRV_ROTATION {
+ PVRSRV_ROTATE_0 = 0,
+ PVRSRV_ROTATE_90 = 1,
+ PVRSRV_ROTATE_180 = 2,
+ PVRSRV_ROTATE_270 = 3,
+ PVRSRV_FLIP_Y
+};
+
#define PVRSRV_CREATE_SWAPCHAIN_SHARED (1<<0)
#define PVRSRV_CREATE_SWAPCHAIN_QUERY (1<<1)
+#define PVRSRV_CREATE_SWAPCHAIN_OEMOVERLAY (1<<2)
struct PVRSRV_SYNC_DATA {
};
struct PVRSRV_CLIENT_SYNC_INFO {
-
struct PVRSRV_SYNC_DATA *psSyncData;
-
struct IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr;
-
struct IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr;
-
void *hMappingInfo;
-
void *hKernelSyncInfo;
-
};
struct PVRSRV_RESOURCE {
u32 ui32ID;
};
-
-
struct IMG_RECT {
s32 x0;
s32 y0;
s16 y1;
};
-
struct DISPLAY_DIMS {
u32 ui32ByteStride;
u32 ui32Width;
};
struct DISPLAY_FORMAT {
-
enum PVRSRV_PIXEL_FORMAT pixelformat;
};
struct DISPLAY_SURF_ATTRIBUTES {
-
enum PVRSRV_PIXEL_FORMAT pixelformat;
-
struct DISPLAY_DIMS sDims;
};
struct DISPLAY_MODE_INFO {
-
enum PVRSRV_PIXEL_FORMAT pixelformat;
-
struct DISPLAY_DIMS sDims;
-
u32 ui32RefreshHZ;
-
u32 ui32OEMFlags;
};
struct DISPLAY_INFO {
u32 ui32MaxSwapChains;
-
u32 ui32MaxSwapChainBuffers;
-
u32 ui32MinSwapInterval;
-
u32 ui32MaxSwapInterval;
-
char szDisplayName[MAX_DISPLAY_NAME_SIZE];
-
-
};
struct ACCESS_INFO {
#define PVRSRV_SET_CURSOR_ROTATION (1<<3)
struct PVRSRV_CURSOR_INFO {
-
u32 ui32Flags;
-
IMG_BOOL bVisible;
-
s16 i16XPos;
s16 i16YPos;
-
struct PVRSRV_CURSOR_SHAPE sCursorShape;
-
u32 ui32Rotation;
-
};
struct PVRSRV_REGISTRY_INFO {
#include "services.h"
#include "sysinfo.h"
-#define HWREC_DEFAULT_TIMEOUT (500)
+#define HWREC_DEFAULT_TIMEOUT 500
-#define DRIVERNAME_MAXLENGTH (100)
+#define DRIVERNAME_MAXLENGTH 100
struct PVRSRV_KERNEL_MEM_INFO {
u32 ui32Flags;
u32 ui32AllocSize;
struct PVRSRV_MEMBLK sMemBlk;
+
+ void *pvSysBackupBuffer;
+
+ u32 ui32RefCount;
+
struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
};
};
struct PVRSRV_DEVICE_SYNC_OBJECT {
- u32 ui32ReadOpPendingVal;
+
+ u32 ui32ReadOpsPendingVal;
struct IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr;
- u32 ui32WriteOpPendingVal;
+ u32 ui32WriteOpsPendingVal;
struct IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr;
};
struct PVRSRV_QUEUE_INFO *psNextKM;
};
-
struct PVRSRV_DEVICECLASS_BUFFER {
enum PVRSRV_ERROR (*pfnGetBufferAddr)(void *, void *,
struct IMG_SYS_PHYADDR **, u32 *,
ui32WriteOpsPending =
psSyncInfo->psSyncData->ui32WriteOpsPending;
else
-
ui32WriteOpsPending =
psSyncInfo->psSyncData->ui32WriteOpsPending++;
ui32ReadOpsPending =
psSyncInfo->psSyncData->ui32ReadOpsPending++;
else
- ui32ReadOpsPending =
- psSyncInfo->psSyncData->ui32ReadOpsPending;
+ ui32ReadOpsPending = psSyncInfo->psSyncData->ui32ReadOpsPending;
return ui32ReadOpsPending;
}
#ifndef _SGX530DEFS_KM_H_
#define _SGX530DEFS_KM_H_
-#define EUR_CR_CLKGATECTL 0x0000
-#define EUR_CR_CLKGATECTL_2D_CLKG_MASK 0x00000003
-#define EUR_CR_CLKGATECTL_2D_CLKG_SHIFT 0
-#define EUR_CR_CLKGATECTL_ISP_CLKG_MASK 0x00000030
-#define EUR_CR_CLKGATECTL_ISP_CLKG_SHIFT 4
-#define EUR_CR_CLKGATECTL_TSP_CLKG_MASK 0x00000300
-#define EUR_CR_CLKGATECTL_TSP_CLKG_SHIFT 8
-#define EUR_CR_CLKGATECTL_TA_CLKG_MASK 0x00003000
-#define EUR_CR_CLKGATECTL_TA_CLKG_SHIFT 12
-#define EUR_CR_CLKGATECTL_DPM_CLKG_MASK 0x00030000
-#define EUR_CR_CLKGATECTL_DPM_CLKG_SHIFT 16
-#define EUR_CR_CLKGATECTL_USE_CLKG_MASK 0x00300000
-#define EUR_CR_CLKGATECTL_USE_CLKG_SHIFT 20
-#define EUR_CR_CLKGATECTL_AUTO_MAN_REG_MASK 0x01000000
-#define EUR_CR_CLKGATECTL_AUTO_MAN_REG_SHIFT 24
-#define EUR_CR_CLKGATESTATUS 0x0004
-#define EUR_CR_CLKGATESTATUS_2D_CLKS_MASK 0x00000001
-#define EUR_CR_CLKGATESTATUS_2D_CLKS_SHIFT 0
-#define EUR_CR_CLKGATESTATUS_ISP_CLKS_MASK 0x00000010
-#define EUR_CR_CLKGATESTATUS_ISP_CLKS_SHIFT 4
-#define EUR_CR_CLKGATESTATUS_TSP_CLKS_MASK 0x00000100
-#define EUR_CR_CLKGATESTATUS_TSP_CLKS_SHIFT 8
-#define EUR_CR_CLKGATESTATUS_TA_CLKS_MASK 0x00001000
-#define EUR_CR_CLKGATESTATUS_TA_CLKS_SHIFT 12
-#define EUR_CR_CLKGATESTATUS_DPM_CLKS_MASK 0x00010000
-#define EUR_CR_CLKGATESTATUS_DPM_CLKS_SHIFT 16
-#define EUR_CR_CLKGATESTATUS_USE_CLKS_MASK 0x00100000
-#define EUR_CR_CLKGATESTATUS_USE_CLKS_SHIFT 20
-#define EUR_CR_CLKGATECTLOVR 0x0008
-#define EUR_CR_CLKGATECTLOVR_2D_CLKO_MASK 0x00000003
-#define EUR_CR_CLKGATECTLOVR_2D_CLKO_SHIFT 0
-#define EUR_CR_CLKGATECTLOVR_ISP_CLKO_MASK 0x00000030
-#define EUR_CR_CLKGATECTLOVR_ISP_CLKO_SHIFT 4
-#define EUR_CR_CLKGATECTLOVR_TSP_CLKO_MASK 0x00000300
-#define EUR_CR_CLKGATECTLOVR_TSP_CLKO_SHIFT 8
-#define EUR_CR_CLKGATECTLOVR_TA_CLKO_MASK 0x00003000
-#define EUR_CR_CLKGATECTLOVR_TA_CLKO_SHIFT 12
-#define EUR_CR_CLKGATECTLOVR_DPM_CLKO_MASK 0x00030000
-#define EUR_CR_CLKGATECTLOVR_DPM_CLKO_SHIFT 16
-#define EUR_CR_CLKGATECTLOVR_USE_CLKO_MASK 0x00300000
-#define EUR_CR_CLKGATECTLOVR_USE_CLKO_SHIFT 20
-#define EUR_CR_CORE_ID 0x0010
-#define EUR_CR_CORE_ID_CONFIG_MASK 0x0000FFFF
-#define EUR_CR_CORE_ID_CONFIG_SHIFT 0
-#define EUR_CR_CORE_ID_ID_MASK 0xFFFF0000
-#define EUR_CR_CORE_ID_ID_SHIFT 16
-#define EUR_CR_CORE_REVISION 0x0014
-#define EUR_CR_CORE_REVISION_MAINTENANCE_MASK 0x000000FF
-#define EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT 0
-#define EUR_CR_CORE_REVISION_MINOR_MASK 0x0000FF00
-#define EUR_CR_CORE_REVISION_MINOR_SHIFT 8
-#define EUR_CR_CORE_REVISION_MAJOR_MASK 0x00FF0000
-#define EUR_CR_CORE_REVISION_MAJOR_SHIFT 16
-#define EUR_CR_CORE_REVISION_DESIGNER_MASK 0xFF000000
-#define EUR_CR_CORE_REVISION_DESIGNER_SHIFT 24
-#define EUR_CR_DESIGNER_REV_FIELD1 0x0018
-#define EUR_CR_DESIGNER_REV_FIELD1_DESIGNER_REV_FIELD1_MASK 0xFFFFFFFF
-#define EUR_CR_DESIGNER_REV_FIELD1_DESIGNER_REV_FIELD1_SHIFT 0
-#define EUR_CR_DESIGNER_REV_FIELD2 0x001C
-#define EUR_CR_DESIGNER_REV_FIELD2_DESIGNER_REV_FIELD2_MASK 0xFFFFFFFF
-#define EUR_CR_DESIGNER_REV_FIELD2_DESIGNER_REV_FIELD2_SHIFT 0
-#define EUR_CR_SOFT_RESET 0x0080
-#define EUR_CR_SOFT_RESET_BIF_RESET_MASK 0x00000001
-#define EUR_CR_SOFT_RESET_BIF_RESET_SHIFT 0
-#define EUR_CR_SOFT_RESET_TWOD_RESET_MASK 0x00000002
-#define EUR_CR_SOFT_RESET_TWOD_RESET_SHIFT 1
-#define EUR_CR_SOFT_RESET_DPM_RESET_MASK 0x00000004
-#define EUR_CR_SOFT_RESET_DPM_RESET_SHIFT 2
-#define EUR_CR_SOFT_RESET_TA_RESET_MASK 0x00000008
-#define EUR_CR_SOFT_RESET_TA_RESET_SHIFT 3
-#define EUR_CR_SOFT_RESET_USE_RESET_MASK 0x00000010
-#define EUR_CR_SOFT_RESET_USE_RESET_SHIFT 4
-#define EUR_CR_SOFT_RESET_ISP_RESET_MASK 0x00000020
-#define EUR_CR_SOFT_RESET_ISP_RESET_SHIFT 5
-#define EUR_CR_SOFT_RESET_TSP_RESET_MASK 0x00000040
-#define EUR_CR_SOFT_RESET_TSP_RESET_SHIFT 6
-#define EUR_CR_EVENT_HOST_ENABLE2 0x0110
-#define EUR_CR_EVENT_HOST_ENABLE2_DPM_3D_FREE_LOAD_MASK 0x00000002
-#define EUR_CR_EVENT_HOST_ENABLE2_DPM_3D_FREE_LOAD_SHIFT 1
-#define EUR_CR_EVENT_HOST_ENABLE2_DPM_TA_FREE_LOAD_MASK 0x00000001
-#define EUR_CR_EVENT_HOST_ENABLE2_DPM_TA_FREE_LOAD_SHIFT 0
-#define EUR_CR_EVENT_HOST_CLEAR2 0x0114
-#define EUR_CR_EVENT_HOST_CLEAR2_DPM_3D_FREE_LOAD_MASK 0x00000002
-#define EUR_CR_EVENT_HOST_CLEAR2_DPM_3D_FREE_LOAD_SHIFT 1
-#define EUR_CR_EVENT_HOST_CLEAR2_DPM_TA_FREE_LOAD_MASK 0x00000001
-#define EUR_CR_EVENT_HOST_CLEAR2_DPM_TA_FREE_LOAD_SHIFT 0
-#define EUR_CR_EVENT_STATUS2 0x0118
-#define EUR_CR_EVENT_STATUS2_DPM_3D_FREE_LOAD_MASK 0x00000002
-#define EUR_CR_EVENT_STATUS2_DPM_3D_FREE_LOAD_SHIFT 1
-#define EUR_CR_EVENT_STATUS2_DPM_TA_FREE_LOAD_MASK 0x00000001
-#define EUR_CR_EVENT_STATUS2_DPM_TA_FREE_LOAD_SHIFT 0
-#define EUR_CR_EVENT_STATUS 0x012C
-#define EUR_CR_EVENT_STATUS_MASTER_INTERRUPT_MASK 0x80000000
-#define EUR_CR_EVENT_STATUS_MASTER_INTERRUPT_SHIFT 31
-#define EUR_CR_EVENT_STATUS_TIMER_MASK 0x20000000
-#define EUR_CR_EVENT_STATUS_TIMER_SHIFT 29
-#define EUR_CR_EVENT_STATUS_TA_DPM_FAULT_MASK 0x10000000
-#define EUR_CR_EVENT_STATUS_TA_DPM_FAULT_SHIFT 28
-#define EUR_CR_EVENT_STATUS_TWOD_COMPLETE_MASK 0x08000000
-#define EUR_CR_EVENT_STATUS_TWOD_COMPLETE_SHIFT 27
-#define EUR_CR_EVENT_STATUS_MADD_CACHE_INVALCOMPLETE_MASK 0x04000000
-#define EUR_CR_EVENT_STATUS_MADD_CACHE_INVALCOMPLETE_SHIFT 26
-#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_ZLS_MASK 0x02000000
-#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_ZLS_SHIFT 25
-#define EUR_CR_EVENT_STATUS_DPM_TA_MEM_FREE_MASK 0x01000000
-#define EUR_CR_EVENT_STATUS_DPM_TA_MEM_FREE_SHIFT 24
-#define EUR_CR_EVENT_STATUS_ISP_END_TILE_MASK 0x00800000
-#define EUR_CR_EVENT_STATUS_ISP_END_TILE_SHIFT 23
-#define EUR_CR_EVENT_STATUS_DPM_INITEND_MASK 0x00400000
-#define EUR_CR_EVENT_STATUS_DPM_INITEND_SHIFT 22
-#define EUR_CR_EVENT_STATUS_OTPM_LOADED_MASK 0x00200000
-#define EUR_CR_EVENT_STATUS_OTPM_LOADED_SHIFT 21
-#define EUR_CR_EVENT_STATUS_OTPM_INV_MASK 0x00100000
-#define EUR_CR_EVENT_STATUS_OTPM_INV_SHIFT 20
-#define EUR_CR_EVENT_STATUS_OTPM_FLUSHED_MASK 0x00080000
-#define EUR_CR_EVENT_STATUS_OTPM_FLUSHED_SHIFT 19
-#define EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_MASK 0x00040000
-#define EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_SHIFT 18
-#define EUR_CR_EVENT_STATUS_ISP_HALT_MASK 0x00020000
-#define EUR_CR_EVENT_STATUS_ISP_HALT_SHIFT 17
-#define EUR_CR_EVENT_STATUS_ISP_VISIBILITY_FAIL_MASK 0x00010000
-#define EUR_CR_EVENT_STATUS_ISP_VISIBILITY_FAIL_SHIFT 16
-#define EUR_CR_EVENT_STATUS_BREAKPOINT_MASK 0x00008000
-#define EUR_CR_EVENT_STATUS_BREAKPOINT_SHIFT 15
-#define EUR_CR_EVENT_STATUS_SW_EVENT_MASK 0x00004000
-#define EUR_CR_EVENT_STATUS_SW_EVENT_SHIFT 14
-#define EUR_CR_EVENT_STATUS_TA_FINISHED_MASK 0x00002000
-#define EUR_CR_EVENT_STATUS_TA_FINISHED_SHIFT 13
-#define EUR_CR_EVENT_STATUS_TA_TERMINATE_MASK 0x00001000
-#define EUR_CR_EVENT_STATUS_TA_TERMINATE_SHIFT 12
-#define EUR_CR_EVENT_STATUS_TPC_CLEAR_MASK 0x00000800
-#define EUR_CR_EVENT_STATUS_TPC_CLEAR_SHIFT 11
-#define EUR_CR_EVENT_STATUS_TPC_FLUSH_MASK 0x00000400
-#define EUR_CR_EVENT_STATUS_TPC_FLUSH_SHIFT 10
-#define EUR_CR_EVENT_STATUS_DPM_CONTROL_CLEAR_MASK 0x00000200
-#define EUR_CR_EVENT_STATUS_DPM_CONTROL_CLEAR_SHIFT 9
-#define EUR_CR_EVENT_STATUS_DPM_CONTROL_LOAD_MASK 0x00000100
-#define EUR_CR_EVENT_STATUS_DPM_CONTROL_LOAD_SHIFT 8
-#define EUR_CR_EVENT_STATUS_DPM_CONTROL_STORE_MASK 0x00000080
-#define EUR_CR_EVENT_STATUS_DPM_CONTROL_STORE_SHIFT 7
-#define EUR_CR_EVENT_STATUS_DPM_STATE_CLEAR_MASK 0x00000040
-#define EUR_CR_EVENT_STATUS_DPM_STATE_CLEAR_SHIFT 6
-#define EUR_CR_EVENT_STATUS_DPM_STATE_LOAD_MASK 0x00000020
-#define EUR_CR_EVENT_STATUS_DPM_STATE_LOAD_SHIFT 5
-#define EUR_CR_EVENT_STATUS_DPM_STATE_STORE_MASK 0x00000010
-#define EUR_CR_EVENT_STATUS_DPM_STATE_STORE_SHIFT 4
-#define EUR_CR_EVENT_STATUS_DPM_REACHED_MEM_THRESH_MASK 0x00000008
-#define EUR_CR_EVENT_STATUS_DPM_REACHED_MEM_THRESH_SHIFT 3
-#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_GBL_MASK 0x00000004
-#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_GBL_SHIFT 2
-#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_MT_MASK 0x00000002
-#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_MT_SHIFT 1
-#define EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_MASK 0x00000001
-#define EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_SHIFT 0
-#define EUR_CR_EVENT_HOST_ENABLE 0x0130
-#define EUR_CR_EVENT_HOST_ENABLE_MASTER_INTERRUPT_MASK 0x80000000
-#define EUR_CR_EVENT_HOST_ENABLE_MASTER_INTERRUPT_SHIFT 31
-#define EUR_CR_EVENT_HOST_ENABLE_TIMER_MASK 0x20000000
-#define EUR_CR_EVENT_HOST_ENABLE_TIMER_SHIFT 29
-#define EUR_CR_EVENT_HOST_ENABLE_TA_DPM_FAULT_MASK 0x10000000
-#define EUR_CR_EVENT_HOST_ENABLE_TA_DPM_FAULT_SHIFT 28
-#define EUR_CR_EVENT_HOST_ENABLE_TWOD_COMPLETE_MASK 0x08000000
-#define EUR_CR_EVENT_HOST_ENABLE_TWOD_COMPLETE_SHIFT 27
-#define EUR_CR_EVENT_HOST_ENABLE_MADD_CACHE_INVALCOMPLETE_MASK 0x04000000
-#define EUR_CR_EVENT_HOST_ENABLE_MADD_CACHE_INVALCOMPLETE_SHIFT 26
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_ZLS_MASK 0x02000000
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_ZLS_SHIFT 25
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_TA_MEM_FREE_MASK 0x01000000
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_TA_MEM_FREE_SHIFT 24
-#define EUR_CR_EVENT_HOST_ENABLE_ISP_END_TILE_MASK 0x00800000
-#define EUR_CR_EVENT_HOST_ENABLE_ISP_END_TILE_SHIFT 23
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_INITEND_MASK 0x00400000
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_INITEND_SHIFT 22
-#define EUR_CR_EVENT_HOST_ENABLE_OTPM_LOADED_MASK 0x00200000
-#define EUR_CR_EVENT_HOST_ENABLE_OTPM_LOADED_SHIFT 21
-#define EUR_CR_EVENT_HOST_ENABLE_OTPM_INV_MASK 0x00100000
-#define EUR_CR_EVENT_HOST_ENABLE_OTPM_INV_SHIFT 20
-#define EUR_CR_EVENT_HOST_ENABLE_OTPM_FLUSHED_MASK 0x00080000
-#define EUR_CR_EVENT_HOST_ENABLE_OTPM_FLUSHED_SHIFT 19
-#define EUR_CR_EVENT_HOST_ENABLE_PIXELBE_END_RENDER_MASK 0x00040000
-#define EUR_CR_EVENT_HOST_ENABLE_PIXELBE_END_RENDER_SHIFT 18
-#define EUR_CR_EVENT_HOST_ENABLE_ISP_HALT_MASK 0x00020000
-#define EUR_CR_EVENT_HOST_ENABLE_ISP_HALT_SHIFT 17
-#define EUR_CR_EVENT_HOST_ENABLE_ISP_VISIBILITY_FAIL_MASK 0x00010000
-#define EUR_CR_EVENT_HOST_ENABLE_ISP_VISIBILITY_FAIL_SHIFT 16
-#define EUR_CR_EVENT_HOST_ENABLE_BREAKPOINT_MASK 0x00008000
-#define EUR_CR_EVENT_HOST_ENABLE_BREAKPOINT_SHIFT 15
-#define EUR_CR_EVENT_HOST_ENABLE_SW_EVENT_MASK 0x00004000
-#define EUR_CR_EVENT_HOST_ENABLE_SW_EVENT_SHIFT 14
-#define EUR_CR_EVENT_HOST_ENABLE_TA_FINISHED_MASK 0x00002000
-#define EUR_CR_EVENT_HOST_ENABLE_TA_FINISHED_SHIFT 13
-#define EUR_CR_EVENT_HOST_ENABLE_TA_TERMINATE_MASK 0x00001000
-#define EUR_CR_EVENT_HOST_ENABLE_TA_TERMINATE_SHIFT 12
-#define EUR_CR_EVENT_HOST_ENABLE_TPC_CLEAR_MASK 0x00000800
-#define EUR_CR_EVENT_HOST_ENABLE_TPC_CLEAR_SHIFT 11
-#define EUR_CR_EVENT_HOST_ENABLE_TPC_FLUSH_MASK 0x00000400
-#define EUR_CR_EVENT_HOST_ENABLE_TPC_FLUSH_SHIFT 10
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_CLEAR_MASK 0x00000200
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_CLEAR_SHIFT 9
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_LOAD_MASK 0x00000100
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_LOAD_SHIFT 8
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_STORE_MASK 0x00000080
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_STORE_SHIFT 7
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_CLEAR_MASK 0x00000040
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_CLEAR_SHIFT 6
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_LOAD_MASK 0x00000020
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_LOAD_SHIFT 5
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_STORE_MASK 0x00000010
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_STORE_SHIFT 4
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_REACHED_MEM_THRESH_MASK 0x00000008
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_REACHED_MEM_THRESH_SHIFT 3
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_GBL_MASK 0x00000004
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_GBL_SHIFT 2
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_MT_MASK 0x00000002
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_MT_SHIFT 1
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_3D_MEM_FREE_MASK 0x00000001
-#define EUR_CR_EVENT_HOST_ENABLE_DPM_3D_MEM_FREE_SHIFT 0
-#define EUR_CR_EVENT_HOST_CLEAR 0x0134
-#define EUR_CR_EVENT_HOST_CLEAR_MASTER_INTERRUPT_MASK 0x80000000
-#define EUR_CR_EVENT_HOST_CLEAR_MASTER_INTERRUPT_SHIFT 31
-#define EUR_CR_EVENT_HOST_CLEAR_TIMER_MASK 0x20000000
-#define EUR_CR_EVENT_HOST_CLEAR_TIMER_SHIFT 29
-#define EUR_CR_EVENT_HOST_CLEAR_TA_DPM_FAULT_MASK 0x10000000
-#define EUR_CR_EVENT_HOST_CLEAR_TA_DPM_FAULT_SHIFT 28
-#define EUR_CR_EVENT_HOST_CLEAR_TWOD_COMPLETE_MASK 0x08000000
-#define EUR_CR_EVENT_HOST_CLEAR_TWOD_COMPLETE_SHIFT 27
-#define EUR_CR_EVENT_HOST_CLEAR_MADD_CACHE_INVALCOMPLETE_MASK 0x04000000
-#define EUR_CR_EVENT_HOST_CLEAR_MADD_CACHE_INVALCOMPLETE_SHIFT 26
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_ZLS_MASK 0x02000000
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_ZLS_SHIFT 25
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_TA_MEM_FREE_MASK 0x01000000
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_TA_MEM_FREE_SHIFT 24
-#define EUR_CR_EVENT_HOST_CLEAR_ISP_END_TILE_MASK 0x00800000
-#define EUR_CR_EVENT_HOST_CLEAR_ISP_END_TILE_SHIFT 23
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_INITEND_MASK 0x00400000
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_INITEND_SHIFT 22
-#define EUR_CR_EVENT_HOST_CLEAR_OTPM_LOADED_MASK 0x00200000
-#define EUR_CR_EVENT_HOST_CLEAR_OTPM_LOADED_SHIFT 21
-#define EUR_CR_EVENT_HOST_CLEAR_OTPM_INV_MASK 0x00100000
-#define EUR_CR_EVENT_HOST_CLEAR_OTPM_INV_SHIFT 20
-#define EUR_CR_EVENT_HOST_CLEAR_OTPM_FLUSHED_MASK 0x00080000
-#define EUR_CR_EVENT_HOST_CLEAR_OTPM_FLUSHED_SHIFT 19
-#define EUR_CR_EVENT_HOST_CLEAR_PIXELBE_END_RENDER_MASK 0x00040000
-#define EUR_CR_EVENT_HOST_CLEAR_PIXELBE_END_RENDER_SHIFT 18
-#define EUR_CR_EVENT_HOST_CLEAR_ISP_HALT_MASK 0x00020000
-#define EUR_CR_EVENT_HOST_CLEAR_ISP_HALT_SHIFT 17
-#define EUR_CR_EVENT_HOST_CLEAR_ISP_VISIBILITY_FAIL_MASK 0x00010000
-#define EUR_CR_EVENT_HOST_CLEAR_ISP_VISIBILITY_FAIL_SHIFT 16
-#define EUR_CR_EVENT_HOST_CLEAR_BREAKPOINT_MASK 0x00008000
-#define EUR_CR_EVENT_HOST_CLEAR_BREAKPOINT_SHIFT 15
-#define EUR_CR_EVENT_HOST_CLEAR_SW_EVENT_MASK 0x00004000
-#define EUR_CR_EVENT_HOST_CLEAR_SW_EVENT_SHIFT 14
-#define EUR_CR_EVENT_HOST_CLEAR_TA_FINISHED_MASK 0x00002000
-#define EUR_CR_EVENT_HOST_CLEAR_TA_FINISHED_SHIFT 13
-#define EUR_CR_EVENT_HOST_CLEAR_TA_TERMINATE_MASK 0x00001000
-#define EUR_CR_EVENT_HOST_CLEAR_TA_TERMINATE_SHIFT 12
-#define EUR_CR_EVENT_HOST_CLEAR_TPC_CLEAR_MASK 0x00000800
-#define EUR_CR_EVENT_HOST_CLEAR_TPC_CLEAR_SHIFT 11
-#define EUR_CR_EVENT_HOST_CLEAR_TPC_FLUSH_MASK 0x00000400
-#define EUR_CR_EVENT_HOST_CLEAR_TPC_FLUSH_SHIFT 10
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_CLEAR_MASK 0x00000200
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_CLEAR_SHIFT 9
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_LOAD_MASK 0x00000100
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_LOAD_SHIFT 8
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_STORE_MASK 0x00000080
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_STORE_SHIFT 7
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_CLEAR_MASK 0x00000040
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_CLEAR_SHIFT 6
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_LOAD_MASK 0x00000020
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_LOAD_SHIFT 5
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_STORE_MASK 0x00000010
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_STORE_SHIFT 4
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_REACHED_MEM_THRESH_MASK 0x00000008
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_REACHED_MEM_THRESH_SHIFT 3
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_GBL_MASK 0x00000004
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_GBL_SHIFT 2
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_MT_MASK 0x00000002
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_MT_SHIFT 1
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_3D_MEM_FREE_MASK 0x00000001
-#define EUR_CR_EVENT_HOST_CLEAR_DPM_3D_MEM_FREE_SHIFT 0
-#define EUR_CR_PDS 0x0ABC
-#define EUR_CR_PDS_DOUT_TIMEOUT_DISABLE_MASK 0x00000040
-#define EUR_CR_PDS_DOUT_TIMEOUT_DISABLE_SHIFT 6
-#define EUR_CR_PDS_EXEC_BASE 0x0AB8
-#define EUR_CR_PDS_EXEC_BASE_ADDR_MASK 0x0FF00000
-#define EUR_CR_PDS_EXEC_BASE_ADDR_SHIFT 20
-#define EUR_CR_EVENT_KICKER 0x0AC4
-#define EUR_CR_EVENT_KICKER_ADDRESS_MASK 0x0FFFFFF0
-#define EUR_CR_EVENT_KICKER_ADDRESS_SHIFT 4
-#define EUR_CR_EVENT_KICK 0x0AC8
-#define EUR_CR_EVENT_KICK_NOW_MASK 0x00000001
-#define EUR_CR_EVENT_KICK_NOW_SHIFT 0
-#define EUR_CR_EVENT_TIMER 0x0ACC
-#define EUR_CR_EVENT_TIMER_ENABLE_MASK 0x01000000
-#define EUR_CR_EVENT_TIMER_ENABLE_SHIFT 24
-#define EUR_CR_EVENT_TIMER_VALUE_MASK 0x00FFFFFF
-#define EUR_CR_EVENT_TIMER_VALUE_SHIFT 0
-#define EUR_CR_PDS_INV0 0x0AD0
-#define EUR_CR_PDS_INV0_DSC_MASK 0x00000001
-#define EUR_CR_PDS_INV0_DSC_SHIFT 0
-#define EUR_CR_PDS_INV1 0x0AD4
-#define EUR_CR_PDS_INV1_DSC_MASK 0x00000001
-#define EUR_CR_PDS_INV1_DSC_SHIFT 0
-#define EUR_CR_PDS_INV2 0x0AD8
-#define EUR_CR_PDS_INV2_DSC_MASK 0x00000001
-#define EUR_CR_PDS_INV2_DSC_SHIFT 0
-#define EUR_CR_PDS_INV3 0x0ADC
-#define EUR_CR_PDS_INV3_DSC_MASK 0x00000001
-#define EUR_CR_PDS_INV3_DSC_SHIFT 0
-#define EUR_CR_PDS_INV_CSC 0x0AE0
-#define EUR_CR_PDS_INV_CSC_KICK_MASK 0x00000001
-#define EUR_CR_PDS_INV_CSC_KICK_SHIFT 0
-#define EUR_CR_PDS_PC_BASE 0x0B2C
-#define EUR_CR_PDS_PC_BASE_ADDRESS_MASK 0x3FFFFFFF
-#define EUR_CR_PDS_PC_BASE_ADDRESS_SHIFT 0
-#define EUR_CR_BIF_CTRL 0x0C00
-#define EUR_CR_BIF_CTRL_NOREORDER_MASK 0x00000001
-#define EUR_CR_BIF_CTRL_NOREORDER_SHIFT 0
-#define EUR_CR_BIF_CTRL_PAUSE_MASK 0x00000002
-#define EUR_CR_BIF_CTRL_PAUSE_SHIFT 1
-#define EUR_CR_BIF_CTRL_FLUSH_MASK 0x00000004
-#define EUR_CR_BIF_CTRL_FLUSH_SHIFT 2
-#define EUR_CR_BIF_CTRL_INVALDC_MASK 0x00000008
-#define EUR_CR_BIF_CTRL_INVALDC_SHIFT 3
-#define EUR_CR_BIF_CTRL_CLEAR_FAULT_MASK 0x00000010
-#define EUR_CR_BIF_CTRL_CLEAR_FAULT_SHIFT 4
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_CACHE_MASK 0x00000100
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_CACHE_SHIFT 8
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_VDM_MASK 0x00000200
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_VDM_SHIFT 9
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_TE_MASK 0x00000400
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_TE_SHIFT 10
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_TWOD_MASK 0x00000800
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_TWOD_SHIFT 11
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_PBE_MASK 0x00001000
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_PBE_SHIFT 12
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_TSPP_MASK 0x00002000
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_TSPP_SHIFT 13
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_ISP_MASK 0x00004000
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_ISP_SHIFT 14
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_USE_MASK 0x00008000
-#define EUR_CR_BIF_CTRL_MMU_BYPASS_USE_SHIFT 15
-#define EUR_CR_BIF_INT_STAT 0x0C04
-#define EUR_CR_BIF_INT_STAT_FAULT_MASK 0x00003FFF
-#define EUR_CR_BIF_INT_STAT_FAULT_SHIFT 0
-#define EUR_CR_BIF_INT_STAT_PF_N_RW_MASK 0x00004000
-#define EUR_CR_BIF_INT_STAT_PF_N_RW_SHIFT 14
-#define EUR_CR_BIF_FAULT 0x0C08
-#define EUR_CR_BIF_FAULT_ADDR_MASK 0x0FFFF000
-#define EUR_CR_BIF_FAULT_ADDR_SHIFT 12
-#define EUR_CR_BIF_DIR_LIST_BASE0 0x0C84
-#define EUR_CR_BIF_DIR_LIST_BASE0_ADDR_MASK 0xFFFFF000
-#define EUR_CR_BIF_DIR_LIST_BASE0_ADDR_SHIFT 12
-#define EUR_CR_BIF_TWOD_REQ_BASE 0x0C88
-#define EUR_CR_BIF_TWOD_REQ_BASE_ADDR_MASK 0x0FF00000
-#define EUR_CR_BIF_TWOD_REQ_BASE_ADDR_SHIFT 20
-#define EUR_CR_BIF_TA_REQ_BASE 0x0C90
-#define EUR_CR_BIF_TA_REQ_BASE_ADDR_MASK 0x0FF00000
-#define EUR_CR_BIF_TA_REQ_BASE_ADDR_SHIFT 20
-#define EUR_CR_BIF_MEM_REQ_STAT 0x0CA8
-#define EUR_CR_BIF_MEM_REQ_STAT_READS_MASK 0x000000FF
-#define EUR_CR_BIF_MEM_REQ_STAT_READS_SHIFT 0
-#define EUR_CR_BIF_3D_REQ_BASE 0x0CAC
-#define EUR_CR_BIF_3D_REQ_BASE_ADDR_MASK 0x0FF00000
-#define EUR_CR_BIF_3D_REQ_BASE_ADDR_SHIFT 20
-#define EUR_CR_BIF_ZLS_REQ_BASE 0x0CB0
-#define EUR_CR_BIF_ZLS_REQ_BASE_ADDR_MASK 0x0FF00000
-#define EUR_CR_BIF_ZLS_REQ_BASE_ADDR_SHIFT 20
-#define EUR_CR_2D_BLIT_STATUS 0x0E04
-#define EUR_CR_2D_BLIT_STATUS_COMPLETE_MASK 0x00FFFFFF
-#define EUR_CR_2D_BLIT_STATUS_COMPLETE_SHIFT 0
-#define EUR_CR_2D_BLIT_STATUS_BUSY_MASK 0x01000000
-#define EUR_CR_2D_BLIT_STATUS_BUSY_SHIFT 24
-#define EUR_CR_2D_VIRTUAL_FIFO_0 0x0E10
-#define EUR_CR_2D_VIRTUAL_FIFO_0_ENABLE_MASK 0x00000001
-#define EUR_CR_2D_VIRTUAL_FIFO_0_ENABLE_SHIFT 0
-#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_MASK 0x0000000E
-#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_SHIFT 1
-#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_DIV_MASK 0x00000FF0
-#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_DIV_SHIFT 4
-#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_MUL_MASK 0x0000F000
-#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_MUL_SHIFT 12
-#define EUR_CR_2D_VIRTUAL_FIFO_1 0x0E14
-#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_ACC_MASK 0x00000FFF
-#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_ACC_SHIFT 0
-#define EUR_CR_2D_VIRTUAL_FIFO_1_MAX_ACC_MASK 0x00FFF000
-#define EUR_CR_2D_VIRTUAL_FIFO_1_MAX_ACC_SHIFT 12
-#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_METRIC_MASK 0xFF000000
-#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_METRIC_SHIFT 24
-#define EUR_CR_USE_CODE_BASE(X) (0x0A0C + (4 * (X)))
-#define EUR_CR_USE_CODE_BASE_ADDR_MASK 0x00FFFFFF
-#define EUR_CR_USE_CODE_BASE_ADDR_SHIFT 0
-#define EUR_CR_USE_CODE_BASE_DM_MASK 0x03000000
-#define EUR_CR_USE_CODE_BASE_DM_SHIFT 24
-#define EUR_CR_USE_CODE_BASE_SIZE_UINT32 16
-#define EUR_CR_USE_CODE_BASE_NUM_ENTRIES 16
+#define EUR_CR_CLKGATECTL 0x0000
+#define EUR_CR_CLKGATECTL_2D_CLKG_MASK 0x00000003
+#define EUR_CR_CLKGATECTL_2D_CLKG_SHIFT 0
+#define EUR_CR_CLKGATECTL_ISP_CLKG_MASK 0x00000030
+#define EUR_CR_CLKGATECTL_ISP_CLKG_SHIFT 4
+#define EUR_CR_CLKGATECTL_TSP_CLKG_MASK 0x00000300
+#define EUR_CR_CLKGATECTL_TSP_CLKG_SHIFT 8
+#define EUR_CR_CLKGATECTL_TA_CLKG_MASK 0x00003000
+#define EUR_CR_CLKGATECTL_TA_CLKG_SHIFT 12
+#define EUR_CR_CLKGATECTL_DPM_CLKG_MASK 0x00030000
+#define EUR_CR_CLKGATECTL_DPM_CLKG_SHIFT 16
+#define EUR_CR_CLKGATECTL_USE_CLKG_MASK 0x00300000
+#define EUR_CR_CLKGATECTL_USE_CLKG_SHIFT 20
+#define EUR_CR_CLKGATECTL_AUTO_MAN_REG_MASK 0x01000000
+#define EUR_CR_CLKGATECTL_AUTO_MAN_REG_SHIFT 24
+
+#define EUR_CR_CLKGATESTATUS 0x0004
+#define EUR_CR_CLKGATESTATUS_2D_CLKS_MASK 0x00000001
+#define EUR_CR_CLKGATESTATUS_2D_CLKS_SHIFT 0
+#define EUR_CR_CLKGATESTATUS_ISP_CLKS_MASK 0x00000010
+#define EUR_CR_CLKGATESTATUS_ISP_CLKS_SHIFT 4
+#define EUR_CR_CLKGATESTATUS_TSP_CLKS_MASK 0x00000100
+#define EUR_CR_CLKGATESTATUS_TSP_CLKS_SHIFT 8
+#define EUR_CR_CLKGATESTATUS_TA_CLKS_MASK 0x00001000
+#define EUR_CR_CLKGATESTATUS_TA_CLKS_SHIFT 12
+#define EUR_CR_CLKGATESTATUS_DPM_CLKS_MASK 0x00010000
+#define EUR_CR_CLKGATESTATUS_DPM_CLKS_SHIFT 16
+#define EUR_CR_CLKGATESTATUS_USE_CLKS_MASK 0x00100000
+#define EUR_CR_CLKGATESTATUS_USE_CLKS_SHIFT 20
+
+#define EUR_CR_CLKGATECTLOVR 0x0008
+#define EUR_CR_CLKGATECTLOVR_2D_CLKO_MASK 0x00000003
+#define EUR_CR_CLKGATECTLOVR_2D_CLKO_SHIFT 0
+#define EUR_CR_CLKGATECTLOVR_ISP_CLKO_MASK 0x00000030
+#define EUR_CR_CLKGATECTLOVR_ISP_CLKO_SHIFT 4
+#define EUR_CR_CLKGATECTLOVR_TSP_CLKO_MASK 0x00000300
+#define EUR_CR_CLKGATECTLOVR_TSP_CLKO_SHIFT 8
+#define EUR_CR_CLKGATECTLOVR_TA_CLKO_MASK 0x00003000
+#define EUR_CR_CLKGATECTLOVR_TA_CLKO_SHIFT 12
+#define EUR_CR_CLKGATECTLOVR_DPM_CLKO_MASK 0x00030000
+#define EUR_CR_CLKGATECTLOVR_DPM_CLKO_SHIFT 16
+#define EUR_CR_CLKGATECTLOVR_USE_CLKO_MASK 0x00300000
+#define EUR_CR_CLKGATECTLOVR_USE_CLKO_SHIFT 20
+
+#define EUR_CR_CORE_ID 0x0010
+#define EUR_CR_CORE_ID_CONFIG_MASK 0x0000FFFF
+#define EUR_CR_CORE_ID_CONFIG_SHIFT 0
+#define EUR_CR_CORE_ID_ID_MASK 0xFFFF0000
+#define EUR_CR_CORE_ID_ID_SHIFT 16
+
+#define EUR_CR_CORE_REVISION 0x0014
+#define EUR_CR_CORE_REVISION_MAINTENANCE_MASK 0x000000FF
+#define EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT 0
+#define EUR_CR_CORE_REVISION_MINOR_MASK 0x0000FF00
+#define EUR_CR_CORE_REVISION_MINOR_SHIFT 8
+#define EUR_CR_CORE_REVISION_MAJOR_MASK 0x00FF0000
+#define EUR_CR_CORE_REVISION_MAJOR_SHIFT 16
+#define EUR_CR_CORE_MAKE_REV(maj, min, maint) ( \
+ (((maj) << EUR_CR_CORE_REVISION_MAJOR_SHIFT) & \
+ EUR_CR_CORE_REVISION_MAJOR_MASK) | \
+ (((min) << EUR_CR_CORE_REVISION_MINOR_SHIFT) & \
+ EUR_CR_CORE_REVISION_MINOR_MASK) | \
+ (((maint) << EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT) & \
+ EUR_CR_CORE_REVISION_MAINTENANCE_MASK) \
+ )
+#define EUR_CR_CORE_REVISION_DESIGNER_MASK 0xFF000000
+#define EUR_CR_CORE_REVISION_DESIGNER_SHIFT 24
+
+#define EUR_CR_DESIGNER_REV_FIELD1 0x0018
+#define EUR_CR_DESIGNER_REV_FIELD1_DESIGNER_REV_FIELD1_MASK 0xFFFFFFFF
+#define EUR_CR_DESIGNER_REV_FIELD1_DESIGNER_REV_FIELD1_SHIFT 0
+
+#define EUR_CR_DESIGNER_REV_FIELD2 0x001C
+#define EUR_CR_DESIGNER_REV_FIELD2_DESIGNER_REV_FIELD2_MASK 0xFFFFFFFF
+#define EUR_CR_DESIGNER_REV_FIELD2_DESIGNER_REV_FIELD2_SHIFT 0
+
+#define EUR_CR_SOFT_RESET 0x0080
+#define EUR_CR_SOFT_RESET_BIF_RESET_MASK 0x00000001
+#define EUR_CR_SOFT_RESET_BIF_RESET_SHIFT 0
+#define EUR_CR_SOFT_RESET_TWOD_RESET_MASK 0x00000002
+#define EUR_CR_SOFT_RESET_TWOD_RESET_SHIFT 1
+#define EUR_CR_SOFT_RESET_DPM_RESET_MASK 0x00000004
+#define EUR_CR_SOFT_RESET_DPM_RESET_SHIFT 2
+#define EUR_CR_SOFT_RESET_TA_RESET_MASK 0x00000008
+#define EUR_CR_SOFT_RESET_TA_RESET_SHIFT 3
+#define EUR_CR_SOFT_RESET_USE_RESET_MASK 0x00000010
+#define EUR_CR_SOFT_RESET_USE_RESET_SHIFT 4
+#define EUR_CR_SOFT_RESET_ISP_RESET_MASK 0x00000020
+#define EUR_CR_SOFT_RESET_ISP_RESET_SHIFT 5
+#define EUR_CR_SOFT_RESET_TSP_RESET_MASK 0x00000040
+#define EUR_CR_SOFT_RESET_TSP_RESET_SHIFT 6
+
+#define EUR_CR_EVENT_HOST_ENABLE2 0x0110
+#define EUR_CR_EVENT_HOST_ENABLE2_DPM_3D_FREE_LOAD_MASK 0x00000002
+#define EUR_CR_EVENT_HOST_ENABLE2_DPM_3D_FREE_LOAD_SHIFT 1
+#define EUR_CR_EVENT_HOST_ENABLE2_DPM_TA_FREE_LOAD_MASK 0x00000001
+#define EUR_CR_EVENT_HOST_ENABLE2_DPM_TA_FREE_LOAD_SHIFT 0
+
+#define EUR_CR_EVENT_HOST_CLEAR2 0x0114
+#define EUR_CR_EVENT_HOST_CLEAR2_DPM_3D_FREE_LOAD_MASK 0x00000002
+#define EUR_CR_EVENT_HOST_CLEAR2_DPM_3D_FREE_LOAD_SHIFT 1
+#define EUR_CR_EVENT_HOST_CLEAR2_DPM_TA_FREE_LOAD_MASK 0x00000001
+#define EUR_CR_EVENT_HOST_CLEAR2_DPM_TA_FREE_LOAD_SHIFT 0
+
+#define EUR_CR_EVENT_STATUS2 0x0118
+#define EUR_CR_EVENT_STATUS2_DPM_3D_FREE_LOAD_MASK 0x00000002
+#define EUR_CR_EVENT_STATUS2_DPM_3D_FREE_LOAD_SHIFT 1
+#define EUR_CR_EVENT_STATUS2_DPM_TA_FREE_LOAD_MASK 0x00000001
+#define EUR_CR_EVENT_STATUS2_DPM_TA_FREE_LOAD_SHIFT 0
+
+#define EUR_CR_EVENT_STATUS 0x012C
+#define EUR_CR_EVENT_STATUS_MASTER_INTERRUPT_MASK 0x80000000
+#define EUR_CR_EVENT_STATUS_MASTER_INTERRUPT_SHIFT 31
+#define EUR_CR_EVENT_STATUS_TIMER_MASK 0x20000000
+#define EUR_CR_EVENT_STATUS_TIMER_SHIFT 29
+#define EUR_CR_EVENT_STATUS_TA_DPM_FAULT_MASK 0x10000000
+#define EUR_CR_EVENT_STATUS_TA_DPM_FAULT_SHIFT 28
+#define EUR_CR_EVENT_STATUS_TWOD_COMPLETE_MASK 0x08000000
+#define EUR_CR_EVENT_STATUS_TWOD_COMPLETE_SHIFT 27
+#define EUR_CR_EVENT_STATUS_MADD_CACHE_INVALCOMPLETE_MASK 0x04000000
+#define EUR_CR_EVENT_STATUS_MADD_CACHE_INVALCOMPLETE_SHIFT 26
+#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_ZLS_MASK 0x02000000
+#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_ZLS_SHIFT 25
+#define EUR_CR_EVENT_STATUS_DPM_TA_MEM_FREE_MASK 0x01000000
+#define EUR_CR_EVENT_STATUS_DPM_TA_MEM_FREE_SHIFT 24
+#define EUR_CR_EVENT_STATUS_ISP_END_TILE_MASK 0x00800000
+#define EUR_CR_EVENT_STATUS_ISP_END_TILE_SHIFT 23
+#define EUR_CR_EVENT_STATUS_DPM_INITEND_MASK 0x00400000
+#define EUR_CR_EVENT_STATUS_DPM_INITEND_SHIFT 22
+#define EUR_CR_EVENT_STATUS_OTPM_LOADED_MASK 0x00200000
+#define EUR_CR_EVENT_STATUS_OTPM_LOADED_SHIFT 21
+#define EUR_CR_EVENT_STATUS_OTPM_INV_MASK 0x00100000
+#define EUR_CR_EVENT_STATUS_OTPM_INV_SHIFT 20
+#define EUR_CR_EVENT_STATUS_OTPM_FLUSHED_MASK 0x00080000
+#define EUR_CR_EVENT_STATUS_OTPM_FLUSHED_SHIFT 19
+#define EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_MASK 0x00040000
+#define EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_SHIFT 18
+#define EUR_CR_EVENT_STATUS_ISP_HALT_MASK 0x00020000
+#define EUR_CR_EVENT_STATUS_ISP_HALT_SHIFT 17
+#define EUR_CR_EVENT_STATUS_ISP_VISIBILITY_FAIL_MASK 0x00010000
+#define EUR_CR_EVENT_STATUS_ISP_VISIBILITY_FAIL_SHIFT 16
+#define EUR_CR_EVENT_STATUS_BREAKPOINT_MASK 0x00008000
+#define EUR_CR_EVENT_STATUS_BREAKPOINT_SHIFT 15
+#define EUR_CR_EVENT_STATUS_SW_EVENT_MASK 0x00004000
+#define EUR_CR_EVENT_STATUS_SW_EVENT_SHIFT 14
+#define EUR_CR_EVENT_STATUS_TA_FINISHED_MASK 0x00002000
+#define EUR_CR_EVENT_STATUS_TA_FINISHED_SHIFT 13
+#define EUR_CR_EVENT_STATUS_TA_TERMINATE_MASK 0x00001000
+#define EUR_CR_EVENT_STATUS_TA_TERMINATE_SHIFT 12
+#define EUR_CR_EVENT_STATUS_TPC_CLEAR_MASK 0x00000800
+#define EUR_CR_EVENT_STATUS_TPC_CLEAR_SHIFT 11
+#define EUR_CR_EVENT_STATUS_TPC_FLUSH_MASK 0x00000400
+#define EUR_CR_EVENT_STATUS_TPC_FLUSH_SHIFT 10
+#define EUR_CR_EVENT_STATUS_DPM_CONTROL_CLEAR_MASK 0x00000200
+#define EUR_CR_EVENT_STATUS_DPM_CONTROL_CLEAR_SHIFT 9
+#define EUR_CR_EVENT_STATUS_DPM_CONTROL_LOAD_MASK 0x00000100
+#define EUR_CR_EVENT_STATUS_DPM_CONTROL_LOAD_SHIFT 8
+#define EUR_CR_EVENT_STATUS_DPM_CONTROL_STORE_MASK 0x00000080
+#define EUR_CR_EVENT_STATUS_DPM_CONTROL_STORE_SHIFT 7
+#define EUR_CR_EVENT_STATUS_DPM_STATE_CLEAR_MASK 0x00000040
+#define EUR_CR_EVENT_STATUS_DPM_STATE_CLEAR_SHIFT 6
+#define EUR_CR_EVENT_STATUS_DPM_STATE_LOAD_MASK 0x00000020
+#define EUR_CR_EVENT_STATUS_DPM_STATE_LOAD_SHIFT 5
+#define EUR_CR_EVENT_STATUS_DPM_STATE_STORE_MASK 0x00000010
+#define EUR_CR_EVENT_STATUS_DPM_STATE_STORE_SHIFT 4
+#define EUR_CR_EVENT_STATUS_DPM_REACHED_MEM_THRESH_MASK 0x00000008
+#define EUR_CR_EVENT_STATUS_DPM_REACHED_MEM_THRESH_SHIFT 3
+#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_GBL_MASK 0x00000004
+#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_GBL_SHIFT 2
+#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_MT_MASK 0x00000002
+#define EUR_CR_EVENT_STATUS_DPM_OUT_OF_MEMORY_MT_SHIFT 1
+#define EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_MASK 0x00000001
+#define EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_SHIFT 0
+
+#define EUR_CR_EVENT_HOST_ENABLE 0x0130
+#define EUR_CR_EVENT_HOST_ENABLE_MASTER_INTERRUPT_MASK 0x80000000
+#define EUR_CR_EVENT_HOST_ENABLE_MASTER_INTERRUPT_SHIFT 31
+#define EUR_CR_EVENT_HOST_ENABLE_TIMER_MASK 0x20000000
+#define EUR_CR_EVENT_HOST_ENABLE_TIMER_SHIFT 29
+#define EUR_CR_EVENT_HOST_ENABLE_TA_DPM_FAULT_MASK 0x10000000
+#define EUR_CR_EVENT_HOST_ENABLE_TA_DPM_FAULT_SHIFT 28
+#define EUR_CR_EVENT_HOST_ENABLE_TWOD_COMPLETE_MASK 0x08000000
+#define EUR_CR_EVENT_HOST_ENABLE_TWOD_COMPLETE_SHIFT 27
+#define EUR_CR_EVENT_HOST_ENABLE_MADD_CACHE_INVALCOMPLETE_MASK 0x04000000
+#define EUR_CR_EVENT_HOST_ENABLE_MADD_CACHE_INVALCOMPLETE_SHIFT 26
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_ZLS_MASK 0x02000000
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_ZLS_SHIFT 25
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_TA_MEM_FREE_MASK 0x01000000
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_TA_MEM_FREE_SHIFT 24
+#define EUR_CR_EVENT_HOST_ENABLE_ISP_END_TILE_MASK 0x00800000
+#define EUR_CR_EVENT_HOST_ENABLE_ISP_END_TILE_SHIFT 23
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_INITEND_MASK 0x00400000
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_INITEND_SHIFT 22
+#define EUR_CR_EVENT_HOST_ENABLE_OTPM_LOADED_MASK 0x00200000
+#define EUR_CR_EVENT_HOST_ENABLE_OTPM_LOADED_SHIFT 21
+#define EUR_CR_EVENT_HOST_ENABLE_OTPM_INV_MASK 0x00100000
+#define EUR_CR_EVENT_HOST_ENABLE_OTPM_INV_SHIFT 20
+#define EUR_CR_EVENT_HOST_ENABLE_OTPM_FLUSHED_MASK 0x00080000
+#define EUR_CR_EVENT_HOST_ENABLE_OTPM_FLUSHED_SHIFT 19
+#define EUR_CR_EVENT_HOST_ENABLE_PIXELBE_END_RENDER_MASK 0x00040000
+#define EUR_CR_EVENT_HOST_ENABLE_PIXELBE_END_RENDER_SHIFT 18
+#define EUR_CR_EVENT_HOST_ENABLE_ISP_HALT_MASK 0x00020000
+#define EUR_CR_EVENT_HOST_ENABLE_ISP_HALT_SHIFT 17
+#define EUR_CR_EVENT_HOST_ENABLE_ISP_VISIBILITY_FAIL_MASK 0x00010000
+#define EUR_CR_EVENT_HOST_ENABLE_ISP_VISIBILITY_FAIL_SHIFT 16
+#define EUR_CR_EVENT_HOST_ENABLE_BREAKPOINT_MASK 0x00008000
+#define EUR_CR_EVENT_HOST_ENABLE_BREAKPOINT_SHIFT 15
+#define EUR_CR_EVENT_HOST_ENABLE_SW_EVENT_MASK 0x00004000
+#define EUR_CR_EVENT_HOST_ENABLE_SW_EVENT_SHIFT 14
+#define EUR_CR_EVENT_HOST_ENABLE_TA_FINISHED_MASK 0x00002000
+#define EUR_CR_EVENT_HOST_ENABLE_TA_FINISHED_SHIFT 13
+#define EUR_CR_EVENT_HOST_ENABLE_TA_TERMINATE_MASK 0x00001000
+#define EUR_CR_EVENT_HOST_ENABLE_TA_TERMINATE_SHIFT 12
+#define EUR_CR_EVENT_HOST_ENABLE_TPC_CLEAR_MASK 0x00000800
+#define EUR_CR_EVENT_HOST_ENABLE_TPC_CLEAR_SHIFT 11
+#define EUR_CR_EVENT_HOST_ENABLE_TPC_FLUSH_MASK 0x00000400
+#define EUR_CR_EVENT_HOST_ENABLE_TPC_FLUSH_SHIFT 10
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_CLEAR_MASK 0x00000200
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_CLEAR_SHIFT 9
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_LOAD_MASK 0x00000100
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_LOAD_SHIFT 8
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_STORE_MASK 0x00000080
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_CONTROL_STORE_SHIFT 7
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_CLEAR_MASK 0x00000040
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_CLEAR_SHIFT 6
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_LOAD_MASK 0x00000020
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_LOAD_SHIFT 5
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_STORE_MASK 0x00000010
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_STATE_STORE_SHIFT 4
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_REACHED_MEM_THRESH_MASK 0x00000008
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_REACHED_MEM_THRESH_SHIFT 3
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_GBL_MASK 0x00000004
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_GBL_SHIFT 2
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_MT_MASK 0x00000002
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_OUT_OF_MEMORY_MT_SHIFT 1
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_3D_MEM_FREE_MASK 0x00000001
+#define EUR_CR_EVENT_HOST_ENABLE_DPM_3D_MEM_FREE_SHIFT 0
+
+#define EUR_CR_EVENT_HOST_CLEAR 0x0134
+#define EUR_CR_EVENT_HOST_CLEAR_MASTER_INTERRUPT_MASK 0x80000000
+#define EUR_CR_EVENT_HOST_CLEAR_MASTER_INTERRUPT_SHIFT 31
+#define EUR_CR_EVENT_HOST_CLEAR_TIMER_MASK 0x20000000
+#define EUR_CR_EVENT_HOST_CLEAR_TIMER_SHIFT 29
+#define EUR_CR_EVENT_HOST_CLEAR_TA_DPM_FAULT_MASK 0x10000000
+#define EUR_CR_EVENT_HOST_CLEAR_TA_DPM_FAULT_SHIFT 28
+#define EUR_CR_EVENT_HOST_CLEAR_TWOD_COMPLETE_MASK 0x08000000
+#define EUR_CR_EVENT_HOST_CLEAR_TWOD_COMPLETE_SHIFT 27
+#define EUR_CR_EVENT_HOST_CLEAR_MADD_CACHE_INVALCOMPLETE_MASK 0x04000000
+#define EUR_CR_EVENT_HOST_CLEAR_MADD_CACHE_INVALCOMPLETE_SHIFT 26
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_ZLS_MASK 0x02000000
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_ZLS_SHIFT 25
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_TA_MEM_FREE_MASK 0x01000000
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_TA_MEM_FREE_SHIFT 24
+#define EUR_CR_EVENT_HOST_CLEAR_ISP_END_TILE_MASK 0x00800000
+#define EUR_CR_EVENT_HOST_CLEAR_ISP_END_TILE_SHIFT 23
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_INITEND_MASK 0x00400000
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_INITEND_SHIFT 22
+#define EUR_CR_EVENT_HOST_CLEAR_OTPM_LOADED_MASK 0x00200000
+#define EUR_CR_EVENT_HOST_CLEAR_OTPM_LOADED_SHIFT 21
+#define EUR_CR_EVENT_HOST_CLEAR_OTPM_INV_MASK 0x00100000
+#define EUR_CR_EVENT_HOST_CLEAR_OTPM_INV_SHIFT 20
+#define EUR_CR_EVENT_HOST_CLEAR_OTPM_FLUSHED_MASK 0x00080000
+#define EUR_CR_EVENT_HOST_CLEAR_OTPM_FLUSHED_SHIFT 19
+#define EUR_CR_EVENT_HOST_CLEAR_PIXELBE_END_RENDER_MASK 0x00040000
+#define EUR_CR_EVENT_HOST_CLEAR_PIXELBE_END_RENDER_SHIFT 18
+#define EUR_CR_EVENT_HOST_CLEAR_ISP_HALT_MASK 0x00020000
+#define EUR_CR_EVENT_HOST_CLEAR_ISP_HALT_SHIFT 17
+#define EUR_CR_EVENT_HOST_CLEAR_ISP_VISIBILITY_FAIL_MASK 0x00010000
+#define EUR_CR_EVENT_HOST_CLEAR_ISP_VISIBILITY_FAIL_SHIFT 16
+#define EUR_CR_EVENT_HOST_CLEAR_BREAKPOINT_MASK 0x00008000
+#define EUR_CR_EVENT_HOST_CLEAR_BREAKPOINT_SHIFT 15
+#define EUR_CR_EVENT_HOST_CLEAR_SW_EVENT_MASK 0x00004000
+#define EUR_CR_EVENT_HOST_CLEAR_SW_EVENT_SHIFT 14
+#define EUR_CR_EVENT_HOST_CLEAR_TA_FINISHED_MASK 0x00002000
+#define EUR_CR_EVENT_HOST_CLEAR_TA_FINISHED_SHIFT 13
+#define EUR_CR_EVENT_HOST_CLEAR_TA_TERMINATE_MASK 0x00001000
+#define EUR_CR_EVENT_HOST_CLEAR_TA_TERMINATE_SHIFT 12
+#define EUR_CR_EVENT_HOST_CLEAR_TPC_CLEAR_MASK 0x00000800
+#define EUR_CR_EVENT_HOST_CLEAR_TPC_CLEAR_SHIFT 11
+#define EUR_CR_EVENT_HOST_CLEAR_TPC_FLUSH_MASK 0x00000400
+#define EUR_CR_EVENT_HOST_CLEAR_TPC_FLUSH_SHIFT 10
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_CLEAR_MASK 0x00000200
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_CLEAR_SHIFT 9
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_LOAD_MASK 0x00000100
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_LOAD_SHIFT 8
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_STORE_MASK 0x00000080
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_CONTROL_STORE_SHIFT 7
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_CLEAR_MASK 0x00000040
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_CLEAR_SHIFT 6
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_LOAD_MASK 0x00000020
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_LOAD_SHIFT 5
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_STORE_MASK 0x00000010
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_STATE_STORE_SHIFT 4
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_REACHED_MEM_THRESH_MASK 0x00000008
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_REACHED_MEM_THRESH_SHIFT 3
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_GBL_MASK 0x00000004
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_GBL_SHIFT 2
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_MT_MASK 0x00000002
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_OUT_OF_MEMORY_MT_SHIFT 1
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_3D_MEM_FREE_MASK 0x00000001
+#define EUR_CR_EVENT_HOST_CLEAR_DPM_3D_MEM_FREE_SHIFT 0
+
+#define EUR_CR_PDS 0x0ABC
+#define EUR_CR_PDS_DOUT_TIMEOUT_DISABLE_MASK 0x00000040
+#define EUR_CR_PDS_DOUT_TIMEOUT_DISABLE_SHIFT 6
+
+#define EUR_CR_PDS_EXEC_BASE 0x0AB8
+#define EUR_CR_PDS_EXEC_BASE_ADDR_MASK 0x0FF00000
+#define EUR_CR_PDS_EXEC_BASE_ADDR_SHIFT 20
+
+#define EUR_CR_EVENT_KICKER 0x0AC4
+#define EUR_CR_EVENT_KICKER_ADDRESS_MASK 0x0FFFFFF0
+#define EUR_CR_EVENT_KICKER_ADDRESS_SHIFT 4
+
+#define EUR_CR_EVENT_KICK 0x0AC8
+#define EUR_CR_EVENT_KICK_NOW_MASK 0x00000001
+#define EUR_CR_EVENT_KICK_NOW_SHIFT 0
+
+#define EUR_CR_EVENT_TIMER 0x0ACC
+#define EUR_CR_EVENT_TIMER_ENABLE_MASK 0x01000000
+#define EUR_CR_EVENT_TIMER_ENABLE_SHIFT 24
+#define EUR_CR_EVENT_TIMER_VALUE_MASK 0x00FFFFFF
+#define EUR_CR_EVENT_TIMER_VALUE_SHIFT 0
+
+#define EUR_CR_PDS_INV0 0x0AD0
+#define EUR_CR_PDS_INV0_DSC_MASK 0x00000001
+#define EUR_CR_PDS_INV0_DSC_SHIFT 0
+
+#define EUR_CR_PDS_INV1 0x0AD4
+#define EUR_CR_PDS_INV1_DSC_MASK 0x00000001
+#define EUR_CR_PDS_INV1_DSC_SHIFT 0
+
+#define EUR_CR_PDS_INV2 0x0AD8
+#define EUR_CR_PDS_INV2_DSC_MASK 0x00000001
+#define EUR_CR_PDS_INV2_DSC_SHIFT 0
+
+#define EUR_CR_PDS_INV3 0x0ADC
+#define EUR_CR_PDS_INV3_DSC_MASK 0x00000001
+#define EUR_CR_PDS_INV3_DSC_SHIFT 0
+
+#define EUR_CR_PDS_INV_CSC 0x0AE0
+#define EUR_CR_PDS_INV_CSC_KICK_MASK 0x00000001
+#define EUR_CR_PDS_INV_CSC_KICK_SHIFT 0
+
+#define EUR_CR_PDS_PC_BASE 0x0B2C
+#define EUR_CR_PDS_PC_BASE_ADDRESS_MASK 0x3FFFFFFF
+#define EUR_CR_PDS_PC_BASE_ADDRESS_SHIFT 0
+
+#define EUR_CR_BIF_CTRL 0x0C00
+#define EUR_CR_BIF_CTRL_NOREORDER_MASK 0x00000001
+#define EUR_CR_BIF_CTRL_NOREORDER_SHIFT 0
+#define EUR_CR_BIF_CTRL_PAUSE_MASK 0x00000002
+#define EUR_CR_BIF_CTRL_PAUSE_SHIFT 1
+#define EUR_CR_BIF_CTRL_FLUSH_MASK 0x00000004
+#define EUR_CR_BIF_CTRL_FLUSH_SHIFT 2
+#define EUR_CR_BIF_CTRL_INVALDC_MASK 0x00000008
+#define EUR_CR_BIF_CTRL_INVALDC_SHIFT 3
+#define EUR_CR_BIF_CTRL_CLEAR_FAULT_MASK 0x00000010
+#define EUR_CR_BIF_CTRL_CLEAR_FAULT_SHIFT 4
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_CACHE_MASK 0x00000100
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_CACHE_SHIFT 8
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_VDM_MASK 0x00000200
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_VDM_SHIFT 9
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_TE_MASK 0x00000400
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_TE_SHIFT 10
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_TWOD_MASK 0x00000800
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_TWOD_SHIFT 11
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_PBE_MASK 0x00001000
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_PBE_SHIFT 12
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_TSPP_MASK 0x00002000
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_TSPP_SHIFT 13
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_ISP_MASK 0x00004000
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_ISP_SHIFT 14
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_USE_MASK 0x00008000
+#define EUR_CR_BIF_CTRL_MMU_BYPASS_USE_SHIFT 15
+
+#define EUR_CR_BIF_INT_STAT 0x0C04
+#define EUR_CR_BIF_INT_STAT_FAULT_MASK 0x00003FFF
+#define EUR_CR_BIF_INT_STAT_FAULT_SHIFT 0
+#define EUR_CR_BIF_INT_STAT_PF_N_RW_MASK 0x00004000
+#define EUR_CR_BIF_INT_STAT_PF_N_RW_SHIFT 14
+#define EUR_CR_BIF_FAULT 0x0C08
+#define EUR_CR_BIF_FAULT_ADDR_MASK 0x0FFFF000
+#define EUR_CR_BIF_FAULT_ADDR_SHIFT 12
+
+#define EUR_CR_BIF_DIR_LIST_BASE0 0x0C84
+#define EUR_CR_BIF_DIR_LIST_BASE0_ADDR_MASK 0xFFFFF000
+#define EUR_CR_BIF_DIR_LIST_BASE0_ADDR_SHIFT 12
+
+#define EUR_CR_BIF_TWOD_REQ_BASE 0x0C88
+#define EUR_CR_BIF_TWOD_REQ_BASE_ADDR_MASK 0x0FF00000
+#define EUR_CR_BIF_TWOD_REQ_BASE_ADDR_SHIFT 20
+
+#define EUR_CR_BIF_TA_REQ_BASE 0x0C90
+#define EUR_CR_BIF_TA_REQ_BASE_ADDR_MASK 0x0FF00000
+#define EUR_CR_BIF_TA_REQ_BASE_ADDR_SHIFT 20
+
+#define EUR_CR_BIF_MEM_REQ_STAT 0x0CA8
+#define EUR_CR_BIF_MEM_REQ_STAT_READS_MASK 0x000000FF
+#define EUR_CR_BIF_MEM_REQ_STAT_READS_SHIFT 0
+
+#define EUR_CR_BIF_3D_REQ_BASE 0x0CAC
+#define EUR_CR_BIF_3D_REQ_BASE_ADDR_MASK 0x0FF00000
+#define EUR_CR_BIF_3D_REQ_BASE_ADDR_SHIFT 20
+
+#define EUR_CR_BIF_ZLS_REQ_BASE 0x0CB0
+#define EUR_CR_BIF_ZLS_REQ_BASE_ADDR_MASK 0x0FF00000
+#define EUR_CR_BIF_ZLS_REQ_BASE_ADDR_SHIFT 20
+
+#define EUR_CR_2D_BLIT_STATUS 0x0E04
+#define EUR_CR_2D_BLIT_STATUS_COMPLETE_MASK 0x00FFFFFF
+#define EUR_CR_2D_BLIT_STATUS_COMPLETE_SHIFT 0
+#define EUR_CR_2D_BLIT_STATUS_BUSY_MASK 0x01000000
+#define EUR_CR_2D_BLIT_STATUS_BUSY_SHIFT 24
+
+#define EUR_CR_2D_VIRTUAL_FIFO_0 0x0E10
+#define EUR_CR_2D_VIRTUAL_FIFO_0_ENABLE_MASK 0x00000001
+#define EUR_CR_2D_VIRTUAL_FIFO_0_ENABLE_SHIFT 0
+#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_MASK 0x0000000E
+#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_SHIFT 1
+#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_DIV_MASK 0x00000FF0
+#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_DIV_SHIFT 4
+#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_MUL_MASK 0x0000F000
+#define EUR_CR_2D_VIRTUAL_FIFO_0_FLOWRATE_MUL_SHIFT 12
+
+#define EUR_CR_2D_VIRTUAL_FIFO_1 0x0E14
+#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_ACC_MASK 0x00000FFF
+#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_ACC_SHIFT 0
+#define EUR_CR_2D_VIRTUAL_FIFO_1_MAX_ACC_MASK 0x00FFF000
+#define EUR_CR_2D_VIRTUAL_FIFO_1_MAX_ACC_SHIFT 12
+#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_METRIC_MASK 0xFF000000
+#define EUR_CR_2D_VIRTUAL_FIFO_1_MIN_METRIC_SHIFT 24
+
+#define EUR_CR_USE_CODE_BASE(X) (0x0A0C + (4 * (X)))
+#define EUR_CR_USE_CODE_BASE_ADDR_MASK 0x00FFFFFF
+#define EUR_CR_USE_CODE_BASE_ADDR_SHIFT 0
+#define EUR_CR_USE_CODE_BASE_DM_MASK 0x03000000
+#define EUR_CR_USE_CODE_BASE_DM_SHIFT 24
+#define EUR_CR_USE_CODE_BASE_SIZE_UINT32 16
+#define EUR_CR_USE_CODE_BASE_NUM_ENTRIES 16
#endif
#include "sgxinfo.h"
#include "pvr_bridge.h"
-
-#define PVRSRV_BRIDGE_SGX_CMD_BASE \
- (PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD+1)
+#define PVRSRV_BRIDGE_SGX_CMD_BASE (PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD+1)
#define PVRSRV_BRIDGE_SGX_GETCLIENTINFO \
PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+0)
#define PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO \
PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+26)
#define PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT \
PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+27)
-#define PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS \
+
+#define PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES \
PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+28)
-#define PVRSRV_BRIDGE_LAST_SGX_CMD \
- (PVRSRV_BRIDGE_SGX_CMD_BASE+28)
+#define PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+29)
+#define PVRSRV_BRIDGE_SGX_READ_HWPERF_CB \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+30)
+
+#if defined(PDUMP)
+#define PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+31)
+#define PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+32)
+#define PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+33)
+#define PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+34)
+#define PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB \
+ PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+35)
+#endif
+
+#define PVRSRV_BRIDGE_LAST_SGX_CMD (PVRSRV_BRIDGE_SGX_CMD_BASE+35)
struct PVRSRV_BRIDGE_IN_GETPHYSPAGEADDR {
u32 ui32BridgeFlags;
};
struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO {
- struct PVR3DIF4_INTERNAL_DEVINFO sSGXInternalDevInfo;
+ struct SGX_INTERNAL_DEVINFO sSGXInternalDevInfo;
enum PVRSRV_ERROR eError;
};
};
struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO {
- struct PVR3DIF4_CLIENT_INFO sClientInfo;
+ struct SGX_CLIENT_INFO sClientInfo;
enum PVRSRV_ERROR eError;
};
struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO {
u32 ui32BridgeFlags;
void *hDevCookie;
- struct PVR3DIF4_CLIENT_INFO sClientInfo;
+ struct SGX_CLIENT_INFO sClientInfo;
};
struct PVRSRV_BRIDGE_IN_ISPBREAKPOLL {
struct PVRSRV_BRIDGE_IN_DOKICK {
u32 ui32BridgeFlags;
void *hDevCookie;
- struct PVR3DIF4_CCB_KICK sCCBKick;
+ struct SGX_CCB_KICK sCCBKick;
};
+struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES {
+ u32 ui32BridgeFlags;
+ void *hDevCookie;
+};
struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER {
u32 ui32BridgeFlags;
struct PVRSRV_BRIDGE_IN_SCHEDULECOMMAND {
u32 ui32BridgeFlags;
void *hDevCookie;
- enum PVRSRV_SGX_COMMAND_TYPE eCommandType;
- struct PVRSRV_SGX_COMMAND *psCommandData;
+ enum SGXMKIF_COMMAND_TYPE eCommandType;
+ struct SGXMKIF_COMMAND *psCommandData;
};
#ifdef PDUMP
struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY {
u32 ui32BridgeFlags;
- struct PVR3DIF4_KICKTA_DUMP_BUFFER *psBufferArray;
+ struct SGX_KICKTA_DUMP_BUFFER __user *psBufferArray;
u32 ui32BufferArrayLength;
IMG_BOOL bDumpPolls;
};
u32 ui32NumRegisters;
};
+struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB {
+ u32 ui32BridgeFlags;
+ void *hDevCookie;
+ char szFileName[PVRSRV_PDUMP_MAX_FILENAME_SIZE];
+ u32 ui32FileOffset;
+ u32 ui32PDumpFlags;
+
+};
+
#endif
struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT {
struct IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr;
};
-
struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS {
u32 ui32BridgeFlags;
void *hDevCookie;
struct PVRSRV_SGXDEV_DIFF_INFO sDiffs;
};
+struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB {
+ u32 ui32BridgeFlags;
+ void *hDevCookie;
+ u32 ui32ArraySize;
+ struct PVRSRV_SGX_HWPERF_CB_ENTRY __user *psHWPerfCBData;
+};
+
+struct PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_CB {
+ enum PVRSRV_ERROR eError;
+ u32 ui32DataCount;
+ u32 ui32ClockSpeed;
+ u32 ui32HostTimeStamp;
+};
+
#endif
enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
- struct PVR3DIF4_CCB_KICK *psCCBKick);
+ struct SGX_CCB_KICK *psCCBKick);
enum PVRSRV_ERROR SGXGetPhysPageAddrKM(void *hDevMemHeap,
struct IMG_DEV_VIRTADDR sDevVAddr,
void *hDevMemContext, struct IMG_DEV_PHYADDR *psPDDevPAddr);
enum PVRSRV_ERROR SGXGetClientInfoKM(void *hDevCookie,
- struct PVR3DIF4_CLIENT_INFO *psClientInfo);
+ struct SGX_CLIENT_INFO *psClientInfo);
enum PVRSRV_ERROR SGXGetMiscInfoKM(struct PVRSRV_SGXDEV_INFO *psDevInfo,
- struct SGX_MISC_INFO *psMiscInfo);
+ struct SGX_MISC_INFO *psMiscInfo,
+ struct PVRSRV_DEVICE_NODE *psDeviceNode);
enum PVRSRV_ERROR SGXReadDiffCountersKM(void *hDevHandle, u32 ui32Reg,
- u32 *pui32Old, IMG_BOOL bNew, u32 ui32New, u32 ui32NewReset,
- u32 ui32CountersReg, u32 *pui32Time, IMG_BOOL *pbActive,
- struct PVRSRV_SGXDEV_DIFF_INFO *psDiffs);
+ u32 *pui32Old, IMG_BOOL bNew, u32 ui32New,
+ u32 ui32NewReset, u32 ui32CountersReg,
+ u32 *pui32Time, IMG_BOOL *pbActive,
+ struct PVRSRV_SGXDEV_DIFF_INFO *psDiffs);
+enum PVRSRV_ERROR SGXReadHWPerfCBKM(void *hDevHandle, u32 ui32ArraySize,
+ struct PVRSRV_SGX_HWPERF_CB_ENTRY *psHWPerfCBData,
+ u32 *pui32DataCount, u32 *pui32ClockSpeed,
+ u32 *pui32HostTimeStamp);
enum PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(
- struct PVRSRV_SGXDEV_INFO *psDevInfo,
- struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo,
- IMG_BOOL bWaitForComplete);
+ struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo,
+ IMG_BOOL bWaitForComplete);
enum PVRSRV_ERROR SGXGetInfoForSrvinitKM(void *hDevHandle,
- struct SGX_BRIDGE_INFO_FOR_SRVINIT *psInitInfo);
+ struct SGX_BRIDGE_INFO_FOR_SRVINIT *psInitInfo);
enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
- void *hDevHandle, struct SGX_BRIDGE_INIT_INFO *psInitInfo);
+ void *hDevHandle,
+ struct SGX_BRIDGE_INIT_INFO *psInitInfo);
enum PVRSRV_ERROR SGXFindSharedPBDescKM(
struct PVRSRV_PER_PROCESS_DATA *psPerProc,
u32 ui32SharedPBDescSubKernelMemInfosCount);
enum PVRSRV_ERROR SGXGetInternalDevInfoKM(void *hDevCookie,
- struct PVR3DIF4_INTERNAL_DEVINFO *psSGXInternalDevInfo);
+ struct SGX_INTERNAL_DEVINFO *psSGXInternalDevInfo);
+
+int sgx_force_reset(void);
#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#if defined(DEBUG) || defined(INTERNAL_TEST)
+#define DEBUG_SET_OFFSET OPTIONS_BIT0
+#define OPTIONS_BIT0 0x1
+#else
+#define OPTIONS_BIT0 0x0
+#endif
+
+#if defined(PDUMP) || defined(INTERNAL_TEST)
+#define PDUMP_SET_OFFSET OPTIONS_BIT1
+#define OPTIONS_BIT1 (0x1 << 1)
+#else
+#define OPTIONS_BIT1 0x0
+#endif
+
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) || defined(INTERNAL_TEST)
+#define PVRSRV_USSE_EDM_STATUS_DEBUG_SET_OFFSET OPTIONS_BIT2
+#define OPTIONS_BIT2 (0x1 << 2)
+#else
+#define OPTIONS_BIT2 0x0
+#endif
+
+#define SUPPORT_HW_RECOVERY_SET_OFFSET OPTIONS_BIT3
+#define OPTIONS_BIT3 (0x1 << 3)
+
+#define PVR_SECURE_HANDLES_SET_OFFSET OPTIONS_BIT4
+#define OPTIONS_BIT4 (0x1 << 4)
+
+#if defined(INTERNAL_TEST)
+#define SGX_BYPASS_SYSTEM_CACHE_SET_OFFSET OPTIONS_BIT5
+#define OPTIONS_BIT5 (0x1 << 5)
+#else
+#define OPTIONS_BIT5 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_DMS_AGE_ENABLE_SET_OFFSET OPTIONS_BIT6
+#define OPTIONS_BIT6 (0x1 << 6)
+#else
+#define OPTIONS_BIT6 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_DONT_SWITCH_OFF_FEATURES_SET_OFFSET OPTIONS_BIT7
+#define OPTIONS_BIT7 (0x1 << 7)
+#else
+#define OPTIONS_BIT7 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FAST_DPM_INIT_SET_OFFSET OPTIONS_BIT8
+#define OPTIONS_BIT8 (0x1 << 8)
+#else
+#define OPTIONS_BIT8 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FEATURE_DCU_SET_OFFSET OPTIONS_BIT9
+#define OPTIONS_BIT9 (0x1 << 9)
+#else
+#define OPTIONS_BIT9 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FEATURE_MP_SET_OFFSET OPTIONS_BIT10
+#define OPTIONS_BIT10 (0x1 << 10)
+#else
+#define OPTIONS_BIT10 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FEATURE_MULTITHREADED_UKERNEL_SET_OFFSET OPTIONS_BIT11
+#define OPTIONS_BIT11 (0x1 << 11)
+#else
+#define OPTIONS_BIT11 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FEATURE_OVERLAPPED_SPM_SET_OFFSET OPTIONS_BIT12
+#define OPTIONS_BIT12 (0x1 << 12)
+#else
+#define OPTIONS_BIT12 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FEATURE_RENDER_TARGET_ARRAYS_SET_OFFSET OPTIONS_BIT13
+#define OPTIONS_BIT13 (0x1 << 13)
+#else
+#define OPTIONS_BIT13 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_FEATURE_SYSTEM_CACHE_SET_OFFSET OPTIONS_BIT14
+#define OPTIONS_BIT14 (0x1 << 14)
+#else
+#define OPTIONS_BIT14 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define SGX_SUPPORT_HWPROFILING_SET_OFFSET OPTIONS_BIT15
+#define OPTIONS_BIT15 (0x1 << 15)
+#else
+#define OPTIONS_BIT15 0x0
+#endif
+
+#define SUPPORT_ACTIVE_POWER_MANAGEMENT_SET_OFFSET OPTIONS_BIT16
+#define OPTIONS_BIT16 (0x1 << 16)
+
+#if defined(INTERNAL_TEST)
+#define SUPPORT_DISPLAYCONTROLLER_TILING_SET_OFFSET OPTIONS_BIT17
+#define OPTIONS_BIT17 (0x1 << 17)
+#else
+#define OPTIONS_BIT17 0x0
+#endif
+
+#define SUPPORT_PERCONTEXT_PB_SET_OFFSET OPTIONS_BIT18
+#define OPTIONS_BIT18 (0x1 << 18)
+
+#define OPTIONS_BIT19 (0x1 << 19)
+
+#if defined(INTERNAL_TEST)
+#define SUPPORT_SGX_MMU_DUMMY_PAGE_SET_OFFSET OPTIONS_BIT20
+#define OPTIONS_BIT20 (0x1 << 20)
+#else
+#define OPTIONS_BIT20 0x0
+#endif
+
+#define SUPPORT_SGX_PRIORITY_SCHEDULING_SET_OFFSET OPTIONS_BIT21
+#define OPTIONS_BIT21 (0x1 << 21)
+
+#if defined(INTERNAL_TEST)
+#define USE_SUPPORT_NO_TA3D_OVERLAP_SET_OFFSET OPTIONS_BIT22
+#define OPTIONS_BIT22 (0x1 << 22)
+#else
+#define OPTIONS_BIT22 0x0
+#endif
+
+#if defined(INTERNAL_TEST)
+#define OPTIONS_HIGHBYTE \
+ ((SGX_FEATURE_MP_CORE_COUNT-1) << SGX_FEATURE_MP_CORE_COUNT_SET_OFFSET)
+#define SGX_FEATURE_MP_CORE_COUNT_SET_OFFSET 28UL
+#define SGX_FEATURE_MP_CORE_COUNT_SET_MASK 0xFF
+#else
+#define OPTIONS_HIGHBYTE 0x0
+#endif
+
+#define SGX_BUILD_OPTIONS ( \
+ OPTIONS_BIT0 | OPTIONS_BIT1 | OPTIONS_BIT2 | OPTIONS_BIT3 | \
+ OPTIONS_BIT4 | OPTIONS_BIT5 | OPTIONS_BIT6 | OPTIONS_BIT7 | \
+ OPTIONS_BIT8 | OPTIONS_BIT9 | OPTIONS_BIT10 | OPTIONS_BIT11 | \
+ OPTIONS_BIT12 | OPTIONS_BIT13 | OPTIONS_BIT14 | OPTIONS_BIT15 | \
+ OPTIONS_BIT16 | OPTIONS_BIT17 | OPTIONS_BIT18 | OPTIONS_BIT19 | \
+ OPTIONS_BIT20 | OPTIONS_BIT21 | OPTIONS_BIT22 | OPTIONS_HIGHBYTE)
#include "sgxdefs.h"
+#if defined(__KERNEL__)
+#include <linux/unistd.h>
+#else
+#include <unistd.h>
+#endif
-#define SGX_GENERAL_HEAP_ID 0
-#define SGX_TADATA_HEAP_ID 1
-#define SGX_KERNEL_CODE_HEAP_ID 2
-#define SGX_VIDEO_CODE_HEAP_ID 3
-#define SGX_KERNEL_VIDEO_DATA_HEAP_ID 4
-#define SGX_PIXELSHADER_HEAP_ID 5
-#define SGX_VERTEXSHADER_HEAP_ID 6
-#define SGX_PDSPIXEL_CODEDATA_HEAP_ID 7
-#define SGX_PDSVERTEX_CODEDATA_HEAP_ID 8
-#define SGX_SYNCINFO_HEAP_ID 9
-#define SGX_3DPARAMETERS_HEAP_ID 10
-#define SGX_GENERAL_MAPPING_HEAP_ID 11
-#define SGX_UNDEFINED_HEAP_ID (~0LU)
-
-#define SGX_ALT_MAPPING_HEAP_ID 12
-#define SGX_FB_MAPPING_HEAP_ID 13
-#define SGX_MAX_HEAP_ID 14
-
-#define SGX_MAX_TA_STATUS_VALS 32
-#define SGX_MAX_3D_STATUS_VALS 2
-
-#define SGX_MAX_SRC_SYNCS 4
-
-struct SGX_SLAVE_PORT {
- void *pvData;
- u32 ui32DataRange;
- u32 *pui32Offset;
- struct IMG_SYS_PHYADDR sPhysBase;
+#define SGX_UNDEFINED_HEAP_ID (~0LU)
+#define SGX_GENERAL_HEAP_ID 0
+#define SGX_TADATA_HEAP_ID 1
+#define SGX_KERNEL_CODE_HEAP_ID 2
+#define SGX_KERNEL_DATA_HEAP_ID 3
+#define SGX_PIXELSHADER_HEAP_ID 4
+#define SGX_VERTEXSHADER_HEAP_ID 5
+#define SGX_PDSPIXEL_CODEDATA_HEAP_ID 6
+#define SGX_PDSVERTEX_CODEDATA_HEAP_ID 7
+#define SGX_SYNCINFO_HEAP_ID 8
+#define SGX_3DPARAMETERS_HEAP_ID 9
+#define SGX_MAX_HEAP_ID 10
+
+#define SGX_MAX_TA_STATUS_VALS 32
+#define SGX_MAX_3D_STATUS_VALS 2
+
+#define SGX_MAX_SRC_SYNCS 4
+
+#define PVRSRV_SGX_HWPERF_NUM_COUNTERS 9
+
+#define PVRSRV_SGX_HWPERF_INVALID 0x1
+
+#define PVRSRV_SGX_HWPERF_TRANSFER 0x2
+#define PVRSRV_SGX_HWPERF_TA 0x3
+#define PVRSRV_SGX_HWPERF_3D 0x4
+#define PVRSRV_SGX_HWPERF_2D 0x5
+
+#define PVRSRV_SGX_HWPERF_MK_EVENT 0x101
+#define PVRSRV_SGX_HWPERF_MK_TA 0x102
+#define PVRSRV_SGX_HWPERF_MK_3D 0x103
+#define PVRSRV_SGX_HWPERF_MK_2D 0x104
+
+#define PVRSRV_SGX_HWPERF_TYPE_STARTEND_BIT 28
+#define PVRSRV_SGX_HWPERF_TYPE_OP_MASK \
+ ((1 << PVRSRV_SGX_HWPERF_TYPE_STARTEND_BIT) - 1)
+#define PVRSRV_SGX_HWPERF_TYPE_OP_START \
+ (0 << PVRSRV_SGX_HWPERF_TYPE_STARTEND_BIT)
+#define PVRSRV_SGX_HWPERF_TYPE_OP_END \
+ (1 << PVRSRV_SGX_HWPERF_TYPE_STARTEND_BIT)
+
+#define PVRSRV_SGX_HWPERF_TYPE_TRANSFER_START \
+ (PVRSRV_SGX_HWPERF_TRANSFER | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_TRANSFER_END \
+ (PVRSRV_SGX_HWPERF_TRANSFER | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+#define PVRSRV_SGX_HWPERF_TYPE_TA_START \
+ (PVRSRV_SGX_HWPERF_TA | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_TA_END \
+ (PVRSRV_SGX_HWPERF_TA | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+#define PVRSRV_SGX_HWPERF_TYPE_3D_START \
+ (PVRSRV_SGX_HWPERF_3D | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_3D_END \
+ (PVRSRV_SGX_HWPERF_3D | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+#define PVRSRV_SGX_HWPERF_TYPE_2D_START \
+ (PVRSRV_SGX_HWPERF_2D | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_2D_END \
+ (PVRSRV_SGX_HWPERF_2D | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+
+#define PVRSRV_SGX_HWPERF_TYPE_MK_EVENT_START \
+ (PVRSRV_SGX_HWPERF_MK_EVENT | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_EVENT_END \
+ (PVRSRV_SGX_HWPERF_MK_EVENT | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_TA_START \
+ (PVRSRV_SGX_HWPERF_MK_TA | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_TA_END \
+ (PVRSRV_SGX_HWPERF_MK_TA | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_3D_START \
+ (PVRSRV_SGX_HWPERF_MK_3D | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_3D_END \
+ (PVRSRV_SGX_HWPERF_MK_3D | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_2D_START \
+ (PVRSRV_SGX_HWPERF_MK_2D | PVRSRV_SGX_HWPERF_TYPE_OP_START)
+#define PVRSRV_SGX_HWPERF_TYPE_MK_2D_END \
+ (PVRSRV_SGX_HWPERF_MK_2D | PVRSRV_SGX_HWPERF_TYPE_OP_END)
+
+#define PVRSRV_SGX_HWPERF_OFF 0x0
+#define PVRSRV_SGX_HWPERF_GRAPHICS_ON (1UL << 0)
+#define PVRSRV_SGX_HWPERF_MK_EXECUTION_ON (1UL << 1)
+
+struct PVRSRV_SGX_HWPERF_CB_ENTRY {
+ u32 ui32FrameNo;
+ u32 ui32Type;
+ u32 ui32Ordinal;
+ u32 ui32Clocksx16;
+ u32 ui32Counters[PVRSRV_SGX_HWPERF_NUM_COUNTERS];
};
-#define PVRSRV_SGX_HWPERF_CBSIZE 0x100
-
-#define PVRSRV_SGX_HWPERF_INVALID 1
-#define PVRSRV_SGX_HWPERF_TRANSFER 2
-#define PVRSRV_SGX_HWPERF_TA 3
-#define PVRSRV_SGX_HWPERF_3D 4
-
-#define PVRSRV_SGX_HWPERF_ON 0x40
-
struct PVRSRV_SGX_HWPERF_CBDATA {
u32 ui32FrameNo;
u32 ui32Type;
u32 ui32TimeMax;
};
-struct PVRSRV_SGX_HWPERF_CB {
- u32 ui32Woff;
- u32 ui32Roff;
- struct PVRSRV_SGX_HWPERF_CBDATA
- psHWPerfCBData[PVRSRV_SGX_HWPERF_CBSIZE];
-};
-
struct SGX_MISC_INFO_HWPERF_RETRIEVE_CB {
struct PVRSRV_SGX_HWPERF_CBDATA *psHWPerfData;
u32 ui32ArraySize;
u32 ui32Time;
};
+struct CTL_STATUS {
+ struct IMG_DEV_VIRTADDR sStatusDevAddr;
+ u32 ui32StatusValue;
+};
+
enum SGX_MISC_INFO_REQUEST {
SGX_MISC_INFO_REQUEST_CLOCKSPEED = 0,
+ SGX_MISC_INFO_REQUEST_SGXREV,
+ SGX_MISC_INFO_REQUEST_DRIVER_SGXREV,
+ SGX_MISC_INFO_REQUEST_SET_HWPERF_STATUS,
SGX_MISC_INFO_REQUEST_HWPERF_CB_ON,
SGX_MISC_INFO_REQUEST_HWPERF_CB_OFF,
SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB,
SGX_MISC_INFO_REQUEST_FORCE_I16 = 0x7fff
};
+struct PVRSRV_SGX_MISCINFO_FEATURES {
+ u32 ui32CoreRev;
+ u32 ui32CoreID;
+ u32 ui32DDKVersion;
+ u32 ui32DDKBuild;
+ u32 ui32CoreIdSW;
+ u32 ui32CoreRevSW;
+ u32 ui32BuildOptions;
+};
+
struct SGX_MISC_INFO {
enum SGX_MISC_INFO_REQUEST eRequest;
union {
u32 reserved;
+ struct PVRSRV_SGX_MISCINFO_FEATURES sSGXFeatures;
u32 ui32SGXClockSpeed;
+ u32 ui32NewHWPerfStatus;
struct SGX_MISC_INFO_HWPERF_RETRIEVE_CB sRetrieveCB;
} uData;
};
+#define SGX_KICKTA_DUMPBITMAP_MAX_NAME_LENGTH 256
-#define PVR3DIF4_KICKTA_DUMPBITMAP_MAX_NAME_LENGTH 256
-
-struct PVR3DIF4_KICKTA_DUMPBITMAP {
+struct SGX_KICKTA_DUMPBITMAP {
struct IMG_DEV_VIRTADDR sDevBaseAddr;
u32 ui32Flags;
u32 ui32Width;
u32 ui32Stride;
u32 ui32PDUMPFormat;
u32 ui32BytesPP;
- char pszName[PVR3DIF4_KICKTA_DUMPBITMAP_MAX_NAME_LENGTH];
+ char pszName[SGX_KICKTA_DUMPBITMAP_MAX_NAME_LENGTH];
};
-#define PVRSRV_SGX_PDUMP_CONTEXT_MAX_BITMAP_ARRAY_SIZE (16)
+#define PVRSRV_SGX_PDUMP_CONTEXT_MAX_BITMAP_ARRAY_SIZE 16
struct PVRSRV_SGX_PDUMP_CONTEXT {
u32 ui32CacheControl;
};
-struct PVR3DIF4_KICKTA_DUMP_ROFF {
+struct SGX_KICKTA_DUMP_ROFF {
void *hKernelMemInfo;
u32 uiAllocIndex;
u32 ui32Offset;
char *pszName;
};
-struct PVR3DIF4_KICKTA_DUMP_BUFFER {
+struct SGX_KICKTA_DUMP_BUFFER {
u32 ui32SpaceUsed;
u32 ui32Start;
u32 ui32End;
u32 ui32BackEndLength;
u32 uiAllocIndex;
void *hKernelMemInfo;
+ void *pvLinAddr;
char *pszName;
};
#ifdef PDUMP
-struct PVR3DIF4_KICKTA_PDUMP {
+struct SGX_KICKTA_PDUMP {
- struct PVR3DIF4_KICKTA_DUMPBITMAP *psPDumpBitmapArray;
+ struct SGX_KICKTA_DUMPBITMAP *psPDumpBitmapArray;
u32 ui32PDumpBitmapSize;
- struct PVR3DIF4_KICKTA_DUMP_BUFFER *psBufferArray;
+ struct SGX_KICKTA_DUMP_BUFFER *psBufferArray;
u32 ui32BufferArraySize;
- struct PVR3DIF4_KICKTA_DUMP_ROFF *psROffArray;
+ struct SGX_KICKTA_DUMP_ROFF *psROffArray;
u32 ui32ROffArraySize;
};
#endif
#ifndef __SGXCONFIG_H__
#define __SGXCONFIG_H__
-#ifndef SGX530
-#error "sgxconfig.h: ERROR: unspecified SGX Core version"
-#endif
-
-#define DEV_DEVICE_TYPE PVRSRV_DEVICE_TYPE_SGX
-#define DEV_DEVICE_CLASS PVRSRV_DEVICE_CLASS_3D
-
-#define DEV_MAJOR_VERSION 1
-#define DEV_MINOR_VERSION 0
+#define DEV_DEVICE_TYPE PVRSRV_DEVICE_TYPE_SGX
+#define DEV_DEVICE_CLASS PVRSRV_DEVICE_CLASS_3D
+#define DEV_MAJOR_VERSION 1
+#define DEV_MINOR_VERSION 0
-#define SGX_ADDRESS_SPACE_SIZE 28
+#define SGX_GENERAL_HEAP_BASE 0x01800000
+#define SGX_GENERAL_HEAP_SIZE (0x06C00000-0x00001000)
-#define SGX_GENERAL_HEAP_BASE 0x00400000
-#define SGX_GENERAL_HEAP_SIZE (0x05000000-0x00401000)
+#define SGX_3DPARAMETERS_HEAP_BASE 0x08400000
+#define SGX_3DPARAMETERS_HEAP_SIZE (0x04000000-0x00001000)
-#define SGX_GENERAL_MAPPING_HEAP_BASE 0x05000000
-#define SGX_GENERAL_MAPPING_HEAP_SIZE (0x06800000-0x05001000)
+#define SGX_TADATA_HEAP_BASE 0x0C400000
+#define SGX_TADATA_HEAP_SIZE (0x01000000-0x00001000)
-#define SGX_FB_MAPPING_HEAP_BASE 0x06800000
-#define SGX_FB_MAPPING_HEAP_SIZE (0x07000000-0x06801000)
+#define SGX_SYNCINFO_HEAP_BASE 0x0D400000
+#define SGX_SYNCINFO_HEAP_SIZE (0x00400000-0x00001000)
-#define SGX_TADATA_HEAP_BASE 0x07000000
-#define SGX_TADATA_HEAP_SIZE (0x01000000-0x00001000)
+#define SGX_PDSPIXEL_CODEDATA_HEAP_BASE 0x0D800000
+#define SGX_PDSPIXEL_CODEDATA_HEAP_SIZE (0x00800000-0x00001000)
-#define SGX_3DPARAMETERS_HEAP_BASE 0x08000000
-#define SGX_3DPARAMETERS_HEAP_SIZE (0x04000000-0x00001000)
+#define SGX_PDSVERTEX_CODEDATA_HEAP_BASE 0x0E000000
+#define SGX_PDSVERTEX_CODEDATA_HEAP_SIZE (0x00800000-0x00001000)
-#define SGX_ALT_MAPPING_HEAP_BASE (0x0C000000)
-#define SGX_ALT_MAPPING_HEAP_SIZE (0x0D000000 - 0x0C001000)
+#define SGX_RESERVED_CODE_HEAP_BASE 0x0E800000
+#define SGX_RESERVED_CODE_HEAP_SIZE (0x00080000-0x00001000)
-#define SGX_PIXELSHADER_HEAP_BASE 0x0D000000
-#define SGX_PIXELSHADER_HEAP_SIZE 0x00500000
+#define SGX_KERNEL_CODE_HEAP_BASE 0x0EC00000
+#define SGX_KERNEL_CODE_HEAP_SIZE (0x00080000-0x00001000)
-#define SGX_VERTEXSHADER_HEAP_BASE 0x0D800000
-#define SGX_VERTEXSHADER_HEAP_SIZE 0x00200000
+#define SGX_KERNEL_DATA_HEAP_BASE 0x0F000000
+#define SGX_KERNEL_DATA_HEAP_SIZE (0x00400000-0x00001000)
-#define SGX_PDSPIXEL_CODEDATA_HEAP_BASE 0x0E000000
-#define SGX_PDSPIXEL_CODEDATA_HEAP_SIZE (0x00800000-0x00001000)
+#define SGX_PIXELSHADER_HEAP_BASE 0x0F400000
+#define SGX_PIXELSHADER_HEAP_SIZE (0x00500000-0x00001000)
-#define SGX_PDSVERTEX_CODEDATA_HEAP_BASE 0x0E800000
-#define SGX_PDSVERTEX_CODEDATA_HEAP_SIZE (0x00800000-0x00001000)
+#define SGX_VERTEXSHADER_HEAP_BASE 0x0FC00000
+#define SGX_VERTEXSHADER_HEAP_SIZE (0x00200000-0x00001000)
-#define SGX_KERNEL_CODE_HEAP_BASE 0x0F000000
-#define SGX_KERNEL_CODE_HEAP_SIZE 0x00080000
+#define SGX_CORE_IDENTIFIED
-#define SGX_VIDEO_CODE_HEAP_BASE 0x0F400000
-#define SGX_VIDEO_CODE_HEAP_SIZE 0x00080000
-
-#define SGX_KERNEL_VIDEO_DATA_HEAP_BASE 0x0F800000
-#define SGX_KERNEL_VIDEO_DATA_HEAP_SIZE (0x00400000-0x00001000)
-
-#define SGX_SYNCINFO_HEAP_BASE 0x0FC00000
-#define SGX_SYNCINFO_HEAP_SIZE (0x00400000-0x00001000)
+#if !defined(SGX_CORE_IDENTIFIED)
+#error "sgxconfig.h: ERROR: unspecified SGX Core version"
+#endif
#endif
enum SGX_CORE_ID_TYPE {
SGX_CORE_ID_INVALID = 0,
SGX_CORE_ID_530 = 2,
- SGX_UNUSED = 3,
+ SGX_CORE_ID_535 = 3,
};
struct SGX_CORE_INFO {
#ifndef _SGXDEFS_H_
#define _SGXDEFS_H_
+#ifndef SGX530
+#error unsupported SGX revision
+#endif
+
#include "sgx530defs.h"
#include "sgxerrata.h"
#include "sgxfeaturedefs.h"
#ifndef _SGXERRATA_KM_H_
#define _SGXERRATA_KM_H_
-#if SGX_CORE_REV == 103
-#else
-#if SGX_CORE_REV == 110
-#else
-#if SGX_CORE_REV == 111
-#else
-#if SGX_CORE_REV == 120
-#else
-#if SGX_CORE_REV == 121
-#else
-#if SGX_CORE_REV == 125
-
-#else
-#error "sgxerrata.h: SGX530 Core Revision unspecified"
-#endif
-#endif
-#endif
-#endif
-#endif
+#ifndef SGX530
+#error unsupported SGX version
#endif
#endif
*
******************************************************************************/
-#if defined(SGX530)
-#define SGX_CORE_FRIENDLY_NAME "SGX530"
-#define SGX_CORE_ID SGX_CORE_ID_530
-#define SGX_FEATURE_ADDRESS_SPACE_SIZE 28
-#define SGX_FEATURE_AUTOCLOCKGATING
-#else
-#error Unsupported SGX core
+#ifndef SGX530
+#error unsupported SGX version
#endif
+#define SGX_CORE_FRIENDLY_NAME "SGX530"
+#define SGX_CORE_ID SGX_CORE_ID_530
+#define SGX_FEATURE_ADDRESS_SPACE_SIZE 28
+#define SGX_FEATURE_AUTOCLOCKGATING
+#define SGX_FEATURE_MP_CORE_COUNT 1
+#define SUPPORT_SGX_PRIORITY_SCHEDULING
+
#include "img_types.h"
#include "sgxcoretypes.h"
#include "services.h"
#include "sgxapi_km.h"
+#define SGX_MP_CORE_SELECT(x, i) (x)
+
#define SGX_MAX_DEV_DATA 24
#define SGX_MAX_INIT_MEM_HANDLES 16
+#define SGX_BIF_DIR_LIST_INDEX_EDM 0
+
struct SGX_BRIDGE_INFO_FOR_SRVINIT {
struct IMG_DEV_PHYADDR sPDDevPAddr;
struct PVRSRV_HEAP_INFO asHeapInfo[PVRSRV_MAX_CLIENT_HEAPS];
void *hKernelCCBCtlMemInfo;
void *hKernelCCBEventKickerMemInfo;
void *hKernelSGXHostCtlMemInfo;
- u32 ui32TAKickAddress;
- u32 ui32VideoHandlerAddress;
+ void *hKernelSGXTA3DCtlMemInfo;
+ void *hKernelSGXMiscMemInfo;
+ u32 ui32HostKickAddress;
+ u32 ui32GetMiscInfoAddress;
void *hKernelHWPerfCBMemInfo;
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
+ void *hKernelEDMStatusBufferMemInfo;
+#endif
u32 ui32EDMTaskReg0;
u32 ui32EDMTaskReg1;
- u32 ui32ClkGateCtl;
- u32 ui32ClkGateCtl2;
+ u32 ui32ClkGateStatusReg;
u32 ui32ClkGateStatusMask;
u32 ui32CacheControl;
};
-struct PVRSRV_SGX_COMMAND {
+struct SGXMKIF_COMMAND {
u32 ui32ServiceAddress;
- u32 ui32Data[7];
+ u32 ui32Data[3];
};
struct PVRSRV_SGX_KERNEL_CCB {
- struct PVRSRV_SGX_COMMAND asCommands[256];
+ struct SGXMKIF_COMMAND asCommands[256];
};
struct PVRSRV_SGX_CCB_CTL {
#define SGX_AUXCCBFLAGS_SHARED 0x00000001
-enum PVRSRV_SGX_COMMAND_TYPE {
- PVRSRV_SGX_COMMAND_EDM_KICK = 0,
- PVRSRV_SGX_COMMAND_VIDEO_KICK = 1,
+enum SGXMKIF_COMMAND_TYPE {
+ SGXMKIF_COMMAND_EDM_KICK = 0,
+ SGXMKIF_COMMAND_VIDEO_KICK = 1,
+ SGXMKIF_COMMAND_REQUEST_SGXMISCINFO = 2,
- PVRSRV_SGX_COMMAND_FORCE_I32 = 0xFFFFFFFF,
+ SGXMKIF_COMMAND_FORCE_I32 = -1,
};
#define PVRSRV_CCBFLAGS_RASTERCMD 0x1
#define PVRSRV_CCBFLAGS_TRANSFERCMD 0x2
#define PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD 0x3
+#define PVRSRV_CCBFLAGS_POWERCMD 0x5
+
+#define PVRSRV_POWERCMD_POWEROFF 0x1
+#define PVRSRV_POWERCMD_IDLE 0x2
#define SGX_BIF_INVALIDATE_PTCACHE 0x1
#define SGX_BIF_INVALIDATE_PDCACHE 0x2
-struct PVR3DIF4_CCB_KICK {
- enum PVRSRV_SGX_COMMAND_TYPE eCommand;
- struct PVRSRV_SGX_COMMAND sCommand;
+struct SGXMKIF_HWDEVICE_SYNC_LIST {
+ struct IMG_DEV_VIRTADDR sAccessDevAddr;
+ u32 ui32NumSyncObjects;
+
+ struct PVRSRV_DEVICE_SYNC_OBJECT asSyncData[1];
+};
+
+struct SGX_DEVICE_SYNC_LIST {
+ struct SGXMKIF_HWDEVICE_SYNC_LIST *psHWDeviceSyncList;
+
+ void *hKernelHWSyncListMemInfo;
+ struct PVRSRV_CLIENT_MEM_INFO *psHWDeviceSyncListClientMemInfo;
+ struct PVRSRV_CLIENT_MEM_INFO *psAccessResourceClientMemInfo;
+
+ volatile u32 *pui32Lock;
+
+ struct SGX_DEVICE_SYNC_LIST *psNext;
+
+ u32 ui32NumSyncObjects;
+ void *ahSyncHandles[1];
+};
+
+struct SGX_INTERNEL_STATUS_UPDATE {
+ struct CTL_STATUS sCtlStatus;
+ void *hKernelMemInfo;
+ /* pdump specific - required? */
+ u32 ui32LastStatusUpdateDumpVal;
+};
+
+struct SGX_CCB_KICK {
+ enum SGXMKIF_COMMAND_TYPE eCommand;
+ struct SGXMKIF_COMMAND sCommand;
void *hCCBKernelMemInfo;
- void *hRenderSurfSyncInfo;
- u32 ui32NumTAStatusVals;
- void *ahTAStatusSyncInfo[SGX_MAX_TA_STATUS_VALS];
+ u32 ui32NumDstSyncObjects;
+ void *hKernelHWSyncListMemInfo;
+ void *sDstSyncHandle;
+ u32 ui32NumTAStatusVals;
u32 ui32Num3DStatusVals;
+
+ void *ahTAStatusSyncInfo[SGX_MAX_TA_STATUS_VALS];
void *ah3DStatusSyncInfo[SGX_MAX_3D_STATUS_VALS];
IMG_BOOL bFirstKickOrResume;
-#ifdef PDUMP
+#if (defined(NO_HARDWARE) || defined(PDUMP))
IMG_BOOL bTerminateOrAbort;
#endif
IMG_BOOL bKickRender;
#if defined(PDUMP)
u32 ui32CCBDumpWOff;
#endif
+#if defined(NO_HARDWARE)
+ u32 ui32WriteOpsPendingVal;
+#endif
};
-#define SGX_VIDEO_USE_CODE_BASE_INDEX 14
#define SGX_KERNEL_USE_CODE_BASE_INDEX 15
-struct PVRSRV_SGX_HOST_CTL {
+struct SGXMKIF_HOST_CTL {
- volatile u32 ui32PowManFlags;
+ u32 ui32PowerStatus;
u32 ui32uKernelDetectedLockups;
u32 ui32HostDetectedLockups;
u32 ui32HWRecoverySampleRate;
u32 ui32ResManFlags;
struct IMG_DEV_VIRTADDR sResManCleanupData;
- struct IMG_DEV_VIRTADDR sTAHWPBDesc;
- struct IMG_DEV_VIRTADDR s3DHWPBDesc;
- struct IMG_DEV_VIRTADDR sHostHWPBDesc;
-
u32 ui32NumActivePowerEvents;
u32 ui32HWPerfFlags;
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
+ /* !< See SGXMK_STATUS_BUFFER */
+ struct IMG_DEV_VIRTADDR sEDMStatusBuffer;
+#endif
+
+ /*< to count time wraps in the Timer task */
u32 ui32TimeWraps;
};
-struct PVR3DIF4_CLIENT_INFO {
+struct SGX_CLIENT_INFO {
u32 ui32ProcessID;
void *pvProcess;
struct PVRSRV_MISC_INFO sMiscInfo;
};
-struct PVR3DIF4_INTERNAL_DEVINFO {
+struct SGX_INTERNAL_DEVINFO {
u32 ui32Flags;
- void *hCtlKernelMemInfoHandle;
+ void *hHostCtlKernelMemInfoHandle;
IMG_BOOL bForcePTOff;
};
-struct PVRSRV_SGX_SHARED_CCB {
- struct PVRSRV_CLIENT_MEM_INFO *psCCBClientMemInfo;
- struct PVRSRV_CLIENT_MEM_INFO *psCCBCtlClientMemInfo;
- u32 *pui32CCBLinAddr;
- struct IMG_DEV_VIRTADDR sCCBDevAddr;
- u32 *pui32WriteOffset;
- volatile u32 *pui32ReadOffset;
- u32 ui32Size;
- u32 ui32AllocGran;
-
-#ifdef PDUMP
- u32 ui32CCBDumpWOff;
-#endif
-};
-
-struct PVRSRV_SGX_CCB {
- struct PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo;
- struct PVRSRV_KERNEL_MEM_INFO *psCCBCtlMemInfo;
- u32 *pui32CCBLinAddr;
- struct IMG_DEV_VIRTADDR sCCBDevAddr;
- u32 *pui32WriteOffset;
- volatile u32 *pui32ReadOffset;
- u32 ui32Size;
- u32 ui32AllocGran;
-
-#ifdef PDUMP
- u32 ui32CCBDumpWOff;
-#endif
-};
-
-struct CTL_STATUS {
- struct IMG_DEV_VIRTADDR sStatusDevAddr;
- u32 ui32StatusValue;
-};
-
#define SGXTQ_MAX_STATUS (SGX_MAX_TRANSFER_STATUS_VALS + 2)
-struct PVR3DIF4_CMDTA_SHARED {
+
+#define SGXMKIF_TQFLAGS_NOSYNCUPDATE 0x00000001
+#define SGXMKIF_TQFLAGS_KEEPPENDING 0x00000002
+#define SGXMKIF_TQFLAGS_TATQ_SYNC 0x00000004
+#define SGXMKIF_TQFLAGS_3DTQ_SYNC 0x00000008
+struct SGXMKIF_CMDTA_SHARED {
u32 ui32NumTAStatusVals;
u32 ui32Num3DStatusVals;
- u32 ui32WriteOpsPendingVal;
- struct IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr;
- u32 ui32ReadOpsPendingVal;
- struct IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr;
-
- u32 ui32TQSyncWriteOpsPendingVal;
- struct IMG_DEV_VIRTADDR sTQSyncWriteOpsCompleteDevVAddr;
- u32 ui32TQSyncReadOpsPendingVal;
- struct IMG_DEV_VIRTADDR sTQSyncReadOpsCompleteDevVAddr;
+ u32 ui32TATQSyncWriteOpsPendingVal;
+ struct IMG_DEV_VIRTADDR sTATQSyncWriteOpsCompleteDevVAddr;
+ u32 ui32TATQSyncReadOpsPendingVal;
+ struct IMG_DEV_VIRTADDR sTATQSyncReadOpsCompleteDevVAddr;
u32 ui323DTQSyncWriteOpsPendingVal;
struct IMG_DEV_VIRTADDR s3DTQSyncWriteOpsCompleteDevVAddr;
struct CTL_STATUS sCtlTAStatusInfo[SGX_MAX_TA_STATUS_VALS];
struct CTL_STATUS sCtl3DStatusInfo[SGX_MAX_3D_STATUS_VALS];
- struct PVRSRV_DEVICE_SYNC_OBJECT sTA3DDependancy;
+ struct PVRSRV_DEVICE_SYNC_OBJECT sTA3DDependency;
};
-struct PVR3DIF4_TRANSFERCMD_SHARED {
+struct SGXMKIF_TRANSFERCMD_SHARED {
u32 ui32SrcReadOpPendingVal;
struct IMG_DEV_VIRTADDR sSrcReadOpsCompleteDevAddr;
u32 ui32NumStatusVals;
struct CTL_STATUS sCtlStatusInfo[SGXTQ_MAX_STATUS];
-
- u32 ui32NumSrcSync;
- u32 ui32NumDstSync;
-
- struct IMG_DEV_VIRTADDR sSrcWriteOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS];
- struct IMG_DEV_VIRTADDR sSrcReadOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS];
-
- struct IMG_DEV_VIRTADDR sDstWriteOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS];
- struct IMG_DEV_VIRTADDR sDstReadOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS];
};
struct PVRSRV_TRANSFER_SGX_KICK {
u32 ui32NumDstSync;
void *ahDstSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS];
- u32 ui32StatusFirstSync;
+ u32 ui32Flags;
+ u32 ui32PDumpFlags;
#if defined(PDUMP)
u32 ui32CCBDumpWOff;
#endif
u32 ui32Marker[2];
};
+#define SGXMKIF_HWPERF_CB_SIZE 0x100
+
+struct SGXMKIF_HWPERF_CB_ENTRY {
+ u32 ui32FrameNo;
+ u32 ui32Type;
+ u32 ui32Ordinal;
+ u32 ui32TimeWraps;
+ u32 ui32Time;
+ u32 ui32Counters[PVRSRV_SGX_HWPERF_NUM_COUNTERS];
+};
+
+struct SGXMKIF_HWPERF_CB {
+ u32 ui32Woff;
+ u32 ui32Roff;
+ u32 ui32OrdinalGRAPHICS;
+ u32 ui32OrdinalMK_EXECUTION;
+ struct SGXMKIF_HWPERF_CB_ENTRY psHWPerfCBData[SGXMKIF_HWPERF_CB_SIZE];
+};
+
+struct PVRSRV_SGX_MISCINFO_INFO {
+ u32 ui32MiscInfoFlags;
+ struct PVRSRV_SGX_MISCINFO_FEATURES sSGXFeatures;
+};
+
#endif
#ifndef __SGXINFOKM_H__
#define __SGXINFOKM_H__
+#include <linux/workqueue.h>
#include "sgxdefs.h"
#include "device.h"
#include "sysconfig.h"
#define SGX_HOSTPORT_PRESENT 0x00000001UL
-#define PVRSRV_USSE_EDM_POWMAN_IDLE_REQUEST (1UL << 0)
-#define PVRSRV_USSE_EDM_POWMAN_POWEROFF_REQUEST (1UL << 1)
#define PVRSRV_USSE_EDM_POWMAN_IDLE_COMPLETE (1UL << 2)
#define PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE (1UL << 3)
#define PVRSRV_USSE_EDM_POWMAN_POWEROFF_RESTART_IMMEDIATE (1UL << 4)
#define PVRSRV_USSE_EDM_INTERRUPT_HWR (1UL << 0)
#define PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER (1UL << 1)
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_RT_REQUEST 0x01UL
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_RC_REQUEST 0x02UL
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_TC_REQUEST 0x04UL
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_2DC_REQUEST 0x08UL
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE 0x10UL
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD 0x20UL
-#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT 0x40UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_RT_REQUEST 0x01UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_RC_REQUEST 0x02UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_TC_REQUEST 0x04UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_2DC_REQUEST 0x08UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_SHAREDPBDESC 0x10UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD 0x20UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT 0x40UL
+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE 0x80UL
+
+#define PVRSRV_USSE_MISCINFO_READY 0x1UL
struct PVRSRV_SGX_CCB_INFO;
struct PVRSRV_SGX_CCB_CTL *psKernelCCBCtl;
struct PVRSRV_KERNEL_MEM_INFO *psKernelCCBEventKickerMemInfo;
u32 *pui32KernelCCBEventKicker;
- u32 ui32TAKickAddress;
- u32 ui32TexLoadKickAddress;
- u32 ui32VideoHandlerAddress;
+ struct PVRSRV_KERNEL_MEM_INFO *psKernelSGXMiscMemInfo;
+ u32 ui32HostKickAddress;
+ u32 ui32GetMiscInfoAddress;
u32 ui32KickTACounter;
u32 ui32KickTARenderCounter;
struct PVRSRV_KERNEL_MEM_INFO *psKernelHWPerfCBMemInfo;
struct PVRSRV_SGXDEV_DIFF_INFO sDiffInfo;
u32 ui32HWGroupRequested;
u32 ui32HWReset;
+#ifdef PVRSRV_USSE_EDM_STATUS_DEBUG
+ /*!< Meminfo for EDM status buffer */
+ struct PVRSRV_KERNEL_MEM_INFO *psKernelEDMStatusBufferMemInfo;
+#endif
u32 ui32ClientRefCount;
u32 ui32EDMTaskReg0;
u32 ui32EDMTaskReg1;
- u32 ui32ClkGateCtl;
- u32 ui32ClkGateCtl2;
+ u32 ui32ClkGateStatusReg;
u32 ui32ClkGateStatusMask;
struct SGX_INIT_SCRIPTS sScripts;
u32 ui32NumResets;
struct PVRSRV_KERNEL_MEM_INFO *psKernelSGXHostCtlMemInfo;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl;
+
+ struct PVRSRV_KERNEL_MEM_INFO *psKernelSGXTA3DCtlMemInfo;
u32 ui32Flags;
void __iomem *pvRegsCpuVBase;
u32 ui32RegsSize;
- struct IMG_SYS_PHYADDR sSPSysPBase;
- struct IMG_CPU_PHYADDR sSPCpuPBase;
- void *pvSPCpuVBase;
- u32 ui32SPSize;
-
struct IMG_SYS_PHYADDR sLocalMemSysPBase;
struct IMG_DEV_PHYADDR sLocalMemDevPBase;
struct IMG_CPU_PHYADDR sLocalMemCpuPBase;
struct PVRSRV_SGX_CCB_INFO {
struct PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo;
struct PVRSRV_KERNEL_MEM_INFO *psCCBCtlMemInfo;
- struct PVRSRV_SGX_COMMAND *psCommands;
+ struct SGXMKIF_COMMAND *psCommands;
u32 *pui32WriteOffset;
volatile u32 *pui32ReadOffset;
#if defined(PDUMP)
#endif
};
+struct timer_work_data {
+ struct PVRSRV_DEVICE_NODE *psDeviceNode;
+ struct delayed_work work;
+ struct workqueue_struct *work_queue;
+ unsigned int interval;
+ bool armed;
+};
+
enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode);
-void SysGetSGXTimingInformation(struct SGX_TIMING_INFORMATION *psSGXTimingInfo);
+enum PVRSRV_ERROR SGXOSTimerEnable(struct timer_work_data *data);
+enum PVRSRV_ERROR SGXOSTimerCancel(struct timer_work_data *data);
+struct timer_work_data *
+SGXOSTimerInit(struct PVRSRV_DEVICE_NODE *psDeviceNode);
+void SGXOSTimerDeInit(struct timer_work_data *data);
+
+void HWRecoveryResetSGX(struct PVRSRV_DEVICE_NODE *psDeviceNode,
+ u32 ui32Component, u32 ui32CallerID);
void SGXReset(struct PVRSRV_SGXDEV_INFO *psDevInfo, u32 ui32PDUMPFlags);
+enum PVRSRV_ERROR SGXInitialise(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ IMG_BOOL bHardwareRecovery);
+enum PVRSRV_ERROR SGXDeinitialise(void *hDevCookie);
+
+void SGXStartTimer(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ IMG_BOOL bStartOSTimer);
+
+enum PVRSRV_ERROR SGXPrePowerStateExt(void *hDevHandle,
+ enum PVR_POWER_STATE eNewPowerState,
+ enum PVR_POWER_STATE eCurrentPowerState);
+
+enum PVRSRV_ERROR SGXPostPowerStateExt(void *hDevHandle,
+ enum PVR_POWER_STATE eNewPowerState,
+ enum PVR_POWER_STATE eCurrentPowerState);
+
+enum PVRSRV_ERROR SGXPreClockSpeedChange(void *hDevHandle,
+ IMG_BOOL bIdleDevice,
+ enum PVR_POWER_STATE
+ eCurrentPowerState);
+
+enum PVRSRV_ERROR SGXPostClockSpeedChange(void *hDevHandle,
+ IMG_BOOL bIdleDevice,
+ enum PVR_POWER_STATE
+ eCurrentPowerState);
+
+enum PVRSRV_ERROR SGXDevInitCompatCheck(struct PVRSRV_DEVICE_NODE
+ *psDeviceNode);
+
+void SysGetSGXTimingInformation(struct SGX_TIMING_INFORMATION *psSGXTimingInfo);
+
+#if defined(NO_HARDWARE)
+static inline void NoHardwareGenerateEvent(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ u32 ui32StatusRegister,
+ u32 ui32StatusValue,
+ u32 ui32StatusMask)
+{
+ u32 ui32RegVal;
+
+ ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, ui32StatusRegister);
+
+ ui32RegVal &= ~ui32StatusMask;
+ ui32RegVal |= (ui32StatusValue & ui32StatusMask);
+
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32StatusRegister, ui32RegVal);
+}
+#endif
+
#endif
******************************************************************************/
#include <stddef.h>
-#include <linux/spinlock.h>
+
#include <linux/workqueue.h>
-#include <linux/slab.h>
+#include <linux/io.h>
#include "sgxdefs.h"
#include "sgxmmu.h"
#include "perproc.h"
#include "sgxutils.h"
+#include "pvrversion.h"
+#include "sgx_options.h"
static IMG_BOOL SGX_ISRHandler(void *pvData);
static u32 gui32EventStatusServicesByISR;
-static enum PVRSRV_ERROR SGXInitialise(struct PVRSRV_SGXDEV_INFO *psDevInfo,
- IMG_BOOL bHardwareRecovery);
-static enum PVRSRV_ERROR SGXDeinitialise(void *hDevCookie);
-
-struct timer_work_data {
- struct PVRSRV_DEVICE_NODE *psDeviceNode;
- struct delayed_work work;
- struct workqueue_struct *work_queue;
- unsigned int interval;
- bool armed;
-};
-
-static enum PVRSRV_ERROR SGXOSTimerEnable(struct timer_work_data *data);
-static enum PVRSRV_ERROR SGXOSTimerCancel(struct timer_work_data *data);
-static struct timer_work_data *
-SGXOSTimerInit(struct PVRSRV_DEVICE_NODE *psDeviceNode);
-static void SGXOSTimerDeInit(struct timer_work_data *data);
-
-enum PVR_DEVICE_POWER_STATE {
- PVR_DEVICE_POWER_STATE_ON = 0,
- PVR_DEVICE_POWER_STATE_IDLE = 1,
- PVR_DEVICE_POWER_STATE_OFF = 2,
-
- PVR_DEVICE_POWER_STATE_FORCE_I32 = 0x7fffffff
-};
-
-static enum PVR_DEVICE_POWER_STATE MapDevicePowerState(enum PVR_POWER_STATE
- ePowerState)
-{
- enum PVR_DEVICE_POWER_STATE eDevicePowerState;
-
- switch (ePowerState) {
- case PVRSRV_POWER_STATE_D0:
- {
- eDevicePowerState = PVR_DEVICE_POWER_STATE_ON;
- break;
- }
- case PVRSRV_POWER_STATE_D3:
- {
- eDevicePowerState = PVR_DEVICE_POWER_STATE_OFF;
- break;
- }
- default:
- {
- PVR_DPF(PVR_DBG_ERROR,
- "MapDevicePowerState: Invalid state: %ld",
- ePowerState);
- eDevicePowerState = PVR_DEVICE_POWER_STATE_FORCE_I32;
- PVR_ASSERT(eDevicePowerState !=
- PVR_DEVICE_POWER_STATE_FORCE_I32);
- }
- }
-
- return eDevicePowerState;
-}
+static enum PVRSRV_ERROR SGXGetBuildInfoKM(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ struct PVRSRV_DEVICE_NODE *psDeviceNode);
static void SGXCommandComplete(struct PVRSRV_DEVICE_NODE *psDeviceNode)
{
- SGXScheduleProcessQueues(psDeviceNode);
+ if (OSInLISR(psDeviceNode->psSysData))
+ psDeviceNode->bReProcessDeviceCommandComplete = IMG_TRUE;
+ else
+ SGXScheduleProcessQueuesKM(psDeviceNode);
}
static u32 DeinitDevInfo(struct PVRSRV_SGXDEV_INFO *psDevInfo)
(struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelCCBMemInfo;
psDevInfo->psKernelCCB =
(struct PVRSRV_SGX_KERNEL_CCB *)psDevInfo->psKernelCCBMemInfo->
- pvLinAddrKM;
+ pvLinAddrKM;
psDevInfo->psKernelCCBCtlMemInfo =
(struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelCCBCtlMemInfo;
psDevInfo->psKernelCCBCtl =
(struct PVRSRV_SGX_CCB_CTL *)psDevInfo->psKernelCCBCtlMemInfo->
- pvLinAddrKM;
+ pvLinAddrKM;
psDevInfo->psKernelCCBEventKickerMemInfo =
(struct PVRSRV_KERNEL_MEM_INFO *)
- psInitInfo->hKernelCCBEventKickerMemInfo;
+ psInitInfo->hKernelCCBEventKickerMemInfo;
psDevInfo->pui32KernelCCBEventKicker =
- (u32 *) psDevInfo->psKernelCCBEventKickerMemInfo->pvLinAddrKM;
+ (u32 *)psDevInfo->psKernelCCBEventKickerMemInfo->pvLinAddrKM;
psDevInfo->psKernelSGXHostCtlMemInfo =
- (struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelSGXHostCtlMemInfo;
- psDevInfo->psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)psDevInfo->psKernelSGXHostCtlMemInfo->
- pvLinAddrKM;
+ (struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->
+ hKernelSGXHostCtlMemInfo;
+ psDevInfo->psSGXHostCtl = (struct SGXMKIF_HOST_CTL __force __iomem *)
+ psDevInfo->psKernelSGXHostCtlMemInfo->pvLinAddrKM;
+
+ psDevInfo->psKernelSGXTA3DCtlMemInfo =
+ (struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->
+ hKernelSGXTA3DCtlMemInfo;
+
+ psDevInfo->psKernelSGXMiscMemInfo =
+ (struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelSGXMiscMemInfo;
psDevInfo->psKernelHWPerfCBMemInfo =
(struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelHWPerfCBMemInfo;
+#ifdef PVRSRV_USSE_EDM_STATUS_DEBUG
+ psDevInfo->psKernelEDMStatusBufferMemInfo =
+ (struct PVRSRV_KERNEL_MEM_INFO *)psInitInfo->
+ hKernelEDMStatusBufferMemInfo;
+#endif
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct PVRSRV_SGX_CCB_INFO),
psKernelCCBInfo->psCCBCtlMemInfo = psDevInfo->psKernelCCBCtlMemInfo;
psKernelCCBInfo->psCommands = psDevInfo->psKernelCCB->asCommands;
psKernelCCBInfo->pui32WriteOffset =
- &psDevInfo->psKernelCCBCtl->ui32WriteOffset;
+ &psDevInfo->psKernelCCBCtl->ui32WriteOffset;
psKernelCCBInfo->pui32ReadOffset =
- &psDevInfo->psKernelCCBCtl->ui32ReadOffset;
+ &psDevInfo->psKernelCCBCtl->ui32ReadOffset;
psDevInfo->psKernelCCBInfo = psKernelCCBInfo;
- psDevInfo->ui32TAKickAddress = psInitInfo->ui32TAKickAddress;
+ psDevInfo->ui32HostKickAddress = psInitInfo->ui32HostKickAddress;
- psDevInfo->ui32VideoHandlerAddress =
- psInitInfo->ui32VideoHandlerAddress;
+ psDevInfo->ui32GetMiscInfoAddress = psInitInfo->ui32GetMiscInfoAddress;
psDevInfo->bForcePTOff = IMG_FALSE;
psDevInfo->ui32EDMTaskReg0 = psInitInfo->ui32EDMTaskReg0;
psDevInfo->ui32EDMTaskReg1 = psInitInfo->ui32EDMTaskReg1;
- psDevInfo->ui32ClkGateCtl = psInitInfo->ui32ClkGateCtl;
- psDevInfo->ui32ClkGateCtl2 = psInitInfo->ui32ClkGateCtl2;
+ psDevInfo->ui32ClkGateStatusReg = psInitInfo->ui32ClkGateStatusReg;
psDevInfo->ui32ClkGateStatusMask = psInitInfo->ui32ClkGateStatusMask;
OSMemCopy(&psDevInfo->asSGXDevData, &psInitInfo->asInitDevData,
return eError;
}
-static void SGXGetTimingInfo(struct PVRSRV_DEVICE_NODE *psDeviceNode)
-{
- struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
- struct SGX_TIMING_INFORMATION sSGXTimingInfo = { 0 };
- u32 ui32ActivePowManSampleRate;
- struct timer_work_data *data = psDevInfo->hTimer;
- enum PVRSRV_ERROR eError;
-
- SysGetSGXTimingInformation(&sSGXTimingInfo);
-
- if (data) {
- BUG_ON(data->armed);
- /*
- * The magic calculation below sets the hardware lock-up
- * detection and recovery timer interval to ~150msecs.
- * The interval length will be scaled based on the SGX
- * functional clock frequency. The higher the frequency
- * the shorter the interval and vice versa.
- */
- data->interval = 150 * SYS_SGX_PDS_TIMER_FREQ /
- sSGXTimingInfo.ui32uKernelFreq;
- }
-
- psDevInfo->psSGXHostCtl->ui32HWRecoverySampleRate =
- sSGXTimingInfo.ui32uKernelFreq /
- sSGXTimingInfo.ui32HWRecoveryFreq;
-
- psDevInfo->ui32CoreClockSpeed = sSGXTimingInfo.ui32CoreClockSpeed;
- psDevInfo->ui32uKernelTimerClock =
- sSGXTimingInfo.ui32CoreClockSpeed /
- sSGXTimingInfo.ui32uKernelFreq;
-
- ui32ActivePowManSampleRate =
- sSGXTimingInfo.ui32uKernelFreq *
- sSGXTimingInfo.ui32ActivePowManLatencyms / 1000;
- ui32ActivePowManSampleRate += 1;
- psDevInfo->psSGXHostCtl->ui32ActivePowManSampleRate =
- ui32ActivePowManSampleRate;
-}
-
-static void SGXStartTimer(struct PVRSRV_SGXDEV_INFO *psDevInfo,
- IMG_BOOL bStartOSTimer)
-{
- u32 ui32RegVal;
-
-
- ui32RegVal =
- EUR_CR_EVENT_TIMER_ENABLE_MASK | psDevInfo->ui32uKernelTimerClock;
- OSWriteHWReg((void __iomem *)psDevInfo->pvRegsBaseKM,
- EUR_CR_EVENT_TIMER, ui32RegVal);
- PDUMPREGWITHFLAGS(EUR_CR_EVENT_TIMER, ui32RegVal,
- PDUMP_FLAGS_CONTINUOUS);
-
- if (bStartOSTimer) {
- enum PVRSRV_ERROR eError;
- eError = SGXOSTimerEnable(psDevInfo->hTimer);
- if (eError != PVRSRV_OK)
- PVR_DPF(PVR_DBG_ERROR, "SGXStartTimer : "
- "Failed to enable host timer");
- }
-}
-
-static enum PVRSRV_ERROR SGXPrePowerState(void *hDevHandle,
- enum PVR_DEVICE_POWER_STATE eNewPowerState,
- enum PVR_DEVICE_POWER_STATE eCurrentPowerState)
-{
- if ((eNewPowerState != eCurrentPowerState) &&
- (eNewPowerState != PVR_DEVICE_POWER_STATE_ON)) {
- enum PVRSRV_ERROR eError;
- struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
- struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- psDevInfo->psSGXHostCtl;
- u32 ui32PowManRequest, ui32PowManComplete;
-
- eError = SGXOSTimerCancel(psDevInfo->hTimer);
- if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "SGXPrePowerState: Failed to disable timer");
- return eError;
- }
-
- if (eNewPowerState == PVR_DEVICE_POWER_STATE_OFF) {
- ui32PowManRequest =
- PVRSRV_USSE_EDM_POWMAN_POWEROFF_REQUEST;
- ui32PowManComplete =
- PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE;
- PDUMPCOMMENT
- ("TA/3D CCB Control - SGX power off request");
- } else {
- ui32PowManRequest = PVRSRV_USSE_EDM_POWMAN_IDLE_REQUEST;
- ui32PowManComplete =
- PVRSRV_USSE_EDM_POWMAN_IDLE_COMPLETE;
- PDUMPCOMMENT("TA/3D CCB Control - SGX idle request");
- }
-
- psSGXHostCtl->ui32PowManFlags |= ui32PowManRequest;
-#if defined(PDUMP)
- PDUMPMEM(NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL, ui32PowManFlags),
- sizeof(u32), PDUMP_FLAGS_CONTINUOUS,
- MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
-#endif
-
- if (PollForValueKM(&psSGXHostCtl->ui32PowManFlags,
- ui32PowManComplete,
- ui32PowManComplete,
- MAX_HW_TIME_US / WAIT_TRY_COUNT,
- WAIT_TRY_COUNT) != PVRSRV_OK)
- PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: "
- "Wait for SGX ukernel power transition failed.");
-
-#if defined(PDUMP)
- PDUMPCOMMENT
- ("TA/3D CCB Control - Wait for power event on uKernel.");
- PDUMPMEMPOL(psDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL,
- ui32PowManFlags),
- ui32PowManComplete, ui32PowManComplete,
- PDUMP_POLL_OPERATOR_EQUAL, IMG_FALSE, IMG_FALSE,
- MAKEUNIQUETAG(psDevInfo->
- psKernelSGXHostCtlMemInfo));
-#endif
- {
- if (PollForValueKM(
- (u32 __force *)psDevInfo->pvRegsBaseKM +
- (EUR_CR_CLKGATESTATUS >> 2), 0,
- psDevInfo->ui32ClkGateStatusMask,
- MAX_HW_TIME_US / WAIT_TRY_COUNT,
- WAIT_TRY_COUNT) != PVRSRV_OK)
- PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: "
- "Wait for SGX clock gating failed.");
-
- PDUMPCOMMENT("Wait for SGX clock gating.");
- PDUMPREGPOL(EUR_CR_CLKGATESTATUS, 0,
- psDevInfo->ui32ClkGateStatusMask);
- }
-
- if (eNewPowerState == PVR_DEVICE_POWER_STATE_OFF) {
- eError = SGXDeinitialise(psDevInfo);
- if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: "
- "SGXDeinitialise failed: %lu", eError);
- return eError;
- }
- }
- }
-
- return PVRSRV_OK;
-}
-
-static enum PVRSRV_ERROR SGXPostPowerState(void *hDevHandle,
- enum PVR_DEVICE_POWER_STATE eNewPowerState,
- enum PVR_DEVICE_POWER_STATE eCurrentPowerState)
-{
- if ((eNewPowerState != eCurrentPowerState) &&
- (eCurrentPowerState != PVR_DEVICE_POWER_STATE_ON)) {
- enum PVRSRV_ERROR eError;
- struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
- struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- psDevInfo->psSGXHostCtl;
-
- psSGXHostCtl->ui32PowManFlags = 0;
- PDUMPCOMMENT("TA/3D CCB Control - Reset Power Manager flags");
-#if defined(PDUMP)
- PDUMPMEM(NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL, ui32PowManFlags),
- sizeof(u32), PDUMP_FLAGS_CONTINUOUS,
- MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
-#endif
-
- if (eCurrentPowerState == PVR_DEVICE_POWER_STATE_OFF) {
-
- SGXGetTimingInfo(psDeviceNode);
-
- eError = SGXInitialise(psDevInfo, IMG_FALSE);
- if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "SGXPostPowerState: "
- "SGXInitialise failed");
- return eError;
- }
- }
- }
-
- return PVRSRV_OK;
-}
-
-static enum PVRSRV_ERROR SGXPrePowerStateExt(void *hDevHandle,
- enum PVR_POWER_STATE eNewPowerState,
- enum PVR_POWER_STATE eCurrentPowerState)
-{
- enum PVR_DEVICE_POWER_STATE eNewDevicePowerState =
- MapDevicePowerState(eNewPowerState);
- enum PVR_DEVICE_POWER_STATE eCurrentDevicePowerState =
- MapDevicePowerState(eCurrentPowerState);
-
- return SGXPrePowerState(hDevHandle, eNewDevicePowerState,
- eCurrentDevicePowerState);
-}
-
-static enum PVRSRV_ERROR SGXPostPowerStateExt(void *hDevHandle,
- enum PVR_POWER_STATE eNewPowerState,
- enum PVR_POWER_STATE eCurrentPowerState)
-{
- enum PVRSRV_ERROR eError;
- enum PVR_DEVICE_POWER_STATE eNewDevicePowerState =
- MapDevicePowerState(eNewPowerState);
- enum PVR_DEVICE_POWER_STATE eCurrentDevicePowerState =
- MapDevicePowerState(eCurrentPowerState);
-
- eError =
- SGXPostPowerState(hDevHandle, eNewDevicePowerState,
- eCurrentDevicePowerState);
- if (eError != PVRSRV_OK)
- return eError;
-
- PVR_DPF(PVR_DBG_WARNING,
- "SGXPostPowerState : SGX Power Transition from %d to %d OK",
- eCurrentPowerState, eNewPowerState);
-
- return eError;
-}
-
-static enum PVRSRV_ERROR SGXPreClockSpeedChange(void *hDevHandle,
- IMG_BOOL bIdleDevice,
- enum PVR_POWER_STATE eCurrentPowerState)
-{
- enum PVRSRV_ERROR eError;
- struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
- struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
-
- PVR_UNREFERENCED_PARAMETER(psDevInfo);
-
- if (eCurrentPowerState == PVRSRV_POWER_STATE_D0)
- if (bIdleDevice) {
- eError =
- SGXPrePowerState(hDevHandle,
- PVR_DEVICE_POWER_STATE_IDLE,
- PVR_DEVICE_POWER_STATE_ON);
-
- if (eError != PVRSRV_OK)
- return eError;
- }
-
- PVR_DPF(PVR_DBG_MESSAGE,
- "SGXPreClockSpeedChange: SGX clock speed was %luHz",
- psDevInfo->ui32CoreClockSpeed);
-
- return PVRSRV_OK;
-}
-
-static enum PVRSRV_ERROR SGXPostClockSpeedChange(void *hDevHandle,
- IMG_BOOL bIdleDevice,
- enum PVR_POWER_STATE eCurrentPowerState)
-{
- enum PVRSRV_ERROR eError = PVRSRV_OK;
- struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
- struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
- u32 ui32OldClockSpeed = psDevInfo->ui32CoreClockSpeed;
-
- PVR_UNREFERENCED_PARAMETER(ui32OldClockSpeed);
-
- if (eCurrentPowerState == PVRSRV_POWER_STATE_D0) {
- SGXGetTimingInfo(psDeviceNode);
- if (bIdleDevice) {
- eError =
- SGXPostPowerState(hDevHandle,
- PVR_DEVICE_POWER_STATE_ON,
- PVR_DEVICE_POWER_STATE_IDLE);
-
- if (eError != PVRSRV_OK)
- return eError;
- }
- SGXStartTimer(psDevInfo, IMG_TRUE);
- }
-
- PVR_DPF(PVR_DBG_MESSAGE, "SGXPostClockSpeedChange: "
- "SGX clock speed changed from %luHz to %luHz",
- ui32OldClockSpeed, psDevInfo->ui32CoreClockSpeed);
-
- return PVRSRV_OK;
-}
-
static enum PVRSRV_ERROR SGXRunScript(struct PVRSRV_SGXDEV_INFO *psDevInfo,
union SGX_INIT_COMMAND *psScript,
u32 ui32NumInitCommands)
switch (psComm->eOp) {
case SGX_INIT_OP_WRITE_HW_REG:
{
- OSWriteHWReg((void __iomem *)
- psDevInfo->pvRegsBaseKM,
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM,
psComm->sWriteHWReg.ui32Offset,
psComm->sWriteHWReg.ui32Value);
PDUMPREG(psComm->sWriteHWReg.ui32Offset,
}
- return PVRSRV_ERROR_GENERIC;;
+ return PVRSRV_ERROR_GENERIC;
}
-static enum PVRSRV_ERROR SGXInitialise(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+enum PVRSRV_ERROR SGXInitialise(struct PVRSRV_SGXDEV_INFO *psDevInfo,
IMG_BOOL bHardwareRecovery)
{
enum PVRSRV_ERROR eError;
- u32 ui32ReadOffset, ui32WriteOffset;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_CLKGATECTL,
- psDevInfo->ui32ClkGateCtl);
- PDUMPREGWITHFLAGS(EUR_CR_CLKGATECTL, psDevInfo->ui32ClkGateCtl,
- PDUMP_FLAGS_CONTINUOUS);
+ PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS,
+ "SGX initialisation script part 1\n");
+ eError =
+ SGXRunScript(psDevInfo, psDevInfo->sScripts.asInitCommandsPart1,
+ SGX_MAX_INIT_COMMANDS);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXInitialise: SGXRunScript (part 1) failed (%d)",
+ eError);
+ return PVRSRV_ERROR_GENERIC;
+ }
+ PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS,
+ "End of SGX initialisation script part 1\n");
SGXReset(psDevInfo, PDUMP_FLAGS_CONTINUOUS);
MAKEUNIQUETAG(psDevInfo->psKernelCCBEventKickerMemInfo));
#endif
- psDevInfo->psSGXHostCtl->sTAHWPBDesc.uiAddr = 0;
- psDevInfo->psSGXHostCtl->s3DHWPBDesc.uiAddr = 0;
-#if defined(PDUMP)
- PDUMPCOMMENT(" CCB Control - Reset HW PBDesc records");
- PDUMPMEM(NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL, sTAHWPBDesc),
- sizeof(struct IMG_DEV_VIRTADDR), PDUMP_FLAGS_CONTINUOUS,
- MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
- PDUMPMEM(NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL, s3DHWPBDesc),
- sizeof(struct IMG_DEV_VIRTADDR), PDUMP_FLAGS_CONTINUOUS,
- MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
-#endif
-
+ PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS,
+ "SGX initialisation script part 2\n");
eError =
- SGXRunScript(psDevInfo, psDevInfo->sScripts.asInitCommands,
+ SGXRunScript(psDevInfo, psDevInfo->sScripts.asInitCommandsPart2,
SGX_MAX_INIT_COMMANDS);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "SGXInitialise: SGXRunScript failed (%d)", eError);
+ "SGXInitialise: SGXRunScript (part 2) failed (%d)",
+ eError);
return PVRSRV_ERROR_GENERIC;
}
+ PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS,
+ "End of SGX initialisation script part 2\n");
- SGXStartTimer(psDevInfo, !bHardwareRecovery);
+ SGXStartTimer(psDevInfo, (IMG_BOOL)!bHardwareRecovery);
if (bHardwareRecovery) {
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ psDevInfo->psSGXHostCtl;
- if (PollForValueKM((volatile u32 *)
- (&psSGXHostCtl->ui32InterruptClearFlags), 0,
+ if (PollForValueKM(&psSGXHostCtl->ui32InterruptClearFlags, 0,
PVRSRV_USSE_EDM_INTERRUPT_HWR,
MAX_HW_TIME_US / WAIT_TRY_COUNT, 1000) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "SGXInitialise: "
"Wait for uKernel HW Recovery failed");
+ PVR_DBG_BREAK;
return PVRSRV_ERROR_RETRY;
}
}
- for (ui32ReadOffset = psDevInfo->psKernelCCBCtl->ui32ReadOffset,
- ui32WriteOffset = psDevInfo->psKernelCCBCtl->ui32WriteOffset;
- ui32ReadOffset != ui32WriteOffset;
- ui32ReadOffset = (ui32ReadOffset + 1) & 0xFF) {
- *psDevInfo->pui32KernelCCBEventKicker =
- (*psDevInfo->pui32KernelCCBEventKicker + 1) & 0xFF;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_KICK,
- EUR_CR_EVENT_KICK_NOW_MASK);
- }
+ PVR_ASSERT(psDevInfo->psKernelCCBCtl->ui32ReadOffset ==
+ psDevInfo->psKernelCCBCtl->ui32WriteOffset);
return PVRSRV_OK;
}
-static enum PVRSRV_ERROR SGXDeinitialise(void *hDevCookie)
+enum PVRSRV_ERROR SGXDeinitialise(void *hDevCookie)
{
struct PVRSRV_SGXDEV_INFO *psDevInfo = (struct PVRSRV_SGXDEV_INFO *)
hDevCookie;
pvDeviceNode;
struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap =
psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap;
- void *hDevInfoOSMemHandle = (void *) NULL;
enum PVRSRV_ERROR eError;
PDUMPCOMMENT("SGX Initialisation Part 1");
PDUMPCOMMENT("SGX Core Version Information: %s",
SGX_CORE_FRIENDLY_NAME);
-#ifdef SGX_CORE_REV
- PDUMPCOMMENT("SGX Core Revision Information: %d", SGX_CORE_REV);
-#else
- PDUMPCOMMENT("SGX Core Revision Information: head rtl");
-#endif
+ PDUMPCOMMENT("SGX Core Revision Information: multi rev support");
- if (OSAllocPages
- (PVRSRV_OS_PAGEABLE_HEAP | PVRSRV_HAP_MULTI_PROCESS |
- PVRSRV_HAP_CACHED, sizeof(struct PVRSRV_SGXDEV_INFO),
- (void **) &psDevInfo, &hDevInfoOSMemHandle) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "DevInitSGXPart1 : "
- "Failed to alloc memory for DevInfo");
+ if (OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_SGXDEV_INFO),
+ (void **)&psDevInfo, NULL) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "DevInitSGXPart1 : Failed to alloc memory for DevInfo");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psDevInfo, 0, sizeof(struct PVRSRV_SGXDEV_INFO));
psDevInfo->eDeviceClass = DEV_DEVICE_CLASS;
psDeviceNode->pvDevice = (void *) psDevInfo;
- psDeviceNode->hDeviceOSMemHandle = hDevInfoOSMemHandle;
psDevInfo->pvDeviceMemoryHeap = (void *) psDeviceMemoryHeap;
enum PVRSRV_ERROR eError;
struct SGX_DEVICE_MAP *psSGXDeviceMap;
enum PVR_POWER_STATE eDefaultPowerState;
+ u32 l;
PDUMPCOMMENT("SGX Initialisation Part 2");
eError = InitDevInfo(psPerProc, psDeviceNode, psInitInfo);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "DevInitSGXPart2KM: Failed to load EDM program");
+ PVR_DPF(PVR_DBG_ERROR, "DevInitSGXPart2KM: "
+ "Failed to load EDM program");
goto failed_init_dev_info;
}
if (psSGXDeviceMap->pvRegsCpuVBase) {
psDevInfo->pvRegsBaseKM = psSGXDeviceMap->pvRegsCpuVBase;
} else {
-
psDevInfo->pvRegsBaseKM =
OSMapPhysToLin(psSGXDeviceMap->sRegsCpuPBase,
psSGXDeviceMap->ui32RegsSize,
psDevInfo->ui32RegSize = psSGXDeviceMap->ui32RegsSize;
psDevInfo->sRegsPhysBase = psSGXDeviceMap->sRegsSysPBase;
-
-
psDeviceNode->pvISRData = psDeviceNode;
PVR_ASSERT(psDeviceNode->pfnDeviceISR == SGX_ISRHandler);
-
-
- psDevInfo->psSGXHostCtl->ui32PowManFlags |=
- PVRSRV_USSE_EDM_POWMAN_NO_WORK;
+ l = readl(&psDevInfo->psSGXHostCtl->ui32PowerStatus);
+ l |= PVRSRV_USSE_EDM_POWMAN_NO_WORK;
+ writel(l, &psDevInfo->psSGXHostCtl->ui32PowerStatus);
eDefaultPowerState = PVRSRV_POWER_STATE_D3;
+
eError = PVRSRVRegisterPowerDevice(psDeviceNode->sDevId.ui32DeviceIndex,
SGXPrePowerStateExt,
SGXPostPowerStateExt,
eDefaultPowerState);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "DevInitSGXPart2KM: "
- "failed to register device with power manager");
+ "failed to register device with power manager");
return eError;
}
sizeof(struct PVRSRV_SGX_CCB_CTL));
OSMemSet(psDevInfo->pui32KernelCCBEventKicker, 0,
sizeof(*psDevInfo->pui32KernelCCBEventKicker));
- PDUMPCOMMENT("Kernel CCB");
+ PDUMPCOMMENT("Initialise Kernel CCB");
PDUMPMEM(NULL, psDevInfo->psKernelCCBMemInfo, 0,
sizeof(struct PVRSRV_SGX_KERNEL_CCB), PDUMP_FLAGS_CONTINUOUS,
MAKEUNIQUETAG(psDevInfo->psKernelCCBMemInfo));
- PDUMPCOMMENT("Kernel CCB Control");
+ PDUMPCOMMENT("Initialise Kernel CCB Control");
PDUMPMEM(NULL, psDevInfo->psKernelCCBCtlMemInfo, 0,
sizeof(struct PVRSRV_SGX_CCB_CTL), PDUMP_FLAGS_CONTINUOUS,
MAKEUNIQUETAG(psDevInfo->psKernelCCBCtlMemInfo));
- PDUMPCOMMENT("Kernel CCB Event Kicker");
+ PDUMPCOMMENT("Initialise Kernel CCB Event Kicker");
PDUMPMEM(NULL, psDevInfo->psKernelCCBEventKickerMemInfo, 0,
sizeof(*psDevInfo->pui32KernelCCBEventKicker),
PDUMP_FLAGS_CONTINUOUS,
(struct PVRSRV_DEVICE_NODE *)pvDeviceNode;
struct PVRSRV_SGXDEV_INFO *psDevInfo =
(struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
- void *hDevInfoOSMemHandle = psDeviceNode->hDeviceOSMemHandle;
- enum PVRSRV_ERROR eError = PVRSRV_ERROR_INVALID_PARAMS;
+ enum PVRSRV_ERROR eError;
u32 ui32Heap;
struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
struct SGX_DEVICE_MAP *psSGXDeviceMap;
if (!pvr_put_ctx(psDeviceNode->sDevMemoryInfo.pBMKernelContext))
pr_err("%s: kernel context still in use, can't free it",
- __func__);
-
+ __func__);
eError = PVRSRVRemovePowerDevice(
((struct PVRSRV_DEVICE_NODE *)pvDeviceNode)->
return eError;
eError = SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE_SGX,
- (void **) &psSGXDeviceMap);
+ (void **)&psSGXDeviceMap);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
"DevDeInitSGX: Failed to get device memory map!");
OSUnMapPhysToLin(psDevInfo->pvRegsBaseKM,
psDevInfo->ui32RegSize,
PVRSRV_HAP_KERNEL_ONLY |
- PVRSRV_HAP_UNCACHED, NULL);
+ PVRSRV_HAP_UNCACHED,
+ NULL);
+
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(struct PVRSRV_SGXDEV_INFO), psDevInfo, NULL);
- OSFreePages(PVRSRV_OS_PAGEABLE_HEAP | PVRSRV_HAP_MULTI_PROCESS,
- sizeof(struct PVRSRV_SGXDEV_INFO), psDevInfo,
- hDevInfoOSMemHandle);
psDeviceNode->pvDevice = NULL;
if (psDeviceMemoryHeap != NULL)
return PVRSRV_OK;
}
-static
+#ifdef PVRSRV_USSE_EDM_STATUS_DEBUG
+
+#define SGXMK_TRACE_BUFFER_SIZE 512
+
+static void dump_edm(struct PVRSRV_SGXDEV_INFO *psDevInfo)
+{
+ u32 *trace_buffer =
+ psDevInfo->psKernelEDMStatusBufferMemInfo->pvLinAddrKM;
+ u32 last_code, write_offset;
+ int i;
+
+ last_code = *trace_buffer;
+ trace_buffer++;
+ write_offset = *trace_buffer;
+
+ pr_err("Last SGX microkernel status code: 0x%x\n", last_code);
+
+ trace_buffer++;
+ /* Dump the status values */
+
+ for (i = 0; i < SGXMK_TRACE_BUFFER_SIZE; i++) {
+ u32 *buf;
+ buf = trace_buffer + (((write_offset + i) %
+ SGXMK_TRACE_BUFFER_SIZE) * 4);
+ pr_err("(MKT%u) %8.8X %8.8X %8.8X %8.8X\n", i,
+ buf[2], buf[3], buf[1], buf[0]);
+ }
+}
+#else
+static void dump_edm(struct PVRSRV_SGXDEV_INFO *psDevInfo) {}
+#endif
+
+static void dump_sgx_registers(struct PVRSRV_SGXDEV_INFO *psDevInfo)
+{
+ pr_err("EVENT_STATUS = 0x%08X\n"
+ "EVENT_STATUS2 = 0x%08X\n"
+ "BIF_CTRL = 0x%08X\n"
+ "BIF_INT_STAT = 0x%08X\n"
+ "BIF_MEM_REQ_STAT = 0x%08X\n"
+ "BIF_FAULT = 0x%08X\n"
+ "CLKGATECTL = 0x%08X\n",
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_EVENT_STATUS),
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_EVENT_STATUS2),
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_BIF_CTRL),
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_BIF_INT_STAT),
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_BIF_MEM_REQ_STAT),
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_BIF_FAULT),
+ readl(psDevInfo->pvRegsBaseKM + EUR_CR_CLKGATECTL));
+}
+
+
void HWRecoveryResetSGX(struct PVRSRV_DEVICE_NODE *psDeviceNode,
- u32 ui32Component, u32 ui32CallerID)
+ u32 ui32Component, u32 ui32CallerID)
{
enum PVRSRV_ERROR eError;
struct PVRSRV_SGXDEV_INFO *psDevInfo =
(struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ psDevInfo->psSGXHostCtl;
+ u32 l;
PVR_UNREFERENCED_PARAMETER(ui32Component);
}
}
- psSGXHostCtl->ui32InterruptClearFlags |= PVRSRV_USSE_EDM_INTERRUPT_HWR;
+ l = readl(&psSGXHostCtl->ui32InterruptClearFlags);
+ l |= PVRSRV_USSE_EDM_INTERRUPT_HWR;
+ writel(l, &psSGXHostCtl->ui32InterruptClearFlags);
pr_err("HWRecoveryResetSGX: SGX Hardware Recovery triggered\n");
+ dump_sgx_registers(psDevInfo);
+ dump_edm(psDevInfo);
+
PDUMPSUSPEND();
do {
PVRSRVPowerUnlock(ui32CallerID);
- SGXScheduleProcessQueues(psDeviceNode);
+ SGXScheduleProcessQueuesKM(psDeviceNode);
PVRSRVProcessQueues(ui32CallerID, IMG_TRUE);
}
+static unsigned long sgx_reset_forced;
+
static void SGXOSTimer(struct work_struct *work)
{
struct timer_work_data *data = container_of(work,
goto rearm;
}
+#if defined(NO_HARDWARE)
+ bPoweredDown = IMG_TRUE;
+#else
bPoweredDown = (IMG_BOOL) !SGXIsDevicePowered(psDeviceNode);
+#endif
if (bPoweredDown) {
ui32LockupCounter = 0;
} else {
-
- ui32CurrentEDMTasks =
- OSReadHWReg(psDevInfo->pvRegsBaseKM,
- psDevInfo->ui32EDMTaskReg0);
+ ui32CurrentEDMTasks = OSReadHWReg(psDevInfo->pvRegsBaseKM,
+ psDevInfo->ui32EDMTaskReg0);
if (psDevInfo->ui32EDMTaskReg1 != 0)
ui32CurrentEDMTasks ^=
OSReadHWReg(psDevInfo->pvRegsBaseKM,
ui32LockupCounter++;
if (ui32LockupCounter == 3) {
ui32LockupCounter = 0;
- PVR_DPF(PVR_DBG_ERROR,
- "SGXOSTimer() detected SGX lockup (0x%x tasks)",
- ui32EDMTasks);
+ PVR_DPF(PVR_DBG_ERROR, "SGXOSTimer() "
+ "detected SGX lockup (0x%x tasks)",
+ ui32EDMTasks);
bLockup = IMG_TRUE;
}
}
}
+ bLockup |= cmpxchg(&sgx_reset_forced, 1, 0);
+
if (bLockup) {
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ psDevInfo->psSGXHostCtl;
+ u32 l;
- psSGXHostCtl->ui32HostDetectedLockups++;
+ l = readl(&psSGXHostCtl->ui32HostDetectedLockups);
+ l++;
+ writel(l, &psSGXHostCtl->ui32HostDetectedLockups);
/* Note: This will release the lock when done */
HWRecoveryResetSGX(psDeviceNode, 0, TIMER_ID);
msecs_to_jiffies(data->interval));
}
-static struct timer_work_data *
+struct timer_work_data *
SGXOSTimerInit(struct PVRSRV_DEVICE_NODE *psDeviceNode)
{
struct timer_work_data *data;
return data;
}
-static void SGXOSTimerDeInit(struct timer_work_data *data)
+void SGXOSTimerDeInit(struct timer_work_data *data)
{
destroy_workqueue(data->work_queue);
kfree(data);
}
-static enum PVRSRV_ERROR SGXOSTimerEnable(struct timer_work_data *data)
+enum PVRSRV_ERROR SGXOSTimerEnable(struct timer_work_data *data)
{
if (!data)
return PVRSRV_ERROR_GENERIC;
return PVRSRV_ERROR_GENERIC;
}
-static enum PVRSRV_ERROR SGXOSTimerCancel(struct timer_work_data *data)
+enum PVRSRV_ERROR SGXOSTimerCancel(struct timer_work_data *data)
{
if (!data)
return PVRSRV_ERROR_GENERIC;
return PVRSRV_OK;
}
+int sgx_force_reset(void)
+{
+ return !cmpxchg(&sgx_reset_forced, 0, 1);
+}
+
static IMG_BOOL SGX_ISRHandler(void *pvData)
{
IMG_BOOL bInterruptProcessed = IMG_FALSE;
ui32EventStatus =
OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_STATUS);
- ui32EventEnable =
- OSReadHWReg(psDevInfo->pvRegsBaseKM,
- EUR_CR_EVENT_HOST_ENABLE);
+ ui32EventEnable = OSReadHWReg(psDevInfo->pvRegsBaseKM,
+ EUR_CR_EVENT_HOST_ENABLE);
gui32EventStatusServicesByISR = ui32EventStatus;
static void SGX_MISRHandler(void *pvData)
{
struct PVRSRV_DEVICE_NODE *psDeviceNode =
- (struct PVRSRV_DEVICE_NODE *)pvData;
+ (struct PVRSRV_DEVICE_NODE *)pvData;
struct PVRSRV_SGXDEV_INFO *psDevInfo =
- (struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl;
-
- if ((psSGXHostCtl->ui32InterruptFlags & PVRSRV_USSE_EDM_INTERRUPT_HWR)
- && !(psSGXHostCtl->
- ui32InterruptClearFlags & PVRSRV_USSE_EDM_INTERRUPT_HWR))
+ (struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ psDevInfo->psSGXHostCtl;
+ u32 l1, l2;
+
+ l1 = readl(&psSGXHostCtl->ui32InterruptFlags);
+ l2 = readl(&psSGXHostCtl->ui32InterruptClearFlags);
+ if ((l1 & PVRSRV_USSE_EDM_INTERRUPT_HWR) &&
+ !(l2 & PVRSRV_USSE_EDM_INTERRUPT_HWR))
HWRecoveryResetSGX(psDeviceNode, 0, ISR_ID);
+
+ if (psDeviceNode->bReProcessDeviceCommandComplete)
+ SGXScheduleProcessQueuesKM(psDeviceNode);
+
SGXTestActivePowerEvent(psDeviceNode, ISR_ID);
}
psDeviceNode->pfnInitDevice = DevInitSGXPart1;
psDeviceNode->pfnDeInitDevice = DevDeInitSGX;
+ psDeviceNode->pfnInitDeviceCompatCheck = SGXDevInitCompatCheck;
+
psDeviceNode->pfnMMUInitialise = MMU_Initialise;
psDeviceNode->pfnMMUFinalise = MMU_Finalise;
psDeviceNode->pfnMMUInsertHeap = MMU_InsertHeap;
psDeviceNode->pfnDeviceCommandComplete = SGXCommandComplete;
psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
- psDevMemoryInfo->ui32AddressSpaceSizeLog2 = SGX_ADDRESS_SPACE_SIZE;
+
+ psDevMemoryInfo->ui32AddressSpaceSizeLog2 =
+ SGX_FEATURE_ADDRESS_SPACE_SIZE;
+
psDevMemoryInfo->ui32Flags = 0;
psDevMemoryInfo->ui32HeapCount = SGX_MAX_HEAP_ID;
psDevMemoryInfo->ui32SyncHeapID = SGX_SYNCINFO_HEAP_ID;
- psDevMemoryInfo->ui32MappingHeapID = SGX_GENERAL_MAPPING_HEAP_ID;
+
+ psDevMemoryInfo->ui32MappingHeapID = SGX_GENERAL_HEAP_ID;
if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct DEVICE_MEMORY_HEAP_INFO) *
psDevMemoryInfo->ui32HeapCount,
(void **) &psDevMemoryInfo->psDeviceMemoryHeap,
NULL) != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "SGXRegisterDevice : alloc failed for heap info");
+ PVR_DPF(PVR_DBG_ERROR, "SGXRegisterDevice : "
+ "Failed to alloc memory for "
+ "struct DEVICE_MEMORY_HEAP_INFO");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psDevMemoryInfo->psDeviceMemoryHeap, 0,
psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
+ psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_TADATA_HEAP_ID);
psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
+ psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_KERNEL_CODE_HEAP_ID);
psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32HeapSize =
SGX_KERNEL_CODE_HEAP_SIZE;
psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32Attribs =
- PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION
- | PVRSRV_HAP_MULTI_PROCESS;
- psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].pszName = "Kernel";
- psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].pszBSName = "Kernel BS";
+ PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
+ PVRSRV_HAP_MULTI_PROCESS;
+ psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].pszName = "Kernel Code";
+ psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].pszBSName =
+ "Kernel Code BS";
psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].ui32HeapID =
- HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_VIDEO_CODE_HEAP_ID);
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].sDevVAddrBase.uiAddr =
- SGX_VIDEO_CODE_HEAP_BASE;
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].ui32HeapSize =
- SGX_VIDEO_CODE_HEAP_SIZE;
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].ui32Attribs =
- PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
- PVRSRV_HAP_KERNEL_ONLY;
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].pszName = "Video";
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].pszBSName = "Video BS";
- psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].DevMemHeapType =
- DEVICE_MEMORY_HEAP_SHARED;
-
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].ui32HeapID =
- HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_KERNEL_VIDEO_DATA_HEAP_ID);
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].sDevVAddrBase.uiAddr =
- SGX_KERNEL_VIDEO_DATA_HEAP_BASE;
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].ui32HeapSize =
- SGX_KERNEL_VIDEO_DATA_HEAP_SIZE;
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].ui32Attribs =
+ psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].ui32HeapID =
+ HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_KERNEL_DATA_HEAP_ID);
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].sDevVAddrBase.uiAddr =
+ SGX_KERNEL_DATA_HEAP_BASE;
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].ui32HeapSize =
+ SGX_KERNEL_DATA_HEAP_SIZE;
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].ui32Attribs =
PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
PVRSRV_HAP_MULTI_PROCESS;
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].pszName =
- "KernelVideoData";
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].pszBSName =
- "KernelVideoData BS";
- psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].DevMemHeapType =
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].pszName = "KernelData";
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].pszBSName = "KernelData BS";
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
+ psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_PIXELSHADER_HEAP_ID);
psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
+ psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_VERTEXSHADER_HEAP_ID);
psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
+ psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_PDSPIXEL_CODEDATA_HEAP_ID);
psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
+ psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_PDSVERTEX_CODEDATA_HEAP_ID);
psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].sDevVAddrBase.
psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
+ psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_SYNCINFO_HEAP_ID);
psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
+ psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
+
psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32HeapID =
HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_3DPARAMETERS_HEAP_ID);
psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].sDevVAddrBase.uiAddr =
psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType =
DEVICE_MEMORY_HEAP_PERCONTEXT;
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].ui32HeapID =
- HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_GENERAL_MAPPING_HEAP_ID);
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].sDevVAddrBase.uiAddr =
- SGX_GENERAL_MAPPING_HEAP_BASE;
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].ui32HeapSize =
- SGX_GENERAL_MAPPING_HEAP_SIZE;
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].ui32Attribs =
- PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_MULTI_PROCESS;
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].pszName =
- "GeneralMapping";
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].pszBSName =
- "GeneralMapping BS";
-
- psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].DevMemHeapType =
- DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
-
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].ui32HeapID =
- HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_FB_MAPPING_HEAP_ID);
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].sDevVAddrBase.uiAddr =
- SGX_FB_MAPPING_HEAP_BASE;
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].ui32HeapSize =
- SGX_FB_MAPPING_HEAP_SIZE;
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].ui32Attribs =
- PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_MULTI_PROCESS;
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].pszName =
- "FramebufferMapping";
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].pszBSName =
- "FramebufferMapping BS";
-
- psDeviceMemoryHeap[SGX_FB_MAPPING_HEAP_ID].DevMemHeapType =
- DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
-
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].ui32HeapID =
- HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_ALT_MAPPING_HEAP_ID);
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].sDevVAddrBase.uiAddr =
- SGX_ALT_MAPPING_HEAP_BASE;
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].ui32HeapSize =
- SGX_ALT_MAPPING_HEAP_SIZE;
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].ui32Attribs =
- PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_MULTI_PROCESS;
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].pszName = "AltMapping";
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].pszBSName = "AltMapping BS";
-
- psDeviceMemoryHeap[SGX_ALT_MAPPING_HEAP_ID].DevMemHeapType =
- DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
+ psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32DataPageSize =
+ SGX_MMU_PAGE_SIZE;
return PVRSRV_OK;
}
enum PVRSRV_ERROR SGXGetClientInfoKM(void *hDevCookie,
- struct PVR3DIF4_CLIENT_INFO *psClientInfo)
+ struct SGX_CLIENT_INFO *psClientInfo)
{
struct PVRSRV_SGXDEV_INFO *psDevInfo =
(struct PVRSRV_SGXDEV_INFO *)
return PVRSRV_OK;
}
+enum PVRSRV_ERROR SGXDevInitCompatCheck(struct PVRSRV_DEVICE_NODE *psDeviceNode)
+{
+ struct PVRSRV_SGXDEV_INFO *psDevInfo;
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
+ enum PVRSRV_ERROR eError;
+#if !defined(NO_HARDWARE)
+ u32 ui32BuildOptions, ui32BuildOptionsMismatch;
+ struct PVRSRV_SGX_MISCINFO_FEATURES *psSGXFeatures;
+#endif
+
+ if (psDeviceNode->sDevId.eDeviceType != PVRSRV_DEVICE_TYPE_SGX) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXDevInitCompatCheck: Device not of type SGX");
+ eError = PVRSRV_ERROR_INVALID_PARAMS;
+ goto exit;
+ }
+ psDevInfo = psDeviceNode->pvDevice;
+ psMemInfo = psDevInfo->psKernelSGXMiscMemInfo;
+
+#if !defined(NO_HARDWARE)
+
+ eError = SGXGetBuildInfoKM(psDevInfo, psDeviceNode);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXDevInitCompatCheck: "
+ "Unable to validate device DDK version");
+ goto exit;
+ }
+ psSGXFeatures =
+ &((struct PVRSRV_SGX_MISCINFO_INFO *)(psMemInfo->pvLinAddrKM))->
+ sSGXFeatures;
+ if ((psSGXFeatures->ui32DDKVersion !=
+ ((PVRVERSION_MAJ << 16) | (PVRVERSION_MIN << 8) |
+ PVRVERSION_BRANCH)) ||
+ (psSGXFeatures->ui32DDKBuild != PVRVERSION_BUILD)) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXDevInitCompatCheck: "
+ "Incompatible driver DDK revision (%ld)"
+ "/device DDK revision (%ld).",
+ PVRVERSION_BUILD, psSGXFeatures->ui32DDKBuild);
+ eError = PVRSRV_ERROR_DDK_VERSION_MISMATCH;
+ goto exit;
+ } else {
+ PVR_DPF(PVR_DBG_WARNING, "(Success) SGXInit: "
+ "driver DDK (%ld) and device DDK (%ld) match",
+ PVRVERSION_BUILD, psSGXFeatures->ui32DDKBuild);
+ }
+
+ ui32BuildOptions = psSGXFeatures->ui32BuildOptions;
+ if (ui32BuildOptions != (SGX_BUILD_OPTIONS)) {
+ ui32BuildOptionsMismatch =
+ ui32BuildOptions ^ (SGX_BUILD_OPTIONS);
+ if (((SGX_BUILD_OPTIONS) & ui32BuildOptionsMismatch) != 0)
+ PVR_DPF(PVR_DBG_ERROR, "SGXInit: "
+ "Mismatch in driver and microkernel build "
+ "options; extra options present in driver: "
+ "(0x%lx)",
+ (SGX_BUILD_OPTIONS) &
+ ui32BuildOptionsMismatch);
+
+ if ((ui32BuildOptions & ui32BuildOptionsMismatch) != 0)
+ PVR_DPF(PVR_DBG_ERROR, "SGXInit: "
+ "Mismatch in driver and microkernel build "
+ "options; extra options present in "
+ "microkernel: (0x%lx)",
+ ui32BuildOptions & ui32BuildOptionsMismatch);
+ eError = PVRSRV_ERROR_BUILD_MISMATCH;
+ goto exit;
+ } else {
+ PVR_DPF(PVR_DBG_WARNING, "(Success) SGXInit: "
+ "Driver and microkernel build options match.");
+ }
+
+#endif
+ eError = PVRSRV_OK;
+exit:
+ return eError;
+}
+
+static
+enum PVRSRV_ERROR SGXGetBuildInfoKM(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ struct PVRSRV_DEVICE_NODE *psDeviceNode)
+{
+ enum PVRSRV_ERROR eError;
+ struct SGXMKIF_COMMAND sCommandData;
+ struct PVRSRV_SGX_MISCINFO_INFO *psSGXMiscInfoInt;
+ struct PVRSRV_SGX_MISCINFO_FEATURES *psSGXFeatures;
+
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo =
+ psDevInfo->psKernelSGXMiscMemInfo;
+
+ if (!psMemInfo->pvLinAddrKM) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXGetMiscInfoKM: Invalid address.");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+ psSGXMiscInfoInt = psMemInfo->pvLinAddrKM;
+ psSGXMiscInfoInt->ui32MiscInfoFlags &= ~PVRSRV_USSE_MISCINFO_READY;
+ psSGXFeatures = &psSGXMiscInfoInt->sSGXFeatures;
+
+ OSMemSet(psMemInfo->pvLinAddrKM, 0,
+ sizeof(struct PVRSRV_SGX_MISCINFO_INFO));
+
+ sCommandData.ui32Data[1] = psMemInfo->sDevVAddr.uiAddr;
+
+ OSMemSet(psSGXFeatures, 0, sizeof(*psSGXFeatures));
+
+ mb();
+
+ eError = SGXScheduleCCBCommandKM(psDeviceNode,
+ SGXMKIF_COMMAND_REQUEST_SGXMISCINFO,
+ &sCommandData, KERNEL_ID, 0);
+
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXGetMiscInfoKM: SGXScheduleCCBCommandKM failed.");
+ return eError;
+ }
+
+#if !defined(NO_HARDWARE)
+ {
+ IMG_BOOL bTimeout = IMG_TRUE;
+
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
+ if ((psSGXMiscInfoInt->
+ ui32MiscInfoFlags & PVRSRV_USSE_MISCINFO_READY) !=
+ 0) {
+ bTimeout = IMG_FALSE;
+ break;
+ }
+ }
+ END_LOOP_UNTIL_TIMEOUT();
+
+ if (bTimeout)
+ return PVRSRV_ERROR_TIMEOUT;
+ }
+#endif
+
+ return PVRSRV_OK;
+}
+
enum PVRSRV_ERROR SGXGetMiscInfoKM(struct PVRSRV_SGXDEV_INFO *psDevInfo,
- struct SGX_MISC_INFO *psMiscInfo)
+ struct SGX_MISC_INFO *psMiscInfo,
+ struct PVRSRV_DEVICE_NODE *psDeviceNode)
{
switch (psMiscInfo->eRequest) {
case SGX_MISC_INFO_REQUEST_CLOCKSPEED:
psDevInfo->ui32CoreClockSpeed;
return PVRSRV_OK;
}
+
+ case SGX_MISC_INFO_REQUEST_SGXREV:
+ {
+ struct PVRSRV_SGX_MISCINFO_FEATURES *psSGXFeatures;
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo =
+ psDevInfo->psKernelSGXMiscMemInfo;
+
+ SGXGetBuildInfoKM(psDevInfo, psDeviceNode);
+ psSGXFeatures =
+ &((struct PVRSRV_SGX_MISCINFO_INFO *)(psMemInfo->
+ pvLinAddrKM))->sSGXFeatures;
+
+ psMiscInfo->uData.sSGXFeatures = *psSGXFeatures;
+
+ PVR_DPF(PVR_DBG_MESSAGE, "SGXGetMiscInfoKM: "
+ "Core 0x%lx, sw ID 0x%lx, "
+ "sw Rev 0x%lx\n",
+ psSGXFeatures->ui32CoreRev,
+ psSGXFeatures->ui32CoreIdSW,
+ psSGXFeatures->ui32CoreRevSW);
+ PVR_DPF(PVR_DBG_MESSAGE, "SGXGetMiscInfoKM: "
+ "DDK version 0x%lx, DDK build 0x%lx\n",
+ psSGXFeatures->ui32DDKVersion,
+ psSGXFeatures->ui32DDKBuild);
+
+ return PVRSRV_OK;
+ }
+
+ case SGX_MISC_INFO_REQUEST_DRIVER_SGXREV:
+ {
+ struct PVRSRV_KERNEL_MEM_INFO *psMemInfo =
+ psDevInfo->psKernelSGXMiscMemInfo;
+ struct PVRSRV_SGX_MISCINFO_FEATURES *psSGXFeatures;
+
+ psSGXFeatures = &((struct PVRSRV_SGX_MISCINFO_INFO *)(
+ psMemInfo->pvLinAddrKM))->sSGXFeatures;
+
+ OSMemSet(psMemInfo->pvLinAddrKM, 0,
+ sizeof(struct PVRSRV_SGX_MISCINFO_INFO));
+
+ psSGXFeatures->ui32DDKVersion =
+ (PVRVERSION_MAJ << 16) |
+ (PVRVERSION_MIN << 8) | PVRVERSION_BRANCH;
+ psSGXFeatures->ui32DDKBuild = PVRVERSION_BUILD;
+
+ psMiscInfo->uData.sSGXFeatures = *psSGXFeatures;
+ return PVRSRV_OK;
+ }
+
+ case SGX_MISC_INFO_REQUEST_SET_HWPERF_STATUS:
+ {
+ struct SGXMKIF_HWPERF_CB *psHWPerfCB =
+ psDevInfo->psKernelHWPerfCBMemInfo->pvLinAddrKM;
+ unsigned ui32MatchingFlags;
+
+ if ((psMiscInfo->uData.ui32NewHWPerfStatus &
+ ~(PVRSRV_SGX_HWPERF_GRAPHICS_ON |
+ PVRSRV_SGX_HWPERF_MK_EXECUTION_ON)) != 0) {
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
+ ui32MatchingFlags = readl(&psDevInfo->
+ psSGXHostCtl->ui32HWPerfFlags);
+ ui32MatchingFlags &=
+ psMiscInfo->uData.ui32NewHWPerfStatus;
+ if ((ui32MatchingFlags & PVRSRV_SGX_HWPERF_GRAPHICS_ON)
+ == 0UL) {
+ psHWPerfCB->ui32OrdinalGRAPHICS = 0xffffffff;
+ }
+ if ((ui32MatchingFlags &
+ PVRSRV_SGX_HWPERF_MK_EXECUTION_ON) == 0UL) {
+ psHWPerfCB->ui32OrdinalMK_EXECUTION =
+ 0xffffffffUL;
+ }
+
+
+ writel(psMiscInfo->uData.ui32NewHWPerfStatus,
+ &psDevInfo->psSGXHostCtl->ui32HWPerfFlags);
+#if defined(PDUMP)
+ PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS,
+ "SGX ukernel HWPerf status %u\n",
+ readl(&psDevInfo->psSGXHostCtl->
+ ui32HWPerfFlags));
+ PDUMPMEM(NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
+ offsetof(struct SGXMKIF_HOST_CTL,
+ ui32HWPerfFlags),
+ sizeof(psDevInfo->psSGXHostCtl->
+ ui32HWPerfFlags),
+ PDUMP_FLAGS_CONTINUOUS,
+ MAKEUNIQUETAG(psDevInfo->
+ psKernelSGXHostCtlMemInfo));
+#endif
+
+ return PVRSRV_OK;
+ }
case SGX_MISC_INFO_REQUEST_HWPERF_CB_ON:
{
- psDevInfo->psSGXHostCtl->ui32HWPerfFlags |=
- PVRSRV_SGX_HWPERF_ON;
+
+ struct SGXMKIF_HWPERF_CB *psHWPerfCB =
+ psDevInfo->psKernelHWPerfCBMemInfo->pvLinAddrKM;
+ u32 l;
+
+ psHWPerfCB->ui32OrdinalGRAPHICS = 0xffffffffUL;
+
+ l = readl(&psDevInfo->psSGXHostCtl->ui32HWPerfFlags);
+ l |= PVRSRV_SGX_HWPERF_GRAPHICS_ON;
+ writel(l, &psDevInfo->psSGXHostCtl->ui32HWPerfFlags);
+
return PVRSRV_OK;
}
case SGX_MISC_INFO_REQUEST_HWPERF_CB_OFF:
{
- psDevInfo->psSGXHostCtl->ui32HWPerfFlags &=
- ~PVRSRV_SGX_HWPERF_ON;
+ writel(0, &psDevInfo->psSGXHostCtl->ui32HWPerfFlags);
+
return PVRSRV_OK;
}
case SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB:
{
struct SGX_MISC_INFO_HWPERF_RETRIEVE_CB *psRetrieve =
&psMiscInfo->uData.sRetrieveCB;
- struct PVRSRV_SGX_HWPERF_CB *psHWPerfCB =
- (struct PVRSRV_SGX_HWPERF_CB *)psDevInfo->
- psKernelHWPerfCBMemInfo->pvLinAddrKM;
- unsigned i = 0;
+ struct SGXMKIF_HWPERF_CB *psHWPerfCB =
+ psDevInfo->psKernelHWPerfCBMemInfo->pvLinAddrKM;
+ unsigned i;
- for (;
+ for (i = 0;
psHWPerfCB->ui32Woff != psHWPerfCB->ui32Roff
&& i < psRetrieve->ui32ArraySize; i++) {
- struct PVRSRV_SGX_HWPERF_CBDATA *psData =
+ struct SGXMKIF_HWPERF_CB_ENTRY *psData =
&psHWPerfCB->psHWPerfCBData[psHWPerfCB->
ui32Roff];
- OSMemCopy(&psRetrieve->psHWPerfData[i], psData,
- sizeof(struct PVRSRV_SGX_HWPERF_CBDATA));
+
+ psRetrieve->psHWPerfData[i].ui32FrameNo =
+ psData->ui32FrameNo;
+ psRetrieve->psHWPerfData[i].ui32Type =
+ (psData->ui32Type &
+ PVRSRV_SGX_HWPERF_TYPE_OP_MASK);
+ psRetrieve->psHWPerfData[i].ui32StartTime =
+ psData->ui32Time;
+ psRetrieve->psHWPerfData[i].ui32StartTimeWraps =
+ psData->ui32TimeWraps;
+ psRetrieve->psHWPerfData[i].ui32EndTime =
+ psData->ui32Time;
+ psRetrieve->psHWPerfData[i].ui32EndTimeWraps =
+ psData->ui32TimeWraps;
psRetrieve->psHWPerfData[i].ui32ClockSpeed =
psDevInfo->ui32CoreClockSpeed;
psRetrieve->psHWPerfData[i].ui32TimeMax =
psDevInfo->ui32uKernelTimerClock;
psHWPerfCB->ui32Roff =
(psHWPerfCB->ui32Roff + 1) &
- (PVRSRV_SGX_HWPERF_CBSIZE - 1);
+ (SGXMKIF_HWPERF_CB_SIZE - 1);
}
psRetrieve->ui32DataCount = i;
psRetrieve->ui32Time = OSClockus();
}
default:
{
-
return PVRSRV_ERROR_INVALID_PARAMS;
}
}
if (psPowerDevice->ui32DeviceIndex ==
psDeviceNode->sDevId.ui32DeviceIndex) {
bPowered =
- (IMG_BOOL) (psPowerDevice->eCurrentPowerState ==
+ (IMG_BOOL)(psPowerDevice->eCurrentPowerState ==
PVRSRV_POWER_STATE_D0);
break;
}
}
if (psDevInfo->ui32HWGroupRequested != *pui32Old) {
-
if (psDevInfo->ui32HWReset != 0) {
OSWriteHWReg(psDevInfo->pvRegsBaseKM,
ui32Reg,
psDevInfo->ui32HWReset);
psDevInfo->ui32HWReset = 0;
}
-
OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32Reg,
psDevInfo->ui32HWGroupRequested);
}
sNew.ui32Marker[0] = psDevInfo->ui32KickTACounter;
sNew.ui32Marker[1] = psDevInfo->ui32KickTARenderCounter;
- sNew.ui32Time[1] =
- psDevInfo->psSGXHostCtl->ui32TimeWraps;
+ sNew.ui32Time[1] = readl(
+ &psDevInfo->psSGXHostCtl->ui32TimeWraps);
for (i = 0; i < PVRSRV_SGX_DIFF_NUM_COUNTERS; ++i) {
psDiffs->aui32Counters[i] =
return eError;
}
+
+enum PVRSRV_ERROR SGXReadHWPerfCBKM(void *hDevHandle, u32 ui32ArraySize,
+ struct PVRSRV_SGX_HWPERF_CB_ENTRY *psClientHWPerfEntry,
+ u32 *pui32DataCount, u32 *pui32ClockSpeed,
+ u32 *pui32HostTimeStamp)
+{
+ enum PVRSRV_ERROR eError = PVRSRV_OK;
+ struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+ struct SGXMKIF_HWPERF_CB *psHWPerfCB =
+ psDevInfo->psKernelHWPerfCBMemInfo->pvLinAddrKM;
+ unsigned i;
+
+ for (i = 0;
+ psHWPerfCB->ui32Woff != psHWPerfCB->ui32Roff && i < ui32ArraySize;
+ i++) {
+ struct SGXMKIF_HWPERF_CB_ENTRY *psMKPerfEntry =
+ &psHWPerfCB->psHWPerfCBData[psHWPerfCB->ui32Roff];
+
+ psClientHWPerfEntry[i].ui32FrameNo = psMKPerfEntry->ui32FrameNo;
+ psClientHWPerfEntry[i].ui32Type = psMKPerfEntry->ui32Type;
+ psClientHWPerfEntry[i].ui32Ordinal = psMKPerfEntry->ui32Ordinal;
+ psClientHWPerfEntry[i].ui32Clocksx16 =
+ SGXConvertTimeStamp(psDevInfo, psMKPerfEntry->ui32TimeWraps,
+ psMKPerfEntry->ui32Time);
+ OSMemCopy(&psClientHWPerfEntry[i].ui32Counters[0],
+ &psMKPerfEntry->ui32Counters[0],
+ sizeof(psMKPerfEntry->ui32Counters));
+
+ psHWPerfCB->ui32Roff =
+ (psHWPerfCB->ui32Roff + 1) & (SGXMKIF_HWPERF_CB_SIZE - 1);
+ }
+
+ *pui32DataCount = i;
+ *pui32ClockSpeed = psDevInfo->ui32CoreClockSpeed;
+ *pui32HostTimeStamp = OSClockus();
+
+ return eError;
+}
#include "sgxutils.h"
enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
- struct PVR3DIF4_CCB_KICK *psCCBKick)
+ struct SGX_CCB_KICK *psCCBKick)
{
enum PVRSRV_ERROR eError;
struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
struct PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo =
(struct PVRSRV_KERNEL_MEM_INFO *)psCCBKick->hCCBKernelMemInfo;
- struct PVR3DIF4_CMDTA_SHARED *psTACmd;
+ struct SGXMKIF_CMDTA_SHARED *psTACmd;
u32 i;
struct PVRSRV_DEVICE_NODE *psDeviceNode;
struct PVRSRV_SGXDEV_INFO *psDevInfo;
++psDevInfo->ui32KickTACounter;
if (!CCB_OFFSET_IS_VALID
- (struct PVR3DIF4_CMDTA_SHARED, psCCBMemInfo, psCCBKick,
+ (struct SGXMKIF_CMDTA_SHARED, psCCBMemInfo, psCCBKick,
ui32CCBOffset)) {
PVR_DPF(PVR_DBG_ERROR, "SGXDoKickKM: Invalid CCB offset");
return PVRSRV_ERROR_INVALID_PARAMS;
}
psTACmd =
- CCB_DATA_FROM_OFFSET(struct PVR3DIF4_CMDTA_SHARED, psCCBMemInfo,
+ CCB_DATA_FROM_OFFSET(struct SGXMKIF_CMDTA_SHARED, psCCBMemInfo,
psCCBKick, ui32CCBOffset);
if (psCCBKick->hTA3DSyncInfo) {
psSyncInfo =
(struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo;
- psTACmd->sTA3DDependancy.sWriteOpsCompleteDevVAddr =
+ psTACmd->sTA3DDependency.sWriteOpsCompleteDevVAddr =
psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTACmd->sTA3DDependancy.ui32WriteOpPendingVal =
+ psTACmd->sTA3DDependency.ui32WriteOpsPendingVal =
psSyncInfo->psSyncData->ui32WriteOpsPending;
if (psCCBKick->bTADependency)
psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
psCCBKick->hTASyncInfo;
- psTACmd->sTQSyncReadOpsCompleteDevVAddr =
+ psTACmd->sTATQSyncReadOpsCompleteDevVAddr =
psSyncInfo->sReadOpsCompleteDevVAddr;
- psTACmd->sTQSyncWriteOpsCompleteDevVAddr =
+ psTACmd->sTATQSyncWriteOpsCompleteDevVAddr =
psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTACmd->ui32TQSyncReadOpsPendingVal =
+ psTACmd->ui32TATQSyncReadOpsPendingVal =
psSyncInfo->psSyncData->ui32ReadOpsPending++;
- psTACmd->ui32TQSyncWriteOpsPendingVal =
+ psTACmd->ui32TATQSyncWriteOpsPendingVal =
psSyncInfo->psSyncData->ui32WriteOpsPending;
}
}
psTACmd->ui32NumTAStatusVals = psCCBKick->ui32NumTAStatusVals;
- if (psCCBKick->ui32NumTAStatusVals != 0)
-
+ if (psCCBKick->ui32NumTAStatusVals != 0) {
for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) {
psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
psCCBKick->ahTAStatusSyncInfo[i];
psTACmd->sCtlTAStatusInfo[i].ui32StatusValue =
psSyncInfo->psSyncData->ui32ReadOpsPending;
}
+ }
psTACmd->ui32Num3DStatusVals = psCCBKick->ui32Num3DStatusVals;
- if (psCCBKick->ui32Num3DStatusVals != 0)
-
+ if (psCCBKick->ui32Num3DStatusVals != 0) {
for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++) {
psSyncInfo =
(struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
psTACmd->sCtl3DStatusInfo[i].ui32StatusValue =
psSyncInfo->psSyncData->ui32ReadOpsPending;
}
+ }
psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs;
for (i = 0; i < psCCBKick->ui32NumSrcSyncs; i++) {
psTACmd->asSrcSyncs[i].sReadOpsCompleteDevVAddr =
psSyncInfo->sReadOpsCompleteDevVAddr;
- psTACmd->asSrcSyncs[i].ui32ReadOpPendingVal =
+ psTACmd->asSrcSyncs[i].ui32ReadOpsPendingVal =
psSyncInfo->psSyncData->ui32ReadOpsPending++;
- psTACmd->asSrcSyncs[i].ui32WriteOpPendingVal =
+ psTACmd->asSrcSyncs[i].ui32WriteOpsPendingVal =
psSyncInfo->psSyncData->ui32WriteOpsPending;
}
if (psCCBKick->bFirstKickOrResume &&
- psCCBKick->hRenderSurfSyncInfo != NULL) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psCCBKick->hRenderSurfSyncInfo;
- psTACmd->sWriteOpsCompleteDevVAddr =
- psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTACmd->sReadOpsCompleteDevVAddr =
- psSyncInfo->sReadOpsCompleteDevVAddr;
-
- psTACmd->ui32ReadOpsPendingVal =
- psSyncInfo->psSyncData->ui32ReadOpsPending;
- psTACmd->ui32WriteOpsPendingVal =
- psSyncInfo->psSyncData->ui32WriteOpsPending++;
-
+ psCCBKick->ui32NumDstSyncObjects > 0) {
+ struct PVRSRV_KERNEL_MEM_INFO *psHWDstSyncListMemInfo =
+ (struct PVRSRV_KERNEL_MEM_INFO *)psCCBKick->
+ hKernelHWSyncListMemInfo;
+ struct SGXMKIF_HWDEVICE_SYNC_LIST *psHWDeviceSyncList =
+ psHWDstSyncListMemInfo->pvLinAddrKM;
+ u32 ui32NumDstSyncs = psCCBKick->ui32NumDstSyncObjects;
+
+ PVR_ASSERT(((struct PVRSRV_KERNEL_MEM_INFO *)psCCBKick->
+ hKernelHWSyncListMemInfo)->ui32AllocSize >=
+ (sizeof(struct SGXMKIF_HWDEVICE_SYNC_LIST) +
+ (sizeof(struct PVRSRV_DEVICE_SYNC_OBJECT) *
+ ui32NumDstSyncs)));
+
+ psHWDeviceSyncList->ui32NumSyncObjects = ui32NumDstSyncs;
#if defined(PDUMP)
if (PDumpIsCaptureFrameKM()) {
- if (psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) {
-
- PDUMPCOMMENT("Init render surface last op\r\n");
+ PDUMPCOMMENT("HWDeviceSyncList for TACmd\r\n");
+ PDUMPMEM(NULL,
+ psHWDstSyncListMemInfo, 0,
+ sizeof(struct SGXMKIF_HWDEVICE_SYNC_LIST),
+ 0, MAKEUNIQUETAG(psHWDstSyncListMemInfo));
+ }
+#endif
+ psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ sDstSyncHandle;
+ i = 0;
+ if (psSyncInfo) {
+ psHWDeviceSyncList->asSyncData[i].
+ sWriteOpsCompleteDevVAddr =
+ psSyncInfo->sWriteOpsCompleteDevVAddr;
+
+ psHWDeviceSyncList->asSyncData[i].
+ sReadOpsCompleteDevVAddr =
+ psSyncInfo->sReadOpsCompleteDevVAddr;
+
+ psHWDeviceSyncList->asSyncData[i].
+ ui32ReadOpsPendingVal =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
- PDUMPMEM(NULL, psSyncInfo->psSyncDataMemInfoKM,
- 0, sizeof(struct PVRSRV_SYNC_DATA),
- 0, MAKEUNIQUETAG(psSyncInfo->
- psSyncDataMemInfoKM));
+ psHWDeviceSyncList->asSyncData[i].
+ ui32WriteOpsPendingVal =
+ psSyncInfo->psSyncData->
+ ui32WriteOpsPending++;
+#if defined(PDUMP)
+ if (PDumpIsCaptureFrameKM()) {
+ u32 ui32ModifiedValue;
+ u32 ui32SyncOffset = offsetof(
+ struct SGXMKIF_HWDEVICE_SYNC_LIST,
+ asSyncData) + (i *
+ sizeof(
+ struct PVRSRV_DEVICE_SYNC_OBJECT));
+ u32 ui32WOpsOffset = ui32SyncOffset +
+ offsetof(
+ struct PVRSRV_DEVICE_SYNC_OBJECT,
+ ui32WriteOpsPendingVal);
+ u32 ui32ROpsOffset = ui32SyncOffset +
+ offsetof(
+ struct PVRSRV_DEVICE_SYNC_OBJECT,
+ ui32ReadOpsPendingVal);
+
+ PDUMPCOMMENT("HWDeviceSyncObject for RT: "
+ "%i\r\n", i);
+
+ PDUMPMEM(NULL, psHWDstSyncListMemInfo,
+ ui32SyncOffset, sizeof(
+ struct PVRSRV_DEVICE_SYNC_OBJECT),
+ 0, MAKEUNIQUETAG(
+ psHWDstSyncListMemInfo));
+
+ if ((psSyncInfo->psSyncData->
+ ui32LastOpDumpVal == 0) &&
+ (psSyncInfo->psSyncData->
+ ui32LastReadOpDumpVal == 0)) {
+
+ PDUMPCOMMENT("Init RT ROpsComplete\r\n",
+ i);
+ PDUMPMEM(&psSyncInfo->psSyncData->
+ ui32LastReadOpDumpVal,
+ psSyncInfo->psSyncDataMemInfoKM,
+ offsetof(struct
+ PVRSRV_SYNC_DATA,
+ ui32ReadOpsComplete),
+ sizeof(psSyncInfo->psSyncData->
+ ui32ReadOpsComplete),
+ 0,
+ MAKEUNIQUETAG(psSyncInfo->
+ psSyncDataMemInfoKM));
+
+ PDUMPCOMMENT("Init RT WOpsComplete\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->
- ui32LastOpDumpVal,
+ ui32LastOpDumpVal,
psSyncInfo->psSyncDataMemInfoKM,
offsetof(struct PVRSRV_SYNC_DATA,
- ui32WriteOpsComplete),
+ ui32WriteOpsComplete),
sizeof(psSyncInfo->psSyncData->
- ui32WriteOpsComplete), 0,
- MAKEUNIQUETAG(psSyncInfo->
- psSyncDataMemInfoKM));
- }
+ ui32WriteOpsComplete),
+ 0, MAKEUNIQUETAG(psSyncInfo->
+ psSyncDataMemInfoKM));
+ }
- psSyncInfo->psSyncData->ui32LastOpDumpVal++;
- }
+ psSyncInfo->psSyncData->ui32LastOpDumpVal++;
+
+ ui32ModifiedValue = psSyncInfo->psSyncData->
+ ui32LastOpDumpVal - 1;
+
+ PDUMPCOMMENT("Modify RT %d WOpPendingVal "
+ "in HWDevSyncList\r\n", i);
+
+ PDUMPMEM(&ui32ModifiedValue,
+ psHWDstSyncListMemInfo, ui32WOpsOffset,
+ sizeof(u32), 0,
+ MAKEUNIQUETAG(psHWDstSyncListMemInfo));
+
+ PDUMPCOMMENT("Modify RT %d ROpsPendingVal "
+ "in HWDevSyncList\r\n", i);
+
+ PDUMPMEM(&psSyncInfo->psSyncData->
+ ui32LastReadOpDumpVal,
+ psHWDstSyncListMemInfo,
+ ui32ROpsOffset, sizeof(u32), 0,
+ MAKEUNIQUETAG(psHWDstSyncListMemInfo));
+ }
#endif
+ } else {
+ psHWDeviceSyncList->asSyncData[i].
+ sWriteOpsCompleteDevVAddr.uiAddr = 0;
+ psHWDeviceSyncList->asSyncData[i].
+ sReadOpsCompleteDevVAddr.uiAddr = 0;
+
+ psHWDeviceSyncList->asSyncData[i].
+ ui32ReadOpsPendingVal = 0;
+ psHWDeviceSyncList->asSyncData[i].
+ ui32WriteOpsPendingVal = 0;
+ }
}
#if defined(PDUMP)
if (PDumpIsCaptureFrameKM()) {
PDUMPCOMMENT("Shared part of TA command\r\n");
PDUMPMEM(psTACmd, psCCBMemInfo, psCCBKick->ui32CCBDumpWOff,
- sizeof(struct PVR3DIF4_CMDTA_SHARED), 0,
+ sizeof(struct SGXMKIF_CMDTA_SHARED), 0,
MAKEUNIQUETAG(psCCBMemInfo));
- if (psCCBKick->hRenderSurfSyncInfo != NULL) {
- u32 ui32HackValue;
+ for (i = 0; i < psCCBKick->ui32NumSrcSyncs; i++) {
+ u32 ui32ModifiedValue;
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ ahSrcKernelSyncInfo[i];
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psCCBKick->hRenderSurfSyncInfo;
- ui32HackValue =
- psSyncInfo->psSyncData->ui32LastOpDumpVal - 1;
+ if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) &&
+ (psSyncInfo->psSyncData->ui32LastReadOpDumpVal ==
+ 0)) {
+ PDUMPCOMMENT("Init RT ROpsComplete\r\n", i);
+ PDUMPMEM(&psSyncInfo->psSyncData->
+ ui32LastReadOpDumpVal,
+ psSyncInfo->psSyncDataMemInfoKM,
+ offsetof(struct PVRSRV_SYNC_DATA,
+ ui32ReadOpsComplete),
+ sizeof(psSyncInfo->psSyncData->
+ ui32ReadOpsComplete), 0,
+ MAKEUNIQUETAG(psSyncInfo->
+ psSyncDataMemInfoKM));
+ PDUMPCOMMENT("Init RT WOpsComplete\r\n");
+ PDUMPMEM(&psSyncInfo->psSyncData->
+ ui32LastOpDumpVal,
+ psSyncInfo->psSyncDataMemInfoKM,
+ offsetof(struct PVRSRV_SYNC_DATA,
+ ui32WriteOpsComplete),
+ sizeof(psSyncInfo->psSyncData->
+ ui32WriteOpsComplete), 0,
+ MAKEUNIQUETAG(psSyncInfo->
+ psSyncDataMemInfoKM));
+ }
+
+ psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
- PDUMPCOMMENT(
- "Hack render surface last op in TA cmd\r\n");
+ ui32ModifiedValue =
+ psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1;
- PDUMPMEM(&ui32HackValue, psCCBMemInfo,
+ PDUMPCOMMENT("Modify SrcSync %d ROpsPendingVal\r\n", i);
+
+ PDUMPMEM(&ui32ModifiedValue,
+ psCCBMemInfo,
psCCBKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_CMDTA_SHARED,
- ui32WriteOpsPendingVal),
- sizeof(u32), 0, MAKEUNIQUETAG(psCCBMemInfo));
+ offsetof(struct SGXMKIF_CMDTA_SHARED,
+ asSrcSyncs) +
+ (i *
+ sizeof(struct PVRSRV_DEVICE_SYNC_OBJECT)) +
+ offsetof(struct PVRSRV_DEVICE_SYNC_OBJECT,
+ ui32ReadOpsPendingVal), sizeof(u32),
+ 0, MAKEUNIQUETAG(psCCBMemInfo));
- ui32HackValue = 0;
- PDUMPCOMMENT(
- "Hack render surface read op in TA cmd\r\n");
+ PDUMPCOMMENT("Modify SrcSync %d WOpPendingVal\r\n", i);
- PDUMPMEM(&ui32HackValue, psCCBMemInfo,
+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
+ psCCBMemInfo,
psCCBKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_CMDTA_SHARED,
- sReadOpsCompleteDevVAddr),
- sizeof(u32), 0, MAKEUNIQUETAG(psCCBMemInfo));
+ offsetof(struct SGXMKIF_CMDTA_SHARED,
+ asSrcSyncs) +
+ (i *
+ sizeof(struct PVRSRV_DEVICE_SYNC_OBJECT)) +
+ offsetof(struct PVRSRV_DEVICE_SYNC_OBJECT,
+ ui32WriteOpsPendingVal), sizeof(u32),
+ 0, MAKEUNIQUETAG(psCCBMemInfo));
+
}
for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psCCBKick->ahTAStatusSyncInfo[i];
-
- PDUMPCOMMENT("Hack TA status value in TA cmd\r\n");
-
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ ahTAStatusSyncInfo[i];
+ PDUMPCOMMENT("Modify TA status value in TA cmd\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
- psCCBMemInfo, psCCBKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_CMDTA_SHARED,
+ psCCBMemInfo,
+ psCCBKick->ui32CCBDumpWOff +
+ offsetof(struct SGXMKIF_CMDTA_SHARED,
sCtlTAStatusInfo[i].ui32StatusValue),
sizeof(u32), 0, MAKEUNIQUETAG(psCCBMemInfo));
}
psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
psCCBKick->ah3DStatusSyncInfo[i];
- PDUMPCOMMENT("Hack 3D status value in TA cmd\r\n");
+ PDUMPCOMMENT("Modify 3D status value in TA cmd\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
- psCCBMemInfo, psCCBKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_CMDTA_SHARED,
+ psCCBMemInfo,
+ psCCBKick->ui32CCBDumpWOff +
+ offsetof(struct SGXMKIF_CMDTA_SHARED,
sCtl3DStatusInfo[i].ui32StatusValue),
sizeof(u32), 0, MAKEUNIQUETAG(psCCBMemInfo));
}
}
#endif
- eError =
- SGXScheduleCCBCommandKM(hDevHandle, psCCBKick->eCommand,
- &psCCBKick->sCommand, KERNEL_ID);
+ eError = SGXScheduleCCBCommandKM(hDevHandle, psCCBKick->eCommand,
+ &psCCBKick->sCommand, KERNEL_ID, 0);
if (eError == PVRSRV_ERROR_RETRY) {
if (psCCBKick->bFirstKickOrResume &&
- psCCBKick->hRenderSurfSyncInfo != NULL) {
+ psCCBKick->ui32NumDstSyncObjects > 0) {
psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psCCBKick->hRenderSurfSyncInfo;
- psSyncInfo->psSyncData->ui32WriteOpsPending--;
+ psCCBKick->sDstSyncHandle;
+ if (psSyncInfo) {
+ psSyncInfo->psSyncData->ui32WriteOpsPending--;
+#if defined(PDUMP)
+ if (PDumpIsCaptureFrameKM())
+ psSyncInfo->psSyncData->
+ ui32LastOpDumpVal--;
+#endif
+ }
}
for (i = 0; i < psCCBKick->ui32NumSrcSyncs; i++) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psCCBKick->ahSrcKernelSyncInfo[i];
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ ahSrcKernelSyncInfo[i];
psSyncInfo->psSyncData->ui32ReadOpsPending--;
}
-#if defined(PDUMP)
- if (psCCBKick->bFirstKickOrResume &&
- psCCBKick->hRenderSurfSyncInfo != NULL)
- if (PDumpIsCaptureFrameKM()) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psCCBKick->hRenderSurfSyncInfo;
- psSyncInfo->psSyncData->ui32LastOpDumpVal--;
- }
-#endif
-
return eError;
} else if (PVRSRV_OK != eError) {
PVR_DPF(PVR_DBG_ERROR,
return eError;
}
+#if defined(NO_HARDWARE)
+
+ if (psCCBKick->hTA3DSyncInfo) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo;
+
+ if (psCCBKick->bTADependency) {
+ psSyncInfo->psSyncData->ui32WriteOpsComplete =
+ psSyncInfo->psSyncData->ui32WriteOpsPending;
+ }
+ }
+
+ if (psCCBKick->hTASyncInfo != NULL) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo;
+
+ psSyncInfo->psSyncData->ui32ReadOpsComplete =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
+ }
+
+ if (psCCBKick->h3DSyncInfo != NULL) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo;
+
+ psSyncInfo->psSyncData->ui32ReadOpsComplete =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
+ }
+
+ for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ ahTAStatusSyncInfo[i];
+ psSyncInfo->psSyncData->ui32ReadOpsComplete =
+ psTACmd->sCtlTAStatusInfo[i].ui32StatusValue;
+ }
+
+ for (i = 0; i < psCCBKick->ui32NumSrcSyncs; i++) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ ahSrcKernelSyncInfo[i];
+
+ psSyncInfo->psSyncData->ui32ReadOpsComplete =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
+
+ }
+
+ if (psCCBKick->bTerminateOrAbort) {
+ if (psCCBKick->ui32NumDstSyncObjects > 0) {
+ struct PVRSRV_KERNEL_MEM_INFO *psHWDstSyncListMemInfo =
+ (struct PVRSRV_KERNEL_MEM_INFO *)psCCBKick->
+ hKernelHWSyncListMemInfo;
+ struct SGXMKIF_HWDEVICE_SYNC_LIST *psHWDeviceSyncList =
+ psHWDstSyncListMemInfo->pvLinAddrKM;
+
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ sDstSyncHandle;
+ if (psSyncInfo)
+ psSyncInfo->psSyncData->ui32WriteOpsComplete =
+ psHWDeviceSyncList->asSyncData[0].
+ ui32WriteOpsPendingVal + 1;
+ }
+
+ for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->
+ ah3DStatusSyncInfo[i];
+ psSyncInfo->psSyncData->ui32ReadOpsComplete =
+ psTACmd->sCtl3DStatusInfo[i].ui32StatusValue;
+ }
+ }
+#endif
+
return eError;
}
#if !defined(__SGXMMU_KM_H__)
#define __SGXMMU_KM_H__
-#define SGX_MMU_PAGE_SHIFT (12)
+#define SGX_MMU_PAGE_SHIFT 12
#define SGX_MMU_PAGE_SIZE (1UL << SGX_MMU_PAGE_SHIFT)
#define SGX_MMU_PAGE_MASK (SGX_MMU_PAGE_SIZE - 1UL)
-#define SGX_MMU_PD_SHIFT (10)
+#define SGX_MMU_PD_SHIFT 10
#define SGX_MMU_PD_SIZE (1UL << SGX_MMU_PD_SHIFT)
-#define SGX_MMU_PD_MASK (0xFFC00000UL)
+#define SGX_MMU_PD_MASK 0xFFC00000UL
-#define SGX_MMU_PDE_ADDR_MASK (0xFFFFF000UL)
-#define SGX_MMU_PDE_VALID (0x00000001UL)
-#define SGX_MMU_PDE_WRITEONLY (0x00000002UL)
-#define SGX_MMU_PDE_READONLY (0x00000004UL)
-#define SGX_MMU_PDE_CACHECONSISTENT (0x00000008UL)
-#define SGX_MMU_PDE_EDMPROTECT (0x00000010UL)
+#define SGX_MMU_PDE_ADDR_MASK 0xFFFFF000UL
+#define SGX_MMU_PDE_VALID 0x00000001UL
+#define SGX_MMU_PDE_PAGE_SIZE_4K 0x00000000UL
+#define SGX_MMU_PDE_WRITEONLY 0x00000002UL
+#define SGX_MMU_PDE_READONLY 0x00000004UL
+#define SGX_MMU_PDE_CACHECONSISTENT 0x00000008UL
+#define SGX_MMU_PDE_EDMPROTECT 0x00000010UL
-#define SGX_MMU_PT_SHIFT (10)
+#define SGX_MMU_PT_SHIFT 10
#define SGX_MMU_PT_SIZE (1UL << SGX_MMU_PT_SHIFT)
-#define SGX_MMU_PT_MASK (0x003FF000UL)
+#define SGX_MMU_PT_MASK 0x003FF000UL
-#define SGX_MMU_PTE_ADDR_MASK (0xFFFFF000UL)
-#define SGX_MMU_PTE_VALID (0x00000001UL)
-#define SGX_MMU_PTE_WRITEONLY (0x00000002UL)
-#define SGX_MMU_PTE_READONLY (0x00000004UL)
-#define SGX_MMU_PTE_CACHECONSISTENT (0x00000008UL)
-#define SGX_MMU_PTE_EDMPROTECT (0x00000010UL)
+#define SGX_MMU_PTE_ADDR_MASK 0xFFFFF000UL
+#define SGX_MMU_PTE_VALID 0x00000001UL
+#define SGX_MMU_PTE_WRITEONLY 0x00000002UL
+#define SGX_MMU_PTE_READONLY 0x00000004UL
+#define SGX_MMU_PTE_CACHECONSISTENT 0x00000008UL
+#define SGX_MMU_PTE_EDMPROTECT 0x00000010UL
#endif
--- /dev/null
+/**********************************************************************
+ *
+ * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * The full GNU General Public License is included in this distribution in
+ * the file called "COPYING".
+ *
+ * Contact Information:
+ * Imagination Technologies Ltd. <gpl-support@imgtec.com>
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
+ *
+ ******************************************************************************/
+
+#include <stddef.h>
+#include <linux/io.h>
+
+#include "sgxdefs.h"
+#include "services_headers.h"
+#include "sgxapi_km.h"
+#include "sgxinfokm.h"
+#include "sgxutils.h"
+#include "pdump_km.h"
+
+enum PVR_DEVICE_POWER_STATE {
+
+ PVR_DEVICE_POWER_STATE_ON = 0,
+ PVR_DEVICE_POWER_STATE_IDLE = 1,
+ PVR_DEVICE_POWER_STATE_OFF = 2,
+
+ PVR_DEVICE_POWER_STATE_FORCE_I32 = 0x7fffffff
+};
+
+static enum PVR_DEVICE_POWER_STATE MapDevicePowerState(enum PVR_POWER_STATE
+ ePowerState)
+{
+ enum PVR_DEVICE_POWER_STATE eDevicePowerState;
+
+ switch (ePowerState) {
+ case PVRSRV_POWER_STATE_D0:
+ {
+ eDevicePowerState = PVR_DEVICE_POWER_STATE_ON;
+ break;
+ }
+ case PVRSRV_POWER_STATE_D3:
+ {
+ eDevicePowerState = PVR_DEVICE_POWER_STATE_OFF;
+ break;
+ }
+ default:
+ {
+ PVR_DPF(PVR_DBG_ERROR,
+ "MapDevicePowerState: Invalid state: %ld",
+ ePowerState);
+ eDevicePowerState = PVR_DEVICE_POWER_STATE_FORCE_I32;
+ PVR_DBG_BREAK;
+ }
+ }
+
+ return eDevicePowerState;
+}
+
+static void SGXGetTimingInfo(struct PVRSRV_DEVICE_NODE *psDeviceNode)
+{
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+ struct SGX_TIMING_INFORMATION sSGXTimingInfo = { 0 };
+ u32 ui32ActivePowManSampleRate;
+ struct timer_work_data *data = psDevInfo->hTimer;
+
+ SysGetSGXTimingInformation(&sSGXTimingInfo);
+
+ if (data) {
+ BUG_ON(data->armed);
+ /*
+ * The magic calculation below sets the hardware lock-up
+ * detection and recovery timer interval to ~150msecs.
+ * The interval length will be scaled based on the SGX
+ * functional clock frequency. The higher the frequency
+ * the shorter the interval and vice versa.
+ */
+ data->interval = 150 * SYS_SGX_PDS_TIMER_FREQ /
+ sSGXTimingInfo.ui32uKernelFreq;
+ }
+
+ writel(sSGXTimingInfo.ui32uKernelFreq /
+ sSGXTimingInfo.ui32HWRecoveryFreq,
+ &psDevInfo->psSGXHostCtl->ui32HWRecoverySampleRate);
+
+ psDevInfo->ui32CoreClockSpeed = sSGXTimingInfo.ui32CoreClockSpeed;
+ psDevInfo->ui32uKernelTimerClock =
+ sSGXTimingInfo.ui32CoreClockSpeed /
+ sSGXTimingInfo.ui32uKernelFreq;
+
+ ui32ActivePowManSampleRate =
+ sSGXTimingInfo.ui32uKernelFreq *
+ sSGXTimingInfo.ui32ActivePowManLatencyms / 1000;
+ ui32ActivePowManSampleRate += 1;
+ writel(ui32ActivePowManSampleRate,
+ &psDevInfo->psSGXHostCtl->ui32ActivePowManSampleRate);
+}
+
+void SGXStartTimer(struct PVRSRV_SGXDEV_INFO *psDevInfo, IMG_BOOL bStartOSTimer)
+{
+ u32 ui32RegVal;
+
+ ui32RegVal =
+ EUR_CR_EVENT_TIMER_ENABLE_MASK | psDevInfo->ui32uKernelTimerClock;
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_TIMER, ui32RegVal);
+ PDUMPREGWITHFLAGS(EUR_CR_EVENT_TIMER, ui32RegVal,
+ PDUMP_FLAGS_CONTINUOUS);
+
+ if (bStartOSTimer) {
+ enum PVRSRV_ERROR eError;
+
+ eError = SGXOSTimerEnable(psDevInfo->hTimer);
+ if (eError != PVRSRV_OK)
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXStartTimer : Failed to enable host timer");
+ }
+}
+
+static void SGXPollForClockGating(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ u32 ui32Register,
+ u32 ui32RegisterValue, char *pszComment)
+{
+ PVR_UNREFERENCED_PARAMETER(psDevInfo);
+ PVR_UNREFERENCED_PARAMETER(ui32Register);
+ PVR_UNREFERENCED_PARAMETER(ui32RegisterValue);
+ PVR_UNREFERENCED_PARAMETER(pszComment);
+
+#if !defined(NO_HARDWARE)
+ if (psDevInfo != NULL)
+ if (PollForValueKM
+ ((u32 __iomem *)psDevInfo->pvRegsBaseKM +
+ (ui32Register >> 2), 0,
+ ui32RegisterValue, MAX_HW_TIME_US / WAIT_TRY_COUNT,
+ WAIT_TRY_COUNT) != PVRSRV_OK)
+ PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: %s failed.",
+ pszComment);
+
+#endif
+
+ PDUMPCOMMENT(pszComment);
+ PDUMPREGPOL(ui32Register, 0, ui32RegisterValue);
+}
+
+static enum PVRSRV_ERROR SGXPrePowerState(void *hDevHandle,
+ enum PVR_DEVICE_POWER_STATE eNewPowerState,
+ enum PVR_DEVICE_POWER_STATE eCurrentPowerState)
+{
+ if ((eNewPowerState != eCurrentPowerState) &&
+ (eNewPowerState != PVR_DEVICE_POWER_STATE_ON)) {
+ enum PVRSRV_ERROR eError;
+ struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+ u32 ui32PowerCmd, ui32CompleteStatus;
+ struct SGXMKIF_COMMAND sCommand = { 0 };
+
+ eError = SGXOSTimerCancel(psDevInfo->hTimer);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXPrePowerState: Failed to disable timer");
+ return eError;
+ }
+
+ if (eNewPowerState == PVR_DEVICE_POWER_STATE_OFF) {
+
+ ui32PowerCmd = PVRSRV_POWERCMD_POWEROFF;
+ ui32CompleteStatus =
+ PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE;
+ PDUMPCOMMENT("SGX power off request");
+ } else {
+
+ ui32PowerCmd = PVRSRV_POWERCMD_IDLE;
+ ui32CompleteStatus =
+ PVRSRV_USSE_EDM_POWMAN_IDLE_COMPLETE;
+ PDUMPCOMMENT("SGX idle request");
+ }
+
+ sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_POWERCMD;
+ sCommand.ui32Data[1] = ui32PowerCmd;
+
+ eError =
+ SGXScheduleCCBCommand(psDevInfo, SGXMKIF_COMMAND_EDM_KICK,
+ &sCommand, KERNEL_ID, 0);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: "
+ "Failed to submit power down command");
+ return eError;
+ }
+
+#if !defined(NO_HARDWARE)
+ if (PollForValueKM(&psDevInfo->psSGXHostCtl->ui32PowerStatus,
+ ui32CompleteStatus,
+ ui32CompleteStatus,
+ MAX_HW_TIME_US / WAIT_TRY_COUNT,
+ WAIT_TRY_COUNT) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: "
+ "Wait for SGX ukernel power transition failed.");
+ PVR_DBG_BREAK;
+ }
+#endif
+
+#if defined(PDUMP)
+ PDUMPCOMMENT
+ ("TA/3D CCB Control - Wait for power event on uKernel.");
+ PDUMPMEMPOL(psDevInfo->psKernelSGXHostCtlMemInfo,
+ offsetof(struct SGXMKIF_HOST_CTL, ui32PowerStatus),
+ ui32CompleteStatus, ui32CompleteStatus,
+ PDUMP_POLL_OPERATOR_EQUAL, IMG_FALSE, IMG_FALSE,
+ MAKEUNIQUETAG(psDevInfo->
+ psKernelSGXHostCtlMemInfo));
+#endif
+
+ SGXPollForClockGating(psDevInfo,
+ psDevInfo->ui32ClkGateStatusReg,
+ psDevInfo->ui32ClkGateStatusMask,
+ "Wait for SGX clock gating");
+
+ if (eNewPowerState == PVR_DEVICE_POWER_STATE_OFF) {
+ eError = SGXDeinitialise(psDevInfo);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXPrePowerState: "
+ "SGXDeinitialise failed: %lu",
+ eError);
+ return eError;
+ }
+ }
+ }
+
+ return PVRSRV_OK;
+}
+
+static enum PVRSRV_ERROR SGXPostPowerState(void *hDevHandle,
+ enum PVR_DEVICE_POWER_STATE eNewPowerState,
+ enum PVR_DEVICE_POWER_STATE eCurrentPowerState)
+{
+ if ((eNewPowerState != eCurrentPowerState) &&
+ (eCurrentPowerState != PVR_DEVICE_POWER_STATE_ON)) {
+ enum PVRSRV_ERROR eError;
+ struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ psDevInfo->psSGXHostCtl;
+
+ writel(0, &psSGXHostCtl->ui32PowerStatus);
+ PDUMPCOMMENT("TA/3D CCB Control - Reset power status");
+#if defined(PDUMP)
+ PDUMPMEM(NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
+ offsetof(struct SGXMKIF_HOST_CTL, ui32PowerStatus),
+ sizeof(u32), PDUMP_FLAGS_CONTINUOUS,
+ MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
+#endif
+
+ if (eCurrentPowerState == PVR_DEVICE_POWER_STATE_OFF) {
+
+ SGXGetTimingInfo(psDeviceNode);
+
+ eError = SGXInitialise(psDevInfo, IMG_FALSE);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXPostPowerState: SGXInitialise failed");
+ return eError;
+ }
+ } else {
+
+ struct SGXMKIF_COMMAND sCommand = { 0 };
+
+ SGXStartTimer(psDevInfo, IMG_TRUE);
+
+ sCommand.ui32Data[0] =
+ PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD;
+ eError =
+ SGXScheduleCCBCommand(psDevInfo,
+ SGXMKIF_COMMAND_EDM_KICK,
+ &sCommand, ISR_ID, 0);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXPostPowerState failed to schedule CCB command: %lu",
+ eError);
+ return PVRSRV_ERROR_GENERIC;
+ }
+ }
+ }
+
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR SGXPrePowerStateExt(void *hDevHandle,
+ enum PVR_POWER_STATE eNewPowerState,
+ enum PVR_POWER_STATE eCurrentPowerState)
+{
+ enum PVR_DEVICE_POWER_STATE eNewDevicePowerState =
+ MapDevicePowerState(eNewPowerState);
+ enum PVR_DEVICE_POWER_STATE eCurrentDevicePowerState =
+ MapDevicePowerState(eCurrentPowerState);
+
+ return SGXPrePowerState(hDevHandle, eNewDevicePowerState,
+ eCurrentDevicePowerState);
+}
+
+enum PVRSRV_ERROR SGXPostPowerStateExt(void *hDevHandle,
+ enum PVR_POWER_STATE eNewPowerState,
+ enum PVR_POWER_STATE eCurrentPowerState)
+{
+ enum PVRSRV_ERROR eError;
+ enum PVR_DEVICE_POWER_STATE eNewDevicePowerState =
+ MapDevicePowerState(eNewPowerState);
+ enum PVR_DEVICE_POWER_STATE eCurrentDevicePowerState =
+ MapDevicePowerState(eCurrentPowerState);
+
+ eError =
+ SGXPostPowerState(hDevHandle, eNewDevicePowerState,
+ eCurrentDevicePowerState);
+ if (eError != PVRSRV_OK)
+ return eError;
+
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "SGXPostPowerState : SGX Power Transition from %d to %d OK",
+ eCurrentPowerState, eNewPowerState);
+
+ return eError;
+}
+
+enum PVRSRV_ERROR SGXPreClockSpeedChange(void *hDevHandle, IMG_BOOL bIdleDevice,
+ enum PVR_POWER_STATE eCurrentPowerState)
+{
+ enum PVRSRV_ERROR eError;
+ struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+
+ PVR_UNREFERENCED_PARAMETER(psDevInfo);
+
+ if (eCurrentPowerState == PVRSRV_POWER_STATE_D0)
+ if (bIdleDevice) {
+ PDUMPSUSPEND();
+ eError =
+ SGXPrePowerState(hDevHandle,
+ PVR_DEVICE_POWER_STATE_IDLE,
+ PVR_DEVICE_POWER_STATE_ON);
+ if (eError != PVRSRV_OK) {
+ PDUMPRESUME();
+ return eError;
+ }
+ }
+
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "SGXPreClockSpeedChange: SGX clock speed was %luHz",
+ psDevInfo->ui32CoreClockSpeed);
+
+ return PVRSRV_OK;
+}
+
+enum PVRSRV_ERROR SGXPostClockSpeedChange(void *hDevHandle,
+ IMG_BOOL bIdleDevice,
+ enum PVR_POWER_STATE eCurrentPowerState)
+{
+ struct PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+ u32 ui32OldClockSpeed = psDevInfo->ui32CoreClockSpeed;
+
+ PVR_UNREFERENCED_PARAMETER(ui32OldClockSpeed);
+
+ if (eCurrentPowerState == PVRSRV_POWER_STATE_D0) {
+ SGXGetTimingInfo(psDeviceNode);
+ if (bIdleDevice) {
+ enum PVRSRV_ERROR eError;
+ eError =
+ SGXPostPowerState(hDevHandle,
+ PVR_DEVICE_POWER_STATE_ON,
+ PVR_DEVICE_POWER_STATE_IDLE);
+ PDUMPRESUME();
+ if (eError != PVRSRV_OK)
+ return eError;
+ } else {
+ SGXStartTimer(psDevInfo, IMG_TRUE);
+ }
+
+ }
+
+ PVR_DPF(PVR_DBG_MESSAGE, "SGXPostClockSpeedChange: "
+ "SGX clock speed changed from %luHz to %luHz",
+ ui32OldClockSpeed, psDevInfo->ui32CoreClockSpeed);
+
+ return PVRSRV_OK;
+}
#include "pdump_km.h"
-#define SGX_BIF_DIR_LIST_REG_EDM EUR_CR_BIF_DIR_LIST_BASE0
-
static void SGXResetSoftReset(struct PVRSRV_SGXDEV_INFO *psDevInfo,
IMG_BOOL bResetBIF, u32 ui32PDUMPFlags,
IMG_BOOL bPDump)
{
u32 ui32SoftResetRegVal =
-#ifdef EUR_CR_SOFT_RESET_TWOD_RESET_MASK
- EUR_CR_SOFT_RESET_TWOD_RESET_MASK |
-#endif
EUR_CR_SOFT_RESET_DPM_RESET_MASK |
EUR_CR_SOFT_RESET_TA_RESET_MASK |
EUR_CR_SOFT_RESET_USE_RESET_MASK |
EUR_CR_SOFT_RESET_ISP_RESET_MASK | EUR_CR_SOFT_RESET_TSP_RESET_MASK;
+#ifdef EUR_CR_SOFT_RESET_TWOD_RESET_MASK
+ ui32SoftResetRegVal |= EUR_CR_SOFT_RESET_TWOD_RESET_MASK;
+#endif
+
#if !defined(PDUMP)
PVR_UNREFERENCED_PARAMETER(ui32PDUMPFlags);
#endif
PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags);
SGXResetSleep(psDevInfo, ui32PDUMPFlags, bPDump);
- {
-
- if (PollForValueKM
- ((u32 *)((u8 __force *)psDevInfo->pvRegsBaseKM +
- EUR_CR_BIF_MEM_REQ_STAT), 0,
- EUR_CR_BIF_MEM_REQ_STAT_READS_MASK,
- MAX_HW_TIME_US / WAIT_TRY_COUNT,
- WAIT_TRY_COUNT) != PVRSRV_OK)
- PVR_DPF(PVR_DBG_ERROR,
- "Wait for DC invalidate failed.");
-
- if (bPDump)
- PDUMPREGPOLWITHFLAGS(EUR_CR_BIF_MEM_REQ_STAT, 0,
- EUR_CR_BIF_MEM_REQ_STAT_READS_MASK,
- ui32PDUMPFlags);
+ if (PollForValueKM(
+ (u32 __iomem *)((u8 __iomem *)psDevInfo->pvRegsBaseKM +
+ EUR_CR_BIF_MEM_REQ_STAT),
+ 0, EUR_CR_BIF_MEM_REQ_STAT_READS_MASK,
+ MAX_HW_TIME_US / WAIT_TRY_COUNT, WAIT_TRY_COUNT) != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "Wait for DC invalidate failed.");
+ PVR_DBG_BREAK;
}
+
+ if (bPDump)
+ PDUMPREGPOLWITHFLAGS(EUR_CR_BIF_MEM_REQ_STAT, 0,
+ EUR_CR_BIF_MEM_REQ_STAT_READS_MASK,
+ ui32PDUMPFlags);
}
void SGXReset(struct PVRSRV_SGXDEV_INFO *psDevInfo, u32 ui32PDUMPFlags)
PDUMPCOMMENTWITHFLAGS(ui32PDUMPFlags,
"Start of SGX reset sequence\r\n");
-#if defined(FIX_HW_BRN_23944)
-
- ui32RegVal = EUR_CR_BIF_CTRL_PAUSE_MASK;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32RegVal);
- PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags);
-
- SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE);
-
- ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_INT_STAT);
- if (ui32RegVal & ui32BifFaultMask) {
-
- ui32RegVal =
- EUR_CR_BIF_CTRL_PAUSE_MASK |
- EUR_CR_BIF_CTRL_CLEAR_FAULT_MASK;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL,
- ui32RegVal);
- PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags);
-
- SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE);
-
- ui32RegVal = EUR_CR_BIF_CTRL_PAUSE_MASK;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL,
- ui32RegVal);
- PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags);
-
- SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE);
- }
-#endif
-
SGXResetSoftReset(psDevInfo, IMG_TRUE, ui32PDUMPFlags, IMG_TRUE);
SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE);
IMG_FALSE);
psDevInfo->pui32BIFResetPD[ui32PDIndex] =
- psDevInfo->sBIFResetPTDevPAddr.uiAddr | SGX_MMU_PDE_VALID;
+ psDevInfo->sBIFResetPTDevPAddr.uiAddr |
+ SGX_MMU_PDE_PAGE_SIZE_4K | SGX_MMU_PDE_VALID;
psDevInfo->pui32BIFResetPT[ui32PTIndex] =
psDevInfo->sBIFResetPageDevPAddr.uiAddr | SGX_MMU_PTE_VALID;
psDevInfo->pui32BIFResetPT[ui32PTIndex] = 0;
}
+ {
+ u32 ui32EDMDirListReg;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, SGX_BIF_DIR_LIST_REG_EDM,
- psDevInfo->sKernelPDDevPAddr.uiAddr);
- PDUMPPDREGWITHFLAGS(SGX_BIF_DIR_LIST_REG_EDM,
- psDevInfo->sKernelPDDevPAddr.uiAddr, ui32PDUMPFlags,
- PDUMP_PD_UNIQUETAG);
+#if (SGX_BIF_DIR_LIST_INDEX_EDM == 0)
+ ui32EDMDirListReg = EUR_CR_BIF_DIR_LIST_BASE0;
+#else
+ ui32EDMDirListReg =
+ EUR_CR_BIF_DIR_LIST_BASE1 +
+ 4 * (SGX_BIF_DIR_LIST_INDEX_EDM - 1);
+#endif
+
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32EDMDirListReg,
+ psDevInfo->sKernelPDDevPAddr.uiAddr);
+ PDUMPPDREGWITHFLAGS(ui32EDMDirListReg,
+ psDevInfo->sKernelPDDevPAddr.uiAddr,
+ ui32PDUMPFlags, PDUMP_PD_UNIQUETAG);
+ }
SGXResetInvalDC(psDevInfo, ui32PDUMPFlags, IMG_TRUE);
- PVR_DPF(PVR_DBG_WARNING, "Soft Reset of SGX");
+ PVR_DPF(PVR_DBG_MESSAGE, "Soft Reset of SGX");
SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE);
ui32RegVal = 0;
};
struct SGX_INIT_SCRIPTS {
- union SGX_INIT_COMMAND asInitCommands[SGX_MAX_INIT_COMMANDS];
+ union SGX_INIT_COMMAND asInitCommandsPart1[SGX_MAX_INIT_COMMANDS];
+ union SGX_INIT_COMMAND asInitCommandsPart2[SGX_MAX_INIT_COMMANDS];
union SGX_INIT_COMMAND asDeinitCommands[SGX_MAX_DEINIT_COMMANDS];
};
{
struct PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo =
(struct PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo;
- struct PVRSRV_SGX_COMMAND sCommand = { 0 };
- struct PVR3DIF4_TRANSFERCMD_SHARED *psTransferCmd;
+ struct SGXMKIF_COMMAND sCommand = { 0 };
+ struct SGXMKIF_TRANSFERCMD_SHARED *psSharedTransferCmd;
struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
- u32 i;
enum PVRSRV_ERROR eError;
if (!CCB_OFFSET_IS_VALID
- (struct PVR3DIF4_TRANSFERCMD_SHARED, psCCBMemInfo, psKick,
+ (struct SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick,
ui32SharedCmdCCBOffset)) {
PVR_DPF(PVR_DBG_ERROR,
"SGXSubmitTransferKM: Invalid CCB offset");
return PVRSRV_ERROR_INVALID_PARAMS;
}
- psTransferCmd = CCB_DATA_FROM_OFFSET(struct PVR3DIF4_TRANSFERCMD_SHARED,
- psCCBMemInfo, psKick,
- ui32SharedCmdCCBOffset);
- if (psTransferCmd->ui32NumStatusVals > SGXTQ_MAX_STATUS)
- return PVRSRV_ERROR_INVALID_PARAMS;
-
- if (psKick->ui32StatusFirstSync +
- (psKick->ui32NumSrcSync ? (psKick->ui32NumSrcSync - 1) : 0) +
- (psKick->ui32NumDstSync ? (psKick->ui32NumDstSync - 1) : 0) >
- psTransferCmd->ui32NumStatusVals)
- return PVRSRV_ERROR_INVALID_PARAMS;
+ psSharedTransferCmd =
+ CCB_DATA_FROM_OFFSET(struct SGXMKIF_TRANSFERCMD_SHARED,
+ psCCBMemInfo, psKick, ui32SharedCmdCCBOffset);
if (psKick->hTASyncInfo != NULL) {
psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
psKick->hTASyncInfo;
- psTransferCmd->ui32TASyncWriteOpsPendingVal =
+ psSharedTransferCmd->ui32TASyncWriteOpsPendingVal =
psSyncInfo->psSyncData->ui32WriteOpsPending++;
- psTransferCmd->ui32TASyncReadOpsPendingVal =
+ psSharedTransferCmd->ui32TASyncReadOpsPendingVal =
psSyncInfo->psSyncData->ui32ReadOpsPending;
- psTransferCmd->sTASyncWriteOpsCompleteDevVAddr =
+ psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr =
psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTransferCmd->sTASyncReadOpsCompleteDevVAddr =
+ psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr =
psSyncInfo->sReadOpsCompleteDevVAddr;
} else {
- psTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0;
- psTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0;
+ psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0;
+ psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0;
}
if (psKick->h3DSyncInfo != NULL) {
psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
psKick->h3DSyncInfo;
- psTransferCmd->ui323DSyncWriteOpsPendingVal =
+ psSharedTransferCmd->ui323DSyncWriteOpsPendingVal =
psSyncInfo->psSyncData->ui32WriteOpsPending++;
- psTransferCmd->ui323DSyncReadOpsPendingVal =
+ psSharedTransferCmd->ui323DSyncReadOpsPendingVal =
psSyncInfo->psSyncData->ui32ReadOpsPending;
- psTransferCmd->s3DSyncWriteOpsCompleteDevVAddr =
+ psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr =
psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTransferCmd->s3DSyncReadOpsCompleteDevVAddr =
+ psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr =
psSyncInfo->sReadOpsCompleteDevVAddr;
} else {
- psTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0;
- psTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
+ psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0;
+ psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
}
- psTransferCmd->ui32NumSrcSync = psKick->ui32NumSrcSync;
- psTransferCmd->ui32NumDstSync = psKick->ui32NumDstSync;
-
- if (psKick->ui32NumSrcSync > 0) {
- psSyncInfo =
- (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[0];
-
- psTransferCmd->ui32SrcWriteOpPendingVal =
- psSyncInfo->psSyncData->ui32WriteOpsPending;
- psTransferCmd->ui32SrcReadOpPendingVal =
- psSyncInfo->psSyncData->ui32ReadOpsPending;
-
- psTransferCmd->sSrcWriteOpsCompleteDevAddr =
- psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTransferCmd->sSrcReadOpsCompleteDevAddr =
- psSyncInfo->sReadOpsCompleteDevVAddr;
- }
- if (psKick->ui32NumDstSync > 0) {
- psSyncInfo =
- (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0];
+ if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL) {
+ if (psKick->ui32NumSrcSync > 0) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)
+ psKick->ahSrcSyncInfo[0];
- psTransferCmd->ui32DstWriteOpPendingVal =
- psSyncInfo->psSyncData->ui32WriteOpsPending;
- psTransferCmd->ui32DstReadOpPendingVal =
- psSyncInfo->psSyncData->ui32ReadOpsPending;
+ psSharedTransferCmd->ui32SrcWriteOpPendingVal =
+ psSyncInfo->psSyncData->ui32WriteOpsPending;
+ psSharedTransferCmd->ui32SrcReadOpPendingVal =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
- psTransferCmd->sDstWriteOpsCompleteDevAddr =
- psSyncInfo->sWriteOpsCompleteDevVAddr;
- psTransferCmd->sDstReadOpsCompleteDevAddr =
- psSyncInfo->sReadOpsCompleteDevVAddr;
- }
+ psSharedTransferCmd->sSrcWriteOpsCompleteDevAddr =
+ psSyncInfo->sWriteOpsCompleteDevVAddr;
+ psSharedTransferCmd->sSrcReadOpsCompleteDevAddr =
+ psSyncInfo->sReadOpsCompleteDevVAddr;
+ }
+ if (psKick->ui32NumDstSync > 0) {
+ psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
+ psKick->ahDstSyncInfo[0];
+ psSharedTransferCmd->ui32DstWriteOpPendingVal =
+ psSyncInfo->psSyncData->ui32WriteOpsPending;
+ psSharedTransferCmd->ui32DstReadOpPendingVal =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
+ psSharedTransferCmd->sDstWriteOpsCompleteDevAddr =
+ psSyncInfo->sWriteOpsCompleteDevVAddr;
+ psSharedTransferCmd->sDstReadOpsCompleteDevAddr =
+ psSyncInfo->sReadOpsCompleteDevVAddr;
+ }
- if (psKick->ui32NumSrcSync > 0) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
+ if (psKick->ui32NumSrcSync > 0) {
+ psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
psKick->ahSrcSyncInfo[0];
- psSyncInfo->psSyncData->ui32ReadOpsPending++;
-
- }
- if (psKick->ui32NumDstSync > 0) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psKick->ahDstSyncInfo[0];
- psSyncInfo->psSyncData->ui32WriteOpsPending++;
- }
+ psSyncInfo->psSyncData->ui32ReadOpsPending++;
- if (psKick->ui32NumSrcSync > 1)
- for (i = 1; i < psKick->ui32NumSrcSync; i++) {
+ }
+ if (psKick->ui32NumDstSync > 0) {
psSyncInfo =
(struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
- ahSrcSyncInfo[i];
-
- psTransferCmd->sCtlStatusInfo[psKick->
- ui32StatusFirstSync].ui32StatusValue =
- psSyncInfo->psSyncData->ui32ReadOpsPending++;
-
- psTransferCmd->sCtlStatusInfo[psKick->
- ui32StatusFirstSync].sStatusDevAddr =
- psSyncInfo->sReadOpsCompleteDevVAddr;
-
- psKick->ui32StatusFirstSync++;
+ ahDstSyncInfo[0];
+ psSyncInfo->psSyncData->ui32WriteOpsPending++;
}
+ }
- if (psKick->ui32NumDstSync > 1)
- for (i = 1; i < psKick->ui32NumDstSync; i++) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psKick->ahDstSyncInfo[i];
-
- psTransferCmd->sCtlStatusInfo[psKick->
- ui32StatusFirstSync].ui32StatusValue =
- psSyncInfo->psSyncData->ui32WriteOpsPending++;
-
- psTransferCmd->sCtlStatusInfo[psKick->
- ui32StatusFirstSync].sStatusDevAddr =
- psSyncInfo->sWriteOpsCompleteDevVAddr;
-
- psKick->ui32StatusFirstSync++;
- }
+ if (psKick->ui32NumDstSync > 1 || psKick->ui32NumSrcSync > 1) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "Transfer command doesn't support "
+ "more than 1 sync object per src/dst\ndst: %d, src: %d",
+ psKick->ui32NumDstSync, psKick->ui32NumSrcSync);
+ }
#if defined(PDUMP)
- if (PDumpIsCaptureFrameKM()) {
+ if (PDumpIsCaptureFrameKM() ||
+ ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0)) {
PDUMPCOMMENT("Shared part of transfer command\r\n");
- PDUMPMEM(psTransferCmd, psCCBMemInfo, psKick->ui32CCBDumpWOff,
- sizeof(struct PVR3DIF4_TRANSFERCMD_SHARED), 0,
- MAKEUNIQUETAG(psCCBMemInfo));
-
- if (psKick->ui32NumSrcSync > 0) {
+ PDUMPMEM(psSharedTransferCmd,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff,
+ sizeof(struct SGXMKIF_TRANSFERCMD_SHARED),
+ psKick->ui32PDumpFlags, MAKEUNIQUETAG(psCCBMemInfo));
+
+ if ((psKick->ui32NumSrcSync > 0) &&
+ ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+ 0UL)) {
psSyncInfo = psKick->ahSrcSyncInfo[0];
PDUMPCOMMENT
("Hack src surface write op in transfer cmd\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
- psCCBMemInfo, psKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_TRANSFERCMD_SHARED,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff +
+ offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
ui32SrcWriteOpPendingVal),
sizeof(psSyncInfo->psSyncData->
- ui32LastOpDumpVal), 0,
+ ui32LastOpDumpVal),
+ psKick->ui32PDumpFlags,
MAKEUNIQUETAG(psCCBMemInfo));
PDUMPCOMMENT
("Hack src surface read op in transfer cmd\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
- psCCBMemInfo, psKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_TRANSFERCMD_SHARED,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff +
+ offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
ui32SrcReadOpPendingVal),
sizeof(psSyncInfo->psSyncData->
- ui32LastReadOpDumpVal), 0,
+ ui32LastReadOpDumpVal),
+ psKick->ui32PDumpFlags,
MAKEUNIQUETAG(psCCBMemInfo));
}
- if (psKick->ui32NumDstSync > 0) {
+ if ((psKick->ui32NumDstSync > 0) &&
+ ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+ 0UL)) {
psSyncInfo = psKick->ahDstSyncInfo[0];
PDUMPCOMMENT
("Hack dest surface write op in transfer cmd\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
- psCCBMemInfo, psKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_TRANSFERCMD_SHARED,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff +
+ offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
ui32DstWriteOpPendingVal),
sizeof(psSyncInfo->psSyncData->
- ui32LastOpDumpVal), 0,
+ ui32LastOpDumpVal),
+ psKick->ui32PDumpFlags,
MAKEUNIQUETAG(psCCBMemInfo));
PDUMPCOMMENT
("Hack dest surface read op in transfer cmd\r\n");
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
- psCCBMemInfo, psKick->ui32CCBDumpWOff +
- offsetof(struct PVR3DIF4_TRANSFERCMD_SHARED,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff +
+ offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
ui32DstReadOpPendingVal),
sizeof(psSyncInfo->psSyncData->
- ui32LastReadOpDumpVal), 0,
+ ui32LastReadOpDumpVal),
+ psKick->ui32PDumpFlags,
MAKEUNIQUETAG(psCCBMemInfo));
}
- if (psKick->ui32NumSrcSync > 0) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psKick->ahSrcSyncInfo[0];
+ if ((psKick->ui32NumSrcSync > 0) &&
+ ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+ 0UL)) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+ ahSrcSyncInfo[0];
psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
}
- if (psKick->ui32NumDstSync > 0) {
- psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
- psKick->ahDstSyncInfo[0];
+
+ if ((psKick->ui32NumDstSync > 0) &&
+ ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+ 0UL)) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+ ahDstSyncInfo[0];
psSyncInfo->psSyncData->ui32LastOpDumpVal++;
}
}
sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_TRANSFERCMD;
sCommand.ui32Data[1] = psKick->sHWTransferContextDevVAddr.uiAddr;
- eError =
- SGXScheduleCCBCommandKM(hDevHandle, PVRSRV_SGX_COMMAND_EDM_KICK,
- &sCommand, KERNEL_ID);
+ eError = SGXScheduleCCBCommandKM(hDevHandle, SGXMKIF_COMMAND_EDM_KICK,
+ &sCommand, KERNEL_ID,
+ psKick->ui32PDumpFlags);
+
+#if defined(NO_HARDWARE)
+ if (!(psKick->ui32Flags & SGXMKIF_TQFLAGS_NOSYNCUPDATE)) {
+ u32 i;
+ for (i = 0; i < psKick->ui32NumSrcSync; i++) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+ ahSrcSyncInfo[i];
+ psSyncInfo->psSyncData->ui32ReadOpsComplete =
+ psSyncInfo->psSyncData->ui32ReadOpsPending;
+ }
+
+ for (i = 0; i < psKick->ui32NumDstSync; i++) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+ ahDstSyncInfo[i];
+ psSyncInfo->psSyncData->ui32WriteOpsComplete =
+ psSyncInfo->psSyncData->ui32WriteOpsPending;
+
+ }
+
+ if (psKick->hTASyncInfo != NULL) {
+ psSyncInfo =
+ (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+ hTASyncInfo;
+
+ psSyncInfo->psSyncData->ui32WriteOpsComplete =
+ psSyncInfo->psSyncData->ui32WriteOpsPending;
+ }
+
+ if (psKick->h3DSyncInfo != NULL) {
+ psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+ h3DSyncInfo;
+
+ psSyncInfo->psSyncData->ui32WriteOpsComplete =
+ psSyncInfo->psSyncData->ui32WriteOpsPending;
+ }
+ }
+#endif
return eError;
}
#include "sgxutils.h"
#include <linux/tty.h>
+#include <linux/io.h>
-
-static IMG_BOOL gbPowerUpPDumped = IMG_FALSE;
+static void SGXPostActivePowerEvent(struct PVRSRV_DEVICE_NODE *psDeviceNode,
+ u32 ui32CallerID)
+{
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ psDevInfo->psSGXHostCtl;
+ u32 l;
+
+ l = readl(&psSGXHostCtl->ui32NumActivePowerEvents);
+ l++;
+ writel(l, &psSGXHostCtl->ui32NumActivePowerEvents);
+
+ l = readl(&psSGXHostCtl->ui32PowerStatus);
+ if (l & PVRSRV_USSE_EDM_POWMAN_POWEROFF_RESTART_IMMEDIATE) {
+ if (ui32CallerID == ISR_ID)
+ psDeviceNode->bReProcessDeviceCommandComplete =
+ IMG_TRUE;
+ else
+ SGXScheduleProcessQueuesKM(psDeviceNode);
+ }
+}
void SGXTestActivePowerEvent(struct PVRSRV_DEVICE_NODE *psDeviceNode,
u32 ui32CallerID)
{
enum PVRSRV_ERROR eError = PVRSRV_OK;
struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl = psDevInfo->psSGXHostCtl;
-
- if ((psSGXHostCtl->ui32InterruptFlags &
- PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER) &&
- !(psSGXHostCtl->ui32PowManFlags &
- PVRSRV_USSE_EDM_POWMAN_POWEROFF_REQUEST)) {
- PDUMPSUSPEND();
- eError = PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.
- ui32DeviceIndex, PVRSRV_POWER_STATE_D3,
- ui32CallerID, IMG_FALSE);
- if (eError == PVRSRV_OK) {
- psSGXHostCtl->ui32NumActivePowerEvents++;
- if ((*(volatile u32 *)(&psSGXHostCtl->ui32PowManFlags) &
- PVRSRV_USSE_EDM_POWMAN_POWEROFF_RESTART_IMMEDIATE)
- != 0) {
- if (ui32CallerID == ISR_ID)
- psDeviceNode->
- bReProcessDeviceCommandComplete =
- IMG_TRUE;
- else
- SGXScheduleProcessQueues
- (psDeviceNode);
- }
- }
- if (eError == PVRSRV_ERROR_RETRY)
- eError = PVRSRV_OK;
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl = psDevInfo->psSGXHostCtl;
+ u32 l;
+
+ l = readl(&psSGXHostCtl->ui32InterruptFlags);
+ if (!(l & PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER))
+ return;
+
+ l = readl(&psSGXHostCtl->ui32InterruptClearFlags);
+ if (l & PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER)
+ return;
+
+ /* Microkernel is idle and is requesting to be powered down. */
+ l = readl(&psSGXHostCtl->ui32InterruptClearFlags);
+ l |= PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER;
+ writel(l, &psSGXHostCtl->ui32InterruptClearFlags);
- PDUMPRESUME();
+ PDUMPSUSPEND();
+
+ eError = PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.
+ ui32DeviceIndex,
+ PVRSRV_POWER_STATE_D3,
+ ui32CallerID, IMG_FALSE);
+ if (eError == PVRSRV_OK)
+ SGXPostActivePowerEvent(psDeviceNode, ui32CallerID);
+ if (eError == PVRSRV_ERROR_RETRY) {
+ l = readl(&psSGXHostCtl->ui32InterruptClearFlags);
+ l &= ~PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER;
+ writel(l, &psSGXHostCtl->ui32InterruptClearFlags);
+ eError = PVRSRV_OK;
}
+ PDUMPRESUME();
+
if (eError != PVRSRV_OK)
PVR_DPF(PVR_DBG_ERROR, "SGXTestActivePowerEvent error:%lu",
eError);
}
-static inline struct PVRSRV_SGX_COMMAND *SGXAcquireKernelCCBSlot(
+static inline struct SGXMKIF_COMMAND *SGXAcquireKernelCCBSlot(
struct PVRSRV_SGX_CCB_INFO *psCCB)
{
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0;
-
- do {
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
if (((*psCCB->pui32WriteOffset + 1) & 255) !=
- *psCCB->pui32ReadOffset)
+ *psCCB->pui32ReadOffset) {
return &psCCB->psCommands[*psCCB->pui32WriteOffset];
-
- if (bStart == IMG_FALSE) {
- bStart = IMG_TRUE;
- uiStart = OSClockus();
}
- OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- } while ((OSClockus() - uiStart) < MAX_HW_TIME_US);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
return NULL;
}
-enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
- struct PVRSRV_DEVICE_NODE *psDeviceNode,
- enum PVRSRV_SGX_COMMAND_TYPE eCommandType,
- struct PVRSRV_SGX_COMMAND *psCommandData,
- u32 ui32CallerID)
+enum PVRSRV_ERROR SGXScheduleCCBCommand(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ enum SGXMKIF_COMMAND_TYPE eCommandType,
+ struct SGXMKIF_COMMAND *psCommandData,
+ u32 ui32CallerID, u32 ui32PDumpFlags)
{
struct PVRSRV_SGX_CCB_INFO *psKernelCCB;
enum PVRSRV_ERROR eError = PVRSRV_OK;
- struct PVRSRV_SGXDEV_INFO *psDevInfo;
- struct PVRSRV_SGX_COMMAND *psSGXCommand;
+ struct SGXMKIF_COMMAND *psSGXCommand;
#if defined(PDUMP)
void *pvDumpCommand;
+#else
+ PVR_UNREFERENCED_PARAMETER(ui32CallerID);
+ PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags);
#endif
- psDevInfo = (struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
psKernelCCB = psDevInfo->psKernelCCBInfo;
- {
- if (ui32CallerID == ISR_ID || gbPowerUpPDumped)
- PDUMPSUSPEND();
-
- eError =
- PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.
- ui32DeviceIndex,
- PVRSRV_POWER_STATE_D0,
- ui32CallerID, IMG_TRUE);
-
- if (ui32CallerID == ISR_ID || gbPowerUpPDumped)
- PDUMPRESUME();
- else if (eError == PVRSRV_OK)
- gbPowerUpPDumped = IMG_TRUE;
- }
-
- if (eError == PVRSRV_OK) {
- psDeviceNode->bReProcessDeviceCommandComplete = IMG_FALSE;
- } else {
- if (eError == PVRSRV_ERROR_RETRY)
- if (ui32CallerID == ISR_ID) {
-
- psDeviceNode->bReProcessDeviceCommandComplete =
- IMG_TRUE;
- eError = PVRSRV_OK;
- } else {
-
- }
- else
- PVR_DPF(PVR_DBG_ERROR,
- "SGXScheduleCCBCommandKM failed to acquire lock - "
- "ui32CallerID:%ld eError:%lu", ui32CallerID,
- eError);
-
- return eError;
- }
-
psSGXCommand = SGXAcquireKernelCCBSlot(psKernelCCB);
if (!psSGXCommand) {
*psSGXCommand = *psCommandData;
switch (eCommandType) {
- case PVRSRV_SGX_COMMAND_EDM_KICK:
- psSGXCommand->ui32ServiceAddress = psDevInfo->ui32TAKickAddress;
+ case SGXMKIF_COMMAND_EDM_KICK:
+ psSGXCommand->ui32ServiceAddress =
+ psDevInfo->ui32HostKickAddress;
break;
- case PVRSRV_SGX_COMMAND_VIDEO_KICK:
+ case SGXMKIF_COMMAND_REQUEST_SGXMISCINFO:
psSGXCommand->ui32ServiceAddress =
- psDevInfo->ui32VideoHandlerAddress;
+ psDevInfo->ui32GetMiscInfoAddress;
break;
+ case SGXMKIF_COMMAND_VIDEO_KICK:
default:
PVR_DPF(PVR_DBG_ERROR,
"SGXScheduleCCBCommandKM: Unknown command type: %d",
#if defined(PDUMP)
if (ui32CallerID != ISR_ID) {
-
PDUMPCOMMENTWITHFLAGS(0,
"Poll for space in the Kernel CCB\r\n");
PDUMPMEMPOL(psKernelCCB->psCCBCtlMemInfo,
PDUMPCOMMENTWITHFLAGS(0, "Kernel CCB command\r\n");
pvDumpCommand =
- (void *) ((u8 *) psKernelCCB->psCCBMemInfo->
+ (void *)((u8 *)psKernelCCB->psCCBMemInfo->
pvLinAddrKM +
(*psKernelCCB->pui32WriteOffset *
- sizeof(struct PVRSRV_SGX_COMMAND)));
+ sizeof(struct SGXMKIF_COMMAND)));
PDUMPMEM(pvDumpCommand,
psKernelCCB->psCCBMemInfo,
psKernelCCB->ui32CCBDumpWOff *
- sizeof(struct PVRSRV_SGX_COMMAND),
- sizeof(struct PVRSRV_SGX_COMMAND),
- 0, MAKEUNIQUETAG(psKernelCCB->psCCBMemInfo));
+ sizeof(struct SGXMKIF_COMMAND),
+ sizeof(struct SGXMKIF_COMMAND), ui32PDumpFlags,
+ MAKEUNIQUETAG(psKernelCCB->psCCBMemInfo));
PDUMPMEM(&psDevInfo->sPDContext.ui32CacheControl,
psKernelCCB->psCCBMemInfo,
psKernelCCB->ui32CCBDumpWOff *
- sizeof(struct PVRSRV_SGX_COMMAND) +
- offsetof(struct PVRSRV_SGX_COMMAND, ui32Data[2]),
- sizeof(u32), 0,
+ sizeof(struct SGXMKIF_COMMAND) +
+ offsetof(struct SGXMKIF_COMMAND, ui32Data[2]),
+ sizeof(u32), ui32PDumpFlags,
MAKEUNIQUETAG(psKernelCCB->psCCBMemInfo));
- if (PDumpIsCaptureFrameKM())
+ if (PDumpIsCaptureFrameKM() ||
+ ((ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
psDevInfo->sPDContext.ui32CacheControl = 0;
}
#endif
#if defined(PDUMP)
if (ui32CallerID != ISR_ID) {
- if (PDumpIsCaptureFrameKM())
+ if (PDumpIsCaptureFrameKM() ||
+ ((ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
psKernelCCB->ui32CCBDumpWOff =
(psKernelCCB->ui32CCBDumpWOff + 1) & 0xFF;
PDUMPMEM(&psKernelCCB->ui32CCBDumpWOff,
psKernelCCB->psCCBCtlMemInfo,
offsetof(struct PVRSRV_SGX_CCB_CTL, ui32WriteOffset),
- sizeof(u32),
- 0, MAKEUNIQUETAG(psKernelCCB->psCCBCtlMemInfo));
+ sizeof(u32), ui32PDumpFlags,
+ MAKEUNIQUETAG(psKernelCCB->psCCBCtlMemInfo));
PDUMPCOMMENTWITHFLAGS(0, "Kernel CCB event kicker\r\n");
PDUMPMEM(&psKernelCCB->ui32CCBDumpWOff,
- psDevInfo->psKernelCCBEventKickerMemInfo,
- 0,
- sizeof(u32),
- 0,
+ psDevInfo->psKernelCCBEventKickerMemInfo, 0,
+ sizeof(u32), ui32PDumpFlags,
MAKEUNIQUETAG(psDevInfo->
psKernelCCBEventKickerMemInfo));
PDUMPCOMMENTWITHFLAGS(0, "Event kick\r\n");
- PDUMPREGWITHFLAGS(EUR_CR_EVENT_KICK, EUR_CR_EVENT_KICK_NOW_MASK,
- 0);
+ PDUMPREGWITHFLAGS(SGX_MP_CORE_SELECT(EUR_CR_EVENT_KICK, 0),
+ EUR_CR_EVENT_KICK_NOW_MASK, 0);
}
#endif
*psDevInfo->pui32KernelCCBEventKicker =
(*psDevInfo->pui32KernelCCBEventKicker + 1) & 0xFF;
- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_KICK,
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM,
+ SGX_MP_CORE_SELECT(EUR_CR_EVENT_KICK, 0),
EUR_CR_EVENT_KICK_NOW_MASK);
+#if defined(NO_HARDWARE)
+
+ *psKernelCCB->pui32ReadOffset =
+ (*psKernelCCB->pui32ReadOffset + 1) & 255;
+#endif
+
Exit:
+ return eError;
+}
+
+enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
+ struct PVRSRV_DEVICE_NODE *psDeviceNode,
+ enum SGXMKIF_COMMAND_TYPE eCommandType,
+ struct SGXMKIF_COMMAND *psCommandData,
+ u32 ui32CallerID, u32 ui32PDumpFlags)
+{
+ enum PVRSRV_ERROR eError;
+ struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+
+ PDUMPSUSPEND();
+
+ eError =
+ PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex,
+ PVRSRV_POWER_STATE_D0, ui32CallerID,
+ IMG_TRUE);
+
+ PDUMPRESUME();
+
+ if (eError == PVRSRV_OK) {
+ psDeviceNode->bReProcessDeviceCommandComplete = IMG_FALSE;
+ } else {
+ if (eError == PVRSRV_ERROR_RETRY) {
+ if (ui32CallerID == ISR_ID) {
+ psDeviceNode->bReProcessDeviceCommandComplete =
+ IMG_TRUE;
+ eError = PVRSRV_OK;
+ } else {
+
+ }
+ } else
+ PVR_DPF(PVR_DBG_ERROR, "SGXScheduleCCBCommandKM "
+ "failed to acquire lock - "
+ "ui32CallerID:%ld eError:%lu",
+ ui32CallerID, eError);
+ return eError;
+ }
+
+ eError = SGXScheduleCCBCommand(psDevInfo, eCommandType, psCommandData,
+ ui32CallerID, ui32PDumpFlags);
+
PVRSRVPowerUnlock(ui32CallerID);
if (ui32CallerID != ISR_ID)
-
SGXTestActivePowerEvent(psDeviceNode, ui32CallerID);
return eError;
}
-void SGXScheduleProcessQueues(struct PVRSRV_DEVICE_NODE *psDeviceNode)
+enum PVRSRV_ERROR SGXScheduleProcessQueuesKM(struct PVRSRV_DEVICE_NODE
+ *psDeviceNode)
{
enum PVRSRV_ERROR eError;
struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
- struct PVRSRV_SGX_HOST_CTL *psHostCtl =
+ struct SGXMKIF_HOST_CTL *psHostCtl =
psDevInfo->psKernelSGXHostCtlMemInfo->pvLinAddrKM;
- u32 ui32PowManFlags;
- struct PVRSRV_SGX_COMMAND sCommand = { 0 };
+ u32 ui32PowerStatus;
+ struct SGXMKIF_COMMAND sCommand = { 0 };
- ui32PowManFlags = psHostCtl->ui32PowManFlags;
- if ((ui32PowManFlags & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0)
- return;
+ ui32PowerStatus = psHostCtl->ui32PowerStatus;
+ if ((ui32PowerStatus & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0)
+ return PVRSRV_OK;
sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD;
eError =
- SGXScheduleCCBCommandKM(psDeviceNode, PVRSRV_SGX_COMMAND_EDM_KICK,
- &sCommand, ISR_ID);
- if (eError != PVRSRV_OK)
- PVR_DPF(PVR_DBG_ERROR, "SGXScheduleProcessQueues failed to "
- "schedule CCB command: %lu",
+ SGXScheduleCCBCommandKM(psDeviceNode, SGXMKIF_COMMAND_EDM_KICK,
+ &sCommand, ISR_ID, 0);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXScheduleProcessQueuesKM failed "
+ "to schedule CCB command: %lu",
eError);
-}
-
-#if defined(PDUMP)
-void DumpBufferArray(struct PVR3DIF4_KICKTA_DUMP_BUFFER *psBufferArray,
- u32 ui32BufferArrayLength, IMG_BOOL bDumpPolls)
-{
- u32 i;
-
- for (i = 0; i < ui32BufferArrayLength; i++) {
- struct PVR3DIF4_KICKTA_DUMP_BUFFER *psBuffer;
- struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
- char *pszName;
- void *hUniqueTag;
-
- psBuffer = &psBufferArray[i];
- pszName = psBuffer->pszName;
- if (!pszName)
- pszName = "Nameless buffer";
-
- hUniqueTag =
- MAKEUNIQUETAG((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
- hKernelMemInfo);
- psSyncInfo = ((struct PVRSRV_KERNEL_MEM_INFO *)
- psBuffer->hKernelMemInfo)->psKernelSyncInfo;
-
- if (psBuffer->ui32Start <= psBuffer->ui32End) {
- if (bDumpPolls) {
- PDUMPCOMMENTWITHFLAGS(0,
- "Wait for %s space\r\n",
- pszName);
- PDUMPCBP(psSyncInfo->psSyncDataMemInfoKM,
- offsetof(struct PVRSRV_SYNC_DATA,
- ui32ReadOpsComplete),
- psBuffer->ui32Start,
- psBuffer->ui32SpaceUsed,
- psBuffer->ui32BufferSize, 0,
- MAKEUNIQUETAG(psSyncInfo->
- psSyncDataMemInfoKM));
- }
-
- PDUMPCOMMENTWITHFLAGS(0, "%s\r\n", pszName);
- PDUMPMEM(NULL,
- (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
- hKernelMemInfo, psBuffer->ui32Start,
- psBuffer->ui32End - psBuffer->ui32Start, 0,
- hUniqueTag);
- } else {
- if (bDumpPolls) {
- PDUMPCOMMENTWITHFLAGS(0,
- "Wait for %s space\r\n",
- pszName);
- PDUMPCBP(psSyncInfo->psSyncDataMemInfoKM,
- offsetof(struct PVRSRV_SYNC_DATA,
- ui32ReadOpsComplete),
- psBuffer->ui32Start,
- psBuffer->ui32BackEndLength,
- psBuffer->ui32BufferSize, 0,
- MAKEUNIQUETAG(psSyncInfo->
- psSyncDataMemInfoKM));
- }
- PDUMPCOMMENTWITHFLAGS(0, "%s (part 1)\r\n", pszName);
- PDUMPMEM(NULL,
- (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
- hKernelMemInfo, psBuffer->ui32Start,
- psBuffer->ui32BackEndLength, 0, hUniqueTag);
-
- if (bDumpPolls) {
- PDUMPMEMPOL(psSyncInfo->psSyncDataMemInfoKM,
- offsetof(struct PVRSRV_SYNC_DATA,
- ui32ReadOpsComplete), 0,
- 0xFFFFFFFF,
- PDUMP_POLL_OPERATOR_NOTEQUAL,
- IMG_FALSE, IMG_FALSE,
- MAKEUNIQUETAG(psSyncInfo->
- psSyncDataMemInfoKM));
-
- PDUMPCOMMENTWITHFLAGS(0,
- "Wait for %s space\r\n",
- pszName);
- PDUMPCBP(psSyncInfo->psSyncDataMemInfoKM,
- offsetof(struct PVRSRV_SYNC_DATA,
- ui32ReadOpsComplete), 0,
- psBuffer->ui32End,
- psBuffer->ui32BufferSize, 0,
- MAKEUNIQUETAG(psSyncInfo->
- psSyncDataMemInfoKM));
- }
- PDUMPCOMMENTWITHFLAGS(0, "%s (part 2)\r\n", pszName);
- PDUMPMEM(NULL,
- (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
- hKernelMemInfo, 0, psBuffer->ui32End, 0,
- hUniqueTag);
- }
+ return PVRSRV_ERROR_GENERIC;
}
+
+ return PVRSRV_OK;
}
-#endif
IMG_BOOL SGXIsDevicePowered(struct PVRSRV_DEVICE_NODE *psDeviceNode)
{
}
enum PVRSRV_ERROR SGXGetInternalDevInfoKM(void *hDevCookie,
- struct PVR3DIF4_INTERNAL_DEVINFO *psSGXInternalDevInfo)
+ struct SGX_INTERNAL_DEVINFO
+ *psSGXInternalDevInfo)
{
struct PVRSRV_SGXDEV_INFO *psDevInfo = (struct PVRSRV_SGXDEV_INFO *)
((struct PVRSRV_DEVICE_NODE *)hDevCookie)->pvDevice;
psSGXInternalDevInfo->ui32Flags = psDevInfo->ui32Flags;
psSGXInternalDevInfo->bForcePTOff = (IMG_BOOL)psDevInfo->bForcePTOff;
- psSGXInternalDevInfo->hCtlKernelMemInfoHandle = (void *)
- psDevInfo->psKernelSGXHostCtlMemInfo;
+ psSGXInternalDevInfo->hHostCtlKernelMemInfoHandle =
+ (void *)psDevInfo->psKernelSGXHostCtlMemInfo;
return PVRSRV_OK;
}
-static void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
+#if defined(PDUMP) && !defined(EDM_USSE_HWDEBUG)
+#define PDUMP_SGX_CLEANUP
+#endif
+
+void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
struct IMG_DEV_VIRTADDR *psHWDataDevVAddr,
u32 ui32ResManRequestFlag)
{
(struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
struct PVRSRV_KERNEL_MEM_INFO *psSGXHostCtlMemInfo =
psSGXDevInfo->psKernelSGXHostCtlMemInfo;
- struct PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
- (struct PVRSRV_SGX_HOST_CTL *)psSGXHostCtlMemInfo->pvLinAddrKM;
- u32 ui32PowManFlags;
-#if defined(PDUMP)
+ struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl =
+ (struct SGXMKIF_HOST_CTL __iomem __force *)
+ psSGXHostCtlMemInfo->pvLinAddrKM;
+#if defined(PDUMP_SGX_CLEANUP)
void *hUniqueTag = MAKEUNIQUETAG(psSGXHostCtlMemInfo);
#endif
+ u32 l;
- ui32PowManFlags = psSGXHostCtl->ui32PowManFlags;
- if ((ui32PowManFlags & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0) {
+ if (readl(&psSGXHostCtl->ui32PowerStatus) &
+ PVRSRV_USSE_EDM_POWMAN_NO_WORK) {
;
} else {
if (psSGXDevInfo->ui32CacheControl &
- SGX_BIF_INVALIDATE_PDCACHE) {
- psSGXHostCtl->ui32ResManFlags |=
- PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD;
+ SGX_BIF_INVALIDATE_PDCACHE) {
+ l = readl(&psSGXHostCtl->ui32ResManFlags);
+ l |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD;
+ writel(l, &psSGXHostCtl->ui32ResManFlags);
+
psSGXDevInfo->ui32CacheControl ^=
SGX_BIF_INVALIDATE_PDCACHE;
}
if (psSGXDevInfo->ui32CacheControl &
- SGX_BIF_INVALIDATE_PTCACHE) {
- psSGXHostCtl->ui32ResManFlags |=
- PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT;
+ SGX_BIF_INVALIDATE_PTCACHE) {
+ l = readl(&psSGXHostCtl->ui32ResManFlags);
+ l |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT;
+ writel(l, &psSGXHostCtl->ui32ResManFlags);
+
psSGXDevInfo->ui32CacheControl ^=
SGX_BIF_INVALIDATE_PTCACHE;
}
- psSGXHostCtl->sResManCleanupData.uiAddr =
- psHWDataDevVAddr->uiAddr;
+ if (psHWDataDevVAddr == NULL)
+ writel(0, &psSGXHostCtl->sResManCleanupData.uiAddr);
+ else
+ writel(psHWDataDevVAddr->uiAddr,
+ &psSGXHostCtl->sResManCleanupData.uiAddr);
- psSGXHostCtl->ui32ResManFlags |= ui32ResManRequestFlag;
+ l = readl(&psSGXHostCtl->ui32ResManFlags);
+ l |= ui32ResManRequestFlag;
+ writel(l, &psSGXHostCtl->ui32ResManFlags);
- PDUMPCOMMENT
- ("TA/3D CCB Control - Request clean-up event on uKernel...");
- PDUMPMEM(NULL, psSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL,
- sResManCleanupData.uiAddr),
- sizeof(u32), PDUMP_FLAGS_CONTINUOUS,
- hUniqueTag);
+#if defined(PDUMP_SGX_CLEANUP)
+
+ PDUMPCOMMENTWITHFLAGS(0,
+ "TA/3D CCB Control - Request clean-up event on uKernel...");
PDUMPMEM(NULL, psSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL, ui32ResManFlags),
- sizeof(u32), PDUMP_FLAGS_CONTINUOUS,
+ offsetof(struct SGXMKIF_HOST_CTL,
+ sResManCleanupData.uiAddr), sizeof(u32), 0,
hUniqueTag);
+ PDUMPMEM(&ui32ResManRequestFlag, psSGXHostCtlMemInfo,
+ offsetof(struct SGXMKIF_HOST_CTL, ui32ResManFlags),
+ sizeof(u32), 0, hUniqueTag);
+#else
+ PDUMPCOMMENTWITHFLAGS(0, "Clean-up event on uKernel disabled");
+#endif
- SGXScheduleProcessQueues(psDeviceNode);
+ SGXScheduleProcessQueuesKM(psDeviceNode);
- if (PollForValueKM
- ((volatile u32 *)(&psSGXHostCtl->ui32ResManFlags),
+#if !defined(NO_HARDWARE)
+ if (PollForValueKM(&psSGXHostCtl->ui32ResManFlags,
PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE,
PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE,
MAX_HW_TIME_US / WAIT_TRY_COUNT,
- WAIT_TRY_COUNT) != PVRSRV_OK)
+ WAIT_TRY_COUNT) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "SGXCleanupRequest: "
- "Wait for uKernel to clean up render context failed");
+ "Wait for uKernel to clean up failed");
+ PVR_DBG_BREAK;
+ }
+#endif
-#ifdef PDUMP
+#if defined(PDUMP_SGX_CLEANUP)
- PDUMPCOMMENT
- ("TA/3D CCB Control - Wait for clean-up request to complete...");
+ PDUMPCOMMENTWITHFLAGS(0, "TA/3D CCB Control - "
+ "Wait for clean-up request to complete...");
PDUMPMEMPOL(psSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL,
- ui32ResManFlags),
+ offsetof(struct SGXMKIF_HOST_CTL, ui32ResManFlags),
PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE,
PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE,
PDUMP_POLL_OPERATOR_EQUAL, IMG_FALSE, IMG_FALSE,
hUniqueTag);
#endif
- psSGXHostCtl->ui32ResManFlags &= ~(ui32ResManRequestFlag);
- psSGXHostCtl->ui32ResManFlags &=
- ~(PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE);
+ l = readl(&psSGXHostCtl->ui32ResManFlags);
+ l &= ~ui32ResManRequestFlag;
+ writel(l, &psSGXHostCtl->ui32ResManFlags);
+
+ l = readl(&psSGXHostCtl->ui32ResManFlags);
+ l &= ~PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE;
+ writel(l, &psSGXHostCtl->ui32ResManFlags);
+
+#if defined(PDUMP_SGX_CLEANUP)
PDUMPMEM(NULL, psSGXHostCtlMemInfo,
- offsetof(struct PVRSRV_SGX_HOST_CTL, ui32ResManFlags),
- sizeof(u32), PDUMP_FLAGS_CONTINUOUS,
- hUniqueTag);
+ offsetof(struct SGXMKIF_HOST_CTL, ui32ResManFlags),
+ sizeof(u32), 0, hUniqueTag);
+#endif
}
}
(void **) &psCleanup, &hBlockAlloc);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "%s: alloc failed", __func__);
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXRegisterHWRenderContextKM: "
+ "Couldn't allocate memory for struct "
+ "SGX_HW_RENDER_CONTEXT_CLEANUP structure");
return NULL;
}
0, &SGXCleanupHWRenderContextCallback);
if (psResItem == NULL) {
- PVR_DPF(PVR_DBG_ERROR,
- "%s: can't register resource", __func__);
+ PVR_DPF(PVR_DBG_ERROR, "SGXRegisterHWRenderContextKM: "
+ "ResManRegisterRes failed");
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct SGX_HW_RENDER_CONTEXT_CLEANUP),
psCleanup, psCleanup->hBlockAlloc);
psCleanup = (struct SGX_HW_RENDER_CONTEXT_CLEANUP *)hHWRenderContext;
+ if (psCleanup == NULL) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXUnregisterHWRenderContextKM: invalid parameter");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
+
ResManFreeResByPtr(psCleanup->psResItem);
return PVRSRV_OK;
(void **) &psCleanup, &hBlockAlloc);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "%s: alloc failed", __func__);
+ PVR_DPF(PVR_DBG_ERROR,
+ "SGXRegisterHWTransferContextKM: "
+ "Couldn't allocate memory for struct "
+ "SGX_HW_TRANSFER_CONTEXT_CLEANUP structure");
return NULL;
}
0, &SGXCleanupHWTransferContextCallback);
if (psResItem == NULL) {
- PVR_DPF(PVR_DBG_ERROR,
- "%s: can't register resource", __func__);
+ PVR_DPF(PVR_DBG_ERROR, "SGXRegisterHWTransferContextKM: "
+ "ResManRegisterRes failed");
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(struct SGX_HW_TRANSFER_CONTEXT_CLEANUP),
psCleanup, psCleanup->hBlockAlloc);
PVR_ASSERT(hHWTransferContext != NULL);
- psCleanup = (struct SGX_HW_TRANSFER_CONTEXT_CLEANUP *)
- hHWTransferContext;
+ psCleanup =
+ (struct SGX_HW_TRANSFER_CONTEXT_CLEANUP *)hHWTransferContext;
+
+ if (psCleanup == NULL) {
+ PVR_DPF(PVR_DBG_ERROR, "SGXUnregisterHWTransferContextKM: "
+ "invalid parameter");
+ return PVRSRV_ERROR_INVALID_PARAMS;
+ }
ResManFreeResByPtr(psCleanup->psResItem);
return PVRSRV_OK;
}
-
static inline IMG_BOOL SGX2DQuerySyncOpsComplete(
- struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo)
+ struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo,
+ u32 ui32ReadOpsPending, u32 ui32WriteOpsPending)
{
struct PVRSRV_SYNC_DATA *psSyncData = psSyncInfo->psSyncData;
- return (IMG_BOOL)((psSyncData->ui32ReadOpsComplete ==
- psSyncData->ui32ReadOpsPending) &&
- (psSyncData->ui32WriteOpsComplete ==
- psSyncData->ui32WriteOpsPending));
+ return (IMG_BOOL)((psSyncData->ui32ReadOpsComplete >=
+ ui32ReadOpsPending) &&
+ (psSyncData->ui32WriteOpsComplete >=
+ ui32WriteOpsPending));
}
enum PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(
struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo,
IMG_BOOL bWaitForComplete)
{
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0;
+ u32 ui32ReadOpsPending, ui32WriteOpsPending;
PVR_UNREFERENCED_PARAMETER(psDevInfo);
PVR_DPF(PVR_DBG_CALLTRACE, "SGX2DQueryBlitsCompleteKM: Start");
- if (SGX2DQuerySyncOpsComplete(psSyncInfo)) {
+ ui32ReadOpsPending = psSyncInfo->psSyncData->ui32ReadOpsPending;
+ ui32WriteOpsPending = psSyncInfo->psSyncData->ui32WriteOpsPending;
- PVR_DPF(PVR_DBG_CALLTRACE, "SGX2DQueryBlitsCompleteKM: "
- "No wait. Blits complete.");
+ if (SGX2DQuerySyncOpsComplete
+ (psSyncInfo, ui32ReadOpsPending, ui32WriteOpsPending)) {
+
+ PVR_DPF(PVR_DBG_CALLTRACE,
+ "SGX2DQueryBlitsCompleteKM: No wait. Blits complete.");
return PVRSRV_OK;
}
PVR_DPF(PVR_DBG_MESSAGE,
"SGX2DQueryBlitsCompleteKM: Ops pending. Start polling.");
- do {
+ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) {
OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- if (SGX2DQuerySyncOpsComplete(psSyncInfo)) {
+ if (SGX2DQuerySyncOpsComplete
+ (psSyncInfo, ui32ReadOpsPending, ui32WriteOpsPending)) {
PVR_DPF(PVR_DBG_CALLTRACE,
- "SGX2DQueryBlitsCompleteKM: "
- "Wait over. Blits complete.");
+ "SGX2DQueryBlitsCompleteKM: "
+ "Wait over. Blits complete.");
return PVRSRV_OK;
}
-
- if (bStart == IMG_FALSE) {
- uiStart = OSClockus();
- bStart = IMG_TRUE;
- }
-
- OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- } while ((OSClockus() - uiStart) < MAX_HW_TIME_US);
+ }
+ END_LOOP_UNTIL_TIMEOUT();
PVR_DPF(PVR_DBG_ERROR,
"SGX2DQueryBlitsCompleteKM: Timed out. Ops pending.");
void SGXFlushHWRenderTargetKM(void *psDeviceNode,
struct IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr)
{
- PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr != 0);
+ PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr);
SGXCleanupRequest((struct PVRSRV_DEVICE_NODE *)psDeviceNode,
&sHWRTDataSetDevVAddr,
PVRSRV_USSE_EDM_RESMAN_CLEANUP_RT_REQUEST);
}
+
+u32 SGXConvertTimeStamp(struct PVRSRV_SGXDEV_INFO *psDevInfo, u32 ui32TimeWraps,
+ u32 ui32Time)
+{
+ u64 ui64Clocks;
+ u32 ui32Clocksx16;
+
+ ui64Clocks = ((u64) ui32TimeWraps * psDevInfo->ui32uKernelTimerClock) +
+ (psDevInfo->ui32uKernelTimerClock -
+ (ui32Time & EUR_CR_EVENT_TIMER_VALUE_MASK));
+ ui32Clocksx16 = (u32) (ui64Clocks / 16);
+
+ return ui32Clocksx16;
+}
#include "perproc.h"
-#define GET_CCB_SPACE(WOff, ROff, CCBSize) \
- (((ROff - WOff) + (CCBSize - 1)) & (CCBSize - 1))
-
-#define UPDATE_CCB_OFFSET(Off, PacketSize, CCBSize) \
- Off = ((Off + PacketSize) & (CCBSize - 1))
-
-#define CCB_OFFSET_IS_VALID(type, psCCBMemInfo, psCCBKick, offset) \
- ((sizeof(type) <= (psCCBMemInfo)->ui32AllocSize) && \
+#define CCB_OFFSET_IS_VALID(type, psCCBMemInfo, psCCBKick, offset) \
+ ((sizeof(type) <= (psCCBMemInfo)->ui32AllocSize) && \
((psCCBKick)->offset <= (psCCBMemInfo)->ui32AllocSize - sizeof(type)))
-#define CCB_DATA_FROM_OFFSET(type, psCCBMemInfo, psCCBKick, offset) \
- ((type *)(((char *)(psCCBMemInfo)->pvLinAddrKM) + \
+#define CCB_DATA_FROM_OFFSET(type, psCCBMemInfo, psCCBKick, offset) \
+ ((type *)(((char *)(psCCBMemInfo)->pvLinAddrKM) + \
(psCCBKick)->offset))
-static inline u32 SGXCalcContextCCBParamSize(u32 ui32ParamSize,
- u32 ui32AllocGran)
-{
- return (ui32ParamSize + (ui32AllocGran - 1)) & ~(ui32AllocGran - 1);
-}
-
-static inline void *SGXAcquireCCB(struct PVRSRV_SGX_CCB *psCCB, u32 ui32CmdSize)
-{
- IMG_BOOL bStart = IMG_FALSE;
- u32 uiStart = 0;
-
- do {
- if (GET_CCB_SPACE(*psCCB->pui32WriteOffset,
- *psCCB->pui32ReadOffset,
- psCCB->ui32Size) > ui32CmdSize)
- return (void *)((u32)psCCB->psCCBMemInfo->pvLinAddrKM +
- *psCCB->pui32WriteOffset);
-
- if (bStart == IMG_FALSE) {
- bStart = IMG_TRUE;
- uiStart = OSClockus();
- }
- OSWaitus(MAX_HW_TIME_US / WAIT_TRY_COUNT);
- } while ((OSClockus() - uiStart) < MAX_HW_TIME_US);
-
- return NULL;
-}
-
-#if defined(PDUMP)
-void DumpBufferArray(struct PVR3DIF4_KICKTA_DUMP_BUFFER *psBufferArray,
- u32 ui32BufferArrayLength, IMG_BOOL bDumpPolls);
-#endif
-
void SGXTestActivePowerEvent(struct PVRSRV_DEVICE_NODE *psDeviceNode,
u32 ui32CallerID);
+enum PVRSRV_ERROR SGXScheduleCCBCommand(
+ struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ enum SGXMKIF_COMMAND_TYPE eCommandType,
+ struct SGXMKIF_COMMAND *psCommandData,
+ u32 ui32CallerID, u32 ui32PDumpFlags);
enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
struct PVRSRV_DEVICE_NODE *psDeviceNode,
- enum PVRSRV_SGX_COMMAND_TYPE eCommandType,
- struct PVRSRV_SGX_COMMAND *psCommandData,
- u32 ui32CallerID);
+ enum SGXMKIF_COMMAND_TYPE eCommandType,
+ struct SGXMKIF_COMMAND *psCommandData,
+ u32 ui32CallerID, u32 ui32PDumpFlags);
-void SGXScheduleProcessQueues(struct PVRSRV_DEVICE_NODE *psDeviceNode);
+enum PVRSRV_ERROR SGXScheduleProcessQueuesKM(
+ struct PVRSRV_DEVICE_NODE *psDeviceNode);
IMG_BOOL SGXIsDevicePowered(struct PVRSRV_DEVICE_NODE *psDeviceNode);
enum PVRSRV_ERROR SGXUnregisterHWTransferContextKM(void *hHWTransferContext);
+u32 SGXConvertTimeStamp(struct PVRSRV_SGXDEV_INFO *psDevInfo,
+ u32 ui32TimeWraps, u32 ui32Time);
+
+void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
+ struct IMG_DEV_VIRTADDR *psHWDataDevVAddr,
+ u32 ui32ResManRequestFlag);
+
u32 *puiBufSize,
IMG_BOOL bSave);
+#define LOOP_UNTIL_TIMEOUT(TIMEOUT) \
+{ \
+ u32 uiOffset, uiStart, uiCurrent; \
+ for (uiOffset = 0, uiStart = OSClockus(), uiCurrent = uiStart+1; \
+ (uiCurrent - uiStart + uiOffset) < TIMEOUT; \
+ uiCurrent = OSClockus(), \
+ uiOffset = uiCurrent < uiStart ? \
+ IMG_UINT32_MAX - uiStart : uiOffset, \
+ uiStart = uiCurrent < uiStart ? 0 : uiStart)
+
+#define END_LOOP_UNTIL_TIMEOUT() \
+}
#endif
#include "device.h"
#include "buffer_manager.h"
+#if defined(NO_HARDWARE) && defined(__KERNEL__)
+#include <linux/io.h>
+#endif
struct SYS_DEVICE_ID {
u32 uiID;
char *pszVersionString;
struct PVRSRV_EVENTOBJECT *psGlobalEventObject;
+#if defined(PDUMP)
+ IMG_BOOL bPowerUpPDumped;
+#endif
};
enum PVRSRV_ERROR SysInitialise(void);
enum PVRSRV_ERROR SysFinalise(void);
-u32 GetCPUTranslatedAddress(void);
-
enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData);
enum PVRSRV_ERROR SysGetDeviceMemoryMap(enum PVRSRV_DEVICE_TYPE eDeviceType,
OSDestroyResource(&psSysData->sPowerStateChangeResource);
}
-#define SysReadHWReg(p, o) OSReadHWReg(p, o)
-#define SysWriteHWReg(p, o, v) OSWriteHWReg(p, o, v)
+#if !(defined(NO_HARDWARE) && defined(__KERNEL__))
+#define SysReadHWReg(p, o) OSReadHWReg(p, o)
+#define SysWriteHWReg(p, o, v) OSWriteHWReg(p, o, v)
+#else
+static inline u32 SysReadHWReg(void *pvLinRegBaseAddr, u32 ui32Offset)
+{
+ return (u32)readl(pvLinRegBaseAddr + ui32Offset);
+}
+
+static inline void SysWriteHWReg(void *pvLinRegBaseAddr, u32 ui32Offset,
+ u32 ui32Value)
+{
+ writel(ui32Value, pvLinRegBaseAddr + ui32Offset);
+}
+#endif
+bool sgx_is_530(void);
+u32 sgx_get_rev(void);
+void sgx_ocp_write_reg(u32 reg, u32 val);
+unsigned long sgx_get_max_freq(void);
#endif
#include "sgxinfokm.h"
#include "syslocal.h"
#include "sysconfig.h"
+#include "syscommon.h"
+#include "img_types.h"
+#include "ocpdefs.h"
#include "pvr_bridge_km.h"
struct SYS_DATA *gpsSysData;
static struct SGX_DEVICE_MAP gsSGXDeviceMap;
static struct PVRSRV_DEVICE_NODE *gpsSGXDevNode;
-#define DEVICE_SGX_INTERRUPT (1 << 0)
+#define DEVICE_SGX_INTERRUPT (1 << 0)
+
+#if defined(NO_HARDWARE)
+static void *gsSGXRegsCPUVAddr;
+#endif
+
+static void __iomem *ocp_base;
static enum PVRSRV_ERROR SysLocateDevices(struct SYS_DATA *psSysData)
{
+#if defined(NO_HARDWARE)
+ enum PVRSRV_ERROR eError;
+ struct IMG_CPU_PHYADDR sCpuPAddr;
+#endif
+
PVR_UNREFERENCED_PARAMETER(psSysData);
gsSGXDeviceMap.ui32Flags = 0x0;
+#if defined(NO_HARDWARE)
+
+ eError = OSBaseAllocContigMemory(SYS_OMAP3430_SGX_REGS_SIZE,
+ &gsSGXRegsCPUVAddr, &sCpuPAddr);
+ if (eError != PVRSRV_OK)
+ return eError;
+ gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr;
+ gsSGXDeviceMap.sRegsSysPBase =
+ SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase);
+ gsSGXDeviceMap.ui32RegsSize = SYS_OMAP3430_SGX_REGS_SIZE;
+
+ gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr;
+
+ OSMemSet(gsSGXRegsCPUVAddr, 0, SYS_OMAP3430_SGX_REGS_SIZE);
+
+ gsSGXDeviceMap.ui32IRQ = 0;
+
+#else
+
gsSGXDeviceMap.sRegsSysPBase.uiAddr =
SYS_OMAP3430_SGX_REGS_SYS_PHYS_BASE;
gsSGXDeviceMap.sRegsCpuPBase =
gsSGXDeviceMap.ui32IRQ = SYS_OMAP3430_SGX_IRQ;
+#endif
+
return PVRSRV_OK;
}
+#ifndef NO_HARDWARE
+u32 sgx_get_rev(void)
+{
+ /*
+ * Ugly solution, used until we have proper per device instances
+ * passed to functions and get rid of most if not all globals.
+ */
+ struct SYS_SPECIFIC_DATA *sysd = gpsSysSpecificData;
+ void __iomem *regs;
+ static u32 rev = -1UL;
+ int err;
+
+ if (rev != -1UL)
+ return rev;
+
+ regs = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase,
+ SYS_OMAP3430_SGX_REGS_SIZE,
+ PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY,
+ NULL);
+ if (!regs)
+ return 0;
+
+ err = clk_enable(sysd->psSGX_FCK);
+ BUG_ON(err);
+ err = clk_enable(sysd->psSGX_ICK);
+ BUG_ON(err);
+
+ rev = OSReadHWReg(regs, EUR_CR_CORE_REVISION);
+
+ clk_disable(sysd->psSGX_ICK);
+ clk_disable(sysd->psSGX_FCK);
+
+ OSUnMapPhysToLin(regs, SYS_OMAP3430_SGX_REGS_SIZE,
+ PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY, NULL);
+
+ return rev;
+}
+
+unsigned long sgx_get_max_freq(void)
+{
+ if (sgx_is_530()) {
+ switch (sgx_get_rev()) {
+ case EUR_CR_CORE_MAKE_REV(1, 2, 1):
+ return SYS_SGX_MAX_FREQ_530R121;
+ case EUR_CR_CORE_MAKE_REV(1, 2, 5):
+ return SYS_SGX_MAX_FREQ_530R125;
+ }
+ }
+ BUG();
+}
+
+#else
+
+u32 sgx_get_rev(void)
+{
+ return 0;
+}
+
+unsigned long sgx_get_max_freq()
+{
+ return SYS_SGX_MAX_FREQ_NO_HW;
+}
+
+#endif
+
+bool sgx_is_530(void)
+{
+#ifdef SGX530
+ return true;
+#endif
+ return false;
+}
+
char *SysCreateVersionString(struct IMG_CPU_PHYADDR sRegRegion)
{
static char aszVersionString[100];
struct SYS_DATA *psSysData;
u32 ui32SGXRevision;
s32 i32Count;
- void __iomem *pvRegsLinAddr;
-
- pvRegsLinAddr = OSMapPhysToLin(sRegRegion,
- SYS_OMAP3430_SGX_REGS_SIZE,
- PVRSRV_HAP_UNCACHED |
- PVRSRV_HAP_KERNEL_ONLY, NULL);
- if (!pvRegsLinAddr)
- return NULL;
-
- ui32SGXRevision = OSReadHWReg(pvRegsLinAddr, EUR_CR_CORE_REVISION);
if (SysAcquireData(&psSysData) != PVRSRV_OK)
return NULL;
+ ui32SGXRevision = sgx_get_rev();
+
i32Count = OSSNPrintf(aszVersionString, 100,
"SGX revision = %u.%u.%u",
- (unsigned
- int)((ui32SGXRevision &
+ (unsigned)((ui32SGXRevision &
EUR_CR_CORE_REVISION_MAJOR_MASK)
>> EUR_CR_CORE_REVISION_MAJOR_SHIFT),
- (unsigned
- int)((ui32SGXRevision &
+ (unsigned)((ui32SGXRevision &
EUR_CR_CORE_REVISION_MINOR_MASK)
>> EUR_CR_CORE_REVISION_MINOR_SHIFT),
- (unsigned
- int)((ui32SGXRevision &
+ (unsigned)((ui32SGXRevision &
EUR_CR_CORE_REVISION_MAINTENANCE_MASK)
>> EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT)
);
- OSUnMapPhysToLin((void __iomem *)pvRegsLinAddr,
- SYS_OMAP3430_SGX_REGS_SIZE,
- PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY,
- NULL);
-
if (i32Count == -1)
return NULL;
return aszVersionString;
}
+static int sgx_ocp_init(void)
+{
+ struct IMG_SYS_PHYADDR sys_pbase;
+ struct IMG_CPU_PHYADDR cpu_pbase;
+
+ sys_pbase.uiAddr = SYS_OMAP3430_OCP_REGS_SYS_PHYS_BASE;
+ cpu_pbase = SysSysPAddrToCpuPAddr(sys_pbase);
+
+ ocp_base = OSMapPhysToLin(cpu_pbase, SYS_OMAP3430_OCP_REGS_SIZE,
+ PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY,
+ NULL);
+
+ if (!ocp_base) {
+ PVR_DPF(PVR_DBG_ERROR, "%s: Failed to map OCP registers",
+ __func__);
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+static void sgx_ocp_cleanup(void)
+{
+ OSUnMapPhysToLin(ocp_base, SYS_OMAP3430_OCP_REGS_SIZE,
+ PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY, NULL);
+}
+
+void sgx_ocp_write_reg(u32 reg, u32 val)
+{
+ BUG_ON(!ocp_base);
+
+ /* OCP offsets are based at EUR_CR_OCP_REVISION */
+ reg -= EUR_CR_OCP_REVISION;
+ OSWriteHWReg(ocp_base, reg, val);
+}
+
enum PVRSRV_ERROR SysInitialise(void)
{
u32 i;
struct IMG_CPU_PHYADDR TimerRegPhysBase;
gpsSysData = &gsSysData;
- OSMemSet(gpsSysData, 0, sizeof(struct SYS_DATA));
gpsSysSpecificData = &gsSysSpecificData;
- OSMemSet(gpsSysSpecificData, 0, sizeof(struct SYS_SPECIFIC_DATA));
gpsSysData->pvSysSpecificData = gpsSysSpecificData;
gpsSysData->hSOCTimerRegisterOSMemHandle = NULL;
OSReservePhys(TimerRegPhysBase, 4,
PVRSRV_HAP_MULTI_PROCESS | PVRSRV_HAP_UNCACHED,
- (void **) &gpsSysData->pvSOCTimerRegisterKM,
+ (void **)&gpsSysData->pvSOCTimerRegisterKM,
&gpsSysData->hSOCTimerRegisterOSMemHandle);
+ gpsSysSpecificData->ui32SrcClockDiv = 3;
eError = SysLocateDevices(gpsSysData);
if (eError != PVRSRV_OK) {
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV);
+ if (sgx_ocp_init() < 0) {
+ SysDeinitialise(gpsSysData);
+ gpsSysData = NULL;
+
+ return PVRSRV_ERROR_GENERIC;
+ }
+
eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice,
DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID);
if (eError != PVRSRV_OK) {
psDeviceNode = gpsSysData->psDeviceNodeList;
while (psDeviceNode) {
-
switch (psDeviceNode->sDevId.eDeviceType) {
case PVRSRV_DEVICE_TYPE_SGX:
{
gpsSysData = NULL;
return eError;
}
+ SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
+ SYS_SPECIFIC_DATA_ENABLE_PERF);
+
eError = EnableSGXClocks(gpsSysData);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
SYS_SPECIFIC_DATA_ENABLE_INITDEV);
+ gpsSysData->pszVersionString =
+ SysCreateVersionString(gsSGXDeviceMap.sRegsCpuPBase);
+ if (!gpsSysData->pszVersionString)
+ PVR_DPF(PVR_DBG_ERROR,
+ "SysFinalise: Failed to create a system version string");
+ else
+ PVR_DPF(PVR_DBG_WARNING, "SysFinalise: Version string: %s",
+ gpsSysData->pszVersionString);
DisableSGXClocks(gpsSysData);
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
SYS_SPECIFIC_DATA_ENABLE_LISR);
- gpsSysData->pszVersionString =
- SysCreateVersionString(gsSGXDeviceMap.sRegsCpuPBase);
- if (!gpsSysData->pszVersionString)
- PVR_DPF(PVR_DBG_ERROR, "SysFinalise: "
- "Failed to create a system version string");
- else
- PVR_DPF(PVR_DBG_WARNING, "SysFinalise: Version string: %s",
- gpsSysData->pszVersionString);
-
-
DisableSGXClocks(gpsSysData);
gpsSysSpecificData->bSGXInitComplete = IMG_TRUE;
{
enum PVRSRV_ERROR eError;
- PVR_UNREFERENCED_PARAMETER(psSysData);
-
if (SYS_SPECIFIC_DATA_TEST
(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) {
eError = OSUninstallDeviceLISR(psSysData);
(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR)) {
eError = OSUninstallMISR(psSysData);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "SysDeinitialise: OSUninstallMISR failed");
+ PVR_DPF(PVR_DBG_ERROR, "SysDeinitialise: "
+ "OSUninstallMISR failed");
return eError;
}
}
- eError = OSCleanupPerf(psSysData);
- if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR,
- "SysDeinitialise: OSCleanupDvfs failed");
- return eError;
- }
+ sgx_ocp_cleanup();
if (SYS_SPECIFIC_DATA_TEST
(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) {
}
eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID);
+
+ DisableSGXClocks(gpsSysData);
+
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "SysDeinitialise: "
- "failed to de-init the device");
+ "failed to de-init the device");
return eError;
}
}
CleanupSystemClocks(gpsSysData);
+ if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData,
+ SYS_SPECIFIC_DATA_ENABLE_PERF)) {
+ eError = OSCleanupPerf(psSysData);
+ if (eError != PVRSRV_OK) {
+ PVR_DPF(PVR_DBG_ERROR,
+ "SysDeinitialise: OSCleanupDvfs failed");
+ return eError;
+ }
+ }
+
if (SYS_SPECIFIC_DATA_TEST
(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) {
eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "SysDeinitialise: "
- "failed to de-init env structure");
+ PVR_DPF(PVR_DBG_ERROR,
+ "SysDeinitialise: failed to de-init env structure");
return eError;
}
}
SysDeinitialiseCommon(gpsSysData);
+#if defined(NO_HARDWARE)
+ if (SYS_SPECIFIC_DATA_TEST
+ (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV))
+
+ OSBaseFreeContigMemory(SYS_OMAP3430_SGX_REGS_SIZE,
+ gsSGXRegsCPUVAddr,
+ gsSGXDeviceMap.sRegsCpuPBase);
+#endif
if (SYS_SPECIFIC_DATA_TEST
(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PDUMPINIT))
enum PVRSRV_ERROR SysGetDeviceMemoryMap(enum PVRSRV_DEVICE_TYPE eDeviceType,
void **ppvDeviceMap)
{
-
switch (eDeviceType) {
case PVRSRV_DEVICE_TYPE_SGX:
- {
-
- *ppvDeviceMap = (void *) &gsSGXDeviceMap;
-
- break;
- }
+ *ppvDeviceMap = (void *) &gsSGXDeviceMap;
+ break;
default:
- {
- PVR_DPF(PVR_DBG_ERROR, "SysGetDeviceMemoryMap: "
+ PVR_DPF(PVR_DBG_ERROR, "SysGetDeviceMemoryMap: "
"unsupported device type");
- }
}
return PVRSRV_OK;
}
struct PVRSRV_DEVICE_NODE *psDeviceNode)
{
PVR_UNREFERENCED_PARAMETER(psSysData);
+#if defined(NO_HARDWARE)
+
+ return 0xFFFFFFFF;
+#else
return psDeviceNode->ui32SOCInterruptBit;
+#endif
}
void SysClearInterrupts(struct SYS_DATA *psSysData, u32 ui32ClearBits)
PVR_UNREFERENCED_PARAMETER(psSysData);
PVR_UNREFERENCED_PARAMETER(ui32ClearBits);
- /* Flush posted write for the irq status to avoid spurious interrupts */
OSReadHWReg(((struct PVRSRV_SGXDEV_INFO *)gpsSGXDevNode->pvDevice)->
pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR);
}
eError = OSUninstallDeviceLISR(gpsSysData);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "SysSystemPrePowerState: "
- "OSUninstallDeviceLISR failed (%d)",
+ "SysSystemPrePowerState: "
+ "OSUninstallDeviceLISR failed "
+ "(%d)",
eError);
return eError;
}
eError = EnableSystemClocks(gpsSysData);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "SysSystemPostPowerState: "
- "EnableSystemClocks failed (%d)",
+ "SysSystemPostPowerState: "
+ "EnableSystemClocks failed (%d)",
eError);
return eError;
}
"SGX ISR", gpsSGXDevNode);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
- "SysSystemPostPowerState: "
- "OSInstallDeviceLISR failed to "
- "install ISR (%d)", eError);
+ "SysSystemPostPowerState: "
+ "OSInstallDeviceLISR failed "
+ "to install ISR (%d)",
+ eError);
return eError;
}
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
if (ui32DeviceIndex != gui32SGXDeviceID)
return PVRSRV_OK;
if (eNewPowerState == PVRSRV_POWER_STATE_D3) {
- PVR_TRACE("SysDevicePrePowerState: SGX Entering state D3");
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "SysDevicePrePowerState: SGX Entering state D3");
DisableSGXClocks(gpsSysData);
}
return PVRSRV_OK;
if (ui32DeviceIndex != gui32SGXDeviceID)
return eError;
if (eCurrentPowerState == PVRSRV_POWER_STATE_D3) {
- PVR_TRACE("SysDevicePostPowerState: SGX Leaving state D3");
+ PVR_DPF(PVR_DBG_MESSAGE,
+ "SysDevicePostPowerState: SGX Leaving state D3");
eError = EnableSGXClocks(gpsSysData);
}
return eError;
}
-enum PVRSRV_ERROR SysOEMFunction(u32 ui32ID,
- void *pvIn,
- u32 ulInSize,
+enum PVRSRV_ERROR SysOEMFunction(u32 ui32ID, void *pvIn, u32 ulInSize,
void *pvOut, u32 ulOutSize)
{
PVR_UNREFERENCED_PARAMETER(ui32ID);
#define VS_PRODUCT_NAME "OMAP3430"
-#define SYS_SGX_CLOCK_SPEED 110666666
-#define SYS_SGX_HWRECOVERY_TIMEOUT_FREQ (100)
-#define SYS_SGX_PDS_TIMER_FREQ (1000)
-#define SYS_SGX_ACTIVE_POWER_LATENCY_MS (100)
+#define SYS_SGX_MAX_FREQ_NO_HW 200000000
+#define SYS_SGX_MAX_FREQ_530R121 110000000
+#define SYS_SGX_MAX_FREQ_530R125 200000000
-#define SYS_OMAP3430_VDD2_OPP3_SGX_CLOCK_SPEED SYS_SGX_CLOCK_SPEED
-#define SYS_OMAP3430_VDD2_OPP2_SGX_CLOCK_SPEED (SYS_SGX_CLOCK_SPEED / 2)
+#define SYS_SGX_HWRECOVERY_TIMEOUT_FREQ 100
+#define SYS_SGX_PDS_TIMER_FREQ 1000
+#define SYS_SGX_ACTIVE_POWER_LATENCY_MS 1
#define SYS_OMAP3430_SGX_REGS_SYS_PHYS_BASE 0x50000000
#define SYS_OMAP3430_SGX_REGS_SIZE 0x4000
-#define SYS_OMAP3430_SGX_IRQ 21
+#define SYS_OMAP3430_SGX_IRQ 21
#define SYS_OMAP3430_GP11TIMER_PHYS_BASE 0x48088000
#define SYS_OMAP3430_GPTIMER_ENABLE 0x24
#if !defined(__SYSINFO_H__)
#define __SYSINFO_H__
-#define MAX_HW_TIME_US (500000)
-#define WAIT_TRY_COUNT (10000)
+#define MAX_HW_TIME_US 500000
+#define WAIT_TRY_COUNT 10000
enum SYS_DEVICE_TYPE {
- SYS_DEVICE_SGX = 0,
-
- SYS_DEVICE_FORCE_I16 = 0x7fff
+ SYS_DEVICE_SGX = 0,
+ SYS_DEVICE_FORCE_I16 = 0x7fff
};
-#define SYS_DEVICE_COUNT 3
+#define SYS_DEVICE_COUNT 3
#define PRM_REG32(offset) (offset)
#define CM_REG32(offset) (offset)
#define RM_RSTST_SGX_GLOBALWARM_RST 0x00000002
#define RM_RSTST_SGX_GLOBALCOLD_RST 0x00000001
-#define PM_WKDEP_SGX PRM_REG32(0xBC8)
+#define PM_WKDEP_SGXi PRM_REG32(0xBC8)
#define PM_WKDEP_SGX_EN_WAKEUP 0x00000010
#define PM_WKDEP_SGX_EN_MPU 0x00000002
#define PM_WKDEP_SGX_EN_CORE 0x00000001
#include <linux/version.h>
#include <linux/clk.h>
-#include <linux/semaphore.h>
+#include <linux/spinlock.h>
+#include <asm/atomic.h>
+#include <linux/semaphore.h>
+#include <linux/resource.h>
char *SysCreateVersionString(struct IMG_CPU_PHYADDR sRegRegion);
#define SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR 0x00000200
#define SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS 0x00000400
+#define SYS_SPECIFIC_DATA_ENABLE_PERF 0x00000800
#define SYS_SPECIFIC_DATA_SET(psSysSpecData, flag) \
((void)((psSysSpecData)->ui32SysSpecificData |= (flag)))
u32 ui32SysSpecificData;
struct PVRSRV_DEVICE_NODE *psSGXDevNode;
IMG_BOOL bSGXInitComplete;
- IMG_BOOL bSGXClocksEnabled;
+ u32 ui32SrcClockDiv;
+ IMG_BOOL bConstraintNotificationsEnabled;
+ atomic_t sSGXClocksEnabled;
+ spinlock_t sPowerLock;
+ atomic_t sPowerLockCPU;
+ spinlock_t sNotifyLock;
+ atomic_t sNotifyLockCPU;
+ IMG_BOOL bCallVDD2PostFunc;
+
struct clk *psCORE_CK;
struct clk *psSGX_FCK;
struct clk *psSGX_ICK;
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/hardirq.h>
-#include <mach/omap-pm.h>
+#include <plat/omap-pm.h>
#include <linux/bug.h>
-#include <mach/clock.h>
-
+#include <plat/clock.h>
+#include <plat/cpu.h>
#include "sgxdefs.h"
#include "services_headers.h"
#include "sysinfo.h"
#include "sgxinfokm.h"
#include "syslocal.h"
#include "env_data.h"
+#include "ocpdefs.h"
#define HZ_TO_MHZ(m) ((m) / 1000000)
static inline unsigned long scale_prop_to_SGX_clock(unsigned long val,
unsigned long rate)
{
- return scale_by_rate(val, rate, SYS_SGX_CLOCK_SPEED);
-}
-
-static inline unsigned long scale_inv_prop_to_SGX_clock(unsigned long val,
- unsigned long rate)
-{
- return scale_by_rate(val, SYS_SGX_CLOCK_SPEED, rate);
+ return scale_by_rate(val, rate, sgx_get_max_freq());
}
void SysGetSGXTimingInformation(struct SGX_TIMING_INFORMATION *psTimingInfo)
{
unsigned long rate;
- PVR_ASSERT(gpsSysSpecificData->bSGXClocksEnabled);
+#if defined(NO_HARDWARE)
+ rate = SYS_SGX_MAX_FREQ_NO_HW;
+#else
+ PVR_ASSERT(atomic_read(&gpsSysSpecificData->sSGXClocksEnabled) != 0);
rate = clk_get_rate(gpsSysSpecificData->psSGX_FCK);
PVR_ASSERT(rate != 0);
+#endif
psTimingInfo->ui32CoreClockSpeed = rate;
psTimingInfo->ui32HWRecoveryFreq =
scale_prop_to_SGX_clock(SYS_SGX_HWRECOVERY_TIMEOUT_FREQ, rate);
SYS_SGX_ACTIVE_POWER_LATENCY_MS;
}
-
static int vdd2_post_func(struct notifier_block *n, unsigned long event,
void *ptr)
{
PVR_UNREFERENCED_PARAMETER(event);
PVR_UNREFERENCED_PARAMETER(ptr);
- if (gpsSysSpecificData->bSGXClocksEnabled &&
+ if (atomic_read(&gpsSysSpecificData->sSGXClocksEnabled) != 0 &&
gpsSysSpecificData->bSGXInitComplete) {
#if defined(DEBUG)
unsigned long rate;
PVR_UNREFERENCED_PARAMETER(event);
PVR_UNREFERENCED_PARAMETER(ptr);
- if (gpsSysSpecificData->bSGXClocksEnabled
- && gpsSysSpecificData->bSGXInitComplete) {
+ if (atomic_read(&gpsSysSpecificData->sSGXClocksEnabled) != 0 &&
+ gpsSysSpecificData->bSGXInitComplete) {
BUG_ON(gpsSysData->eCurrentPowerState > PVRSRV_POWER_STATE_D1);
PVRSRVDevicePreClockSpeedChange(gpsSysSpecificData->
psSGXDevNode->sDevId.
cnd = (struct clk_notifier_data *)ptr;
- PVR_TRACE("vdd2_pre_post_func: old clock rate = %lu", cnd->old_rate);
- PVR_TRACE("vdd2_pre_post_func: new clock rate = %lu", cnd->new_rate);
+ PVR_TRACE("vdd2_pre_post_func: %s clock rate = %lu",
+ (CLK_PRE_RATE_CHANGE == event) ? "old" :
+ (CLK_POST_RATE_CHANGE == event) ? "new" :
+ "???",
+ cnd->rate);
if (CLK_PRE_RATE_CHANGE == event) {
PVRSRVDvfsLock();
NULL
};
-static void RegisterConstraintNotifications(
- struct SYS_SPECIFIC_DATA *psSysSpecData)
+static void RegisterConstraintNotifications(struct SYS_SPECIFIC_DATA
+ *psSysSpecData)
{
PVR_TRACE("Registering constraint notifications");
PVR_TRACE("VDD2 constraint notifications registered");
}
-static void UnRegisterConstraintNotifications(
- struct SYS_SPECIFIC_DATA *psSysSpecData)
+static void UnRegisterConstraintNotifications(struct SYS_SPECIFIC_DATA
+ *psSysSpecData)
{
PVR_TRACE("Unregistering constraint notifications");
eError = SysAcquireData(&psSysData);
if (eError != PVRSRV_OK)
return 0;
- psSysSpecData = (struct SYS_SPECIFIC_DATA *)
- psSysData->pvSysSpecificData;
- if ((!psSysSpecData) || (!psSysSpecData->bSGXClocksEnabled))
+ psSysSpecData =
+ (struct SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData;
+ if (!psSysSpecData ||
+ atomic_read(&psSysSpecData->sSGXClocksEnabled) == 0)
return 0;
psDeviceNode = psSysData->psDeviceNodeList;
while (psDeviceNode) {
- if ((psDeviceNode->sDevId.eDeviceType == PVRSRV_DEVICE_TYPE_SGX)
- && (psDeviceNode->pvDevice)) {
+ if ((psDeviceNode->sDevId.eDeviceType ==
+ PVRSRV_DEVICE_TYPE_SGX) &&
+ psDeviceNode->pvDevice) {
struct PVRSRV_SGXDEV_INFO *psDevInfo =
(struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
unsigned int kicks = psDevInfo->ui32KickTACounter;
time_prev += time_elapsed;
/*
* if the period between calls to this function was
- * too long then load stats are invalid.
+ * too long, then load stats are invalid
*/
if (time_elapsed > 5 * HZ)
return 0;
/*pr_err("SGX load %u\n", load); */
/*
- * 'load' shows how many times sgx was kicked per
- * 1000 jiffies 150 is arbitrarily chosen threshold.
- * If the number of kicks is below threshold then sgx
- * is doing some small jobs and we can keep the clocki
- * freq low.
+ * 'load' shows how many times sgx was kicked
+ * per 1000 jiffies
+ * 150 is arbitrarily chosen threshold.
+ * If the number of kicks is below threshold
+ * then sgx is doing
+ * some small jobs and we can keep the clock freq low.
*/
if (load < 150)
return 0;
int high;
unsigned int load;
struct delayed_work *d_work =
- container_of(work, struct delayed_work, work);
+ container_of(work, struct delayed_work, work);
struct ENV_DATA *psEnvData =
- container_of(d_work, struct ENV_DATA, sPerfWork);
+ container_of(d_work, struct ENV_DATA, sPerfWork);
load = sgx_current_load();
if (load) {
}
if (high != bHigh) {
omap_pm_set_min_bus_tput(&sgx_dev, OCP_INITIATOR_AGENT, vdd2);
- omap_pm_set_min_mpu_freq(&sgx_dev, vdd1);
bHigh = high;
}
+
if (sgx_clock_enabled || load)
queue_delayed_work(psEnvData->psPerfWorkqueue,
&psEnvData->sPerfWork, HZ / 5);
static void sgx_need_perf(struct SYS_DATA *psSysData, int ena)
{
- struct ENV_DATA *psEnvData = (struct ENV_DATA *)
- psSysData->pvEnvSpecificData;
+ struct ENV_DATA *psEnvData =
+ (struct ENV_DATA *)psSysData->pvEnvSpecificData;
sgx_clock_enabled = ena;
cancel_delayed_work(&psEnvData->sPerfWork);
enum PVRSRV_ERROR OSInitPerf(void *pvSysData)
{
struct SYS_DATA *psSysData = (struct SYS_DATA *)pvSysData;
- struct ENV_DATA *psEnvData = (struct ENV_DATA *)
- psSysData->pvEnvSpecificData;
+ struct ENV_DATA *psEnvData =
+ (struct ENV_DATA *)psSysData->pvEnvSpecificData;
if (psEnvData->psPerfWorkqueue) {
PVR_DPF(PVR_DBG_ERROR, "OSInitPerf: already inited");
enum PVRSRV_ERROR OSCleanupPerf(void *pvSysData)
{
struct SYS_DATA *psSysData = (struct SYS_DATA *)pvSysData;
- struct ENV_DATA *psEnvData = (struct ENV_DATA *)
- psSysData->pvEnvSpecificData;
+ struct ENV_DATA *psEnvData =
+ (struct ENV_DATA *)psSysData->pvEnvSpecificData;
if (!psEnvData->psPerfWorkqueue) {
PVR_DPF(PVR_DBG_ERROR, "OSCleanupPerf: not inited");
PVR_TRACE("Cleaning up DVFS");
+ sgx_clock_enabled = 0;
flush_workqueue(psEnvData->psPerfWorkqueue);
destroy_workqueue(psEnvData->psPerfWorkqueue);
return PVRSRV_OK;
}
-enum PVRSRV_ERROR EnableSGXClocks(struct SYS_DATA *psSysData)
+static inline void setup_int_bypass(void)
+{
+ if (cpu_is_omap3630())
+ sgx_ocp_write_reg(EUR_CR_OCP_DEBUG_CONFIG,
+ EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_MASK);
+}
+
+#ifndef NO_HARDWARE
+
+static enum PVRSRV_ERROR sgx_force_enable_clocks(struct SYS_DATA *psSysData)
{
struct SYS_SPECIFIC_DATA *psSysSpecData =
(struct SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData;
-#if defined(DEBUG)
- unsigned long rate;
-#endif
int res;
- if (psSysSpecData->bSGXClocksEnabled)
- return PVRSRV_OK;
-
- PVR_TRACE("EnableSGXClocks: Enabling SGX Clocks");
-
-#if defined(DEBUG)
- rate = clk_get_rate(psSysSpecData->psMPU_CK);
- PVR_TRACE("CPU Clock is %dMhz", HZ_TO_MHZ(rate));
-#endif
-
res = clk_enable(psSysSpecData->psSGX_FCK);
if (res < 0) {
- PVR_DPF(PVR_DBG_ERROR, "EnableSGXClocks: "
- "Couldn't enable SGX functional clock (%d)", res);
+ PVR_DPF(PVR_DBG_ERROR, "%s: "
+ "Couldn't enable SGX functional clock (%d)",
+ __func__, res);
return PVRSRV_ERROR_GENERIC;
}
res = clk_enable(psSysSpecData->psSGX_ICK);
if (res < 0) {
- PVR_DPF(PVR_DBG_ERROR, "EnableSGXClocks: "
- "Couldn't enable SGX interface clock (%d)", res);
+ PVR_DPF(PVR_DBG_ERROR, "%s: "
+ "Couldn't enable SGX interface clock (%d)",
+ __func__, res);
clk_disable(psSysSpecData->psSGX_FCK);
return PVRSRV_ERROR_GENERIC;
}
- psSysSpecData->bSGXClocksEnabled = IMG_TRUE;
- sgx_need_perf(psSysData, 1);
+ setup_int_bypass();
+
return PVRSRV_OK;
}
-void DisableSGXClocks(struct SYS_DATA *psSysData)
+static void sgx_force_disable_clocks(struct SYS_DATA *psSysData)
{
struct SYS_SPECIFIC_DATA *psSysSpecData =
(struct SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData;
- if (!psSysSpecData->bSGXClocksEnabled)
- return;
-
- PVR_TRACE("DisableSGXClocks: Disabling SGX Clocks");
-
if (psSysSpecData->psSGX_ICK)
clk_disable(psSysSpecData->psSGX_ICK);
if (psSysSpecData->psSGX_FCK)
clk_disable(psSysSpecData->psSGX_FCK);
+}
+
+#else /* NO_HARDWARE */
+
+static enum PVRSRV_ERROR sgx_force_enable_clocks(struct SYS_DATA *psSYsData)
+{
+ return PVRSRV_OK;
+}
+
+static void sgx_force_disable_clocks(struct SYS_DATA *psSYsData)
+{
+}
+
+#endif /* NO_HARDWARE */
+
+static bool force_clocks_on(void)
+{
+#ifdef CONFIG_PVR_FORCE_CLOCKS_ON
+ return true;
+#else
+ return false;
+#endif
+}
+
+enum PVRSRV_ERROR EnableSGXClocks(struct SYS_DATA *psSysData)
+{
+ struct SYS_SPECIFIC_DATA *psSysSpecData =
+ (struct SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData;
+ enum PVRSRV_ERROR res = PVRSRV_OK;
+
+ if (atomic_xchg(&psSysSpecData->sSGXClocksEnabled, 1))
+ return PVRSRV_OK;
+
+ /*
+ * In case of force clocks on we have already enabled the clocks
+ * at init time.
+ */
+ if (!force_clocks_on())
+ res = sgx_force_enable_clocks(psSysData);
+
+ if (res == PVRSRV_OK) {
+ BUG_ON(!atomic_read(&psSysSpecData->sSGXClocksEnabled));
+ sgx_need_perf(psSysData, 1);
+ } else {
+ atomic_set(&psSysSpecData->sSGXClocksEnabled, 0);
+ }
+
+ return res;
+}
+
+void DisableSGXClocks(struct SYS_DATA *psSysData)
+{
+ struct SYS_SPECIFIC_DATA *psSysSpecData =
+ (struct SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData;
+
+ if (!atomic_xchg(&psSysSpecData->sSGXClocksEnabled, 0))
+ return;
+
+ if (!force_clocks_on())
+ sgx_force_disable_clocks(psSysData);
+
+ BUG_ON(atomic_read(&psSysSpecData->sSGXClocksEnabled));
- psSysSpecData->bSGXClocksEnabled = IMG_FALSE;
sgx_need_perf(psSysData, 0);
}
clk_put(core_ck);
RegisterConstraintNotifications(psSysSpecData);
-
return PVRSRV_OK;
err2:
static void CleanupSgxClocks(struct SYS_DATA *psSysData)
{
struct SYS_SPECIFIC_DATA *psSysSpecData = psSysData->pvSysSpecificData;
-
UnRegisterConstraintNotifications(psSysSpecData);
if (psSysSpecData->psSGX_ICK) {
rate = gpt_read_reg(psSysData, SYS_OMAP3430_GPTIMER_TSICR);
if (!(rate & 4)) {
- PVR_TRACE(
- "Setting GPTIMER11 mode to posted (currently is non-posted)");
+ PVR_TRACE("Setting GPTIMER11 mode to posted "
+ "(currently is non-posted)");
gpt_write_reg(psSysData, SYS_OMAP3430_GPTIMER_TSICR, rate | 4);
}
{
PVR_TRACE("EnableSystemClocks: Enabling System Clocks");
-
+ /*
+ * We force clocks on by increasing their refcount here during
+ * module init time and decreasing it at cleanup time.
+ */
+ if (force_clocks_on())
+ sgx_force_enable_clocks(gpsSysData);
if (EnableDebugClocks(psSysData) != PVRSRV_OK)
goto err1;
{
PVR_TRACE("DisableSystemClocks: Disabling System Clocks");
- DisableSGXClocks(psSysData);
DisableDebugClocks(psSysData);
+ /* Decrease the clocks' refcount that was increased at init time. */
+ if (force_clocks_on())
+ sgx_force_disable_clocks(gpsSysData);
}
ExtDBGDrivWriteCM,
ExtDBGDrivSetMarker,
ExtDBGDrivGetMarker,
- ExtDBGDrivEndInitPhase,
+ ExtDBGDrivStartInitPhase,
+ ExtDBGDrivStopInitPhase,
ExtDBGDrivIsCaptureFrame,
ExtDBGDrivWriteLF,
ExtDBGDrivReadLF,
ExtDBGDrivGetStreamOffset,
ExtDBGDrivSetStreamOffset,
ExtDBGDrivIsLastCaptureFrame,
+ ExtDBGDrivWaitForEvent
};
void *ExtDBGDrivCreateStream(char *pszName,
return ui32Ret;
}
-void ExtDBGDrivEndInitPhase(struct DBG_STREAM *psStream)
+void ExtDBGDrivStartInitPhase(struct DBG_STREAM *psStream)
{
HostAquireMutex(g_pvAPIMutex);
- DBGDrivEndInitPhase(psStream);
+ DBGDrivStartInitPhase(psStream);
+
+ HostReleaseMutex(g_pvAPIMutex);
+
+ return;
+}
+
+void ExtDBGDrivStopInitPhase(struct DBG_STREAM *psStream)
+{
+
+ HostAquireMutex(g_pvAPIMutex);
+
+ DBGDrivStopInitPhase(psStream);
HostReleaseMutex(g_pvAPIMutex);
HostReleaseMutex(g_pvAPIMutex);
}
+void ExtDBGDrivWaitForEvent(enum DBG_EVENT eEvent)
+{
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+ DBGDrivWaitForEvent(eEvent);
+#else
+ PVR_UNREFERENCED_PARAMETER(eEvent);
+#endif
+}
+
u32 AtoI(char *szIn)
{
u32 ui32Len = 0;
if (!StreamValid(psStream))
return 0xFFFFFFFF;
- if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
+ if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
if (!(psStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
return 0;
- else
+ } else {
if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
if ((psStream->ui32Current != g_ui32HotKeyFrame)
|| (g_bHotKeyPressed == IMG_FALSE))
return 0;
+ }
return DBGDrivWriteString(psStream, pszString, ui32Level);
ui32Len = 0;
}
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+ if (ui32Len)
+ HostSignalEvent(DBG_EVENT_STREAM_DATA);
+#endif
+
return ui32Len;
}
if (!(psMainStream->ui32DebugLevel & ui32Level))
return 0xFFFFFFFF;
- if (psMainStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
+ if (psMainStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
if (!(psMainStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
return 0xFFFFFFFF;
- else
+ } else {
if (psMainStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
if ((psMainStream->ui32Current != g_ui32HotKeyFrame)
|| (g_bHotKeyPressed == IMG_FALSE))
return 0xFFFFFFFF;
+ }
+
if (psMainStream->bInitPhaseComplete)
psStream = psMainStream;
else
Write(psStream, (u8 *) &ui32InBuffSize, 4);
Write(psStream, pui8InBuf, ui32InBuffSize);
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+ if (ui32InBuffSize)
+ HostSignalEvent(DBG_EVENT_STREAM_DATA);
+#endif
return ui32InBuffSize;
}
if (!StreamValid(psStream))
return 0xFFFFFFFF;
- if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
+ if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
if (!(psStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
return 0xFFFFFFFF;
- else
+ } else {
if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
if ((psStream->ui32Current != g_ui32HotKeyFrame)
|| (g_bHotKeyPressed == IMG_FALSE))
return 0xFFFFFFFF;
+ }
return DBGDrivWrite2(psStream, pui8InBuf, ui32InBuffSize, ui32Level);
}
if (!(psStream->ui32OutMode & DEBUG_OUTMODE_STREAMENABLE))
return 0;
- if (psStream->ui32Flags & DEBUG_FLAGS_NO_BUF_EXPANDSION)
+ if (psStream->ui32Flags & DEBUG_FLAGS_NO_BUF_EXPANDSION) {
if (ui32Space < 32)
return 0;
- else
+ } else {
if ((ui32Space < 32) || (ui32Space <= (ui32InBuffSize + 4))) {
u32 ui32NewBufSize;
ui32Space = SpaceInStream(psStream);
}
+ }
if (ui32Space <= (ui32InBuffSize + 4))
ui32InBuffSize = ui32Space - 4;
Write(psStream, pui8InBuf, ui32InBuffSize);
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+ if (ui32InBuffSize)
+ HostSignalEvent(DBG_EVENT_STREAM_DATA);
+#endif
return ui32InBuffSize;
}
if (psStream->ui32RPtr == psStream->ui32WPtr)
return 0;
- if (psStream->ui32RPtr <= psStream->ui32WPtr)
+ if (psStream->ui32RPtr <= psStream->ui32WPtr) {
ui32Data = psStream->ui32WPtr - psStream->ui32RPtr;
- else
+ } else {
ui32Data =
psStream->ui32WPtr + (psStream->ui32Size -
psStream->ui32RPtr);
+ }
if (ui32Data > ui32OutBuffSize)
ui32Data = ui32OutBuffSize;
else
psStream->ui32Flags &= ~DEBUG_FLAGS_ENABLESAMPLE;
- if (g_bHotkeyMiddump)
+ if (g_bHotkeyMiddump) {
if ((ui32Frame >= g_ui32HotkeyMiddumpStart) &&
(ui32Frame <= g_ui32HotkeyMiddumpEnd) &&
(((ui32Frame -
if (psStream->ui32Current > g_ui32HotkeyMiddumpEnd)
g_bHotkeyMiddump = IMG_FALSE;
}
+ }
if (g_bHotKeyRegistered) {
g_bHotKeyRegistered = IMG_FALSE;
}
if ((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
- && (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY))
+ && (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY)) {
if (!g_bHotkeyMiddump) {
g_ui32HotkeyMiddumpStart =
PVR_DPF(PVR_DBG_MESSAGE,
"Turning off sampling\n");
}
+ }
}
if (!StreamValid(psStream))
return IMG_FALSE;
- if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
+ if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
if (g_bHotkeyMiddump) {
if ((psStream->ui32Current >=
psStream->ui32SampleRate) == 0))
return IMG_TRUE;
}
- else
- if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
+ } else if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY) {
if ((psStream->ui32Current ==
(g_ui32HotKeyFrame - ui32FrameShift))
&& (g_bHotKeyPressed))
return IMG_TRUE;
+ }
return IMG_FALSE;
if (!(psStream->ui32DebugLevel & ui32Level))
return 0xFFFFFFFF;
- if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
+ if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
if (!(psStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
return 0xFFFFFFFF;
- else
- if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
+ } else if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY) {
if ((psStream->ui32Current != g_ui32HotKeyFrame)
|| (g_bHotKeyPressed == IMG_FALSE))
return 0xFFFFFFFF;
+ }
psLFBuffer = FindLFBuf(psStream);
return ui32Data;
}
-void DBGDrivEndInitPhase(struct DBG_STREAM *psStream)
+void DBGDrivStartInitPhase(struct DBG_STREAM *psStream)
+{
+ psStream->bInitPhaseComplete = IMG_FALSE;
+}
+
+void DBGDrivStopInitPhase(struct DBG_STREAM *psStream)
{
psStream->bInitPhaseComplete = IMG_TRUE;
}
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+void DBGDrivWaitForEvent(enum DBG_EVENT eEvent)
+{
+ HostWaitForEvent(eEvent);
+}
+#endif
+
static IMG_BOOL ExpandStreamBuffer(struct DBG_STREAM *psStream, u32 ui32NewSize)
{
void *pvNewBuf;
u32 DBGDrivReadLF(struct DBG_STREAM *psStream,
u32 ui32OutBuffSize,
u8 *pui8OutBuf);
-void DBGDrivEndInitPhase(struct DBG_STREAM *psStream);
+void DBGDrivStartInitPhase(struct DBG_STREAM *psStream);
+void DBGDrivStopInitPhase(struct DBG_STREAM *psStream);
u32 DBGDrivGetStreamOffset(struct DBG_STREAM *psStream);
-void DBGDrivSetStreamOffset(struct DBG_STREAM *psStream,
- u32 ui32StreamOffset);
+void DBGDrivSetStreamOffset(struct DBG_STREAM *psStream, u32 ui32StreamOffset);
+void DBGDrivWaitForEvent(enum DBG_EVENT eEvent);
void DestroyAllStreams(void);
void ExtDBGDrivOverrideMode(struct DBG_STREAM *psStream,
u32 ui32Mode);
void ExtDBGDrivDefaultMode(struct DBG_STREAM *psStream);
-u32 ExtDBGDrivWrite2(struct DBG_STREAM *psStream,
- u8 *pui8InBuf,
- u32 ui32InBuffSize,
- u32 ui32Level);
-u32 ExtDBGDrivWriteStringCM(struct DBG_STREAM *psStream,
- char *pszString,
- u32 ui32Level);
-u32 ExtDBGDrivWriteCM(struct DBG_STREAM *psStream,
- u8 *pui8InBuf,
- u32 ui32InBuffSize,
+u32 ExtDBGDrivWrite2(struct DBG_STREAM *psStream, u8 *pui8InBuf,
+ u32 ui32InBuffSize, u32 ui32Level);
+u32 ExtDBGDrivWriteStringCM(struct DBG_STREAM *psStream, char *pszString,
u32 ui32Level);
-void ExtDBGDrivSetMarker(struct DBG_STREAM *psStream,
- u32 ui32Marker);
+u32 ExtDBGDrivWriteCM(struct DBG_STREAM *psStream, u8 *pui8InBuf,
+ u32 ui32InBuffSize, u32 ui32Level);
+void ExtDBGDrivSetMarker(struct DBG_STREAM *psStream, u32 ui32Marker);
u32 ExtDBGDrivGetMarker(struct DBG_STREAM *psStream);
-void ExtDBGDrivEndInitPhase(struct DBG_STREAM *psStream);
+void ExtDBGDrivStartInitPhase(struct DBG_STREAM *psStream);
+void ExtDBGDrivStopInitPhase(struct DBG_STREAM *psStream);
u32 ExtDBGDrivIsLastCaptureFrame(struct DBG_STREAM *psStream);
u32 ExtDBGDrivIsCaptureFrame(struct DBG_STREAM *psStream,
IMG_BOOL bCheckPreviousFrame);
u32 ExtDBGDrivGetStreamOffset(struct DBG_STREAM *psStream);
void ExtDBGDrivSetStreamOffset(struct DBG_STREAM *psStream,
u32 ui32StreamOffset);
+void ExtDBGDrivWaitForEvent(enum DBG_EVENT eEvent);
#endif
*
******************************************************************************/
+#include <linux/version.h>
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <asm/page.h>
#include <linux/vmalloc.h>
+#include <linux/mutex.h>
+#include <linux/hardirq.h>
+
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+#include <linux/sched.h>
+#include <linux/wait.h>
+#include <linux/jiffies.h>
+#include <linux/delay.h>
+#endif
#include "img_types.h"
#include "pvr_debug.h"
-u32 gPVRDebugLevel = DBGPRIV_WARNING;
+#include "dbgdrvif.h"
+#include "hostfunc.h"
#define PVR_STRING_TERMINATOR '\0'
#define PVR_IS_FILE_SEPARATOR(character) \
(((character) == '\\') || ((character) == '/'))
+static u32 gPVRDebugLevel = DBGPRIV_WARNING;
+
void PVRSRVDebugPrintf(u32 ui32DebugLevel,
const char *pszFileName,
u32 ui32Line, const char *pszFormat, ...
void *HostCreateMutex(void)
{
+ struct mutex *psSem;
- return NULL;
+ psSem = kmalloc(sizeof(*psSem), GFP_KERNEL);
+ if (psSem)
+ mutex_init(psSem);
+
+ return psSem;
}
void HostAquireMutex(void *pvMutex)
{
+ BUG_ON(in_interrupt());
+#if defined(PVR_DEBUG_DBGDRV_DETECT_HOST_MUTEX_COLLISIONS)
+ if (mutex_trylock((struct mutex *)pvMutex)) {
+ printk(KERN_INFO "HostAquireMutex: Waiting for mutex\n");
+ mutex_lock((struct mutex *)pvMutex);
+ }
+#else
+ mutex_lock((struct mutex *)pvMutex);
+#endif
}
void HostReleaseMutex(void *pvMutex)
{
-
+ mutex_unlock((struct mutex *)pvMutex);
}
void HostDestroyMutex(void *pvMutex)
{
+ kfree(pvMutex);
+}
+
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+
+#define EVENT_WAIT_TIMEOUT_MS 500
+#define EVENT_WAIT_TIMEOUT_JIFFIES (EVENT_WAIT_TIMEOUT_MS * HZ / 1000)
+
+static int iStreamData;
+static wait_queue_head_t sStreamDataEvent;
+
+s32 HostCreateEventObjects(void)
+{
+ init_waitqueue_head(&sStreamDataEvent);
+ return 0;
+}
+
+void HostWaitForEvent(enum DBG_EVENT eEvent)
+{
+ switch (eEvent) {
+ case DBG_EVENT_STREAM_DATA:
+
+ wait_event_interruptible_timeout(sStreamDataEvent,
+ iStreamData != 0,
+ EVENT_WAIT_TIMEOUT_JIFFIES);
+ iStreamData = 0;
+ break;
+ default:
+
+ msleep_interruptible(EVENT_WAIT_TIMEOUT_MS);
+ break;
+ }
+}
+
+void HostSignalEvent(enum DBG_EVENT eEvent)
+{
+ switch (eEvent) {
+ case DBG_EVENT_STREAM_DATA:
+ iStreamData = 1;
+ wake_up_interruptible(&sStreamDataEvent);
+ break;
+ default:
+ break;
+ }
+}
+
+void HostDestroyEventObjects(void)
+{
}
+#endif
void HostReleaseMutex(void *pvMutex);
void HostDestroyMutex(void *pvMutex);
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+s32 HostCreateEventObjects(void);
+void HostWaitForEvent(enum DBG_EVENT eEvent);
+void HostSignalEvent(enum DBG_EVENT eEvent);
+void HostDestroyEventObjects(void);
+#endif
+
#endif
ReadInHotKeys();
- if (!g_PrivateHotKeyData.sHotKeyInfo.hHotKey)
+ if (!g_PrivateHotKeyData.sHotKeyInfo.hHotKey) {
if (g_PrivateHotKeyData.ui32ScanCode != 0) {
PVR_DPF(PVR_DBG_MESSAGE,
"Activate HotKey for PDUMP.\n");
} else {
g_PrivateHotKeyData.sHotKeyInfo.hHotKey = 0;
}
+ }
}
void DeactivateHotKeys(void)
return IMG_TRUE;
}
-u32 DBGDIOCDrivResetStream(void *pvInBuffer, void *pvOutBuffer)
+u32 DBGDIOCDrivWaitForEvent(void *pvInBuffer, void *pvOutBuffer)
{
- u32 *pui32BytesCopied;
- struct DBG_IN_READ *psInParams;
+ enum DBG_EVENT eEvent = (enum DBG_EVENT)(*(u32 *) pvInBuffer);
- psInParams = (struct DBG_IN_READ *)pvInBuffer;
- pui32BytesCopied = (u32 *) pvOutBuffer;
+ PVR_UNREFERENCED_PARAMETER(pvOutBuffer);
- *pui32BytesCopied =
- ExtDBGDrivReadLF((struct DBG_STREAM *)psInParams->pvStream,
- psInParams->ui32OutBufferSize,
- psInParams->pui8OutBuffer);
+ ExtDBGDrivWaitForEvent(eEvent);
return IMG_TRUE;
}
u32 DBGDIOCDrivIsCaptureFrame(void *, void *);
u32 DBGDIOCDrivWriteLF(void *, void *);
u32 DBGDIOCDrivReadLF(void *, void *);
-u32 DBGDIOCDrivResetStream(void *, void *);
+u32 DBGDIOCDrivWaitForEvent(void *, void *);
u32(*g_DBGDrivProc[])(void *, void *) = {
DBGDIOCDrivCreateStream,
DBGDIOCDrivSetMarker,
DBGDIOCDrivGetMarker,
DBGDIOCDrivIsCaptureFrame,
- DBGDIOCDrivWriteLF, DBGDIOCDrivReadLF, DBGDIOCDrivResetStream,};
+ DBGDIOCDrivWriteLF, DBGDIOCDrivReadLF, DBGDIOCDrivWaitForEvent};
#define MAX_DBGVXD_W32_API (sizeof(g_DBGDrivProc)/sizeof(u32))
static int AssignedMajorNumber;
-static int dbgdrv_ioctl(struct inode *, struct file *, unsigned int,
- unsigned long);
+static long dbgdrv_ioctl(struct file *, unsigned int, unsigned long);
static int dbgdrv_open(struct inode unref__ * pInode,
struct file unref__ * pFile)
return 0;
}
-const static struct file_operations dbgdrv_fops = {
- .owner = THIS_MODULE,
- .ioctl = dbgdrv_ioctl,
- .open = dbgdrv_open,
- .release = dbgdrv_release,
- .mmap = dbgdrv_mmap,
+static const struct file_operations dbgdrv_fops = {
+owner: THIS_MODULE,
+unlocked_ioctl : dbgdrv_ioctl,
+open : dbgdrv_open,
+release : dbgdrv_release,
+mmap : dbgdrv_mmap,
};
void DBGDrvGetServiceTable(void **fn_table)
}
EXPORT_SYMBOL(DBGDrvGetServiceTable);
+void cleanup_module(void)
+{
+ if (AssignedMajorNumber > 0)
+ unregister_chrdev(AssignedMajorNumber, DRVNAME);
+
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+ HostDestroyEventObjects();
+#endif
+
+ if (g_pvAPIMutex != NULL)
+ HostDestroyMutex(g_pvAPIMutex);
+
+ return;
+}
+
int init_module(void)
{
+ g_pvAPIMutex = HostCreateMutex();
+ if (g_pvAPIMutex == NULL) {
+ cleanup_module();
+ return -ENOMEM;
+ }
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+
+ (void)HostCreateEventObjects();
+#endif
+
AssignedMajorNumber =
register_chrdev(AssignedMajorNumber, DRVNAME, &dbgdrv_fops);
if (AssignedMajorNumber <= 0) {
PVR_DPF(PVR_DBG_ERROR, " unable to get major\n");
+ cleanup_module();
return -EBUSY;
}
return 0;
}
-void cleanup_module(void)
-{
- unregister_chrdev(AssignedMajorNumber, DRVNAME);
- return;
-}
-
-static int dbgdrv_ioctl(struct inode *inode, struct file *file,
- unsigned int cmd, unsigned long arg)
+static long dbgdrv_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct IOCTL_PACKAGE *pIP = (struct IOCTL_PACKAGE *)arg;
if ((pIP->ui32InBufferSize > (PAGE_SIZE >> 1))
|| (pIP->ui32OutBufferSize > (PAGE_SIZE >> 1))) {
PVR_DPF(PVR_DBG_ERROR,
- "Sizes of the buffers are too large, "
- "cannot do ioctl\n");
+ "Sizes of the buffers are too large, cannot do ioctl\n");
return -1;
}