diff options
Diffstat (limited to 'packages/linux/linux-omap-2.6.27/pvr/nokia-TI.diff')
-rw-r--r-- | packages/linux/linux-omap-2.6.27/pvr/nokia-TI.diff | 8798 |
1 files changed, 0 insertions, 8798 deletions
diff --git a/packages/linux/linux-omap-2.6.27/pvr/nokia-TI.diff b/packages/linux/linux-omap-2.6.27/pvr/nokia-TI.diff deleted file mode 100644 index a4aca1e524..0000000000 --- a/packages/linux/linux-omap-2.6.27/pvr/nokia-TI.diff +++ /dev/null @@ -1,8798 +0,0 @@ - include4/img_types.h | 5 - include4/pdumpdefs.h | 1 - include4/pvrmodule.h | 31 - include4/pvrversion.h | 8 - include4/services.h | 46 - include4/servicesext.h | 6 - include4/sgxapi_km.h | 65 - services4/3rdparty/bufferclass_example/bufferclass_example.c | 32 - services4/3rdparty/bufferclass_example/bufferclass_example.h | 25 - services4/3rdparty/bufferclass_example/bufferclass_example_linux.c | 20 - services4/3rdparty/bufferclass_example/bufferclass_example_private.c | 76 - - services4/3rdparty/bufferclass_example/kbuild/Makefile | 40 - services4/3rdparty/dc_omap3430_linux/kbuild/Makefile | 39 - services4/3rdparty/dc_omap3430_linux/omaplfb.h | 7 - services4/3rdparty/dc_omap3430_linux/omaplfb_displayclass.c | 60 - services4/3rdparty/dc_omap3430_linux/omaplfb_linux.c | 52 - services4/include/pvr_bridge.h | 26 - services4/include/servicesint.h | 17 - services4/include/sgx_bridge.h | 95 + - services4/include/sgx_bridge_km.h | 139 - - services4/include/sgxinfo.h | 347 ++-- - services4/srvkm/Makefile | 68 - services4/srvkm/bridged/bridged_pvr_bridge.c | 732 ++++++++- - services4/srvkm/common/deviceclass.c | 6 - services4/srvkm/common/devicemem.c | 3 - services4/srvkm/common/handle.c | 58 - services4/srvkm/common/power.c | 15 - services4/srvkm/common/pvrsrv.c | 151 +- - services4/srvkm/common/queue.c | 4 - services4/srvkm/common/resman.c | 13 - services4/srvkm/devices/sgx/mmu.c | 2 - services4/srvkm/devices/sgx/mmu.h | 2 - services4/srvkm/devices/sgx/pb.c | 37 - services4/srvkm/devices/sgx/sgx2dcore.c | 21 - services4/srvkm/devices/sgx/sgx_bridge_km.h | 158 ++ - services4/srvkm/devices/sgx/sgxinfokm.h | 146 + - services4/srvkm/devices/sgx/sgxinit.c | 734 ++-------- - services4/srvkm/devices/sgx/sgxkick.c | 327 +++- - services4/srvkm/devices/sgx/sgxreset.c | 330 ++++ - services4/srvkm/devices/sgx/sgxtransfer.c | 312 ++++ - services4/srvkm/devices/sgx/sgxutils.c | 459 +++--- - services4/srvkm/devices/sgx/sgxutils.h | 28 - services4/srvkm/env/linux/env_data.h | 8 - services4/srvkm/env/linux/event.c | 221 +++ - services4/srvkm/env/linux/event.h | 32 - services4/srvkm/env/linux/kbuild/Makefile | 81 + - services4/srvkm/env/linux/mm.c | 8 - services4/srvkm/env/linux/module.c | 342 +++- - services4/srvkm/env/linux/osfunc.c | 347 +++- - services4/srvkm/env/linux/pdump.c | 13 - services4/srvkm/env/linux/proc.c | 17 - services4/srvkm/env/linux/pvr_debug.c | 2 - services4/srvkm/hwdefs/sgxdefs.h | 4 - services4/srvkm/hwdefs/sgxerrata.h | 9 - services4/srvkm/hwdefs/sgxfeaturedefs.h | 11 - services4/srvkm/include/device.h | 35 - services4/srvkm/include/handle.h | 10 - services4/srvkm/include/osfunc.h | 32 - services4/srvkm/include/pdump_km.h | 2 - services4/srvkm/include/resman.h | 5 - services4/srvkm/include/srvkm.h | 4 - services4/system/include/syscommon.h | 2 - services4/system/omap3430/sysconfig.c | 24 - services4/system/omap3430/sysconfig.h | 7 - services4/system/omap3430/sysutils.c | 2 - 65 files changed, 4286 insertions(+), 1675 deletions(-) - - -diff -Nurd git/drivers/gpu/pvr/include4/img_types.h git/drivers/gpu/pvr/include4/img_types.h ---- git/drivers/gpu/pvr/include4/img_types.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/img_types.h 2008-12-18 15:47:29.000000000 +0100 -@@ -43,7 +43,10 @@ - typedef signed long IMG_INT32, *IMG_PINT32; - - #if defined(LINUX) -- -+#if !defined(USE_CODE) -+ typedef unsigned long long IMG_UINT64, *IMG_PUINT64; -+ typedef long long IMG_INT64, *IMG_PINT64; -+#endif - #else - - #error("define an OS") -diff -Nurd git/drivers/gpu/pvr/include4/pdumpdefs.h git/drivers/gpu/pvr/include4/pdumpdefs.h ---- git/drivers/gpu/pvr/include4/pdumpdefs.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/pdumpdefs.h 2008-12-18 15:47:29.000000000 +0100 -@@ -73,6 +73,7 @@ - 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 - } PDUMP_MEM_FORMAT; -diff -Nurd git/drivers/gpu/pvr/include4/pvrmodule.h git/drivers/gpu/pvr/include4/pvrmodule.h ---- git/drivers/gpu/pvr/include4/pvrmodule.h 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/pvrmodule.h 2008-12-18 15:47:29.000000000 +0100 -@@ -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 _PVRMODULE_H_ -+#define _PVRMODULE_H_ -+MODULE_AUTHOR("Imagination Technologies Ltd. <gpl-support@imgtec.com>"); -+MODULE_LICENSE("GPL"); -+#endif -diff -Nurd git/drivers/gpu/pvr/include4/pvrversion.h git/drivers/gpu/pvr/include4/pvrversion.h ---- git/drivers/gpu/pvr/include4/pvrversion.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/pvrversion.h 2008-12-18 15:47:29.000000000 +0100 -@@ -28,10 +28,10 @@ - #define _PVRVERSION_H_ - - #define PVRVERSION_MAJ 1 --#define PVRVERSION_MIN 1 --#define PVRVERSION_BRANCH 11 --#define PVRVERSION_BUILD 970 --#define PVRVERSION_STRING "1.1.11.970" -+#define PVRVERSION_MIN 2 -+#define PVRVERSION_BRANCH 12 -+#define PVRVERSION_BUILD 838 -+#define PVRVERSION_STRING "1.2.12.838" - - #endif - -diff -Nurd git/drivers/gpu/pvr/include4/servicesext.h git/drivers/gpu/pvr/include4/servicesext.h ---- git/drivers/gpu/pvr/include4/servicesext.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/servicesext.h 2008-12-18 15:47:29.000000000 +0100 -@@ -150,6 +150,8 @@ - PVRSRV_PIXEL_FORMAT_V8U8, - PVRSRV_PIXEL_FORMAT_V16U16, - PVRSRV_PIXEL_FORMAT_QWVU8888, -+ PVRSRV_PIXEL_FORMAT_XLVU8888, -+ PVRSRV_PIXEL_FORMAT_QWVU16, - PVRSRV_PIXEL_FORMAT_D16, - PVRSRV_PIXEL_FORMAT_D24S8, - PVRSRV_PIXEL_FORMAT_D24X8, -@@ -159,7 +161,9 @@ - PVRSRV_PIXEL_FORMAT_YUY2, - PVRSRV_PIXEL_FORMAT_DXT23, - PVRSRV_PIXEL_FORMAT_DXT45, -- PVRSRV_PIXEL_FORMAT_G32R32F, -+ PVRSRV_PIXEL_FORMAT_G32R32F, -+ PVRSRV_PIXEL_FORMAT_NV11, -+ PVRSRV_PIXEL_FORMAT_NV12, - - PVRSRV_PIXEL_FORMAT_FORCE_I32 = 0x7fffffff, - } PVRSRV_PIXEL_FORMAT; -diff -Nurd git/drivers/gpu/pvr/include4/services.h git/drivers/gpu/pvr/include4/services.h ---- git/drivers/gpu/pvr/include4/services.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/services.h 2008-12-18 15:47:29.000000000 +0100 -@@ -36,16 +36,14 @@ - #include "pdumpdefs.h" - - --#if defined(SERVICES4) - #define IMG_CONST const --#else --#define IMG_CONST --#endif - - #define PVRSRV_MAX_CMD_SIZE 1024 - - #define PVRSRV_MAX_DEVICES 16 - -+#define EVENTOBJNAME_MAXLENGTH (50) -+ - #define PVRSRV_MEM_READ (1<<0) - #define PVRSRV_MEM_WRITE (1<<1) - #define PVRSRV_MEM_CACHE_CONSISTENT (1<<2) -@@ -90,6 +88,7 @@ - #define PVRSRV_MISC_INFO_TIMER_PRESENT (1<<0) - #define PVRSRV_MISC_INFO_CLOCKGATE_PRESENT (1<<1) - #define PVRSRV_MISC_INFO_MEMSTATS_PRESENT (1<<2) -+#define PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT (1<<3) - - #define PVRSRV_PDUMP_MAX_FILENAME_SIZE 20 - #define PVRSRV_PDUMP_MAX_COMMENT_SIZE 200 -@@ -133,7 +132,8 @@ - IMG_OPENGLES2 = 0x00000003, - IMG_D3DM = 0x00000004, - IMG_SRV_UM = 0x00000005, -- IMG_OPENVG = 0x00000006 -+ IMG_OPENVG = 0x00000006, -+ IMG_SRVCLIENT = 0x00000007, - - } IMG_MODULE_ID; - -@@ -202,10 +202,8 @@ - - IMG_PVOID pvLinAddr; - --#if defined(SERVICES4) - - IMG_PVOID pvLinAddrKM; --#endif - - - IMG_DEV_VIRTADDR sDevVAddr; -@@ -294,6 +292,14 @@ - - } PVRSRV_DEVICE_IDENTIFIER; - -+typedef struct _PVRSRV_EVENTOBJECT_ -+{ -+ -+ IMG_CHAR szName[EVENTOBJNAME_MAXLENGTH]; -+ -+ IMG_HANDLE hOSEventKM; -+ -+} PVRSRV_EVENTOBJECT; - - typedef struct _PVRSRV_MISC_INFO_ - { -@@ -313,9 +319,14 @@ - IMG_UINT32 ui32MemoryStrLen; - - -+ PVRSRV_EVENTOBJECT sGlobalEventObject; -+ IMG_HANDLE hOSGlobalEvent; -+ -+ - - } PVRSRV_MISC_INFO; - -+ - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVConnect(PVRSRV_CONNECTION *psConnection); - -@@ -335,7 +346,7 @@ - PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfo (IMG_CONST PVRSRV_CONNECTION *psConnection, PVRSRV_MISC_INFO *psMiscInfo); - - IMG_IMPORT --PVRSRV_ERROR IMG_CALLCONV PVRSRVReleaseMiscInfo (PVRSRV_MISC_INFO *psMiscInfo); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVReleaseMiscInfo (IMG_CONST PVRSRV_CONNECTION *psConnection, PVRSRV_MISC_INFO *psMiscInfo); - - #if 1 - IMG_IMPORT -@@ -348,7 +359,9 @@ - #endif - - IMG_IMPORT --PVRSRV_ERROR PollForValue (volatile IMG_UINT32 *pui32LinMemAddr, -+PVRSRV_ERROR PollForValue ( PVRSRV_CONNECTION *psConnection, -+ IMG_HANDLE hOSEvent, -+ volatile IMG_UINT32 *pui32LinMemAddr, - IMG_UINT32 ui32Value, - IMG_UINT32 ui32Mask, - IMG_UINT32 ui32Waitus, -@@ -631,21 +644,18 @@ - IMG_UINT32 ui32RegValue, - IMG_UINT32 ui32Flags); - --#ifdef SERVICES4 - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpRegPolWithFlags(IMG_CONST PVRSRV_CONNECTION *psConnection, - IMG_UINT32 ui32RegAddr, - IMG_UINT32 ui32RegValue, - IMG_UINT32 ui32Mask, - IMG_UINT32 ui32Flags); --#endif - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpRegPol(IMG_CONST PVRSRV_CONNECTION *psConnection, - IMG_UINT32 ui32RegAddr, - IMG_UINT32 ui32RegValue, - IMG_UINT32 ui32Mask); - --#ifdef SERVICES4 - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpPDReg(IMG_CONST PVRSRV_CONNECTION *psConnection, - IMG_UINT32 ui32RegAddr, -@@ -655,7 +665,6 @@ - PVRSRV_CLIENT_MEM_INFO *psMemInfo, - IMG_UINT32 ui32Offset, - IMG_DEV_PHYADDR sPDDevPAddr); --#endif - - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpMemPages(IMG_CONST PVRSRV_CONNECTION *psConnection, -@@ -676,7 +685,6 @@ - IMG_CONST IMG_CHAR *pszComment, - IMG_BOOL bContinuous); - --#if defined(SERVICES4) - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpCommentf(IMG_CONST PVRSRV_CONNECTION *psConnection, - IMG_BOOL bContinuous, -@@ -686,7 +694,6 @@ - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpCommentWithFlagsf(IMG_CONST PVRSRV_CONNECTION *psConnection, - IMG_UINT32 ui32Flags, - IMG_CONST IMG_CHAR *pszFormat, ...); --#endif - - IMG_IMPORT - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpDriverInfo(IMG_CONST PVRSRV_CONNECTION *psConnection, -@@ -718,7 +725,7 @@ - IMG_UINT32 ui32Size, - IMG_UINT32 ui32PDumpFlags); - --#ifdef SERVICES4 -+ - IMG_IMPORT - IMG_BOOL IMG_CALLCONV PVRSRVPDumpIsCapturingTest(IMG_CONST PVRSRV_CONNECTION *psConnection); - -@@ -726,7 +733,6 @@ - PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpCycleCountRegRead(IMG_CONST PVRSRV_CONNECTION *psConnection, - IMG_UINT32 ui32RegOffset, - IMG_BOOL bLastFrame); --#endif - - IMG_IMPORT IMG_HANDLE PVRSRVLoadLibrary(IMG_CHAR *pszLibraryName); - IMG_IMPORT PVRSRV_ERROR PVRSRVUnloadLibrary(IMG_HANDLE hExtDrv); -@@ -777,9 +783,9 @@ - IMG_PVOID PVRSRVReallocUserModeMemTracking(IMG_VOID *pvMem, IMG_UINT32 ui32NewSize, IMG_CHAR *pszFileName, IMG_UINT32 ui32LineNumber); - #endif - --PVRSRV_ERROR PVRSRVEventObjectWait(PVRSRV_CONNECTION *psConnection, -- IMG_HANDLE hOSEvent, -- IMG_UINT32 ui32MSTimeout); -+IMG_IMPORT -+PVRSRV_ERROR PVRSRVEventObjectWait(PVRSRV_CONNECTION * psConnection, -+ IMG_HANDLE hOSEvent); - - #define TIME_NOT_PASSED_UINT32(a,b,c) ((a - b) < c) - -diff -Nurd git/drivers/gpu/pvr/include4/sgxapi_km.h git/drivers/gpu/pvr/include4/sgxapi_km.h ---- git/drivers/gpu/pvr/include4/sgxapi_km.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/include4/sgxapi_km.h 2008-12-18 15:47:29.000000000 +0100 -@@ -32,6 +32,7 @@ - #endif - - #include "sgxdefs.h" -+ - #if defined(__linux__) && !defined(USE_CODE) - #if defined(__KERNEL__) - #include <asm/unistd.h> -@@ -64,6 +65,8 @@ - #define SGX_MAX_TA_STATUS_VALS 32 - #define SGX_MAX_3D_STATUS_VALS 2 - -+#define SGX_MAX_SRC_SYNCS 4 -+ - #define PFLAGS_POWERDOWN 0x00000001 - #define PFLAGS_POWERUP 0x00000002 - -@@ -75,11 +78,60 @@ - IMG_SYS_PHYADDR sPhysBase; - }SGX_SLAVE_PORT; - -+#ifdef SUPPORT_SGX_HWPERF -+ -+#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 -+ -+ -+typedef struct _PVRSRV_SGX_HWPERF_CBDATA_ -+{ -+ IMG_UINT32 ui32FrameNo; -+ IMG_UINT32 ui32Type; -+ IMG_UINT32 ui32StartTimeWraps; -+ IMG_UINT32 ui32StartTime; -+ IMG_UINT32 ui32EndTimeWraps; -+ IMG_UINT32 ui32EndTime; -+ IMG_UINT32 ui32ClockSpeed; -+ IMG_UINT32 ui32TimeMax; -+} PVRSRV_SGX_HWPERF_CBDATA; -+ -+typedef struct _PVRSRV_SGX_HWPERF_CB_ -+{ -+ IMG_UINT32 ui32Woff; -+ IMG_UINT32 ui32Roff; -+ PVRSRV_SGX_HWPERF_CBDATA psHWPerfCBData[PVRSRV_SGX_HWPERF_CBSIZE]; -+} PVRSRV_SGX_HWPERF_CB; -+ -+ -+typedef struct _SGX_MISC_INFO_HWPERF_RETRIEVE_CB -+{ -+ PVRSRV_SGX_HWPERF_CBDATA* psHWPerfData; -+ IMG_UINT32 ui32ArraySize; -+ IMG_UINT32 ui32DataCount; -+ IMG_UINT32 ui32Time; -+} SGX_MISC_INFO_HWPERF_RETRIEVE_CB; -+#endif -+ -+ - typedef enum _SGX_MISC_INFO_REQUEST_ - { -+ SGX_MISC_INFO_REQUEST_CLOCKSPEED = 0, -+#ifdef SUPPORT_SGX_HWPERF -+ SGX_MISC_INFO_REQUEST_HWPERF_CB_ON, -+ SGX_MISC_INFO_REQUEST_HWPERF_CB_OFF, -+ SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB, -+#endif - SGX_MISC_INFO_REQUEST_FORCE_I16 = 0x7fff - } SGX_MISC_INFO_REQUEST; - -+ - typedef struct _SGX_MISC_INFO_ - { - SGX_MISC_INFO_REQUEST eRequest; -@@ -87,6 +139,10 @@ - union - { - IMG_UINT32 reserved; -+ IMG_UINT32 ui32SGXClockSpeed; -+#ifdef SUPPORT_SGX_HWPERF -+ SGX_MISC_INFO_HWPERF_RETRIEVE_CB sRetrieveCB; -+#endif - } uData; - } SGX_MISC_INFO; - -@@ -162,6 +218,15 @@ - } PVR3DIF4_KICKTA_PDUMP, *PPVR3DIF4_KICKTA_PDUMP; - #endif - -+#if defined(TRANSFER_QUEUE) -+#if defined(SGX_FEATURE_2D_HARDWARE) -+#define SGX_MAX_2D_BLIT_CMD_SIZE 26 -+#define SGX_MAX_2D_SRC_SYNC_OPS 3 -+#endif -+#define SGX_MAX_TRANSFER_STATUS_VALS 64 -+#define SGX_MAX_TRANSFER_SYNC_OPS 5 -+#endif -+ - #if defined (__cplusplus) - } - #endif -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.c git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.c ---- git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.c 2008-12-18 15:47:29.000000000 +0100 -@@ -197,11 +197,27 @@ - return PVRSRV_ERROR_OUT_OF_MEMORY; - } - -+ -+ -+ psDevInfo->sBufferInfo.pixelformat = BC_EXAMPLE_PIXELFORMAT; -+ psDevInfo->sBufferInfo.ui32Width = BC_EXAMPLE_WIDTH; -+ psDevInfo->sBufferInfo.ui32Height = BC_EXAMPLE_HEIGHT; -+ psDevInfo->sBufferInfo.ui32ByteStride = BC_EXAMPLE_STRIDE; -+ psDevInfo->sBufferInfo.ui32BufferDeviceID = BC_EXAMPLE_DEVICEID; -+ psDevInfo->sBufferInfo.ui32Flags = PVRSRV_BC_FLAGS_YUVCSC_FULL_RANGE | PVRSRV_BC_FLAGS_YUVCSC_BT601; -+ - for(i=0; i < BC_EXAMPLE_NUM_BUFFERS; i++) - { -+ IMG_UINT32 ui32Size = BC_EXAMPLE_HEIGHT * BC_EXAMPLE_STRIDE; -+ -+ if(psDevInfo->sBufferInfo.pixelformat == PVRSRV_PIXEL_FORMAT_YUV420) -+ { -+ -+ ui32Size += ((BC_EXAMPLE_STRIDE >> 1) * (BC_EXAMPLE_HEIGHT >> 1) << 1); -+ } - - -- if (AllocContigMemory(BC_EXAMPLE_HEIGHT * BC_EXAMPLE_STRIDE, -+ if (AllocContigMemory(ui32Size, - &psDevInfo->psSystemBuffer[i].hMemHandle, - &psDevInfo->psSystemBuffer[i].sCPUVAddr, - &sSystemBufferCPUPAddr) != PVRSRV_OK) -@@ -211,12 +227,14 @@ - - psDevInfo->ui32NumBuffers++; - -- psDevInfo->psSystemBuffer[i].ui32Size = BC_EXAMPLE_HEIGHT * BC_EXAMPLE_STRIDE; -+ psDevInfo->psSystemBuffer[i].ui32Size = ui32Size; - psDevInfo->psSystemBuffer[i].sSysAddr = CpuPAddrToSysPAddr(sSystemBufferCPUPAddr); - psDevInfo->psSystemBuffer[i].sPageAlignSysAddr.uiAddr = (psDevInfo->psSystemBuffer[i].sSysAddr.uiAddr & 0xFFFFF000); - psDevInfo->psSystemBuffer[i].psSyncData = IMG_NULL; - } - -+ psDevInfo->sBufferInfo.ui32BufferCount = psDevInfo->ui32NumBuffers; -+ - - - psDevInfo->sBCJTable.ui32TableSize = sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE); -@@ -234,16 +252,6 @@ - { - return PVRSRV_ERROR_DEVICE_REGISTER_FAILED; - } -- -- -- -- psDevInfo->sBufferInfo.pixelformat = BC_EXAMPLE_PIXELFORMAT; -- psDevInfo->sBufferInfo.ui32Width = BC_EXAMPLE_WIDTH; -- psDevInfo->sBufferInfo.ui32Height = BC_EXAMPLE_HEIGHT; -- psDevInfo->sBufferInfo.ui32ByteStride = BC_EXAMPLE_STRIDE; -- psDevInfo->sBufferInfo.ui32BufferDeviceID = BC_EXAMPLE_DEVICEID; -- psDevInfo->sBufferInfo.ui32Flags = PVRSRV_BC_FLAGS_YUVCSC_FULL_RANGE | PVRSRV_BC_FLAGS_YUVCSC_BT601; -- psDevInfo->sBufferInfo.ui32BufferCount = psDevInfo->ui32NumBuffers; - } - - -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.h git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.h ---- git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example.h 2008-12-18 15:47:29.000000000 +0100 -@@ -39,11 +39,32 @@ - - #define BC_EXAMPLE_NUM_BUFFERS 3 - --#define BC_EXAMPLE_WIDTH (160) -+#define YUV420 1 -+#ifdef YUV420 -+ -+#define BC_EXAMPLE_WIDTH (320) - #define BC_EXAMPLE_HEIGHT (160) --#define BC_EXAMPLE_STRIDE (160*2) -+#define BC_EXAMPLE_STRIDE (320) -+#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_YUV420) -+ -+#else -+#ifdef YUV422 -+ -+#define BC_EXAMPLE_WIDTH (320) -+#define BC_EXAMPLE_HEIGHT (160) -+#define BC_EXAMPLE_STRIDE (320*2) - #define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_YVYU) - -+#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) -+ -+#endif -+#endif -+ - #define BC_EXAMPLE_DEVICEID 0 - - -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c ---- git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c 2008-12-18 15:47:29.000000000 +0100 -@@ -38,11 +38,10 @@ - - #include "bufferclass_example.h" - #include "bufferclass_example_linux.h" -+#include "pvrmodule.h" - - #define DEVNAME "bc_example" - --MODULE_AUTHOR("Imagination Technologies Ltd. <gpl-support@imgtec.com>"); --MODULE_LICENSE("GPL"); - MODULE_SUPPORTED_DEVICE(DEVNAME); - - int BC_Example_Bridge(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); -@@ -259,22 +258,11 @@ - { - return PVRSRV_ERROR_OUT_OF_MEMORY; - } -- else -- { -- IMG_VOID *pvPage; -- IMG_VOID *pvEnd = pvLinAddr + ui32Size; -- -- for(pvPage = pvLinAddr; pvPage < pvEnd; pvPage += PAGE_SIZE) -- { -- SetPageReserved(virt_to_page(pvPage)); -- } - -- pPhysAddr->uiAddr = dma; -- *pLinAddr = pvLinAddr; -+ pPhysAddr->uiAddr = dma; -+ *pLinAddr = pvLinAddr; - -- return PVRSRV_OK; -- } -- return PVRSRV_ERROR_OUT_OF_MEMORY; -+ return PVRSRV_OK; - #endif - } - -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_private.c git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_private.c ---- git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_private.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/bufferclass_example_private.c 2008-12-18 15:47:29.000000000 +0100 -@@ -26,6 +26,43 @@ - - #include "bufferclass_example.h" - -+void FillYUV420Image(void *pvDest, int width, int height, int bytestride) -+{ -+ static int iPhase = 0; -+ int i, j; -+ unsigned char u,v,y; -+ unsigned char *pui8y = (unsigned char *)pvDest; -+ unsigned short *pui16uv; -+ unsigned int count = 0; -+ -+ for(j=0;j<height;j++) -+ { -+ for(i=0;i<width;i++) -+ { -+ y = (((i+iPhase)>>6)%(2)==0)? 0x7f:0x00; -+ -+ pui8y[count++] = y; -+ } -+ } -+ -+ pui16uv = (unsigned short *)((unsigned char *)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); -+ -+ -+ pui16uv[count++] = (v << 8) | u; -+ -+ } -+ } -+ -+ iPhase++; -+} - - void FillYUV422Image(void *pvDest, int width, int height, int bytestride) - { -@@ -37,12 +74,12 @@ - - for(y=0;y<height;y++) - { -- for(x=0;x<width >> 1;x++) -+ for(x=0;x<width;x+=2) - { -- u = (y<(height/2))? ((x<(width/4))? 0xFF:0x33) : ((x<(width/4))? 0x33:0xAA); -- v = (y<(height/2))? ((x<(width/4))? 0xAA:0x0) : ((x<(width/4))? 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)>>4)%(2)==0)? 0x7f:0x00; -+ y0 = y1 = (((x+iPhase)>>6)%(2)==0)? 0x7f:0x00; - - - pui32yuv[count++] = (y1 << 24) | (v << 16) | (y0 << 8) | u; -@@ -115,19 +152,36 @@ - - psSyncData = psBuffer->psSyncData; - -- - if(psSyncData) - { -+ -+ if(psSyncData->ui32ReadOpsPending != psSyncData->ui32ReadOpsComplete) -+ { -+ return -1; -+ } -+ -+ - psSyncData->ui32WriteOpsPending++; - } - -- if(psBufferInfo->pixelformat == PVRSRV_PIXEL_FORMAT_RGB565) -- { -- FillRGB565Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH, BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE); -- } -- else -+ switch(psBufferInfo->pixelformat) - { -- FillYUV422Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH, BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE); -+ case PVRSRV_PIXEL_FORMAT_RGB565: -+ default: -+ { -+ FillRGB565Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH, BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE); -+ break; -+ } -+ case PVRSRV_PIXEL_FORMAT_YVYU: -+ { -+ FillYUV422Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH, BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE); -+ break; -+ } -+ case PVRSRV_PIXEL_FORMAT_YUV420: -+ { -+ FillYUV420Image(psBuffer->sCPUVAddr, BC_EXAMPLE_WIDTH, BC_EXAMPLE_HEIGHT, BC_EXAMPLE_STRIDE); -+ break; -+ } - } - - -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/kbuild/Makefile git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/kbuild/Makefile ---- git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/kbuild/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/bufferclass_example/kbuild/Makefile 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,40 @@ -+# -+# 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 -+# -+# -+# -+ -+MODULE = bc_example -+ -+INCLUDES = -I$(EURASIAROOT)/include4 \ -+ -I$(EURASIAROOT)/services4/include \ -+ -I$(EURASIAROOT)/services4/system/$(PVR_SYSTEM) \ -+ -I$(EURASIAROOT)/services4/system/include \ -+ -+SOURCES = ../bufferclass_example.c \ -+ ../bufferclass_example_linux.c \ -+ ../bufferclass_example_private.c -+ -+ -+ -+ -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/kbuild/Makefile git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/kbuild/Makefile ---- git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/kbuild/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/kbuild/Makefile 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,39 @@ -+# -+# 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 -+# -+# -+# -+ -+MODULE = omaplfb -+ -+INCLUDES = -I$(EURASIAROOT)/include4 \ -+ -I$(EURASIAROOT)/services4/include \ -+ -I$(EURASIAROOT)/services4/system/$(PVR_SYSTEM) \ -+ -I$(EURASIAROOT)/services4/system/include \ -+ -+SOURCES = ../omaplfb_displayclass.c \ -+ ../omaplfb_linux.c -+ -+ -+ -+ -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_displayclass.c git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_displayclass.c ---- git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_displayclass.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_displayclass.c 2008-12-18 15:47:29.000000000 +0100 -@@ -41,6 +41,7 @@ - #define DISPLAY_DEVICE_NAME "PowerVR OMAP Linux Display Driver" - - #define DRIVER_PREFIX "omaplfb" -+//extern int omap2_disp_get_output_dev(int); - - static IMG_VOID *gpvAnchor; - -@@ -57,8 +58,6 @@ - PVR_POWER_STATE eCurrentPowerState); - #endif - --extern void omap_dispc_set_plane_base(int plane, IMG_UINT32 phys_addr); -- - static PFN_DC_GET_PVRJTABLE pfnGetPVRJTable = IMG_NULL; - - static OMAPLFB_DEVINFO * GetAnchorPtr(IMG_VOID) -@@ -124,28 +123,53 @@ - static PVRSRV_ERROR Flip(OMAPLFB_SWAPCHAIN *psSwapChain, - IMG_UINT32 aPhyAddr) - { -- if (1 /* omap2_disp_get_output_dev(OMAP2_GRAPHICS) == OMAP2_OUTPUT_LCD */) -+ IMG_UINT32 control; -+ OMAPLFB_DEVINFO *psDevInfo; -+ -+ psDevInfo = GetAnchorPtr(); -+ -+ if (1) //omap2_disp_get_output_dev(OMAP2_GRAPHICS) == OMAP2_OUTPUT_LCD) - { -- omap_dispc_set_plane_base(0, aPhyAddr); -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_GFX_BA0, aPhyAddr); -+ -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_GFX_BA1, aPhyAddr); -+ -+ control = OMAPLFBVSyncReadReg(psSwapChain, OMAPLCD_CONTROL); -+ control |= OMAP_CONTROL_GOLCD; -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_CONTROL, control); -+ - return PVRSRV_OK; - } - else -- if (0 /*omap2_disp_get_output_dev(OMAP2_GRAPHICS) == OMAP2_OUTPUT_TV*/) -+ if (0) //omap2_disp_get_output_dev(OMAP2_GRAPHICS) == OMAP2_OUTPUT_TV) - { -- omap_dispc_set_plane_base(0, aPhyAddr); -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_GFX_BA0, aPhyAddr); -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_GFX_BA1, aPhyAddr + psDevInfo->sFBInfo.ui32ByteStride); -+ -+ control = OMAPLFBVSyncReadReg(psSwapChain, OMAPLCD_CONTROL); -+ control |= OMAP_CONTROL_GODIGITAL; -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_CONTROL, control); -+ - return PVRSRV_OK; - } -- -+ - return PVRSRV_ERROR_INVALID_PARAMS; - } - - static IMG_VOID EnableVSyncInterrupt(OMAPLFB_SWAPCHAIN *psSwapChain) - { -- -+ -+ IMG_UINT32 ui32InterruptEnable = OMAPLFBVSyncReadReg(psSwapChain, OMAPLCD_IRQENABLE); -+ ui32InterruptEnable |= OMAPLCD_INTMASK_VSYNC; -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_IRQENABLE, ui32InterruptEnable ); - } - - static IMG_VOID DisableVSyncInterrupt(OMAPLFB_SWAPCHAIN *psSwapChain) - { -+ -+ IMG_UINT32 ui32InterruptEnable = OMAPLFBVSyncReadReg(psSwapChain, OMAPLCD_IRQENABLE); -+ ui32InterruptEnable &= ~(OMAPLCD_INTMASK_VSYNC); -+ OMAPLFBVSyncWriteReg(psSwapChain, OMAPLCD_IRQENABLE, ui32InterruptEnable); - } - - static PVRSRV_ERROR OpenDCDevice(IMG_UINT32 ui32DeviceID, -@@ -169,6 +193,7 @@ - #endif - ); - -+ - memset(&psDevInfo->sLINNotifBlock, 0, sizeof(psDevInfo->sLINNotifBlock)); - - psDevInfo->sLINNotifBlock.notifier_call = FrameBufferEvents; -@@ -363,6 +388,7 @@ - PVR_UNREFERENCED_PARAMETER(ui32OEMFlags); - PVR_UNREFERENCED_PARAMETER(pui32SwapChainID); - -+ - if(!hDevice - || !psDstSurfAttrib - || !psSrcSurfAttrib -@@ -399,6 +425,7 @@ - || psDstSurfAttrib->sDims.ui32Width != psDevInfo->sDisplayDim.ui32Width - || psDstSurfAttrib->sDims.ui32Height != psDevInfo->sDisplayDim.ui32Height) - { -+ - return PVRSRV_ERROR_INVALID_PARAMS; - } - -@@ -407,6 +434,7 @@ - || psDstSurfAttrib->sDims.ui32Width != psSrcSurfAttrib->sDims.ui32Width - || psDstSurfAttrib->sDims.ui32Height != psSrcSurfAttrib->sDims.ui32Height) - { -+ - return PVRSRV_ERROR_INVALID_PARAMS; - } - -@@ -467,12 +495,21 @@ - } - - -+ psSwapChain->pvRegs = ioremap(psDevInfo->psLINFBInfo->fix.mmio_start, psDevInfo->psLINFBInfo->fix.mmio_len); -+ -+ if (psSwapChain->pvRegs == IMG_NULL) -+ { -+ printk(KERN_WARNING DRIVER_PREFIX ": Couldn't map registers needed for flipping\n"); -+ goto ErrorFreeVSyncItems; -+ } -+ -+ - unblank_display(psDevInfo); - - if (OMAPLFBInstallVSyncISR(psSwapChain) != PVRSRV_OK) - { - printk(KERN_WARNING DRIVER_PREFIX ": ISR handler failed to register\n"); -- goto ErrorFreeVSyncItems; -+ goto ErrorUnmapRegisters; - } - - EnableVSyncInterrupt(psSwapChain); -@@ -485,6 +522,8 @@ - - return PVRSRV_OK; - -+ErrorUnmapRegisters: -+ iounmap(psSwapChain->pvRegs); - ErrorFreeVSyncItems: - OMAPLFBFreeKernelMem(psVSyncFlips); - ErrorFreeBuffers: -@@ -590,6 +629,9 @@ - } - - -+ iounmap(psSwapChain->pvRegs); -+ -+ - OMAPLFBFreeKernelMem(psSwapChain->psVSyncFlips); - OMAPLFBFreeKernelMem(psSwapChain->psBuffer); - OMAPLFBFreeKernelMem(psSwapChain); -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb.h git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb.h ---- git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb.h 2008-12-18 15:47:29.000000000 +0100 -@@ -121,6 +121,9 @@ - IMG_UINT32 ui32RemoveIndex; - - -+ IMG_VOID *pvRegs; -+ -+ - PVRSRV_DC_DISP2SRV_KMJTABLE *psPVRJTable; - } OMAPLFB_SWAPCHAIN; - -@@ -194,8 +197,8 @@ - - IMG_VOID *OMAPLFBAllocKernelMem(IMG_UINT32 ui32Size); - IMG_VOID OMAPLFBFreeKernelMem(IMG_VOID *pvMem); --IMG_VOID OMAPLFBWriteReg(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 ui32Offset, IMG_UINT32 ui32Value); --IMG_UINT32 OMAPLFBReadReg(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 ui32Offset); -+IMG_VOID OMAPLFBVSyncWriteReg(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 ui32Offset, IMG_UINT32 ui32Value); -+IMG_UINT32 OMAPLFBVSyncReadReg(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 ui32Offset); - PVRSRV_ERROR OMAPLFBGetLibFuncAddr(IMG_CHAR *szFunctionName, PFN_DC_GET_PVRJTABLE *ppfnFuncTable); - PVRSRV_ERROR OMAPLFBInstallVSyncISR (OMAPLFB_SWAPCHAIN *psSwapChain); - PVRSRV_ERROR OMAPLFBUninstallVSyncISR(OMAPLFB_SWAPCHAIN *psSwapChain); -diff -Nurd git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_linux.c git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_linux.c ---- git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_linux.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_linux.c 2008-12-18 15:47:29.000000000 +0100 -@@ -101,28 +100,57 @@ - } - - static void --OMAPLFBVSyncISR(void *arg) -+OMAPLFBVSyncISR(void *arg, struct pt_regs *regs) - { -- (void) OMAPLFBVSyncIHandler((OMAPLFB_SWAPCHAIN *)arg); -+ OMAPLFB_SWAPCHAIN *psSwapChain= (OMAPLFB_SWAPCHAIN *)arg; -+ -+ (void) OMAPLFBVSyncIHandler(psSwapChain); - } - --#define DISPC_IRQ_VSYNC 0x0002 -- - PVRSRV_ERROR OMAPLFBInstallVSyncISR(OMAPLFB_SWAPCHAIN *psSwapChain) - { - -- if (omap_dispc_request_irq(DISPC_IRQ_VSYNC, OMAPLFBVSyncISR, psSwapChain) != 0) -- return PVRSRV_ERROR_OUT_OF_MEMORY; /* not worth a proper mapping */ -- -+ if (1) //omap2_disp_get_output_dev(OMAP2_GRAPHICS) == OMAP2_OUTPUT_LCD) -+ { -+ if (omap_dispc_request_irq(DISPC_IRQ_VSYNC, OMAPLFBVSyncISR, -+ psSwapChain) != 0) -+ { -+ printk("request OMAPLCD IRQ failed"); -+ return PVRSRV_ERROR_INIT_FAILURE; -+ } -+ } -+ else -+ if (0) //omap2_disp_get_output_dev(OMAP2_GRAPHICS) == OMAP2_OUTPUT_TV) -+ { -+ if (omap_dispc_request_irq(DISPC_IRQSTATUS_EVSYNC_EVEN|DISPC_IRQSTATUS_EVSYNC_ODD, OMAPLFBVSyncISR, psSwapChain) != 0) -+ { -+ printk("request OMAPLCD IRQ failed"); -+ return PVRSRV_ERROR_INIT_FAILURE; -+ } -+ } -+ - return PVRSRV_OK; - } - - - PVRSRV_ERROR OMAPLFBUninstallVSyncISR (OMAPLFB_SWAPCHAIN *psSwapChain) - { -- omap_dispc_free_irq(DISPC_IRQ_VSYNC, OMAPLFBVSyncISR, psSwapChain); -+ omap_dispc_free_irq(DISPC_IRQ_VSYNC, OMAPLFBVSyncISR, psSwapChain); -+ -+ return PVRSRV_OK; -+} - -- return PVRSRV_OK; -+IMG_VOID OMAPLFBVSyncWriteReg(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 ui32Offset, IMG_UINT32 ui32Value) -+{ -+ IMG_VOID *pvRegAddr = (IMG_VOID *)((IMG_UINT8 *)psSwapChain->pvRegs + ui32Offset); -+ -+ -+ writel(ui32Value, pvRegAddr); -+} -+ -+IMG_UINT32 OMAPLFBVSyncReadReg(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 ui32Offset) -+{ -+ return readl((IMG_UINT8 *)psSwapChain->pvRegs + ui32Offset); - } - - module_init(OMAPLFB_Init); -diff -Nurd git/drivers/gpu/pvr/services4/include/pvr_bridge.h git/drivers/gpu/pvr/services4/include/pvr_bridge.h ---- git/drivers/gpu/pvr/services4/include/pvr_bridge.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/include/pvr_bridge.h 2008-12-18 15:47:29.000000000 +0100 -@@ -202,14 +202,14 @@ - - #define PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST (PVRSRV_BRIDGE_INITSRV_CMD_LAST+1) - #define PVRSRV_BRIDGE_EVENT_OBJECT_WAIT PVRSRV_IOWR(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+0) --#define PVRSRV_BRIDGE_EVENT_OBJECT_CONNECT PVRSRV_IOWR(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+1) --#define PVRSRV_BRIDGE_EVENT_OBJECT_DISCONNECT PVRSRV_IOWR(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+2) -+#define PVRSRV_BRIDGE_EVENT_OBJECT_OPEN PVRSRV_IOWR(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+1) -+#define PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE PVRSRV_IOWR(PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+2) - #define PVRSRV_BRIDGE_EVENT_OBJECT_CMD_LAST (PVRSRV_BRIDGE_EVENT_OBJECT_CMD_FIRST+2) - - #define PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD (PVRSRV_BRIDGE_EVENT_OBJECT_CMD_LAST+1) - - --#define PVRSRV_KERNAL_MODE_CLIENT 1 -+#define PVRSRV_KERNEL_MODE_CLIENT 1 - - typedef struct PVRSRV_BRIDGE_RETURN_TAG - { -@@ -716,7 +716,7 @@ - typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR_TAG - { - IMG_UINT32 ui32BridgeFlags; -- IMG_HANDLE *hKernelMemInfo; -+ IMG_HANDLE hKernelMemInfo; - IMG_UINT32 ui32Offset; - IMG_DEV_PHYADDR sPDDevPAddr; - }PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR; -@@ -1302,9 +1302,25 @@ - { - IMG_UINT32 ui32BridgeFlags; - IMG_HANDLE hOSEventKM; -- IMG_UINT32 ui32MSTimeout; - } PVRSRV_BRIDGE_IN_EVENT_OBJECT_WAIT; - -+typedef struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN_TAG -+{ -+ PVRSRV_EVENTOBJECT sEventObject; -+} PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN; -+ -+typedef struct PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN_TAG -+{ -+ IMG_HANDLE hOSEvent; -+ PVRSRV_ERROR eError; -+} PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN; -+ -+typedef struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE_TAG -+{ -+ PVRSRV_EVENTOBJECT sEventObject; -+ IMG_HANDLE hOSEventKM; -+} PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE; -+ - #if defined (__cplusplus) - } - #endif -diff -Nurd git/drivers/gpu/pvr/services4/include/servicesint.h git/drivers/gpu/pvr/services4/include/servicesint.h ---- git/drivers/gpu/pvr/services4/include/servicesint.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/include/servicesint.h 2008-12-18 15:47:29.000000000 +0100 -@@ -38,16 +38,6 @@ - - #define DRIVERNAME_MAXLENGTH (100) - --#define EVENTOBJNAME_MAXLENGTH (50) -- -- --typedef struct _PVRSRV_EVENTOBJECT_ --{ -- -- IMG_CHAR szName[EVENTOBJNAME_MAXLENGTH]; -- -- IMG_HANDLE hOSEventKM; --} PVRSRV_EVENTOBJECT; - - - typedef struct _PVRSRV_KERNEL_MEM_INFO_ -@@ -93,6 +83,13 @@ - - } PVRSRV_KERNEL_SYNC_INFO; - -+typedef struct _PVRSRV_DEVICE_SYNC_OBJECT_ -+{ -+ IMG_UINT32 ui32ReadOpPendingVal; -+ IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr; -+ IMG_UINT32 ui32WriteOpPendingVal; -+ IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr; -+} PVRSRV_DEVICE_SYNC_OBJECT; - - typedef struct _PVRSRV_SYNC_OBJECT - { -diff -Nurd git/drivers/gpu/pvr/services4/include/sgx_bridge.h git/drivers/gpu/pvr/services4/include/sgx_bridge.h ---- git/drivers/gpu/pvr/services4/include/sgx_bridge.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/include/sgx_bridge.h 2008-12-18 15:47:29.000000000 +0100 -@@ -70,8 +70,16 @@ - #define PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+20) - #define PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+21) - #define PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+22) -+#if defined(SGX_FEATURE_2D_HARDWARE) -+#define PVRSRV_BRIDGE_SGX_SUBMIT2D PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+23) -+#define PVRSRV_BRIDGE_SGX_REGISTER_HW_2D_CONTEXT PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+24) -+#define PVRSRV_BRIDGE_SGX_UNREGISTER_HW_2D_CONTEXT PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+25) -+#endif -+#define PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT 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_HWPERF_COUNTERS PVRSRV_IOWR(PVRSRV_BRIDGE_SGX_CMD_BASE+28) - --#define PVRSRV_BRIDGE_LAST_SGX_CMD (PVRSRV_BRIDGE_SGX_CMD_BASE+22) -+#define PVRSRV_BRIDGE_LAST_SGX_CMD (PVRSRV_BRIDGE_SGX_CMD_BASE+28) - - - typedef struct PVRSRV_BRIDGE_IN_GETPHYSPAGEADDR -@@ -161,8 +169,18 @@ - { - IMG_UINT32 ui32BridgeFlags; - IMG_HANDLE hDevCookie; -- IMG_DEV_VIRTADDR sHWRenderContextDevVAddr; -+ PVRSRV_TRANSFER_SGX_KICK sKick; - }PVRSRV_BRIDGE_IN_SUBMITTRANSFER; -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+ -+typedef struct PVRSRV_BRIDGE_IN_SUBMIT2D_TAG -+{ -+ IMG_UINT32 ui32BridgeFlags; -+ IMG_HANDLE hDevCookie; -+ PVRSRV_2D_SGX_KICK sKick; -+} PVRSRV_BRIDGE_IN_SUBMIT2D; -+#endif - #endif - - -@@ -330,6 +348,33 @@ - IMG_HANDLE hHWRenderContext; - }PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT; - -+typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT_TAG -+{ -+ IMG_UINT32 ui32BridgeFlags; -+ IMG_HANDLE hDevCookie; -+ IMG_HANDLE hHWRenderContext; -+}PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT; -+ -+typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG -+{ -+ IMG_UINT32 ui32BridgeFlags; -+ IMG_HANDLE hDevCookie; -+ IMG_DEV_VIRTADDR sHWTransferContextDevVAddr; -+}PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT; -+ -+typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG -+{ -+ PVRSRV_ERROR eError; -+ IMG_HANDLE hHWTransferContext; -+}PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT; -+ -+typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT_TAG -+{ -+ IMG_UINT32 ui32BridgeFlags; -+ IMG_HANDLE hDevCookie; -+ IMG_HANDLE hHWTransferContext; -+}PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT; -+ - typedef struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET_TAG - { - IMG_UINT32 ui32BridgeFlags; -@@ -337,18 +382,54 @@ - IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr; - }PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET; - --typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT_TAG -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_2D_CONTEXT_TAG - { - IMG_UINT32 ui32BridgeFlags; - IMG_HANDLE hDevCookie; -- IMG_HANDLE hHWRenderContext; --}PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT; -+ IMG_DEV_VIRTADDR sHW2DContextDevVAddr; -+}PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_2D_CONTEXT; -+ -+typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT_TAG -+{ -+ PVRSRV_ERROR eError; -+ IMG_HANDLE hHW2DContext; -+}PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT; -+ -+typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT_TAG -+{ -+ IMG_UINT32 ui32BridgeFlags; -+ IMG_HANDLE hDevCookie; -+ IMG_HANDLE hHW2DContext; -+}PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT; - -- --#if defined(SGX_FEATURE_2D_HARDWARE) - #define SGX2D_MAX_BLT_CMD_SIZ 256 - #endif - -+ -+typedef struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_COUNTERS_TAG -+{ -+ IMG_UINT32 ui32BridgeFlags; -+ IMG_HANDLE hDevCookie; -+ IMG_UINT32 ui32PerfReg; -+ IMG_BOOL bNewPerf; -+ IMG_UINT32 ui32NewPerf; -+ IMG_UINT32 ui32NewPerfReset; -+ IMG_UINT32 ui32PerfCountersReg; -+} PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_COUNTERS; -+ -+typedef struct PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_COUNTERS_TAG -+{ -+ PVRSRV_ERROR eError; -+ IMG_UINT32 ui32OldPerf; -+ IMG_UINT32 aui32Counters[PVRSRV_SGX_HWPERF_NUM_COUNTERS]; -+ IMG_UINT32 ui32KickTACounter; -+ IMG_UINT32 ui32KickTARenderCounter; -+ IMG_UINT32 ui32CPUTime; -+ IMG_UINT32 ui32SGXTime; -+} PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_COUNTERS; -+ - #if defined (__cplusplus) - } - #endif -diff -Nurd git/drivers/gpu/pvr/services4/include/sgx_bridge_km.h git/drivers/gpu/pvr/services4/include/sgx_bridge_km.h ---- git/drivers/gpu/pvr/services4/include/sgx_bridge_km.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/include/sgx_bridge_km.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,139 +0,0 @@ --/********************************************************************** -- * -- * 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(__SGX_BRIDGE_KM_H__) --#define __SGX_BRIDGE_KM_H__ -- --#include "sgxapi_km.h" --#include "sgxinfo.h" --#include "sgxinfokm.h" --#include "sgx_bridge.h" --#include "pvr_bridge.h" --#include "perproc.h" -- --#if defined (__cplusplus) --extern "C" { --#endif -- --IMG_IMPORT --PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, -- IMG_DEV_VIRTADDR sHWRenderContextDevVAddr); -- --IMG_IMPORT --PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, -- PVR3DIF4_CCB_KICK *psCCBKick); -- --IMG_IMPORT --PVRSRV_ERROR SGXGetPhysPageAddrKM(IMG_HANDLE hDevMemHeap, -- IMG_DEV_VIRTADDR sDevVAddr, -- IMG_DEV_PHYADDR *pDevPAddr, -- IMG_CPU_PHYADDR *pCpuPAddr); -- --IMG_IMPORT --PVRSRV_ERROR IMG_CALLCONV SGXGetMMUPDAddrKM(IMG_HANDLE hDevCookie, -- IMG_HANDLE hDevMemContext, -- IMG_DEV_PHYADDR *psPDDevPAddr); -- --IMG_IMPORT --PVRSRV_ERROR SGXGetClientInfoKM(IMG_HANDLE hDevCookie, -- PVR3DIF4_CLIENT_INFO* psClientInfo); -- --IMG_IMPORT --PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, -- SGX_MISC_INFO *psMiscInfo); -- --#if defined(SGX_FEATURE_2D_HARDWARE) --IMG_IMPORT --PVRSRV_ERROR SGX2DQueueBlitKM(PVRSRV_SGXDEV_INFO *psDevInfo, -- PVRSRV_KERNEL_SYNC_INFO *psDstSync, -- IMG_UINT32 ui32NumSrcSyncs, -- PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[], -- IMG_UINT32 ui32DataByteSize, -- IMG_UINT32 *pui32BltData); -- --#if defined(SGX2D_DIRECT_BLITS) --IMG_IMPORT --PVRSRV_ERROR SGX2DDirectBlitKM(PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_UINT32 ui32DataByteSize, -- IMG_UINT32 *pui32BltData); --#endif --#endif -- --#if defined(SGX_FEATURE_2D_HARDWARE) || defined(PVR2D_ALT_2DHW) --IMG_IMPORT --PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(PVRSRV_SGXDEV_INFO *psDevInfo, -- PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, -- IMG_BOOL bWaitForComplete); --#endif -- --IMG_IMPORT --PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, -- SGX_BRIDGE_INFO_FOR_SRVINIT *psInitInfo); -- --IMG_IMPORT --PVRSRV_ERROR DevInitSGXPart2KM(PVRSRV_PER_PROCESS_DATA *psPerProc, -- IMG_HANDLE hDevHandle, -- SGX_BRIDGE_INIT_INFO *psInitInfo); -- --IMG_IMPORT PVRSRV_ERROR --SGXFindSharedPBDescKM(IMG_HANDLE hDevCookie, -- IMG_UINT32 ui32TotalPBSize, -- IMG_HANDLE *phSharedPBDesc, -- PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescKernelMemInfo, -- PVRSRV_KERNEL_MEM_INFO **ppsHWPBDescKernelMemInfo, -- PVRSRV_KERNEL_MEM_INFO **ppsBlockKernelMemInfo, -- PVRSRV_KERNEL_MEM_INFO ***pppsSharedPBDescSubKernelMemInfos, -- IMG_UINT32 *ui32SharedPBDescSubKernelMemInfosCount); -- --IMG_IMPORT PVRSRV_ERROR --SGXUnrefSharedPBDescKM(IMG_HANDLE hSharedPBDesc); -- --IMG_IMPORT PVRSRV_ERROR --SGXAddSharedPBDescKM(IMG_HANDLE hDevCookie, -- PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo, -- PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo, -- PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo, -- IMG_UINT32 ui32TotalPBSize, -- IMG_HANDLE *phSharedPBDesc, -- PVRSRV_KERNEL_MEM_INFO **psSharedPBDescSubKernelMemInfos, -- IMG_UINT32 ui32SharedPBDescSubKernelMemInfosCount); -- -- --IMG_IMPORT PVRSRV_ERROR --SGXGetInternalDevInfoKM(IMG_HANDLE hDevCookie, -- PVR3DIF4_INTERNAL_DEVINFO *psSGXInternalDevInfo); -- -- --#if defined(SGX_FEATURE_2D_HARDWARE) --#define SGX2D_MAX_BLT_CMD_SIZ 256 --#endif -- --#if defined (__cplusplus) --} --#endif -- --#endif -- -diff -Nurd git/drivers/gpu/pvr/services4/include/sgxinfo.h git/drivers/gpu/pvr/services4/include/sgxinfo.h ---- git/drivers/gpu/pvr/services4/include/sgxinfo.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/include/sgxinfo.h 2008-12-18 15:47:29.000000000 +0100 -@@ -59,11 +59,16 @@ - #if defined(SGX_SUPPORT_HWPROFILING) - IMG_HANDLE hKernelHWProfilingMemInfo; - #endif -+#if defined(SUPPORT_SGX_HWPERF) -+ IMG_HANDLE hKernelHWPerfCBMemInfo; -+#endif - - IMG_UINT32 ui32EDMTaskReg0; - IMG_UINT32 ui32EDMTaskReg1; - -- IMG_UINT32 ui32ClockGateMask; -+ IMG_UINT32 ui32ClkGateCtl; -+ IMG_UINT32 ui32ClkGateCtl2; -+ IMG_UINT32 ui32ClkGateStatusMask; - - IMG_UINT32 ui32CacheControl; - -@@ -111,11 +116,13 @@ - #define PVRSRV_CCBFLAGS_RASTERCMD 0x1 - #define PVRSRV_CCBFLAGS_TRANSFERCMD 0x2 - #define PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD 0x3 -+#if defined(SGX_FEATURE_2D_HARDWARE) -+#define PVRSRV_CCBFLAGS_2DCMD 0x4 -+#endif - - #define PVRSRV_KICKFLAG_RENDER 0x1 - #define PVRSRV_KICKFLAG_PIXEL 0x2 - -- - #define SGX_BIF_INVALIDATE_PTCACHE 0x1 - #define SGX_BIF_INVALIDATE_PDCACHE 0x2 - -@@ -125,25 +132,40 @@ - PVRSRV_SGX_COMMAND_TYPE eCommand; - PVRSRV_SGX_COMMAND sCommand; - IMG_HANDLE hCCBKernelMemInfo; -- IMG_HANDLE hDstKernelSyncInfo; -- IMG_UINT32 ui32DstReadOpsPendingOffset; -- IMG_UINT32 ui32DstWriteOpsPendingOffset; -+ IMG_HANDLE hRenderSurfSyncInfo; -+ - IMG_UINT32 ui32NumTAStatusVals; -- IMG_UINT32 aui32TAStatusValueOffset[SGX_MAX_TA_STATUS_VALS]; - IMG_HANDLE ahTAStatusSyncInfo[SGX_MAX_TA_STATUS_VALS]; - - IMG_UINT32 ui32Num3DStatusVals; -- IMG_UINT32 aui323DStatusValueOffset[SGX_MAX_3D_STATUS_VALS]; - IMG_HANDLE ah3DStatusSyncInfo[SGX_MAX_3D_STATUS_VALS]; --#ifdef NO_HARDWARE -- IMG_BOOL bTerminate; -- IMG_HANDLE hUpdateDstKernelSyncInfo; -+ -+ IMG_BOOL bFirstKickOrResume; -+#if (defined(NO_HARDWARE) || defined(PDUMP)) -+ IMG_BOOL bTerminateOrAbort; -+#endif -+ IMG_UINT32 ui32KickFlags; -+ -+ -+ IMG_UINT32 ui32CCBOffset; -+ -+ -+ IMG_UINT32 ui32NumSrcSyncs; -+ IMG_HANDLE ahSrcKernelSyncInfo[SGX_MAX_SRC_SYNCS]; -+ -+ -+ IMG_BOOL bTADependency; -+ IMG_HANDLE hTA3DSyncInfo; -+ -+ IMG_HANDLE hTASyncInfo; -+ IMG_HANDLE h3DSyncInfo; -+#if defined(NO_HARDWARE) - IMG_UINT32 ui32WriteOpsPendingVal; - #endif -- IMG_UINT32 ui32KickFlags; - } PVR3DIF4_CCB_KICK; - - -+ - typedef struct _PVRSRV_SGX_HOST_CTL_ - { - -@@ -158,163 +180,25 @@ - IMG_UINT32 ui32ResManFlags; - IMG_DEV_VIRTADDR sResManCleanupData; - -+ - IMG_DEV_VIRTADDR sTAHWPBDesc; - IMG_DEV_VIRTADDR s3DHWPBDesc; -+ IMG_DEV_VIRTADDR sHostHWPBDesc; - --} PVRSRV_SGX_HOST_CTL; -- -- --#if defined(SUPPORT_HW_RECOVERY) --typedef struct _SGX_INIT_SCRIPT_DATA --{ -- IMG_UINT32 asHWRecoveryData[SGX_MAX_DEV_DATA]; --} SGX_INIT_SCRIPT_DATA; --#endif -- --typedef struct _PVRSRV_SGXDEV_INFO_ --{ -- PVRSRV_DEVICE_TYPE eDeviceType; -- PVRSRV_DEVICE_CLASS eDeviceClass; -- -- IMG_UINT8 ui8VersionMajor; -- IMG_UINT8 ui8VersionMinor; -- IMG_UINT32 ui32CoreConfig; -- IMG_UINT32 ui32CoreFlags; -- -- -- IMG_PVOID pvRegsBaseKM; -- -- -- -- IMG_HANDLE hRegMapping; -- -- -- IMG_SYS_PHYADDR sRegsPhysBase; -- -- IMG_UINT32 ui32RegSize; -- -- -- IMG_UINT32 ui32CoreClockSpeed; -- --#if defined(SGX_FEATURE_2D_HARDWARE) -- -- SGX_SLAVE_PORT s2DSlavePortKM; -- -- -- PVRSRV_RESOURCE s2DSlaveportResource; -- -- -- IMG_UINT32 ui322DFifoSize; -- IMG_UINT32 ui322DFifoOffset; -- -- IMG_HANDLE h2DCmdCookie; -- -- IMG_HANDLE h2DQueue; -- IMG_BOOL b2DHWRecoveryInProgress; -- IMG_BOOL b2DHWRecoveryEndPending; -- IMG_UINT32 ui322DCompletedBlits; -- IMG_BOOL b2DLockupSuspected; --#endif -- -- -- IMG_VOID *psStubPBDescListKM; -- -- -- -- IMG_DEV_PHYADDR sKernelPDDevPAddr; -- -- IMG_VOID *pvDeviceMemoryHeap; -- PPVRSRV_KERNEL_MEM_INFO psKernelCCBMemInfo; -- PVRSRV_SGX_KERNEL_CCB *psKernelCCB; -- PPVRSRV_SGX_CCB_INFO psKernelCCBInfo; -- PPVRSRV_KERNEL_MEM_INFO psKernelCCBCtlMemInfo; -- PVRSRV_SGX_CCB_CTL *psKernelCCBCtl; -- PPVRSRV_KERNEL_MEM_INFO psKernelCCBEventKickerMemInfo; -- IMG_UINT32 *pui32KernelCCBEventKicker; -- IMG_UINT32 ui32TAKickAddress; -- IMG_UINT32 ui32TexLoadKickAddress; -- IMG_UINT32 ui32VideoHandlerAddress; --#if defined(SGX_SUPPORT_HWPROFILING) -- PPVRSRV_KERNEL_MEM_INFO psKernelHWProfilingMemInfo; --#endif -- -- -- IMG_UINT32 ui32ClientRefCount; -- -- -- IMG_UINT32 ui32CacheControl; -- -- -- -- -- IMG_VOID *pvMMUContextList; -- -- -- IMG_BOOL bForcePTOff; -- -- IMG_UINT32 ui32EDMTaskReg0; -- IMG_UINT32 ui32EDMTaskReg1; -- -- IMG_UINT32 ui32ClockGateMask; -- SGX_INIT_SCRIPTS sScripts; --#if defined(SUPPORT_HW_RECOVERY) -- SGX_INIT_SCRIPT_DATA sScriptData; --#endif -- -- IMG_HANDLE hBIFResetPDOSMemHandle; -- IMG_DEV_PHYADDR sBIFResetPDDevPAddr; -- IMG_DEV_PHYADDR sBIFResetPTDevPAddr; -- IMG_DEV_PHYADDR sBIFResetPageDevPAddr; -- IMG_UINT32 *pui32BIFResetPD; -- IMG_UINT32 *pui32BIFResetPT; -- -- -- --#if defined(SUPPORT_HW_RECOVERY) -- -- IMG_HANDLE hTimer; -- -- IMG_UINT32 ui32TimeStamp; --#endif -- -- -- IMG_UINT32 ui32NumResets; -- -- PVRSRV_KERNEL_MEM_INFO *psKernelSGXHostCtlMemInfo; -- PVRSRV_SGX_HOST_CTL *psSGXHostCtl; -- -- IMG_UINT32 ui32Flags; -- -- -- IMG_UINT32 ui32RegFlags; -- -- #if defined(PDUMP) -- PVRSRV_SGX_PDUMP_CONTEXT sPDContext; -- #endif -+ IMG_UINT32 ui32NumActivePowerEvents; - --#if defined(SUPPORT_SGX_MMU_DUMMY_PAGE) -- -- IMG_VOID *pvDummyPTPageCpuVAddr; -- IMG_DEV_PHYADDR sDummyPTDevPAddr; -- IMG_HANDLE hDummyPTPageOSMemHandle; -- IMG_VOID *pvDummyDataPageCpuVAddr; -- IMG_DEV_PHYADDR sDummyDataDevPAddr; -- IMG_HANDLE hDummyDataPageOSMemHandle; -+#if defined(SUPPORT_SGX_HWPERF) -+ IMG_UINT32 ui32HWPerfFlags; - #endif - -- IMG_UINT32 asSGXDevData[SGX_MAX_DEV_DATA]; - --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- PVRSRV_EVENTOBJECT *psSGXEventObject; --#endif -+ -+ IMG_UINT32 ui32TimeWraps; -+} PVRSRV_SGX_HOST_CTL; - --} PVRSRV_SGXDEV_INFO; - - typedef struct _PVR3DIF4_CLIENT_INFO_ - { -- IMG_VOID *pvRegsBase; -- IMG_HANDLE hBlockMapping; -- SGX_SLAVE_PORT s2DSlavePort; - IMG_UINT32 ui32ProcessID; - IMG_VOID *pvProcess; - PVRSRV_MISC_INFO sMiscInfo; -@@ -330,13 +214,9 @@ - typedef struct _PVR3DIF4_INTERNAL_DEVINFO_ - { - IMG_UINT32 ui32Flags; -- IMG_BOOL bTimerEnable; - IMG_HANDLE hCtlKernelMemInfoHandle; - IMG_BOOL bForcePTOff; - IMG_UINT32 ui32RegFlags; --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- IMG_HANDLE hOSEvent; --#endif - } PVR3DIF4_INTERNAL_DEVINFO; - - typedef struct _PVRSRV_SGX_SHARED_CCB_ -@@ -371,5 +251,150 @@ - #endif - }PVRSRV_SGX_CCB; - -+typedef struct _CTL_STATUS_ -+{ -+ IMG_DEV_VIRTADDR sStatusDevAddr; -+ IMG_UINT32 ui32StatusValue; -+} CTL_STATUS, *PCTL_STATUS; -+ -+#if defined(TRANSFER_QUEUE) -+#define SGXTQ_MAX_STATUS 5 -+typedef struct _PVR3DIF4_CMDTA_SHARED_ -+{ -+ IMG_UINT32 ui32NumTAStatusVals; -+ IMG_UINT32 ui32Num3DStatusVals; -+ -+ -+ IMG_UINT32 ui32WriteOpsPendingVal; -+ IMG_DEV_VIRTADDR sWriteOpsCompleteDevVAddr; -+ IMG_UINT32 ui32ReadOpsPendingVal; -+ IMG_DEV_VIRTADDR sReadOpsCompleteDevVAddr; -+ -+ -+ IMG_UINT32 ui32TQSyncWriteOpsPendingVal; -+ IMG_DEV_VIRTADDR sTQSyncWriteOpsCompleteDevVAddr; -+ IMG_UINT32 ui32TQSyncReadOpsPendingVal; -+ IMG_DEV_VIRTADDR sTQSyncReadOpsCompleteDevVAddr; -+ -+ -+ IMG_UINT32 ui323DTQSyncWriteOpsPendingVal; -+ IMG_DEV_VIRTADDR s3DTQSyncWriteOpsCompleteDevVAddr; -+ IMG_UINT32 ui323DTQSyncReadOpsPendingVal; -+ IMG_DEV_VIRTADDR s3DTQSyncReadOpsCompleteDevVAddr; -+ -+ -+ IMG_UINT32 ui32NumSrcSyncs; -+ PVRSRV_DEVICE_SYNC_OBJECT asSrcSyncs[SGX_MAX_SRC_SYNCS]; -+ -+ CTL_STATUS sCtlTAStatusInfo[SGX_MAX_TA_STATUS_VALS]; -+ CTL_STATUS sCtl3DStatusInfo[SGX_MAX_3D_STATUS_VALS]; -+ -+ PVRSRV_DEVICE_SYNC_OBJECT sTA3DDependancy; -+ -+} PVR3DIF4_CMDTA_SHARED; -+ -+typedef struct _PVR3DIF4_TRANSFERCMD_SHARED_ -+{ -+ -+ -+ IMG_UINT32 ui32SrcReadOpPendingVal; -+ IMG_DEV_VIRTADDR sSrcReadOpsCompleteDevAddr; -+ -+ IMG_UINT32 ui32SrcWriteOpPendingVal; -+ IMG_DEV_VIRTADDR sSrcWriteOpsCompleteDevAddr; -+ -+ -+ -+ IMG_UINT32 ui32DstReadOpPendingVal; -+ IMG_DEV_VIRTADDR sDstReadOpsCompleteDevAddr; -+ -+ IMG_UINT32 ui32DstWriteOpPendingVal; -+ IMG_DEV_VIRTADDR sDstWriteOpsCompleteDevAddr; -+ -+ -+ IMG_UINT32 ui32TASyncWriteOpsPendingVal; -+ IMG_DEV_VIRTADDR sTASyncWriteOpsCompleteDevVAddr; -+ IMG_UINT32 ui32TASyncReadOpsPendingVal; -+ IMG_DEV_VIRTADDR sTASyncReadOpsCompleteDevVAddr; -+ -+ -+ IMG_UINT32 ui323DSyncWriteOpsPendingVal; -+ IMG_DEV_VIRTADDR s3DSyncWriteOpsCompleteDevVAddr; -+ IMG_UINT32 ui323DSyncReadOpsPendingVal; -+ IMG_DEV_VIRTADDR s3DSyncReadOpsCompleteDevVAddr; -+ -+ IMG_UINT32 ui32NumStatusVals; -+ CTL_STATUS sCtlStatusInfo[SGXTQ_MAX_STATUS]; -+ -+ IMG_UINT32 ui32NumSrcSync; -+ IMG_UINT32 ui32NumDstSync; -+ -+ IMG_DEV_VIRTADDR sSrcWriteOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS]; -+ IMG_DEV_VIRTADDR sSrcReadOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS]; -+ -+ IMG_DEV_VIRTADDR sDstWriteOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS]; -+ IMG_DEV_VIRTADDR sDstReadOpsDevVAddr[SGX_MAX_TRANSFER_SYNC_OPS]; -+} PVR3DIF4_TRANSFERCMD_SHARED, *PPVR3DIF4_TRANSFERCMD_SHARED; -+ -+typedef struct _PVRSRV_TRANSFER_SGX_KICK_ -+{ -+ IMG_HANDLE hCCBMemInfo; -+ IMG_UINT32 ui32SharedCmdCCBOffset; -+ -+ IMG_DEV_VIRTADDR sHWTransferContextDevVAddr; -+ -+ IMG_HANDLE hTASyncInfo; -+ IMG_HANDLE h3DSyncInfo; -+ -+ IMG_UINT32 ui32NumSrcSync; -+ IMG_HANDLE ahSrcSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS]; -+ -+ IMG_UINT32 ui32NumDstSync; -+ IMG_HANDLE ahDstSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS]; -+ -+ IMG_UINT32 ui32StatusFirstSync; -+} PVRSRV_TRANSFER_SGX_KICK, *PPVRSRV_TRANSFER_SGX_KICK; -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+typedef struct _PVR3DIF4_2DCMD_SHARED_ { -+ -+ IMG_UINT32 ui32NumSrcSync; -+ PVRSRV_DEVICE_SYNC_OBJECT sSrcSyncData[SGX_MAX_2D_SRC_SYNC_OPS]; -+ -+ -+ PVRSRV_DEVICE_SYNC_OBJECT sDstSyncData; -+ -+ -+ PVRSRV_DEVICE_SYNC_OBJECT sTASyncData; -+ -+ -+ PVRSRV_DEVICE_SYNC_OBJECT s3DSyncData; -+} PVR3DIF4_2DCMD_SHARED, *PPVR3DIF4_2DCMD_SHARED; -+ -+typedef struct _PVRSRV_2D_SGX_KICK_ -+{ -+ IMG_HANDLE hCCBMemInfo; -+ IMG_UINT32 ui32SharedCmdCCBOffset; -+ -+ IMG_DEV_VIRTADDR sHW2DContextDevVAddr; -+ -+ IMG_UINT32 ui32NumSrcSync; -+ IMG_HANDLE ahSrcSyncInfo[SGX_MAX_2D_SRC_SYNC_OPS]; -+ -+ -+ IMG_HANDLE hDstSyncInfo; -+ -+ -+ IMG_HANDLE hTASyncInfo; -+ -+ -+ IMG_HANDLE h3DSyncInfo; -+ -+} PVRSRV_2D_SGX_KICK, *PPVRSRV_2D_SGX_KICK; -+#endif -+#endif -+ -+#define PVRSRV_SGX_HWPERF_NUM_COUNTERS 9 -+ - - #endif -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c git/drivers/gpu/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c ---- git/drivers/gpu/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c 2008-12-18 15:47:29.000000000 +0100 -@@ -44,7 +44,6 @@ - #include "bridged_pvr_bridge.h" - #include "env_data.h" - -- - #if defined (__linux__) - #include "mmap.h" - #else -@@ -66,7 +65,7 @@ - - static IMG_BOOL gbInitServerRunning = IMG_FALSE; - static IMG_BOOL gbInitServerRan = IMG_FALSE; --static IMG_BOOL gbInitServerSuccessful = IMG_FALSE; -+static IMG_BOOL gbInitSuccessful = IMG_FALSE; - - PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY g_BridgeDispatchTable[BRIDGE_DISPATCH_TABLE_ENTRY_COUNT]; - -@@ -446,7 +445,13 @@ - } - - -- -+#if defined(OS_PVRSRV_ALLOC_DEVICE_MEM_BW) -+int -+PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM *psAllocDeviceMemIN, -+ PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM *psAllocDeviceMemOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc); -+#else - static int - PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, - PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM *psAllocDeviceMemIN, -@@ -512,7 +517,7 @@ - psAllocDeviceMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr; - psAllocDeviceMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags; - psAllocDeviceMemOUT->sClientMemInfo.ui32AllocSize = psMemInfo->ui32AllocSize; -- psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo = IMG_NULL; -+ psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo = psMemInfo->sMemBlk.hOSMemHandle; - - psAllocDeviceMemOUT->eError = - PVRSRVAllocHandle(psPerProc->psHandleBase, -@@ -568,6 +573,7 @@ - return 0; - } - -+#endif - - static int - PVRSRVFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, -@@ -1547,12 +1553,12 @@ - return 0; - } - -- if(psDoKickIN->sCCBKick.hDstKernelSyncInfo != IMG_NULL) -+ if(psDoKickIN->sCCBKick.hTA3DSyncInfo != IMG_NULL) - { - psRetOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, -- &psDoKickIN->sCCBKick.hDstKernelSyncInfo, -- psDoKickIN->sCCBKick.hDstKernelSyncInfo, -+ &psDoKickIN->sCCBKick.hTA3DSyncInfo, -+ psDoKickIN->sCCBKick.hTA3DSyncInfo, - PVRSRV_HANDLE_TYPE_SYNC_INFO); - - if(psRetOUT->eError != PVRSRV_OK) -@@ -1561,13 +1567,12 @@ - } - } - --#if defined (NO_HARDWARE) -- if(psDoKickIN->sCCBKick.hUpdateDstKernelSyncInfo != IMG_NULL) -+ if(psDoKickIN->sCCBKick.hTASyncInfo != IMG_NULL) - { - psRetOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, -- &psDoKickIN->sCCBKick.hUpdateDstKernelSyncInfo, -- psDoKickIN->sCCBKick.hUpdateDstKernelSyncInfo, -+ &psDoKickIN->sCCBKick.hTASyncInfo, -+ psDoKickIN->sCCBKick.hTASyncInfo, - PVRSRV_HANDLE_TYPE_SYNC_INFO); - - if(psRetOUT->eError != PVRSRV_OK) -@@ -1575,7 +1580,46 @@ - return 0; - } - } --#endif -+ -+ if(psDoKickIN->sCCBKick.h3DSyncInfo != IMG_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 = -@@ -1590,6 +1634,11 @@ - } - } - -+ 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 = -@@ -1604,6 +1653,20 @@ - } - } - -+ if(psDoKickIN->sCCBKick.hRenderSurfSyncInfo != IMG_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); -@@ -1620,51 +1683,119 @@ - PVRSRV_PER_PROCESS_DATA *psPerProc) - { - IMG_HANDLE hDevCookieInt; -+ PVRSRV_TRANSFER_SGX_KICK *psKick; -+ IMG_UINT32 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 = -- SGXSubmitTransferKM(hDevCookieInt, -- psSubmitTransferIN->sHWRenderContextDevVAddr); -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &psKick->hCCBMemInfo, -+ psKick->hCCBMemInfo, -+ PVRSRV_HANDLE_TYPE_MEM_INFO); -+ if(psRetOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } -+ -+ if (psKick->hTASyncInfo != IMG_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 != IMG_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; - } --#endif - -+#if defined(SGX_FEATURE_2D_HARDWARE) - static int --SGXGetMiscInfoBW(IMG_UINT32 ui32BridgeID, -- PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN, -- PVRSRV_BRIDGE_RETURN *psRetOUT, -- PVRSRV_PER_PROCESS_DATA *psPerProc) -+SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SUBMIT2D *psSubmit2DIN, -+ PVRSRV_BRIDGE_RETURN *psRetOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) - { - IMG_HANDLE hDevCookieInt; -- PVRSRV_SGXDEV_INFO *psDevInfo; -- SGX_MISC_INFO *psMiscInfo; -- -- -- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETMISCINFO); -+ PVRSRV_2D_SGX_KICK *psKick; -+ IMG_UINT32 i; - -- -- psMiscInfo = -- (SGX_MISC_INFO *)((IMG_UINT8 *)psSGXGetMiscInfoIN -- + sizeof(PVRSRV_BRIDGE_IN_SGXGETMISCINFO)); -+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SUBMIT2D); -+ PVR_UNREFERENCED_PARAMETER(ui32BridgeID); - - psRetOUT->eError = -- PVRSRVLookupHandle(psPerProc->psHandleBase, -- &hDevCookieInt, -- psSGXGetMiscInfoIN->hDevCookie, -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &hDevCookieInt, -+ psSubmit2DIN->hDevCookie, - PVRSRV_HANDLE_TYPE_DEV_NODE); - - if(psRetOUT->eError != PVRSRV_OK) -@@ -1672,45 +1803,156 @@ - return 0; - } - -- psDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice; -+ psKick = &psSubmit2DIN->sKick; - -- if(CopyFromUserWrapper(psPerProc, -- ui32BridgeID, -- psMiscInfo, -- psSGXGetMiscInfoIN->psMiscInfo, -- sizeof(SGX_MISC_INFO)) != PVRSRV_OK) -+ psRetOUT->eError = -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &psKick->hCCBMemInfo, -+ psKick->hCCBMemInfo, -+ PVRSRV_HANDLE_TYPE_MEM_INFO); -+ if(psRetOUT->eError != PVRSRV_OK) - { -- return -EFAULT; -+ return 0; - } - -- switch(psMiscInfo->eRequest) -+ if (psKick->hTASyncInfo != IMG_NULL) - { -- default: -- break; -+ psRetOUT->eError = -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &psKick->hTASyncInfo, -+ psKick->hTASyncInfo, -+ PVRSRV_HANDLE_TYPE_SYNC_INFO); -+ if(psRetOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } - } - -- -- psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo, psMiscInfo); -+ if (psKick->h3DSyncInfo != IMG_NULL) -+ { -+ psRetOUT->eError = -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &psKick->h3DSyncInfo, -+ psKick->h3DSyncInfo, -+ PVRSRV_HANDLE_TYPE_SYNC_INFO); -+ if(psRetOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } -+ } - -- -- switch(psMiscInfo->eRequest) -+ if (psKick->ui32NumSrcSync > SGX_MAX_2D_SRC_SYNC_OPS) - { -- default: -- break; -+ 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(CopyToUserWrapper(psPerProc, -- ui32BridgeID, -- psSGXGetMiscInfoIN->psMiscInfo, -- psMiscInfo, -- sizeof(SGX_MISC_INFO)) != PVRSRV_OK) -+ if (psKick->hDstSyncInfo != IMG_NULL) - { -- return -EFAULT; -+ psRetOUT->eError = -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &psKick->hDstSyncInfo, -+ psKick->hDstSyncInfo, -+ PVRSRV_HANDLE_TYPE_SYNC_INFO); -+ if(psRetOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } - } - -+ psRetOUT->eError = -+ SGXSubmit2DKM(hDevCookieInt, psKick); -+ -+ return 0; -+} -+#endif -+ -+#endif -+ -+static int -+SGXGetMiscInfoBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN, -+ PVRSRV_BRIDGE_RETURN *psRetOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE hDevCookieInt; -+ PVRSRV_SGXDEV_INFO *psDevInfo; -+ SGX_MISC_INFO *psMiscInfo; -+ -+ 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 = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE*)hDevCookieInt)->pvDevice; -+ -+ psMiscInfo = psSGXGetMiscInfoIN->psMiscInfo; -+ psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo, psMiscInfo); -+ - return 0; - } - -+#if defined(SUPPORT_SGX_HWPERF) -+static int -+SGXReadHWPerfCountersBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_COUNTERS *psSGXReadHWPerfCountersIN, -+ PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_COUNTERS *psSGXReadHWPerfCountersOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE hDevCookieInt; -+ PVRSRV_SGXDEV_INFO *psDevInfo; -+ -+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_READ_HWPERF_COUNTERS); -+ -+ psSGXReadHWPerfCountersOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &hDevCookieInt, -+ psSGXReadHWPerfCountersIN->hDevCookie, -+ PVRSRV_HANDLE_TYPE_DEV_NODE); -+ -+ if(psSGXReadHWPerfCountersOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } -+ -+ psDevInfo = ((PVRSRV_DEVICE_NODE*)hDevCookieInt)->pvDevice; -+ -+ psSGXReadHWPerfCountersOUT->eError = SGXReadHWPerfCountersKM(psDevInfo, -+ psSGXReadHWPerfCountersIN->ui32PerfReg, -+ &psSGXReadHWPerfCountersOUT->ui32OldPerf, -+ psSGXReadHWPerfCountersIN->bNewPerf, -+ psSGXReadHWPerfCountersIN->ui32NewPerf, -+ psSGXReadHWPerfCountersIN->ui32NewPerfReset, -+ psSGXReadHWPerfCountersIN->ui32PerfCountersReg, -+ &psSGXReadHWPerfCountersOUT->aui32Counters[0], -+ &psSGXReadHWPerfCountersOUT->ui32KickTACounter, -+ &psSGXReadHWPerfCountersOUT->ui32KickTARenderCounter, -+ &psSGXReadHWPerfCountersOUT->ui32CPUTime, -+ &psSGXReadHWPerfCountersOUT->ui32SGXTime); -+ -+ return 0; -+} -+#endif -+ - static int - PVRSRVInitSrvConnectBW(IMG_UINT32 ui32BridgeID, - IMG_VOID *psBridgeIn, -@@ -1752,15 +1994,13 @@ - return 0; - } - -- PDUMPENDINITPHASE(); -- -- gbInitServerSuccessful = psInitSrvDisconnectIN->bInitSuccesful; -- - psPerProc->bInitProcess = IMG_FALSE; - gbInitServerRunning = IMG_FALSE; - gbInitServerRan = IMG_TRUE; - -- psRetOUT->eError = PVRSRV_OK; -+ psRetOUT->eError = PVRSRVFinaliseSystem(psInitSrvDisconnectIN->bInitSuccesful); -+ -+ gbInitSuccessful = (IMG_BOOL)(((psRetOUT->eError == PVRSRV_OK) && (psInitSrvDisconnectIN->bInitSuccesful))); - - return 0; - } -@@ -1772,15 +2012,99 @@ - PVRSRV_BRIDGE_RETURN *psRetOUT, - PVRSRV_PER_PROCESS_DATA *psPerProc) - { -+ IMG_HANDLE hOSEventKM; -+ - PVR_UNREFERENCED_PARAMETER(psPerProc); - - PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_WAIT); - -- psRetOUT->eError = OSEventObjectWait(psEventObjectWaitIN->hOSEventKM, psEventObjectWaitIN->ui32MSTimeout); -+ 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(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN *psEventObjectOpenIN, -+ PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN *psEventObjectOpenOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ -+ PVR_UNREFERENCED_PARAMETER(psPerProc); -+ -+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_OPEN); -+ -+ 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; -+ } -+ psEventObjectOpenOUT->eError = -+ PVRSRVAllocHandle(psPerProc->psHandleBase, -+ &psEventObjectOpenOUT->hOSEvent, -+ psEventObjectOpenOUT->hOSEvent, -+ PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT, -+ PVRSRV_HANDLE_ALLOC_FLAG_NONE); - - return 0; - } -+static int -+PVRSRVEventObjectCloseBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE *psEventObjectCloseIN, -+ PVRSRV_BRIDGE_RETURN *psRetOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE hOSEventKM; -+ -+ PVR_UNREFERENCED_PARAMETER(psPerProc); -+ -+ 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(IMG_UINT32 ui32BridgeID, -@@ -1847,6 +2171,13 @@ - bLookupFailed |= (eError != PVRSRV_OK); - #endif - -+#if defined(SUPPORT_SGX_HWPERF) -+ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &hDummy, -+ psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo, -+ PVRSRV_HANDLE_TYPE_MEM_INFO); -+ bLookupFailed |= (eError != PVRSRV_OK); -+#endif - - - for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) -@@ -1907,6 +2238,13 @@ - bReleaseFailed |= (eError != PVRSRV_OK); - #endif - -+#if defined(SUPPORT_SGX_HWPERF) -+ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -+ &psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo, -+ psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo, -+ PVRSRV_HANDLE_TYPE_MEM_INFO); -+ bReleaseFailed |= (eError != PVRSRV_OK); -+#endif - - - for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) -@@ -1950,6 +2288,10 @@ - bDissociateFailed |= (eError != PVRSRV_OK); - #endif - -+#if defined(SUPPORT_SGX_HWPERF) -+ eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo); -+ bDissociateFailed |= (eError != PVRSRV_OK); -+#endif - - - for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) -@@ -2005,7 +2347,6 @@ - PVRSRV_PER_PROCESS_DATA *psPerProc) - { - IMG_HANDLE hDevCookieInt; -- PVRSRV_SGXDEV_INFO *psDevInfo; - IMG_HANDLE hHWRenderContextInt; - - PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT); -@@ -2020,10 +2361,8 @@ - return 0; - } - -- psDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice; -- - hHWRenderContextInt = -- SGXRegisterHWRenderContextKM(psDevInfo, -+ SGXRegisterHWRenderContextKM(hDevCookieInt, - &psSGXRegHWRenderContextIN->sHWRenderContextDevVAddr); - - if (hHWRenderContextInt == IMG_NULL) -@@ -2043,54 +2382,180 @@ - } - - static int --SGXFlushHWRenderTargetBW(IMG_UINT32 ui32BridgeID, -- PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET *psSGXFlushHWRenderTargetIN, -- PVRSRV_BRIDGE_RETURN *psRetOUT, -- PVRSRV_PER_PROCESS_DATA *psPerProc) -+SGXUnregisterHWRenderContextBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT *psSGXUnregHWRenderContextIN, -+ PVRSRV_BRIDGE_RETURN *psRetOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) - { -- IMG_HANDLE hDevCookieInt; -- PVRSRV_SGXDEV_INFO *psDevInfo; -- -- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET); -+ IMG_HANDLE 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(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT *psSGXRegHWTransferContextIN, -+ PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT *psSGXRegHWTransferContextOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE hDevCookieInt; -+ IMG_HANDLE hHWTransferContextInt; -+ -+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT); -+ -+ psSGXRegHWTransferContextOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, - &hDevCookieInt, -- psSGXFlushHWRenderTargetIN->hDevCookie, -+ psSGXRegHWTransferContextIN->hDevCookie, - PVRSRV_HANDLE_TYPE_DEV_NODE); -+ if(psSGXRegHWTransferContextOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } -+ -+ hHWTransferContextInt = -+ SGXRegisterHWTransferContextKM(hDevCookieInt, -+ &psSGXRegHWTransferContextIN->sHWTransferContextDevVAddr); -+ -+ if (hHWTransferContextInt == IMG_NULL) -+ { -+ psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_GENERIC; -+ return 0; -+ } -+ -+ psSGXRegHWTransferContextOUT->eError = -+ PVRSRVAllocHandle(psPerProc->psHandleBase, -+ &psSGXRegHWTransferContextOUT->hHWTransferContext, -+ hHWTransferContextInt, -+ PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT, -+ PVRSRV_HANDLE_ALLOC_FLAG_NONE); -+ -+ return 0; -+} -+ -+static int -+SGXUnregisterHWTransferContextBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT *psSGXUnregHWTransferContextIN, -+ PVRSRV_BRIDGE_RETURN *psRetOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE 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; -+} -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+static int -+SGXRegisterHW2DContextBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_2D_CONTEXT *psSGXRegHW2DContextIN, -+ PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT *psSGXRegHW2DContextOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE hDevCookieInt; -+ PVRSRV_SGXDEV_INFO *psDevInfo; -+ IMG_HANDLE hHW2DContextInt; -+ -+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_REGISTER_HW_2D_CONTEXT); -+ -+ psSGXRegHW2DContextOUT->eError = -+ PVRSRVLookupHandle(psPerProc->psHandleBase, -+ &hDevCookieInt, -+ psSGXRegHW2DContextIN->hDevCookie, -+ PVRSRV_HANDLE_TYPE_DEV_NODE); -+ if(psSGXRegHW2DContextOUT->eError != PVRSRV_OK) -+ { -+ return 0; -+ } -+ - psDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice; - -- SGXFlushHWRenderTargetKM(psDevInfo, psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr); -+ hHW2DContextInt = -+ SGXRegisterHW2DContextKM(hDevCookieInt, -+ &psSGXRegHW2DContextIN->sHW2DContextDevVAddr); -+ -+ if (hHW2DContextInt == IMG_NULL) -+ { -+ psSGXRegHW2DContextOUT->eError = PVRSRV_ERROR_GENERIC; -+ return 0; -+ } -+ -+ psSGXRegHW2DContextOUT->eError = -+ PVRSRVAllocHandle(psPerProc->psHandleBase, -+ &psSGXRegHW2DContextOUT->hHW2DContext, -+ hHW2DContextInt, -+ PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT, -+ PVRSRV_HANDLE_ALLOC_FLAG_NONE); - - return 0; - } - - static int --SGXUnregisterHWRenderContextBW(IMG_UINT32 ui32BridgeID, -- PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT *psSGXUnregHWRenderContextIN, -+SGXUnregisterHW2DContextBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT *psSGXUnregHW2DContextIN, - PVRSRV_BRIDGE_RETURN *psRetOUT, - PVRSRV_PER_PROCESS_DATA *psPerProc) - { -- IMG_HANDLE hHWRenderContextInt; -+ IMG_HANDLE hHW2DContextInt; - -- PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT); -+ PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREGISTER_HW_2D_CONTEXT); - - psRetOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, -- &hHWRenderContextInt, -- psSGXUnregHWRenderContextIN->hHWRenderContext, -- PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT); -+ &hHW2DContextInt, -+ psSGXUnregHW2DContextIN->hHW2DContext, -+ PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT); - if(psRetOUT->eError != PVRSRV_OK) - { - return 0; - } - -- psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt); -+ psRetOUT->eError = SGXUnregisterHW2DContextKM(hHW2DContextInt); - if(psRetOUT->eError != PVRSRV_OK) - { - return 0; -@@ -2098,11 +2563,37 @@ - - psRetOUT->eError = - PVRSRVReleaseHandle(psPerProc->psHandleBase, -- psSGXUnregHWRenderContextIN->hHWRenderContext, -- PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT); -+ psSGXUnregHW2DContextIN->hHW2DContext, -+ PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT); - - return 0; - } -+#endif -+ -+static int -+SGXFlushHWRenderTargetBW(IMG_UINT32 ui32BridgeID, -+ PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET *psSGXFlushHWRenderTargetIN, -+ PVRSRV_BRIDGE_RETURN *psRetOUT, -+ PVRSRV_PER_PROCESS_DATA *psPerProc) -+{ -+ IMG_HANDLE 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; -+} - - #if defined(SGX_FEATURE_2D_HARDWARE) - -@@ -2679,16 +3170,63 @@ - PVRSRV_BRIDGE_OUT_GET_MISC_INFO *psGetMiscInfoOUT, - PVRSRV_PER_PROCESS_DATA *psPerProc) - { -+ PVRSRV_ERROR eError; -+ - PVR_UNREFERENCED_PARAMETER(psPerProc); -- - PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_GET_MISC_INFO); - - OSMemCopy(&psGetMiscInfoOUT->sMiscInfo, - &psGetMiscInfoIN->sMiscInfo, - sizeof(PVRSRV_MISC_INFO)); - -- psGetMiscInfoOUT->eError = PVRSRVGetMiscInfoKM(&psGetMiscInfoIN->sMiscInfo); -- psGetMiscInfoOUT->sMiscInfo = psGetMiscInfoIN->sMiscInfo; -+ if (psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_MEMSTATS_PRESENT) -+ { -+ -+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, -+ psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen, -+ (IMG_VOID **)&psGetMiscInfoOUT->sMiscInfo.pszMemoryStr, 0); -+ if(eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "PVRSRVGetMiscInfoBW Out of memory")); -+ return -EFAULT; -+ } -+ -+ psGetMiscInfoOUT->eError = PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo); -+ -+ -+ eError = CopyToUserWrapper(psPerProc, ui32BridgeID, -+ psGetMiscInfoIN->sMiscInfo.pszMemoryStr, -+ psGetMiscInfoOUT->sMiscInfo.pszMemoryStr, -+ psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen); -+ -+ -+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, -+ psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen, -+ (IMG_VOID *)psGetMiscInfoOUT->sMiscInfo.pszMemoryStr, 0); -+ -+ -+ psGetMiscInfoOUT->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); -+ } -+ -+ if (psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) -+ { -+ psGetMiscInfoOUT->eError = PVRSRVAllocHandle(psPerProc->psHandleBase, -+ &psGetMiscInfoOUT->sMiscInfo.sGlobalEventObject.hOSEventKM, -+ psGetMiscInfoOUT->sMiscInfo.sGlobalEventObject.hOSEventKM, -+ PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT, -+ PVRSRV_HANDLE_ALLOC_FLAG_SHARED); -+ } - - return 0; - } -@@ -3526,6 +4064,7 @@ - psKernelMemInfo->ui32Flags; - psAllocSharedSysMemOUT->sClientMemInfo.ui32AllocSize = - psKernelMemInfo->ui32AllocSize; -+ psAllocSharedSysMemOUT->sClientMemInfo.hMappingInfo = psKernelMemInfo->sMemBlk.hOSMemHandle; - psAllocSharedSysMemOUT->eError = - PVRSRVAllocHandle(psPerProc->psHandleBase, - &psAllocSharedSysMemOUT->sClientMemInfo.hKernelMemInfo, -@@ -3641,7 +4180,7 @@ - psKernelMemInfo->ui32Flags; - psMapMemInfoMemOUT->sClientMemInfo.ui32AllocSize = - psKernelMemInfo->ui32AllocSize; -- psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo = IMG_NULL; -+ psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo = psKernelMemInfo->sMemBlk.hOSMemHandle; - psMapMemInfoMemOUT->eError = - PVRSRVAllocSubHandle(psPerProc->psHandleBase, - &psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo, -@@ -3972,6 +4511,8 @@ - - - SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_WAIT, PVRSRVEventObjectWaitBW); -+ SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_OPEN, PVRSRVEventObjectOpenBW); -+ SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE, PVRSRVEventObjectCloseBW); - - - #if defined(SUPPORT_SGX1) -@@ -4009,7 +4550,18 @@ - 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); -- -+#if defined(SGX_FEATURE_2D_HARDWARE) -+#if defined(TRANSFER_QUEUE) -+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMIT2D, SGXSubmit2DBW); -+#endif -+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_2D_CONTEXT, SGXRegisterHW2DContextBW); -+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_2D_CONTEXT, SGXUnregisterHW2DContextBW); -+#endif -+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT, SGXRegisterHWTransferContextBW); -+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT, SGXUnregisterHWTransferContextBW); -+#endif -+#if defined(SUPPORT_SGX_HWPERF) -+ SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_HWPERF_COUNTERS, SGXReadHWPerfCountersBW); - #endif - - -@@ -4059,7 +4611,7 @@ - { - if(gbInitServerRan) - { -- if(!gbInitServerSuccessful) -+ if(!gbInitSuccessful) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Initialisation failed. Driver unusable.", - __FUNCTION__)); -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c git/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c ---- git/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c 2008-12-18 15:47:29.000000000 +0100 -@@ -24,7 +24,6 @@ - * - ******************************************************************************/ - --#include <linux/module.h> - #include "services_headers.h" - #include "buffer_manager.h" - #include "kernelbuffer.h" -@@ -1128,7 +1127,8 @@ - - - apsSrcSync[0] = psBuffer->sDeviceClassBuffer.psKernelSyncInfo; -- if(psBuffer->psSwapChain->psLastFlipBuffer) -+ if(psBuffer->psSwapChain->psLastFlipBuffer && -+ psBuffer != psBuffer->psSwapChain->psLastFlipBuffer) - { - apsSrcSync[1] = psBuffer->psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo; - ui32NumSrcSyncs++; -@@ -1389,7 +1389,7 @@ - } - - --IMG_VOID PVRSRVSetDCState(IMG_UINT32 ui32State) -+IMG_VOID IMG_CALLCONV PVRSRVSetDCState(IMG_UINT32 ui32State) - { - PVRSRV_DISPLAYCLASS_INFO *psDCInfo; - PVRSRV_DEVICE_NODE *psDeviceNode; -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/devicemem.c git/drivers/gpu/pvr/services4/srvkm/common/devicemem.c ---- git/drivers/gpu/pvr/services4/srvkm/common/devicemem.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/devicemem.c 2008-12-18 15:47:29.000000000 +0100 -@@ -422,7 +422,8 @@ - BM_HEAP *psBMHeap; - IMG_HANDLE hDevMemContext; - -- if (!hDevMemHeap) -+ if (!hDevMemHeap || -+ (ui32Size == 0)) - { - return PVRSRV_ERROR_INVALID_PARAMS; - } -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/handle.c git/drivers/gpu/pvr/services4/srvkm/common/handle.c ---- git/drivers/gpu/pvr/services4/srvkm/common/handle.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/handle.c 2008-12-18 15:47:29.000000000 +0100 -@@ -25,6 +25,10 @@ - ******************************************************************************/ - - #ifdef PVR_SECURE_HANDLES -+#ifdef __linux__ -+#include <linux/vmalloc.h> -+#endif -+ - #include <stddef.h> - - #include "services_headers.h" -@@ -36,6 +40,8 @@ - #define HANDLE_BLOCK_SIZE 256 - #endif - -+#define HANDLE_LARGE_BLOCK_SIZE 1024 -+ - #define HANDLE_HASH_TAB_INIT_SIZE 32 - - #define INDEX_IS_VALID(psBase, i) ((i) < (psBase)->ui32TotalHandCount) -@@ -100,13 +106,13 @@ - { - IMG_BOOL bIsEmpty; - -- bIsEmpty = (psList->ui32Next == ui32Index); -+ bIsEmpty = (IMG_BOOL)(psList->ui32Next == ui32Index); - - #ifdef DEBUG - { - IMG_BOOL bIsEmpty2; - -- bIsEmpty2 = (psList->ui32Prev == ui32Index); -+ bIsEmpty2 = (IMG_BOOL)(psList->ui32Prev == ui32Index); - PVR_ASSERT(bIsEmpty == bIsEmpty2); - } - #endif -@@ -114,6 +120,7 @@ - return bIsEmpty; - } - -+#ifdef DEBUG - #ifdef INLINE_IS_PRAGMA - #pragma inline(NoChildren) - #endif -@@ -143,6 +150,7 @@ - } - return IMG_FALSE; - } -+#endif - - #ifdef INLINE_IS_PRAGMA - #pragma inline(ParentHandle) -@@ -328,6 +336,14 @@ - - if (psBase->psHandleArray != IMG_NULL) - { -+#ifdef __linux__ -+ if (psBase->bVmallocUsed) -+ { -+ vfree(psBase->psHandleArray); -+ psBase->psHandleArray = IMG_NULL; -+ return PVRSRV_OK; -+ } -+#endif - eError = OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - psBase->ui32TotalHandCount * sizeof(struct sHandle), - psBase->psHandleArray, -@@ -363,6 +379,7 @@ - - PVR_ASSERT(hHandle != IMG_NULL); - PVR_ASSERT(hHandle == INDEX_TO_HANDLE(psBase, ui32Index)); -+ PVR_UNREFERENCED_PARAMETER(hHandle); - } - - -@@ -495,22 +512,46 @@ - return (IMG_HANDLE) HASH_Retrieve_Extended(psBase->psHashTab, aKey); - } - -+#define NEW_HANDLE_ARRAY_SIZE(psBase, handleNumberIncrement) \ -+ (((psBase)->ui32TotalHandCount + (handleNumberIncrement)) * \ -+ sizeof(struct sHandle)) -+ - static PVRSRV_ERROR IncreaseHandleArraySize(PVRSRV_HANDLE_BASE *psBase) - { - struct sHandle *psNewHandleArray; - IMG_HANDLE hNewHandBlockAlloc; - PVRSRV_ERROR eError; - struct sHandle *psHandle; -+ IMG_UINT32 ui32HandleNumberIncrement = HANDLE_BLOCK_SIZE; -+ IMG_UINT32 ui32NewHandleArraySize = NEW_HANDLE_ARRAY_SIZE(psBase, ui32HandleNumberIncrement); -+#ifdef __linux__ -+ IMG_BOOL bVmallocUsed = IMG_FALSE; -+#endif - - - eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, -- (psBase->ui32TotalHandCount + HANDLE_BLOCK_SIZE) * sizeof(struct sHandle), -+ ui32NewHandleArraySize, - (IMG_PVOID *)&psNewHandleArray, - &hNewHandBlockAlloc); - if (eError != PVRSRV_OK) - { -+#ifdef __linux__ -+ PVR_TRACE(("IncreaseHandleArraySize: OSAllocMem failed (%d), trying vmalloc", eError)); -+ -+ ui32HandleNumberIncrement = HANDLE_LARGE_BLOCK_SIZE; -+ ui32NewHandleArraySize = NEW_HANDLE_ARRAY_SIZE(psBase, ui32HandleNumberIncrement); -+ -+ psNewHandleArray = vmalloc(ui32NewHandleArraySize); -+ if (psNewHandleArray == IMG_NULL) -+ { -+ PVR_TRACE(("IncreaseHandleArraySize: vmalloc failed")); -+ return PVRSRV_ERROR_OUT_OF_MEMORY; -+ } -+ bVmallocUsed = IMG_TRUE; -+#else - PVR_DPF((PVR_DBG_ERROR, "IncreaseHandleArraySize: Couldn't allocate new handle array (%d)", eError)); - return eError; -+#endif - } - - -@@ -521,7 +562,7 @@ - - - for(psHandle = psNewHandleArray + psBase->ui32TotalHandCount; -- psHandle < psNewHandleArray + psBase->ui32TotalHandCount + HANDLE_BLOCK_SIZE; -+ psHandle < psNewHandleArray + psBase->ui32TotalHandCount + ui32HandleNumberIncrement; - psHandle++) - { - psHandle->eType = PVRSRV_HANDLE_TYPE_NONE; -@@ -538,15 +579,18 @@ - - psBase->psHandleArray = psNewHandleArray; - psBase->hHandBlockAlloc = hNewHandBlockAlloc; -+#ifdef __linux__ -+ psBase->bVmallocUsed = bVmallocUsed; -+#endif - - - PVR_ASSERT(psBase->ui32FreeHandCount == 0); -- psBase->ui32FreeHandCount = HANDLE_BLOCK_SIZE; -+ psBase->ui32FreeHandCount = ui32HandleNumberIncrement; - - PVR_ASSERT(psBase->ui32FirstFreeIndex == 0); - psBase->ui32FirstFreeIndex = psBase->ui32TotalHandCount; - -- psBase->ui32TotalHandCount += HANDLE_BLOCK_SIZE; -+ psBase->ui32TotalHandCount += ui32HandleNumberIncrement; - - PVR_ASSERT(psBase->ui32LastFreeIndexPlusOne == 0); - psBase->ui32LastFreeIndexPlusOne = psBase->ui32TotalHandCount; -@@ -564,7 +608,7 @@ - - PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE); - -- PVR_ASSERT(psBase->psHashTab != NULL); -+ PVR_ASSERT(psBase->psHashTab != IMG_NULL); - - if (!(eFlag & PVRSRV_HANDLE_ALLOC_FLAG_MULTI)) - { -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/power.c git/drivers/gpu/pvr/services4/srvkm/common/power.c ---- git/drivers/gpu/pvr/services4/srvkm/common/power.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/power.c 2008-12-18 15:47:29.000000000 +0100 -@@ -207,6 +207,21 @@ - } - - -+PVRSRV_ERROR PVRSRVSetDevicePowerStateCoreKM(IMG_UINT32 ui32DeviceIndex, -+ PVR_POWER_STATE eNewPowerState) -+{ -+ PVRSRV_ERROR eError; -+ eError = PVRSRVDevicePrePowerStateKM(IMG_FALSE, ui32DeviceIndex, eNewPowerState); -+ if(eError != PVRSRV_OK) -+ { -+ return eError; -+ } -+ -+ eError = PVRSRVDevicePostPowerStateKM(IMG_FALSE, ui32DeviceIndex, eNewPowerState); -+ return eError; -+} -+ -+ - IMG_EXPORT - PVRSRV_ERROR PVRSRVSetDevicePowerStateKM(IMG_UINT32 ui32DeviceIndex, - PVR_POWER_STATE eNewPowerState, -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c git/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c ---- git/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c 2008-12-18 15:47:29.000000000 +0100 -@@ -28,6 +28,7 @@ - #include "buffer_manager.h" - #include "handle.h" - #include "perproc.h" -+#include "pdump_km.h" - - - #include "ra.h" -@@ -180,7 +181,7 @@ - } - - --PVRSRV_ERROR PVRSRVInit(PSYS_DATA psSysData) -+PVRSRV_ERROR IMG_CALLCONV PVRSRVInit(PSYS_DATA psSysData) - { - PVRSRV_ERROR eError; - -@@ -215,6 +216,20 @@ - gpsSysData->eCurrentPowerState = PVRSRV_POWER_STATE_D0; - gpsSysData->eFailedPowerState = PVRSRV_POWER_Unspecified; - -+ -+ if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(PVRSRV_EVENTOBJECT) , -+ (IMG_VOID **)&psSysData->psGlobalEventObject, 0) != PVRSRV_OK) -+ { -+ -+ goto Error; -+ } -+ -+ if(OSEventObjectCreate("PVRSRV_GLOBAL_EVENTOBJECT", psSysData->psGlobalEventObject) != PVRSRV_OK) -+ { -+ goto Error; -+ } -+ - return eError; - - Error: -@@ -224,12 +239,21 @@ - - - --IMG_VOID PVRSRVDeInit(PSYS_DATA psSysData) -+IMG_VOID IMG_CALLCONV PVRSRVDeInit(PSYS_DATA psSysData) - { - PVRSRV_ERROR eError; - - PVR_UNREFERENCED_PARAMETER(psSysData); - -+ -+ if(psSysData->psGlobalEventObject) -+ { -+ OSEventObjectDestroy(psSysData->psGlobalEventObject); -+ OSFreeMem( PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(PVRSRV_EVENTOBJECT) , -+ psSysData->psGlobalEventObject, 0); -+ } -+ - eError = PVRSRVHandleDeInit(); - if (eError != PVRSRV_OK) - { -@@ -246,10 +270,10 @@ - } - - --PVRSRV_ERROR PVRSRVRegisterDevice(PSYS_DATA psSysData, -- PVRSRV_ERROR (*pfnRegisterDevice)(PVRSRV_DEVICE_NODE*), -- IMG_UINT32 ui32SOCInterruptBit, -- IMG_UINT32 *pui32DeviceIndex) -+PVRSRV_ERROR IMG_CALLCONV PVRSRVRegisterDevice(PSYS_DATA psSysData, -+ PVRSRV_ERROR (*pfnRegisterDevice)(PVRSRV_DEVICE_NODE*), -+ IMG_UINT32 ui32SOCInterruptBit, -+ IMG_UINT32 *pui32DeviceIndex) - { - PVRSRV_ERROR eError; - PVRSRV_DEVICE_NODE *psDeviceNode; -@@ -342,6 +366,61 @@ - } - } - -+ -+ -+ -+ eError = PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_TRUE); -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR,"PVRSRVInitialiseDevice: Failed PVRSRVResManConnect call")); -+ return eError; -+ } -+ -+ return PVRSRV_OK; -+} -+ -+ -+PVRSRV_ERROR IMG_CALLCONV PVRSRVFinaliseSystem(IMG_BOOL bInitSuccessful) -+{ -+ PVRSRV_DEVICE_NODE *psDeviceNode; -+ SYS_DATA *psSysData; -+ PVRSRV_ERROR eError; -+ -+ PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVFinaliseSystem")); -+ -+ eError = SysAcquireData(&psSysData); -+ if(eError != PVRSRV_OK) -+ { -+ 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)); -+ return eError; -+ } -+ -+ -+ psDeviceNode = psSysData->psDeviceNodeList; -+ while (psDeviceNode) -+ { -+ eError = PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex, -+ PVRSRV_POWER_Unspecified, -+ KERNEL_ID, IMG_FALSE); -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR,"PVRSRVFinaliseSystem: Failed PVRSRVSetDevicePowerStateKM call (device index: %d)", psDeviceNode->sDevId.ui32DeviceIndex)); -+ } -+ psDeviceNode = psDeviceNode->psNext; -+ } -+ } -+ -+ PDUMPENDINITPHASE(); -+ - return PVRSRV_OK; - } - -@@ -408,7 +487,7 @@ - } - - --PVRSRV_ERROR PVRSRVDeinitialiseDevice(IMG_UINT32 ui32DevIndex) -+PVRSRV_ERROR IMG_CALLCONV PVRSRVDeinitialiseDevice(IMG_UINT32 ui32DevIndex) - { - PVRSRV_DEVICE_NODE *psDeviceNode; - PVRSRV_DEVICE_NODE **ppsDevNode; -@@ -441,10 +520,6 @@ - - - -- --#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -- -- - eError = PVRSRVSetDevicePowerStateKM(ui32DevIndex, - PVRSRV_POWER_STATE_D3, - KERNEL_ID, -@@ -454,7 +529,16 @@ - PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed PVRSRVSetDevicePowerStateKM call")); - return eError; - } --#endif -+ -+ -+ -+ -+ eError = PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_FALSE); -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed PVRSRVResManConnect call")); -+ return eError; -+ } - - - -@@ -481,11 +565,11 @@ - - - IMG_EXPORT --PVRSRV_ERROR PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr, -- IMG_UINT32 ui32Value, -- IMG_UINT32 ui32Mask, -- IMG_UINT32 ui32Waitus, -- IMG_UINT32 ui32Tries) -+PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr, -+ IMG_UINT32 ui32Value, -+ IMG_UINT32 ui32Mask, -+ IMG_UINT32 ui32Waitus, -+ IMG_UINT32 ui32Tries) - { - IMG_BOOL bStart = IMG_FALSE; - IMG_UINT32 uiStart = 0, uiCurrent=0, uiMaxTime; -@@ -585,7 +669,8 @@ - - if(psMiscInfo->ui32StateRequest & ~(PVRSRV_MISC_INFO_TIMER_PRESENT - |PVRSRV_MISC_INFO_CLOCKGATE_PRESENT -- |PVRSRV_MISC_INFO_MEMSTATS_PRESENT)) -+ |PVRSRV_MISC_INFO_MEMSTATS_PRESENT -+ |PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT)) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetMiscInfoKM: invalid state request flags")); - return PVRSRV_ERROR_INVALID_PARAMS; -@@ -719,13 +804,20 @@ - i32Count = OSSNPrintf(pszStr, 100, "\n\0"); - UPDATE_SPACE(pszStr, i32Count, ui32StrLen); - } -+ -+ if((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) -+ && psSysData->psGlobalEventObject) -+ { -+ psMiscInfo->ui32StatePresent |= PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT; -+ psMiscInfo->sGlobalEventObject = *psSysData->psGlobalEventObject; -+ } - - return PVRSRV_OK; - } - - --PVRSRV_ERROR PVRSRVGetFBStatsKM(IMG_UINT32 *pui32Total, -- IMG_UINT32 *pui32Available) -+PVRSRV_ERROR IMG_CALLCONV PVRSRVGetFBStatsKM(IMG_UINT32 *pui32Total, -+ IMG_UINT32 *pui32Available) - { - IMG_UINT32 ui32Total = 0, i = 0; - IMG_UINT32 ui32Available = 0; -@@ -746,7 +838,7 @@ - } - - --IMG_BOOL PVRSRVDeviceLISR(PVRSRV_DEVICE_NODE *psDeviceNode) -+IMG_BOOL IMG_CALLCONV PVRSRVDeviceLISR(PVRSRV_DEVICE_NODE *psDeviceNode) - { - SYS_DATA *psSysData; - IMG_BOOL bStatus = IMG_FALSE; -@@ -776,7 +868,7 @@ - } - - --IMG_BOOL PVRSRVSystemLISR(IMG_VOID *pvSysData) -+IMG_BOOL IMG_CALLCONV PVRSRVSystemLISR(IMG_VOID *pvSysData) - { - SYS_DATA *psSysData = pvSysData; - IMG_BOOL bStatus = IMG_FALSE; -@@ -826,7 +918,7 @@ - } - - --IMG_VOID PVRSRVMISR(IMG_VOID *pvSysData) -+IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData) - { - SYS_DATA *psSysData = pvSysData; - PVRSRV_DEVICE_NODE *psDeviceNode; -@@ -853,10 +945,21 @@ - { - PVRSRVProcessQueues(ISR_ID, IMG_FALSE); - } -+ -+ -+ if (psSysData->psGlobalEventObject) -+ { -+ IMG_HANDLE hOSEventKM = psSysData->psGlobalEventObject->hOSEventKM; -+ if(hOSEventKM) -+ { -+ OSEventObjectSignal(hOSEventKM); -+ } -+ } - } - - --PVRSRV_ERROR PVRSRVSaveRestoreLiveSegments(IMG_HANDLE hArena, IMG_PBYTE pbyBuffer, IMG_UINT32 *puiBufSize, IMG_BOOL bSave) -+PVRSRV_ERROR IMG_CALLCONV PVRSRVSaveRestoreLiveSegments(IMG_HANDLE hArena, IMG_PBYTE pbyBuffer, -+ IMG_UINT32 *puiBufSize, IMG_BOOL bSave) - { - IMG_UINT32 uiBytesSaved = 0; - IMG_PVOID pvLocalMemCPUVAddr; -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/queue.c git/drivers/gpu/pvr/services4/srvkm/common/queue.c ---- git/drivers/gpu/pvr/services4/srvkm/common/queue.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/queue.c 2008-12-18 15:47:29.000000000 +0100 -@@ -760,14 +760,10 @@ - - PVRSRVCommandCompleteCallbacks(); - --#if defined(SYS_USING_INTERRUPTS) - if(bScheduleMISR) - { - OSScheduleMISR(psSysData); - } --#else -- PVR_UNREFERENCED_PARAMETER(bScheduleMISR); --#endif - } - - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/common/resman.c git/drivers/gpu/pvr/services4/srvkm/common/resman.c ---- git/drivers/gpu/pvr/services4/srvkm/common/resman.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/common/resman.c 2008-12-18 15:47:29.000000000 +0100 -@@ -145,6 +141,10 @@ - - case RESMAN_TYPE_HW_RENDER_CONTEXT: - return "HW Render Context Resource"; -+ case RESMAN_TYPE_HW_TRANSFER_CONTEXT: -+ return "HW Transfer Context Resource"; -+ case RESMAN_TYPE_HW_2D_CONTEXT: -+ return "HW 2D Context Resource"; - case RESMAN_TYPE_SHARED_PB_DESC: - return "Shared Parameter Buffer Description Resource"; - -@@ -378,7 +378,12 @@ - FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_OS_USERMODE_MAPPING, 0, 0, IMG_TRUE); - - -+ FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_EVENT_OBJECT, 0, 0, IMG_TRUE); -+ -+ - FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_HW_RENDER_CONTEXT, 0, 0, IMG_TRUE); -+ FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_HW_TRANSFER_CONTEXT, 0, 0, IMG_TRUE); -+ FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_HW_2D_CONTEXT, 0, 0, IMG_TRUE); - FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_TRANSFER_CONTEXT, 0, 0, IMG_TRUE); - FreeResourceByCriteria(psProcess, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_SHARED_PB_DESC, 0, 0, IMG_TRUE); - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.c 2008-12-18 15:47:29.000000000 +0100 -@@ -1966,6 +1966,8 @@ - } - - -+ -+ - #if PAGE_TEST - static void PageTest(void* pMem, IMG_DEV_PHYADDR sDevPAddr) - { -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.h git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.h ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/mmu.h 2008-12-18 15:47:29.000000000 +0100 -@@ -27,6 +27,8 @@ - #ifndef _MMU_H_ - #define _MMU_H_ - -+#include "sgxinfokm.h" -+ - PVRSRV_ERROR - MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, IMG_DEV_PHYADDR *psPDDevPAddr); - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/pb.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/pb.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/pb.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/pb.c 2008-12-18 15:47:29.000000000 +0100 -@@ -56,11 +56,26 @@ - - psSGXDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookie)->pvDevice; - -+ -+ -+ -+#if defined(FIXME) - for(psStubPBDesc = psSGXDevInfo->psStubPBDescListKM; - psStubPBDesc != IMG_NULL; - psStubPBDesc = psStubPBDesc->psNext) - { - if(psStubPBDesc->ui32TotalPBSize == ui32TotalPBSize) -+#else -+ psStubPBDesc = psSGXDevInfo->psStubPBDescListKM; -+ if (psStubPBDesc != IMG_NULL) -+ { -+ if(psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize) -+ { -+ PVR_DPF((PVR_DBG_ERROR, -+ "SGXFindSharedPBDescKM: Shared PB requested with different size (0x%x) from existing shared PB (0x%x) - requested size ignored", -+ ui32TotalPBSize, psStubPBDesc->ui32TotalPBSize)); -+ } -+#endif - { - IMG_UINT32 i; - PRESMAN_ITEM psResItem; -@@ -125,20 +140,6 @@ - return eError; - } - --IMG_VOID ResetPBs(PVRSRV_SGXDEV_INFO* psSGXDevInfo) --{ -- PVRSRV_STUB_PBDESC **ppsStubPBDesc; -- -- for(ppsStubPBDesc = (PVRSRV_STUB_PBDESC **)&psSGXDevInfo->psStubPBDescListKM; -- *ppsStubPBDesc != IMG_NULL; -- ppsStubPBDesc = &(*ppsStubPBDesc)->psNext) -- { -- PVRSRV_STUB_PBDESC *psStubPBDesc = *ppsStubPBDesc; -- IMG_UINT32* pui32Flags = (IMG_UINT32*)psStubPBDesc->psHWPBDescKernelMemInfo->pvLinAddrKM; -- *pui32Flags |= 1; -- } --} -- - - static PVRSRV_ERROR - SGXCleanupSharedPBDescKM(PVRSRV_STUB_PBDESC *psStubPBDescIn) -@@ -266,7 +267,7 @@ - { - PVR_DPF((PVR_DBG_ERROR, - "SGXAddSharedPBDescKM: " -- "Failed to register exisitng shared " -+ "Failed to register existing shared " - "PBDesc with the resource manager")); - goto NoAddKeepPB; - } -@@ -301,7 +302,7 @@ - } - - -- psStubPBDesc->ppsSubKernelMemInfos=IMG_NULL; -+ psStubPBDesc->ppsSubKernelMemInfos = IMG_NULL; - - if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - sizeof(PVRSRV_KERNEL_MEM_INFO *) -@@ -395,8 +396,10 @@ - } - - NoAddKeepPB: -- for(i=0; i<ui32SharedPBDescSubKernelMemInfosCount; i++) -+ for (i = 0; i < ui32SharedPBDescSubKernelMemInfosCount; i++) -+ { - PVRSRVFreeDeviceMemKM(hDevCookie, ppsSharedPBDescSubKernelMemInfos[i], IMG_FALSE); -+ } - - PVRSRVFreeSharedSysMemoryKM(psSharedPBDescKernelMemInfo); - PVRSRVFreeDeviceMemKM(hDevCookie, psStubPBDesc->psHWPBDescKernelMemInfo, IMG_FALSE); -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx2dcore.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx2dcore.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx2dcore.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx2dcore.c 2008-12-18 15:47:29.000000000 +0100 -@@ -27,12 +27,15 @@ - #include "sgxdefs.h" - #include "services_headers.h" - #include "sgxinfo.h" -+#include "sgxinfokm.h" - - #if defined(SGX_FEATURE_2D_HARDWARE) - - #include "sgx2dcore.h" - --#define SGX2D_FLUSH_BH (0xF0000000) -+#define SGX2D_FLUSH_BH 0xF0000000 -+#define SGX2D_FENCE_BH 0x70000000 -+ - #define SGX2D_QUEUED_BLIT_PAD 4 - - #define SGX2D_COMMAND_QUEUE_SIZE 1024 -@@ -521,7 +524,7 @@ - - if (hCmdCookie != IMG_NULL) - { -- PVRSRVCommandCompleteKM(hCmdCookie, IMG_FALSE); -+ PVRSRVCommandCompleteKM(hCmdCookie, IMG_TRUE); - } - - PVR_DPF((PVR_DBG_CALLTRACE, "SGX2DHandle2DComplete: Exit")); -@@ -723,7 +726,7 @@ - - SGX2DWriteSlavePortBatch(psDevInfo, pui32BltData, ui32DataByteSize); - -- SGX2DWriteSlavePort(psDevInfo, EURASIA2D_FENCE_BH); -+ SGX2DWriteSlavePort(psDevInfo, SGX2D_FENCE_BH); - } - } - -@@ -817,6 +820,18 @@ - - PVR_DPF((PVR_DBG_ERROR,"SGX2DQueryBlitsCompleteKM: Timed out. Ops pending.")); - -+#if defined(DEBUG) -+ { -+ PVRSRV_SYNC_DATA *psSyncData = psSyncInfo->psSyncData; -+ -+ PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Syncinfo: %p, Syncdata: %p", psSyncInfo, psSyncData)); -+ -+ PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Read ops complete: %d, Read ops pending: %d", psSyncData->ui32ReadOpsComplete, psSyncData->ui32ReadOpsPending)); -+ PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Write ops complete: %d, Write ops pending: %d", psSyncData->ui32WriteOpsComplete, psSyncData->ui32WriteOpsPending)); -+ -+ } -+#endif -+ - return PVRSRV_ERROR_TIMEOUT; - } - #endif -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx_bridge_km.h git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx_bridge_km.h ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx_bridge_km.h 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgx_bridge_km.h 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,158 @@ -+/********************************************************************** -+ * -+ * 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(__SGX_BRIDGE_KM_H__) -+#define __SGX_BRIDGE_KM_H__ -+ -+#include "sgxapi_km.h" -+#include "sgxinfo.h" -+#include "sgxinfokm.h" -+#include "sgx_bridge.h" -+#include "pvr_bridge.h" -+#include "perproc.h" -+ -+#if defined (__cplusplus) -+extern "C" { -+#endif -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick); -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK *psKick); -+#endif -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, -+ PVR3DIF4_CCB_KICK *psCCBKick); -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXGetPhysPageAddrKM(IMG_HANDLE hDevMemHeap, -+ IMG_DEV_VIRTADDR sDevVAddr, -+ IMG_DEV_PHYADDR *pDevPAddr, -+ IMG_CPU_PHYADDR *pCpuPAddr); -+ -+IMG_IMPORT -+PVRSRV_ERROR IMG_CALLCONV SGXGetMMUPDAddrKM(IMG_HANDLE hDevCookie, -+ IMG_HANDLE hDevMemContext, -+ IMG_DEV_PHYADDR *psPDDevPAddr); -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXGetClientInfoKM(IMG_HANDLE hDevCookie, -+ PVR3DIF4_CLIENT_INFO* psClientInfo); -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ SGX_MISC_INFO *psMiscInfo); -+ -+#if defined(SUPPORT_SGX_HWPERF) -+IMG_IMPORT -+PVRSRV_ERROR SGXReadHWPerfCountersKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32PerfReg, -+ IMG_UINT32 *pui32OldPerf, -+ IMG_BOOL bNewPerf, -+ IMG_UINT32 ui32NewPerf, -+ IMG_UINT32 ui32NewPerfReset, -+ IMG_UINT32 ui32PerfCountersReg, -+ IMG_UINT32 *pui32Counters, -+ IMG_UINT32 *pui32KickTACounter, -+ IMG_UINT32 *pui32KickTARenderCounter, -+ IMG_UINT32 *pui32CPUTime, -+ IMG_UINT32 *pui32SGXTime); -+#endif -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+IMG_IMPORT -+PVRSRV_ERROR SGX2DQueueBlitKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ PVRSRV_KERNEL_SYNC_INFO *psDstSync, -+ IMG_UINT32 ui32NumSrcSyncs, -+ PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[], -+ IMG_UINT32 ui32DataByteSize, -+ IMG_UINT32 *pui32BltData); -+ -+#if defined(SGX2D_DIRECT_BLITS) -+IMG_IMPORT -+PVRSRV_ERROR SGX2DDirectBlitKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32DataByteSize, -+ IMG_UINT32 *pui32BltData); -+#endif -+#endif -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) || defined(PVR2D_ALT_2DHW) -+IMG_IMPORT -+PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, -+ IMG_BOOL bWaitForComplete); -+#endif -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, -+ SGX_BRIDGE_INFO_FOR_SRVINIT *psInitInfo); -+ -+IMG_IMPORT -+PVRSRV_ERROR DevInitSGXPart2KM(PVRSRV_PER_PROCESS_DATA *psPerProc, -+ IMG_HANDLE hDevHandle, -+ SGX_BRIDGE_INIT_INFO *psInitInfo); -+ -+IMG_IMPORT PVRSRV_ERROR -+SGXFindSharedPBDescKM(IMG_HANDLE hDevCookie, -+ IMG_UINT32 ui32TotalPBSize, -+ IMG_HANDLE *phSharedPBDesc, -+ PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescKernelMemInfo, -+ PVRSRV_KERNEL_MEM_INFO **ppsHWPBDescKernelMemInfo, -+ PVRSRV_KERNEL_MEM_INFO **ppsBlockKernelMemInfo, -+ PVRSRV_KERNEL_MEM_INFO ***pppsSharedPBDescSubKernelMemInfos, -+ IMG_UINT32 *ui32SharedPBDescSubKernelMemInfosCount); -+ -+IMG_IMPORT PVRSRV_ERROR -+SGXUnrefSharedPBDescKM(IMG_HANDLE hSharedPBDesc); -+ -+IMG_IMPORT PVRSRV_ERROR -+SGXAddSharedPBDescKM(IMG_HANDLE hDevCookie, -+ PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo, -+ PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo, -+ PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo, -+ IMG_UINT32 ui32TotalPBSize, -+ IMG_HANDLE *phSharedPBDesc, -+ PVRSRV_KERNEL_MEM_INFO **psSharedPBDescSubKernelMemInfos, -+ IMG_UINT32 ui32SharedPBDescSubKernelMemInfosCount); -+ -+ -+IMG_IMPORT PVRSRV_ERROR -+SGXGetInternalDevInfoKM(IMG_HANDLE hDevCookie, -+ PVR3DIF4_INTERNAL_DEVINFO *psSGXInternalDevInfo); -+ -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+#define SGX2D_MAX_BLT_CMD_SIZ 256 -+#endif -+ -+#if defined (__cplusplus) -+} -+#endif -+ -+#endif -+ -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinfokm.h git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinfokm.h ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinfokm.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinfokm.h 2008-12-18 15:47:29.000000000 +0100 -@@ -45,14 +45,152 @@ - - #define PVRSRV_USSE_EDM_RESMAN_CLEANUP_RT_REQUEST 0x01 - #define PVRSRV_USSE_EDM_RESMAN_CLEANUP_RC_REQUEST 0x02 --#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE 0x04 --#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD 0x10 --#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT 0x20 -+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_TC_REQUEST 0x04 -+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_2DC_REQUEST 0x08 -+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE 0x10 -+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD 0x20 -+#define PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT 0x40 -+ -+typedef struct _PVRSRV_SGXDEV_INFO_ -+{ -+ PVRSRV_DEVICE_TYPE eDeviceType; -+ PVRSRV_DEVICE_CLASS eDeviceClass; -+ -+ IMG_UINT8 ui8VersionMajor; -+ IMG_UINT8 ui8VersionMinor; -+ IMG_UINT32 ui32CoreConfig; -+ IMG_UINT32 ui32CoreFlags; -+ -+ -+ IMG_PVOID pvRegsBaseKM; -+ -+ -+ -+ IMG_HANDLE hRegMapping; -+ -+ -+ IMG_SYS_PHYADDR sRegsPhysBase; -+ -+ IMG_UINT32 ui32RegSize; -+ -+ -+ IMG_UINT32 ui32CoreClockSpeed; -+ IMG_UINT32 ui32uKernelTimerClock; -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+ -+ SGX_SLAVE_PORT s2DSlavePortKM; -+ -+ -+ PVRSRV_RESOURCE s2DSlaveportResource; -+ -+ -+ IMG_UINT32 ui322DFifoSize; -+ IMG_UINT32 ui322DFifoOffset; -+ -+ IMG_HANDLE h2DCmdCookie; -+ -+ IMG_HANDLE h2DQueue; -+ IMG_BOOL b2DHWRecoveryInProgress; -+ IMG_BOOL b2DHWRecoveryEndPending; -+ IMG_UINT32 ui322DCompletedBlits; -+ IMG_BOOL b2DLockupSuspected; -+#endif -+ -+ -+ IMG_VOID *psStubPBDescListKM; -+ -+ -+ -+ IMG_DEV_PHYADDR sKernelPDDevPAddr; -+ -+ IMG_VOID *pvDeviceMemoryHeap; -+ PPVRSRV_KERNEL_MEM_INFO psKernelCCBMemInfo; -+ PVRSRV_SGX_KERNEL_CCB *psKernelCCB; -+ PPVRSRV_SGX_CCB_INFO psKernelCCBInfo; -+ PPVRSRV_KERNEL_MEM_INFO psKernelCCBCtlMemInfo; -+ PVRSRV_SGX_CCB_CTL *psKernelCCBCtl; -+ PPVRSRV_KERNEL_MEM_INFO psKernelCCBEventKickerMemInfo; -+ IMG_UINT32 *pui32KernelCCBEventKicker; -+ IMG_UINT32 ui32TAKickAddress; -+ IMG_UINT32 ui32TexLoadKickAddress; -+ IMG_UINT32 ui32VideoHandlerAddress; -+#if defined(SGX_SUPPORT_HWPROFILING) -+ PPVRSRV_KERNEL_MEM_INFO psKernelHWProfilingMemInfo; -+#endif -+ IMG_UINT32 ui32KickTACounter; -+ IMG_UINT32 ui32KickTARenderCounter; -+#if defined(SUPPORT_SGX_HWPERF) -+ PPVRSRV_KERNEL_MEM_INFO psKernelHWPerfCBMemInfo; -+#endif - -+ -+ IMG_UINT32 ui32ClientRefCount; - -+ -+ IMG_UINT32 ui32CacheControl; - -+ - - -+ IMG_VOID *pvMMUContextList; -+ -+ -+ IMG_BOOL bForcePTOff; -+ -+ IMG_UINT32 ui32EDMTaskReg0; -+ IMG_UINT32 ui32EDMTaskReg1; -+ -+ IMG_UINT32 ui32ClkGateCtl; -+ IMG_UINT32 ui32ClkGateCtl2; -+ IMG_UINT32 ui32ClkGateStatusMask; -+ SGX_INIT_SCRIPTS sScripts; -+ -+ -+ IMG_HANDLE hBIFResetPDOSMemHandle; -+ IMG_DEV_PHYADDR sBIFResetPDDevPAddr; -+ IMG_DEV_PHYADDR sBIFResetPTDevPAddr; -+ IMG_DEV_PHYADDR sBIFResetPageDevPAddr; -+ IMG_UINT32 *pui32BIFResetPD; -+ IMG_UINT32 *pui32BIFResetPT; -+ -+ -+#if defined(SUPPORT_HW_RECOVERY) -+ -+ IMG_HANDLE hTimer; -+ -+ IMG_UINT32 ui32TimeStamp; -+#endif -+ -+ -+ IMG_UINT32 ui32NumResets; -+ -+ PVRSRV_KERNEL_MEM_INFO *psKernelSGXHostCtlMemInfo; -+ PVRSRV_SGX_HOST_CTL *psSGXHostCtl; -+ -+ IMG_UINT32 ui32Flags; -+ -+ -+ IMG_UINT32 ui32RegFlags; -+ -+ #if defined(PDUMP) -+ PVRSRV_SGX_PDUMP_CONTEXT sPDContext; -+ #endif -+ -+#if defined(SUPPORT_SGX_MMU_DUMMY_PAGE) -+ -+ IMG_VOID *pvDummyPTPageCpuVAddr; -+ IMG_DEV_PHYADDR sDummyPTDevPAddr; -+ IMG_HANDLE hDummyPTPageOSMemHandle; -+ IMG_VOID *pvDummyDataPageCpuVAddr; -+ IMG_DEV_PHYADDR sDummyDataDevPAddr; -+ IMG_HANDLE hDummyDataPageOSMemHandle; -+#endif -+ -+ IMG_UINT32 asSGXDevData[SGX_MAX_DEV_DATA]; -+ -+} PVRSRV_SGXDEV_INFO; -+ - - typedef struct _SGX_TIMING_INFORMATION_ - { -@@ -122,10 +260,8 @@ - - PVRSRV_ERROR SGXRegisterDevice (PVRSRV_DEVICE_NODE *psDeviceNode); - -- - IMG_VOID SGXOSTimer(IMG_VOID *pvData); - --IMG_VOID ResetPBs(PVRSRV_SGXDEV_INFO *psDevInfo); - #if defined(NO_HARDWARE) - static INLINE IMG_VOID NoHardwareGenerateEvent(PVRSRV_SGXDEV_INFO *psDevInfo, - IMG_UINT32 ui32StatusRegister, -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c 2008-12-18 15:47:29.000000000 +0100 -@@ -54,23 +54,16 @@ - #endif - - IMG_BOOL SGX_ISRHandler(IMG_VOID *pvData); --IMG_VOID SGXScheduleProcessQueues(IMG_VOID *pvData); - - IMG_UINT32 gui32EventStatusServicesByISR = 0; - --static IMG_VOID ResetSGX(PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_UINT32 ui32PDUMPFlags); -+IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32PDUMPFlags); - --PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_BOOL bHardwareRecovery); -+static PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_BOOL bHardwareRecovery); - PVRSRV_ERROR SGXDeinitialise(IMG_HANDLE hDevCookie); - --#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) --#define SGX_BIF_DIR_LIST_INDEX_EDM 15 --#define SGX_BIF_DIR_LIST_REG_EDM EUR_CR_BIF_DIR_LIST_BASE15 --#else --#define SGX_BIF_DIR_LIST_REG_EDM EUR_CR_BIF_DIR_LIST_BASE0 --#endif - - static IMG_VOID SGXCommandComplete(PVRSRV_DEVICE_NODE *psDeviceNode) - { -@@ -116,6 +109,9 @@ - #if defined(SGX_SUPPORT_HWPROFILING) - psDevInfo->psKernelHWProfilingMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelHWProfilingMemInfo; - #endif -+#if defined(SUPPORT_SGX_HWPERF) -+ psDevInfo->psKernelHWPerfCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelHWPerfCBMemInfo; -+#endif - - - -@@ -124,7 +120,7 @@ - (IMG_VOID **)&psKernelCCBInfo, 0); - if (eError != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR,"DevInitSGXPart2KM: Failed to alloc memory")); -+ PVR_DPF((PVR_DBG_ERROR,"InitDevInfo: Failed to alloc memory")); - goto failed_allockernelccb; - } - -@@ -151,7 +147,9 @@ - - psDevInfo->ui32EDMTaskReg0 = psInitInfo->ui32EDMTaskReg0; - psDevInfo->ui32EDMTaskReg1 = psInitInfo->ui32EDMTaskReg1; -- psDevInfo->ui32ClockGateMask = psInitInfo->ui32ClockGateMask; -+ psDevInfo->ui32ClkGateCtl = psInitInfo->ui32ClkGateCtl; -+ psDevInfo->ui32ClkGateCtl2 = psInitInfo->ui32ClkGateCtl2; -+ psDevInfo->ui32ClkGateStatusMask = psInitInfo->ui32ClkGateStatusMask; - - - -@@ -183,10 +181,20 @@ - if (eNewPowerState == PVRSRV_POWER_STATE_D3) - { - PVRSRV_SGX_HOST_CTL *psSGXHostCtl = psDevInfo->psSGXHostCtl; -- #if defined (SGX_FEATURE_AUTOCLOCKGATING) && (!defined(NO_HARDWARE) || defined(PDUMP)) -- IMG_UINT32 ui32ClockMask = psDevInfo->ui32ClockGateMask; -+ -+ #if defined (SGX_FEATURE_AUTOCLOCKGATING) && (!defined(NO_HARDWARE) || defined(PDUMP)) -+ IMG_UINT32 ui32ClockMask = psDevInfo->ui32ClkGateStatusMask; - #endif - -+#if defined(SUPPORT_HW_RECOVERY) -+ -+ if (OSDisableTimer(psDevInfo->hTimer) != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR,"SGXPrePowerState: Failed to disable timer")); -+ return PVRSRV_ERROR_GENERIC; -+ } -+#endif -+ - - psSGXHostCtl->ui32PowManFlags |= PVRSRV_USSE_EDM_POWMAN_POWEROFF_REQUEST; - -@@ -202,7 +210,7 @@ - MAX_HW_TIME_US/WAIT_TRY_COUNT, - WAIT_TRY_COUNT) != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR,"Wait for chip power off failed.")); -+ PVR_DPF((PVR_DBG_ERROR,"SGXPrePowerState: Wait for chip power off failed.")); - } - #endif - -@@ -229,7 +237,7 @@ - MAX_HW_TIME_US/WAIT_TRY_COUNT, - WAIT_TRY_COUNT) != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR,"Wait for chip idle failed.")); -+ PVR_DPF((PVR_DBG_ERROR,"SGXPrePowerState: Wait for chip idle failed.")); - } - #endif - PDUMPREGPOL(EUR_CR_CLKGATESTATUS, 0, ui32ClockMask); -@@ -278,6 +286,14 @@ - PVR_DPF((PVR_DBG_ERROR,"SGXPostPowerState: SGXInitialise failed")); - return eError; - } -+#if defined(SUPPORT_HW_RECOVERY) -+ eError = OSEnableTimer(psDevInfo->hTimer); -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR,"SGXPostPowerState : Failed to enable host timer")); -+ return PVRSRV_ERROR_GENERIC; -+ } -+#endif - } - - PVR_DPF((PVR_DBG_WARNING, -@@ -288,8 +304,6 @@ - return PVRSRV_OK; - } - --#define SCRIPT_DATA(pData, offset, type) (*((type *)(((char *)pData) + offset))) --#define SCRIPT_DATA_UI32(pData, offset) SCRIPT_DATA(pData, offset, IMG_UINT32) - - static PVRSRV_ERROR SGXRunScript(PVRSRV_SGXDEV_INFO *psDevInfo, SGX_INIT_COMMAND *psScript, IMG_UINT32 ui32NumInitCommands) - { -@@ -333,14 +347,18 @@ - return PVRSRV_ERROR_GENERIC;; - } - --PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_BOOL bHardwareRecovery) -+static PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_BOOL bHardwareRecovery) - { - PVRSRV_ERROR eError; - IMG_UINT32 ui32ReadOffset, ui32WriteOffset; - - -- ResetSGX(psDevInfo, PDUMP_FLAGS_CONTINUOUS); -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_CLKGATECTL, psDevInfo->ui32ClkGateCtl); -+ PDUMPREGWITHFLAGS(EUR_CR_CLKGATECTL, psDevInfo->ui32ClkGateCtl, PDUMP_FLAGS_CONTINUOUS); -+ -+ -+ SGXReset(psDevInfo, PDUMP_FLAGS_CONTINUOUS); - - - *psDevInfo->pui32KernelCCBEventKicker = 0; -@@ -381,12 +399,14 @@ - 0, - PVRSRV_USSE_EDM_INTERRUPT_HWR, - MAX_HW_TIME_US/WAIT_TRY_COUNT, -- WAIT_TRY_COUNT) != PVRSRV_OK) -+ 1000) != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR, "HWRecoveryResetSGXEDM: Wait for uKernel HW Recovery failed")); -+ PVR_DPF((PVR_DBG_ERROR, "SGXInitialise: Wait for uKernel HW Recovery failed")); -+ return PVRSRV_ERROR_RETRY; - } - } - -+ - - - -@@ -426,259 +446,6 @@ - } - - --static IMG_VOID ResetSGXSleep(PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_UINT32 ui32PDUMPFlags, -- IMG_BOOL bPDump) --{ --#if !defined(PDUMP) -- PVR_UNREFERENCED_PARAMETER(ui32PDUMPFlags); --#endif -- -- -- OSWaitus(1000 * 1000000 / psDevInfo->ui32CoreClockSpeed); -- if (bPDump) -- { -- PDUMPIDLWITHFLAGS(1000, ui32PDUMPFlags); -- } --} -- -- --static IMG_VOID ResetSGX(PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_UINT32 ui32PDUMPFlags) --{ -- IMG_UINT32 ui32RegVal; -- -- const IMG_UINT32 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; -- -- const IMG_UINT32 ui32BifInvalDCVal = EUR_CR_BIF_CTRL_INVALDC_MASK; -- -- const IMG_UINT32 ui32BifFaultMask = -- EUR_CR_BIF_INT_STAT_FAULT_MASK; -- --#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -- IMG_UINT32 ui32BIFCtrl; --#if defined(EUR_CR_BIF_MEM_ARB_CONFIG) -- IMG_UINT32 ui32BIFMemArb; --#endif --#endif -- --#ifndef PDUMP -- PVR_UNREFERENCED_PARAMETER(ui32PDUMPFlags); --#endif -- -- psDevInfo->ui32NumResets++; -- -- 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); -- -- ResetSGXSleep(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); -- -- ResetSGXSleep(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); -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- } --#endif -- -- -- ui32RegVal = ui32SoftResetRegVal | EUR_CR_SOFT_RESET_BIF_RESET_MASK; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32RegVal, ui32PDUMPFlags); -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- -- -- --#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -- ui32RegVal = 0; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK_SET, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_BANK_SET, ui32RegVal, ui32PDUMPFlags); -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_BANK0, ui32RegVal, ui32PDUMPFlags); -- --#if defined(EUR_CR_BIF_MEM_ARB_CONFIG) -- -- -- ui32BIFMemArb = (12UL << EUR_CR_BIF_MEM_ARB_CONFIG_PAGE_SIZE_SHIFT) | -- (7UL << EUR_CR_BIF_MEM_ARB_CONFIG_BEST_CNT_SHIFT) | -- (12UL << EUR_CR_BIF_MEM_ARB_CONFIG_TTE_THRESH_SHIFT); -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_MEM_ARB_CONFIG, ui32BIFMemArb); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_MEM_ARB_CONFIG, ui32BIFMemArb, ui32PDUMPFlags); --#endif --#endif -- -- -- -- -- -- -- -- ui32RegVal = psDevInfo->sBIFResetPDDevPAddr.uiAddr; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_DIR_LIST_BASE0, ui32RegVal); -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -- -- -- ui32RegVal = ui32SoftResetRegVal; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32RegVal, ui32PDUMPFlags); -- -- -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32BifInvalDCVal); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -- ui32RegVal = 0; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32RegVal); -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- -- -- -- -- for (;;) -- { -- IMG_UINT32 ui32BifIntStat = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_INT_STAT); -- IMG_DEV_VIRTADDR sBifFault; -- IMG_UINT32 ui32PDIndex, ui32PTIndex; -- -- if ((ui32BifIntStat & ui32BifFaultMask) == 0) -- { -- break; -- } -- -- -- -- -- -- -- -- sBifFault.uiAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_FAULT); -- PVR_DPF((PVR_DBG_WARNING, "ResetSGX: Page fault 0x%x/0x%x", ui32BifIntStat, sBifFault.uiAddr)); -- ui32PDIndex = sBifFault.uiAddr >> (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT); -- ui32PTIndex = (sBifFault.uiAddr & SGX_MMU_PT_MASK) >> SGX_MMU_PAGE_SHIFT; -- -- -- ui32RegVal = ui32SoftResetRegVal | EUR_CR_SOFT_RESET_BIF_RESET_MASK; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- -- -- psDevInfo->pui32BIFResetPD[ui32PDIndex] = psDevInfo->sBIFResetPTDevPAddr.uiAddr | SGX_MMU_PDE_VALID; -- psDevInfo->pui32BIFResetPT[ui32PTIndex] = psDevInfo->sBIFResetPageDevPAddr.uiAddr | SGX_MMU_PTE_VALID; -- -- -- ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_STATUS); -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR, ui32RegVal); -- ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_STATUS2); -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR2, ui32RegVal); -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -- -- -- ui32RegVal = ui32SoftResetRegVal; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -- -- -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32BifInvalDCVal); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -- ui32RegVal = 0; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32RegVal); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -- -- -- psDevInfo->pui32BIFResetPD[ui32PDIndex] = 0; -- psDevInfo->pui32BIFResetPT[ui32PTIndex] = 0; -- } -- -- -- -- --#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -- -- ui32BIFCtrl = (SGX_BIF_DIR_LIST_INDEX_EDM << EUR_CR_BIF_BANK0_INDEX_EDM_SHIFT); --#ifdef SGX_FEATURE_2D_HARDWARE -- -- ui32BIFCtrl |= (SGX_BIF_DIR_LIST_INDEX_EDM << EUR_CR_BIF_BANK0_INDEX_2D_SHIFT); --#endif --#if defined(FIX_HW_BRN_23410) -- -- ui32BIFCtrl |= (SGX_BIF_DIR_LIST_INDEX_EDM << EUR_CR_BIF_BANK0_INDEX_TA_SHIFT); --#endif -- -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0, ui32BIFCtrl); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_BANK0, ui32BIFCtrl, ui32PDUMPFlags); --#endif -- -- -- 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); -- --#ifdef SGX_FEATURE_2D_HARDWARE -- -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_TWOD_REQ_BASE, SGX_2D_HEAP_BASE); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_TWOD_REQ_BASE, SGX_2D_HEAP_BASE, ui32PDUMPFlags); --#endif -- --#if !defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -- -- ui32RegVal = ui32SoftResetRegVal | EUR_CR_SOFT_RESET_BIF_RESET_MASK; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32RegVal, ui32PDUMPFlags); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- -- ui32RegVal = ui32SoftResetRegVal; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32RegVal, ui32PDUMPFlags); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); --#endif -- -- -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32BifInvalDCVal); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32BifInvalDCVal, ui32PDUMPFlags); -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- -- ui32RegVal = 0; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags); -- -- PVR_DPF((PVR_DBG_WARNING,"Soft Reset of SGX")); -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- -- -- ui32RegVal = 0; -- OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -- PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32RegVal, ui32PDUMPFlags); -- -- -- ResetSGXSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -- -- PDUMPCOMMENTWITHFLAGS(ui32PDUMPFlags, "End of SGX reset sequence\r\n"); --} -- - static PVRSRV_ERROR DevInitSGXPart1 (IMG_VOID *pvDeviceNode) - { - PVRSRV_SGXDEV_INFO *psDevInfo; -@@ -730,6 +497,7 @@ - - psDevInfo->sKernelPDDevPAddr = sPDDevPAddr; - -+ - - for(i=0; i<psDeviceNode->sDevMemoryInfo.ui32HeapCount; i++) - { -@@ -759,25 +527,6 @@ - return PVRSRV_ERROR_GENERIC; - } - --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- -- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, -- sizeof(PVRSRV_EVENTOBJECT) , -- (IMG_VOID **)&psDevInfo->psSGXEventObject, 0) != PVRSRV_OK) -- { -- -- PVR_DPF((PVR_DBG_ERROR,"DevInitSGXPart1 : Failed to alloc memory for event object")); -- return (PVRSRV_ERROR_OUT_OF_MEMORY); -- } -- -- if(OSEventObjectCreate("PVRSRV_EVENTOBJECT_SGX", psDevInfo->psSGXEventObject) != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"DevInitSGXPart1 : Failed to create event object")); -- return (PVRSRV_ERROR_OUT_OF_MEMORY); -- -- } --#endif -- - return PVRSRV_OK; - } - -@@ -816,9 +565,10 @@ - - - psDevInfo->ui32CoreClockSpeed = psSGXTimingInfo->ui32CoreClockSpeed; -+ psDevInfo->ui32uKernelTimerClock = psSGXTimingInfo->ui32CoreClockSpeed / psSGXTimingInfo->ui32uKernelFreq; - - -- psInitInfo->ui32uKernelTimerClock = psSGXTimingInfo->ui32CoreClockSpeed / psSGXTimingInfo->ui32uKernelFreq; -+ psInitInfo->ui32uKernelTimerClock = psDevInfo->ui32uKernelTimerClock; - #if defined(SUPPORT_HW_RECOVERY) - psInitInfo->ui32HWRecoverySampleRate = psSGXTimingInfo->ui32uKernelFreq / psSGXTimingInfo->ui32HWRecoveryFreq; - #endif -@@ -970,7 +720,6 @@ - #endif - - -- - - - OSMemSet(psDevInfo->psKernelCCB, 0, sizeof(PVRSRV_SGX_KERNEL_CCB)); -@@ -983,27 +732,16 @@ - PDUMPCOMMENT("Kernel CCB Event Kicker"); - PDUMPMEM(IMG_NULL, psDevInfo->psKernelCCBEventKickerMemInfo, 0, sizeof(*psDevInfo->pui32KernelCCBEventKicker), PDUMP_FLAGS_CONTINUOUS, MAKEUNIQUETAG(psDevInfo->psKernelCCBEventKickerMemInfo)); - -- -+#if defined(SUPPORT_HW_RECOVERY) - -- eError = PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex, -- PVRSRV_POWER_Unspecified, -- KERNEL_ID, IMG_FALSE); -- if (eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"DevInitSGXPart2KM: Failed PVRSRVSetDevicePowerStateKM call")); -- return eError; -- } - --#if defined(SUPPORT_HW_RECOVERY) -+ -+ psDevInfo->hTimer = OSAddTimer(SGXOSTimer, psDeviceNode, -+ 1000 * 50 / psSGXDeviceMap->sTimingInfo.ui32uKernelFreq); -+ if(psDevInfo->hTimer == IMG_NULL) - { -- SGX_TIMING_INFORMATION* psSGXTimingInfo = & psSGXDeviceMap->sTimingInfo; -- -- psDevInfo->hTimer = OSAddTimer(SGXOSTimer, psDeviceNode, 1000 * 50 / psSGXTimingInfo->ui32uKernelFreq); -- if(psDevInfo->hTimer == IMG_NULL) -- { -- PVR_DPF((PVR_DBG_ERROR,"OSAddTimer : Failed to register timer callback function")); -- return PVRSRV_ERROR_GENERIC; -- } -+ PVR_DPF((PVR_DBG_ERROR,"DevInitSGXPart2KM : Failed to register timer callback function")); -+ return PVRSRV_ERROR_GENERIC; - } - #endif - -@@ -1030,38 +768,17 @@ - } - - #if defined(SUPPORT_HW_RECOVERY) -- -- if(psDevInfo->hTimer) -- { -- eError = OSRemoveTimer (psDevInfo->hTimer); -- if (eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"DevDeInitSGX: Failed to remove timer")); -- return eError; -- } -- } --#endif -- -- MMU_BIFResetPDFree(psDevInfo); -- -- -- -- -- -- -- -- --#if !defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -- -- eError = SGXDeinitialise((IMG_HANDLE)psDevInfo); -+ eError = OSRemoveTimer(psDevInfo->hTimer); - if (eError != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR,"DevDeInitSGX: SGXDeinitialise failed")); -- return eError; -+ PVR_DPF((PVR_DBG_ERROR,"DevDeInitSGX: Failed to remove timer")); -+ return eError; - } -+ psDevInfo->hTimer = IMG_NULL; - #endif - - -+ MMU_BIFResetPDFree(psDevInfo); - - - -@@ -1146,23 +863,14 @@ - #endif - - --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- -- if(psDevInfo->psSGXEventObject) -- { -- OSEventObjectDestroy(psDevInfo->psSGXEventObject); -- OSFreeMem( PVRSRV_OS_PAGEABLE_HEAP, -- sizeof(PVRSRV_EVENTOBJECT) , -- psDevInfo->psSGXEventObject, 0); -- } --#endif - - - OSFreePages(PVRSRV_OS_PAGEABLE_HEAP|PVRSRV_HAP_MULTI_PROCESS, - sizeof(PVRSRV_SGXDEV_INFO), - psDevInfo, - hDevInfoOSMemHandle); -- -+ psDeviceNode->pvDevice = IMG_NULL; -+ - if (psDeviceMemoryHeap != IMG_NULL) - { - -@@ -1178,47 +886,17 @@ - - - --IMG_VOID HWRecoveryResetSGX (PVRSRV_SGXDEV_INFO *psDevInfo, -- IMG_UINT32 ui32Component, -- IMG_UINT32 ui32CallerID) --{ -- PVRSRV_ERROR eError; -- -- PVR_UNREFERENCED_PARAMETER(ui32Component); -- PVR_UNREFERENCED_PARAMETER(ui32CallerID); -- -- -- PVR_DPF((PVR_DBG_ERROR, "HWRecoveryResetSGX: SGX Hardware Recovery triggered")); -- -- -- PDUMPSUSPEND(); -- -- -- ResetPBs(psDevInfo); -- -- -- eError = SGXInitialise(psDevInfo, IMG_TRUE); -- if (eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"HWRecoveryResetSGX: SGXInitialise failed (%d)", eError)); -- } -- -- -- PDUMPRESUME(); --} -- -- --IMG_VOID HWRecoveryResetSGXEDM (PVRSRV_DEVICE_NODE *psDeviceNode, -- IMG_UINT32 ui32Component, -+#if defined(SYS_USING_INTERRUPTS) || defined(SUPPORT_HW_RECOVERY) -+static IMG_VOID HWRecoveryResetSGX (PVRSRV_DEVICE_NODE *psDeviceNode, -+ IMG_UINT32 ui32Component, - IMG_UINT32 ui32CallerID) - { - PVRSRV_ERROR eError; - PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO*)psDeviceNode->pvDevice; - PVRSRV_SGX_HOST_CTL *psSGXHostCtl = (PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl; - --#if defined(SGX_FEATURE_2D_HARDWARE) -- SGX2DHWRecoveryStart(psDevInfo); --#endif -+ PVR_UNREFERENCED_PARAMETER(ui32Component); -+ - - - eError = PVRSRVPowerLock(ui32CallerID, IMG_FALSE); -@@ -1227,15 +905,32 @@ - - - -- PVR_DPF((PVR_DBG_WARNING,"HWRecoveryResetSGXEDM: Power transition in progress")); -+ PVR_DPF((PVR_DBG_WARNING,"HWRecoveryResetSGX: Power transition in progress")); - return; - } - - psSGXHostCtl->ui32InterruptClearFlags |= PVRSRV_USSE_EDM_INTERRUPT_HWR; - -+ PVR_DPF((PVR_DBG_ERROR, "HWRecoveryResetSGX: SGX Hardware Recovery triggered")); - -- HWRecoveryResetSGX(psDevInfo, ui32Component, ui32CallerID); -+ -+ -+ PDUMPSUSPEND(); - -+ -+ do -+ { -+ eError = SGXInitialise(psDevInfo, IMG_TRUE); -+ } -+ while (eError == PVRSRV_ERROR_RETRY); -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR,"HWRecoveryResetSGX: SGXInitialise failed (%d)", eError)); -+ } -+ -+ -+ PDUMPRESUME(); -+ - PVRSRVPowerUnlock(ui32CallerID); - - -@@ -1244,11 +939,9 @@ - - - PVRSRVProcessQueues(ui32CallerID, IMG_TRUE); -- --#if defined(SGX_FEATURE_2D_HARDWARE) -- SGX2DHWRecoveryEnd(psDevInfo); --#endif - } -+#endif -+ - - #if defined(SUPPORT_HW_RECOVERY) - IMG_VOID SGXOSTimer(IMG_VOID *pvData) -@@ -1261,10 +954,6 @@ - IMG_UINT32 ui32CurrentEDMTasks; - IMG_BOOL bLockup = IMG_FALSE; - IMG_BOOL bPoweredDown; --#if defined(SGX_FEATURE_2D_HARDWARE) -- IMG_UINT32 ui322DCompletedBlits = 0; -- IMG_BOOL b2DCoreIsBusy; --#endif - - - psDevInfo->ui32TimeStamp++; -@@ -1305,42 +994,6 @@ - } - } - --#if defined(SGX_FEATURE_2D_HARDWARE) -- if (!bPoweredDown) -- { -- ui322DCompletedBlits = psDevInfo->ui322DCompletedBlits; -- psDevInfo->ui322DCompletedBlits = SGX2DCompletedBlits(psDevInfo); -- } -- -- if (!bLockup && !bPoweredDown) -- { -- b2DCoreIsBusy = SGX2DIsBusy(psDevInfo); -- -- if (b2DCoreIsBusy && ui322DCompletedBlits == psDevInfo->ui322DCompletedBlits) -- { -- if (psDevInfo->b2DLockupSuspected) -- { -- PVR_DPF((PVR_DBG_ERROR, "SGXTimer() detects 2D lockup (%d blits completed)", psDevInfo->ui322DCompletedBlits)); -- bLockup = IMG_TRUE; -- psDevInfo->b2DLockupSuspected = IMG_FALSE; -- } -- else -- { -- -- psDevInfo->b2DLockupSuspected = IMG_TRUE; -- } -- } -- else -- { -- psDevInfo->b2DLockupSuspected = IMG_FALSE; -- } -- } -- else -- { -- psDevInfo->b2DLockupSuspected = IMG_FALSE; -- } --#endif -- - if (bLockup) - { - PVRSRV_SGX_HOST_CTL *psSGXHostCtl = (PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl; -@@ -1349,7 +1002,7 @@ - psSGXHostCtl->ui32HostDetectedLockups ++; - - -- HWRecoveryResetSGXEDM(psDeviceNode, 0, KERNEL_ID); -+ HWRecoveryResetSGX(psDeviceNode, 0, KERNEL_ID); - } - } - #endif -@@ -1394,14 +1047,6 @@ - ui32EventClear |= EUR_CR_EVENT_HOST_CLEAR_SW_EVENT_MASK; - } - --#if defined(SGX_FEATURE_2D_HARDWARE) -- if (ui32EventStatus & EUR_CR_EVENT_STATUS_TWOD_COMPLETE_MASK) -- { -- ui32EventClear |= EUR_CR_EVENT_HOST_CLEAR_TWOD_COMPLETE_MASK; -- SGX2DHandle2DComplete(psDevInfo); -- } --#endif -- - if (ui32EventClear) - { - bInterruptProcessed = IMG_TRUE; -@@ -1420,7 +1065,6 @@ - - IMG_VOID SGX_MISRHandler (IMG_VOID *pvData) - { -- PVRSRV_ERROR eError = PVRSRV_OK; - PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *)pvData; - PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO*)psDeviceNode->pvDevice; - PVRSRV_SGX_HOST_CTL *psSGXHostCtl = (PVRSRV_SGX_HOST_CTL *)psDevInfo->psSGXHostCtl; -@@ -1428,64 +1072,12 @@ - if ((psSGXHostCtl->ui32InterruptFlags & PVRSRV_USSE_EDM_INTERRUPT_HWR) && - !(psSGXHostCtl->ui32InterruptClearFlags & PVRSRV_USSE_EDM_INTERRUPT_HWR)) - { -- HWRecoveryResetSGXEDM(psDeviceNode, 0, ISR_ID); -+ HWRecoveryResetSGX(psDeviceNode, 0, ISR_ID); - } - -- if ((eError == PVRSRV_OK) && -- (psSGXHostCtl->ui32InterruptFlags & PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER) && -- !(psSGXHostCtl->ui32PowManFlags & PVRSRV_USSE_EDM_POWMAN_POWEROFF_REQUEST)) -- { -- -- - #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -- { -- -- -- PDUMPSUSPEND(); -- -- eError = PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex, -- PVRSRV_POWER_STATE_D3, -- ISR_ID, IMG_FALSE); -- if (eError == PVRSRV_OK) -- { -- if ((*(volatile IMG_UINT32 *)(&psSGXHostCtl->ui32PowManFlags) -- & PVRSRV_USSE_EDM_POWMAN_POWEROFF_RESTART_IMMEDIATE) != 0) -- { -- -- -- -- psDeviceNode->bReProcessDeviceCommandComplete = IMG_TRUE; -- } -- } -- else if (eError == PVRSRV_ERROR_RETRY) -- { -- -- -- eError = PVRSRV_OK; -- } -- -- -- PDUMPRESUME(); -- } -+ SGXTestActivePowerEvent(psDeviceNode, ISR_ID); - #endif -- } -- --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- if (psDevInfo->psSGXEventObject) -- { -- PVRSRV_EVENTOBJECT *psEventObject = psDevInfo->psSGXEventObject; -- if(psEventObject->hOSEventKM) -- { -- OSEventObjectSignal(psEventObject->hOSEventKM); -- } -- } -- --#endif -- -- if (eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR, "SGX_MISRHandler error:%lu", eError)); -- } - } - #endif - -@@ -1494,7 +1086,6 @@ - { - DEVICE_MEMORY_INFO *psDevMemoryInfo; - DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; -- IMG_BOOL bSharedPB = IMG_TRUE; - - - psDeviceNode->sDevId.eDeviceType = DEV_DEVICE_TYPE; -@@ -1684,13 +1275,8 @@ - | PVRSRV_HAP_MULTI_PROCESS; - psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].pszName = "CacheCoherent"; - psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].pszBSName = "CacheCoherent BS"; --#if defined(SGX535) - - psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].DevMemHeapType = DEVICE_MEMORY_HEAP_SHARED_EXPORTED; --#else -- -- psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].DevMemHeapType = DEVICE_MEMORY_HEAP_SHARED_EXPORTED; --#endif - - - psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32HeapID = HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_3DPARAMETERS_HEAP_ID); -@@ -1698,32 +1284,23 @@ - psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32HeapSize = SGX_3DPARAMETERS_HEAP_SIZE; - psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].pszName = "3DParameters"; - psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].pszBSName = "3DParameters BS"; -- -- -- if(bSharedPB) -- { -- psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32Attribs = PVRSRV_HAP_WRITECOMBINE -- | PVRSRV_MEM_RAM_BACKED_ALLOCATION --#if 0 -- | PVRSRV_HAP_KERNEL_ONLY; -+#if defined(SUPPORT_PERCONTEXT_PB) -+ psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32Attribs = PVRSRV_HAP_WRITECOMBINE -+ | PVRSRV_MEM_RAM_BACKED_ALLOCATION -+ | PVRSRV_HAP_SINGLE_PROCESS; -+ psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType = DEVICE_MEMORY_HEAP_PERCONTEXT; - #else -- | PVRSRV_HAP_MULTI_PROCESS; --#endif -- psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType = DEVICE_MEMORY_HEAP_SHARED_EXPORTED; -- } -- else -- { -- psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32Attribs = PVRSRV_HAP_WRITECOMBINE -- | PVRSRV_MEM_RAM_BACKED_ALLOCATION -- | PVRSRV_HAP_SINGLE_PROCESS; -- psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType = DEVICE_MEMORY_HEAP_PERCONTEXT; -- } -+ psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32Attribs = PVRSRV_HAP_WRITECOMBINE -+ | PVRSRV_MEM_RAM_BACKED_ALLOCATION -+ | PVRSRV_HAP_MULTI_PROCESS; -+ psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType = DEVICE_MEMORY_HEAP_SHARED_EXPORTED; -+#endif - - - 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_SINGLE_PROCESS; -+ 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"; - -@@ -1767,23 +1344,7 @@ - - - psClientInfo->ui32ProcessID = OSGetCurrentProcessIDKM(); --#if defined(SGX_FEATURE_2D_HARDWARE) -- psClientInfo->s2DSlavePort = psDevInfo->s2DSlavePortKM; --#endif -- psClientInfo->pvRegsBase = psDevInfo->pvRegsBaseKM; - --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- if (psDevInfo->psSGXEventObject) -- { -- PVRSRV_EVENTOBJECT *psEventObject = psDevInfo->psSGXEventObject; -- psClientInfo->hOSEventKM = psEventObject->hOSEventKM; -- } -- else -- { -- psClientInfo->hOSEventKM = IMG_NULL; -- } --#endif -- - - - OSMemCopy(&psClientInfo->asDevData, &psDevInfo->asSGXDevData, sizeof(psClientInfo->asDevData)); -@@ -1792,13 +1353,48 @@ - return PVRSRV_OK; - } - -+ - IMG_EXPORT --PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, SGX_MISC_INFO *psMiscInfo) -+PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ SGX_MISC_INFO *psMiscInfo) - { -- PVR_UNREFERENCED_PARAMETER(psDevInfo); -- - switch(psMiscInfo->eRequest) - { -+ case SGX_MISC_INFO_REQUEST_CLOCKSPEED: -+ { -+ psMiscInfo->uData.ui32SGXClockSpeed = psDevInfo->ui32CoreClockSpeed; -+ return PVRSRV_OK; -+ } -+#ifdef SUPPORT_SGX_HWPERF -+ case SGX_MISC_INFO_REQUEST_HWPERF_CB_ON: -+ { -+ psDevInfo->psSGXHostCtl->ui32HWPerfFlags |= PVRSRV_SGX_HWPERF_ON; -+ return PVRSRV_OK; -+ } -+ case SGX_MISC_INFO_REQUEST_HWPERF_CB_OFF: -+ { -+ psDevInfo->psSGXHostCtl->ui32HWPerfFlags &= ~PVRSRV_SGX_HWPERF_ON; -+ return PVRSRV_OK; -+ } -+ case SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB: -+ { -+ SGX_MISC_INFO_HWPERF_RETRIEVE_CB* psRetrieve = &psMiscInfo->uData.sRetrieveCB; -+ PVRSRV_SGX_HWPERF_CB* psHWPerfCB = (PVRSRV_SGX_HWPERF_CB*)psDevInfo->psKernelHWPerfCBMemInfo->pvLinAddrKM; -+ IMG_UINT i = 0; -+ -+ for (; psHWPerfCB->ui32Woff != psHWPerfCB->ui32Roff && i < psRetrieve->ui32ArraySize; i++) -+ { -+ PVRSRV_SGX_HWPERF_CBDATA* psData = &psHWPerfCB->psHWPerfCBData[psHWPerfCB->ui32Roff]; -+ OSMemCopy(&psRetrieve->psHWPerfData[i], psData, sizeof(PVRSRV_SGX_HWPERF_CBDATA)); -+ psRetrieve->psHWPerfData[i].ui32ClockSpeed = psDevInfo->ui32CoreClockSpeed; -+ psRetrieve->psHWPerfData[i].ui32TimeMax = psDevInfo->ui32uKernelTimerClock; -+ psHWPerfCB->ui32Roff = (psHWPerfCB->ui32Roff + 1) & (PVRSRV_SGX_HWPERF_CBSIZE - 1); -+ } -+ psRetrieve->ui32DataCount = i; -+ psRetrieve->ui32Time = OSClockus(); -+ return PVRSRV_OK; -+ } -+#endif - default: - { - -@@ -1807,3 +1403,55 @@ - } - } - -+ -+#if defined(SUPPORT_SGX_HWPERF) -+IMG_EXPORT -+PVRSRV_ERROR SGXReadHWPerfCountersKM(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32PerfReg, -+ IMG_UINT32 *pui32OldPerf, -+ IMG_BOOL bNewPerf, -+ IMG_UINT32 ui32NewPerf, -+ IMG_UINT32 ui32NewPerfReset, -+ IMG_UINT32 ui32PerfCountersReg, -+ IMG_UINT32 *pui32Counters, -+ IMG_UINT32 *pui32KickTACounter, -+ IMG_UINT32 *pui32KickTARenderCounter, -+ IMG_UINT32 *pui32CPUTime, -+ IMG_UINT32 *pui32SGXTime) -+{ -+ IMG_UINT32 i; -+ -+ -+ -+ { -+ *pui32OldPerf = OSReadHWReg(psDevInfo->pvRegsBaseKM, ui32PerfReg); -+ -+ for (i = 0; i < 9; ++i) -+ { -+ pui32Counters[i] = OSReadHWReg(psDevInfo->pvRegsBaseKM, ui32PerfCountersReg + (i * 4)); -+ } -+ -+ *pui32KickTACounter = psDevInfo->ui32KickTACounter; -+ *pui32KickTARenderCounter = psDevInfo->ui32KickTARenderCounter; -+ -+ *pui32CPUTime = OSClockus(); -+ *pui32SGXTime = psDevInfo->psSGXHostCtl->ui32TimeWraps; -+ } -+ -+ -+ -+ if (bNewPerf) -+ { -+ if(ui32NewPerfReset != 0) -+ { -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32PerfReg, ui32NewPerf | ui32NewPerfReset); -+ } -+ -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32PerfReg, ui32NewPerf); -+ } -+ -+ return PVRSRV_OK; -+} -+#endif -+ -+ -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxkick.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxkick.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxkick.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxkick.c 2008-12-18 15:47:29.000000000 +0100 -@@ -24,11 +24,13 @@ - * - ******************************************************************************/ - -+#include <stddef.h> - #include "services_headers.h" - #include "sgxinfo.h" - #include "sgxinfokm.h" - #if defined (PDUMP) - #include "sgxapi_km.h" -+#include "pdump_km.h" - #endif - #include "sgx_bridge_km.h" - #include "osfunc.h" -@@ -36,92 +38,241 @@ - #include "sgxutils.h" - - -+#define CCB_OFFSET_IS_VALID(type, psCCBMemInfo, psCCBKick, offset) \ -+ ((psCCBKick)->offset + sizeof(type) < (psCCBMemInfo)->ui32AllocSize) -+ - #define CCB_DATA_FROM_OFFSET(type, psCCBMemInfo, psCCBKick, offset) \ - ((type *)(((char *)(psCCBMemInfo)->pvLinAddrKM) + \ - (psCCBKick)->offset)) - --#define CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, offset) \ -- ((psCCBKick)->offset < (psCCBMemInfo)->ui32AllocSize) -- - IMG_EXPORT - PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, PVR3DIF4_CCB_KICK *psCCBKick) - { - PVRSRV_ERROR eError; - PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; - PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *) psCCBKick->hCCBKernelMemInfo; -- IMG_UINT32 *pui32DstReadOpsPendingVal; -- IMG_UINT32 *pui32DstWriteOpsPendingVal; -+ PVR3DIF4_CMDTA_SHARED *psTACmd; - IMG_UINT32 i; -+#if defined(SUPPORT_SGX_HWPERF) -+ PVRSRV_DEVICE_NODE *psDeviceNode; -+ PVRSRV_SGXDEV_INFO *psDevInfo; - -+ psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevHandle; -+ psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; -+#endif - --#if defined(NO_HARDWARE) -- pui32DstReadOpsPendingVal = IMG_NULL; -- pui32DstWriteOpsPendingVal = IMG_NULL; -+#if defined(SUPPORT_SGX_HWPERF) -+ if (psCCBKick->bKickRender) -+ { -+ ++psDevInfo->ui32KickTARenderCounter; -+ } -+ ++psDevInfo->ui32KickTACounter; - #endif - -- if (psCCBKick->hDstKernelSyncInfo != IMG_NULL) -+ if (!CCB_OFFSET_IS_VALID(PVR3DIF4_CMDTA_SHARED, psCCBMemInfo, psCCBKick, ui32CCBOffset)) - { -- -- if (!CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, ui32DstReadOpsPendingOffset) || !CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, ui32DstWriteOpsPendingOffset)) -+ return PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ psTACmd = CCB_DATA_FROM_OFFSET(PVR3DIF4_CMDTA_SHARED, psCCBMemInfo, psCCBKick, ui32CCBOffset); -+ -+ -+ if (psCCBKick->hTA3DSyncInfo) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo; -+ psTACmd->sTA3DDependancy.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ -+ psTACmd->sTA3DDependancy.ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ -+ if (psCCBKick->bTADependency) - { -- PVR_DPF((PVR_DBG_ERROR, "SGXDoKickKM: ui32DstReadOpsPendingOffset or ui32DstWriteOpsPendingOffset out of range")); -+ psSyncInfo->psSyncData->ui32WriteOpsPending++; - } -- else -- { -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->hDstKernelSyncInfo; -- pui32DstReadOpsPendingVal = CCB_DATA_FROM_OFFSET(IMG_UINT32, psCCBMemInfo, psCCBKick, ui32DstReadOpsPendingOffset); -- pui32DstWriteOpsPendingVal = CCB_DATA_FROM_OFFSET(IMG_UINT32, psCCBMemInfo, psCCBKick, ui32DstWriteOpsPendingOffset); -+ } - -- *pui32DstReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -- *pui32DstWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -- } -+ if (psCCBKick->hTASyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo; - -+ psTACmd->sTQSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ psTACmd->sTQSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ -+ psTACmd->ui32TQSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ psTACmd->ui32TQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; - } - -+ if (psCCBKick->h3DSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo; -+ -+ psTACmd->s3DTQSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ psTACmd->s3DTQSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ -+ psTACmd->ui323DTQSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ psTACmd->ui323DTQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ } -+ -+ psTACmd->ui32NumTAStatusVals = psCCBKick->ui32NumTAStatusVals; - if (psCCBKick->ui32NumTAStatusVals != 0) - { - - for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) - { -- if (CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, aui32TAStatusValueOffset[i])) -- { -- IMG_UINT32 *pui32TAStatusValue = CCB_DATA_FROM_OFFSET(IMG_UINT32, psCCBMemInfo, psCCBKick, aui32TAStatusValueOffset[i]); -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i]; -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i]; - -- *pui32TAStatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending; -- } -- else -- { -- PVR_DPF((PVR_DBG_ERROR, "SGXDoKickKM: aui32TAStatusValueOffset[%d] out of range", i)); -- } -+ psTACmd->sCtlTAStatusInfo[i].sStatusDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ -+ psTACmd->sCtlTAStatusInfo[i].ui32StatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending; - } - } - -+ psTACmd->ui32Num3DStatusVals = psCCBKick->ui32Num3DStatusVals; - if (psCCBKick->ui32Num3DStatusVals != 0) - { - - for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++) - { -- if (CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, aui323DStatusValueOffset[i])) -- { -- IMG_UINT32 *pui323DStatusValue = CCB_DATA_FROM_OFFSET(IMG_UINT32, psCCBMemInfo, psCCBKick, aui323DStatusValueOffset[i]); -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i]; -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i]; - -- *pui323DStatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending; -- } -- else -+ psTACmd->sCtl3DStatusInfo[i].sStatusDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ -+ psTACmd->sCtl3DStatusInfo[i].ui32StatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ } -+ } -+ -+ -+ psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs; -+ for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i]; -+ -+ psTACmd->asSrcSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ psTACmd->asSrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ -+ -+ psTACmd->asSrcSyncs[i].ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ -+ psTACmd->asSrcSyncs[i].ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ -+ } -+ -+ if (psCCBKick->bFirstKickOrResume && psCCBKick->hRenderSurfSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->hRenderSurfSyncInfo; -+ psTACmd->sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ psTACmd->sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ -+ psTACmd->ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ psTACmd->ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ -+ -+#if defined(PDUMP) -+ if (PDumpIsCaptureFrameKM()) -+ { -+ if (psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) - { -- PVR_DPF((PVR_DBG_ERROR, "SGXDoKickKM: aui323DStatusValueOffset[%d] out of range", i)); -+ -+ PDUMPCOMMENT("Init render surface last op\r\n"); -+ -+ PDUMPMEM(IMG_NULL, -+ psSyncInfo->psSyncDataMemInfoKM, -+ 0, -+ sizeof(PVRSRV_SYNC_DATA), -+ 0, -+ MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); -+ -+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, -+ psSyncInfo->psSyncDataMemInfoKM, -+ offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), -+ sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete), -+ 0, -+ MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - } -+ -+ psSyncInfo->psSyncData->ui32LastOpDumpVal++; - } -+#endif - } - -+#if defined(PDUMP) -+ if (PDumpIsCaptureFrameKM()) -+ { -+ PDUMPCOMMENT("Shared part of TA command\r\n"); -+ -+ PDUMPMEM(IMG_NULL, psCCBMemInfo, psCCBKick->ui32CCBOffset, sizeof(PVR3DIF4_CMDTA_SHARED), 0, MAKEUNIQUETAG(psCCBMemInfo)); -+ -+ if (psCCBKick->hRenderSurfSyncInfo != IMG_NULL) -+ { -+ IMG_UINT32 ui32HackValue; -+ -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hRenderSurfSyncInfo; -+ ui32HackValue = psSyncInfo->psSyncData->ui32LastOpDumpVal - 1; -+ -+ PDUMPCOMMENT("Hack render surface last op in TA cmd\r\n"); -+ -+ PDUMPMEM(&ui32HackValue, -+ psCCBMemInfo, -+ psCCBKick->ui32CCBOffset + offsetof(PVR3DIF4_CMDTA_SHARED, ui32WriteOpsPendingVal), -+ sizeof(IMG_UINT32), -+ 0, -+ MAKEUNIQUETAG(psCCBMemInfo)); -+ -+ ui32HackValue = 0; -+ PDUMPCOMMENT("Hack render surface read op in TA cmd\r\n"); -+ -+ PDUMPMEM(&ui32HackValue, -+ psCCBMemInfo, -+ psCCBKick->ui32CCBOffset + offsetof(PVR3DIF4_CMDTA_SHARED, sReadOpsCompleteDevVAddr), -+ sizeof(IMG_UINT32), -+ 0, -+ MAKEUNIQUETAG(psCCBMemInfo)); -+ } -+ -+ for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i]; -+ -+ PDUMPCOMMENT("Hack TA status value in TA cmd\r\n"); -+ -+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, -+ psCCBMemInfo, -+ psCCBKick->ui32CCBOffset + offsetof(PVR3DIF4_CMDTA_SHARED, sCtlTAStatusInfo[i].ui32StatusValue), -+ sizeof(IMG_UINT32), -+ 0, -+ MAKEUNIQUETAG(psCCBMemInfo)); -+ } -+ -+ for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i]; -+ -+ PDUMPCOMMENT("Hack 3D status value in TA cmd\r\n"); -+ -+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, -+ psCCBMemInfo, -+ psCCBKick->ui32CCBOffset + offsetof(PVR3DIF4_CMDTA_SHARED, sCtl3DStatusInfo[i].ui32StatusValue), -+ sizeof(IMG_UINT32), -+ 0, -+ MAKEUNIQUETAG(psCCBMemInfo)); -+ } -+ } -+#endif -+ - eError = SGXScheduleCCBCommandKM(hDevHandle, psCCBKick->eCommand, &psCCBKick->sCommand, KERNEL_ID); - if (eError == PVRSRV_ERROR_RETRY) - { -- -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->hDstKernelSyncInfo; -- psSyncInfo->psSyncData->ui32WriteOpsPending--; -+ if (psCCBKick->bFirstKickOrResume && psCCBKick->hRenderSurfSyncInfo != IMG_NULL) -+ { -+ -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->hRenderSurfSyncInfo; -+ psSyncInfo->psSyncData->ui32WriteOpsPending--; -+ } -+ -+ for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i]; -+ psSyncInfo->psSyncData->ui32ReadOpsPending--; -+ } -+ - return eError; - } - else if (PVRSRV_OK != eError) -@@ -132,70 +283,66 @@ - - - #if defined(NO_HARDWARE) -- if (psCCBKick->ui32NumTAStatusVals != 0) -- { -- -- for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) -- { -- if (CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, aui32TAStatusValueOffset[i])) -- { -- IMG_UINT32 *pui32TAStatusValue = CCB_DATA_FROM_OFFSET(IMG_UINT32, psCCBMemInfo, psCCBKick, aui32TAStatusValueOffset[i]); -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i]; -- -- psSyncInfo->psSyncData->ui32ReadOpsComplete = *pui32TAStatusValue; -- } -- } -- } - -- if (psCCBKick->bTerminate) -+ if (psCCBKick->hTA3DSyncInfo) - { -- if (psCCBKick->hUpdateDstKernelSyncInfo != IMG_NULL) -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo; -+ -+ if (psCCBKick->bTADependency) - { -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hUpdateDstKernelSyncInfo; -- psSyncInfo->psSyncData->ui32WriteOpsComplete = ((pui32DstWriteOpsPendingVal != IMG_NULL) ? *pui32DstWriteOpsPendingVal : psCCBKick->ui32WriteOpsPendingVal) + 1; -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; - } -+ } - -- if (psCCBKick->ui32Num3DStatusVals != 0) -- { -- -- for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++) -- { -- if (CCB_OFFSET_IS_VALID(psCCBMemInfo, psCCBKick, aui323DStatusValueOffset[i])) -- { -- IMG_UINT32 *pui323DStatusValue = CCB_DATA_FROM_OFFSET(IMG_UINT32, psCCBMemInfo, psCCBKick, aui323DStatusValueOffset[i]); -- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i]; -+ if (psCCBKick->hTASyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo; - -- psSyncInfo->psSyncData->ui32ReadOpsComplete = *pui323DStatusValue; -- } -- } -- } -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending; - } --#endif - -- return eError; --} -+ if (psCCBKick->h3DSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo; - -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ } - --IMG_VOID SGXScheduleProcessQueues(PVRSRV_DEVICE_NODE *psDeviceNode) --{ -- PVRSRV_ERROR eError; -- PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice; -- PVRSRV_SGX_HOST_CTL *psHostCtl = psDevInfo->psKernelSGXHostCtlMemInfo->pvLinAddrKM; -- IMG_UINT32 ui32PowManFlags; -- PVRSRV_SGX_COMMAND sCommand = {0}; -+ -+ for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i]; - -- ui32PowManFlags = psHostCtl->ui32PowManFlags; -- if ((ui32PowManFlags & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0) -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psTACmd->sCtlTAStatusInfo[i].ui32StatusValue; -+ } -+ -+ -+ for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++) - { -- -- return; -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i]; -+ -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ - } - -- sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD; -- eError = SGXScheduleCCBCommandKM(psDeviceNode, PVRSRV_SGX_COMMAND_EDM_KICK, &sCommand, ISR_ID); -- if (eError != PVRSRV_OK) -+ if (psCCBKick->bTerminateOrAbort) - { -- PVR_DPF((PVR_DBG_ERROR,"SGXScheduleProcessQueues failed to schedule CCB command: %lu", eError)); -+ if (psCCBKick->hRenderSurfSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hRenderSurfSyncInfo; -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psCCBKick->bFirstKickOrResume ? psSyncInfo->psSyncData->ui32WriteOpsPending : (psCCBKick->ui32WriteOpsPendingVal + 1); -+ } -+ -+ -+ for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i]; -+ -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psTACmd->sCtl3DStatusInfo[i].ui32StatusValue; -+ } - } -+#endif -+ -+ return eError; - } - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxreset.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxreset.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxreset.c 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxreset.c 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,330 @@ -+/********************************************************************** -+ * -+ * 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 "sgxdefs.h" -+#include "sgxmmu.h" -+#include "services_headers.h" -+#include "sgxinfokm.h" -+#include "sgxconfig.h" -+ -+#include "pdump_km.h" -+ -+ -+#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -+#define SGX_BIF_DIR_LIST_INDEX_EDM 15 -+#define SGX_BIF_DIR_LIST_REG_EDM EUR_CR_BIF_DIR_LIST_BASE15 -+#else -+#define SGX_BIF_DIR_LIST_REG_EDM EUR_CR_BIF_DIR_LIST_BASE0 -+#endif -+ -+ -+static IMG_VOID SGXResetSoftReset(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_BOOL bResetBIF, -+ IMG_UINT32 ui32PDUMPFlags, -+ IMG_BOOL bPDump) -+{ -+ IMG_UINT32 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; -+ -+#if !defined(PDUMP) -+ PVR_UNREFERENCED_PARAMETER(ui32PDUMPFlags); -+#endif -+ -+ if (bResetBIF) -+ { -+ ui32SoftResetRegVal |= EUR_CR_SOFT_RESET_BIF_RESET_MASK; -+ } -+ -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32SoftResetRegVal); -+ if (bPDump) -+ { -+ PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32SoftResetRegVal, ui32PDUMPFlags); -+ } -+} -+ -+ -+static IMG_VOID SGXResetSleep(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32PDUMPFlags, -+ IMG_BOOL bPDump) -+{ -+#if !defined(PDUMP) -+ PVR_UNREFERENCED_PARAMETER(ui32PDUMPFlags); -+#endif -+ -+ -+ OSWaitus(1000 * 1000000 / psDevInfo->ui32CoreClockSpeed); -+ if (bPDump) -+ { -+ PDUMPIDLWITHFLAGS(30, ui32PDUMPFlags); -+#if defined(PDUMP) -+ PDumpRegRead(EUR_CR_SOFT_RESET, ui32PDUMPFlags); -+#endif -+ } -+ -+ -+ -+} -+ -+ -+static IMG_VOID SGXResetInvalDC(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32PDUMPFlags, -+ IMG_BOOL bPDump) -+{ -+ IMG_UINT32 ui32RegVal; -+ -+ -+ ui32RegVal = EUR_CR_BIF_CTRL_INVALDC_MASK; -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32RegVal); -+ if (bPDump) -+ { -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags); -+ } -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, bPDump); -+ -+ ui32RegVal = 0; -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32RegVal); -+ if (bPDump) -+ { -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_CTRL, ui32RegVal, ui32PDUMPFlags); -+ } -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, bPDump); -+ -+#if !defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -+ { -+ -+ -+ -+ if (PollForValueKM((IMG_UINT32 *)((IMG_UINT8*)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); -+ } -+ } -+#endif -+} -+ -+ -+IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO *psDevInfo, -+ IMG_UINT32 ui32PDUMPFlags) -+{ -+ IMG_UINT32 ui32RegVal; -+ -+ const IMG_UINT32 ui32BifFaultMask = -+ EUR_CR_BIF_INT_STAT_FAULT_MASK; -+ -+#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -+ IMG_UINT32 ui32BIFCtrl; -+#if defined(EUR_CR_BIF_MEM_ARB_CONFIG) -+ IMG_UINT32 ui32BIFMemArb; -+#endif -+#endif -+ -+#ifndef PDUMP -+ PVR_UNREFERENCED_PARAMETER(ui32PDUMPFlags); -+#endif -+ -+ psDevInfo->ui32NumResets++; -+ -+ 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); -+ -+ -+ -+#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -+ ui32RegVal = 0; -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK_SET, ui32RegVal); -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_BANK_SET, ui32RegVal, ui32PDUMPFlags); -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0, ui32RegVal); -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_BANK0, ui32RegVal, ui32PDUMPFlags); -+ -+#if defined(EUR_CR_BIF_MEM_ARB_CONFIG) -+ -+ -+ ui32BIFMemArb = (12UL << EUR_CR_BIF_MEM_ARB_CONFIG_PAGE_SIZE_SHIFT) | -+ (7UL << EUR_CR_BIF_MEM_ARB_CONFIG_BEST_CNT_SHIFT) | -+ (12UL << EUR_CR_BIF_MEM_ARB_CONFIG_TTE_THRESH_SHIFT); -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_MEM_ARB_CONFIG, ui32BIFMemArb); -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_MEM_ARB_CONFIG, ui32BIFMemArb, ui32PDUMPFlags); -+#endif -+#endif -+ -+ -+ -+ -+ -+ -+ -+ ui32RegVal = psDevInfo->sBIFResetPDDevPAddr.uiAddr; -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_DIR_LIST_BASE0, ui32RegVal); -+ -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -+ -+ -+ SGXResetSoftReset(psDevInfo, IMG_FALSE, ui32PDUMPFlags, IMG_TRUE); -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -+ -+ SGXResetInvalDC(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -+ -+ -+ -+ for (;;) -+ { -+ IMG_UINT32 ui32BifIntStat = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_INT_STAT); -+ IMG_DEV_VIRTADDR sBifFault; -+ IMG_UINT32 ui32PDIndex, ui32PTIndex; -+ -+ if ((ui32BifIntStat & ui32BifFaultMask) == 0) -+ { -+ break; -+ } -+ -+ -+ -+ -+ sBifFault.uiAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_FAULT); -+ PVR_DPF((PVR_DBG_WARNING, "SGXReset: Page fault 0x%x/0x%x", ui32BifIntStat, sBifFault.uiAddr)); -+ ui32PDIndex = sBifFault.uiAddr >> (SGX_MMU_PAGE_SHIFT + SGX_MMU_PT_SHIFT); -+ ui32PTIndex = (sBifFault.uiAddr & SGX_MMU_PT_MASK) >> SGX_MMU_PAGE_SHIFT; -+ -+ -+ SGXResetSoftReset(psDevInfo, IMG_TRUE, ui32PDUMPFlags, IMG_FALSE); -+ -+ -+ psDevInfo->pui32BIFResetPD[ui32PDIndex] = psDevInfo->sBIFResetPTDevPAddr.uiAddr | SGX_MMU_PDE_VALID; -+ psDevInfo->pui32BIFResetPT[ui32PTIndex] = psDevInfo->sBIFResetPageDevPAddr.uiAddr | SGX_MMU_PTE_VALID; -+ -+ -+ ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_STATUS); -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR, ui32RegVal); -+ ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_STATUS2); -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR2, ui32RegVal); -+ -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -+ -+ -+ SGXResetSoftReset(psDevInfo, IMG_FALSE, ui32PDUMPFlags, IMG_FALSE); -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -+ -+ -+ SGXResetInvalDC(psDevInfo, ui32PDUMPFlags, IMG_FALSE); -+ -+ -+ psDevInfo->pui32BIFResetPD[ui32PDIndex] = 0; -+ psDevInfo->pui32BIFResetPT[ui32PTIndex] = 0; -+ } -+ -+ -+ -+ -+#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) -+ -+ ui32BIFCtrl = (SGX_BIF_DIR_LIST_INDEX_EDM << EUR_CR_BIF_BANK0_INDEX_EDM_SHIFT); -+#ifdef SGX_FEATURE_2D_HARDWARE -+ -+ ui32BIFCtrl |= (SGX_BIF_DIR_LIST_INDEX_EDM << EUR_CR_BIF_BANK0_INDEX_2D_SHIFT); -+#endif -+#if defined(FIX_HW_BRN_23410) -+ -+ ui32BIFCtrl |= (SGX_BIF_DIR_LIST_INDEX_EDM << EUR_CR_BIF_BANK0_INDEX_TA_SHIFT); -+#endif -+ -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0, ui32BIFCtrl); -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_BANK0, ui32BIFCtrl, ui32PDUMPFlags); -+#endif -+ -+ -+ 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); -+ -+#ifdef SGX_FEATURE_2D_HARDWARE -+ -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_TWOD_REQ_BASE, SGX_2D_HEAP_BASE); -+ PDUMPREGWITHFLAGS(EUR_CR_BIF_TWOD_REQ_BASE, SGX_2D_HEAP_BASE, ui32PDUMPFlags); -+#endif -+ -+ -+ SGXResetInvalDC(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -+ -+ PVR_DPF((PVR_DBG_WARNING,"Soft Reset of SGX")); -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -+ -+ -+ ui32RegVal = 0; -+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_SOFT_RESET, ui32RegVal); -+ PDUMPREGWITHFLAGS(EUR_CR_SOFT_RESET, ui32RegVal, ui32PDUMPFlags); -+ -+ -+ SGXResetSleep(psDevInfo, ui32PDUMPFlags, IMG_TRUE); -+ -+ PDUMPCOMMENTWITHFLAGS(ui32PDUMPFlags, "End of SGX reset sequence\r\n"); -+} -+ -+ -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxtransfer.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxtransfer.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxtransfer.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxtransfer.c 2008-12-18 15:47:29.000000000 +0100 -@@ -43,16 +43,314 @@ - #include "pvr_debug.h" - #include "sgxutils.h" - --IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, -- IMG_DEV_VIRTADDR sHWRenderContextDevVAddr) -- -+#define CCB_OFFSET_IS_VALID(type, psCCBMemInfo, psKick, offset) \ -+ ((psKick)->offset + sizeof(type) < (psCCBMemInfo)->ui32AllocSize) -+ -+#define CCB_DATA_FROM_OFFSET(type, psCCBMemInfo, psKick, offset) \ -+ ((type *)(((char *)(psCCBMemInfo)->pvLinAddrKM) + \ -+ (psKick)->offset)) -+ -+IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick) - { -+ PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo; - PVRSRV_SGX_COMMAND sCommand = {0}; -+ PVR3DIF4_TRANSFERCMD_SHARED *psTransferCmd; -+ PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; -+ IMG_UINT32 i; -+ PVRSRV_ERROR eError; -+ -+ if (!CCB_OFFSET_IS_VALID(PVR3DIF4_TRANSFERCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset)) -+ { -+ return PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ psTransferCmd = CCB_DATA_FROM_OFFSET(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; -+ } -+ -+ if (psKick->hTASyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; -+ -+ psTransferCmd->ui32TASyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ psTransferCmd->ui32TASyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ -+ psTransferCmd->sTASyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ psTransferCmd->sTASyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ else -+ { -+ psTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0; -+ psTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0; -+ } -+ -+ if (psKick->h3DSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; -+ -+ psTransferCmd->ui323DSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ psTransferCmd->ui323DSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ -+ psTransferCmd->s3DSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ psTransferCmd->s3DSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ else -+ { -+ psTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0; -+ psTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0; -+ } - -- sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_TRANSFERCMD; -- sCommand.ui32Data[1] = sHWRenderContextDevVAddr.uiAddr; - -- return SGXScheduleCCBCommandKM(hDevHandle, PVRSRV_SGX_COMMAND_EDM_KICK, &sCommand, KERNEL_ID); -+ psTransferCmd->ui32NumSrcSync = psKick->ui32NumSrcSync; -+ psTransferCmd->ui32NumDstSync = psKick->ui32NumDstSync; -+ -+ -+ if(psKick->ui32NumSrcSync > 0) -+ { -+ psSyncInfo = (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 = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0]; -+ -+ psTransferCmd->ui32DstWriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ psTransferCmd->ui32DstReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ -+ psTransferCmd->sDstWriteOpsCompleteDevAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ psTransferCmd->sDstReadOpsCompleteDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ -+ -+ if (psKick->ui32NumSrcSync > 0) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[0]; -+ psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ -+ } -+ if (psKick->ui32NumDstSync > 0) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0]; -+ psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ } -+ -+ -+ if (psKick->ui32NumSrcSync > 1) -+ { -+ for(i = 1; i < psKick->ui32NumSrcSync; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[i]; -+ -+ psTransferCmd->sCtlStatusInfo[psKick->ui32StatusFirstSync].ui32StatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ -+ psTransferCmd->sCtlStatusInfo[psKick->ui32StatusFirstSync].sStatusDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ -+ psKick->ui32StatusFirstSync++; -+ } -+ } -+ -+ if (psKick->ui32NumDstSync > 1) -+ { -+ for(i = 1; i < psKick->ui32NumDstSync; i++) -+ { -+ psSyncInfo = (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 defined(PDUMP) -+ PDUMPCOMMENT("Shared part of transfer command\r\n"); -+ PDUMPMEM(IMG_NULL, -+ psCCBMemInfo, -+ psKick->ui32SharedCmdCCBOffset, -+ sizeof(PVR3DIF4_TRANSFERCMD_SHARED), -+ 0, -+ MAKEUNIQUETAG(psCCBMemInfo)); -+#endif -+ -+ sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_TRANSFERCMD; -+ sCommand.ui32Data[1] = psKick->sHWTransferContextDevVAddr.uiAddr; -+ -+ eError = SGXScheduleCCBCommandKM(hDevHandle, PVRSRV_SGX_COMMAND_EDM_KICK, &sCommand, KERNEL_ID); -+ -+#if defined(NO_HARDWARE) -+ -+ for(i = 0; i < psKick->ui32NumSrcSync; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[i]; -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ } -+ -+ for(i = 0; i < psKick->ui32NumDstSync; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[i]; -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ -+ } -+ -+ if (psKick->hTASyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; -+ -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ } -+ -+ if (psKick->h3DSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; -+ -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ } -+#endif -+ -+ return eError; - } - --#endif -+#if defined(SGX_FEATURE_2D_HARDWARE) -+IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK *psKick) -+ -+{ -+ PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo; -+ PVRSRV_SGX_COMMAND sCommand = {0}; -+ PVR3DIF4_2DCMD_SHARED *ps2DCmd; -+ PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; -+ IMG_BOOL bDstSyncDone = IMG_FALSE; -+ PVRSRV_ERROR eError; -+ IMG_UINT32 i; -+ -+ if (!CCB_OFFSET_IS_VALID(PVR3DIF4_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset)) -+ { -+ return PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ ps2DCmd = CCB_DATA_FROM_OFFSET(PVR3DIF4_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset); -+ -+ OSMemSet(ps2DCmd, 0, sizeof(*ps2DCmd)); -+ -+ -+ if (psKick->hTASyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; -+ -+ ps2DCmd->sTASyncData.ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ ps2DCmd->sTASyncData.ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ -+ ps2DCmd->sTASyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ ps2DCmd->sTASyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ -+ -+ if (psKick->h3DSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; -+ -+ ps2DCmd->s3DSyncData.ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ ps2DCmd->s3DSyncData.ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ -+ ps2DCmd->s3DSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ ps2DCmd->s3DSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ -+ ps2DCmd->ui32NumSrcSync = psKick->ui32NumSrcSync; -+ for (i = 0; i < psKick->ui32NumSrcSync; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[i]; -+ if (psSyncInfo == (PVRSRV_KERNEL_SYNC_INFO *)psKick->hDstSyncInfo) -+ { -+ ps2DCmd->sSrcSyncData[i].ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ ps2DCmd->sSrcSyncData[i].ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ -+ ps2DCmd->sDstSyncData.ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ ps2DCmd->sDstSyncData.ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ -+ bDstSyncDone = IMG_TRUE; -+ } -+ else -+ { -+ ps2DCmd->sSrcSyncData[i].ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ ps2DCmd->sSrcSyncData[i].ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; -+ } -+ -+ ps2DCmd->sSrcSyncData[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ ps2DCmd->sSrcSyncData[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ -+ if (psKick->hDstSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hDstSyncInfo; -+ -+ if (!bDstSyncDone) -+ { -+ ps2DCmd->sDstSyncData.ui32WriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; -+ ps2DCmd->sDstSyncData.ui32ReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ } -+ -+ ps2DCmd->sDstSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; -+ ps2DCmd->sDstSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; -+ } -+ -+#if defined(PDUMP) -+ -+ PDUMPCOMMENT("Shared part of 2D command\r\n"); -+ PDUMPMEM(IMG_NULL, -+ psCCBMemInfo, -+ psKick->ui32SharedCmdCCBOffset, -+ sizeof(PVR3DIF4_2DCMD_SHARED), -+ 0, -+ MAKEUNIQUETAG(psCCBMemInfo)); -+#endif -+ -+ sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_2DCMD; -+ sCommand.ui32Data[1] = psKick->sHW2DContextDevVAddr.uiAddr; -+ -+ eError = SGXScheduleCCBCommandKM(hDevHandle, PVRSRV_SGX_COMMAND_EDM_KICK, &sCommand, KERNEL_ID); -+ -+#if defined(NO_HARDWARE) -+ -+ for(i = 0; i < psKick->ui32NumSrcSync; i++) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[i]; -+ psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending; -+ } -+ -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hDstSyncInfo; -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ -+ if (psKick->hTASyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; -+ -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ } -+ -+ if (psKick->h3DSyncInfo != IMG_NULL) -+ { -+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; -+ -+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending; -+ } -+#endif -+ -+ return eError; -+} -+#endif -+#endif -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.c git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.c ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.c 2008-12-18 15:47:29.000000000 +0100 -@@ -46,6 +46,79 @@ - #include <stdio.h> - #endif - -+#if defined(SYS_CUSTOM_POWERDOWN) -+PVRSRV_ERROR SysPowerDownMISR(IMG_UINT32 ui32DeviceIndex, IMG_UINT32 ui32CallerID); -+#endif -+ -+ -+#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -+IMG_VOID SGXTestActivePowerEvent (PVRSRV_DEVICE_NODE *psDeviceNode, -+ IMG_UINT32 ui32CallerID) -+{ -+ PVRSRV_ERROR eError = PVRSRV_OK; -+ PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice; -+ 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(); -+ -+#if defined(SYS_CUSTOM_POWERDOWN) -+ -+ -+ -+ eError = SysPowerDownMISR(psDeviceNode->sDevId.ui32DeviceIndex, ui32CallerID); -+#else -+ eError = PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex, -+ PVRSRV_POWER_STATE_D3, -+ ui32CallerID, IMG_FALSE); -+ if (eError == PVRSRV_OK) -+ { -+ -+ psSGXHostCtl->ui32NumActivePowerEvents++; -+ -+ if ((*(volatile IMG_UINT32 *)(&psSGXHostCtl->ui32PowManFlags) -+ & PVRSRV_USSE_EDM_POWMAN_POWEROFF_RESTART_IMMEDIATE) != 0) -+ { -+ -+ -+ -+ if (ui32CallerID == ISR_ID) -+ { -+ psDeviceNode->bReProcessDeviceCommandComplete = IMG_TRUE; -+ } -+ else -+ { -+ SGXScheduleProcessQueues(psDeviceNode); -+ } -+ } -+ } -+#endif -+ if (eError == PVRSRV_ERROR_RETRY) -+ { -+ -+ -+ eError = PVRSRV_OK; -+ } -+ -+ -+ PDUMPRESUME(); -+ } -+ } -+ -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "SGXTestActivePowerEvent error:%lu", eError)); -+ } -+} -+#endif -+ -+ - #ifdef INLINE_IS_PRAGMA - #pragma inline(SGXAcquireKernelCCBSlot) - #endif -@@ -255,147 +328,43 @@ - Exit: - PVRSRVPowerUnlock(ui32CallerID); - -- return eError; --} -- -- --#if 0 --PVRSRV_ERROR CreateCCB(PVRSRV_SGXDEV_INFO *psSGXDevInfo, -- IMG_UINT32 ui32CCBSize, -- IMG_UINT32 ui32AllocGran, -- IMG_UINT32 ui32OverrunSize, -- IMG_HANDLE hDevMemHeap, -- PVRSRV_SGX_CCB **ppsCCB) --{ -- PVRSRV_SGX_CCB *psCCB; -- -- PVR_UNREFERENCED_PARAMETER(psSGXDevInfo); -- -- psCCB = IMG_NULL; -- -- if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, -- sizeof(PVRSRV_SGX_CCB), -- (IMG_VOID **)&psCCB, -- IMG_NULL) != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"CreateCCB: psCCB alloc failed")); -- -- return PVRSRV_ERROR_OUT_OF_MEMORY; -- } -- -- -- psCCB->psCCBMemInfo = IMG_NULL; -- psCCB->psCCBCtlMemInfo = IMG_NULL; -- psCCB->pui32CCBLinAddr = IMG_NULL; -- psCCB->pui32WriteOffset = IMG_NULL; -- psCCB->pui32ReadOffset = IMG_NULL; -- -- #ifdef PDUMP -- psCCB->ui32CCBDumpWOff = 0; -- #endif -- -- -- if ( ui32CCBSize < 0x1000 ) -+#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -+ if (ui32CallerID != ISR_ID) - { -- IMG_UINT32 i, ui32PowOfTwo; -+ - -- ui32PowOfTwo = 0x1000; - -- for (i = 12; i > 0; i--) -- { -- if (ui32CCBSize & ui32PowOfTwo) -- { -- break; -- } -- -- ui32PowOfTwo >>= 1; -- } -- -- if (ui32CCBSize & (ui32PowOfTwo - 1)) -- { -- ui32PowOfTwo <<= 1; -- } -- -- ui32AllocGran = ui32PowOfTwo; -- } -- else -- { -- ui32AllocGran = 0x1000; -+ SGXTestActivePowerEvent(psDeviceNode, ui32CallerID); - } -+#endif - -- -- if (PVRSRVAllocDeviceMemKM(IMG_NULL, -- hDevMemHeap, -- PVRSRV_MEM_READ | PVRSRV_MEM_WRITE | PVRSRV_MEM_EDM_PROTECT | PVRSRV_MEM_NO_SYNCOBJ, -- ui32CCBSize + ui32OverrunSize, -- ui32AllocGran, -- &psCCB->psCCBMemInfo) != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"CreateCCB: CCBMemInfo alloc failed")); -- -- goto ErrorExit; -- } -+ return eError; -+} - -- psCCB->pui32CCBLinAddr = psCCB->psCCBMemInfo->pvLinAddrKM; -- psCCB->sCCBDevAddr = psCCB->psCCBMemInfo->sDevVAddr; -- psCCB->ui32Size = ui32CCBSize; -- psCCB->ui32AllocGran = ui32AllocGran; -+IMG_VOID SGXScheduleProcessQueues(PVRSRV_DEVICE_NODE *psDeviceNode) -+{ -+ PVRSRV_ERROR eError; -+ PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice; -+ PVRSRV_SGX_HOST_CTL *psHostCtl = psDevInfo->psKernelSGXHostCtlMemInfo->pvLinAddrKM; -+ IMG_UINT32 ui32PowManFlags; -+ PVRSRV_SGX_COMMAND sCommand = {0}; - -- -- if (PVRSRVAllocDeviceMemKM(IMG_NULL, -- hDevMemHeap, -- PVRSRV_MEM_READ | PVRSRV_MEM_WRITE | PVRSRV_MEM_EDM_PROTECT | PVRSRV_MEM_NO_SYNCOBJ, -- sizeof(PVRSRV_SGX_CCB_CTL), -- 32, -- &psCCB->psCCBCtlMemInfo) != PVRSRV_OK) -+ ui32PowManFlags = psHostCtl->ui32PowManFlags; -+ if ((ui32PowManFlags & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0) - { -- PVR_DPF((PVR_DBG_ERROR,"CreateCCB: CCBCtlMemInfo alloc failed")); -- -- goto ErrorExit; -+ -+ return; - } - -- -- psCCB->pui32WriteOffset = &((PVRSRV_SGX_CCB_CTL *)psCCB->psCCBCtlMemInfo->pvLinAddrKM)->ui32WriteOffset; -- psCCB->pui32ReadOffset = &((PVRSRV_SGX_CCB_CTL *)psCCB->psCCBCtlMemInfo->pvLinAddrKM)->ui32ReadOffset; -- -- -- *psCCB->pui32WriteOffset = 0; -- *psCCB->pui32ReadOffset = 0; -- -- -- *ppsCCB = psCCB; -- -- return PVRSRV_OK; -- --ErrorExit: -- -- -- if (psCCB->psCCBMemInfo) -+ sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD; -+ eError = SGXScheduleCCBCommandKM(psDeviceNode, PVRSRV_SGX_COMMAND_EDM_KICK, &sCommand, ISR_ID); -+ if (eError != PVRSRV_OK) - { -- PVRSRVFreeDeviceMemKM(IMG_NULL, psCCB->psCCBMemInfo, IMG_FALSE); -+ PVR_DPF((PVR_DBG_ERROR,"SGXScheduleProcessQueues failed to schedule CCB command: %lu", eError)); - } -- -- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 0, psCCB, IMG_NULL); -- -- return PVRSRV_ERROR_OUT_OF_MEMORY; --; - } - --IMG_VOID DestroyCCB(PVRSRV_SGX_CCB *psCCB, IMG_UINT32 ui32PFlags) --{ -- PVRSRVFreeDeviceMemKM(IMG_NULL, psCCB->psCCBMemInfo, IMG_FALSE); -- -- PVRSRVFreeDeviceMemKM(IMG_NULL, psCCB->psCCBCtlMemInfo, IMG_FALSE); - -- if (!(ui32PFlags & PFLAGS_POWERDOWN)) -- { -- if (psCCB) -- { -- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 0, psCCB, IMG_NULL); -- } -- } --} --#endif - #if defined (PDUMP) - IMG_VOID DumpBufferArray(PPVR3DIF4_KICKTA_DUMP_BUFFER psBufferArray, - IMG_UINT32 ui32BufferArrayLength, -@@ -513,18 +482,6 @@ - psSGXInternalDevInfo->bForcePTOff = (IMG_BOOL)psDevInfo->bForcePTOff; - psSGXInternalDevInfo->ui32RegFlags = (IMG_BOOL)psDevInfo->ui32RegFlags; - --#if defined(SUPPORT_SGX_EVENT_OBJECT) -- if (psDevInfo->psSGXEventObject) -- { -- PVRSRV_EVENTOBJECT *psEventObject = psDevInfo->psSGXEventObject; -- psSGXInternalDevInfo->hOSEvent = psEventObject->hOSEventKM; -- } -- else -- { -- psSGXInternalDevInfo->hOSEvent = IMG_NULL; -- } --#endif -- - - psSGXInternalDevInfo->hCtlKernelMemInfoHandle = - (IMG_HANDLE)psDevInfo->psKernelSGXHostCtlMemInfo; -@@ -532,11 +489,11 @@ - return PVRSRV_OK; - } - --static IMG_VOID SGXCleanupRequest(PVRSRV_SGXDEV_INFO *psSGXDevInfo, -+static IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE *psDeviceNode, - IMG_DEV_VIRTADDR *psHWDataDevVAddr, -- IMG_BOOL bContextCleanup) -+ IMG_UINT32 ui32ResManRequestFlag) - { -- IMG_UINT32 ui32ResManRequestFlag = 0; -+ PVRSRV_SGXDEV_INFO *psSGXDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; - PVRSRV_KERNEL_MEM_INFO *psSGXHostCtlMemInfo = psSGXDevInfo->psKernelSGXHostCtlMemInfo; - PVRSRV_SGX_HOST_CTL *psSGXHostCtl = (PVRSRV_SGX_HOST_CTL *)psSGXHostCtlMemInfo->pvLinAddrKM; - IMG_UINT32 ui32PowManFlags; -@@ -554,25 +511,18 @@ - - if (psSGXDevInfo->ui32CacheControl & SGX_BIF_INVALIDATE_PDCACHE) - { -- ui32ResManRequestFlag |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD; -+ psSGXHostCtl->ui32ResManFlags |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPD; - psSGXDevInfo->ui32CacheControl ^= SGX_BIF_INVALIDATE_PDCACHE; - } - if (psSGXDevInfo->ui32CacheControl & SGX_BIF_INVALIDATE_PTCACHE) - { -- ui32ResManRequestFlag |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT; -+ psSGXHostCtl->ui32ResManFlags |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_INVALPT; - psSGXDevInfo->ui32CacheControl ^= SGX_BIF_INVALIDATE_PTCACHE; - } -- if (bContextCleanup) -- { -- ui32ResManRequestFlag |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_RC_REQUEST; -- } -- else -- { -- ui32ResManRequestFlag |= PVRSRV_USSE_EDM_RESMAN_CLEANUP_RT_REQUEST; -- } -- -+ - - psSGXHostCtl->sResManCleanupData.uiAddr = psHWDataDevVAddr->uiAddr; -+ - psSGXHostCtl->ui32ResManFlags |= ui32ResManRequestFlag; - - -@@ -581,6 +531,9 @@ - PDUMPMEM(IMG_NULL, psSGXHostCtlMemInfo, offsetof(PVRSRV_SGX_HOST_CTL, ui32ResManFlags), sizeof(IMG_UINT32), PDUMP_FLAGS_CONTINUOUS, hUniqueTag); - - -+ SGXScheduleProcessQueues(psDeviceNode); -+ -+ - #if !defined(NO_HARDWARE) - if(PollForValueKM ((volatile IMG_UINT32 *)(&psSGXHostCtl->ui32ResManFlags), - PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE, -@@ -612,8 +565,8 @@ - - typedef struct _SGX_HW_RENDER_CONTEXT_CLEANUP_ - { -- PVRSRV_SGXDEV_INFO *psDevInfo; -- IMG_DEV_VIRTADDR sHWDataDevVAddr; -+ PVRSRV_DEVICE_NODE *psDeviceNode; -+ IMG_DEV_VIRTADDR sHWRenderContextDevVAddr; - IMG_HANDLE hBlockAlloc; - PRESMAN_ITEM psResItem; - } SGX_HW_RENDER_CONTEXT_CLEANUP; -@@ -625,8 +578,8 @@ - PVR_UNREFERENCED_PARAMETER(ui32ProcessID); - PVR_UNREFERENCED_PARAMETER(ui32Param); - -- SGXCleanupRequest(psCleanup->psDevInfo, -- &psCleanup->sHWDataDevVAddr, IMG_TRUE); -+ SGXCleanupRequest(psCleanup->psDeviceNode, -+ &psCleanup->sHWRenderContextDevVAddr, PVRSRV_USSE_EDM_RESMAN_CLEANUP_RC_REQUEST); - - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(SGX_HW_RENDER_CONTEXT_CLEANUP), -@@ -636,8 +589,34 @@ - return PVRSRV_OK; - } - -+typedef struct _SGX_HW_TRANSFER_CONTEXT_CLEANUP_ -+{ -+ PVRSRV_DEVICE_NODE *psDeviceNode; -+ IMG_DEV_VIRTADDR sHWTransferContextDevVAddr; -+ IMG_HANDLE hBlockAlloc; -+ PRESMAN_ITEM psResItem; -+} SGX_HW_TRANSFER_CONTEXT_CLEANUP; -+ -+static PVRSRV_ERROR SGXCleanupHWTransferContextCallback(IMG_UINT32 ui32ProcessID, IMG_PVOID pvParam, IMG_UINT32 ui32Param) -+{ -+ SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup = (SGX_HW_TRANSFER_CONTEXT_CLEANUP *)pvParam; -+ -+ PVR_UNREFERENCED_PARAMETER(ui32ProcessID); -+ PVR_UNREFERENCED_PARAMETER(ui32Param); -+ -+ SGXCleanupRequest(psCleanup->psDeviceNode, -+ &psCleanup->sHWTransferContextDevVAddr, PVRSRV_USSE_EDM_RESMAN_CLEANUP_TC_REQUEST); -+ -+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP), -+ psCleanup, -+ psCleanup->hBlockAlloc); -+ -+ return PVRSRV_OK; -+} -+ - IMG_EXPORT --IMG_HANDLE SGXRegisterHWRenderContextKM(PVRSRV_SGXDEV_INFO *psSGXDevInfo, IMG_DEV_VIRTADDR *psHWRenderContextDevVAddr) -+IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR *psHWRenderContextDevVAddr) - { - PVRSRV_ERROR eError; - IMG_HANDLE hBlockAlloc; -@@ -656,8 +635,8 @@ - } - - psCleanup->hBlockAlloc = hBlockAlloc; -- psCleanup->psDevInfo = psSGXDevInfo; -- psCleanup->sHWDataDevVAddr = *psHWRenderContextDevVAddr; -+ psCleanup->psDeviceNode = (PVRSRV_DEVICE_NODE *)psDeviceNode; -+ psCleanup->sHWRenderContextDevVAddr = *psHWRenderContextDevVAddr; - - psResItem = ResManRegisterRes(RESMAN_TYPE_HW_RENDER_CONTEXT, - (IMG_VOID *)psCleanup, -@@ -682,25 +661,173 @@ - } - - IMG_EXPORT --IMG_VOID SGXFlushHWRenderTargetKM(PVRSRV_SGXDEV_INFO *psDevInfo, IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr) -+PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext) - { -- PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr != IMG_NULL); -+ PVRSRV_ERROR eError; -+ SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup; - -- SGXCleanupRequest(psDevInfo, &sHWRTDataSetDevVAddr, IMG_FALSE); -+ PVR_ASSERT(hHWRenderContext != IMG_NULL); -+ -+ psCleanup = (SGX_HW_RENDER_CONTEXT_CLEANUP *)hHWRenderContext; -+ -+ eError = ResManFreeResByPtr(psCleanup->psResItem, IMG_TRUE); -+ -+ return eError; - } - - IMG_EXPORT --PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext) -+IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR *psHWTransferContextDevVAddr) - { - PVRSRV_ERROR eError; -- SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup; -+ IMG_HANDLE hBlockAlloc; -+ SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup; -+ PRESMAN_ITEM psResItem; - -- PVR_ASSERT(hHWRenderContext != IMG_NULL); -+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP), -+ (IMG_VOID **)&psCleanup, -+ &hBlockAlloc); - -- psCleanup = (SGX_HW_RENDER_CONTEXT_CLEANUP *)hHWRenderContext; -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHWTransferContextKM: Couldn't allocate memory for SGX_HW_TRANSFER_CONTEXT_CLEANUP structure")); -+ return IMG_NULL; -+ } -+ -+ psCleanup->hBlockAlloc = hBlockAlloc; -+ psCleanup->psDeviceNode = (PVRSRV_DEVICE_NODE *)psDeviceNode; -+ psCleanup->sHWTransferContextDevVAddr = *psHWTransferContextDevVAddr; -+ -+ psResItem = ResManRegisterRes(RESMAN_TYPE_HW_TRANSFER_CONTEXT, -+ (IMG_VOID *)psCleanup, -+ 0, -+ &SGXCleanupHWTransferContextCallback, -+ 0); -+ -+ if (psResItem == IMG_NULL) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHWTransferContextKM: ResManRegisterRes failed")); -+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP), -+ psCleanup, -+ psCleanup->hBlockAlloc); -+ -+ return IMG_NULL; -+ } -+ -+ psCleanup->psResItem = psResItem; -+ -+ return (IMG_HANDLE)psCleanup; -+} -+ -+IMG_EXPORT -+PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext) -+{ -+ PVRSRV_ERROR eError; -+ SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup; -+ -+ PVR_ASSERT(hHWTransferContext != IMG_NULL); -+ -+ psCleanup = (SGX_HW_TRANSFER_CONTEXT_CLEANUP *)hHWTransferContext; -+ -+ eError = ResManFreeResByPtr(psCleanup->psResItem, IMG_TRUE); -+ -+ return eError; -+} -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+typedef struct _SGX_HW_2D_CONTEXT_CLEANUP_ -+{ -+ PVRSRV_DEVICE_NODE *psDeviceNode; -+ IMG_DEV_VIRTADDR sHW2DContextDevVAddr; -+ IMG_HANDLE hBlockAlloc; -+ PRESMAN_ITEM psResItem; -+} SGX_HW_2D_CONTEXT_CLEANUP; -+ -+static PVRSRV_ERROR SGXCleanupHW2DContextCallback(IMG_UINT32 ui32ProcessID, IMG_PVOID pvParam, IMG_UINT32 ui32Param) -+{ -+ SGX_HW_2D_CONTEXT_CLEANUP *psCleanup = (SGX_HW_2D_CONTEXT_CLEANUP *)pvParam; -+ -+ PVR_UNREFERENCED_PARAMETER(ui32ProcessID); -+ PVR_UNREFERENCED_PARAMETER(ui32Param); -+ -+ SGXCleanupRequest(psCleanup->psDeviceNode, -+ &psCleanup->sHW2DContextDevVAddr, PVRSRV_USSE_EDM_RESMAN_CLEANUP_2DC_REQUEST); -+ -+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(SGX_HW_2D_CONTEXT_CLEANUP), -+ psCleanup, -+ psCleanup->hBlockAlloc); -+ -+ return PVRSRV_OK; -+} -+ -+IMG_EXPORT -+IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR *psHW2DContextDevVAddr) -+{ -+ PVRSRV_ERROR eError; -+ IMG_HANDLE hBlockAlloc; -+ SGX_HW_2D_CONTEXT_CLEANUP *psCleanup; -+ PRESMAN_ITEM psResItem; -+ -+ eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(SGX_HW_2D_CONTEXT_CLEANUP), -+ (IMG_VOID **)&psCleanup, -+ &hBlockAlloc); -+ -+ if (eError != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHW2DContextKM: Couldn't allocate memory for SGX_HW_2D_CONTEXT_CLEANUP structure")); -+ return IMG_NULL; -+ } -+ -+ psCleanup->hBlockAlloc = hBlockAlloc; -+ psCleanup->psDeviceNode = (PVRSRV_DEVICE_NODE *)psDeviceNode; -+ psCleanup->sHW2DContextDevVAddr = *psHW2DContextDevVAddr; -+ -+ psResItem = ResManRegisterRes(RESMAN_TYPE_HW_2D_CONTEXT, -+ (IMG_VOID *)psCleanup, -+ 0, -+ &SGXCleanupHW2DContextCallback, -+ 0); -+ -+ if (psResItem == IMG_NULL) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHW2DContextKM: ResManRegisterRes failed")); -+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, -+ sizeof(SGX_HW_2D_CONTEXT_CLEANUP), -+ psCleanup, -+ psCleanup->hBlockAlloc); -+ -+ return IMG_NULL; -+ } -+ -+ psCleanup->psResItem = psResItem; -+ -+ return (IMG_HANDLE)psCleanup; -+} -+ -+IMG_EXPORT -+PVRSRV_ERROR SGXUnregisterHW2DContextKM(IMG_HANDLE hHW2DContext) -+{ -+ PVRSRV_ERROR eError; -+ SGX_HW_2D_CONTEXT_CLEANUP *psCleanup; -+ -+ PVR_ASSERT(hHW2DContext != IMG_NULL); -+ -+ psCleanup = (SGX_HW_2D_CONTEXT_CLEANUP *)hHW2DContext; - - eError = ResManFreeResByPtr(psCleanup->psResItem, IMG_TRUE); - - return eError; - } -+#endif -+ -+IMG_EXPORT -+IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr) -+{ -+ PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr != IMG_NULL); -+ -+ SGXCleanupRequest((PVRSRV_DEVICE_NODE *)psDeviceNode, &sHWRTDataSetDevVAddr, PVRSRV_USSE_EDM_RESMAN_CLEANUP_RT_REQUEST); -+} - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.h git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.h ---- git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxutils.h 2008-12-18 15:47:29.000000000 +0100 -@@ -73,6 +73,13 @@ - IMG_BOOL bDumpPolls); - #endif - -+ -+#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -+IMG_IMPORT -+IMG_VOID SGXTestActivePowerEvent(PVRSRV_DEVICE_NODE *psDeviceNode, -+ IMG_UINT32 ui32CallerID); -+#endif -+ - IMG_IMPORT - PVRSRV_ERROR SGXScheduleCCBCommandKM(PVRSRV_DEVICE_NODE *psDeviceNode, - PVRSRV_SGX_COMMAND_TYPE eCommandType, -@@ -80,14 +87,31 @@ - IMG_UINT32 ui32CallerID); - - IMG_IMPORT -+IMG_VOID SGXScheduleProcessQueues(PVRSRV_DEVICE_NODE *psDeviceNode); -+ -+IMG_IMPORT - IMG_BOOL SGXIsDevicePowered(PVRSRV_DEVICE_NODE *psDeviceNode); - - IMG_IMPORT --IMG_HANDLE SGXRegisterHWRenderContextKM(PVRSRV_SGXDEV_INFO *psSGXDevInfo, IMG_DEV_VIRTADDR *psHWRenderContextDevVAddr); -+IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE psSGXDevInfo, IMG_DEV_VIRTADDR *psHWRenderContextDevVAddr); - - IMG_IMPORT --IMG_VOID SGXFlushHWRenderTargetKM(PVRSRV_SGXDEV_INFO *psSGXDevInfo, IMG_DEV_VIRTADDR psHWRTDataSetDevVAddr); -+IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE psSGXDevInfo, IMG_DEV_VIRTADDR *psHWTransferContextDevVAddr); -+ -+IMG_IMPORT -+IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psSGXDevInfo, IMG_DEV_VIRTADDR psHWRTDataSetDevVAddr); - - IMG_IMPORT - PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext); - -+IMG_IMPORT -+PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext); -+ -+#if defined(SGX_FEATURE_2D_HARDWARE) -+IMG_IMPORT -+IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE psSGXDevInfo, IMG_DEV_VIRTADDR *psHW2DContextDevVAddr); -+ -+IMG_IMPORT -+PVRSRV_ERROR SGXUnregisterHW2DContextKM(IMG_HANDLE hHW2DContext); -+#endif -+ -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/env_data.h git/drivers/gpu/pvr/services4/srvkm/env/linux/env_data.h ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/env_data.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/env_data.h 2008-12-18 15:47:29.000000000 +0100 -@@ -33,6 +33,12 @@ - #define PVRSRV_MAX_BRIDGE_IN_SIZE 0x1000 - #define PVRSRV_MAX_BRIDGE_OUT_SIZE 0x1000 - -+typedef struct _PVR_PCI_DEV_TAG -+{ -+ struct pci_dev *psPCIDev; -+ HOST_PCI_INIT_FLAGS ePCIFlags; -+ IMG_BOOL abPCIResourceInUse[DEVICE_COUNT_RESOURCE]; -+} PVR_PCI_DEV; - - typedef struct _ENV_DATA_TAG - { -@@ -43,8 +49,6 @@ - IMG_UINT32 ui32IRQ; - IMG_VOID *pvISRCookie; - struct tasklet_struct sMISRTasklet; -- struct pci_dev *psPCIDev; -- IMG_BOOL abPCIResourceInUse[DEVICE_COUNT_RESOURCE]; - } ENV_DATA; - - #endif -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/event.c git/drivers/gpu/pvr/services4/srvkm/env/linux/event.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/event.c 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/event.c 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,221 @@ -+/********************************************************************** -+ * -+ * 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 AUTOCONF_INCLUDED -+ #include <linux/config.h> -+#endif -+ -+#include <linux/version.h> -+#include <asm/io.h> -+#include <asm/page.h> -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)) -+#include <asm/system.h> -+#endif -+#include <linux/mm.h> -+#include <linux/slab.h> -+#include <linux/vmalloc.h> -+#include <linux/delay.h> -+#include <linux/pci.h> -+ -+#include <linux/string.h> -+#include <linux/sched.h> -+#include <linux/interrupt.h> -+#include <asm/hardirq.h> -+#include <linux/timer.h> -+#include <linux/capability.h> -+#include <asm/uaccess.h> -+ -+#include "img_types.h" -+#include "services_headers.h" -+#include "mm.h" -+#include "pvrmmap.h" -+#include "mmap.h" -+#include "env_data.h" -+#include "proc.h" -+#include "mutex.h" -+ -+typedef struct PVRSRV_LINUX_EVENT_OBJECT_LIST_TAG -+{ -+ rwlock_t sLock; -+ struct list_head sList; -+ -+} PVRSRV_LINUX_EVENT_OBJECT_LIST; -+ -+ -+typedef struct PVRSRV_LINUX_EVENT_OBJECT_TAG -+{ -+ struct completion sCompletion; -+ struct list_head sList; -+ IMG_HANDLE hResItem; -+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList; -+} PVRSRV_LINUX_EVENT_OBJECT; -+ -+PVRSRV_ERROR LinuxEventObjectListCreate(IMG_HANDLE *phEventObjectList) -+{ -+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psEvenObjectList; -+ -+ if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT_LIST), -+ (IMG_VOID **)&psEvenObjectList, IMG_NULL) != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "LinuxEventObjectCreate: failed to allocate memory for event list")); -+ return PVRSRV_ERROR_OUT_OF_MEMORY; -+ } -+ -+ INIT_LIST_HEAD(&psEvenObjectList->sList); -+ -+ rwlock_init(&psEvenObjectList->sLock); -+ -+ *phEventObjectList = (IMG_HANDLE *) psEvenObjectList; -+ -+ return PVRSRV_OK; -+} -+ -+PVRSRV_ERROR LinuxEventObjectListDestroy(IMG_HANDLE hEventObjectList) -+{ -+ -+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psEvenObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST *) hEventObjectList ; -+ -+ if(psEvenObjectList) -+ { -+ if (!list_empty(&psEvenObjectList->sList)) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "LinuxEventObjectListDestroy: Event List is not empty")); -+ return PVRSRV_ERROR_GENERIC; -+ } -+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT_LIST), psEvenObjectList, IMG_NULL); -+ } -+ return PVRSRV_OK; -+} -+ -+ -+PVRSRV_ERROR LinuxEventObjectDelete(IMG_HANDLE hOSEventObjectList, IMG_HANDLE hOSEventObject, IMG_BOOL bResManCallback) -+{ -+ if(hOSEventObjectList) -+ { -+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST*)hOSEventObjectList; -+ if(hOSEventObject) -+ { -+ PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject = (PVRSRV_LINUX_EVENT_OBJECT *)hOSEventObject; -+ write_lock_bh(&psLinuxEventObjectList->sLock); -+ list_del(&psLinuxEventObject->sList); -+ write_unlock_bh(&psLinuxEventObjectList->sLock); -+ -+ -+ if(!bResManCallback && psLinuxEventObject->hResItem) -+ { -+ if(ResManFreeResByPtr(psLinuxEventObject->hResItem, IMG_FALSE) != PVRSRV_OK) -+ { -+ return PVRSRV_ERROR_GENERIC; -+ } -+ } -+ -+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT), psLinuxEventObject, IMG_NULL); -+ -+ return PVRSRV_OK; -+ } -+ } -+ return PVRSRV_ERROR_GENERIC; -+ -+} -+ -+static PVRSRV_ERROR LinuxEventObjectDeleteCallback(IMG_UINT32 ui32ProcessID, IMG_PVOID pvParam, IMG_UINT32 ui32Param) -+{ -+ if(pvParam) -+ { -+ PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject = (PVRSRV_LINUX_EVENT_OBJECT *)pvParam; -+ if(psLinuxEventObject->psLinuxEventObjectList) -+ { -+ IMG_HANDLE hOSEventObjectList = (IMG_HANDLE)psLinuxEventObject->psLinuxEventObjectList; -+ return LinuxEventObjectDelete(hOSEventObjectList,(IMG_HANDLE) psLinuxEventObject, IMG_TRUE); -+ } -+ } -+ return PVRSRV_ERROR_GENERIC; -+} -+PVRSRV_ERROR LinuxEventObjectAdd(IMG_HANDLE hOSEventObjectList, IMG_HANDLE *phOSEventObject) -+ { -+ PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject; -+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST*)hOSEventObjectList; -+ -+ -+ if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT), -+ (IMG_VOID **)&psLinuxEventObject, IMG_NULL) != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "LinuxEventObjectAdd: failed to allocate memory ")); -+ return PVRSRV_ERROR_OUT_OF_MEMORY; -+ } -+ -+ INIT_LIST_HEAD(&psLinuxEventObject->sList); -+ -+ init_completion(&psLinuxEventObject->sCompletion); -+ -+ -+ psLinuxEventObject->psLinuxEventObjectList = psLinuxEventObjectList; -+ -+ psLinuxEventObject->hResItem = (IMG_HANDLE)ResManRegisterRes(RESMAN_TYPE_EVENT_OBJECT, -+ psLinuxEventObject, -+ 0, -+ &LinuxEventObjectDeleteCallback, -+ 0); -+ -+ write_lock_bh(&psLinuxEventObjectList->sLock); -+ list_add(&psLinuxEventObject->sList, &psLinuxEventObjectList->sList); -+ write_unlock_bh(&psLinuxEventObjectList->sLock); -+ -+ *phOSEventObject = psLinuxEventObject; -+ -+ return PVRSRV_OK; -+} -+ -+PVRSRV_ERROR LinuxEventObjectSignal(IMG_HANDLE hOSEventObjectList) -+{ -+ PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject; -+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST*)hOSEventObjectList; -+ struct list_head *psListEntry, *psListEntryTemp, *psList; -+ psList = &psLinuxEventObjectList->sList; -+ -+ list_for_each_safe(psListEntry, psListEntryTemp, psList) -+ { -+ psLinuxEventObject = list_entry(psListEntry, PVRSRV_LINUX_EVENT_OBJECT, sList); -+ complete(&psLinuxEventObject->sCompletion); -+ } -+ return PVRSRV_OK; -+ -+} -+ -+PVRSRV_ERROR LinuxEventObjectWait(IMG_HANDLE hOSEventObject, IMG_UINT32 ui32MSTimeout) -+{ -+ PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject = (PVRSRV_LINUX_EVENT_OBJECT *) hOSEventObject; -+ -+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)) -+ if(wait_for_completion_timeout(&psLinuxEventObject->sCompletion, msecs_to_jiffies(ui32MSTimeout)) == 0) -+ { -+ return PVRSRV_ERROR_TIMEOUT; -+ } -+#else -+ wait_for_completion(&psLinuxEventObject->sCompletion); -+#endif -+ return PVRSRV_OK; -+} -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/event.h git/drivers/gpu/pvr/services4/srvkm/env/linux/event.h ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/event.h 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/event.h 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,32 @@ -+/********************************************************************** -+ * -+ * 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 -+ * -+ ******************************************************************************/ -+ -+PVRSRV_ERROR LinuxEventObjectListCreate(IMG_HANDLE *phEventObjectList); -+PVRSRV_ERROR LinuxEventObjectListDestroy(IMG_HANDLE hEventObjectList); -+PVRSRV_ERROR LinuxEventObjectAdd(IMG_HANDLE hOSEventObjectList, IMG_HANDLE *phOSEventObject); -+PVRSRV_ERROR LinuxEventObjectDelete(IMG_HANDLE hOSEventObjectList, IMG_HANDLE hOSEventObject, IMG_BOOL bResManCallback); -+PVRSRV_ERROR LinuxEventObjectSignal(IMG_HANDLE hOSEventObjectList); -+PVRSRV_ERROR LinuxEventObjectWait(IMG_HANDLE hOSEventObject, IMG_UINT32 ui32MSTimeout); -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/kbuild/Makefile git/drivers/gpu/pvr/services4/srvkm/env/linux/kbuild/Makefile ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/kbuild/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/kbuild/Makefile 2008-12-18 15:47:29.000000000 +0100 -@@ -0,0 +1,81 @@ -+# -+# 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 -+# -+# -+ -+# -+MODULE = pvrsrvkm -+ -+KBUILDROOT = ../../../.. -+ -+INCLUDES = -I$(EURASIAROOT)/include4 \ -+ -I$(EURASIAROOT)/services4/include \ -+ -I$(EURASIAROOT)/services4/srvkm/env/linux \ -+ -I$(EURASIAROOT)/services4/srvkm/include \ -+ -I$(EURASIAROOT)/services4/srvkm/bridged \ -+ -I$(EURASIAROOT)/services4/srvkm/devices/sgx \ -+ -I$(EURASIAROOT)/services4/system/$(PVR_SYSTEM) \ -+ -I$(EURASIAROOT)/services4/system/include -+ -+ -+SOURCES = $(KBUILDROOT)/srvkm/env/linux/osfunc.c \ -+ $(KBUILDROOT)/srvkm/env/linux/mmap.c \ -+ $(KBUILDROOT)/srvkm/env/linux/module.c \ -+ $(KBUILDROOT)/srvkm/env/linux/pdump.c \ -+ $(KBUILDROOT)/srvkm/env/linux/proc.c \ -+ $(KBUILDROOT)/srvkm/env/linux/pvr_bridge_k.c \ -+ $(KBUILDROOT)/srvkm/env/linux/pvr_debug.c \ -+ $(KBUILDROOT)/srvkm/env/linux/mm.c \ -+ $(KBUILDROOT)/srvkm/env/linux/mutex.c \ -+ $(KBUILDROOT)/srvkm/env/linux/event.c -+ -+SOURCES += $(KBUILDROOT)/srvkm/common/buffer_manager.c \ -+ $(KBUILDROOT)/srvkm/common/devicemem.c \ -+ $(KBUILDROOT)/srvkm/common/deviceclass.c \ -+ $(KBUILDROOT)/srvkm/common/handle.c \ -+ $(KBUILDROOT)/srvkm/common/hash.c \ -+ $(KBUILDROOT)/srvkm/common/metrics.c \ -+ $(KBUILDROOT)/srvkm/common/pvrsrv.c \ -+ $(KBUILDROOT)/srvkm/common/queue.c \ -+ $(KBUILDROOT)/srvkm/common/ra.c \ -+ $(KBUILDROOT)/srvkm/common/resman.c \ -+ $(KBUILDROOT)/srvkm/common/power.c \ -+ $(KBUILDROOT)/srvkm/common/mem.c \ -+ $(KBUILDROOT)/srvkm/bridged/bridged_pvr_bridge.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/sgxinit.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/sgxreset.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/sgxutils.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/sgxkick.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/sgxtransfer.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/mmu.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/pb.c \ -+ $(KBUILDROOT)/srvkm/common/perproc.c \ -+ $(KBUILDROOT)/../services4/system/$(PVR_SYSTEM)/sysconfig.c \ -+ $(KBUILDROOT)/../services4/system/$(PVR_SYSTEM)/sysutils.c \ -+ $(KBUILDROOT)/srvkm/devices/sgx/sgx2dcore.c -+ -+ -+INCLUDES += -I$(EURASIAROOT)/services4/srvkm/hwdefs -+ -+ -+ -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/mm.c git/drivers/gpu/pvr/services4/srvkm/env/linux/mm.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/mm.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/mm.c 2008-12-18 15:47:29.000000000 +0100 -@@ -37,6 +37,7 @@ - #endif - #include <linux/slab.h> - #include <linux/highmem.h> -+#include <linux/sched.h> - - #include "img_defs.h" - #include "services.h" -@@ -1078,7 +1079,11 @@ - #if defined(DEBUG_LINUX_SLAB_ALLOCATIONS) - ui32Flags |= SLAB_POISON|SLAB_RED_ZONE; - #endif -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) - return kmem_cache_create(pszName, Size, Align, ui32Flags, NULL); -+#else -+ return kmem_cache_create(pszName, Size, Align, ui32Flags, NULL, NULL); -+#endif - } - - -@@ -1445,9 +1450,6 @@ - const IMG_CHAR * - LinuxMemAreaTypeToString(LINUX_MEM_AREA_TYPE eMemAreaType) - { -- PVR_ASSERT(LINUX_MEM_AREA_TYPE_COUNT == 5); -- PVR_ASSERT(eMemAreaType < LINUX_MEM_AREA_TYPE_COUNT); -- - - switch(eMemAreaType) - { -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/module.c git/drivers/gpu/pvr/services4/srvkm/env/linux/module.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/module.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/module.c 2008-12-18 15:47:29.000000000 +0100 -@@ -25,7 +25,7 @@ - ******************************************************************************/ - - #ifndef AUTOCONF_INCLUDED --// #include <linux/config.h> -+ #include <linux/config.h> - #endif - - #include <linux/init.h> -@@ -34,9 +34,19 @@ - #include <linux/version.h> - #include <linux/fs.h> - #include <linux/proc_fs.h> -+ - #if defined(LDM_PLATFORM) - #include <linux/platform_device.h> - #endif -+ -+#if defined(LDM_PCI) -+#include <linux/pci.h> -+#endif -+ -+#if defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL) -+#include <asm/uaccess.h> -+#endif -+ - #include "img_defs.h" - #include "services.h" - #include "kerneldisplay.h" -@@ -51,15 +61,13 @@ - #include "handle.h" - #include "pvr_bridge_km.h" - #include "proc.h" -- -+#include "pvrmodule.h" - - #define CLASSNAME "powervr" - #define DRVNAME "pvrsrvkm" - #define DEVNAME "pvrsrvkm" - - --MODULE_AUTHOR("Imagination Technologies Ltd. <gpl-support@imgtec.com>"); --MODULE_LICENSE("GPL"); - MODULE_SUPPORTED_DEVICE(DEVNAME); - #ifdef DEBUG - static int debug = DBGPRIV_WARNING; -@@ -99,24 +107,75 @@ - }; - - -+#if defined(LDM_PLATFORM) || defined(LDM_PCI) -+ - #if defined(LDM_PLATFORM) --static int PVRSRVDriverRemove(struct platform_device *device); --static int PVRSRVDriverProbe(struct platform_device *device); --static int PVRSRVDriverSuspend(struct platform_device *device, pm_message_t state); --static void PVRSRVDriverShutdown(struct platform_device *device); --static int PVRSRVDriverResume(struct platform_device *device); -+#define LDM_DEV struct platform_device -+#define LDM_DRV struct platform_driver -+#if defined(LDM_PCI) -+#undef LDM_PCI -+#endif -+#endif - --static struct platform_driver powervr_driver = { -+#if defined(LDM_PCI) -+#define LDM_DEV struct pci_dev -+#define LDM_DRV struct pci_driver -+#endif -+ -+//static void PVRSRVClassDeviceRelease(struct class_device *class_device); -+ -+/*static struct class powervr_class = { -+ .name = CLASSNAME, -+ .release = PVRSRVClassDeviceRelease -+};*/ -+ -+#if defined(LDM_PLATFORM) -+static int PVRSRVDriverRemove(LDM_DEV *device); -+static int PVRSRVDriverProbe(LDM_DEV *device); -+#endif -+#if defined(LDM_PCI) -+static void PVRSRVDriverRemove(LDM_DEV *device); -+static int PVRSRVDriverProbe(LDM_DEV *device, const struct pci_device_id *id); -+#endif -+static int PVRSRVDriverSuspend(LDM_DEV *device, pm_message_t state); -+static void PVRSRVDriverShutdown(LDM_DEV *device); -+static int PVRSRVDriverResume(LDM_DEV *device); -+ -+#if defined(LDM_PCI) -+struct pci_device_id powervr_id_table[] __devinitdata = { -+ { PCI_DEVICE(SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV_DEVICE_ID2) }, -+ { 0 } -+}; -+ -+MODULE_DEVICE_TABLE(pci, powervr_id_table); -+#endif -+ -+static LDM_DRV powervr_driver = { -+#if defined(LDM_PLATFORM) - .driver = { -- .name = DEVNAME, -+ .name = DRVNAME, - }, -+#endif -+#if defined(LDM_PCI) -+ .name = DRVNAME, -+ .id_table = powervr_id_table, -+#endif - .probe = PVRSRVDriverProbe, -+#if defined(LDM_PLATFORM) - .remove = PVRSRVDriverRemove, -+#endif -+#if defined(LDM_PCI) -+ .remove = __devexit_p(PVRSRVDriverRemove), -+#endif - .suspend = PVRSRVDriverSuspend, - .resume = PVRSRVDriverResume, - .shutdown = PVRSRVDriverShutdown, - }; - -+LDM_DEV *gpsPVRLDMDev; -+ -+ -+#if defined(LDM_PLATFORM) - static void PVRSRVDeviceRelease(struct device *device); - - static struct platform_device powervr_device = { -@@ -126,18 +185,79 @@ - .release = PVRSRVDeviceRelease - } - }; -+#endif - - -+static ssize_t PVRSRVShowDev(struct class_device *pClassDevice, char *buf) -+{ -+ PVR_TRACE(("PVRSRVShowDev(pClassDevice=%p)", pClassDevice)); - --static int PVRSRVDriverProbe(struct platform_device *pDevice) -+ return snprintf(buf, PAGE_SIZE, "%d:0\n", AssignedMajorNumber); -+} -+ -+//static CLASS_DEVICE_ATTR(dev, S_IRUGO, PVRSRVShowDev, NULL); -+ -+/*static void PVRSRVClassDeviceRelease(struct class_device *pClassDevice) -+{ -+ PVR_TRACE(("PVRSRVClassDeviceRelease(pClassDevice=%p)", pClassDevice)); -+ -+ kfree(pClassDevice); -+}*/ -+ -+#if defined(LDM_PLATFORM) -+static int PVRSRVDriverProbe(LDM_DEV *pDevice) -+#endif -+#if defined(LDM_PCI) -+static int __devinit PVRSRVDriverProbe(LDM_DEV *pDevice, const struct pci_device_id *id) -+#endif - { - SYS_DATA *psSysData; - PVRSRV_ERROR eError; -+ //struct class_device *pClassDevice; - int error; - -- PVR_DPF((PVR_DBG_WARNING, "PVRSRVDriverProbe(pDevice=%p)", pDevice)); -+ PVR_TRACE(("PVRSRVDriverProbe(pDevice=%p)", pDevice)); - -- pDevice->dev.driver_data = NULL; -+ pDevice->dev.driver_data = NULL; -+ /*pClassDevice = kmalloc(sizeof(*pClassDevice), GFP_KERNEL); -+ -+ if (pClassDevice == IMG_NULL) -+ { -+ PVR_DPF((PVR_DBG_ERROR, -+ "PVRSRVDriverProbe(pDevice=%p): no memory for class device instance.", -+ pDevice)); -+ -+ return -ENOMEM; -+ } -+ -+ memset(pClassDevice, 0, sizeof(*pClassDevice)); -+ -+ pDevice->dev.driver_data = (void *)pClassDevice; -+ -+ -+ strncpy(pClassDevice->class_id, DEVNAME, BUS_ID_SIZE); -+ -+ pClassDevice->class = &powervr_class; -+ pClassDevice->dev = &pDevice->dev; -+ -+ -+ if ((error = class_device_register(pClassDevice)) != 0) -+ { -+ kfree(pClassDevice); -+ -+ PVR_DPF((PVR_DBG_ERROR, -+ "PVRSRVDriverProbe(pDevice=%p): class_device_register failed (%d)", -+ pDevice, error)); -+ return error; -+ } -+ -+ if ((error = class_device_create_file(pClassDevice, &class_device_attr_dev)) != 0) -+ { -+ PVR_DPF((PVR_DBG_ERROR, -+ "PVRSRVDriverProbe(pDevice=%p): class_device_create_file failed (%d)", -+ pDevice, error)); -+ return error; -+ }*/ - - #if 0 - -@@ -149,37 +269,34 @@ - - if (SysAcquireData(&psSysData) != PVRSRV_OK) - { -+ gpsPVRLDMDev = pDevice; -+ - if (SysInitialise() != PVRSRV_OK) - { - return -ENODEV; - } -- -- eError = PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_TRUE); -- if(eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"PVRSRVDriverProbe: Failed to connect to resource manager")); -- error = -ENODEV; -- } - } - - return 0; - } - - --static int PVRSRVDriverRemove(struct platform_device *pDevice) -+#if defined (LDM_PLATFORM) -+static int PVRSRVDriverRemove(LDM_DEV *pDevice) -+#endif -+#if defined(LDM_PCI) -+static void __devexit PVRSRVDriverRemove(LDM_DEV *pDevice) -+#endif - { - SYS_DATA *psSysData; - -- PVR_DPF((PVR_DBG_WARNING, "PVRSRVDriverRemove(pDevice=%p)", pDevice)); -+ PVR_TRACE(("PVRSRVDriverRemove(pDevice=%p)", pDevice)); - -- if(PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_FALSE) != PVRSRV_OK) -- { -- return -EINVAL; -- } -- - if (SysAcquireData(&psSysData) == PVRSRV_OK) - { - SysDeinitialise(psSysData); -+ -+ gpsPVRLDMDev = IMG_NULL; - } - - #if 0 -@@ -189,68 +306,131 @@ - } - #endif - -+ //class_device_unregister((struct class_device *)pDevice->dev.driver_data); -+ -+ -+ pDevice->dev.driver_data = 0; - -+ -+#if defined (LDM_PLATFORM) - return 0; -+#endif -+#if defined (LDM_PCI) -+ return; -+#endif - } - - --static void PVRSRVDriverShutdown(struct platform_device *pDevice) -+static void PVRSRVDriverShutdown(LDM_DEV *pDevice) - { -- PVR_DPF((PVR_DBG_WARNING, "PVRSRVDriverShutdown(pDevice=%p)", pDevice)); -+ PVR_TRACE(("PVRSRVDriverShutdown(pDevice=%p)", pDevice)); - - (void) PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D3); - } - - --static int PVRSRVDriverSuspend(struct platform_device *pDevice, pm_message_t state) -+static int PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state) - { -- -- PVR_DPF((PVR_DBG_WARNING, -- "PVRSRVDriverSuspend(pDevice=%p)", -- pDevice)); -+#if !(defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL)) -+ PVR_TRACE(( "PVRSRVDriverSuspend(pDevice=%p)", pDevice)); - - if (PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D3) != PVRSRV_OK) - { - return -EINVAL; - } -- -+#endif - return 0; - } - - --static int PVRSRVDriverResume(struct platform_device *pDevice) -+static int PVRSRVDriverResume(LDM_DEV *pDevice) - { -- PVR_DPF((PVR_DBG_WARNING, "PVRSRVDriverResume(pDevice=%p)", pDevice)); -+#if !(defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL)) -+ PVR_TRACE(("PVRSRVDriverResume(pDevice=%p)", pDevice)); - - if (PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D0) != PVRSRV_OK) - { - return -EINVAL; - } -- -+#endif - return 0; - } - - -+#if defined(LDM_PLATFORM) - static void PVRSRVDeviceRelease(struct device *pDevice) - { - PVR_DPF((PVR_DBG_WARNING, "PVRSRVDeviceRelease(pDevice=%p)", pDevice)); - } - #endif -+#endif -+ -+ -+#if defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL) -+static IMG_UINT32 gPVRPowerLevel; -+ -+int PVRProcSetPowerLevel(struct file *file, const char *buffer, unsigned long count, void *data) -+{ -+ char data_buffer[2]; -+ IMG_UINT32 PVRPowerLevel; -+ -+ if (count != sizeof(data_buffer)) -+ { -+ return -EINVAL; -+ } -+ else -+ { -+ if (copy_from_user(data_buffer, buffer, count)) -+ return -EINVAL; -+ if (data_buffer[count - 1] != '\n') -+ return -EINVAL; -+ PVRPowerLevel = data_buffer[0] - '0'; -+ if (PVRPowerLevel != gPVRPowerLevel) -+ { -+ if (PVRPowerLevel != 0) -+ { -+ if (PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D3) != PVRSRV_OK) -+ { -+ return -EINVAL; -+ } -+ } -+ else -+ { -+ if (PVRSRVSetPowerStateKM(PVRSRV_POWER_STATE_D0) != PVRSRV_OK) -+ { -+ return -EINVAL; -+ } -+ } -+ -+ gPVRPowerLevel = PVRPowerLevel; -+ } -+ } -+ return (count); -+} -+ -+int PVRProcGetPowerLevel(char *page, char **start, off_t off, int count, int *eof, void *data) -+{ -+ if (off == 0) { -+ *start = (char *)1; -+ return printAppend(page, count, 0, "%lu\n", gPVRPowerLevel); -+ } -+ *eof = 1; -+ return 0; -+} -+#endif - - static int PVRSRVOpen(struct inode unref__ * pInode, struct file unref__ * pFile) - { - int Ret = 0; - -- PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVOpen")); -- -- LinuxLockMutex(&gPVRSRVLock); -+ LinuxLockMutex(&gPVRSRVLock); - - if (PVRSRVResManConnect(PVRSRVRESMAN_PROCESSID_FIND, IMG_TRUE) != PVRSRV_OK) - { - Ret = -ENOMEM; - } - -- LinuxUnLockMutex(&gPVRSRVLock); -+ LinuxUnLockMutex(&gPVRSRVLock); - - return Ret; - } -@@ -260,8 +440,6 @@ - { - int Ret = 0; - -- PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVRelease")); -- - if (PVRSRVResManConnect(PVRSRVRESMAN_PROCESSID_FIND, IMG_FALSE) != PVRSRV_OK) - { - Ret = -ENOMEM; -@@ -274,9 +452,12 @@ - static int __init PVRCore_Init(void) - { - int error; --#if !defined(LDM_PLATFORM) -+#if !(defined(LDM_PLATFORM) || defined(LDM_PCI)) - PVRSRV_ERROR eError; --#endif -+#endif -+ -+ PVR_TRACE(("PVRCore_Init")); -+ - - AssignedMajorNumber = register_chrdev(0, DEVNAME, &pvrsrv_fops); - -@@ -287,7 +468,7 @@ - return -EBUSY; - } - -- PVR_DPF((PVR_DBG_WARNING, "PVRCore_Init: major device %d", AssignedMajorNumber)); -+ PVR_TRACE(("PVRCore_Init: major device %d", AssignedMajorNumber)); - - - if (CreateProcEntries ()) -@@ -313,9 +494,19 @@ - - PVRMMapInit(); - -+#if defined(LDM_PLATFORM) || defined(LDM_PCI) -+ /*if ((error = class_register(&powervr_class)) != 0) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "PVRCore_Init: unable to register class (%d)", error)); -+ -+ goto init_failed; -+ }*/ -+ - #if defined(LDM_PLATFORM) - if ((error = platform_driver_register(&powervr_driver)) != 0) - { -+ //class_unregister(&powervr_class); -+ - PVR_DPF((PVR_DBG_ERROR, "PVRCore_Init: unable to register platform driver (%d)", error)); - - goto init_failed; -@@ -324,11 +515,25 @@ - if ((error = platform_device_register(&powervr_device)) != 0) - { - platform_driver_unregister(&powervr_driver); -+ //class_unregister(&powervr_class); - - PVR_DPF((PVR_DBG_ERROR, "PVRCore_Init: unable to register platform device (%d)", error)); - - goto init_failed; - } -+#endif -+ -+#if defined(LDM_PCI) -+ if ((error = pci_register_driver(&powervr_driver)) != 0) -+ { -+ //class_unregister(&powervr_class); -+ -+ PVR_DPF((PVR_DBG_ERROR, "PVRCore_Init: unable to register PCI driver (%d)", error)); -+ -+ goto init_failed; -+ } -+#endif -+ - #else - - if ((eError = SysInitialise()) != PVRSRV_OK) -@@ -343,20 +548,12 @@ - #endif - goto init_failed; - } -- -- eError = PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_TRUE); -- if(eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"PVRCore_Init: Failed to connect to resource manager")); -- error = -ENODEV; -- goto init_failed; -- } - #endif -+ - return 0; - - init_failed: - -- (void) PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_FALSE); - PVRMMapCleanup(); - LinuxMMCleanup(); - RemoveProcEntries(); -@@ -370,23 +567,34 @@ - static void __exit PVRCore_Cleanup(void) - { - SYS_DATA *psSysData; --#if !defined(LDM_PLATFORM) -+#if !(defined(LDM_PLATFORM) || defined (LDM_PCI)) - PVRSRV_ERROR eError; --#endif -+#endif -+ -+ PVR_TRACE(("PVRCore_Cleanup")); - - SysAcquireData(&psSysData); -- unregister_chrdev(AssignedMajorNumber, DRVNAME); - -+ /*if (unregister_chrdev(AssignedMajorNumber, DRVNAME)) -+ { -+ PVR_DPF((PVR_DBG_ERROR," can't unregister device major %d", AssignedMajorNumber)); -+ }*/ -+ unregister_chrdev(AssignedMajorNumber, DRVNAME); -+ -+#if defined(LDM_PLATFORM) || defined(LDM_PCI) -+ -+#if defined(LDM_PCI) -+ pci_unregister_driver(&powervr_driver); -+#endif -+ - #if defined (LDM_PLATFORM) - platform_device_unregister(&powervr_device); - platform_driver_unregister(&powervr_driver); --#else -- eError = PVRSRVResManConnect(RESMAN_KERNEL_PROCESSID, IMG_FALSE); -- if (eError != PVRSRV_OK) -- { -- PVR_DPF((PVR_DBG_ERROR,"KernelResManDisconnect: Failed to disconnect")); -- } -+#endif - -+ //class_unregister(&powervr_class); -+ -+#else - - SysDeinitialise(psSysData); - #endif -@@ -399,7 +607,7 @@ - - RemoveProcEntries(); - -- PVR_DPF((PVR_DBG_WARNING,"unloading")); -+ PVR_TRACE(("PVRCore_Cleanup: unloading")); - } - - module_init(PVRCore_Init); -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c git/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c 2008-12-18 15:47:29.000000000 +0100 -@@ -56,6 +56,9 @@ - #include "env_data.h" - #include "proc.h" - #include "mutex.h" -+#include "event.h" -+ -+#define EVENT_OBJECT_TIMEOUT_MS (100) - - extern PVRSRV_LINUX_MUTEX gPVRSRVLock; - -@@ -411,9 +414,6 @@ - psEnvData->bLISRInstalled = IMG_FALSE; - - -- psEnvData->psPCIDev = NULL; -- -- - *ppvEnvSpecificData = psEnvData; - - return PVRSRV_OK; -@@ -426,7 +426,6 @@ - - PVR_ASSERT(!psEnvData->bMISRInstalled); - PVR_ASSERT(!psEnvData->bLISRInstalled); -- PVR_ASSERT(psEnvData->psPCIDev == NULL); - - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 0x1000, psEnvData->pvBridgeData, IMG_NULL); - -@@ -1189,57 +1188,62 @@ - } - - #if defined(CONFIG_PCI) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)) --PVRSRV_ERROR OSPCIAcquireDev(IMG_VOID *pvSysData, IMG_UINT16 ui16VendorID, IMG_UINT16 ui16DeviceID, HOST_PCI_INIT_FLAGS eFlags) -+ -+IMG_HANDLE OSPCISetDev(IMG_VOID *pvPCICookie, HOST_PCI_INIT_FLAGS eFlags) - { -- SYS_DATA *psSysData = (SYS_DATA *)pvSysData; -- ENV_DATA *psEnvData = (ENV_DATA *)psSysData->pvEnvSpecificData; - int err; - IMG_UINT32 i; -+ PVR_PCI_DEV *psPVRPCI; - -- if (psEnvData->psPCIDev != NULL) -- { -- PVR_DPF((PVR_DBG_ERROR, "OSPCIAcquireDev: A device has already been acquired")); -- return PVRSRV_ERROR_GENERIC; -- } -+ PVR_TRACE(("OSPCISetDev")); - -- psEnvData->psPCIDev = pci_get_device(ui16VendorID, ui16DeviceID, psEnvData->psPCIDev); -- if (psEnvData->psPCIDev == NULL) -+ if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psPVRPCI), (IMG_VOID *)&psPVRPCI, IMG_NULL) != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR, "OSPCIAcquireDev: Couldn't acquire device")); -- return PVRSRV_ERROR_GENERIC; -+ PVR_DPF((PVR_DBG_ERROR, "OSPCISetDev: Couldn't allocate PVR PCI structure")); -+ return IMG_NULL; - } - -- err = pci_enable_device(psEnvData->psPCIDev); -+ psPVRPCI->psPCIDev = (struct pci_dev *)pvPCICookie; -+ psPVRPCI->ePCIFlags = eFlags; -+ -+ err = pci_enable_device(psPVRPCI->psPCIDev); - if (err != 0) - { -- PVR_DPF((PVR_DBG_ERROR, "OSPCIAcquireDev: Couldn't enable device (%d)", err)); -- return PVRSRV_ERROR_GENERIC; -+ PVR_DPF((PVR_DBG_ERROR, "OSPCISetDev: Couldn't enable device (%d)", err)); -+ return IMG_NULL; - } - -- if (eFlags & HOST_PCI_INIT_FLAG_BUS_MASTER) -- pci_set_master(psEnvData->psPCIDev); -+ if (psPVRPCI->ePCIFlags & HOST_PCI_INIT_FLAG_BUS_MASTER) -+ pci_set_master(psPVRPCI->psPCIDev); - - - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) - { -- psEnvData->abPCIResourceInUse[i] = IMG_FALSE; -+ psPVRPCI->abPCIResourceInUse[i] = IMG_FALSE; - } - -- return PVRSRV_OK; -+ return (IMG_HANDLE)psPVRPCI; - } - --PVRSRV_ERROR OSPCIIRQ(IMG_VOID *pvSysData, IMG_UINT32 *pui32IRQ) -+IMG_HANDLE OSPCIAcquireDev(IMG_UINT16 ui16VendorID, IMG_UINT16 ui16DeviceID, HOST_PCI_INIT_FLAGS eFlags) - { -- SYS_DATA *psSysData = (SYS_DATA *)pvSysData; -- ENV_DATA *psEnvData = (ENV_DATA *)psSysData->pvEnvSpecificData; -+ struct pci_dev *psPCIDev; - -- if (psEnvData->psPCIDev == NULL) -+ psPCIDev = pci_get_device(ui16VendorID, ui16DeviceID, NULL); -+ if (psPCIDev == NULL) - { -- PVR_DPF((PVR_DBG_ERROR, "OSPCIIRQ: Device hasn't been acquired")); -- return PVRSRV_ERROR_GENERIC; -+ PVR_DPF((PVR_DBG_ERROR, "OSPCIAcquireDev: Couldn't acquire device")); -+ return IMG_NULL; - } - -- *pui32IRQ = psEnvData->psPCIDev->irq; -+ return OSPCISetDev((IMG_VOID *)psPCIDev, eFlags); -+} -+ -+PVRSRV_ERROR OSPCIIRQ(IMG_HANDLE hPVRPCI, IMG_UINT32 *pui32IRQ) -+{ -+ PVR_PCI_DEV *psPVRPCI = (PVR_PCI_DEV *)hPVRPCI; -+ -+ *pui32IRQ = psPVRPCI->psPCIDev->irq; - - return PVRSRV_OK; - } -@@ -1254,19 +1258,12 @@ - }; - - static IMG_UINT32 OSPCIAddrRangeFunc(enum HOST_PCI_ADDR_RANGE_FUNC eFunc, -- IMG_VOID *pvSysData, -+ IMG_HANDLE hPVRPCI, - IMG_UINT32 ui32Index - - ) - { -- SYS_DATA *psSysData = (SYS_DATA *)pvSysData; -- ENV_DATA *psEnvData = (ENV_DATA *)psSysData->pvEnvSpecificData; -- -- if (psEnvData->psPCIDev == NULL) -- { -- PVR_DPF((PVR_DBG_ERROR, "OSPCIAddrRangeFunc: Device hasn't been acquired")); -- return 0; -- } -+ PVR_PCI_DEV *psPVRPCI = (PVR_PCI_DEV *)hPVRPCI; - - if (ui32Index >= DEVICE_COUNT_RESOURCE) - { -@@ -1278,32 +1275,32 @@ - switch (eFunc) - { - case HOST_PCI_ADDR_RANGE_FUNC_LEN: -- return pci_resource_len(psEnvData->psPCIDev, ui32Index); -+ return pci_resource_len(psPVRPCI->psPCIDev, ui32Index); - case HOST_PCI_ADDR_RANGE_FUNC_START: -- return pci_resource_start(psEnvData->psPCIDev, ui32Index); -+ return pci_resource_start(psPVRPCI->psPCIDev, ui32Index); - case HOST_PCI_ADDR_RANGE_FUNC_END: -- return pci_resource_end(psEnvData->psPCIDev, ui32Index); -+ return pci_resource_end(psPVRPCI->psPCIDev, ui32Index); - case HOST_PCI_ADDR_RANGE_FUNC_REQUEST: - { - - - #ifdef FIXME - int err; -- err = pci_request_region(psEnvData->psPCIDev, ui32Index, "PowerVR"); -+ err = pci_request_region(psPVRPCI->psPCIDev, ui32Index, "PowerVR"); - if (err != 0) - { - PVR_DPF((PVR_DBG_ERROR, "OSPCIAddrRangeFunc: pci_request_region_failed (%d)", err)); - return 0; - } - #endif -- psEnvData->abPCIResourceInUse[ui32Index] = IMG_TRUE; -+ psPVRPCI->abPCIResourceInUse[ui32Index] = IMG_TRUE; - return 1; - } - case HOST_PCI_ADDR_RANGE_FUNC_RELEASE: -- if (psEnvData->abPCIResourceInUse[ui32Index]) -+ if (psPVRPCI->abPCIResourceInUse[ui32Index]) - { -- pci_release_region(psEnvData->psPCIDev, ui32Index); -- psEnvData->abPCIResourceInUse[ui32Index] = IMG_FALSE; -+ pci_release_region(psPVRPCI->psPCIDev, ui32Index); -+ psPVRPCI->abPCIResourceInUse[ui32Index] = IMG_FALSE; - } - return 1; - default: -@@ -1314,62 +1311,160 @@ - return 0; - } - --IMG_UINT32 OSPCIAddrRangeLen(IMG_VOID *pvSysData, IMG_UINT32 ui32Index) -+IMG_UINT32 OSPCIAddrRangeLen(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index) - { -- return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_LEN, pvSysData, ui32Index); -+ return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_LEN, hPVRPCI, ui32Index); - } - --IMG_UINT32 OSPCIAddrRangeStart(IMG_VOID *pvSysData, IMG_UINT32 ui32Index) -+IMG_UINT32 OSPCIAddrRangeStart(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index) - { -- return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_START, pvSysData, ui32Index); -+ return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_START, hPVRPCI, ui32Index); - } - --IMG_UINT32 OSPCIAddrRangeEnd(IMG_VOID *pvSysData, IMG_UINT32 ui32Index) -+IMG_UINT32 OSPCIAddrRangeEnd(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index) - { -- return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_END, pvSysData, ui32Index); -+ return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_END, hPVRPCI, ui32Index); - } - --PVRSRV_ERROR OSPCIRequestAddrRange(IMG_VOID *pvSysData, -- IMG_UINT32 ui32Index -- --) -+PVRSRV_ERROR OSPCIRequestAddrRange(IMG_HANDLE hPVRPCI, -+ IMG_UINT32 ui32Index) - { -- return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_REQUEST, pvSysData, ui32Index) == 0 ? PVRSRV_ERROR_GENERIC : PVRSRV_OK; -+ return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_REQUEST, hPVRPCI, ui32Index) == 0 ? PVRSRV_ERROR_GENERIC : PVRSRV_OK; - } - --PVRSRV_ERROR OSPCIReleaseAddrRange(IMG_VOID *pvSysData, IMG_UINT32 ui32Index) -+PVRSRV_ERROR OSPCIReleaseAddrRange(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index) - { -- return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_RELEASE, pvSysData, ui32Index) == 0 ? PVRSRV_ERROR_GENERIC : PVRSRV_OK; -+ return OSPCIAddrRangeFunc(HOST_PCI_ADDR_RANGE_FUNC_RELEASE, hPVRPCI, ui32Index) == 0 ? PVRSRV_ERROR_GENERIC : PVRSRV_OK; - } - --PVRSRV_ERROR OSPCIReleaseDev(IMG_VOID *pvSysData) -+PVRSRV_ERROR OSPCIReleaseDev(IMG_HANDLE hPVRPCI) - { -- SYS_DATA *psSysData = (SYS_DATA *)pvSysData; -- ENV_DATA *psEnvData = (ENV_DATA *)psSysData->pvEnvSpecificData; -+ PVR_PCI_DEV *psPVRPCI = (PVR_PCI_DEV *)hPVRPCI; - int i; - -- if (psEnvData->psPCIDev == NULL) -+ PVR_TRACE(("OSPCIReleaseDev")); -+ -+ -+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) - { -- return PVRSRV_OK; -+ if (psPVRPCI->abPCIResourceInUse[i]) -+ { -+ PVR_TRACE(("OSPCIReleaseDev: Releasing Address range %d", i)); -+ pci_release_region(psPVRPCI->psPCIDev, i); -+ psPVRPCI->abPCIResourceInUse[i] = IMG_FALSE; -+ } - } - -+ pci_disable_device(psPVRPCI->psPCIDev); -+ -+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psPVRPCI), (IMG_VOID *)psPVRPCI, IMG_NULL); -+ -+ return PVRSRV_OK; -+} -+ -+PVRSRV_ERROR OSPCISuspendDev(IMG_HANDLE hPVRPCI) -+{ -+ PVR_PCI_DEV *psPVRPCI = (PVR_PCI_DEV *)hPVRPCI; -+ int i; -+ int err; -+ -+ PVR_TRACE(("OSPCISuspendDev")); -+ - - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) - { -- if (psEnvData->abPCIResourceInUse[i]) -+ if (psPVRPCI->abPCIResourceInUse[i]) - { -- PVR_TRACE(("OSPCIReleaseDev: Releasing Address range %d", i)); -- pci_release_region(psEnvData->psPCIDev, i); -- psEnvData->abPCIResourceInUse[i] = IMG_FALSE; -+ pci_release_region(psPVRPCI->psPCIDev, i); - } - } - -- pci_disable_device(psEnvData->psPCIDev); -+ err = pci_save_state(psPVRPCI->psPCIDev); -+ if (err != 0) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "OSPCISuspendDev: pci_save_state_failed (%d)", err)); -+ return PVRSRV_ERROR_GENERIC; -+ } - -- psEnvData->psPCIDev = NULL; -+ pci_disable_device(psPVRPCI->psPCIDev); -+ -+ err = pci_set_power_state(psPVRPCI->psPCIDev, PCI_D3cold); -+ switch(err) -+ { -+ case 0: -+ break; -+ case -EIO: -+ PVR_DPF((PVR_DBG_WARNING, "OSPCISuspendDev: device doesn't support PCI PM")); -+ break; -+ case -EINVAL: -+ PVR_DPF((PVR_DBG_ERROR, "OSPCISuspendDev: can't enter requested power state")); -+ break; -+ default: -+ PVR_DPF((PVR_DBG_ERROR, "OSPCISuspendDev: pci_set_power_state failed (%d)", err)); -+ break; -+ } - - return PVRSRV_OK; - } -+ -+PVRSRV_ERROR OSPCIResumeDev(IMG_HANDLE hPVRPCI) -+{ -+ PVR_PCI_DEV *psPVRPCI = (PVR_PCI_DEV *)hPVRPCI; -+ int err; -+ int i; -+ -+ PVR_TRACE(("OSPCIResumeDev")); -+ -+ err = pci_set_power_state(psPVRPCI->psPCIDev, PCI_D0); -+ switch(err) -+ { -+ case 0: -+ break; -+ case -EIO: -+ PVR_DPF((PVR_DBG_WARNING, "OSPCIResumeDev: device doesn't support PCI PM")); -+ break; -+ case -EINVAL: -+ PVR_DPF((PVR_DBG_ERROR, "OSPCIResumeDev: can't enter requested power state")); -+ return PVRSRV_ERROR_GENERIC; -+ default: -+ PVR_DPF((PVR_DBG_ERROR, "OSPCIResumeDev: pci_set_power_state failed (%d)", err)); -+ return PVRSRV_ERROR_GENERIC; -+ } -+ -+ err = pci_restore_state(psPVRPCI->psPCIDev); -+ if (err != 0) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "OSPCIResumeDev: pci_restore_state failed (%d)", err)); -+ return PVRSRV_ERROR_GENERIC; -+ } -+ -+ err = pci_enable_device(psPVRPCI->psPCIDev); -+ if (err != 0) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "OSPCIResumeDev: Couldn't enable device (%d)", err)); -+ return PVRSRV_ERROR_GENERIC; -+ } -+ -+ if (psPVRPCI->ePCIFlags & HOST_PCI_INIT_FLAG_BUS_MASTER) -+ pci_set_master(psPVRPCI->psPCIDev); -+ -+ -+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) -+ { -+ if (psPVRPCI->abPCIResourceInUse[i]) -+ { -+ err = pci_request_region(psPVRPCI->psPCIDev, i, "PowerVR"); -+ if (err != 0) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "OSPCIResumeDev: pci_request_region_failed (region %d, error %d)", i, err)); -+ } -+ } -+ -+ } -+ -+ return PVRSRV_OK; -+} -+ - #endif - - typedef struct TIMER_CALLBACK_DATA_TAG -@@ -1418,7 +1513,7 @@ - - psTimerCBData->pfnTimerFunc = pfnTimerFunc; - psTimerCBData->pvData = pvData; -- psTimerCBData->bActive = IMG_TRUE; -+ psTimerCBData->bActive = IMG_FALSE; - - - -@@ -1434,14 +1529,36 @@ - psTimerCBData->sTimer.data = (IMG_UINT32)psTimerCBData; - psTimerCBData->sTimer.expires = psTimerCBData->ui32Delay + jiffies; - -+ return (IMG_HANDLE)psTimerCBData; -+} -+ -+ -+PVRSRV_ERROR OSRemoveTimer (IMG_HANDLE hTimer) -+{ -+ TIMER_CALLBACK_DATA *psTimerCBData = (TIMER_CALLBACK_DATA*)hTimer; -+ -+ -+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(TIMER_CALLBACK_DATA), psTimerCBData, IMG_NULL); -+ -+ return PVRSRV_OK; -+} -+ -+ -+PVRSRV_ERROR OSEnableTimer (IMG_HANDLE hTimer) -+{ -+ TIMER_CALLBACK_DATA *psTimerCBData = (TIMER_CALLBACK_DATA*)hTimer; -+ -+ -+ psTimerCBData->bActive = IMG_TRUE; -+ - - add_timer(&psTimerCBData->sTimer); - -- return (IMG_HANDLE)psTimerCBData; -+ return PVRSRV_OK; - } - - --PVRSRV_ERROR OSRemoveTimer (IMG_HANDLE hTimer) -+PVRSRV_ERROR OSDisableTimer (IMG_HANDLE hTimer) - { - TIMER_CALLBACK_DATA *psTimerCBData = (TIMER_CALLBACK_DATA*)hTimer; - -@@ -1451,21 +1568,17 @@ - - del_timer_sync(&psTimerCBData->sTimer); - -- -- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(TIMER_CALLBACK_DATA), psTimerCBData, IMG_NULL); -- - return PVRSRV_OK; - } - - - PVRSRV_ERROR OSEventObjectCreate(const IMG_CHAR *pszName, PVRSRV_EVENTOBJECT *psEventObject) - { -+ - PVRSRV_ERROR eError = PVRSRV_OK; - - if(psEventObject) - { -- struct completion *psCompletion; -- - if(pszName) - { - -@@ -1478,26 +1591,20 @@ - snprintf(psEventObject->szName, EVENTOBJNAME_MAXLENGTH, "PVRSRV_EVENTOBJECT_%d", ui16NameIndex++); - } - -- -- if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, -- sizeof(struct completion), -- (IMG_VOID **)&psCompletion, IMG_NULL) != PVRSRV_OK) -+ if(LinuxEventObjectListCreate(&psEventObject->hOSEventKM) != PVRSRV_OK) - { -- PVR_DPF((PVR_DBG_ERROR, "OSEventObjectCreate: failed to allocate memory for completion variable")); -- return PVRSRV_ERROR_OUT_OF_MEMORY; -+ eError = PVRSRV_ERROR_OUT_OF_MEMORY; - } - -- init_completion(psCompletion); -- -- psEventObject->hOSEventKM = (IMG_HANDLE) psCompletion; - } - else - { - PVR_DPF((PVR_DBG_ERROR, "OSEventObjectCreate: psEventObject is not a valid pointer")); -- eError = PVRSRV_ERROR_INVALID_PARAMS; -+ eError = PVRSRV_ERROR_GENERIC; - } - - return eError; -+ - } - - -@@ -1509,8 +1616,7 @@ - { - if(psEventObject->hOSEventKM) - { -- struct completion *psCompletion = (struct completion *) psEventObject->hOSEventKM; -- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(struct completion), psCompletion, IMG_NULL); -+ LinuxEventObjectListDestroy(psEventObject->hOSEventKM); - } - else - { -@@ -1527,19 +1633,13 @@ - return eError; - } - --PVRSRV_ERROR OSEventObjectWait(IMG_HANDLE hOSEventKM, IMG_UINT32 ui32MSTimeout) -+PVRSRV_ERROR OSEventObjectWait(IMG_HANDLE hOSEventKM) - { - PVRSRV_ERROR eError = PVRSRV_OK; - - if(hOSEventKM) - { -- LinuxUnLockMutex(&gPVRSRVLock); --#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)) -- wait_for_completion_timeout((struct completion *)hOSEventKM, msecs_to_jiffies(ui32MSTimeout)); --#else -- wait_for_completion((struct completion *)hOSEventKM); --#endif -- LinuxLockMutex(&gPVRSRVLock); -+ eError = LinuxEventObjectWait(hOSEventKM, EVENT_OBJECT_TIMEOUT_MS); - } - else - { -@@ -1550,13 +1650,60 @@ - return eError; - } - -+PVRSRV_ERROR OSEventObjectOpen(PVRSRV_EVENTOBJECT *psEventObject, -+ IMG_HANDLE *phOSEvent) -+{ -+ PVRSRV_ERROR eError = PVRSRV_OK; -+ -+ if(psEventObject) -+ { -+ if(LinuxEventObjectAdd(psEventObject->hOSEventKM, phOSEvent) != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "LinuxEventObjectAdd: failed")); -+ eError = PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ -+ } -+ else -+ { -+ PVR_DPF((PVR_DBG_ERROR, "OSEventObjectCreate: psEventObject is not a valid pointer")); -+ eError = PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ -+ return eError; -+} -+ -+PVRSRV_ERROR OSEventObjectClose(PVRSRV_EVENTOBJECT *psEventObject, -+ IMG_HANDLE hOSEventKM) -+{ -+ PVRSRV_ERROR eError = PVRSRV_OK; -+ -+ if(psEventObject) -+ { -+ if(LinuxEventObjectDelete(psEventObject->hOSEventKM, hOSEventKM, IMG_FALSE) != PVRSRV_OK) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "LinuxEventObjectDelete: failed")); -+ eError = PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ -+ } -+ else -+ { -+ PVR_DPF((PVR_DBG_ERROR, "OSEventObjectDestroy: psEventObject is not a valid pointer")); -+ eError = PVRSRV_ERROR_INVALID_PARAMS; -+ } -+ -+ return eError; -+ -+} -+ - PVRSRV_ERROR OSEventObjectSignal(IMG_HANDLE hOSEventKM) - { - PVRSRV_ERROR eError = PVRSRV_OK; - - if(hOSEventKM) - { -- complete_all((struct completion *) hOSEventKM); -+ eError = LinuxEventObjectSignal(hOSEventKM); - } - else - { -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/pdump.c git/drivers/gpu/pvr/services4/srvkm/env/linux/pdump.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/pdump.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/pdump.c 2008-12-18 15:47:29.000000000 +0100 -@@ -1205,15 +1205,14 @@ - { - ui32Written = DbgWrite(psStream, &pui8Data[ui32Off], ui32Count, ui32Flags); - --#if 0 - - - - if (ui32Written == 0) - { -- ZwYieldExecution(); -+ OSReleaseThreadQuanta(); - } --#endif -+ - if (ui32Written != 0xFFFFFFFF) - { - ui32Off += ui32Written; -@@ -1302,6 +1301,14 @@ - return bFrameDumped; - } - -+IMG_VOID PDumpRegRead(const IMG_UINT32 ui32RegOffset, IMG_UINT32 ui32Flags) -+{ -+ __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(); -+ -+ snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%lX\r\n", ui32RegOffset); -+ PDumpWriteString2(pszScript, ui32Flags); -+} -+ - IMG_VOID PDumpCycleCountRegRead(const IMG_UINT32 ui32RegOffset, IMG_BOOL bLastFrame) - { - __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(); -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/proc.c git/drivers/gpu/pvr/services4/srvkm/env/linux/proc.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/proc.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/proc.c 2008-12-18 15:47:29.000000000 +0100 -@@ -46,6 +46,11 @@ - #ifdef DEBUG - int PVRDebugProcSetLevel(struct file *file, const char *buffer, unsigned long count, void *data); - int PVRDebugProcGetLevel(char *page, char **start, off_t off, int count, int *eof, void *data); -+ -+#ifdef PVR_MANUAL_POWER_CONTROL -+int PVRProcSetPowerLevel(struct file *file, const char *buffer, unsigned long count, void *data); -+int PVRProcGetPowerLevel(char *page, char **start, off_t off, int count, int *eof, void *data); -+#endif - #endif - - static struct proc_dir_entry * dir; -@@ -198,6 +203,15 @@ - - return -ENOMEM; - } -+ -+#ifdef PVR_MANUAL_POWER_CONTROL -+ if (CreateProcEntry("power_control", PVRProcGetPowerLevel, PVRProcSetPowerLevel, 0)) -+ { -+ PVR_DPF((PVR_DBG_ERROR, "CreateProcEntries: couldn't make /proc/pvr/power_control")); -+ -+ return -ENOMEM; -+ } -+#endif - #endif - - return 0; -@@ -219,6 +233,9 @@ - { - #ifdef DEBUG - RemoveProcEntry("debug_level"); -+#ifdef PVR_MANUAL_POWER_CONTROL -+ RemoveProcEntry("power_control"); -+#endif - #endif - RemoveProcEntry("queue"); - RemoveProcEntry("nodes"); -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_debug.c git/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_debug.c ---- git/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_debug.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_debug.c 2008-12-18 15:47:29.000000000 +0100 -@@ -161,7 +161,7 @@ - - void PVRDebugSetLevel(IMG_UINT32 uDebugLevel) - { -- printk(KERN_INFO "PVR: Setting Debug Level = 0x%x",(unsigned int)uDebugLevel); -+ printk(KERN_INFO "PVR: Setting Debug Level = 0x%x\n",(unsigned int)uDebugLevel); - - gPVRDebugLevel = uDebugLevel; - } -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxdefs.h git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxdefs.h ---- git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxdefs.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxdefs.h 2008-12-18 15:47:29.000000000 +0100 -@@ -33,12 +33,16 @@ - #if defined(SGX535) - #include "sgx535defs.h" - #else -+#if defined(SGX520) -+#include "sgx520defs.h" -+#else - #if defined(SGX535_V1_1) - #include "sgx535defs.h" - #else - #endif - #endif - #endif -+#endif - - #include "sgxerrata.h" - #include "sgxfeaturedefs.h" -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h ---- git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h 2008-12-18 15:47:29.000000000 +0100 -@@ -43,6 +43,8 @@ - #else - #if SGX_CORE_REV == 120 - #else -+ #if SGX_CORE_REV == 121 -+ #else - #if SGX_CORE_REV == SGX_CORE_REV_HEAD - - #else -@@ -51,6 +53,7 @@ - #endif - #endif - #endif -+ #endif - #endif - - #define SGX_CORE_DEFINED -@@ -69,16 +72,22 @@ - #define FIX_HW_BRN_23281 - #define FIX_HW_BRN_23410 - #define FIX_HW_BRN_22693 -+ #define FIX_HW_BRN_22997 -+ #define FIX_HW_BRN_23030 - #else - #if SGX_CORE_REV == 1111 - #define FIX_HW_BRN_23281 - #define FIX_HW_BRN_23410 - #define FIX_HW_BRN_22693 -+ #define FIX_HW_BRN_22997 -+ #define FIX_HW_BRN_23030 - #else - #if SGX_CORE_REV == 112 - #define FIX_HW_BRN_23281 - #define FIX_HW_BRN_23410 - #define FIX_HW_BRN_22693 -+ #define FIX_HW_BRN_22997 -+ #define FIX_HW_BRN_23030 - #else - #if SGX_CORE_REV == 113 - #define FIX_HW_BRN_23281 -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxfeaturedefs.h git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxfeaturedefs.h ---- git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxfeaturedefs.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxfeaturedefs.h 2008-12-18 15:47:29.000000000 +0100 -@@ -24,6 +24,12 @@ - * - ******************************************************************************/ - -+#if defined(SGX520) -+ #define SGX_CORE_FRIENDLY_NAME "SGX520" -+ #define SGX_CORE_ID SGX_CORE_ID_520 -+ #define SGX_FEATURE_ADDRESS_SPACE_SIZE (28) -+ #define SGX_FEATURE_AUTOCLOCKGATING -+#else - #if defined(SGX530) - #define SGX_CORE_FRIENDLY_NAME "SGX530" - #define SGX_CORE_ID SGX_CORE_ID_530 -@@ -36,8 +42,9 @@ - #define SGX_FEATURE_ADDRESS_SPACE_SIZE (32) - #define SGX_FEATURE_MULTIPLE_MEM_CONTEXTS - #define SGX_FEATURE_2D_HARDWARE -- #define SGX_FEATURE_AUTOCLOCKGATING -- -+ #define SGX_FEATURE_AUTOCLOCKGATING -+#else -+#endif - #endif - #endif - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/include/device.h git/drivers/gpu/pvr/services4/srvkm/include/device.h ---- git/drivers/gpu/pvr/services4/srvkm/include/device.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/include/device.h 2008-12-18 15:47:29.000000000 +0100 -@@ -225,39 +225,40 @@ - struct _PVRSRV_DEVICE_NODE_ *psNext; - } PVRSRV_DEVICE_NODE; - --PVRSRV_ERROR PVRSRVRegisterDevice(PSYS_DATA psSysData, -- PVRSRV_ERROR (*pfnRegisterDevice)(PVRSRV_DEVICE_NODE*), -- IMG_UINT32 ui32SOCInterruptBit, -- IMG_UINT32 *pui32DeviceIndex ); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVRegisterDevice(PSYS_DATA psSysData, -+ PVRSRV_ERROR (*pfnRegisterDevice)(PVRSRV_DEVICE_NODE*), -+ IMG_UINT32 ui32SOCInterruptBit, -+ IMG_UINT32 *pui32DeviceIndex ); - --PVRSRV_ERROR PVRSRVInitialiseDevice(IMG_UINT32 ui32DevIndex); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVInitialiseDevice(IMG_UINT32 ui32DevIndex); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVFinaliseSystem(IMG_BOOL bInitSuccesful); - --PVRSRV_ERROR PVRSRVDeinitialiseDevice(IMG_UINT32 ui32DevIndex); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVDeinitialiseDevice(IMG_UINT32 ui32DevIndex); - - #if !defined(USE_CODE) - --IMG_IMPORT PVRSRV_ERROR PollForValueKM(volatile IMG_UINT32* pui32LinMemAddr, -- IMG_UINT32 ui32Value, -- IMG_UINT32 ui32Mask, -- IMG_UINT32 ui32Waitus, -- IMG_UINT32 ui32Tries); -+IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PollForValueKM(volatile IMG_UINT32* pui32LinMemAddr, -+ IMG_UINT32 ui32Value, -+ IMG_UINT32 ui32Mask, -+ IMG_UINT32 ui32Waitus, -+ IMG_UINT32 ui32Tries); - - #endif - - - #if defined (USING_ISR_INTERRUPTS) --PVRSRV_ERROR PollForInterruptKM(IMG_UINT32 ui32Value, -+PVRSRV_ERROR IMG_CALLCONV PollForInterruptKM(IMG_UINT32 ui32Value, - IMG_UINT32 ui32Mask, - IMG_UINT32 ui32Waitus, - IMG_UINT32 ui32Tries); - #endif - - --PVRSRV_ERROR PVRSRVInit(PSYS_DATA psSysData); --IMG_VOID PVRSRVDeInit(PSYS_DATA psSysData); --IMG_BOOL PVRSRVDeviceLISR(PVRSRV_DEVICE_NODE *psDeviceNode); --IMG_BOOL PVRSRVSystemLISR(IMG_VOID *pvSysData); --IMG_VOID PVRSRVMISR(IMG_VOID *pvSysData); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVInit(PSYS_DATA psSysData); -+IMG_VOID IMG_CALLCONV PVRSRVDeInit(PSYS_DATA psSysData); -+IMG_BOOL IMG_CALLCONV PVRSRVDeviceLISR(PVRSRV_DEVICE_NODE *psDeviceNode); -+IMG_BOOL IMG_CALLCONV PVRSRVSystemLISR(IMG_VOID *pvSysData); -+IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData); - - #if defined(__cplusplus) - } -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/include/handle.h git/drivers/gpu/pvr/services4/srvkm/include/handle.h ---- git/drivers/gpu/pvr/services4/srvkm/include/handle.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/include/handle.h 2008-12-18 15:47:29.000000000 +0100 -@@ -50,10 +50,13 @@ - PVRSRV_HANDLE_TYPE_DISP_BUFFER, - PVRSRV_HANDLE_TYPE_BUF_BUFFER, - PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT, -+ PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT, -+ PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT, - PVRSRV_HANDLE_TYPE_SHARED_PB_DESC, - PVRSRV_HANDLE_TYPE_MEM_INFO_REF, - PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO, -- PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT -+ PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT, -+ PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT - } PVRSRV_HANDLE_TYPE; - - typedef enum -@@ -126,6 +129,11 @@ - - - IMG_UINT32 ui32LastFreeIndexPlusOne; -+ -+#ifdef __linux__ -+ -+ IMG_BOOL bVmallocUsed; -+#endif - } PVRSRV_HANDLE_BASE; - - #ifdef PVR_SECURE_HANDLES -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/include/osfunc.h git/drivers/gpu/pvr/services4/srvkm/include/osfunc.h ---- git/drivers/gpu/pvr/services4/srvkm/include/osfunc.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/include/osfunc.h 2008-12-18 15:47:29.000000000 +0100 -@@ -148,14 +148,16 @@ - IMG_CHAR* OSStringCopy(IMG_CHAR *pszDest, const IMG_CHAR *pszSrc); - IMG_INT32 OSSNPrintf(IMG_CHAR *pStr, IMG_UINT32 ui32Size, const IMG_CHAR *pszFormat, ...); - #define OSStringLength(pszString) strlen(pszString) --PVRSRV_ERROR OSPowerManagerConnect(IMG_VOID); --PVRSRV_ERROR OSPowerManagerDisconnect(IMG_VOID); - - PVRSRV_ERROR OSEventObjectCreate(const IMG_CHAR *pszName, - PVRSRV_EVENTOBJECT *psEventObject); - PVRSRV_ERROR OSEventObjectDestroy(PVRSRV_EVENTOBJECT *psEventObject); - PVRSRV_ERROR OSEventObjectSignal(IMG_HANDLE hOSEventKM); --PVRSRV_ERROR OSEventObjectWait(IMG_HANDLE hOSEventKM, IMG_UINT32 ui32MSTimeout); -+PVRSRV_ERROR OSEventObjectWait(IMG_HANDLE hOSEventKM); -+PVRSRV_ERROR OSEventObjectOpen(PVRSRV_EVENTOBJECT *psEventObject, -+ IMG_HANDLE *phOSEvent); -+PVRSRV_ERROR OSEventObjectClose(PVRSRV_EVENTOBJECT *psEventObject, -+ IMG_HANDLE hOSEventKM); - - - PVRSRV_ERROR OSBaseAllocContigMemory(IMG_UINT32 ui32Size, IMG_CPU_VIRTADDR *pLinAddr, IMG_CPU_PHYADDR *pPhysAddr); -@@ -203,6 +205,8 @@ - typedef IMG_VOID (*PFN_TIMER_FUNC)(IMG_VOID*); - IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32 ui32MsTimeout); - PVRSRV_ERROR OSRemoveTimer (IMG_HANDLE hTimer); -+PVRSRV_ERROR OSEnableTimer (IMG_HANDLE hTimer); -+PVRSRV_ERROR OSDisableTimer (IMG_HANDLE hTimer); - - PVRSRV_ERROR OSGetSysMemSize(IMG_UINT32 *pui32Bytes); - -@@ -211,17 +215,17 @@ - HOST_PCI_INIT_FLAG_BUS_MASTER = 0x1, - HOST_PCI_INIT_FLAG_FORCE_I32 = 0x7fffffff - } HOST_PCI_INIT_FLAGS; --PVRSRV_ERROR OSPCIAcquireDev(IMG_VOID *pvSysData, IMG_UINT16 ui16VendorID, IMG_UINT16 ui16DeviceID, HOST_PCI_INIT_FLAGS eFlags); --PVRSRV_ERROR OSPCISetDev(IMG_VOID *pvSysData, IMG_VOID *pvPCICookie, HOST_PCI_INIT_FLAGS eFlags); --PVRSRV_ERROR OSPCIReleaseDev(IMG_VOID *pvSysData); --PVRSRV_ERROR OSPCIIRQ(IMG_VOID *pvSysData, IMG_UINT32 *pui32IRQ); --IMG_UINT32 OSPCIAddrRangeLen(IMG_VOID *pvSysData, IMG_UINT32 ui32Index); --IMG_UINT32 OSPCIAddrRangeStart(IMG_VOID *pvSysData, IMG_UINT32 ui32Index); --IMG_UINT32 OSPCIAddrRangeEnd(IMG_VOID *pvSysData, IMG_UINT32 ui32Index); --PVRSRV_ERROR OSPCIRequestAddrRange(IMG_VOID *pvSysData, IMG_UINT32 ui32Index); --PVRSRV_ERROR OSPCIReleaseAddrRange(IMG_VOID *pvSysData, IMG_UINT32 ui32Index); --PVRSRV_ERROR OSPCISuspendDev(IMG_VOID *pvSysData); --PVRSRV_ERROR OSPCIResumeDev(IMG_VOID *pvSysData); -+IMG_HANDLE OSPCIAcquireDev(IMG_UINT16 ui16VendorID, IMG_UINT16 ui16DeviceID, HOST_PCI_INIT_FLAGS eFlags); -+IMG_HANDLE OSPCISetDev(IMG_VOID *pvPCICookie, HOST_PCI_INIT_FLAGS eFlags); -+PVRSRV_ERROR OSPCIReleaseDev(IMG_HANDLE hPVRPCI); -+PVRSRV_ERROR OSPCIIRQ(IMG_HANDLE hPVRPCI, IMG_UINT32 *pui32IRQ); -+IMG_UINT32 OSPCIAddrRangeLen(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index); -+IMG_UINT32 OSPCIAddrRangeStart(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index); -+IMG_UINT32 OSPCIAddrRangeEnd(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index); -+PVRSRV_ERROR OSPCIRequestAddrRange(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index); -+PVRSRV_ERROR OSPCIReleaseAddrRange(IMG_HANDLE hPVRPCI, IMG_UINT32 ui32Index); -+PVRSRV_ERROR OSPCISuspendDev(IMG_HANDLE hPVRPCI); -+PVRSRV_ERROR OSPCIResumeDev(IMG_HANDLE hPVRPCI); - - PVRSRV_ERROR OSScheduleMISR(IMG_VOID *pvSysData); - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/include/pdump_km.h git/drivers/gpu/pvr/services4/srvkm/include/pdump_km.h ---- git/drivers/gpu/pvr/services4/srvkm/include/pdump_km.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/include/pdump_km.h 2008-12-18 15:47:29.000000000 +0100 -@@ -180,6 +180,8 @@ - void PDump3DSignatureRegisters(IMG_UINT32 ui32DumpFrameNum, - IMG_BOOL bLastFrame); - -+ IMG_VOID PDumpRegRead(const IMG_UINT32 dwRegOffset, IMG_UINT32 ui32Flags); -+ - IMG_VOID PDumpCycleCountRegRead(const IMG_UINT32 dwRegOffset, IMG_BOOL bLastFrame); - - void PDumpPerformanceCounterRegisters(IMG_UINT32 ui32DumpFrameNum, -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/include/resman.h git/drivers/gpu/pvr/services4/srvkm/include/resman.h ---- git/drivers/gpu/pvr/services4/srvkm/include/resman.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/include/resman.h 2008-12-18 15:47:29.000000000 +0100 -@@ -34,7 +34,9 @@ - enum { - - RESMAN_TYPE_SHARED_PB_DESC = 1, -- RESMAN_TYPE_HW_RENDER_CONTEXT, -+ RESMAN_TYPE_HW_RENDER_CONTEXT, -+ RESMAN_TYPE_HW_TRANSFER_CONTEXT, -+ RESMAN_TYPE_HW_2D_CONTEXT, - RESMAN_TYPE_TRANSFER_CONTEXT, - - -@@ -57,6 +59,7 @@ - RESMAN_TYPE_DEVICEMEM_WRAP, - RESMAN_TYPE_DEVICEMEM_ALLOCATION, - RESMAN_TYPE_RESOURCE_PERPROC_DATA, -+ RESMAN_TYPE_EVENT_OBJECT, - RESMAN_TYPE_SHARED_MEM_INFO, - - -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/include/srvkm.h git/drivers/gpu/pvr/services4/srvkm/include/srvkm.h ---- git/drivers/gpu/pvr/services4/srvkm/include/srvkm.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/include/srvkm.h 2008-12-18 15:47:29.000000000 +0100 -@@ -33,9 +33,9 @@ - #endif - - --IMG_VOID PVRSRVSetDCState(IMG_UINT32 ui32State); -+IMG_VOID IMG_CALLCONV PVRSRVSetDCState(IMG_UINT32 ui32State); - --PVRSRV_ERROR PVRSRVSaveRestoreLiveSegments(IMG_HANDLE hArena, IMG_PBYTE pbyBuffer, IMG_UINT32 *puiBufSize, IMG_BOOL bSave); -+PVRSRV_ERROR IMG_CALLCONV PVRSRVSaveRestoreLiveSegments(IMG_HANDLE hArena, IMG_PBYTE pbyBuffer, IMG_UINT32 *puiBufSize, IMG_BOOL bSave); - - #if defined (__cplusplus) - } -diff -Nurd git/drivers/gpu/pvr/services4/srvkm/Makefile git/drivers/gpu/pvr/services4/srvkm/Makefile ---- git/drivers/gpu/pvr/services4/srvkm/Makefile 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/srvkm/Makefile 1970-01-01 01:00:00.000000000 +0100 -@@ -1,68 +0,0 @@ --# --# 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 --# --# -- --obj-y += env/linux/osfunc.o \ -- env/linux/mmap.o \ -- env/linux/mod.o \ -- env/linux/pdump.o \ -- env/linux/proc.o \ -- env/linux/pvr_bridge_k.o \ -- env/linux/pvr_debug.o \ -- env/linux/mm.o \ -- env/linux/mutex.o -- --obj-y += common/buffer_manager.o \ -- common/devicemem.o \ -- common/deviceclass.o \ -- common/handle.o \ -- common/hash.o \ -- common/metrics.o \ -- common/pvrsrv.o \ -- common/queue.o \ -- common/ra.o \ -- common/resman.o \ -- common/power.o \ -- common/mem.o \ -- bridged/bridged_pvr_bridge.o \ -- devices/sgx/sgxinit.o \ -- devices/sgx/sgxutils.o \ -- devices/sgx/sgxkick.o \ -- devices/sgx/sgxtransfer.o \ -- devices/sgx/mmu.o \ -- devices/sgx/pb.o \ -- common/perproc.o \ -- ../system/$(CONFIG_PVR_SYSTEM)/sysconfig.o \ -- ../system/$(CONFIG_PVR_SYSTEM)/sysutils.o \ -- devices/sgx/sgx2dcore.o -- --INCLUDES = -I$(src)/env/linux \ -- -I$(src)/include \ -- -I$(src)/bridged \ -- -I$(src)/devices/sgx \ -- -I$(src)/include \ -- -I$(src)/hwdefs -- --ccflags-y += $(CONFIG_PVR_OPTS) $(INCLUDES) -- -diff -Nurd git/drivers/gpu/pvr/services4/system/include/syscommon.h git/drivers/gpu/pvr/services4/system/include/syscommon.h ---- git/drivers/gpu/pvr/services4/system/include/syscommon.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/system/include/syscommon.h 2008-12-18 15:47:29.000000000 +0100 -@@ -83,11 +83,13 @@ - RA_ARENA *apsLocalDevMemArena[SYS_MAX_LOCAL_DEVMEM_ARENAS]; - - IMG_CHAR *pszVersionString; -+ PVRSRV_EVENTOBJECT *psGlobalEventObject; - } SYS_DATA; - - - - PVRSRV_ERROR SysInitialise(IMG_VOID); -+PVRSRV_ERROR SysFinalise(IMG_VOID); - - IMG_UINT32 GetCPUTranslatedAddress(IMG_VOID); - -diff -Nurd git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.c git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.c ---- git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.c 2008-12-18 15:47:29.000000000 +0100 -@@ -360,8 +360,15 @@ - } - gsSysSpecificData.ui32SysSpecificData |= SYS_SPECIFIC_DATA_ENABLE_INITDEV; - -+ return PVRSRV_OK; -+} -+ - -+PVRSRV_ERROR SysFinalise(IMG_VOID) -+{ - #if defined(SYS_USING_INTERRUPTS) -+ PVRSRV_ERROR eError; -+ - eError = OSInstallMISR(gpsSysData); - if (eError != PVRSRV_OK) - { -@@ -388,12 +395,12 @@ - - gpsSysData->pszVersionString = SysCreateVersionString(gsSGXDeviceMap.sRegsCpuPBase); - if (!gpsSysData->pszVersionString) -- { -- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to create a system version string")); -+ { -+ PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to create a system version string")); - } - else - { -- PVR_DPF((PVR_DBG_WARNING, "SysInitialise: Version string: %s", gpsSysData->pszVersionString)); -+ PVR_DPF((PVR_DBG_WARNING, "SysFinalise: Version string: %s", gpsSysData->pszVersionString)); - } - - #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) -@@ -641,7 +648,7 @@ - } - gsSysSpecificData.ui32SysSpecificData &= ~SYS_SPECIFIC_DATA_ENABLE_LISR; - } --#endif -+#endif - if (gsSysSpecificData.ui32SysSpecificData & SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS) - { - DisableSystemClocks(gpsSysData); -@@ -682,7 +689,7 @@ - } - gsSysSpecificData.ui32SysSpecificData |= SYS_SPECIFIC_DATA_ENABLE_LISR; - } --#endif -+#endif - } - return eError; - } -@@ -706,7 +713,7 @@ - DisableSGXClocks(gpsSysData); - } - #else -- PVR_UNREFERENCED_PARAMETER(eNewPowerState); -+ PVR_UNREFERENCED_PARAMETER(eNewPowerState ); - #endif - return PVRSRV_OK; - } -@@ -718,12 +725,13 @@ - { - PVRSRV_ERROR eError = PVRSRV_OK; - -+ PVR_UNREFERENCED_PARAMETER(eNewPowerState); -+ - if (ui32DeviceIndex != gui32SGXDeviceID) - { - return eError; - } - -- PVR_UNREFERENCED_PARAMETER(eNewPowerState); - - #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) - if (eCurrentPowerState == PVRSRV_POWER_STATE_D3) -@@ -734,7 +742,7 @@ - #else - PVR_UNREFERENCED_PARAMETER(eCurrentPowerState); - #endif -- -+ - return eError; - } - -diff -Nurd git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.h git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.h ---- git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.h 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/system/omap3430/sysconfig.h 2008-12-18 15:47:29.000000000 +0100 -@@ -38,13 +38,6 @@ - - #define SYS_OMAP3430_SGX_IRQ 21 - --#define SYS_OMAP3430_PM_REGS_SYS_PHYS_BASE 0x48306000 --#define SYS_OMAP3430_PM_REGS_SIZE 0x1000 -- --#define SYS_OMAP3430_CM_REGS_SYS_PHYS_BASE 0x48004000 --#define SYS_OMAP3430_CM_REGS_SIZE 0x1000 -- -- - #define SYS_OMAP3430_GP11TIMER_ENABLE_SYS_PHYS_BASE 0x48088024 - #define SYS_OMAP3430_GP11TIMER_REGS_SYS_PHYS_BASE 0x48088028 - #define SYS_OMAP3430_GP11TIMER_TSICR_SYS_PHYS_BASE 0x48088040 -diff -Nurd git/drivers/gpu/pvr/services4/system/omap3430/sysutils.c git/drivers/gpu/pvr/services4/system/omap3430/sysutils.c ---- git/drivers/gpu/pvr/services4/system/omap3430/sysutils.c 2009-01-05 20:00:44.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/system/omap3430/sysutils.c 2008-12-18 15:47:29.000000000 +0100 -@@ -52,7 +52,7 @@ - return PVRSRV_OK; - } - -- PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: Enabling SGX Clocks")); -+ PVR_TRACE(("EnableSGXClocks: Enabling SGX Clocks")); - - #if defined(__linux__) - if (psSysSpecData->psSGX_FCK == IMG_NULL) ---- /tmp/omaplfb_linux.c 2009-01-06 10:41:49.000000000 +0100 -+++ git/drivers/gpu/pvr/services4/3rdparty/dc_omap3430_linux/omaplfb_linux.c 2009-01-06 10:42:41.000000000 +0100 -@@ -108,6 +108,8 @@ - (void) OMAPLFBVSyncIHandler(psSwapChain); - } - -+#define DISPC_IRQ_VSYNC 0x0002 -+ - PVRSRV_ERROR OMAPLFBInstallVSyncISR(OMAPLFB_SWAPCHAIN *psSwapChain) - { - ---- /tmp/Makefile 2009-01-06 11:32:47.000000000 +0100 -+++ git/drivers/gpu/pvr/Makefile 2009-01-06 11:39:06.000000000 +0100 -@@ -16,6 +16,7 @@ - services4/srvkm/env/linux/pvr_debug.o \ - services4/srvkm/env/linux/mm.o \ - services4/srvkm/env/linux/mutex.o \ -+ services4/srvkm/env/linux/event.o \ - services4/srvkm/common/buffer_manager.o \ - services4/srvkm/common/devicemem.o \ - services4/srvkm/common/deviceclass.o \ -@@ -30,6 +31,7 @@ - services4/srvkm/common/mem.o \ - services4/srvkm/bridged/bridged_pvr_bridge.o \ - services4/srvkm/devices/sgx/sgxinit.o \ -+ services4/srvkm/devices/sgx/sgxreset.o \ - services4/srvkm/devices/sgx/sgxutils.o \ - services4/srvkm/devices/sgx/sgxkick.o \ - services4/srvkm/devices/sgx/sgxtransfer.o \ |