meego-device-adaptation import version
authorNokia <nokia>
Sat, 19 May 2012 14:13:28 +0000 (17:13 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Sun, 20 May 2012 18:05:27 +0000 (21:05 +0300)
  * PVR: upgrade to version 1.4
  * PVR: fix memory corruption due to incorrect cache flushing
  * pvr: fix SGX HW recovery resets seen during boot
  * pvr: preparation for page flipping
  * PVR: SGX 530r125 support
  * PVR: add support for runtime detection of SGX HW revision
  * PVR: fix SGX power management
  * Fixes: NB#156444 - PVR: kernel crash when binding large texture

118 files changed:
pvr/Kconfig
pvr/Makefile
pvr/bridged_pvr_bridge.c
pvr/bridged_pvr_bridge.h
pvr/bridged_sgx_bridge.c [new file with mode: 0644]
pvr/bridged_sgx_bridge.h [new file with mode: 0644]
pvr/bridged_support.c [new file with mode: 0644]
pvr/bridged_support.h [new file with mode: 0644]
pvr/buffer_manager.c
pvr/buffer_manager.h
pvr/bufferclass_example.c
pvr/bufferclass_example.h
pvr/bufferclass_example_linux.c
pvr/bufferclass_example_private.c
pvr/dbgdrvif.h
pvr/device.h
pvr/deviceclass.c
pvr/devicemem.c
pvr/env_data.h
pvr/env_perproc.h [moved from pvr/mutex.c with 59% similarity]
pvr/event.c
pvr/event.h
pvr/handle.c
pvr/handle.h
pvr/hash.c
pvr/hash.h
pvr/img_defs.h
pvr/img_types.h
pvr/ioctldef.h
pvr/kernelbuffer.h
pvr/kerneldisplay.h
pvr/lock.h [new file with mode: 0644]
pvr/mem.c
pvr/mm.c
pvr/mm.h
pvr/mmap.c
pvr/mmap.h
pvr/mmu.c
pvr/mmu.h
pvr/module.c
pvr/mutex.h
pvr/mutils.h [new file with mode: 0644]
pvr/ocpdefs.h [new file with mode: 0644]
pvr/oemfuncs.h
pvr/omaplfb.h
pvr/omaplfb_displayclass.c
pvr/omaplfb_linux.c
pvr/osfunc.c
pvr/osfunc.h
pvr/osperproc.c [new file with mode: 0644]
pvr/osperproc.h [new file with mode: 0644]
pvr/pb.c
pvr/pdump.c
pvr/pdump_common.c [new file with mode: 0644]
pvr/pdump_km.h
pvr/pdumpdefs.h
pvr/perproc.c
pvr/perproc.h
pvr/power.c
pvr/power.h
pvr/private_data.h [new file with mode: 0644]
pvr/proc.c
pvr/proc.h
pvr/pvr_bridge.h
pvr/pvr_bridge_k.c
pvr/pvr_bridge_km.h
pvr/pvr_debug.c
pvr/pvr_debug.h
pvr/pvrconfig.h
pvr/pvrmmap.h
pvr/pvrsrv.c
pvr/pvrversion.h
pvr/queue.c
pvr/queue.h
pvr/ra.c
pvr/ra.h
pvr/resman.c
pvr/resman.h
pvr/services.h
pvr/services_headers.h
pvr/servicesext.h
pvr/servicesint.h
pvr/sgx530defs.h
pvr/sgx_bridge.h
pvr/sgx_bridge_km.h
pvr/sgx_options.h [new file with mode: 0644]
pvr/sgxapi_km.h
pvr/sgxconfig.h
pvr/sgxcoretypes.h
pvr/sgxdefs.h
pvr/sgxerrata.h
pvr/sgxfeaturedefs.h
pvr/sgxinfo.h
pvr/sgxinfokm.h
pvr/sgxinit.c
pvr/sgxkick.c
pvr/sgxmmu.h
pvr/sgxpower.c [new file with mode: 0644]
pvr/sgxreset.c
pvr/sgxscript.h
pvr/sgxtransfer.c
pvr/sgxutils.c
pvr/sgxutils.h
pvr/srvkm.h
pvr/syscommon.h
pvr/sysconfig.c
pvr/sysconfig.h
pvr/sysinfo.h
pvr/syslocal.h
pvr/sysutils.c [moved from pvr/sysutils_linux.c with 78% similarity]
pvr/tools/dbgdriv.c
pvr/tools/dbgdriv.h
pvr/tools/hostfunc.c
pvr/tools/hostfunc.h
pvr/tools/hotkey.c
pvr/tools/ioctl.c
pvr/tools/ioctl.h
pvr/tools/main.c

index a5ed44b..2021d31 100644 (file)
@@ -15,6 +15,29 @@ config PVR_TIMING
        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
index cdd5956..81db9be 100644 (file)
@@ -3,23 +3,41 @@ obj-$(CONFIG_PVR)     += omaplfb.o pvrsrvkm.o
 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)
+
 
index c9aaeb1..abbf7f1 100644 (file)
 #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];
@@ -61,11 +59,13 @@ struct PVRSRV_BRIDGE_GLOBAL_STATS g_BridgeGlobalStats;
 #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;
@@ -73,76 +73,18 @@ static enum PVRSRV_ERROR CopyFromUserWrapper(struct PVRSRV_PER_PROCESS_DATA
        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)
 {
@@ -175,71 +117,11 @@ static int PVRSRVAcquireDeviceDataBW(u32 ui32BridgeID,
        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;
 }
@@ -260,24 +142,20 @@ static int PVRSRVCreateDeviceMemContextBW(u32 ui32BridgeID,
        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;
@@ -302,7 +180,6 @@ static int PVRSRVCreateDeviceMemContextBW(u32 ui32BridgeID,
                void *hDevMemHeapExt;
 
                if (abSharedDeviceMemHeap[i]) {
-
                        PVRSRVAllocHandleNR(psPerProc->psHandleBase,
                                        &hDevMemHeapExt,
                                        psCreateDevMemContextOUT->
@@ -310,16 +187,15 @@ static int PVRSRVCreateDeviceMemContextBW(u32 ui32BridgeID,
                                        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(
@@ -334,11 +210,11 @@ static int PVRSRVCreateDeviceMemContextBW(u32 ui32BridgeID,
                        }
                }
                psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap =
-                       hDevMemHeapExt;
+                                                               hDevMemHeapExt;
        }
 
        COMMIT_HANDLE_BATCH_OR_ERROR(psCreateDevMemContextOUT->eError,
-                       psPerProc);
+                                                               psPerProc);
 
        return 0;
 }
@@ -355,33 +231,30 @@ static int PVRSRVDestroyDeviceMemContextBW(u32 ui32BridgeID,
        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);
@@ -425,14 +298,13 @@ static int PVRSRVGetDeviceMemHeapInfoBW(u32 ui32BridgeID,
                                 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,
@@ -440,7 +312,6 @@ static int PVRSRVGetDeviceMemHeapInfoBW(u32 ui32BridgeID,
                               PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
                               PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
                } else {
-
                        psGetDevMemHeapInfoOUT->eError =
                            PVRSRVFindHandle(psPerProc->psHandleBase,
                                             &hDevMemHeapExt,
@@ -489,9 +360,7 @@ static int PVRSRVAllocDeviceMemBW(u32 ui32BridgeID,
                return 0;
 
        psAllocDeviceMemOUT->eError =
-           PVRSRVAllocDeviceMemKM(hDevCookieInt,
-                                  psPerProc,
-                                  hDevMemHeapInt,
+           PVRSRVAllocDeviceMemKM(hDevCookieInt, psPerProc, hDevMemHeapInt,
                                   psAllocDeviceMemIN->ui32Attribs,
                                   psAllocDeviceMemIN->ui32Size,
                                   psAllocDeviceMemIN->ui32Alignment,
@@ -500,22 +369,19 @@ static int PVRSRVAllocDeviceMemBW(u32 ui32BridgeID,
        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,
@@ -524,15 +390,14 @@ static int PVRSRVAllocDeviceMemBW(u32 ui32BridgeID,
                            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;
@@ -543,7 +408,7 @@ static int PVRSRVAllocDeviceMemBW(u32 ui32BridgeID,
 
                psAllocDeviceMemOUT->sClientSyncInfo.hMappingInfo =
                    psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.
-                   hOSMemHandle;
+                                                               hOSMemHandle;
 
                PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
                                       &psAllocDeviceMemOUT->sClientSyncInfo.
@@ -572,6 +437,7 @@ static int PVRSRVFreeDeviceMemBW(u32 ui32BridgeID,
 {
        void *hDevCookieInt;
        void *pvKernelMemInfo;
+       struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
 
        PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_FREE_DEVICEMEM);
 
@@ -591,16 +457,82 @@ static int PVRSRVFreeDeviceMemBW(u32 ui32BridgeID,
        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;
 }
@@ -618,17 +550,16 @@ static int PVRSRVMapDeviceMemoryBW(u32 ui32BridgeID,
 
        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;
@@ -640,26 +571,23 @@ static int PVRSRVMapDeviceMemoryBW(u32 ui32BridgeID,
        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,
@@ -677,26 +605,26 @@ static int PVRSRVMapDeviceMemoryBW(u32 ui32BridgeID,
                    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);
@@ -731,122 +659,67 @@ static int PVRSRVUnmapDeviceMemoryBW(u32 ui32BridgeID,
        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(&current->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(&current->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(&current->mm->mmap_sem);
 
-       return res;
+       return 0;
 }
 
 static int PVRSRVMapDeviceClassMemoryBW(u32 ui32BridgeID,
@@ -857,6 +730,7 @@ 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,
@@ -872,6 +746,14 @@ static int PVRSRVMapDeviceClassMemoryBW(u32 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:
@@ -882,35 +764,31 @@ static int PVRSRVMapDeviceClassMemoryBW(u32 ui32BridgeID,
        }
 
        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);
@@ -938,12 +816,12 @@ static int PVRSRVMapDeviceClassMemoryBW(u32 ui32BridgeID,
 
                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);
@@ -987,6 +865,7 @@ static int PVRSRVWrapExtMemoryBW(u32 ui32BridgeID,
                      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;
@@ -1002,6 +881,14 @@ static int PVRSRVWrapExtMemoryBW(u32 ui32BridgeID,
        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);
@@ -1011,9 +898,7 @@ static int PVRSRVWrapExtMemoryBW(u32 ui32BridgeID,
                                                   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,
@@ -1022,41 +907,32 @@ static int PVRSRVWrapExtMemoryBW(u32 ui32BridgeID,
                }
        }
 
-       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 =
@@ -1068,17 +944,17 @@ static int PVRSRVWrapExtMemoryBW(u32 ui32BridgeID,
 
        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);
@@ -1095,10 +971,8 @@ static int PVRSRVUnwrapExtMemoryBW(u32 ui32BridgeID,
 
        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;
@@ -1108,8 +982,7 @@ static int PVRSRVUnwrapExtMemoryBW(u32 ui32BridgeID,
        if (psRetOUT->eError != PVRSRV_OK)
                return 0;
 
-       psRetOUT->eError =
-           PVRSRVReleaseHandle(psPerProc->psHandleBase,
+       psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
                                psUnwrapExtMemIN->hKernelMemInfo,
                                PVRSRV_HANDLE_TYPE_MEM_INFO);
 
@@ -1134,28 +1007,40 @@ static int PVRSRVGetFreeDeviceMemBW(u32 ui32BridgeID,
        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)
 {
@@ -1237,11 +1122,10 @@ static int PDumpMemPolBW(u32 ui32BridgeID,
 
        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;
 
@@ -1264,47 +1148,22 @@ static int PDumpMemBW(u32 ui32BridgeID,
           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;
 }
@@ -1317,8 +1176,7 @@ static int PDumpBitmapBW(u32 ui32BridgeID,
        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,
@@ -1340,8 +1198,7 @@ static int PDumpReadRegBW(u32 ui32BridgeID,
        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,
@@ -1363,9 +1220,8 @@ static int PDumpDriverInfoBW(u32 ui32BridgeID,
        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;
 }
@@ -1375,7 +1231,6 @@ static int PDumpSyncDumpBW(u32 ui32BridgeID,
                struct PVRSRV_BRIDGE_RETURN *psRetOUT,
                struct PVRSRV_PER_PROCESS_DATA *psPerProc)
 {
-       void *pvAltLinAddrKM = NULL;
        u32 ui32Bytes = psPDumpSyncDumpIN->ui32Bytes;
        void *pvSyncInfo;
 
@@ -1388,34 +1243,13 @@ static int PDumpSyncDumpBW(u32 ui32BridgeID,
        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;
 }
@@ -1472,10 +1306,10 @@ static int PDumpPDRegBW(u32 ui32BridgeID,
 }
 
 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);
@@ -1489,8 +1323,7 @@ static int PDumpCycleCountRegReadBW(u32 ui32BridgeID,
        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)
@@ -1515,1572 +1348,35 @@ PDumpPDDevPAddrBW(u32 ui32BridgeID,
        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,
@@ -3094,18 +1390,29 @@ static int PVRSRVGetMiscInfoBW(u32 ui32BridgeID,
        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 *)
@@ -3119,36 +1426,54 @@ static int PVRSRVGetMiscInfoBW(u32 ui32BridgeID,
                          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)
 {
@@ -3159,11 +1484,19 @@ static int PVRSRVConnectBW(u32 ui32BridgeID,
        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)
 {
@@ -3217,8 +1550,7 @@ static int PVRSRVOpenDCDeviceBW(u32 ui32BridgeID,
        if (psOpenDispClassDeviceOUT->eError != PVRSRV_OK)
                return 0;
 
-       psOpenDispClassDeviceOUT->eError =
-           PVRSRVOpenDCDeviceKM(psPerProc,
+       psOpenDispClassDeviceOUT->eError = PVRSRVOpenDCDeviceKM(psPerProc,
                                 psOpenDispClassDeviceIN->ui32DeviceID,
                                 hDevCookieInt, &hDispClassInfoInt);
 
@@ -3415,17 +1747,13 @@ static int PVRSRVCreateDCSwapChainBW(u32 ui32BridgeID,
 
        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;
@@ -3659,13 +1987,13 @@ static int PVRSRVGetDCBuffersBW(u32 ui32BridgeID,
                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;
        }
@@ -3687,11 +2015,10 @@ static int PVRSRVSwapToDCBufferBW(u32 ui32BridgeID,
        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;
 
@@ -3798,8 +2125,7 @@ static int PVRSRVCloseBCDeviceBW(u32 ui32BridgeID,
        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);
@@ -3878,8 +2204,8 @@ static int PVRSRVGetBCBufferBW(u32 ui32BridgeID,
                               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,
@@ -3911,25 +2237,22 @@ static int PVRSRVAllocSharedSysMemoryBW(u32 ui32BridgeID,
        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);
 
@@ -3948,7 +2271,7 @@ static int PVRSRVFreeSharedSysMemoryBW(u32 ui32BridgeID,
 
        psFreeSharedSysMemOUT->eError =
            PVRSRVLookupHandle(psPerProc->psHandleBase,
-                              (void **) &psKernelMemInfo,
+                              (void **)&psKernelMemInfo,
                               psFreeSharedSysMemIN->psKernelMemInfo,
                               PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
 
@@ -3981,8 +2304,7 @@ static int PVRSRVMapMemInfoMemBW(u32 ui32BridgeID,
 
        psMapMemInfoMemOUT->eError =
            PVRSRVLookupHandleAnyType(psPerProc->psHandleBase,
-                                     (void **) &psKernelMemInfo,
-                                     &eHandleType,
+                                     (void **)&psKernelMemInfo, &eHandleType,
                                      psMapMemInfoMemIN->hKernelMemInfo);
        if (psMapMemInfoMemOUT->eError != PVRSRV_OK)
                return 0;
@@ -3998,8 +2320,7 @@ static int PVRSRVMapMemInfoMemBW(u32 ui32BridgeID,
        }
 
        psMapMemInfoMemOUT->eError =
-           PVRSRVGetParentHandle(psPerProc->psHandleBase,
-                                 &hParent,
+           PVRSRVGetParentHandle(psPerProc->psHandleBase, &hParent,
                                  psMapMemInfoMemIN->hKernelMemInfo,
                                  eHandleType);
        if (psMapMemInfoMemOUT->eError != PVRSRV_OK)
@@ -4010,59 +2331,51 @@ static int PVRSRVMapMemInfoMemBW(u32 ui32BridgeID,
        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);
@@ -4070,6 +2383,58 @@ static int PVRSRVMapMemInfoMemBW(u32 ui32BridgeID,
        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,
@@ -4088,7 +2453,8 @@ static int MMU_GetPDDevPAddrBW(u32 ui32BridgeID,
                return 0;
 
        psGetMmuPDDevPAddrOUT->sPDDevPAddr =
-           MMU_GetPDDevPAddr(BM_GetMMUContextFromMemContext
+           BM_GetDeviceNode(hDevMemContextInt)->
+           pfnMMUGetPDDevPAddr(BM_GetMMUContextFromMemContext
                              (hDevMemContextInt));
        if (psGetMmuPDDevPAddrOUT->sPDDevPAddr.uiAddr)
                psGetMmuPDDevPAddrOUT->eError = PVRSRV_OK;
@@ -4097,8 +2463,8 @@ static int MMU_GetPDDevPAddrBW(u32 ui32BridgeID,
        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);
@@ -4120,80 +2486,217 @@ static int DummyBW(u32 ui32BridgeID, void *psBridgeIn,
        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)
@@ -4219,8 +2722,8 @@ 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);
@@ -4240,6 +2743,10 @@ enum PVRSRV_ERROR CommonBridgeInit(void)
                              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);
 
@@ -4276,16 +2783,12 @@ enum PVRSRV_ERROR CommonBridgeInit(void)
        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);
@@ -4359,56 +2862,17 @@ enum PVRSRV_ERROR CommonBridgeInit(void)
        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;
@@ -4419,114 +2883,461 @@ enum PVRSRV_ERROR CommonBridgeInit(void)
        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;
 }
index 912e843..7249802 100644 (file)
 
 #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);
@@ -44,10 +112,33 @@ struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY {
 };
 
 #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;
diff --git a/pvr/bridged_sgx_bridge.c b/pvr/bridged_sgx_bridge.c
new file mode 100644 (file)
index 0000000..adbd436
--- /dev/null
@@ -0,0 +1,1813 @@
+/**********************************************************************
+ *
+ * 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
+}
diff --git a/pvr/bridged_sgx_bridge.h b/pvr/bridged_sgx_bridge.h
new file mode 100644 (file)
index 0000000..3867dc4
--- /dev/null
@@ -0,0 +1,167 @@
+/**********************************************************************
+ *
+ * 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
diff --git a/pvr/bridged_support.c b/pvr/bridged_support.c
new file mode 100644 (file)
index 0000000..499a3df
--- /dev/null
@@ -0,0 +1,77 @@
+/**********************************************************************
+ *
+ * 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;;
+}
diff --git a/pvr/bridged_support.h b/pvr/bridged_support.h
new file mode 100644 (file)
index 0000000..96b8643
--- /dev/null
@@ -0,0 +1,35 @@
+/**********************************************************************
+ *
+ * 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
index d8c328e..7d633dc 100644 (file)
@@ -30,9 +30,6 @@
 #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,
@@ -43,7 +40,7 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uSize,
                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);
 
@@ -56,49 +53,44 @@ static IMG_BOOL AllocMemory(struct BM_CONTEXT *pBMContext,
        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;
@@ -112,35 +104,37 @@ static IMG_BOOL AllocMemory(struct BM_CONTEXT *pBMContext,
                        }
                }
 
-               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;
@@ -164,7 +158,7 @@ static IMG_BOOL AllocMemory(struct BM_CONTEXT *pBMContext,
        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);
 
@@ -201,9 +195,8 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
        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;
@@ -223,8 +216,8 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
 
                        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",
@@ -244,8 +237,8 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
                                                   &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;
                        }
@@ -259,8 +252,8 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
                                        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;
                        }
@@ -269,23 +262,19 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
                        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) {
@@ -309,9 +298,8 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
                        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)
@@ -319,14 +307,12 @@ static IMG_BOOL WrapMemory(struct BM_HEAP *psBMHeap,
                        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);
 
@@ -374,8 +360,8 @@ static IMG_BOOL ZeroBuf(struct BM_BUF *pBuf, struct BM_MAPPING *pMapping,
 
        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 |
@@ -388,10 +374,9 @@ static IMG_BOOL ZeroBuf(struct BM_BUF *pBuf, struct BM_MAPPING *pMapping,
                        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;
@@ -416,8 +401,8 @@ static IMG_BOOL ZeroBuf(struct BM_BUF *pBuf, struct BM_MAPPING *pMapping,
                        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: "
@@ -428,8 +413,8 @@ static IMG_BOOL ZeroBuf(struct BM_BUF *pBuf, struct BM_MAPPING *pMapping,
                        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);
 
@@ -445,31 +430,26 @@ static void FreeBuf(struct BM_BUF *pBuf, u32 ui32Flags)
 {
        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 {
@@ -515,9 +495,21 @@ static void FreeBuf(struct BM_BUF *pBuf, u32 ui32Flags)
 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);
 }
 
@@ -534,15 +526,14 @@ static enum PVRSRV_ERROR BM_DestroyContextCallBack(void *pvParam, u32 ui32Param)
 
        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;
                }
 
@@ -563,16 +554,12 @@ static enum PVRSRV_ERROR BM_DestroyContextCallBack(void *pvParam, u32 ui32Param)
                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;
                        }
        }
@@ -611,18 +598,14 @@ void *BM_CreateContext(struct PVRSRV_DEVICE_NODE *psDeviceNode,
        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;
        }
@@ -651,6 +634,13 @@ void *BM_CreateContext(struct PVRSRV_DEVICE_NODE *psDeviceNode,
        } 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 =
@@ -662,25 +652,20 @@ void *BM_CreateContext(struct PVRSRV_DEVICE_NODE *psDeviceNode,
                        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,
@@ -725,8 +710,7 @@ void *BM_CreateHeap(void *hBMContext,
                }
        }
 
-       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;
@@ -739,6 +723,8 @@ void *BM_CreateHeap(void *hBMContext,
        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;
 
@@ -755,7 +741,7 @@ void *BM_CreateHeap(void *hBMContext,
 
        psBMHeap->pImportArena = RA_Create(psDevMemHeapInfo->pszBSName,
                                           0, 0, NULL,
-                                          HOST_PAGESIZE(),
+                                          psBMHeap->sDevArena.ui32DataPageSize,
                                           BM_ImportMemory,
                                           BM_FreeMemory, NULL, psBMHeap);
        if (psBMHeap->pImportArena == NULL) {
@@ -803,14 +789,14 @@ void BM_DestroyHeap(void *hDevMemHeap)
        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;
                }
 
@@ -819,7 +805,6 @@ void BM_DestroyHeap(void *hDevMemHeap)
                ppsBMHeap = &psBMHeap->pBMContext->psBMHeap;
                while (*ppsBMHeap) {
                        if (*ppsBMHeap == psBMHeap) {
-
                                *ppsBMHeap = psBMHeap->psNext;
                                OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
                                          sizeof(struct BM_HEAP), psBMHeap,
@@ -841,20 +826,23 @@ IMG_BOOL BM_Reinitialise(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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)",
@@ -869,26 +857,22 @@ IMG_BOOL BM_Alloc(void *hDevMemHeap,
        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;
@@ -899,55 +883,9 @@ IMG_BOOL BM_Alloc(void *hDevMemHeap,
        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;
@@ -959,9 +897,8 @@ IMG_BOOL BM_Wrap(void *hDevMemHeap, u32 ui32Size, u32 ui32Offset,
        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;
@@ -984,56 +921,47 @@ IMG_BOOL BM_Wrap(void *hDevMemHeap, u32 ui32Size, u32 ui32Offset,
                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;
@@ -1048,11 +976,9 @@ IMG_BOOL BM_Wrap(void *hDevMemHeap, u32 ui32Size, u32 ui32Offset,
        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;
 }
 
@@ -1060,18 +986,15 @@ void BM_Free(void *hBuf, u32 ui32Flags)
 {
        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;
@@ -1081,18 +1004,15 @@ void BM_Free(void *hBuf, u32 ui32Flags)
        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);
        }
 }
 
@@ -1101,6 +1021,12 @@ void *BM_HandleToCpuVaddr(void *hBuf)
        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;
@@ -1111,6 +1037,13 @@ struct IMG_DEV_VIRTADDR BM_HandleToDevVaddr(void *hBuf)
        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;
@@ -1121,6 +1054,14 @@ struct IMG_SYS_PHYADDR BM_HandleToSysPaddr(void *hBuf)
        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);
@@ -1132,14 +1073,20 @@ void *BM_HandleToOSMemHandle(void *hBuf)
 
        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)
                ;
@@ -1147,8 +1094,8 @@ IMG_BOOL BM_ContiguousStatistics(u32 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
@@ -1163,12 +1110,11 @@ static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
 #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;
@@ -1177,6 +1123,7 @@ static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
        PDUMPMALLOCPAGES(psDeviceNode->sDevId.eDeviceType,
                         pMapping->DevVAddr.uiAddr, pMapping->CpuVAddr,
                         pMapping->hOSMemHandle, ui32PDumpSize,
+                        pMapping->pBMHeap->sDevArena.ui32DataPageSize,
                         (void *)pMapping);
 
        switch (pMapping->eCpuMemoryOrigin) {
@@ -1185,10 +1132,10 @@ static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
        case hm_contiguous:
                {
                        psDeviceNode->pfnMMUMapPages(pMapping->pBMHeap->
-                                                    pMMUHeap,
+                                                          pMMUHeap,
                                                     pMapping->DevVAddr,
                                                     SysCpuPAddrToSysPAddr
-                                                    (pMapping->CpuPAddr),
+                                                          (pMapping->CpuPAddr),
                                                     pMapping->uSize, uFlags,
                                                     (void *)pMapping);
 
@@ -1198,7 +1145,7 @@ static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
        case hm_env:
                {
                        psDeviceNode->pfnMMUMapShadow(pMapping->pBMHeap->
-                                                     pMMUHeap,
+                                                           pMMUHeap,
                                                      pMapping->DevVAddr,
                                                      pMapping->uSize,
                                                      pMapping->CpuVAddr,
@@ -1211,7 +1158,7 @@ static IMG_BOOL DevMemoryAlloc(struct BM_CONTEXT *pBMContext,
        case hm_wrapped_scatter_virtaddr:
                {
                        psDeviceNode->pfnMMUMapScatter(pMapping->pBMHeap->
-                                                      pMMUHeap,
+                                                            pMMUHeap,
                                                       pMapping->DevVAddr,
                                                       pMapping->psSysAddr,
                                                       pMapping->uSize, uFlags,
@@ -1241,14 +1188,13 @@ static void DevMemoryFree(struct BM_MAPPING *pMapping)
 #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
 
@@ -1270,21 +1216,26 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uRequestSize,
        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;
        }
 
@@ -1300,15 +1251,14 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uRequestSize,
                *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",
@@ -1322,13 +1272,9 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uRequestSize,
 
                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);
@@ -1336,10 +1282,8 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uRequestSize,
                }
 
                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");
@@ -1353,7 +1297,7 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uRequestSize,
                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,
@@ -1362,31 +1306,28 @@ static IMG_BOOL BM_ImportMemory(void *pH, size_t uRequestSize,
                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 {
@@ -1421,19 +1362,23 @@ static void BM_FreeMemory(void *h, u32 _base, struct BM_MAPPING *psMapping)
 
        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) {
index 447213f..45de4d0 100644 (file)
@@ -27,7 +27,6 @@
 #ifndef _BUFFER_MANAGER_H_
 #define _BUFFER_MANAGER_H_
 
-#include <linux/kernel.h>
 #include "img_types.h"
 #include "ra.h"
 #include "perproc.h"
@@ -65,10 +64,6 @@ struct BM_BUF {
 
        struct BM_MAPPING *pMapping;
        u32 ui32RefCount;
-       u32 uHashKey;
-       void *pvKernelSyncInfo;
-       void *pvPageList;
-       void *hOSWrapMem;
 };
 
 struct BM_HEAP {
@@ -106,10 +101,6 @@ void *BM_CreateContext(struct PVRSRV_DEVICE_NODE *psDeviceNode,
                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)
@@ -131,24 +122,21 @@ static inline bool pvr_put_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);
index 07e872d..4f7a8ea 100644 (file)
@@ -27,7 +27,7 @@
 #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)
 {
@@ -95,13 +95,10 @@ static enum PVRSRV_ERROR GetBCInfo(void *hDevice, struct BUFFER_INFO *psBCInfo)
        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;
 
@@ -182,9 +179,9 @@ enum PVRSRV_ERROR BC_Example_Init(void)
 
                        if (BCAllocContigMemory(ui32Size,
                                                &psDevInfo->psSystemBuffer[i].
-                                               hMemHandle,
+                                                       hMemHandle,
                                                &psDevInfo->psSystemBuffer[i].
-                                               sCPUVAddr,
+                                                       sCPUVAddr,
                                                &sSystemBufferCPUPAddr) !=
                            PVRSRV_OK)
                                break;
@@ -196,7 +193,7 @@ enum PVRSRV_ERROR BC_Example_Init(void)
                            CpuPAddrToSysPAddrBC(sSystemBufferCPUPAddr);
                        psDevInfo->psSystemBuffer[i].sPageAlignSysAddr.uiAddr =
                            (psDevInfo->psSystemBuffer[i].sSysAddr.
-                            uiAddr & 0xFFFFF000);
+                                                    uiAddr & 0xFFFFF000);
                        psDevInfo->psSystemBuffer[i].psSyncData = NULL;
                }
 
@@ -240,7 +237,7 @@ enum PVRSRV_ERROR BC_Example_Deinit(void)
                    &psDevInfo->sPVRJTable;
 
                if (psJTable->
-                   pfnPVRSRVRemoveBCDevice(psDevInfo->ui32DeviceID) !=
+                       pfnPVRSRVRemoveBCDevice(psDevInfo->ui32DeviceID) !=
                    PVRSRV_OK)
                        return PVRSRV_ERROR_GENERIC;
 
@@ -251,11 +248,11 @@ enum PVRSRV_ERROR BC_Example_Deinit(void)
 
                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));
index a601368..c9dd094 100644 (file)
 #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
 
@@ -58,7 +60,7 @@ struct BC_EXAMPLE_BUFFER {
        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;
 };
@@ -84,9 +86,9 @@ void *BCAllocKernelMem(u32 ui32Size);
 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);
index 63c57b5..bfb6ab6 100644 (file)
@@ -32,7 +32,7 @@
 
 #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"
@@ -59,9 +59,9 @@ void BCFreeKernelMem(void *pvMem)
        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;
@@ -72,16 +72,16 @@ enum PVRSRV_ERROR BCAllocContigMemory(u32 ui32Size, void **unref__ phMemHandle,
                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)
@@ -103,6 +103,7 @@ struct IMG_CPU_PHYADDR SysPAddrToCpuPAddrBC(struct IMG_SYS_PHYADDR sys_paddr)
 
 enum PVRSRV_ERROR BCOpenPVRServices(void **phPVRServices)
 {
+
        *phPVRServices = NULL;
        return PVRSRV_OK;
 }
@@ -124,13 +125,13 @@ enum PVRSRV_ERROR BCGetLibFuncAddr(void *unref__ hExtDrv, char *szFunctionName,
        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)))
@@ -138,18 +139,13 @@ int BC_Example_Bridge(struct inode *inode, struct file *file, unsigned int cmd,
 
        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;
        }
@@ -157,14 +153,12 @@ int BC_Example_Bridge(struct inode *inode, struct file *file, unsigned int cmd,
        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);
 
index 4e8d398..360524e 100644 (file)
 
 #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;
 
@@ -45,28 +46,18 @@ static void FillYUV420Image(void *pvDest, int width, int height, int bytestride)
                        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;
 
@@ -75,32 +66,23 @@ static void FillYUV420Image(void *pvDest, int width, int height, int bytestride)
        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;
@@ -113,17 +95,18 @@ static void FillYUV422Image(void *pvDest, int width, int height, int bytestride)
        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;
@@ -133,7 +116,8 @@ static void FillRGB565Image(void *pvDest, int width, int height, int bytestride)
 
        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;
@@ -143,8 +127,7 @@ static void FillRGB565Image(void *pvDest, int width, int height, int bytestride)
        }
        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++)
@@ -169,7 +152,6 @@ int FillBuffer(unsigned int ui32BufferIndex)
        psSyncData = psBuffer->psSyncData;
 
        if (psSyncData) {
-
                if (psSyncData->ui32ReadOpsPending !=
                    psSyncData->ui32ReadOpsComplete)
                        return -1;
@@ -180,23 +162,17 @@ int FillBuffer(unsigned int ui32BufferIndex)
        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)
index 325c23e..d8ace97 100644 (file)
 #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;
@@ -289,7 +296,8 @@ struct DBGKM_SERVICE_TABLE {
                        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,
@@ -300,6 +308,7 @@ struct DBGKM_SERVICE_TABLE {
        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;
index 4f9c1af..a5240c4 100644 (file)
@@ -44,7 +44,6 @@ struct MMU_CONTEXT;
 #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
@@ -60,9 +59,12 @@ struct DEVICE_MEMORY_HEAP_INFO {
        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 {
@@ -81,7 +83,10 @@ struct DEV_ARENA_DESCRIPTOR {
        char *pszName;
        struct IMG_DEV_VIRTADDR BaseDevVAddr;
        u32 ui32Size;
-       DEVICE_MEMORY_HEAP_TYPE DevMemHeapType;
+       u32 DevMemHeapType;
+
+       u32 ui32DataPageSize;
+
        struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeapInfo;
 };
 
@@ -94,6 +99,9 @@ struct PVRSRV_DEVICE_NODE {
        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 *);
@@ -102,8 +110,7 @@ struct PVRSRV_DEVICE_NODE {
        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);
@@ -146,7 +153,7 @@ struct PVRSRV_DEVICE_NODE {
        struct DEVICE_MEMORY_INFO sDevMemoryInfo;
        void *pvDevice;
        u32 ui32pvDeviceSize;
-       void *hDeviceOSMemHandle;
+
        struct RESMAN_CONTEXT *hResManContext;
        struct SYS_DATA *psSysData;
        struct RA_ARENA *psLocalDevMemArena;
@@ -161,10 +168,13 @@ enum PVRSRV_ERROR PVRSRVRegisterDevice(struct SYS_DATA *psSysData,
 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);
index 7d64376..6fde440 100644 (file)
 #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;
 };
@@ -66,9 +65,7 @@ struct PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO {
 struct PVRSRV_BC_SRV2BUFFER_KMJTABLE;
 
 struct PVRSRV_BC_BUFFER {
-
        struct PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
-
        struct PVRSRV_BUFFERCLASS_INFO *psBCInfo;
 };
 
@@ -124,13 +121,14 @@ enum PVRSRV_ERROR PVRSRVEnumerateDCKM(enum PVRSRV_DEVICE_CLASS DeviceClass,
 
        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;
        }
@@ -147,8 +145,8 @@ enum PVRSRV_ERROR PVRSRVEnumerateDCKM(enum PVRSRV_DEVICE_CLASS DeviceClass,
 }
 
 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;
@@ -171,7 +169,7 @@ static enum PVRSRV_ERROR PVRSRVRegisterDCDeviceKM(
 
        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");
@@ -263,21 +261,31 @@ static enum PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(u32 ui32DevIndex)
 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;
 }
 
@@ -347,7 +355,7 @@ ErrorExit:
 
        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,
@@ -395,18 +403,30 @@ static enum PVRSRV_ERROR PVRSRVRemoveBCDeviceKM(u32 ui32DevIndex)
 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;
 }
 
@@ -425,8 +445,7 @@ enum PVRSRV_ERROR PVRSRVCloseDCDeviceKM(void *hDeviceKM,
        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;
@@ -439,14 +458,19 @@ static enum PVRSRV_ERROR CloseDCDeviceCallBack(void *pvParam,
 
        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,
@@ -466,7 +490,7 @@ enum PVRSRV_ERROR PVRSRVOpenDCDeviceKM(
        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;
@@ -499,39 +523,44 @@ enum PVRSRV_ERROR PVRSRVOpenDCDeviceKM(
 
 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->
@@ -540,6 +569,7 @@ FoundDevice:
                        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;
@@ -600,8 +630,8 @@ enum PVRSRV_ERROR PVRSRVGetDCSystemBufferKM(void *hDeviceKM, void **phBuffer)
        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;
        }
 
@@ -645,16 +675,16 @@ enum PVRSRV_ERROR PVRSRVGetDCInfoKM(void *hDeviceKM,
 
        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;
 }
@@ -691,22 +721,20 @@ static enum PVRSRV_ERROR DestroyDCSwapChainCallBack(void *pvParam,
        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);
@@ -714,16 +742,13 @@ static enum PVRSRV_ERROR DestroyDCSwapChainCallBack(void *pvParam,
        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;
@@ -732,9 +757,8 @@ enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
        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;
@@ -757,8 +781,8 @@ enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
        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;
        }
@@ -766,8 +790,8 @@ enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
 
        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;
        }
 
@@ -777,8 +801,8 @@ enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
                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");
@@ -797,8 +821,8 @@ enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
 
                apsSyncData[i] =
                    (struct PVRSRV_SYNC_DATA *)psSwapChain->asBuffer[i].
-                   sDeviceClassBuffer.psKernelSyncInfo->psSyncDataMemInfoKM->
-                   pvLinAddrKM;
+                           sDeviceClassBuffer.psKernelSyncInfo->
+                                       psSyncDataMemInfoKM->pvLinAddrKM;
        }
 
        psSwapChain->ui32BufferCount = ui32BufferCount;
@@ -806,18 +830,17 @@ enum PVRSRV_ERROR PVRSRVCreateDCSwapChainKM(struct PVRSRV_PER_PROCESS_DATA
 
        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;
        }
 
@@ -834,26 +857,27 @@ 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;
@@ -871,8 +895,8 @@ enum PVRSRV_ERROR PVRSRVSetDCDstRectKM(void *hDeviceKM,
                                        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;
@@ -928,10 +952,8 @@ enum PVRSRV_ERROR PVRSRVSetDCSrcColourKeyKM(void *hDeviceKM, void *hSwapChain,
                                     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;
@@ -949,26 +971,22 @@ enum PVRSRV_ERROR PVRSRVGetDCBuffersKM(void *hDeviceKM,
        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)
 {
@@ -978,8 +996,6 @@ enum PVRSRV_ERROR PVRSRVSwapToDCBufferKM(void *hDeviceKM,
        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;
@@ -1011,8 +1027,8 @@ enum PVRSRV_ERROR PVRSRVSwapToDCBufferKM(void *hDeviceKM,
                                      (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;
        }
 
@@ -1038,17 +1054,14 @@ enum PVRSRV_ERROR PVRSRVSwapToDCBufferKM(void *hDeviceKM,
                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");
@@ -1071,8 +1084,6 @@ enum PVRSRV_ERROR PVRSRVSwapToDCSystemKM(void *hDeviceKM, void *hSwapChain)
        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;
@@ -1091,10 +1102,14 @@ enum PVRSRV_ERROR PVRSRVSwapToDCSystemKM(void *hDeviceKM, void *hSwapChain)
        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,
@@ -1102,8 +1117,8 @@ enum PVRSRV_ERROR PVRSRVSwapToDCSystemKM(void *hDeviceKM, void *hSwapChain)
                                      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;
        }
 
@@ -1123,17 +1138,14 @@ enum PVRSRV_ERROR PVRSRVSwapToDCSystemKM(void *hDeviceKM, void *hSwapChain)
                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");
@@ -1163,7 +1175,7 @@ static enum PVRSRV_ERROR PVRSRVRegisterSystemISRHandler(
 
        if (SysAcquireData(&psSysData) != PVRSRV_OK) {
                PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterSystemISRHandler: "
-                       "Failed to get SysData");
+                                       "Failed to get SysData");
                return PVRSRV_ERROR_GENERIC;
        }
 
@@ -1174,6 +1186,13 @@ static enum PVRSRV_ERROR PVRSRVRegisterSystemISRHandler(
                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;
@@ -1209,8 +1228,7 @@ void PVRSRVSetDCState(u32 ui32State)
        }
 }
 
-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;
@@ -1259,20 +1277,17 @@ static enum PVRSRV_ERROR CloseBCDeviceCallBack(void *pvParam, u32 ui32Param)
 
                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,
@@ -1293,9 +1308,8 @@ enum PVRSRV_ERROR PVRSRVOpenBCDeviceKM(
        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;
@@ -1330,17 +1344,17 @@ FoundDevice:
 
        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;
@@ -1358,8 +1372,8 @@ FoundDevice:
                    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;
                }
 
@@ -1372,21 +1386,19 @@ FoundDevice:
                                    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");
@@ -1407,11 +1419,8 @@ FoundDevice:
                        }
 
                        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 =
@@ -1425,31 +1434,31 @@ FoundDevice:
                              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;
@@ -1489,10 +1498,10 @@ enum PVRSRV_ERROR PVRSRVGetBCBufferKM(void *hDeviceKM, u32 ui32BufferIndex,
        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;
        }
index 79866aa..6cbcf2c 100644 (file)
 #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)
@@ -49,8 +75,14 @@ enum PVRSRV_ERROR PVRSRVGetDeviceMemHeapsKM(void *hDevCookie,
        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;
@@ -58,7 +90,6 @@ enum PVRSRV_ERROR PVRSRVGetDeviceMemHeapsKM(void *hDevCookie,
        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 =
@@ -70,7 +101,7 @@ enum PVRSRV_ERROR PVRSRVGetDeviceMemHeapsKM(void *hDevCookie,
 
        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;
@@ -91,8 +122,14 @@ enum PVRSRV_ERROR PVRSRVCreateDeviceMemContextKM(void *hDevCookie,
        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;
@@ -102,54 +139,47 @@ enum PVRSRV_ERROR PVRSRVCreateDeviceMemContextKM(void *hDevCookie,
        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;
@@ -184,58 +214,55 @@ enum PVRSRV_ERROR PVRSRVGetDeviceMemHeapInfoKM(void *hDevCookie,
        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;
@@ -256,7 +283,7 @@ static enum PVRSRV_ERROR AllocDeviceMem(void *hDevCookie, void *hDevMemHeap,
 
        *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,
@@ -264,6 +291,8 @@ static enum PVRSRV_ERROR AllocDeviceMem(void *hDevCookie, void *hDevMemHeap,
                return PVRSRV_ERROR_OUT_OF_MEMORY;
        }
 
+       OSMemSet(psMemInfo, 0, sizeof(*psMemInfo));
+
        psMemBlock = &(psMemInfo->sMemBlk);
 
        psMemInfo->ui32Flags = ui32Flags | PVRSRV_MEM_RAM_BACKED_ALLOCATION;
@@ -273,7 +302,7 @@ static enum PVRSRV_ERROR AllocDeviceMem(void *hDevCookie, void *hDevMemHeap,
 
        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;
@@ -282,10 +311,13 @@ static enum PVRSRV_ERROR AllocDeviceMem(void *hDevCookie, void *hDevMemHeap,
        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;
@@ -300,8 +332,12 @@ static enum PVRSRV_ERROR FreeDeviceMem(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo)
 
        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;
@@ -317,7 +353,7 @@ enum PVRSRV_ERROR PVRSRVAllocSyncInfoKM(void *hDevCookie, void *hDevMemContext,
        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) {
@@ -332,16 +368,15 @@ enum PVRSRV_ERROR PVRSRVAllocSyncInfoKM(void *hDevCookie, void *hDevMemContext,
        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;
@@ -358,6 +393,13 @@ enum PVRSRV_ERROR PVRSRVAllocSyncInfoKM(void *hDevCookie, void *hDevMemContext,
        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);
@@ -376,8 +418,9 @@ enum PVRSRV_ERROR PVRSRVFreeSyncInfoKM(
                        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;
 }
@@ -389,6 +432,40 @@ static enum PVRSRV_ERROR FreeDeviceMemCallBack(void *pvParam, u32 ui32Param)
 
        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);
 
@@ -437,7 +514,6 @@ enum PVRSRV_ERROR PVRSRVAllocDeviceMemKM(void *hDevCookie,
        if (ui32Flags & PVRSRV_MEM_NO_SYNCOBJ) {
                psMemInfo->psKernelSyncInfo = NULL;
        } else {
-
                psBMHeap = (struct BM_HEAP *)hDevMemHeap;
                hDevMemContext = (void *) psBMHeap->pBMContext;
                eError = PVRSRVAllocSyncInfoKM(hDevCookie,
@@ -452,18 +528,18 @@ enum PVRSRV_ERROR PVRSRVAllocDeviceMemKM(void *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:
@@ -475,7 +551,7 @@ 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);
@@ -483,8 +559,10 @@ enum PVRSRV_ERROR PVRSRVDissociateDeviceMemKM(void *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;
 }
@@ -508,6 +586,7 @@ enum PVRSRV_ERROR PVRSRVUnwrapExtMemoryKM(
                return PVRSRV_ERROR_INVALID_PARAMS;
 
        ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+
        return PVRSRV_OK;
 }
 
@@ -515,39 +594,49 @@ static enum PVRSRV_ERROR UnwrapExtMemoryCallBack(void *pvParam, u32 ui32Param)
 {
        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;
@@ -557,79 +646,72 @@ enum PVRSRV_ERROR PVRSRVWrapExtMemoryKM(void *hDevCookie,
        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,
@@ -643,35 +725,24 @@ enum PVRSRV_ERROR PVRSRVWrapExtMemoryKM(void *hDevCookie,
 
        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;
 
@@ -679,46 +750,51 @@ enum PVRSRV_ERROR PVRSRVWrapExtMemoryKM(void *hDevCookie,
        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;
 }
@@ -730,16 +806,50 @@ enum PVRSRV_ERROR PVRSRVUnmapDeviceMemoryKM(
                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(
@@ -749,9 +859,10 @@ 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;
@@ -762,6 +873,7 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
        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,
@@ -771,17 +883,15 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
 
        *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");
@@ -793,7 +903,7 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
        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) {
@@ -810,10 +920,19 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
        }
 
        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;
        }
@@ -822,11 +941,10 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
 
        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,
@@ -840,15 +958,24 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
 
        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;
@@ -857,14 +984,22 @@ enum PVRSRV_ERROR PVRSRVMapDeviceMemoryKM(
 
 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;
 }
@@ -876,6 +1011,7 @@ enum PVRSRV_ERROR PVRSRVUnmapDeviceClassMemoryKM(
                return PVRSRV_ERROR_INVALID_PARAMS;
 
        ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+
        return PVRSRV_OK;
 }
 
@@ -891,7 +1027,7 @@ static enum PVRSRV_ERROR UnmapDeviceClassMemoryCallBack(void *pvParam,
 
 enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
                                struct PVRSRV_PER_PROCESS_DATA *psPerProc,
-                               void *hDeviceClassBuffer,
+                               void *hDevMemContext, void *hDeviceClassBuffer,
                                struct PVRSRV_KERNEL_MEM_INFO **ppsMemInfo,
                                void **phOSMapInfo)
 {
@@ -903,15 +1039,18 @@ enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
        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;
@@ -930,25 +1069,43 @@ enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
                                                  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;
        }
 
@@ -956,21 +1113,16 @@ enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
 
        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;
        }
 
@@ -985,6 +1137,8 @@ enum PVRSRV_ERROR PVRSRVMapDeviceClassMemoryKM(
        psMemInfo->ui32AllocSize = ui32ByteSize;
        psMemInfo->psKernelSyncInfo = psDeviceClassBuffer->psKernelSyncInfo;
 
+       psMemInfo->pvSysBackupBuffer = NULL;
+
        psMemInfo->sMemBlk.hResItem =
            ResManRegisterRes(psPerProc->hResManContext,
                              RESMAN_TYPE_DEVICECLASSMEM_MAPPING, psMemInfo, 0,
index 0c5d1a9..7317a51 100644 (file)
 #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;
@@ -43,9 +49,9 @@ struct ENV_DATA {
        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
similarity index 59%
rename from pvr/mutex.c
rename to pvr/env_perproc.h
index f077651..7f092f6 100644 (file)
  *
  ******************************************************************************/
 
-#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
index a435cbb..e538100 100644 (file)
  *
  ******************************************************************************/
 
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
 #include <linux/version.h>
 #include <linux/io.h>
 #include <asm/page.h>
@@ -55,6 +51,7 @@
 #include "env_data.h"
 #include "proc.h"
 #include "mutex.h"
+#include "lock.h"
 #include "event.h"
 
 struct PVRSRV_LINUX_EVENT_OBJECT_LIST {
@@ -66,8 +63,8 @@ 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;
@@ -84,7 +81,7 @@ enum PVRSRV_ERROR LinuxEventObjectListCreate(void **phEventObjectList)
             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;
        }
 
@@ -99,14 +96,13 @@ enum PVRSRV_ERROR LinuxEventObjectListCreate(void **phEventObjectList)
 
 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,
@@ -123,12 +119,13 @@ enum PVRSRV_ERROR LinuxEventObjectDelete(void *hOSEventObjectList,
                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;
@@ -142,11 +139,13 @@ static enum PVRSRV_ERROR LinuxEventObjectDeleteCallback(void *pvParam,
        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);
@@ -170,8 +169,8 @@ enum PVRSRV_ERROR LinuxEventObjectAdd(void *hOSEventObjectList,
 
        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;
        }
 
@@ -188,7 +187,7 @@ enum PVRSRV_ERROR LinuxEventObjectAdd(void *hOSEventObjectList,
        atomic_set(&psLinuxEventObject->sTimeStamp, 0);
        psLinuxEventObject->ui32TimeStampPrevious = 0;
 
-#ifdef DEBUG
+#if defined(DEBUG)
        psLinuxEventObject->ui32Stats = 0;
 #endif
        init_waitqueue_head(&psLinuxEventObject->sWait);
@@ -219,7 +218,8 @@ enum PVRSRV_ERROR LinuxEventObjectSignal(void *hOSEventObjectList)
 
        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);
 
@@ -233,6 +233,7 @@ enum PVRSRV_ERROR LinuxEventObjectSignal(void *hOSEventObjectList)
 
 enum PVRSRV_ERROR LinuxEventObjectWait(void *hOSEventObject, u32 ui32MSTimeout)
 {
+       u32 ui32TimeStamp;
        DEFINE_WAIT(sWait);
 
        struct PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject =
@@ -243,23 +244,26 @@ enum PVRSRV_ERROR LinuxEventObjectWait(void *hOSEventObject, u32 ui32MSTimeout)
        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;
 
index 43e6fa5..54de808 100644 (file)
@@ -27,9 +27,9 @@
 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);
 
index e8093e4..77e28fc 100644 (file)
 #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;
@@ -94,6 +108,7 @@ struct sHandleList {
 };
 
 enum ePVRSRVInternalHandleFlag {
+       INTERNAL_HANDLE_FLAG_NONE = 0x00,
        INTERNAL_HANDLE_FLAG_BATCHED = 0x01,
        INTERNAL_HANDLE_FLAG_BATCHED_PARTIALLY_FREE = 0x02,
 };
@@ -104,7 +119,7 @@ struct sHandle {
        u32 ui32NextIndexPlusOne;
        enum ePVRSRVInternalHandleFlag eInternalFlag;
        enum PVRSRV_HANDLE_ALLOC_FLAG eFlag;
-       u32 ui32PID;
+
        u32 ui32Index;
        struct sHandleList sChildren;
        struct sHandleList sSiblings;
@@ -112,19 +127,24 @@ struct sHandle {
 
 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 {
@@ -136,8 +156,6 @@ 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)
 {
@@ -217,13 +235,10 @@ static inline void *ParentHandle(struct sHandle *psHandle)
                         (((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,
@@ -302,13 +317,10 @@ static inline void UnlinkFromParent(struct PVRSRV_HANDLE_BASE *psBase,
 }
 
 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);
@@ -328,7 +340,7 @@ static inline enum PVRSRV_ERROR HandleListIterate(
 
                ui32Index = psEntry->ui32Next;
 
-               eError = (*pfnIterFunc) (psBase, psHandle);
+               eError = (*pfnIterFunc)(psBase, psHandle);
                if (eError != PVRSRV_OK)
                        return eError;
        }
@@ -337,9 +349,9 @@ static inline enum PVRSRV_ERROR HandleListIterate(
 }
 
 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,
@@ -350,24 +362,24 @@ static inline enum PVRSRV_ERROR IterateOverChildren(
 
 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;
        }
 
@@ -378,8 +390,6 @@ static inline enum PVRSRV_ERROR GetHandleStructure(
                return PVRSRV_ERROR_GENERIC;
        }
 
-       PVR_ASSERT(psBase->ui32PID == psHandle->ui32PID);
-
        *ppsHandle = psHandle;
 
        return PVRSRV_OK;
@@ -391,9 +401,10 @@ static inline void *ParentIfPrivate(struct sHandle *psHandle)
                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);
 
@@ -404,15 +415,12 @@ static inline void InitKey(HAND_KEY aKey, struct PVRSRV_HANDLE_BASE *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;
        }
 }
@@ -420,20 +428,17 @@ static void FreeHandleArray(struct PVRSRV_HANDLE_BASE *psBase)
 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));
@@ -452,35 +457,33 @@ static enum PVRSRV_ERROR FreeHandle(struct PVRSRV_HANDLE_BASE *psBase,
 
        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;
@@ -537,11 +540,10 @@ static enum PVRSRV_ERROR FreeHandleBase(struct PVRSRV_HANDLE_BASE *psBase)
        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;
 }
@@ -549,7 +551,7 @@ static enum PVRSRV_ERROR FreeHandleBase(struct PVRSRV_HANDLE_BASE *psBase)
 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);
 
@@ -558,67 +560,122 @@ static inline void *FindHandle(struct PVRSRV_HANDLE_BASE *psBase, void *pvData,
        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;
 
@@ -636,9 +693,9 @@ static enum PVRSRV_ERROR EnsureFreeHandles(struct PVRSRV_HANDLE_BASE *psBase,
                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;
@@ -655,27 +712,23 @@ static enum PVRSRV_ERROR AllocHandle(struct PVRSRV_HANDLE_BASE *psBase,
                                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) {
@@ -685,9 +738,22 @@ static enum PVRSRV_ERROR AllocHandle(struct PVRSRV_HANDLE_BASE *psBase,
        }
        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);
 
@@ -698,7 +764,7 @@ static enum PVRSRV_ERROR AllocHandle(struct PVRSRV_HANDLE_BASE *psBase,
                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;
                }
@@ -706,26 +772,26 @@ static enum PVRSRV_ERROR AllocHandle(struct PVRSRV_HANDLE_BASE *psBase,
 
        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);
@@ -762,13 +828,11 @@ enum PVRSRV_ERROR PVRSRVAllocHandle(struct PVRSRV_HANDLE_BASE *psBase,
        *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;
@@ -777,13 +841,13 @@ enum PVRSRV_ERROR PVRSRVAllocHandle(struct PVRSRV_HANDLE_BASE *psBase,
                            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;
@@ -825,8 +889,7 @@ enum PVRSRV_ERROR PVRSRVAllocSubHandle(struct PVRSRV_HANDLE_BASE *psBase,
        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;
@@ -838,8 +901,7 @@ enum PVRSRV_ERROR PVRSRVAllocSubHandle(struct PVRSRV_HANDLE_BASE *psBase,
                        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: "
@@ -847,15 +909,12 @@ enum PVRSRV_ERROR PVRSRVAllocSubHandle(struct PVRSRV_HANDLE_BASE *psBase,
                                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;
@@ -865,8 +924,8 @@ enum PVRSRV_ERROR PVRSRVAllocSubHandle(struct PVRSRV_HANDLE_BASE *psBase,
                }
        }
 
-       eError =
-           AllocHandle(psBase, &hHandle, pvData, eType, eFlag, hParentKey);
+       eError = AllocHandle(psBase, &hHandle, pvData, eType, eFlag,
+                            hParentKey);
        if (eError != PVRSRV_OK)
                return eError;
 
@@ -893,12 +952,9 @@ enum PVRSRV_ERROR PVRSRVFindHandle(struct PVRSRV_HANDLE_BASE *psBase,
 
        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;
 
@@ -913,8 +969,7 @@ enum PVRSRV_ERROR PVRSRVLookupHandleAnyType(struct PVRSRV_HANDLE_BASE *psBase,
        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: "
@@ -965,7 +1020,7 @@ enum PVRSRV_ERROR PVRSRVLookupSubHandle(struct PVRSRV_HANDLE_BASE *psBase,
        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;
        }
@@ -1021,7 +1076,7 @@ enum PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(
        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;
        }
@@ -1061,21 +1116,23 @@ enum PVRSRV_ERROR PVRSRVNewHandleBatch(struct PVRSRV_HANDLE_BASE *psBase,
 
        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;
        }
 
@@ -1106,8 +1163,8 @@ static enum PVRSRV_ERROR PVRSRVHandleBatchCommitOrRelease(
                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;
        }
 
@@ -1132,8 +1189,9 @@ static enum PVRSRV_ERROR PVRSRVHandleBatchCommitOrRelease(
                        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);
@@ -1185,35 +1243,135 @@ void PVRSRVReleaseHandleBatch(struct PVRSRV_HANDLE_BASE *psBase)
        (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;
 
@@ -1230,6 +1388,10 @@ enum PVRSRV_ERROR PVRSRVFreeHandleBase(struct PVRSRV_HANDLE_BASE *psBase)
        PVR_ASSERT(psBase != gpsKernelHandleBase);
 
        eError = FreeHandleBase(psBase);
+       if (eError != PVRSRV_OK)
+               PVR_DPF(PVR_DBG_ERROR,
+                        "PVRSRVFreeHandleBase: FreeHandleBase failed (%d)",
+                        eError);
 
        return eError;
 }
@@ -1240,8 +1402,25 @@ enum PVRSRV_ERROR PVRSRVHandleInit(void)
 
        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;
 }
 
@@ -1251,8 +1430,13 @@ enum PVRSRV_ERROR PVRSRVHandleDeInit(void)
 
        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;
index 615036d..668e5d8 100644 (file)
@@ -52,13 +52,18 @@ enum PVRSRV_HANDLE_TYPE {
        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;
@@ -117,8 +122,16 @@ enum PVRSRV_ERROR PVRSRVCommitHandleBatch(struct PVRSRV_HANDLE_BASE *psBase);
 
 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);
 
@@ -131,7 +144,7 @@ enum PVRSRV_ERROR PVRSRVHandleDeInit(void);
     (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
index 655eb9f..318d9dd 100644 (file)
@@ -44,6 +44,7 @@ struct BUCKET {
        u32 v;
        u32 k[];
 };
+struct BUCKET;
 
 struct HASH_TABLE {
        struct BUCKET **ppBucketTable;
@@ -51,8 +52,8 @@ struct HASH_TABLE {
        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)
@@ -100,7 +101,8 @@ IMG_BOOL HASH_Key_Comp_Default(size_t uKeySize, void *pKey1, void *pKey2)
        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;
@@ -109,13 +111,21 @@ static void _ChainInsert(struct HASH_TABLE *pHash, struct BUCKET *pBucket,
        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++) {
@@ -123,10 +133,16 @@ static void _Rehash(struct HASH_TABLE *pHash, struct BUCKET **ppOldTable,
                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)
@@ -139,7 +155,7 @@ 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)
@@ -147,9 +163,12 @@ static IMG_BOOL _Resize(struct HASH_TABLE *pHash, u32 uNewSize)
 
                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;
@@ -159,8 +178,11 @@ static IMG_BOOL _Resize(struct HASH_TABLE *pHash, u32 uNewSize)
 }
 
 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;
@@ -168,7 +190,7 @@ struct HASH_TABLE *HASH_Create_Extended(u32 uInitialLen, size_t uKeySize,
        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;
@@ -180,12 +202,12 @@ struct HASH_TABLE *HASH_Create_Extended(u32 uInitialLen, size_t uKeySize,
        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;
        }
@@ -207,10 +229,10 @@ void HASH_Delete(struct HASH_TABLE *pHash)
                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);
        }
 }
@@ -225,14 +247,27 @@ IMG_BOOL HASH_Insert_Extended(struct HASH_TABLE *pHash, void *pKey, u32 v)
 
        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)
@@ -259,6 +294,12 @@ u32 HASH_Remove_Extended(struct HASH_TABLE *pHash, void *pKey)
 
        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;
@@ -268,7 +309,7 @@ u32 HASH_Remove_Extended(struct HASH_TABLE *pHash, void *pKey)
                        u32 v = pBucket->v;
                        (*ppBucket) = pBucket->pNext;
 
-                       OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+                       OSFreeMem(PVRSRV_PAGEABLE_SELECT,
                                  sizeof(struct BUCKET) + pHash->uKeySize,
                                  pBucket, NULL);
 
@@ -281,8 +322,8 @@ u32 HASH_Remove_Extended(struct HASH_TABLE *pHash, void *pKey)
                                        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;
                }
@@ -309,6 +350,12 @@ u32 HASH_Retrieve_Extended(struct HASH_TABLE *pHash, void *pKey)
 
        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;
@@ -323,15 +370,13 @@ u32 HASH_Retrieve_Extended(struct HASH_TABLE *pHash, void *pKey)
                        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);
 }
 
index 6563cef..d0319ad 100644 (file)
 #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);
index 62bbaa1..b0a25c2 100644 (file)
@@ -34,7 +34,7 @@
 #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__
@@ -43,6 +43,4 @@
 #define unref__
 #endif
 
-#define IMG_INTERNAL   __attribute__ ((visibility("hidden")))
-
 #endif
index cf264e4..c52ba6c 100644 (file)
 #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,
@@ -64,9 +59,7 @@ struct SYSTEM_ADDR {
 
        u32 ui32PageCount;
        union {
-
                struct IMG_SYS_PHYADDR sContig;
-
                struct IMG_SYS_PHYADDR asNonContig[1];
        } u;
 };
index cb00ae6..36a1684 100644 (file)
 #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
index 5fd78a0..da69d7e 100644 (file)
@@ -38,7 +38,7 @@ struct PVRSRV_BC_SRV2BUFFER_KMJTABLE {
                                       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 {
@@ -48,4 +48,8 @@ struct PVRSRV_BC_BUFFER2SRV_KMJTABLE {
        enum PVRSRV_ERROR (*pfnPVRSRVRemoveBCDevice)(u32);
 };
 
+IMG_BOOL PVRGetBufferClassJTable(
+               struct PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable);
+
+
 #endif
index 65bb493..c601906 100644 (file)
 #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 *);
@@ -53,9 +60,6 @@ struct PVRSRV_DC_SRV2DISP_KMJTABLE {
        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);
 };
 
@@ -95,9 +99,6 @@ struct DISPLAYCLASS_FLIP_COMMAND {
        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
diff --git a/pvr/lock.h b/pvr/lock.h
new file mode 100644 (file)
index 0000000..c3b6ff3
--- /dev/null
@@ -0,0 +1,31 @@
+/**********************************************************************
+ *
+ * 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
index 9955871..6375cad 100644 (file)
--- a/pvr/mem.c
+++ b/pvr/mem.c
@@ -56,21 +56,23 @@ enum PVRSRV_ERROR PVRSRVAllocSharedSysMemoryKM(
                       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);
@@ -104,14 +106,25 @@ enum PVRSRV_ERROR PVRSRVFreeSharedSysMemoryKM(
 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;
 }
index 31ffbe5..cf579e5 100644 (file)
--- a/pvr/mm.c
+++ b/pvr/mm.c
  *
  ******************************************************************************/
 
-#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 {
@@ -60,7 +55,6 @@ 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
 };
 
@@ -68,7 +62,7 @@ struct DEBUG_MEM_ALLOC_REC {
        enum DEBUG_MEM_ALLOC_TYPE eAllocType;
        void *pvKey;
        void *pvCpuVAddr;
-       unsigned long ulCpuPAddr;
+       u32 ulCpuPAddr;
        void *pvPrivateData;
        u32 ui32Bytes;
        pid_t pid;
@@ -90,17 +84,13 @@ static u32 g_IOMemWaterMark;
 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(
@@ -118,6 +108,10 @@ struct DEBUG_LINUX_MEM_AREA_REC {
        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;
@@ -141,6 +135,10 @@ static void DebugLinuxMemAreaRecordRemove(struct LinuxMemArea *psLinuxMemArea);
 
 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;
@@ -160,7 +158,8 @@ enum PVRSRV_ERROR LinuxMMInit(void)
        }
 #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__);
@@ -179,8 +178,8 @@ void LinuxMMCleanup(void)
 
                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);
 
@@ -215,9 +214,7 @@ void LinuxMMCleanup(void)
                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
@@ -231,7 +228,7 @@ void LinuxMMCleanup(void)
                                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:
@@ -253,12 +250,9 @@ void LinuxMMCleanup(void)
                                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);
@@ -270,7 +264,7 @@ void LinuxMMCleanup(void)
 #endif
 
        if (psLinuxMemAreaCache) {
-               KMemCacheDestroyWrapper(psLinuxMemAreaCache);
+               kmem_cache_destroy(psLinuxMemAreaCache);
                psLinuxMemAreaCache = NULL;
        }
 }
@@ -301,12 +295,15 @@ void _KFreeWrapper(void *pvCpuVAddr, char *pszFileName,
 
 #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;
@@ -326,60 +323,67 @@ static void DebugMemAllocRecordAdd(enum DEBUG_MEM_ALLOC_TYPE 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(
@@ -391,8 +395,7 @@ static char *DebugMemAllocRecordTypeToString(
                "ALLOC_PAGES",
                "IOREMAP",
                "IO",
-               "KMEM_CACHE_ALLOC",
-               "KMAP"
+               "KMEM_CACHE_ALLOC"
        };
        return apszDebugMemoryRecordTypes[eAllocType];
 }
@@ -409,10 +412,10 @@ void *_VMallocWrapper(u32 ui32Bytes, u32 ui32AllocFlags, char *pszFileName,
                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,
@@ -435,8 +438,7 @@ void *_VMallocWrapper(u32 ui32Bytes, u32 ui32AllocFlags, char *pszFileName,
        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,
@@ -445,8 +447,7 @@ void _VFreeWrapper(void *pvCpuVAddr, char *pszFileName,
        vfree(pvCpuVAddr);
 }
 
-struct LinuxMemArea *NewVMallocLinuxMemArea(u32 ui32Bytes,
-                                    u32 ui32AreaFlags)
+struct LinuxMemArea *NewVMallocLinuxMemArea(u32 ui32Bytes, u32 ui32AreaFlags)
 {
        struct LinuxMemArea *psLinuxMemArea;
        void *pvCpuVAddr;
@@ -462,6 +463,9 @@ struct LinuxMemArea *NewVMallocLinuxMemArea(u32 ui32Bytes,
        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);
@@ -503,21 +507,13 @@ void __iomem *_IORemapWrapper(struct IMG_CPU_PHYADDR BasePAddr,
 
        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,
@@ -528,10 +524,10 @@ void __iomem *_IORemapWrapper(struct IMG_CPU_PHYADDR BasePAddr,
 #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;
@@ -542,15 +538,14 @@ void _IOUnmapWrapper(void __iomem *pvIORemapCookie, char *pszFileName,
 {
 #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;
@@ -569,6 +564,9 @@ struct LinuxMemArea *NewIORemapLinuxMemArea(struct IMG_CPU_PHYADDR BasePAddr,
        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);
@@ -590,9 +588,26 @@ void FreeIORemapLinuxMemArea(struct LinuxMemArea *psLinuxMemArea)
        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;
 
@@ -602,14 +617,19 @@ struct LinuxMemArea *NewExternalKVLinuxMemArea(
 
        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);
@@ -639,11 +659,14 @@ struct LinuxMemArea *NewIOLinuxMemArea(struct IMG_CPU_PHYADDR BasePAddr,
        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)
@@ -676,20 +699,22 @@ struct LinuxMemArea *NewAllocPagesLinuxMemArea(u32 ui32Bytes,
        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;
 
@@ -703,7 +728,11 @@ struct LinuxMemArea *NewAllocPagesLinuxMemArea(u32 ui32Bytes,
 
        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);
@@ -714,8 +743,9 @@ struct LinuxMemArea *NewAllocPagesLinuxMemArea(u32 ui32Bytes,
 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__);
@@ -727,6 +757,7 @@ void FreeAllocPagesLinuxMemArea(struct LinuxMemArea *psLinuxMemArea)
 {
        u32 ui32PageCount;
        struct page **pvPageList;
+       void *hBlockPageList;
        u32 i;
 
        PVR_ASSERT(psLinuxMemArea);
@@ -738,6 +769,7 @@ void FreeAllocPagesLinuxMemArea(struct LinuxMemArea *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,
@@ -746,7 +778,9 @@ void FreeAllocPagesLinuxMemArea(struct LinuxMemArea *psLinuxMemArea)
 
        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);
 }
@@ -776,56 +810,12 @@ struct page *LinuxMemAreaOffsetToPage(struct LinuxMemArea *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)
@@ -835,12 +825,9 @@ void *_KMemCacheAllocWrapper(struct kmem_cache *psCache,
        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;
@@ -878,9 +865,12 @@ struct LinuxMemArea *NewSubLinuxMemArea(struct LinuxMemArea
 
        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)
        {
@@ -951,6 +941,8 @@ static void DebugLinuxMemAreaRecordAdd(struct LinuxMemArea *psLinuxMemArea,
        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)
@@ -961,7 +953,6 @@ static void DebugLinuxMemAreaRecordAdd(struct LinuxMemArea *psLinuxMemArea,
        psNewRecord = kmalloc(sizeof(struct DEBUG_LINUX_MEM_AREA_REC),
                              GFP_KERNEL);
        if (psNewRecord) {
-
                psNewRecord->psLinuxMemArea = psLinuxMemArea;
                psNewRecord->ui32Flags = ui32Flags;
                psNewRecord->pid = current->pid;
@@ -975,9 +966,11 @@ static void DebugLinuxMemAreaRecordAdd(struct LinuxMemArea *psLinuxMemArea,
 
        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(
@@ -985,19 +978,25 @@ 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--;
@@ -1011,12 +1010,15 @@ static void DebugLinuxMemAreaRecordRemove(struct LinuxMemArea *psLinuxMemArea)
                        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
 
@@ -1035,7 +1037,7 @@ void *LinuxMemAreaToCpuVAddr(struct LinuxMemArea *psLinuxMemArea)
                        char *pAddr =
                            LinuxMemAreaToCpuVAddr(psLinuxMemArea->uData.
                                                   sSubAlloc.
-                                                  psParentLinuxMemArea);
+                                                        psParentLinuxMemArea);
                        if (!pAddr)
                                return NULL;
                        return pAddr +
@@ -1046,8 +1048,9 @@ void *LinuxMemAreaToCpuVAddr(struct LinuxMemArea *psLinuxMemArea)
        }
 }
 
-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;
 
@@ -1064,16 +1067,17 @@ struct IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(struct LinuxMemArea
                {
                        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 +=
@@ -1121,7 +1125,7 @@ struct IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(struct LinuxMemArea
                }
        default:
                PVR_DPF(PVR_DBG_ERROR,
-                        "%s: Unknown Linux memory area type (%d)\n",
+                        "%s: Unknown struct LinuxMemArea type (%d)\n",
                         __func__, psLinuxMemArea->eAreaType);
        }
 
@@ -1129,6 +1133,67 @@ struct IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(struct LinuxMemArea
        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) {
@@ -1144,33 +1209,20 @@ IMG_BOOL LinuxMemAreaPhysIsContig(struct LinuxMemArea *psLinuxMemArea)
                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";
@@ -1197,7 +1249,7 @@ static off_t printLinuxMemAreaRecords(char *buffer, size_t count, off_t off)
        struct DEBUG_LINUX_MEM_AREA_REC *psRecord;
        off_t Ret;
 
-       LinuxLockMutex(&gPVRSRVLock);
+       mutex_lock(&g_sDebugMutex);
 
        if (!off) {
                if (count < 500) {
@@ -1205,11 +1257,13 @@ static off_t printLinuxMemAreaRecords(char *buffer, size_t count, off_t off)
                        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,
@@ -1249,8 +1303,7 @@ static off_t printLinuxMemAreaRecords(char *buffer, size_t count, off_t off)
            );
 
 unlock_and_return:
-
-       LinuxUnLockMutex(&gPVRSRVLock);
+       mutex_unlock(&g_sDebugMutex);
        return Ret;
 }
 #endif
@@ -1261,7 +1314,7 @@ static off_t printMemoryRecords(char *buffer, size_t count, off_t off)
        struct DEBUG_MEM_ALLOC_REC *psRecord;
        off_t Ret;
 
-       LinuxLockMutex(&gPVRSRVLock);
+       mutex_lock(&g_sDebugMutex);
 
        if (!off) {
                if (count < 1000) {
@@ -1271,59 +1324,63 @@ static off_t printMemoryRecords(char *buffer, size_t count, off_t off)
 
                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);
 
@@ -1354,14 +1411,14 @@ static off_t printMemoryRecords(char *buffer, size_t count, off_t off)
 
        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,
@@ -1369,8 +1426,7 @@ static off_t printMemoryRecords(char *buffer, size_t count, off_t off)
                          psRecord->pszFileName, psRecord->ui32Line);
 
 unlock_and_return:
-
-       LinuxUnLockMutex(&gPVRSRVLock);
+       mutex_unlock(&g_sDebugMutex);
        return Ret;
 }
 #endif
@@ -1379,7 +1435,7 @@ unlock_and_return:
 const char *HAPFlagsToString(u32 ui32Flags)
 {
        static char szFlags[50];
-       u32 ui32Pos = 0;
+       s32 i32Pos = 0;
        u32 ui32CacheTypeIndex, ui32MapTypeIndex;
        char *apszCacheTypes[] = {
                "UNCACHED",
@@ -1404,9 +1460,8 @@ const char *HAPFlagsToString(u32 ui32Flags)
                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) {
@@ -1421,12 +1476,19 @@ const char *HAPFlagsToString(u32 ui32Flags)
                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;
 }
index 16d3177..9484363 100644 (file)
--- a/pvr/mm.h
+++ b/pvr/mm.h
 #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)) +
@@ -92,6 +92,7 @@ struct LinuxMemArea {
                } sVmalloc;
                struct _sPageList {
                        struct page **pvPageList;
+                       void *hBlockPageList;
                } sPageList;
                struct _sSubAlloc {
                        struct LinuxMemArea *psParentLinuxMemArea;
@@ -99,6 +100,10 @@ struct LinuxMemArea {
                } sSubAlloc;
        } uData;
        u32 ui32ByteSize;
+       u32 ui32AreaFlags;
+       IMG_BOOL bMMapRegistered;
+       struct list_head sMMapItem;
+       struct list_head sMMapOffsetStructList;
 };
 
 struct kmem_cache;
@@ -179,26 +184,6 @@ void _IOUnmapWrapper(void __iomem *pvIORemapCookie, char *pszFileName,
 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__)
@@ -254,10 +239,24 @@ struct IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(
        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);
 
index 6a98a42..7b3b784 100644 (file)
  *
  ******************************************************************************/
 
-#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;
                        }
@@ -543,8 +433,7 @@ static IMG_BOOL DoMapToUser(struct LinuxMemArea *psLinuxMemArea,
        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;
@@ -554,11 +443,9 @@ CheckSize(struct LinuxMemArea *psLinuxMemArea, u32 ui32ByteSize)
        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,
@@ -568,64 +455,231 @@ CheckSize(struct LinuxMemArea *psLinuxMemArea, u32 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;
        }
@@ -635,28 +689,234 @@ static off_t PrintMMapRegistrations(char *buffer, size_t size, off_t off)
                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;
+       }
+}
index bed8bba..3ab55ff 100644 (file)
 #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
index fc9ba78..3219cb1 100644 (file)
--- a/pvr/mmu.c
+++ b/pvr/mmu.c
 #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;
 };
 
@@ -75,8 +70,7 @@ struct MMU_HEAP {
 
 #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
 
@@ -111,11 +105,11 @@ static IMG_BOOL _AllocPageTables(struct MMU_HEAP *pMMUHeap)
        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;
 }
@@ -130,7 +124,7 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
 
        if (SysAcquireData(&psSysData) != PVRSRV_OK) {
                PVR_DPF(PVR_DBG_ERROR, "_DeferredFreePageTables: "
-                               "ERROR call to SysAcquireData failed");
+                                       "ERROR call to SysAcquireData failed");
                return;
        }
 
@@ -141,10 +135,9 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
        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)",
@@ -159,26 +152,21 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
        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;
@@ -190,10 +178,7 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
                        pui32PDEntry =
                            (u32 *) pMMUHeap->psMMUContext->pvPDCpuVAddr;
                        pui32PDEntry += ui32PDIndex;
-
-
                        pui32PDEntry[ui32PTIndex] = 0;
-
                        PDUMPMEM2(PVRSRV_DEVICE_TYPE_SGX,
                                  (void *) &pui32PDEntry[ui32PTIndex],
                                  sizeof(u32), 0, IMG_FALSE,
@@ -202,8 +187,8 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
                }
        default:
                {
-                       PVR_DPF(PVR_DBG_ERROR, "_DeferredFreePagetable: "
-                                               "ERROR invalid heap type");
+                       PVR_DPF(PVR_DBG_ERROR,
+                       "_DeferredFreePagetable: ERROR invalid heap type");
                        return;
                }
        }
@@ -227,9 +212,9 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
                                            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;
@@ -245,19 +230,18 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
                                                        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;
                }
 
@@ -266,7 +250,6 @@ static void _DeferredFreePageTable(struct MMU_HEAP *pMMUHeap, u32 ui32PTIndex)
                          ppsPTInfoList[ui32PTIndex], NULL);
                ppsPTInfoList[ui32PTIndex] = NULL;
        } else {
-
                pMMUHeap->ui32PTEntryCount -= 1024;
        }
 
@@ -292,6 +275,7 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
        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));
 
@@ -301,10 +285,19 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
        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;
@@ -323,16 +316,16 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
                                   (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;
 
@@ -340,40 +333,46 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
 
                        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;
                                }
 
@@ -387,14 +386,13 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
                                                   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);
 
                        }
 
@@ -416,27 +414,24 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
                        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,
@@ -450,14 +445,11 @@ static IMG_BOOL _DeferredAllocPagetables(struct MMU_HEAP *pMMUHeap,
                        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);
@@ -502,8 +494,8 @@ enum PVRSRV_ERROR MMU_Initialise(struct PVRSRV_DEVICE_NODE *psDeviceNode,
        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;
        }
 
@@ -524,29 +516,25 @@ enum PVRSRV_ERROR MMU_Initialise(struct PVRSRV_DEVICE_NODE *psDeviceNode,
        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;
@@ -701,9 +689,7 @@ void MMU_InsertHeap(struct MMU_CONTEXT *psMMUContext,
                }
        }
 
-
        if (bInvalidateDirectoryCache)
-
                MMU_InvalidateDirectoryCache(psMMUContext->psDevInfo);
 }
 
@@ -753,49 +739,48 @@ static void MMU_UnmapPagesAndFreePTs(struct MMU_HEAP *psMMUHeap,
                                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,
@@ -803,9 +788,8 @@ static void MMU_UnmapPagesAndFreePTs(struct MMU_HEAP *psMMUHeap,
 #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;
@@ -832,7 +816,7 @@ struct MMU_HEAP *MMU_Create(struct MMU_CONTEXT *psMMUContext,
        }
 
        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");
@@ -853,11 +837,9 @@ struct MMU_HEAP *MMU_Create(struct MMU_CONTEXT *psMMUContext,
 
        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,
@@ -887,12 +869,8 @@ void MMU_Delete(struct MMU_HEAP *pMMUHeap)
        }
 }
 
-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;
 
@@ -901,13 +879,8 @@ MMU_Alloc(struct MMU_HEAP *pMMUHeap,
                 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");
@@ -922,7 +895,6 @@ MMU_Alloc(struct MMU_HEAP *pMMUHeap,
                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);
        }
@@ -952,6 +924,8 @@ void MMU_Free(struct MMU_HEAP *pMMUHeap, struct IMG_DEV_VIRTADDR DevVAddr,
                return;
        }
 
+       BUG();
+
        PVR_DPF(PVR_DBG_ERROR,
                 "MMU_Free: Couldn't find DevVAddr %08X in a DevArena",
                 DevVAddr.uiAddr);
@@ -1004,9 +978,9 @@ static void MMU_PDumpPageTables(struct MMU_HEAP *pMMUHeap,
                        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);
                }
@@ -1032,23 +1006,17 @@ static void MMU_MapPage(struct MMU_HEAP *pMMUHeap,
 
        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);
 
@@ -1060,11 +1028,13 @@ static void MMU_MapPage(struct MMU_HEAP *pMMUHeap,
 
 
        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);
 
@@ -1074,10 +1044,9 @@ static void MMU_MapPage(struct MMU_HEAP *pMMUHeap,
            | 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;
@@ -1106,7 +1075,7 @@ void MMU_MapScatter(struct MMU_HEAP *pMMUHeap,
                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);
        }
 
@@ -1116,10 +1085,9 @@ void MMU_MapScatter(struct MMU_HEAP *pMMUHeap,
 #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)
@@ -1143,11 +1111,6 @@ void MMU_MapPages(struct MMU_HEAP *pMMUHeap,
 
        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;
 
@@ -1187,11 +1150,6 @@ void MMU_MapShadow(struct MMU_HEAP *pMMUHeap,
        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;
 
@@ -1200,21 +1158,19 @@ void MMU_MapShadow(struct MMU_HEAP *pMMUHeap,
                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);
 
@@ -1229,8 +1185,8 @@ void MMU_MapShadow(struct MMU_HEAP *pMMUHeap,
 }
 
 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;
@@ -1258,10 +1214,11 @@ void MMU_UnmapPages(struct MMU_HEAP *psMMUHeap,
                                                        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);
 
@@ -1270,14 +1227,14 @@ void MMU_UnmapPages(struct MMU_HEAP *psMMUHeap,
                        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,
@@ -1285,7 +1242,6 @@ void MMU_UnmapPages(struct MMU_HEAP *psMMUHeap,
 
                PVR_ASSERT((s32) ppsPTInfoList[0]->ui32ValidPTECount >= 0);
 
-
                pui32Tmp[ui32PTIndex] = 0;
 
                sTmpDevVAddr.uiAddr += uPageSize;
@@ -1361,8 +1317,6 @@ enum PVRSRV_ERROR SGXGetMMUPDAddrKM(void *hDevCookie,
        if (!hDevCookie || !hDevMemContext || !psPDDevPAddr)
                return PVRSRV_ERROR_INVALID_PARAMS;
 
-       PVR_UNREFERENCED_PARAMETER(hDevCookie);
-
        *psPDDevPAddr =
            ((struct BM_CONTEXT *)hDevMemContext)->psMMUContext->sPDDevPAddr;
 
@@ -1393,26 +1347,27 @@ enum PVRSRV_ERROR MMU_BIFResetPDAlloc(struct PVRSRV_SGXDEV_INFO *psDevInfo)
                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;
                }
 
@@ -1424,7 +1379,7 @@ enum PVRSRV_ERROR MMU_BIFResetPDAlloc(struct PVRSRV_SGXDEV_INFO *psDevInfo)
                                              &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;
                }
        }
index 2fa274f..85d939e 100644 (file)
--- a/pvr/mmu.h
+++ b/pvr/mmu.h
@@ -44,9 +44,8 @@ struct MMU_HEAP *MMU_Create(struct MMU_CONTEXT *psMMUContext,
 
 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);
index 18c7236..a38dcf3 100644 (file)
  *
  ******************************************************************************/
 
-#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>
 
@@ -43,6 +40,7 @@
 #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);
+
index 151ef6a..cbd963a 100644 (file)
 
 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
diff --git a/pvr/mutils.h b/pvr/mutils.h
new file mode 100644 (file)
index 0000000..47279ec
--- /dev/null
@@ -0,0 +1,37 @@
+/**********************************************************************
+ *
+ * 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
diff --git a/pvr/ocpdefs.h b/pvr/ocpdefs.h
new file mode 100644 (file)
index 0000000..12c3b36
--- /dev/null
@@ -0,0 +1,294 @@
+/****************************************************************************
+ 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)
+*****************************************************************************/
index 105123c..a957a21 100644 (file)
 #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;
index 61f594e..fe4b2bb 100644 (file)
@@ -27,9 +27,6 @@
 #ifndef __OMAPLFB_H__
 #define __OMAPLFB_H__
 
-extern IMG_BOOL PVRGetDisplayClassJTable(
-                       struct PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable);
-
 #define OMAPLCD_IRQ                    25
 
 #define OMAPLCD_SYSCONFIG              0x0410
@@ -75,28 +72,12 @@ struct OMAPLFB_BUFFER {
        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 {
@@ -123,20 +104,16 @@ struct OMAPLFB_DEVINFO {
        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
@@ -159,14 +136,5 @@ void *OMAPLFBAllocKernelMem(u32 ui32Size);
 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
index f2eac99..a3bcc96 100644 (file)
@@ -31,7 +31,9 @@
 #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"
@@ -56,150 +58,19 @@ static void SetAnchorPtr(struct OMAPLFB_DEVINFO *psDevInfo)
        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;
 }
@@ -414,18 +285,14 @@ static enum PVRSRV_ERROR CreateDCSwapChain(void *hDevice, u32 ui32Flags,
        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;
@@ -443,28 +310,23 @@ static enum PVRSRV_ERROR CreateDCSwapChain(void *hDevice, u32 ui32Flags,
            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);
@@ -482,21 +344,9 @@ static enum PVRSRV_ERROR CreateDCSwapChain(void *hDevice, u32 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];
@@ -504,9 +354,8 @@ static enum PVRSRV_ERROR CreateDCSwapChain(void *hDevice, u32 ui32Flags,
        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];
 
@@ -516,65 +365,20 @@ static enum PVRSRV_ERROR CreateDCSwapChain(void *hDevice, u32 ui32Flags,
                    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);
@@ -586,7 +390,6 @@ static enum PVRSRV_ERROR DestroyDCSwapChain(void *hDevice, void *hSwapChain)
 {
        struct OMAPLFB_DEVINFO *psDevInfo;
        struct OMAPLFB_SWAPCHAIN *psSwapChain;
-       unsigned long ulLockFlags;
        enum PVRSRV_ERROR eError;
 
        if (!hDevice || !hSwapChain)
@@ -602,29 +405,8 @@ static enum PVRSRV_ERROR DestroyDCSwapChain(void *hDevice, void *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);
 
@@ -694,127 +476,12 @@ static enum PVRSRV_ERROR GetDCBuffers(void *hDevice, void *hSwapChain,
        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;
@@ -830,57 +497,33 @@ static IMG_BOOL ProcessFlip(void *hCmdCookie, u32 ui32DataSize, void *pvData)
        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)
@@ -916,17 +559,31 @@ 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) &&
@@ -937,22 +594,33 @@ static void SetDevinfo(struct OMAPLFB_DEVINFO *psDevInfo)
                        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;
@@ -1045,6 +713,8 @@ static void DeInitDev(struct OMAPLFB_DEVINFO *psDevInfo)
 
        acquire_console_sem();
 
+       fb_unregister_client(&gFBEventsData.notif);
+
        psLINFBOwner = psLINFBInfo->fbops->owner;
 
        if (psLINFBInfo->fbops->fb_release != NULL)
@@ -1081,41 +751,23 @@ enum PVRSRV_ERROR OMAPLFBInit(void)
                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;
@@ -1130,9 +782,7 @@ enum PVRSRV_ERROR OMAPLFBInit(void)
                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,
@@ -1186,7 +836,7 @@ enum PVRSRV_ERROR OMAPLFBDeinit(void)
                        return PVRSRV_ERROR_GENERIC;
 
                if (psJTable->
-                   pfnPVRSRVRemoveDCDevice(psDevInfo->ui32DeviceID) !=
+                           pfnPVRSRVRemoveDCDevice(psDevInfo->ui32DeviceID) !=
                    PVRSRV_OK)
                        return PVRSRV_ERROR_GENERIC;
 
@@ -1200,46 +850,3 @@ enum PVRSRV_ERROR OMAPLFBDeinit(void)
        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);
-}
index 9282298..9ed02c5 100644 (file)
  *
  ******************************************************************************/
 
-#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);
 
@@ -76,121 +70,48 @@ enum PVRSRV_ERROR OMAPLFBGetLibFuncAddr(char *szFunctionName,
        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)
@@ -203,18 +124,18 @@ 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;
index 848d6e8..07f1662 100644 (file)
  *
  ******************************************************************************/
 
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
-
 #include <linux/version.h>
 #include <linux/io.h>
 #include <asm/page.h>
@@ -47,6 +43,7 @@
 #include <linux/timer.h>
 #include <linux/capability.h>
 #include <linux/uaccess.h>
+#include <linux/spinlock.h>
 
 #include "img_types.h"
 #include "services_headers.h"
@@ -114,12 +111,10 @@ enum PVRSRV_ERROR _OSAllocMem(u32 ui32Flags, u32 ui32Size,
 }
 
 #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);
@@ -139,12 +134,13 @@ void _OSFreeMem(u32 ui32Flags, u32 ui32Size,
        }
 }
 
-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:
@@ -157,13 +153,11 @@ enum PVRSRV_ERROR OSAllocPages(u32 ui32AllocFlags,
                }
        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;
                }
 
@@ -173,8 +167,7 @@ enum PVRSRV_ERROR OSAllocPages(u32 ui32AllocFlags,
                            NewVMallocLinuxMemArea(ui32Size, ui32AllocFlags);
                        if (!psLinuxMemArea)
                                return PVRSRV_ERROR_OUT_OF_MEMORY;
-                       PVRMMapRegisterArea("Import Arena", psLinuxMemArea,
-                                           ui32AllocFlags);
+                       PVRMMapRegisterArea(psLinuxMemArea);
                        break;
                }
        default:
@@ -185,6 +178,9 @@ enum PVRSRV_ERROR OSAllocPages(u32 ui32AllocFlags,
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
 
+       if (ui32AllocFlags & (PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_UNCACHED))
+               inv_cache_mem_area(psLinuxMemArea);
+
        *ppvCpuVAddr = LinuxMemAreaToCpuVAddr(psLinuxMemArea);
        *phOSMemHandle = psLinuxMemArea;
 
@@ -194,9 +190,10 @@ enum PVRSRV_ERROR OSAllocPages(u32 ui32AllocFlags,
 }
 
 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;
@@ -208,8 +205,7 @@ enum PVRSRV_ERROR OSFreePages(u32 ui32AllocFlags, u32 ui32Bytes,
        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);
@@ -227,13 +223,12 @@ enum PVRSRV_ERROR OSFreePages(u32 ui32AllocFlags, u32 ui32Bytes,
        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;
 
@@ -248,16 +243,9 @@ enum PVRSRV_ERROR OSGetSubMemHandle(void *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;
 
@@ -269,20 +257,13 @@ failed_register_area:
 
 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;
@@ -338,10 +319,9 @@ void OSBreakResourceLock(struct PVRSRV_RESOURCE *psResource, u32 ui32ID)
                } 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)
@@ -409,7 +389,7 @@ void OSReleaseThreadQuanta(void)
 
 u32 OSClockus(void)
 {
-       unsigned long time, j = jiffies;
+       u32 time, j = jiffies;
 
        time = j * (1000000 / HZ);
 
@@ -425,7 +405,8 @@ u32 OSGetCurrentProcessIDKM(void)
 {
        if (in_interrupt())
                return KERNEL_ID;
-       return task_tgid_nr(current);
+
+       return (u32) task_tgid_nr(current);
 }
 
 u32 OSGetPageSize(void)
@@ -437,6 +418,7 @@ static irqreturn_t DeviceISRWrapper(int irq, void *dev_id)
 {
        struct PVRSRV_DEVICE_NODE *psDeviceNode;
        IMG_BOOL bStatus = IMG_FALSE;
+       PVR_UNREFERENCED_PARAMETER(irq);
 
        psDeviceNode = (struct PVRSRV_DEVICE_NODE *)dev_id;
        if (!psDeviceNode) {
@@ -476,10 +458,10 @@ enum PVRSRV_ERROR OSInstallDeviceLISR(void *pvSysData,
        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;
@@ -621,6 +603,14 @@ enum PVRSRV_ERROR OSUnlockResource(struct PVRSRV_RESOURCE *psResource,
        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;
@@ -644,16 +634,12 @@ void __iomem *OSMapPhysToLin(struct IMG_CPU_PHYADDR BasePAddr, u32 ui32Bytes,
                        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
@@ -664,26 +650,23 @@ OSUnMapPhysToLin(void __iomem *pvLinAddr, u32 ui32Bytes,
                   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;
 
@@ -708,8 +691,7 @@ static enum PVRSRV_ERROR RegisterExternalMem(struct IMG_SYS_PHYADDR *pBasePAddr,
 
                        if (!psLinuxMemArea)
                                return PVRSRV_ERROR_GENERIC;
-                       PVRMMapRegisterArea("Physical", psLinuxMemArea,
-                                           ui32MappingFlags);
+                       PVRMMapRegisterArea(psLinuxMemArea);
                        break;
                }
        case PVRSRV_HAP_MULTI_PROCESS:
@@ -721,8 +703,7 @@ static enum PVRSRV_ERROR RegisterExternalMem(struct IMG_SYS_PHYADDR *pBasePAddr,
 
                        if (!psLinuxMemArea)
                                return PVRSRV_ERROR_GENERIC;
-                       PVRMMapRegisterArea("Physical", psLinuxMemArea,
-                                           ui32MappingFlags);
+                       PVRMMapRegisterArea(psLinuxMemArea);
                        break;
                }
        default:
@@ -740,9 +721,8 @@ static enum PVRSRV_ERROR RegisterExternalMem(struct IMG_SYS_PHYADDR *pBasePAddr,
 }
 
 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);
 
@@ -751,22 +731,22 @@ enum PVRSRV_ERROR OSRegisterMem(struct IMG_CPU_PHYADDR 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:
@@ -780,6 +760,7 @@ enum PVRSRV_ERROR OSUnRegisterMem(void *pvCpuVAddr,
                                         "%s(%p, %d, 0x%08X, %p) FAILED!",
                                         __func__, pvCpuVAddr, ui32Bytes,
                                         ui32MappingFlags, hOSMemHandle);
+                               BUG();
                                return PVRSRV_ERROR_GENERIC;
                        }
                        break;
@@ -813,7 +794,6 @@ enum PVRSRV_ERROR OSReservePhys(struct IMG_CPU_PHYADDR BasePAddr,
        switch (ui32MappingFlags & PVRSRV_HAP_MAPTYPE_MASK) {
        case PVRSRV_HAP_KERNEL_ONLY:
                {
-
                        psLinuxMemArea =
                            NewIORemapLinuxMemArea(BasePAddr, ui32Bytes,
                                                   ui32MappingFlags);
@@ -828,8 +808,7 @@ enum PVRSRV_ERROR OSReservePhys(struct IMG_CPU_PHYADDR BasePAddr,
                                              ui32MappingFlags);
                        if (!psLinuxMemArea)
                                return PVRSRV_ERROR_GENERIC;
-                       PVRMMapRegisterArea("Physical", psLinuxMemArea,
-                                           ui32MappingFlags);
+                       PVRMMapRegisterArea(psLinuxMemArea);
                        break;
                }
        case PVRSRV_HAP_MULTI_PROCESS:
@@ -839,8 +818,7 @@ enum PVRSRV_ERROR OSReservePhys(struct IMG_CPU_PHYADDR BasePAddr,
                                                   ui32MappingFlags);
                        if (!psLinuxMemArea)
                                return PVRSRV_ERROR_GENERIC;
-                       PVRMMapRegisterArea("Physical", psLinuxMemArea,
-                                           ui32MappingFlags);
+                       PVRMMapRegisterArea(psLinuxMemArea);
                        break;
                }
        default:
@@ -864,6 +842,7 @@ enum PVRSRV_ERROR OSUnReservePhys(void *pvCpuVAddr,
 {
        struct LinuxMemArea *psLinuxMemArea;
        PVR_UNREFERENCED_PARAMETER(pvCpuVAddr);
+       PVR_UNREFERENCED_PARAMETER(ui32Bytes);
 
        psLinuxMemArea = (struct LinuxMemArea *)hOSMemHandle;
 
@@ -900,36 +879,72 @@ enum PVRSRV_ERROR OSUnReservePhys(void *pvCpuVAddr,
 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;
@@ -937,6 +952,8 @@ struct TIMER_CALLBACK_DATA {
        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 =
@@ -953,17 +970,26 @@ static void OSTimerCallbackWrapper(unsigned long ui32Data)
 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;
        }
 
@@ -980,29 +1006,38 @@ void *OSAddTimer(void (*pfnTimerFunc)(void *), void *pvData, u32 ui32MsTimeout)
        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;
@@ -1010,8 +1045,10 @@ enum PVRSRV_ERROR OSEnableTimer(void *hTimer)
 
 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;
 
@@ -1027,11 +1064,9 @@ enum PVRSRV_ERROR OSEventObjectCreate(const char *pszName,
 
        if (psEventObject) {
                if (pszName) {
-
                        strncpy(psEventObject->szName, pszName,
                                EVENTOBJNAME_MAXLENGTH);
                } else {
-
                        static u16 ui16NameIndex;
                        snprintf(psEventObject->szName, EVENTOBJNAME_MAXLENGTH,
                                 "PVRSRV_EVENTOBJECT_%d", ui16NameIndex++);
@@ -1043,7 +1078,7 @@ enum PVRSRV_ERROR OSEventObjectCreate(const char *pszName,
 
        } else {
                PVR_DPF(PVR_DBG_ERROR, "OSEventObjectCreate: "
-                       "psEventObject is not a valid pointer");
+                                       "psEventObject is not a valid pointer");
                eError = PVRSRV_ERROR_GENERIC;
        }
 
@@ -1060,12 +1095,12 @@ enum PVRSRV_ERROR OSEventObjectDestroy(struct PVRSRV_EVENTOBJECT *psEventObject)
                        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;
        }
 
@@ -1074,14 +1109,14 @@ enum PVRSRV_ERROR OSEventObjectDestroy(struct PVRSRV_EVENTOBJECT *psEventObject)
 
 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;
        }
 
@@ -1102,7 +1137,7 @@ enum PVRSRV_ERROR OSEventObjectOpen(struct PVRSRV_EVENTOBJECT *psEventObject,
 
        } else {
                PVR_DPF(PVR_DBG_ERROR, "OSEventObjectCreate: "
-                       "psEventObject is not a valid pointer");
+                                       "psEventObject is not a valid pointer");
                eError = PVRSRV_ERROR_INVALID_PARAMS;
        }
 
@@ -1124,7 +1159,7 @@ enum PVRSRV_ERROR OSEventObjectClose(struct PVRSRV_EVENTOBJECT *psEventObject,
 
        } else {
                PVR_DPF(PVR_DBG_ERROR, "OSEventObjectDestroy: "
-                               "psEventObject is not a valid pointer");
+                                       "psEventObject is not a valid pointer");
                eError = PVRSRV_ERROR_INVALID_PARAMS;
        }
 
@@ -1134,13 +1169,13 @@ enum PVRSRV_ERROR OSEventObjectClose(struct PVRSRV_EVENTOBJECT *psEventObject,
 
 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;
        }
 
@@ -1149,7 +1184,7 @@ enum PVRSRV_ERROR OSEventObjectSignal(void *hOSEventKM)
 
 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,
@@ -1179,15 +1214,14 @@ IMG_BOOL OSAccessOK(enum IMG_VERIFY_TEST eVerification,
 {
        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 {
@@ -1205,38 +1239,38 @@ struct sWrapMemInfo {
        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;
 
@@ -1254,8 +1288,10 @@ static struct page *CPUVAddrToPage(struct vm_area_struct *psVMArea,
 
        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);
@@ -1272,80 +1308,13 @@ exit_unlock:
        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(&current->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(&current->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(&current->mm->mmap_sem);
-
-                       break;
-               }
-       default:
-               break;
-       }
-#endif
-
        switch (psInfo->eType) {
        case WRAP_TYPE_CLEANUP:
                break;
@@ -1353,28 +1322,26 @@ enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem, IMG_BOOL bUseLock)
                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;
                }
        }
@@ -1390,21 +1357,19 @@ enum PVRSRV_ERROR OSReleasePhysPageAddr(void *hOSWrapMem, IMG_BOOL bUseLock)
        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;
 
@@ -1414,8 +1379,8 @@ enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr,
 
        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));
@@ -1425,59 +1390,56 @@ enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr,
        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(&current->mm->mmap_sem);
+       down_read(&current->mm->mmap_sem);
 
-       iNumPagesMapped =
-           get_user_pages(current, current->mm, ulStartAddr, psInfo->iNumPages,
-                          1, 0, psInfo->ppsPages, NULL);
-
-       if (bUseLock)
-               up_read(&current->mm->mmap_sem);
+       iNumPagesMapped = get_user_pages(current, current->mm, ulStartAddr,
+                                        psInfo->iNumPages, 1, 0,
+                                        psInfo->ppsPages, NULL);
+       up_read(&current->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];
 
                }
 
@@ -1486,18 +1448,17 @@ enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr,
                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(&current->mm->mmap_sem);
+       down_read(&current->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;
@@ -1507,107 +1468,105 @@ enum PVRSRV_ERROR OSAcquirePhysPageAddr(void *pvCPUVAddr,
 #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(&current->mm->mmap_sem);
+       up_read(&current->mm->mmap_sem);
 
 exit_check:
        CheckPagesContiguous(psInfo);
@@ -1617,11 +1576,10 @@ exit_check:
        return PVRSRV_OK;
 
 error_release_mmap_sem:
-       if (bUseLock)
-               up_read(&current->mm->mmap_sem);
+       up_read(&current->mm->mmap_sem);
 
 error_free:
        psInfo->eType = WRAP_TYPE_CLEANUP;
-       OSReleasePhysPageAddr((void *) psInfo, bUseLock);
+       OSReleasePhysPageAddr((void *)psInfo);
        return PVRSRV_ERROR_GENERIC;
 }
index 761d64c..0cad290 100644 (file)
 #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
@@ -59,10 +63,10 @@ enum PVRSRV_ERROR OSInitPerf(void *pvSysData);
 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);
@@ -77,16 +81,18 @@ enum PVRSRV_ERROR OSUnRegisterDiscontigMem(void *pvCpuVAddr, u32 ui32Bytes,
 
 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;
 }
@@ -105,7 +111,7 @@ u32 OSGetCurrentProcessIDKM(void);
 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)      \
@@ -119,11 +125,10 @@ void _OSFreeMem(u32 ui32Flags, u32 ui32Size, void *pvLinAddr,
 #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,
@@ -170,6 +175,7 @@ enum PVRSRV_ERROR OSLockResource(struct PVRSRV_RESOURCE *psResource,
                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);
@@ -187,6 +193,12 @@ enum PVRSRV_ERROR OSDisableTimer(void *hTimer);
 
 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);
@@ -206,8 +218,15 @@ enum PVRSRV_ERROR OSCopyFromUser(void *pvProcess, void *pvDest,
 
 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
diff --git a/pvr/osperproc.c b/pvr/osperproc.c
new file mode 100644 (file)
index 0000000..dffd317
--- /dev/null
@@ -0,0 +1,84 @@
+/**********************************************************************
+ *
+ * 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);
+}
diff --git a/pvr/osperproc.h b/pvr/osperproc.h
new file mode 100644 (file)
index 0000000..891ab66
--- /dev/null
@@ -0,0 +1,36 @@
+/**********************************************************************
+ *
+ * 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
index 1df3a39..a614069 100644 (file)
--- a/pvr/pb.c
+++ b/pvr/pb.c
@@ -33,7 +33,7 @@
 #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;
@@ -56,39 +56,39 @@ enum PVRSRV_ERROR SGXFindSharedPBDescKM(
        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) {
@@ -97,9 +97,8 @@ enum PVRSRV_ERROR SGXFindSharedPBDescKM(
                                  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;
                        }
@@ -119,28 +118,28 @@ enum PVRSRV_ERROR SGXFindSharedPBDescKM(
 
                        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;
@@ -157,16 +156,16 @@ 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;
@@ -179,31 +178,6 @@ SGXCleanupSharedPBDescKM(struct PVRSRV_STUB_PBDESC *psStubPBDescIn)
                        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;
@@ -234,6 +208,8 @@ SGXCleanupSharedPBDescKM(struct PVRSRV_STUB_PBDESC *psStubPBDescIn)
                                             sizeof(struct PVRSRV_STUB_PBDESC),
                                             psStubPBDesc, NULL);
 
+                               SGXCleanupRequest(psDeviceNode, NULL,
+                                  PVRSRV_USSE_EDM_RESMAN_CLEANUP_SHAREDPBDESC);
                        }
                        return PVRSRV_OK;
                }
@@ -259,14 +235,13 @@ static enum PVRSRV_ERROR SGXCleanupSharedPBDescCreateLockCallback(void *pvParam,
 #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;
 
@@ -278,6 +253,7 @@ enum PVRSRV_ERROR SGXUnrefSharedPBDescKM(void *hSharedPBDesc)
        PVR_ASSERT(hSharedPBDesc != NULL);
 
        ResManFreeResByPtr(hSharedPBDesc);
+
        return PVRSRV_OK;
 }
 
@@ -313,7 +289,7 @@ enum PVRSRV_ERROR SGXAddSharedPBDescKM(
 
        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) - "
@@ -321,26 +297,25 @@ enum PVRSRV_ERROR SGXAddSharedPBDescKM(
                                 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,
@@ -390,8 +365,7 @@ enum PVRSRV_ERROR SGXAddSharedPBDescKM(
                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");
@@ -420,11 +394,12 @@ enum PVRSRV_ERROR SGXAddSharedPBDescKM(
 
 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);
index ac7b030..0dec52f 100644 (file)
@@ -25,6 +25,8 @@
  ******************************************************************************/
 
 #if defined(PDUMP)
+#include <asm/atomic.h>
+#include <stdarg.h>
 #include "sgxdefs.h"
 #include "services_headers.h"
 
@@ -47,40 +49,40 @@ static void DbgSetMarker(struct DBG_STREAM *psStream, u32 ui32Marker);
 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 {
@@ -101,6 +103,11 @@ static struct PDBG_PDUMP_STATE gsDBGPdumpState = {
 #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;
@@ -112,24 +119,24 @@ void PDumpInit(void)
                        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++) {
@@ -159,19 +166,19 @@ init_failed:
 
        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;
        }
 
@@ -187,51 +194,74 @@ void PDumpDeInit(void)
 
        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);
 }
@@ -244,9 +274,11 @@ IMG_BOOL PDumpIsLastCaptureFrameKM(void)
 
 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)
@@ -254,7 +286,7 @@ 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;
@@ -265,14 +297,14 @@ void PDumpReg(u32 ui32Reg, u32 ui32Data)
        __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)
 
@@ -280,19 +312,20 @@ enum PVRSRV_ERROR PDumpRegPolWithFlagsKM(u32 ui32RegAddr, u32 ui32RegValue,
        __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);
@@ -308,7 +341,7 @@ enum PVRSRV_ERROR PDumpRegPolKM(u32 ui32RegAddr, u32 ui32RegValue, u32 ui32Mask)
 
 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;
@@ -318,36 +351,34 @@ void PDumpMallocPages(enum PVRSRV_DEVICE_TYPE eDeviceType, u32 ui32DevVAddr,
        __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;
@@ -356,48 +387,49 @@ void PDumpMallocPageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
        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++) {
@@ -408,19 +440,19 @@ void PDumpFreePages(struct BM_HEAP *psBMHeap, struct IMG_DEV_VIRTADDR sDevVAddr,
                                                                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;
@@ -429,15 +461,16 @@ void PDumpFreePageTable(enum PVRSRV_DEVICE_TYPE eDeviceType, void *pvLinAddr,
        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);
@@ -445,7 +478,7 @@ void PDumpFreePageTable(enum PVRSRV_DEVICE_TYPE eDeviceType, void *pvLinAddr,
                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);
        }
@@ -457,10 +490,8 @@ void PDumpPDReg(u32 ui32Reg, u32 ui32Data, void *hUniqueTag)
 
        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);
 }
@@ -472,10 +503,8 @@ void PDumpPDRegWithFlags(u32 ui32Reg, u32 ui32Data, u32 ui32Flags,
 
        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);
 }
@@ -502,7 +531,7 @@ enum PVRSRV_ERROR PDumpMemPolKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
        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;
@@ -525,10 +554,9 @@ enum PVRSRV_ERROR PDumpMemPolKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
        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);
@@ -542,7 +570,7 @@ enum PVRSRV_ERROR PDumpMemKM(void *pvAltLinAddr,
                        void *hUniqueTag)
 {
        u32 ui32PageByteOffset;
-       u8 *pui8DataLinAddr;
+       u8 *pui8DataLinAddr = NULL;
        struct IMG_DEV_VIRTADDR sDevVPageAddr;
        struct IMG_DEV_VIRTADDR sDevVAddr;
        struct IMG_DEV_PHYADDR sDevPAddr;
@@ -550,109 +578,43 @@ enum PVRSRV_ERROR PDumpMemKM(void *pvAltLinAddr,
        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);
@@ -690,10 +652,9 @@ enum PVRSRV_ERROR PDumpMemKM(void *pvAltLinAddr,
                }
 
                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);
@@ -730,9 +691,6 @@ enum PVRSRV_ERROR PDumpMem2KM(enum PVRSRV_DEVICE_TYPE eDeviceType,
        if (!pvLinAddr)
                return PVRSRV_ERROR_GENERIC;
 
-       if (gui32PDumpSuspended)
-               return PVRSRV_OK;
-
        ui32ParamOutPos =
            gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
                                           psStream[PDUMP_STREAM_PARAM2]);
@@ -747,14 +705,14 @@ enum PVRSRV_ERROR PDumpMem2KM(enum PVRSRV_DEVICE_TYPE eDeviceType,
                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--) {
@@ -762,18 +720,16 @@ enum PVRSRV_ERROR PDumpMem2KM(enum PVRSRV_DEVICE_TYPE eDeviceType,
                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);
@@ -788,36 +744,33 @@ enum PVRSRV_ERROR PDumpMem2KM(enum PVRSRV_DEVICE_TYPE eDeviceType,
                                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);
@@ -859,7 +812,7 @@ enum PVRSRV_ERROR PDumpPDDevPAddrKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
        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 =
@@ -876,20 +829,19 @@ enum PVRSRV_ERROR PDumpPDDevPAddrKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
        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);
@@ -903,17 +855,15 @@ enum PVRSRV_ERROR PDumpSetFrameKM(u32 ui32Frame)
 {
        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]);
@@ -1000,9 +950,10 @@ enum PVRSRV_ERROR PDumpBitmapKM(char *pszFileName, u32 ui32FileOffset,
        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);
@@ -1018,7 +969,7 @@ enum PVRSRV_ERROR PDumpReadRegKM(char *pszFileName, u32 ui32FileOffset,
 
        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);
@@ -1038,7 +989,7 @@ static IMG_BOOL PDumpWriteILock(struct DBG_STREAM *psStream, u8 *pui8Data,
        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]) {
@@ -1100,34 +1051,31 @@ static u32 DbgWrite(struct DBG_STREAM *psStream, u8 *pui8Data,
 {
        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;
 }
@@ -1157,7 +1105,7 @@ void PDump3DSignatureRegisters(u32 ui32DumpFrameNum, IMG_BOOL bLastFrame,
 
        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++) {
@@ -1173,7 +1121,7 @@ static void PDumpCountRead(char *pszFileName, u32 ui32Address, u32 ui32Size,
        __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);
 
@@ -1190,7 +1138,7 @@ void PDumpCounterRegisters(u32 ui32DumpFrameNum, IMG_BOOL bLastFrame,
 
        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;
 
@@ -1199,10 +1147,8 @@ void PDumpCounterRegisters(u32 ui32DumpFrameNum, IMG_BOOL bLastFrame,
                               &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;
@@ -1213,7 +1159,7 @@ void PDumpTASignatureRegisters(u32 ui32DumpFrameNum,
        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);
@@ -1229,21 +1175,36 @@ void PDumpRegRead(const u32 ui32RegOffset, u32 ui32Flags)
 {
        __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)
@@ -1276,9 +1237,8 @@ void PDumpCBP(struct PVRSRV_KERNEL_MEM_INFO *psROffMemInfo,
 
        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);
@@ -1289,7 +1249,7 @@ void PDumpIDLWithFlags(u32 ui32Clocks, u32 ui32Flags)
 {
        __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
 
-       sprintf(pszScript, "IDL %lu\r\n", ui32Clocks);
+       sprintf(pszScript, "IDL %u\r\n", ui32Clocks);
        PDumpWriteString2(pszScript, ui32Flags);
 }
 
@@ -1300,12 +1260,12 @@ void PDumpIDL(u32 ui32Clocks)
 
 void PDumpSuspendKM(void)
 {
-       gui32PDumpSuspended++;
+       atomic_inc(&gsPDumpSuspended);
 }
 
 void PDumpResumeKM(void)
 {
-       gui32PDumpSuspended--;
+       atomic_dec(&gsPDumpSuspended);
 }
 
 #endif
diff --git a/pvr/pdump_common.c b/pvr/pdump_common.c
new file mode 100644 (file)
index 0000000..4f0e6f2
--- /dev/null
@@ -0,0 +1,237 @@
+/**********************************************************************
+ *
+ * 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
index d8a6f97..958c333 100644 (file)
@@ -38,7 +38,7 @@
 #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,
@@ -64,12 +75,17 @@ enum PVRSRV_ERROR PDumpMemPagesKM(enum PVRSRV_DEVICE_TYPE eDeviceType,
                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);
@@ -81,10 +97,11 @@ enum PVRSRV_ERROR PDumpBitmapKM(char *pszFileName, u32 ui32FileOffset,
                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);
@@ -106,22 +123,29 @@ void PDumpCommentWithFlags(u32 ui32Flags, char *pszFormat, ...);
 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);
@@ -148,11 +172,11 @@ void PDumpCycleCountRegRead(const u32 dwRegOffset, IMG_BOOL bLastFrame);
 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);
@@ -163,8 +187,9 @@ void PDumpResumeKM(void);
 #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
@@ -176,13 +201,15 @@ void PDumpResumeKM(void);
 #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
@@ -198,6 +225,7 @@ void PDumpResumeKM(void);
 #define PDUMPMEMPOL(args...)
 #define PDUMPMEM(args...)
 #define PDUMPMEM2(args...)
+#define PDUMPMEMUM(args...)
 #define PDUMPINIT(args...)
 #define PDUMPDEINIT(args...)
 #define PDUMPISLASTFRAME(args...)
@@ -210,6 +238,8 @@ void PDumpResumeKM(void);
 #define PDUMPREGPOLWITHFLAGS(args...)
 #define PDUMPMALLOCPAGES(args...)
 #define PDUMPMALLOCPAGETABLE(args...)
+#define PDUMPSETMMUCONTEXT(args...)
+#define PDUMPCLEARMMUCONTEXT(args...)
 #define PDUMPFREEPAGES(args...)
 #define PDUMPFREEPAGETABLE(args...)
 #define PDUMPPDREG(args...)
index 982bf0b..dec488b 100644 (file)
 #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
index 50d352e..d0d4f4c 100644 (file)
@@ -28,6 +28,7 @@
 #include "resman.h"
 #include "handle.h"
 #include "perproc.h"
+#include "osperproc.h"
 
 #define        HASH_TAB_INIT_SIZE 32
 
@@ -41,10 +42,16 @@ static enum PVRSRV_ERROR FreePerProcessData(
 
        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 {
@@ -78,8 +85,16 @@ static enum PVRSRV_ERROR FreePerProcessData(
                }
        }
 
-       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;
 }
@@ -112,7 +127,7 @@ enum PVRSRV_ERROR PVRSRVPerProcessDataConnect(u32 ui32PID)
                                    &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;
                }
@@ -129,6 +144,15 @@ enum PVRSRV_ERROR PVRSRVPerProcessDataConnect(u32 ui32PID)
                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,
@@ -141,8 +165,7 @@ enum PVRSRV_ERROR PVRSRVPerProcessDataConnect(u32 ui32PID)
                        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)",
@@ -150,8 +173,16 @@ enum PVRSRV_ERROR PVRSRVPerProcessDataConnect(u32 ui32PID)
                        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");
@@ -182,7 +213,7 @@ void PVRSRVPerProcessDataDisconnect(u32 ui32PID)
                                                              (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--;
@@ -198,10 +229,16 @@ void PVRSRVPerProcessDataDisconnect(u32 ui32PID)
                        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)
index 1559197..a89b0e4 100644 (file)
@@ -55,4 +55,25 @@ void PVRSRVPerProcessDataDisconnect(u32 ui32PID);
 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
index 6e9a5da..35adf6a 100644 (file)
  *
  ******************************************************************************/
 #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;
@@ -149,17 +150,16 @@ static enum PVRSRV_ERROR PVRSRVDevicePrePowerStateKM(IMG_BOOL bAllDevices,
 
        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->
@@ -168,18 +168,17 @@ static enum PVRSRV_ERROR PVRSRVDevicePrePowerStateKM(IMG_BOOL bAllDevices,
                                                        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);
@@ -217,14 +216,13 @@ static enum PVRSRV_ERROR PVRSRVDevicePostPowerStateKM(IMG_BOOL bAllDevices,
 
                        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;
                                }
 
@@ -237,9 +235,9 @@ static enum PVRSRV_ERROR PVRSRVDevicePostPowerStateKM(IMG_BOOL bAllDevices,
                                                         psPowerDevice->
                                                         eCurrentPowerState);
                                        if (eError != PVRSRV_OK) {
-                                               pr_err(
-                                                  "pfnPostPower failed (%u)\n",
-                                                   eError);
+                                               pr_err
+                                                   ("pfnPostPower failed "
+                                                    "(%u)\n", eError);
                                                return eError;
                                        }
                                }
@@ -269,23 +267,44 @@ enum PVRSRV_ERROR PVRSRVSetDevicePowerStateKM(u32 ui32DeviceIndex,
        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);
@@ -296,7 +315,7 @@ Exit:
 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;
 
@@ -311,20 +330,17 @@ enum PVRSRV_ERROR PVRSRVSystemPrePowerStateKM(
        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;
@@ -335,7 +351,7 @@ enum PVRSRV_ERROR PVRSRVSystemPrePowerStateKM(
 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;
@@ -348,7 +364,7 @@ ErrorExit:
 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;
 
@@ -357,7 +373,6 @@ enum PVRSRV_ERROR PVRSRVSystemPostPowerStateKM(
                goto Exit;
 
        if (eNewPowerState != psSysData->eCurrentPowerState) {
-
                eError = SysSystemPostPowerState(eNewPowerState);
                if (eError != PVRSRV_OK)
                        goto Exit;
@@ -366,7 +381,6 @@ enum PVRSRV_ERROR PVRSRVSystemPostPowerStateKM(
        if (_IsSystemStatePowered(eNewPowerState) !=
            _IsSystemStatePowered(psSysData->eCurrentPowerState)) {
                if (_IsSystemStatePowered(eNewPowerState))
-
                        eNewDevicePowerState = PVRSRV_POWER_Unspecified;
                else
                        eNewDevicePowerState = PVRSRV_POWER_STATE_D3;
@@ -379,7 +393,7 @@ enum PVRSRV_ERROR PVRSRVSystemPostPowerStateKM(
        }
 
        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;
@@ -390,7 +404,6 @@ Exit:
 
        if (_IsSystemStatePowered(eNewPowerState) &&
            PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL))
-
                PVRSRVCommandCompleteCallbacks();
 
        return eError;
@@ -419,8 +432,8 @@ enum PVRSRV_ERROR PVRSRVSetPowerStateKM(enum PVR_POWER_STATE eNewPowerState)
 
 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;
@@ -429,16 +442,16 @@ ErrorExit:
 }
 
 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;
@@ -455,8 +468,8 @@ enum PVRSRV_ERROR PVRSRVRegisterPowerDevice(u32 ui32DeviceIndex,
                            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;
        }
 
@@ -490,24 +503,19 @@ enum PVRSRV_ERROR PVRSRVRemovePowerDevice(u32 ui32DeviceIndex)
 
        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;
 }
 
@@ -521,13 +529,16 @@ IMG_BOOL PVRSRVIsDevicePowered(u32 ui32DeviceIndex)
        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;
        }
 
@@ -544,7 +555,9 @@ enum PVRSRV_ERROR PVRSRVDevicePreClockSpeedChange(u32 ui32DeviceIndex,
 
        PVR_UNREFERENCED_PARAMETER(pvInfo);
 
-       SysAcquireData(&psSysData);
+       eError = SysAcquireData(&psSysData);
+       if (eError != PVRSRV_OK)
+               return eError;
 
        psPowerDevice = psSysData->psPowerDeviceList;
        while (psPowerDevice) {
@@ -564,25 +577,30 @@ enum PVRSRV_ERROR PVRSRVDevicePreClockSpeedChange(u32 ui32DeviceIndex,
                                            "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) {
@@ -597,14 +615,14 @@ void PVRSRVDevicePostClockSpeedChange(u32 ui32DeviceIndex,
                                                            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;
        }
 }
index f4990d7..807f167 100644 (file)
 
 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;
@@ -78,16 +78,16 @@ enum PVRSRV_ERROR PVRSRVSystemPostPowerStateKM(
 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);
 
diff --git a/pvr/private_data.h b/pvr/private_data.h
new file mode 100644 (file)
index 0000000..d0192c1
--- /dev/null
@@ -0,0 +1,35 @@
+/**********************************************************************
+ *
+ * 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
index 313f8b9..0ade0b9 100644 (file)
  *
  ******************************************************************************/
 
-#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)
@@ -83,16 +90,17 @@ static int pvr_read_proc(char *page, char **start, off_t off,
        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;
        }
 
@@ -104,25 +112,87 @@ int CreateProcEntry(const char *name, read_proc_t rhandler,
        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))
 {
@@ -130,8 +200,8 @@ int CreateProcReadEntry(const char *name,
 
        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;
        }
@@ -140,26 +210,24 @@ int CreateProcReadEntry(const char *name,
            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;
        }
@@ -168,15 +236,17 @@ int CreateProcEntries(void)
            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;
        }
@@ -187,10 +257,46 @@ int CreateProcEntries(void)
 
 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)
@@ -203,13 +309,13 @@ 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)
@@ -277,8 +383,7 @@ static const char *deviceClassToString(enum PVRSRV_DEVICE_CLASS deviceClass)
        }
 }
 
-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;
@@ -288,9 +393,9 @@ off_t procDumpSysNodes(char *buf, size_t size, off_t off)
                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;
index 63fab87..942b2ea 100644 (file)
@@ -41,7 +41,14 @@ int CreateProcReadEntry(const char *name,
                        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
index 42384f9..d41e73d 100644 (file)
@@ -44,7 +44,7 @@
        _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                       \
@@ -67,7 +67,7 @@
                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
 
@@ -426,7 +432,7 @@ struct PVRSRV_BRIDGE_IN_CACHEFLUSHDRMFROMUSER {
        u32 ui32BridgeFlags;
        void *hDevCookie;
        u32 ui32Type;
-       void *pvVirt;
+       u32 ui32Virt;
        u32 ui32Length;
 };
 
@@ -435,6 +441,14 @@ struct PVRSRV_BRIDGE_IN_FREEDEVICEMEM {
        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 {
@@ -452,12 +466,17 @@ struct PVRSRV_BRIDGE_IN_DESTROYCOMMANDQUEUE {
        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 {
@@ -490,7 +509,7 @@ struct PVRSRV_BRIDGE_IN_FREE_DEV_VIRTMEM {
 
 struct PVRSRV_BRIDGE_IN_MAP_DEV_MEMORY {
        u32 ui32BridgeFlags;
-       struct PVRSRV_KERNEL_MEM_INFO *psSrcKernelMemInfo;
+       void *hKernelMemInfo;
        void *hDstDevMemHeap;
 };
 
@@ -526,6 +545,8 @@ struct PVRSRV_BRIDGE_IN_UNMAP_EXT_MEMORY {
 struct PVRSRV_BRIDGE_IN_MAP_DEVICECLASS_MEMORY {
        u32 ui32BridgeFlags;
        void *hDeviceClassBuffer;
+       void *hDevMemContext;
+
 };
 
 struct PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY {
@@ -564,6 +585,7 @@ struct PVRSRV_BRIDGE_IN_PDUMP_SYNCPOL {
 
 struct PVRSRV_BRIDGE_IN_PDUMP_DUMPMEM {
        u32 ui32BridgeFlags;
+       void *pvLinAddr;
        void *pvAltLinAddr;
        struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
        u32 ui32Offset;
@@ -694,6 +716,7 @@ struct PVRSRV_BRIDGE_OUT_OPEN_DISPCLASS_DEVICE {
 struct PVRSRV_BRIDGE_IN_WRAP_EXT_MEMORY {
        u32 ui32BridgeFlags;
        void *hDevCookie;
+       void *hDevMemContext;
        void *pvLinAddr;
        u32 ui32ByteSize;
        u32 ui32PageOffset;
@@ -712,12 +735,14 @@ struct PVRSRV_BRIDGE_IN_UNWRAP_EXT_MEMORY {
        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;
@@ -863,6 +888,13 @@ struct PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM {
        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 {
@@ -879,13 +911,18 @@ struct PVRSRV_BRIDGE_OUT_GETFREEDEVICEMEM {
 };
 
 #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;
 };
 
@@ -1051,4 +1088,20 @@ struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE {
        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
index 0d0b399..9053a3e 100644 (file)
@@ -33,6 +33,7 @@
 #include "syscommon.h"
 #include "pvr_debug.h"
 #include "proc.h"
+#include "private_data.h"
 
 #include "sgx_bridge.h"
 
@@ -70,7 +71,7 @@ static off_t printLinuxBridgeStats(char *buffer, size_t count, off_t off)
        struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY *psEntry;
        off_t Ret;
 
-       LinuxLockMutex(&gPVRSRVLock);
+       mutex_lock(&gPVRSRVLock);
 
        if (!off) {
                if (count < 500) {
@@ -78,18 +79,16 @@ static off_t printLinuxBridgeStats(char *buffer, size_t count, off_t off)
                        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");
@@ -117,7 +116,7 @@ static off_t printLinuxBridgeStats(char *buffer, size_t count, off_t off)
                          psEntry->ui32CopyToUserTotalBytes);
 
 unlock_and_return:
-       LinuxUnLockMutex(&gPVRSRVLock);
+       mutex_unlock(&gPVRSRVLock);
        return Ret;
 }
 #endif
@@ -133,7 +132,7 @@ long PVRSRV_BridgeDispatchKM(struct file *file, unsigned int cmd,
        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))) {
@@ -183,8 +182,10 @@ long PVRSRV_BridgeDispatchKM(struct file *file, unsigned int cmd,
                                                sBridgePackageKM.ui32BridgeID);
 
        err = BridgedDispatchKM(psPerProc, &sBridgePackageKM);
+       if (err != PVRSRV_OK)
+               goto unlock_and_return;
 
 unlock_and_return:
-       LinuxUnLockMutex(&gPVRSRVLock);
+       mutex_unlock(&gPVRSRVLock);
        return err;
 }
index 3acc66e..0c60a42 100644 (file)
@@ -27,9 +27,8 @@
 #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"
 
@@ -93,17 +92,13 @@ enum PVRSRV_ERROR PVRSRVUnmapDeviceMemoryKM(
                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);
@@ -158,13 +153,11 @@ enum PVRSRV_ERROR PVRSRVCloseBCDeviceKM(void *hDeviceKM,
 
 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);
 
@@ -192,7 +185,6 @@ enum PVRSRV_ERROR PVRSRVFreeSharedSysMemoryKM(
 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
index b3e9bac..eec9075 100644 (file)
  *
  ******************************************************************************/
 
-#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;
@@ -64,56 +125,64 @@ void PVRSRVDebugPrintf(u32 ui32DebugLevel,
 
        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);
        }
 }
@@ -127,27 +196,28 @@ void PVRSRVDebugAssertFail(const char *pszFile, u32 uLine)
 
 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;
 }
@@ -181,4 +251,103 @@ int PVRDebugProcGetLevel(char *page, char **start, off_t off, int count,
        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();
+}
+
index 8062bc1..a47d718 100644 (file)
 #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
 
@@ -84,8 +88,9 @@ int PVRDebugProcGetLevel(char *page, char **start, off_t off, int count,
 
 #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, ...);
 
@@ -96,6 +101,9 @@ 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
 
index c88085f..54f8549 100644 (file)
@@ -2,7 +2,6 @@
 #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
index b2bb90b..c84e4d8 100644 (file)
 #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
index 6faabad..6db31c0 100644 (file)
  *
  ******************************************************************************/
 
+#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;
@@ -66,10 +69,8 @@ enum PVRSRV_ERROR FreeDeviceID(struct SYS_DATA *psSysData, u32 ui32DevID)
        psDeviceEnd = psDeviceWalker + psSysData->ui32NumDevices;
 
        while (psDeviceWalker < psDeviceEnd) {
-
                if ((psDeviceWalker->uiID == ui32DevID) &&
-                   (psDeviceWalker->bInUse)
-                   ) {
+                   (psDeviceWalker->bInUse)) {
                        psDeviceWalker->bInUse = IMG_FALSE;
                        return PVRSRV_OK;
                }
@@ -143,19 +144,22 @@ enum PVRSRV_ERROR PVRSRVInit(struct SYS_DATA *psSysData)
        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;
@@ -171,9 +175,15 @@ void PVRSRVDeInit(struct SYS_DATA *psSysData)
 
        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);
        }
@@ -204,8 +214,7 @@ enum PVRSRV_ERROR PVRSRVRegisterDevice(struct SYS_DATA *psSysData,
                       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));
@@ -215,8 +224,8 @@ enum PVRSRV_ERROR PVRSRVRegisterDevice(struct SYS_DATA *psSysData,
                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;
        }
 
@@ -268,7 +277,7 @@ FoundDevice:
        eError = PVRSRVResManConnect(NULL, &psDeviceNode->hResManContext);
        if (eError != PVRSRV_OK) {
                PVR_DPF(PVR_DBG_ERROR, "PVRSRVInitialiseDevice: "
-                        "Failed PVRSRVResManConnect call");
+                                       "Failed PVRSRVResManConnect call");
                return eError;
        }
 
@@ -276,7 +285,7 @@ FoundDevice:
                eError = psDeviceNode->pfnInitDevice(psDeviceNode);
                if (eError != PVRSRV_OK) {
                        PVR_DPF(PVR_DBG_ERROR, "PVRSRVInitialiseDevice: "
-                               "Failed InitDevice call");
+                                               "Failed InitDevice call");
                        return eError;
                }
        }
@@ -294,16 +303,17 @@ enum PVRSRV_ERROR PVRSRVFinaliseSystem(IMG_BOOL bInitSuccessful)
 
        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;
                }
 
@@ -316,18 +326,42 @@ enum PVRSRV_ERROR PVRSRVFinaliseSystem(IMG_BOOL bInitSuccessful)
                                                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)
@@ -347,19 +381,21 @@ enum PVRSRV_ERROR PVRSRVAcquireDeviceDataKM(u32 ui32DevIndex,
 
        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");
@@ -416,15 +452,15 @@ FoundDevice:
        }
 
        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;
                }
        }
@@ -441,32 +477,20 @@ FoundDevice:
        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;
 }
@@ -483,11 +507,14 @@ enum PVRSRV_ERROR PVRSRVGetMiscInfoKM(struct PVRSRV_MISC_INFO *psMiscInfo)
                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;
@@ -500,19 +527,22 @@ enum PVRSRV_ERROR PVRSRVGetMiscInfoKM(struct PVRSRV_MISC_INFO *psMiscInfo)
                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 =
@@ -521,8 +551,9 @@ enum PVRSRV_ERROR PVRSRVGetMiscInfoKM(struct PVRSRV_MISC_INFO *psMiscInfo)
                    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;
@@ -568,16 +599,18 @@ enum PVRSRV_ERROR PVRSRVGetMiscInfoKM(struct PVRSRV_MISC_INFO *psMiscInfo)
                                    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;
                                }
                        }
@@ -587,23 +620,24 @@ enum PVRSRV_ERROR PVRSRVGetMiscInfoKM(struct PVRSRV_MISC_INFO *psMiscInfo)
                                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;
@@ -615,15 +649,50 @@ enum PVRSRV_ERROR PVRSRVGetMiscInfoKM(struct PVRSRV_MISC_INFO *psMiscInfo)
                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;
 }
 
@@ -696,9 +765,8 @@ IMG_BOOL PVRSRVSystemLISR(void *pvSysData)
                if (psDeviceNode->pfnDeviceISR != NULL)
                        if (ui32InterruptSource & psDeviceNode->
                            ui32SOCInterruptBit) {
-                               if ((*psDeviceNode->
-                                    pfnDeviceISR) (psDeviceNode->pvISRData))
-
+                               if ((*psDeviceNode->pfnDeviceISR)
+                                               (psDeviceNode->pvISRData))
                                        bStatus = IMG_TRUE;
 
                                ui32ClearInterrupts |=
@@ -726,8 +794,8 @@ void PVRSRVMISR(void *pvSysData)
        psDeviceNode = psSysData->psDeviceNodeList;
        while (psDeviceNode != NULL) {
                if (psDeviceNode->pfnDeviceMISR != NULL)
-                       (*psDeviceNode->pfnDeviceMISR) (psDeviceNode->
-                                                       pvISRData);
+                       (*psDeviceNode->pfnDeviceMISR)(psDeviceNode->
+                                                               pvISRData);
                psDeviceNode = psDeviceNode->psNext;
        }
 
index 84d7c96..5dc4779 100644 (file)
 #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
index 05644c0..71fa425 100644 (file)
@@ -38,12 +38,10 @@ static int QueuePrintCommands(struct PVRSRV_QUEUE_INFO *psQueue, char *buffer,
        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,
@@ -69,9 +67,8 @@ off_t QueuePrintQueues(char *buffer, size_t size, off_t off)
 
        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)
@@ -125,7 +122,7 @@ enum PVRSRV_ERROR PVRSRVCreateCommandQueueKM(u32 ui32QueueSize,
                       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));
@@ -137,7 +134,7 @@ enum PVRSRV_ERROR PVRSRVCreateCommandQueueKM(u32 ui32QueueSize,
                       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;
        }
 
@@ -194,8 +191,6 @@ enum PVRSRV_ERROR PVRSRVDestroyCommandQueueKM(
        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)
@@ -203,25 +198,21 @@ enum PVRSRV_ERROR PVRSRVDestroyCommandQueueKM(
 
        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);
@@ -285,8 +276,6 @@ enum PVRSRV_ERROR PVRSRVGetQueueSpaceKM(struct PVRSRV_QUEUE_INFO *psQueue,
                                    u32 ui32ParamSize, void **ppvSpace)
 {
        IMG_BOOL bTimeout = IMG_TRUE;
-       IMG_BOOL bStart = IMG_FALSE;
-       u32 uiStart = 0, uiCurrent = 0;
 
        ui32ParamSize = (ui32ParamSize + 3) & 0xFFFFFFFC;
 
@@ -297,32 +286,22 @@ enum PVRSRV_ERROR PVRSRVGetQueueSpaceKM(struct PVRSRV_QUEUE_INFO *psQueue,
                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;
@@ -400,22 +379,25 @@ enum PVRSRV_ERROR PVRSRVInsertCommandKM(struct PVRSRV_QUEUE_INFO *psQueue,
 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 *
@@ -429,8 +411,8 @@ enum PVRSRV_ERROR PVRSRVSubmitCommandKM(struct PVRSRV_QUEUE_INFO *psQueue,
 }
 
 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;
@@ -450,14 +432,16 @@ static enum PVRSRV_ERROR PVRSRVProcessCommand(struct SYS_DATA *psSysData,
                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++;
        }
@@ -471,26 +455,29 @@ static enum PVRSRV_ERROR PVRSRVProcessCommand(struct SYS_DATA *psSysData,
                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++;
        }
@@ -555,16 +542,18 @@ enum PVRSRV_ERROR PVRSRVProcessQueues(u32 ui32CallerID, IMG_BOOL bFlush)
                                        "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;
@@ -628,13 +617,15 @@ void PVRSRVCommandCompleteKM(void *hCmdCookie, IMG_BOOL bScheduleMISR)
        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;
 
@@ -651,16 +642,14 @@ void PVRSRVCommandCompleteCallbacks(void)
 
        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;
        }
 }
@@ -692,7 +681,7 @@ enum PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(u32 ui32DevIndex,
 
        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,
@@ -711,14 +700,13 @@ enum PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(u32 ui32DevIndex,
                            (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);
 
@@ -730,11 +718,12 @@ enum PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(u32 ui32DevIndex,
                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;
                }
 
@@ -750,7 +739,7 @@ enum PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(u32 ui32DevIndex,
                psCmdCompleteData->psSrcSync = (struct PVRSRV_SYNC_OBJECT *)
                     (((u32) psCmdCompleteData->psDstSync) +
                                        (sizeof(struct PVRSRV_SYNC_OBJECT) *
-                                        ui32MaxSyncsPerCmd[i][0]));
+                                                ui32MaxSyncsPerCmd[i][0]));
                psCmdCompleteData->ui32AllocSize = ui32AllocSize;
        }
 
@@ -759,16 +748,17 @@ enum PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(u32 ui32DevIndex,
 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 *),
@@ -776,11 +766,10 @@ ErrorExit:
                          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;
 }
@@ -805,8 +794,12 @@ enum PVRSRV_ERROR PVRSRVRemoveCmdProcListKM(u32 ui32DevIndex, u32 ui32CmdCount)
                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) {
@@ -817,17 +810,19 @@ enum PVRSRV_ERROR PVRSRVRemoveCmdProcListKM(u32 ui32DevIndex, u32 ui32CmdCount)
                                          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;
 }
index f135856..09f5479 100644 (file)
@@ -43,17 +43,8 @@ struct COMMAND_COMPLETE_DATA {
 
 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
 
index d2dd2a0..4d002a6 100644 (file)
--- a/pvr/ra.c
+++ b/pvr/ra.c
@@ -34,7 +34,7 @@
 #include "proc.h"
 
 
-#define MINIMUM_HASH_SIZE (64)
+#define MINIMUM_HASH_SIZE      64
 
 struct BT {
        enum bt_type {
@@ -54,16 +54,18 @@ struct BT {
 
        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;
@@ -75,6 +77,7 @@ struct RA_ARENA {
 #define PROC_NAME_SIZE         32
        char szProcInfoName[PROC_NAME_SIZE];
        char szProcSegsName[PROC_NAME_SIZE];
+       IMG_BOOL bInitProcEntry;
 #endif
 };
 
@@ -85,8 +88,22 @@ static int RA_DumpInfo(char *page, char **start, off_t off, int count, int *eof,
                       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);
@@ -109,12 +126,19 @@ static u32 pvr_log2(size_t n)
        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)
@@ -122,22 +146,38 @@ static void _SegmentListInsertAfter(struct RA_ARENA *pArena,
        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)
@@ -160,6 +200,12 @@ static struct BT *_SegmentSplit(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)
@@ -243,9 +289,19 @@ static struct BT *_InsertResource(struct RA_ARENA *pArena, u32 base,
 {
        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;
@@ -259,11 +315,17 @@ static struct BT *_InsertResource(struct RA_ARENA *pArena, u32 base,
 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",
@@ -280,15 +342,27 @@ static struct BT *_InsertResourceSpan(struct RA_ARENA *pArena, u32 base,
        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:
@@ -307,6 +381,10 @@ static void _FreeBT(struct RA_ARENA *pArena, struct BT *pBT,
        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++;
@@ -317,9 +395,8 @@ static void _FreeBT(struct RA_ARENA *pArena, struct BT *pBT,
        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;
@@ -332,9 +409,8 @@ static void _FreeBT(struct RA_ARENA *pArena, struct BT *pBT,
        }
 
        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;
@@ -354,8 +430,7 @@ static void _FreeBT(struct RA_ARENA *pArena, struct BT *pBT,
                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))
@@ -367,9 +442,8 @@ static void _FreeBT(struct RA_ARENA *pArena, struct BT *pBT,
                                                  (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);
@@ -394,186 +468,149 @@ static void _FreeBT(struct RA_ARENA *pArena, struct BT *pBT,
                _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),
@@ -581,8 +618,9 @@ struct RA_ARENA *RA_Create(char *name, u32 base, size_t uSize,
                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++)
@@ -605,12 +643,43 @@ struct RA_ARENA *RA_Create(char *name, u32 base, size_t uSize,
 
 #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
 
@@ -641,6 +710,13 @@ void RA_Delete(struct RA_ARENA *pArena)
        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++)
@@ -657,48 +733,79 @@ void RA_Delete(struct RA_ARENA *pArena)
 #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;
@@ -708,8 +815,8 @@ IMG_BOOL RA_Alloc(struct RA_ARENA *pArena, size_t uRequestSize,
                        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,
@@ -717,17 +824,15 @@ IMG_BOOL RA_Alloc(struct RA_ARENA *pArena, size_t uRequestSize,
                                         &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;
@@ -739,13 +844,12 @@ IMG_BOOL RA_Alloc(struct RA_ARENA *pArena, size_t uRequestSize,
                        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);
                }
        }
@@ -767,6 +871,10 @@ void RA_Free(struct RA_ARENA *pArena, u32 base, IMG_BOOL bFreeBackingStore)
 
        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);
@@ -794,7 +902,6 @@ IMG_BOOL RA_GetNextLiveSegment(void *hArena,
                pBT = (struct BT *)psSegDetails->hSegment;
        } else {
                struct RA_ARENA *pArena = (struct RA_ARENA *)hArena;
-
                pBT = pArena->pHeadSegment;
        }
 
@@ -832,6 +939,35 @@ static char *_BTType(int eType)
 }
 #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)
@@ -855,9 +991,8 @@ static int RA_DumpSegs(char *page, char **start, off_t off, int count, int *eof,
                ;
        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;
@@ -880,9 +1015,8 @@ static int RA_DumpInfo(char *page, char **start, off_t off, int count, int *eof,
                                  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:
@@ -901,7 +1035,7 @@ static int RA_DumpInfo(char *page, char **start, off_t off, int count, int *eof,
                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:
@@ -931,8 +1065,8 @@ static int RA_DumpInfo(char *page, char **start, off_t off, int count, int *eof,
 #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;
@@ -944,59 +1078,50 @@ enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena,
        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);
 
@@ -1007,8 +1132,7 @@ enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena,
        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);
        }
@@ -1016,8 +1140,7 @@ enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena,
        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);
        }
@@ -1025,11 +1148,10 @@ enum PVRSRV_ERROR RA_GetStats(struct RA_ARENA *pArena,
        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);
        }
 
index b1ae36a..2f9ceea 100644 (file)
--- a/pvr/ra.h
+++ b/pvr/ra.h
@@ -47,30 +47,34 @@ struct RA_STATISTICS {
        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);
 
@@ -95,8 +99,8 @@ 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
 
index 4159ea6..5b9766f 100644 (file)
  *
  ******************************************************************************/
 
-#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)
 
@@ -91,10 +86,10 @@ static void FreeResourceByPtr(struct RESMAN_ITEM *psItem,
                                           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);
@@ -124,7 +119,6 @@ enum PVRSRV_ERROR ResManInit(void)
 void ResManDeInit(void)
 {
        if (gpsResList != NULL)
-
                OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*gpsResList),
                          gpsResList, NULL);
 }
@@ -143,7 +137,8 @@ enum PVRSRV_ERROR PVRSRVResManConnect(void *hPerProc,
                            (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;
 
@@ -180,16 +175,15 @@ static int free_one_res(struct RESMAN_CONTEXT *ctx, u32 restype)
        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)
 {
 
@@ -201,6 +195,7 @@ 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);
@@ -220,10 +215,9 @@ void PVRSRVResManDisconnect(struct RESMAN_CONTEXT *ctx, IMG_BOOL bKernelContext)
                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);
@@ -243,15 +237,22 @@ void PVRSRVResManDisconnect(struct RESMAN_CONTEXT *ctx, IMG_BOOL bKernelContext)
 }
 
 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();
@@ -314,9 +315,8 @@ void ResManFreeResByPtr(struct RESMAN_ITEM *psResItem)
 }
 
 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);
 
@@ -329,7 +329,7 @@ void ResManFreeResByCriteria(struct RESMAN_CONTEXT *psResManContext,
                 psResManContext, ui32SearchCriteria, ui32ResType,
                 (u32) pvParam, ui32Param);
 
-       FreeResourceByCriteria(psResManContext, ui32SearchCriteria,
+       (void)FreeResourceByCriteria(psResManContext, ui32SearchCriteria,
                                        ui32ResType, pvParam, ui32Param,
                                        IMG_TRUE);
 
@@ -338,14 +338,22 @@ void ResManFreeResByCriteria(struct RESMAN_CONTEXT *psResManContext,
        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;
@@ -358,9 +366,11 @@ void ResManDissociateRes(struct RESMAN_ITEM *psResItem,
        } 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)
 {
@@ -368,7 +378,16 @@ IMG_INTERNAL enum PVRSRV_ERROR ResManFindResourceByPtr(
 
        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;
 
@@ -387,12 +406,9 @@ IMG_INTERNAL enum PVRSRV_ERROR ResManFindResourceByPtr(
        psCurItem = psResManContext->psResItemList;
 
        while (psCurItem != NULL) {
-
                if (psCurItem != psItem) {
-
                        psCurItem = psCurItem->psNext;
                } else {
-
                        RELEASE_SYNC_OBJ;
                        return PVRSRV_OK;
                }
@@ -406,7 +422,6 @@ IMG_INTERNAL enum PVRSRV_ERROR ResManFindResourceByPtr(
 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,
@@ -427,15 +442,15 @@ static void FreeResourceByPtr(struct RESMAN_ITEM *psItem,
        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,
@@ -450,26 +465,21 @@ 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++;
@@ -495,12 +505,10 @@ static void ValidateResList(struct RESMAN_LIST *psResList)
        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);
@@ -512,11 +520,10 @@ static void ValidateResList(struct RESMAN_LIST *psResList)
                        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);
index a5f8f17..60c2a3b 100644 (file)
@@ -54,10 +54,9 @@ enum {
 };
 
 #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;
@@ -66,8 +65,10 @@ enum PVRSRV_ERROR ResManInit(void);
 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);
 
@@ -75,8 +76,9 @@ void ResManFreeResByCriteria(struct RESMAN_CONTEXT *hResManContext,
                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);
index bad4d26..33d4931 100644 (file)
 
 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
@@ -90,6 +95,11 @@ struct SYS_DATA;
 #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,
@@ -101,32 +111,41 @@ enum PVRSRV_DEVICE_TYPE {
        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 {
@@ -147,8 +166,10 @@ struct PVRSRV_HWREG {
 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;
@@ -196,6 +217,7 @@ struct PVRSRV_MISC_INFO {
        void *pvSOCTimerRegisterKM;
        void *pvSOCTimerRegisterUM;
        void *hSOCTimerRegisterOSMemHandle;
+       void *hSOCTimerRegisterMappingInfo;
 
        void *pvSOCClockGateRegs;
        u32 ui32SOCClockGateRegsSize;
@@ -206,6 +228,7 @@ struct PVRSRV_MISC_INFO {
        struct PVRSRV_EVENTOBJECT sGlobalEventObject;
        void *hOSGlobalEvent;
 
+       u32 aui32DDKVersion[4];
 };
 
 enum PVRSRV_ERROR AllocateDeviceID(struct SYS_DATA *psSysData, u32 *pui32DevID);
index 0914b1b..d443fae 100644 (file)
@@ -27,7 +27,6 @@
 #ifndef SERVICES_HEADERS_H
 #define SERVICES_HEADERS_H
 
-
 #include "img_defs.h"
 #include "services.h"
 #include "servicesint.h"
index 177e3d7..3a1cb43 100644 (file)
 
 #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 {
@@ -91,22 +94,13 @@ enum PVR_POWER_STATE {
        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,
@@ -118,37 +112,19 @@ enum PVRSRV_PIXEL_FORMAT {
        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,
@@ -158,30 +134,129 @@ enum PVRSRV_PIXEL_FORMAT {
        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,
 };
@@ -200,8 +275,17 @@ enum PVRSRV_COLOURSPACE_FORMAT {
        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 {
 
@@ -217,17 +301,11 @@ 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 {
@@ -235,8 +313,6 @@ struct PVRSRV_RESOURCE {
        u32 ui32ID;
 };
 
-
-
 struct IMG_RECT {
        s32 x0;
        s32 y0;
@@ -251,7 +327,6 @@ struct IMG_RECT_16 {
        s16 y1;
 };
 
-
 struct DISPLAY_DIMS {
        u32 ui32ByteStride;
        u32 ui32Width;
@@ -259,25 +334,18 @@ struct DISPLAY_DIMS {
 };
 
 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;
 };
 
@@ -285,16 +353,10 @@ struct DISPLAY_MODE_INFO {
 
 struct DISPLAY_INFO {
        u32 ui32MaxSwapChains;
-
        u32 ui32MaxSwapChainBuffers;
-
        u32 ui32MinSwapInterval;
-
        u32 ui32MaxSwapInterval;
-
        char szDisplayName[MAX_DISPLAY_NAME_SIZE];
-
-
 };
 
 struct ACCESS_INFO {
@@ -326,18 +388,12 @@ struct PVRSRV_CURSOR_SHAPE {
 #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 {
index d7cd12c..d18adec 100644 (file)
@@ -31,9 +31,9 @@
 #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 {
 
@@ -42,6 +42,11 @@ struct PVRSRV_KERNEL_MEM_INFO {
        u32 ui32Flags;
        u32 ui32AllocSize;
        struct PVRSRV_MEMBLK sMemBlk;
+
+       void *pvSysBackupBuffer;
+
+       u32 ui32RefCount;
+
        struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
 };
 
@@ -53,9 +58,10 @@ struct PVRSRV_KERNEL_SYNC_INFO {
 };
 
 struct PVRSRV_DEVICE_SYNC_OBJECT {
-       u32 ui32ReadOpPendingVal;
+
+       u32 ui32ReadOpsPendingVal;
        struct IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr;
-       u32 ui32WriteOpPendingVal;
+       u32 ui32WriteOpsPendingVal;
        struct IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr;
 };
 
@@ -94,7 +100,6 @@ struct PVRSRV_QUEUE_INFO {
        struct PVRSRV_QUEUE_INFO *psNextKM;
 };
 
-
 struct PVRSRV_DEVICECLASS_BUFFER {
        enum PVRSRV_ERROR (*pfnGetBufferAddr)(void *, void *,
                                    struct IMG_SYS_PHYADDR **, u32 *,
@@ -119,7 +124,6 @@ static inline u32 PVRSRVGetWriteOpsPending(
                ui32WriteOpsPending =
                    psSyncInfo->psSyncData->ui32WriteOpsPending;
        else
-
                ui32WriteOpsPending =
                    psSyncInfo->psSyncData->ui32WriteOpsPending++;
 
@@ -135,8 +139,7 @@ static inline u32 PVRSRVGetReadOpsPending(
                ui32ReadOpsPending =
                    psSyncInfo->psSyncData->ui32ReadOpsPending++;
        else
-               ui32ReadOpsPending =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
+               ui32ReadOpsPending = psSyncInfo->psSyncData->ui32ReadOpsPending;
 
        return ui32ReadOpsPending;
 }
index d13d8c3..1a796ee 100644 (file)
 #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
index a06aee8..0d12fce 100644 (file)
@@ -31,9 +31,7 @@
 #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;
@@ -115,7 +131,7 @@ struct PVRSRV_BRIDGE_IN_GETCLIENTINFO {
 };
 
 struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO {
-       struct PVR3DIF4_INTERNAL_DEVINFO sSGXInternalDevInfo;
+       struct SGX_INTERNAL_DEVINFO sSGXInternalDevInfo;
        enum PVRSRV_ERROR eError;
 };
 
@@ -125,14 +141,14 @@ struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO {
 };
 
 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 {
@@ -143,9 +159,13 @@ 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;
@@ -169,8 +189,8 @@ struct PVRSRV_BRIDGE_OUT_READREGDWORD {
 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;
 
 };
 
@@ -252,7 +272,7 @@ struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC {
 #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;
 };
@@ -282,6 +302,15 @@ struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS {
        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 {
@@ -324,7 +353,6 @@ struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET {
        struct IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr;
 };
 
-
 struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS {
        u32 ui32BridgeFlags;
        void *hDevCookie;
@@ -343,4 +371,18 @@ struct PVRSRV_BRIDGE_OUT_SGX_READ_DIFF_COUNTERS {
        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
index b18bab5..2819a7e 100644 (file)
@@ -40,7 +40,7 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle,
 
 
 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,
@@ -51,26 +51,33 @@ enum PVRSRV_ERROR SGXGetMMUPDAddrKM(void *hDevCookie,
                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,
@@ -95,6 +102,8 @@ enum PVRSRV_ERROR SGXAddSharedPBDescKM(
                u32 ui32SharedPBDescSubKernelMemInfosCount);
 
 enum PVRSRV_ERROR SGXGetInternalDevInfoKM(void *hDevCookie,
-               struct PVR3DIF4_INTERNAL_DEVINFO *psSGXInternalDevInfo);
+                       struct SGX_INTERNAL_DEVINFO *psSGXInternalDevInfo);
+
+int sgx_force_reset(void);
 
 #endif
diff --git a/pvr/sgx_options.h b/pvr/sgx_options.h
new file mode 100644 (file)
index 0000000..ce59e49
--- /dev/null
@@ -0,0 +1,178 @@
+/**********************************************************************
+ *
+ * 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)
index 8a43ed0..a1ac0fe 100644 (file)
 
 #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;
@@ -81,13 +133,6 @@ struct PVRSRV_SGX_HWPERF_CBDATA {
        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;
@@ -95,28 +140,47 @@ struct SGX_MISC_INFO_HWPERF_RETRIEVE_CB {
        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;
@@ -124,16 +188,16 @@ struct PVR3DIF4_KICKTA_DUMPBITMAP {
        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;
@@ -141,7 +205,7 @@ struct PVR3DIF4_KICKTA_DUMP_ROFF {
        char *pszName;
 };
 
-struct PVR3DIF4_KICKTA_DUMP_BUFFER {
+struct SGX_KICKTA_DUMP_BUFFER {
        u32 ui32SpaceUsed;
        u32 ui32Start;
        u32 ui32End;
@@ -149,19 +213,20 @@ struct PVR3DIF4_KICKTA_DUMP_BUFFER {
        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
index 96e3033..589e264 100644 (file)
 #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
index 540073a..0eb5146 100644 (file)
@@ -30,7 +30,7 @@
 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 {
index cd9148a..1e0cfec 100644 (file)
 #ifndef _SGXDEFS_H_
 #define        _SGXDEFS_H_
 
+#ifndef SGX530
+#error unsupported SGX revision
+#endif
+
 #include "sgx530defs.h"
 #include "sgxerrata.h"
 #include "sgxfeaturedefs.h"
index c29e8ef..1aeaa9a 100644 (file)
 #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
index 6e69ee3..b36e6be 100644 (file)
  *
  ******************************************************************************/
 
-#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"
index fe63c4b..1245140 100644 (file)
 #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];
@@ -47,15 +51,19 @@ struct SGX_BRIDGE_INIT_INFO {
        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;
@@ -67,13 +75,13 @@ struct SGX_BRIDGE_INIT_INFO {
 
 };
 
-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 {
@@ -83,35 +91,72 @@ 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;
@@ -129,14 +174,16 @@ struct PVR3DIF4_CCB_KICK {
 #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;
@@ -147,18 +194,20 @@ struct PVRSRV_SGX_HOST_CTL {
        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;
@@ -167,61 +216,26 @@ struct PVR3DIF4_CLIENT_INFO {
 
 };
 
-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;
@@ -234,11 +248,11 @@ struct PVR3DIF4_CMDTA_SHARED {
        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;
@@ -264,15 +278,6 @@ struct PVR3DIF4_TRANSFERCMD_SHARED {
 
        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 {
@@ -290,8 +295,9 @@ 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
@@ -305,4 +311,28 @@ struct PVRSRV_SGXDEV_DIFF_INFO {
        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
index ddc0d9c..f2acb46 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef __SGXINFOKM_H__
 #define __SGXINFOKM_H__
 
+#include <linux/workqueue.h>
 #include "sgxdefs.h"
 #include "device.h"
 #include "sysconfig.h"
@@ -36,8 +37,6 @@
 
 #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;
 
@@ -88,15 +90,19 @@ struct PVRSRV_SGXDEV_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;
 
@@ -109,8 +115,7 @@ struct PVRSRV_SGXDEV_INFO {
        u32 ui32EDMTaskReg0;
        u32 ui32EDMTaskReg1;
 
-       u32 ui32ClkGateCtl;
-       u32 ui32ClkGateCtl2;
+       u32 ui32ClkGateStatusReg;
        u32 ui32ClkGateStatusMask;
        struct SGX_INIT_SCRIPTS sScripts;
 
@@ -126,7 +131,9 @@ struct PVRSRV_SGXDEV_INFO {
        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;
 
@@ -154,11 +161,6 @@ struct SGX_DEVICE_MAP {
        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;
@@ -183,7 +185,7 @@ struct PVRSRV_STUB_PBDESC {
 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)
@@ -191,8 +193,70 @@ struct PVRSRV_SGX_CCB_INFO {
 #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
index 7fe1a23..71815f0 100644 (file)
@@ -25,9 +25,9 @@
  ******************************************************************************/
 
 #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)
@@ -141,28 +93,40 @@ static enum PVRSRV_ERROR InitDevInfo(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
            (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),
@@ -177,15 +141,14 @@ static enum PVRSRV_ERROR InitDevInfo(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
        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;
 
@@ -193,8 +156,7 @@ static enum PVRSRV_ERROR InitDevInfo(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
 
        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,
@@ -208,290 +170,6 @@ failed_allockernelccb:
        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)
@@ -504,8 +182,7 @@ static enum PVRSRV_ERROR SGXRunScript(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                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,
@@ -537,19 +214,27 @@ static enum PVRSRV_ERROR SGXRunScript(struct PVRSRV_SGXDEV_INFO *psDevInfo,
 
        }
 
-       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);
 
@@ -563,59 +248,43 @@ static enum PVRSRV_ERROR SGXInitialise(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                 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;
@@ -645,25 +314,19 @@ static enum PVRSRV_ERROR DevInitSGXPart1(void *pvDeviceNode)
                                                                   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));
@@ -672,7 +335,6 @@ static enum PVRSRV_ERROR DevInitSGXPart1(void *pvDeviceNode)
        psDevInfo->eDeviceClass = DEV_DEVICE_CLASS;
 
        psDeviceNode->pvDevice = (void *) psDevInfo;
-       psDeviceNode->hDeviceOSMemHandle = hDevInfoOSMemHandle;
 
        psDevInfo->pvDeviceMemoryHeap = (void *) psDeviceMemoryHeap;
 
@@ -744,6 +406,7 @@ enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
        enum PVRSRV_ERROR eError;
        struct SGX_DEVICE_MAP *psSGXDeviceMap;
        enum PVR_POWER_STATE eDefaultPowerState;
+       u32 l;
 
        PDUMPCOMMENT("SGX Initialisation Part 2");
 
@@ -752,8 +415,8 @@ enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
 
        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;
        }
 
@@ -769,7 +432,6 @@ enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
        if (psSGXDeviceMap->pvRegsCpuVBase) {
                psDevInfo->pvRegsBaseKM = psSGXDeviceMap->pvRegsCpuVBase;
        } else {
-
                psDevInfo->pvRegsBaseKM =
                    OSMapPhysToLin(psSGXDeviceMap->sRegsCpuPBase,
                                   psSGXDeviceMap->ui32RegsSize,
@@ -784,17 +446,15 @@ enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
        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,
@@ -805,7 +465,7 @@ enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
                                           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;
        }
 
@@ -815,15 +475,15 @@ enum PVRSRV_ERROR DevInitSGXPart2KM(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
                 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,
@@ -846,8 +506,7 @@ static enum PVRSRV_ERROR DevDeInitSGX(void *pvDeviceNode)
                (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;
@@ -888,8 +547,7 @@ static enum PVRSRV_ERROR DevDeInitSGX(void *pvDeviceNode)
 
        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)->
@@ -898,7 +556,7 @@ static enum PVRSRV_ERROR DevDeInitSGX(void *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!");
@@ -910,11 +568,12 @@ static enum PVRSRV_ERROR DevDeInitSGX(void *pvDeviceNode)
                        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)
@@ -926,15 +585,66 @@ static enum PVRSRV_ERROR DevDeInitSGX(void *pvDeviceNode)
        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);
 
@@ -948,10 +658,15 @@ void HWRecoveryResetSGX(struct PVRSRV_DEVICE_NODE *psDeviceNode,
                }
        }
 
-       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 {
@@ -966,11 +681,13 @@ void HWRecoveryResetSGX(struct PVRSRV_DEVICE_NODE *psDeviceNode,
 
        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,
@@ -999,15 +716,17 @@ static void SGXOSTimer(struct work_struct *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,
@@ -1017,9 +736,9 @@ static void SGXOSTimer(struct work_struct *work)
                        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;
                        }
@@ -1030,11 +749,16 @@ static void SGXOSTimer(struct work_struct *work)
                }
        }
 
+       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);
@@ -1046,7 +770,7 @@ static void SGXOSTimer(struct work_struct *work)
                           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;
@@ -1068,13 +792,13 @@ SGXOSTimerInit(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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;
@@ -1088,7 +812,7 @@ static enum PVRSRV_ERROR SGXOSTimerEnable(struct timer_work_data *data)
        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;
@@ -1099,6 +823,11 @@ static enum PVRSRV_ERROR SGXOSTimerCancel(struct timer_work_data *data)
        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;
@@ -1120,9 +849,8 @@ static IMG_BOOL SGX_ISRHandler(void *pvData)
 
                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;
 
@@ -1148,16 +876,22 @@ static IMG_BOOL SGX_ISRHandler(void *pvData)
 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);
 }
 
@@ -1172,6 +906,8 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        psDeviceNode->pfnInitDevice = DevInitSGXPart1;
        psDeviceNode->pfnDeInitDevice = DevDeInitSGX;
 
+       psDeviceNode->pfnInitDeviceCompatCheck = SGXDevInitCompatCheck;
+
        psDeviceNode->pfnMMUInitialise = MMU_Initialise;
        psDeviceNode->pfnMMUFinalise = MMU_Finalise;
        psDeviceNode->pfnMMUInsertHeap = MMU_InsertHeap;
@@ -1192,19 +928,24 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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,
@@ -1227,6 +968,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1241,6 +985,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1248,43 +995,34 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1300,6 +1038,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1316,6 +1057,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1332,6 +1076,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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.
@@ -1348,6 +1095,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1364,6 +1114,9 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 =
@@ -1379,57 +1132,14 @@ enum PVRSRV_ERROR SGXRegisterDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        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 *)
@@ -1448,8 +1158,147 @@ enum PVRSRV_ERROR SGXGetClientInfoKM(void *hDevCookie,
        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:
@@ -1458,42 +1307,157 @@ enum PVRSRV_ERROR SGXGetMiscInfoKM(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                            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();
@@ -1501,7 +1465,6 @@ enum PVRSRV_ERROR SGXGetMiscInfoKM(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                }
        default:
                {
-
                        return PVRSRV_ERROR_INVALID_PARAMS;
                }
        }
@@ -1535,7 +1498,7 @@ enum PVRSRV_ERROR SGXReadDiffCountersKM(void *hDevHandle, u32 ui32Reg,
                if (psPowerDevice->ui32DeviceIndex ==
                    psDeviceNode->sDevId.ui32DeviceIndex) {
                        bPowered =
-                           (IMG_BOOL) (psPowerDevice->eCurrentPowerState ==
+                           (IMG_BOOL)(psPowerDevice->eCurrentPowerState ==
                                        PVRSRV_POWER_STATE_D0);
                        break;
                }
@@ -1564,7 +1527,6 @@ enum PVRSRV_ERROR SGXReadDiffCountersKM(void *hDevHandle, u32 ui32Reg,
                        }
 
                        if (psDevInfo->ui32HWGroupRequested != *pui32Old) {
-
                                if (psDevInfo->ui32HWReset != 0) {
                                        OSWriteHWReg(psDevInfo->pvRegsBaseKM,
                                                     ui32Reg,
@@ -1573,7 +1535,6 @@ enum PVRSRV_ERROR SGXReadDiffCountersKM(void *hDevHandle, u32 ui32Reg,
                                                     psDevInfo->ui32HWReset);
                                        psDevInfo->ui32HWReset = 0;
                                }
-
                                OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32Reg,
                                             psDevInfo->ui32HWGroupRequested);
                        }
@@ -1581,8 +1542,8 @@ enum PVRSRV_ERROR SGXReadDiffCountersKM(void *hDevHandle, u32 ui32Reg,
                        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] =
@@ -1619,3 +1580,42 @@ enum PVRSRV_ERROR SGXReadDiffCountersKM(void *hDevHandle, u32 ui32Reg,
 
        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;
+}
index 6aab05b..d6ccb1f 100644 (file)
 #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;
@@ -57,22 +57,22 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
        ++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)
@@ -83,14 +83,14 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
                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;
        }
 
@@ -110,8 +110,7 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
        }
 
        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];
@@ -122,10 +121,10 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
                        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->
@@ -137,6 +136,7 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
                        psTACmd->sCtl3DStatusInfo[i].ui32StatusValue =
                            psSyncInfo->psSyncData->ui32ReadOpsPending;
                }
+       }
 
        psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs;
        for (i = 0; i < psCCBKick->ui32NumSrcSyncs; i++) {
@@ -149,99 +149,233 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
                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));
                }
@@ -250,44 +384,42 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
                        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,
@@ -295,5 +427,78 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle,
                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;
 }
index 4132fbf..d633e29 100644 (file)
 #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
diff --git a/pvr/sgxpower.c b/pvr/sgxpower.c
new file mode 100644 (file)
index 0000000..79b6c61
--- /dev/null
@@ -0,0 +1,398 @@
+/**********************************************************************
+ *
+ * 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;
+}
index 81e435a..ad76a01 100644 (file)
 
 #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
@@ -95,22 +94,19 @@ static void SGXResetInvalDC(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                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)
@@ -129,35 +125,6 @@ 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);
@@ -196,7 +163,8 @@ void SGXReset(struct PVRSRV_SGXDEV_INFO *psDevInfo, u32 ui32PDUMPFlags)
                                  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;
 
@@ -221,17 +189,28 @@ void SGXReset(struct PVRSRV_SGXDEV_INFO *psDevInfo, u32 ui32PDUMPFlags)
                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;
index c1bf9d9..2bbb0ba 100644 (file)
@@ -57,7 +57,8 @@ union SGX_INIT_COMMAND {
 };
 
 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];
 };
 
index 0cc3a0d..6cc159e 100644 (file)
@@ -46,207 +46,193 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle,
 {
        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++;
                }
        }
@@ -255,10 +241,49 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle,
        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;
 }
index 8749d23..feb3504 100644 (file)
 #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) {
@@ -180,13 +159,15 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
        *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",
@@ -197,7 +178,6 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
 
 #if defined(PDUMP)
        if (ui32CallerID != ISR_ID) {
-
                PDUMPCOMMENTWITHFLAGS(0,
                                      "Poll for space in the Kernel CCB\r\n");
                PDUMPMEMPOL(psKernelCCB->psCCBCtlMemInfo,
@@ -208,27 +188,28 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
 
                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
@@ -237,7 +218,8 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
 
 #if defined(PDUMP)
        if (ui32CallerID != ISR_ID) {
-               if (PDumpIsCaptureFrameKM())
+               if (PDumpIsCaptureFrameKM() ||
+                   ((ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
                        psKernelCCB->ui32CCBDumpWOff =
                            (psKernelCCB->ui32CCBDumpWOff + 1) & 0xFF;
 
@@ -245,153 +227,110 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
                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)
 {
@@ -399,7 +338,8 @@ 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;
@@ -407,13 +347,17 @@ enum PVRSRV_ERROR SGXGetInternalDevInfoKM(void *hDevCookie,
        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)
 {
@@ -421,80 +365,101 @@ static void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
            (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
        }
 }
 
@@ -563,7 +528,10 @@ void *SGXRegisterHWRenderContextKM(void *psDeviceNode,
                            (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;
        }
 
@@ -577,8 +545,8 @@ void *SGXRegisterHWRenderContextKM(void *psDeviceNode,
                                      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);
@@ -599,6 +567,12 @@ enum PVRSRV_ERROR SGXUnregisterHWRenderContextKM(void *hHWRenderContext)
 
        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;
@@ -618,7 +592,10 @@ void *SGXRegisterHWTransferContextKM(void *psDeviceNode,
                            (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;
        }
 
@@ -632,8 +609,8 @@ void *SGXRegisterHWTransferContextKM(void *psDeviceNode,
                                      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);
@@ -652,24 +629,30 @@ enum PVRSRV_ERROR SGXUnregisterHWTransferContextKM(void *hHWTransferContext)
 
        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(
@@ -677,17 +660,20 @@ 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;
        }
 
@@ -700,24 +686,19 @@ enum PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(
 
        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.");
@@ -747,9 +728,23 @@ enum PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(
 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;
+}
index 74c403e..66b61e8 100644 (file)
 
 #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);
 
@@ -101,3 +68,10 @@ enum PVRSRV_ERROR SGXUnregisterHWRenderContextKM(void *hHWRenderContext);
 
 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);
+
index 7ca5487..3dbcd24 100644 (file)
@@ -35,4 +35,16 @@ void PVRSRVProcessDisconnect(u32 ui32PID);
                                                   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
index 8a4ceec..4d47e7f 100644 (file)
@@ -37,6 +37,9 @@
 #include "device.h"
 #include "buffer_manager.h"
 
+#if defined(NO_HARDWARE) && defined(__KERNEL__)
+#include <linux/io.h>
+#endif
 
 struct SYS_DEVICE_ID {
        u32 uiID;
@@ -75,13 +78,14 @@ struct SYS_DATA {
 
        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,
@@ -151,8 +155,25 @@ static inline void SysDeinitialiseCommon(struct SYS_DATA *psSysData)
        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
index e0b1d72..78466b7 100644 (file)
@@ -32,6 +32,9 @@
 #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;
@@ -44,14 +47,44 @@ static u32 gui32SGXDeviceID;
 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 =
@@ -60,56 +93,151 @@ static enum PVRSRV_ERROR SysLocateDevices(struct SYS_DATA *psSysData)
 
        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;
@@ -118,10 +246,8 @@ enum PVRSRV_ERROR SysInitialise(void)
        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;
 
@@ -161,9 +287,10 @@ enum PVRSRV_ERROR SysInitialise(void)
        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) {
@@ -176,6 +303,13 @@ enum PVRSRV_ERROR SysInitialise(void)
        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) {
@@ -190,7 +324,6 @@ enum PVRSRV_ERROR SysInitialise(void)
 
        psDeviceNode = gpsSysData->psDeviceNodeList;
        while (psDeviceNode) {
-
                switch (psDeviceNode->sDevId.eDeviceType) {
                case PVRSRV_DEVICE_TYPE_SGX:
                        {
@@ -257,6 +390,9 @@ enum PVRSRV_ERROR SysInitialise(void)
                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,
@@ -278,6 +414,14 @@ enum PVRSRV_ERROR SysInitialise(void)
        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);
 
@@ -321,16 +465,6 @@ enum PVRSRV_ERROR SysFinalise(void)
        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;
@@ -342,8 +476,6 @@ enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData)
 {
        enum PVRSRV_ERROR eError;
 
-       PVR_UNREFERENCED_PARAMETER(psSysData);
-
        if (SYS_SPECIFIC_DATA_TEST
            (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) {
                eError = OSUninstallDeviceLISR(psSysData);
@@ -358,18 +490,13 @@ enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *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)) {
@@ -385,9 +512,12 @@ enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData)
                }
 
                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;
                }
        }
@@ -398,12 +528,22 @@ enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData)
 
        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;
                }
        }
@@ -415,6 +555,14 @@ enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData)
 
        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))
@@ -431,20 +579,13 @@ enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData)
 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;
 }
@@ -518,8 +659,13 @@ u32 SysGetInterruptSource(struct SYS_DATA *psSysData,
                                 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)
@@ -527,7 +673,6 @@ 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);
 }
@@ -544,8 +689,9 @@ enum PVRSRV_ERROR SysSystemPrePowerState(enum PVR_POWER_STATE eNewPowerState)
                        eError = OSUninstallDeviceLISR(gpsSysData);
                        if (eError != PVRSRV_OK) {
                                PVR_DPF(PVR_DBG_ERROR,
-                                       "SysSystemPrePowerState: "
-                                       "OSUninstallDeviceLISR failed (%d)",
+                                               "SysSystemPrePowerState: "
+                                               "OSUninstallDeviceLISR failed "
+                                               "(%d)",
                                         eError);
                                return eError;
                        }
@@ -582,8 +728,8 @@ enum PVRSRV_ERROR SysSystemPostPowerState(enum PVR_POWER_STATE eNewPowerState)
                        eError = EnableSystemClocks(gpsSysData);
                        if (eError != PVRSRV_OK) {
                                PVR_DPF(PVR_DBG_ERROR,
-                                        "SysSystemPostPowerState: "
-                                        "EnableSystemClocks failed (%d)",
+                                       "SysSystemPostPowerState: "
+                                       "EnableSystemClocks failed (%d)",
                                         eError);
                                return eError;
                        }
@@ -600,9 +746,10 @@ enum PVRSRV_ERROR SysSystemPostPowerState(enum PVR_POWER_STATE eNewPowerState)
                                                "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,
@@ -623,7 +770,8 @@ enum PVRSRV_ERROR SysDevicePrePowerState(u32 ui32DeviceIndex,
        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;
@@ -640,16 +788,15 @@ enum PVRSRV_ERROR SysDevicePostPowerState(u32 ui32DeviceIndex,
        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);
index 46524ef..3ae1c6d 100644 (file)
 
 #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
index 5f49469..2af219d 100644 (file)
 #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)
@@ -71,7 +70,7 @@ enum SYS_DEVICE_TYPE {
 #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
index 1df68c0..03f39e6 100644 (file)
 
 #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);
 
@@ -54,6 +57,7 @@ enum PVRSRV_ERROR EnableSGXClocks(struct SYS_DATA *psSysData);
 
 #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)))
@@ -68,7 +72,15 @@ struct SYS_SPECIFIC_DATA {
        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;
similarity index 78%
rename from pvr/sysutils_linux.c
rename to pvr/sysutils.c
index 7e5f693..79e1c87 100644 (file)
 #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"
@@ -40,6 +40,7 @@
 #include "sgxinfokm.h"
 #include "syslocal.h"
 #include "env_data.h"
+#include "ocpdefs.h"
 
 #define        HZ_TO_MHZ(m) ((m) / 1000000)
 
@@ -56,23 +57,21 @@ static inline unsigned long scale_by_rate(unsigned long val,
 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);
@@ -82,7 +81,6 @@ void SysGetSGXTimingInformation(struct SGX_TIMING_INFORMATION *psTimingInfo)
            SYS_SGX_ACTIVE_POWER_LATENCY_MS;
 }
 
-
 static int vdd2_post_func(struct notifier_block *n, unsigned long event,
                          void *ptr)
 {
@@ -90,7 +88,7 @@ static int vdd2_post_func(struct notifier_block *n, unsigned long event,
        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;
@@ -117,8 +115,8 @@ static int vdd2_pre_func(struct notifier_block *n, unsigned long event,
        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.
@@ -138,8 +136,11 @@ static int vdd2_pre_post_func(struct notifier_block *n, unsigned long event,
 
        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();
@@ -167,8 +168,8 @@ static struct notifier_block vdd2_pre_post = {
        NULL
 };
 
-static void RegisterConstraintNotifications(
-                                       struct SYS_SPECIFIC_DATA *psSysSpecData)
+static void RegisterConstraintNotifications(struct SYS_SPECIFIC_DATA
+                                           *psSysSpecData)
 {
        PVR_TRACE("Registering constraint notifications");
 
@@ -176,8 +177,8 @@ static void RegisterConstraintNotifications(
        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");
 
@@ -203,14 +204,16 @@ static unsigned int sgx_current_load(void)
        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;
@@ -227,18 +230,19 @@ static unsigned int sgx_current_load(void)
                        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;
@@ -257,9 +261,9 @@ static void sgx_lock_perf(struct work_struct *work)
        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) {
@@ -273,9 +277,9 @@ static void sgx_lock_perf(struct work_struct *work)
        }
        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);
@@ -283,8 +287,8 @@ static void sgx_lock_perf(struct work_struct *work)
 
 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);
@@ -295,8 +299,8 @@ static void sgx_need_perf(struct SYS_DATA *psSysData, int ena)
 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");
@@ -314,8 +318,8 @@ enum PVRSRV_ERROR OSInitPerf(void *pvSysData)
 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");
@@ -324,69 +328,124 @@ enum PVRSRV_ERROR OSCleanupPerf(void *pvSysData)
 
        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);
 }
 
@@ -416,7 +475,6 @@ static enum PVRSRV_ERROR InitSgxClocks(struct SYS_DATA *psSysData)
        clk_put(core_ck);
 
        RegisterConstraintNotifications(psSysSpecData);
-
        return PVRSRV_OK;
 
 err2:
@@ -436,7 +494,6 @@ err0:
 static void CleanupSgxClocks(struct SYS_DATA *psSysData)
 {
        struct SYS_SPECIFIC_DATA *psSysSpecData = psSysData->pvSysSpecificData;
-
        UnRegisterConstraintNotifications(psSysSpecData);
 
        if (psSysSpecData->psSGX_ICK) {
@@ -510,8 +567,8 @@ static enum PVRSRV_ERROR InitDebugClocks(struct SYS_DATA *psSysData)
 
        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);
        }
 
@@ -636,7 +693,12 @@ enum PVRSRV_ERROR EnableSystemClocks(struct SYS_DATA *psSysData)
 {
        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;
 
@@ -650,6 +712,8 @@ void DisableSystemClocks(struct SYS_DATA *psSysData)
 {
        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);
 }
index 8291fab..1ab5e70 100644 (file)
@@ -83,13 +83,15 @@ struct DBGKM_SERVICE_TABLE g_sDBGKMServices = {
        ExtDBGDrivWriteCM,
        ExtDBGDrivSetMarker,
        ExtDBGDrivGetMarker,
-       ExtDBGDrivEndInitPhase,
+       ExtDBGDrivStartInitPhase,
+       ExtDBGDrivStopInitPhase,
        ExtDBGDrivIsCaptureFrame,
        ExtDBGDrivWriteLF,
        ExtDBGDrivReadLF,
        ExtDBGDrivGetStreamOffset,
        ExtDBGDrivSetStreamOffset,
        ExtDBGDrivIsLastCaptureFrame,
+       ExtDBGDrivWaitForEvent
 };
 
 void *ExtDBGDrivCreateStream(char *pszName,
@@ -428,12 +430,24 @@ u32 ExtDBGDrivReadLF(struct DBG_STREAM *psStream,
        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);
 
@@ -464,6 +478,15 @@ void ExtDBGDrivSetStreamOffset(struct DBG_STREAM *psStream,
        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;
@@ -869,14 +892,15 @@ u32 DBGDrivWriteStringCM(struct DBG_STREAM *psStream,
        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);
 
@@ -946,6 +970,11 @@ u32 DBGDrivWriteString(struct DBG_STREAM *psStream,
                ui32Len = 0;
        }
 
+#if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
+       if (ui32Len)
+               HostSignalEvent(DBG_EVENT_STREAM_DATA);
+#endif
+
        return ui32Len;
 }
 
@@ -1018,15 +1047,17 @@ u32 DBGDrivWrite(struct DBG_STREAM *psMainStream,
        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
@@ -1046,6 +1077,10 @@ u32 DBGDrivWrite(struct DBG_STREAM *psMainStream,
        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;
 }
 
@@ -1058,14 +1093,15 @@ u32 DBGDrivWriteCM(struct DBG_STREAM *psStream,
        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);
 }
@@ -1094,11 +1130,11 @@ u32 DBGDrivWrite2(struct DBG_STREAM *psMainStream,
        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;
 
@@ -1113,12 +1149,17 @@ u32 DBGDrivWrite2(struct DBG_STREAM *psMainStream,
 
                        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;
 }
 
@@ -1141,12 +1182,13 @@ u32 DBGDrivRead(struct DBG_STREAM *psMainStream,
        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;
@@ -1233,7 +1275,7 @@ void DBGDrivSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
        else
                psStream->ui32Flags &= ~DEBUG_FLAGS_ENABLESAMPLE;
 
-       if (g_bHotkeyMiddump)
+       if (g_bHotkeyMiddump) {
                if ((ui32Frame >= g_ui32HotkeyMiddumpStart) &&
                    (ui32Frame <= g_ui32HotkeyMiddumpEnd) &&
                    (((ui32Frame -
@@ -1245,6 +1287,7 @@ void DBGDrivSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
                        if (psStream->ui32Current > g_ui32HotkeyMiddumpEnd)
                                g_bHotkeyMiddump = IMG_FALSE;
                }
+       }
 
        if (g_bHotKeyRegistered) {
                g_bHotKeyRegistered = IMG_FALSE;
@@ -1260,7 +1303,7 @@ void DBGDrivSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
                }
 
                if ((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
-                   && (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY))
+                   && (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY)) {
                        if (!g_bHotkeyMiddump) {
 
                                g_ui32HotkeyMiddumpStart =
@@ -1276,6 +1319,7 @@ void DBGDrivSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
                                PVR_DPF(PVR_DBG_MESSAGE,
                                         "Turning off sampling\n");
                        }
+               }
 
        }
 
@@ -1316,7 +1360,7 @@ u32 DBGDrivIsCaptureFrame(struct DBG_STREAM *psStream,
        if (!StreamValid(psStream))
                return IMG_FALSE;
 
-       if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
+       if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
 
                if (g_bHotkeyMiddump) {
                        if ((psStream->ui32Current >=
@@ -1339,12 +1383,12 @@ u32 DBGDrivIsCaptureFrame(struct DBG_STREAM *psStream,
                              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;
@@ -1436,14 +1480,14 @@ u32 DBGDrivWriteLF(struct DBG_STREAM *psStream,
        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);
 
@@ -1494,11 +1538,23 @@ u32 DBGDrivReadLF(struct DBG_STREAM *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;
index 4c28fb3..4e2ebc3 100644 (file)
@@ -100,10 +100,11 @@ u32 DBGDrivWriteLF(struct DBG_STREAM *psStream,
 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);
 
@@ -153,21 +154,16 @@ u32 ExtDBGDrivGetFrame(struct DBG_STREAM *psStream);
 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);
@@ -182,5 +178,6 @@ u32 ExtDBGDrivReadLF(struct DBG_STREAM *psStream,
 u32 ExtDBGDrivGetStreamOffset(struct DBG_STREAM *psStream);
 void ExtDBGDrivSetStreamOffset(struct DBG_STREAM *psStream,
                                                u32 ui32StreamOffset);
+void ExtDBGDrivWaitForEvent(enum DBG_EVENT eEvent);
 
 #endif
index 0b6def0..efc9f68 100644 (file)
@@ -24,6 +24,7 @@
  *
  ******************************************************************************/
 
+#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, ...
@@ -171,21 +184,84 @@ void HostCreateRegDeclStreams(void)
 
 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
index c75c2cd..64f8823 100644 (file)
@@ -48,4 +48,11 @@ void HostAquireMutex(void *pvMutex);
 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
index a6365c4..b5a2eb8 100644 (file)
@@ -74,7 +74,7 @@ void ActivateHotKeys(struct DBG_STREAM *psStream)
 
        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");
@@ -87,6 +87,7 @@ void ActivateHotKeys(struct DBG_STREAM *psStream)
                } else {
                        g_PrivateHotKeyData.sHotKeyInfo.hHotKey = 0;
                }
+       }
 }
 
 void DeactivateHotKeys(void)
index 0e3f644..ddba527 100644 (file)
@@ -387,18 +387,13 @@ u32 DBGDIOCDrivReadLF(void *pvInBuffer, void *pvOutBuffer)
        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;
 }
index 6ccddbd..fcb1ff1 100644 (file)
@@ -50,7 +50,7 @@ u32 DBGDIOCDrivGetMarker(void *, void *);
 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,
@@ -74,7 +74,7 @@ DBGDIOCDrivCreateStream,
            DBGDIOCDrivSetMarker,
            DBGDIOCDrivGetMarker,
            DBGDIOCDrivIsCaptureFrame,
-           DBGDIOCDrivWriteLF, DBGDIOCDrivReadLF, DBGDIOCDrivResetStream,};
+           DBGDIOCDrivWriteLF, DBGDIOCDrivReadLF, DBGDIOCDrivWaitForEvent};
 
 #define MAX_DBGVXD_W32_API (sizeof(g_DBGDrivProc)/sizeof(u32))
 
index 9dd49e5..5de15cc 100644 (file)
@@ -51,8 +51,7 @@ MODULE_SUPPORTED_DEVICE(DRVNAME);
 
 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)
@@ -71,12 +70,12 @@ static int dbgdrv_mmap(struct file *pFile, struct vm_area_struct *ps_vma)
        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)
@@ -86,27 +85,46 @@ 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;
 
@@ -115,8 +133,7 @@ static int dbgdrv_ioctl(struct inode *inode, struct file *file,
        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;
        }