summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHemant Hariyani <hemanthariyani@ti.com>2011-05-31 09:25:01 +0100
committerAndy Green <andy.green@linaro.org>2011-05-31 11:06:31 +0100
commit15be2c5ce9b3acd4c9bf9388b7a39311c499d352 (patch)
tree1e3ad39a72ef67c4a59dc58b1defebe455b2fad4
parenta029707459c63855d49aaa5b9bbf7f5a707e62d4 (diff)
SGX-KM: Upgrading to DDK 1.6.16.3924
Upgrading kernel side DDK to version 1.6.16.3924. Signed-off-by: Hemant Hariyani <hemanthariyani@ti.com>
-rw-r--r--drivers/gpu/pvr/Makefile8
-rw-r--r--drivers/gpu/pvr/bridged_pvr_bridge.c25
-rw-r--r--drivers/gpu/pvr/buffer_manager.c16
-rw-r--r--drivers/gpu/pvr/device.h4
-rw-r--r--drivers/gpu/pvr/deviceclass.c2
-rw-r--r--drivers/gpu/pvr/devicemem.c24
-rw-r--r--drivers/gpu/pvr/display/omap_display.c41
-rw-r--r--drivers/gpu/pvr/display/omap_display.h4
-rw-r--r--drivers/gpu/pvr/display/omap_sgx_displayclass.c5
-rw-r--r--drivers/gpu/pvr/event.c51
-rw-r--r--drivers/gpu/pvr/linkage.h2
-rw-r--r--drivers/gpu/pvr/module.c118
-rw-r--r--drivers/gpu/pvr/omap3/sysconfig.c27
-rw-r--r--drivers/gpu/pvr/omap3/syslocal.h1
-rw-r--r--drivers/gpu/pvr/omap3/sysutils_linux_wqueue_compat.c21
-rw-r--r--drivers/gpu/pvr/omap4/sysconfig.c47
-rw-r--r--drivers/gpu/pvr/omap4/sysconfig.h5
-rw-r--r--drivers/gpu/pvr/omap4/syslocal.h1
-rw-r--r--drivers/gpu/pvr/omap4/sysutils_linux_wqueue_compat.c61
-rw-r--r--drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c10
-rw-r--r--drivers/gpu/pvr/osfunc.c136
-rw-r--r--drivers/gpu/pvr/pdump.c5
-rw-r--r--drivers/gpu/pvr/pdump.h10
-rw-r--r--drivers/gpu/pvr/pdump_common.c141
-rw-r--r--drivers/gpu/pvr/pdump_km.h3
-rw-r--r--drivers/gpu/pvr/pdump_osfunc.h5
-rw-r--r--drivers/gpu/pvr/perproc.c11
-rw-r--r--drivers/gpu/pvr/perproc.h6
-rw-r--r--drivers/gpu/pvr/private_data.h22
-rw-r--r--drivers/gpu/pvr/proc.c69
-rw-r--r--drivers/gpu/pvr/pvr_bridge.h1
-rw-r--r--drivers/gpu/pvr/pvr_bridge_k.c12
-rw-r--r--drivers/gpu/pvr/pvrsrv.c4
-rw-r--r--drivers/gpu/pvr/pvrversion.h4
-rw-r--r--drivers/gpu/pvr/queue.c331
-rw-r--r--drivers/gpu/pvr/queue.h3
-rw-r--r--drivers/gpu/pvr/services.h4
-rw-r--r--drivers/gpu/pvr/servicesext.h40
-rw-r--r--drivers/gpu/pvr/sgx/mmu.c141
-rw-r--r--drivers/gpu/pvr/sgx/mmu.h26
-rw-r--r--drivers/gpu/pvr/sgx/sgxinit.c56
-rw-r--r--drivers/gpu/pvr/sgx/sgxreset.c3
-rw-r--r--drivers/gpu/pvr/sgx/sgxtransfer.c143
-rw-r--r--drivers/gpu/pvr/sgx/sgxutils.c55
-rw-r--r--drivers/gpu/pvr/sgx/sgxutils.h3
-rw-r--r--drivers/gpu/pvr/sgx_mkif_km.h18
-rw-r--r--drivers/gpu/pvr/sgx_options.h1
-rw-r--r--drivers/gpu/pvr/sgxapi_km.h2
-rw-r--r--drivers/gpu/pvr/sgxerrata.h27
-rw-r--r--drivers/gpu/pvr/sgxfeaturedefs.h1
-rw-r--r--drivers/gpu/pvr/srvkm.h2
-rw-r--r--drivers/gpu/pvr/syscommon.h5
52 files changed, 1053 insertions, 710 deletions
diff --git a/drivers/gpu/pvr/Makefile b/drivers/gpu/pvr/Makefile
index 3039c154bad..77a35d82924 100644
--- a/drivers/gpu/pvr/Makefile
+++ b/drivers/gpu/pvr/Makefile
@@ -15,7 +15,7 @@ ccflags-y = -DLINUX -D__linux__ -Idrivers/gpu/pvr \
-DSUPPORT_SGX_HWPERF \
-DSUPPORT_MEMINFO_IDS \
-DDISPLAY_CONTROLLER=omaplfb \
- -DSYS_SGX_ACTIVE_POWER_LATENCY_MS=1 \
+ -DSYS_SGX_ACTIVE_POWER_LATENCY_MS=100 \
-DPVR_BUILD_DATE="" \
-DSUPPORT_SGX \
-DCLIENT_DRIVER_DEFAULT_WAIT_RETRIES=50 \
@@ -26,6 +26,7 @@ ccflags-y = -DLINUX -D__linux__ -Idrivers/gpu/pvr \
-DPVR_LINUX_MISR_USING_PRIVATE_WORKQUEUE \
-DSYS_CUSTOM_POWERLOCK_WRAP \
-DSUPPORT_SGX_NEW_STATUS_VALS \
+ -DSYS_OMAP3430_PIN_MEMORY_BUS_CLOCK \
-DPVRSRV_MODNAME="\"pvrsrvkm"\"
ccflags-$(CONFIG_SGX540) += -Idrivers/gpu/pvr/omap4 -Idrivers/gpu/pvr/sgx \
@@ -64,17 +65,19 @@ ccflags-$(CONFIG_SGX_540_BUILD_RELEASE) += \
-DPVR_BUILD_TYPE="\"release\"" \
-DRELEASE \
-DSUPPORT_ACTIVE_POWER_MANAGEMENT \
+ -DPVR_NO_FULL_CACHE_OPS \
-DSUPPORT_SGX_LOW_LATENCY_SCHEDULING
ccflags-$(CONFIG_SGX_540_BUILD_DEBUG) += \
-DPVR_BUILD_TYPE="\"debug\"" -DDEBUG \
- -DSUPPORT_ACTIVE_POWER_MANAGEMENT \
-DDEBUG_LINUX_MEMORY_ALLOCATIONS \
-DDEBUG_LINUX_MEM_AREAS \
-DDEBUG_LINUX_MMAP_AREAS \
-DDEBUG_BRIDGE_KM \
-DPVRSRV_USSE_EDM_STATUS_DEBUG \
-DPVRSRV_DUMP_MK_TRACE \
+ -DSUPPORT_ACTIVE_POWER_MANAGEMENT \
+ -DPVR_NO_FULL_CACHE_OPS \
-DDEBUG_LOG_PATH_TRUNCATE="\"eurasia_km\""
pvr_common-y := \
@@ -141,3 +144,4 @@ obj-$(CONFIG_SGX540) := pvr_common.o sgx.o omaplfb.o pvr540.o
obj-$(CONFIG_SGX530) := pvr_common.o sgx.o omaplfb.o pvr530.o
obj-$(CONFIG_VIRTUAL_DISPLAY_SUPPORT) := pvr_common.o sgx.o \
sgx_displayclass.o pvr540.o
+
diff --git a/drivers/gpu/pvr/bridged_pvr_bridge.c b/drivers/gpu/pvr/bridged_pvr_bridge.c
index 2b6cb484e77..76773292259 100644
--- a/drivers/gpu/pvr/bridged_pvr_bridge.c
+++ b/drivers/gpu/pvr/bridged_pvr_bridge.c
@@ -1701,6 +1701,11 @@ PVRSRVConnectBW(IMG_UINT32 ui32BridgeID,
#if defined(PDUMP)
psPerProc->bPDumpPersistent |= ( (psConnectServicesIN->ui32Flags & SRV_FLAGS_PERSIST) != 0) ? IMG_TRUE : IMG_FALSE;
+
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ psPerProc->bPDumpActive |= ( (psConnectServicesIN->ui32Flags & SRV_FLAGS_PDUMP_ACTIVE) != 0) ? IMG_TRUE : IMG_FALSE;
+#endif
#else
PVR_UNREFERENCED_PARAMETER(psConnectServicesIN);
#endif
@@ -3003,6 +3008,8 @@ static PVRSRV_ERROR DoQuerySyncOpsSatisfied(MODIFY_SYNC_OP_INFO *psModSyncOpInfo
{
#if defined(PDUMP)
+
+
PDumpComment("Poll for read ops complete to reach value (%u)", psModSyncOpInfo->ui32ReadOpsPendingSnapShot);
PDumpMemPolKM(psKernelSyncInfo->psSyncDataMemInfoKM,
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
@@ -3408,20 +3415,28 @@ PVRSRVSyncOpsFlushToDeltaBW(IMG_UINT32 u
}
- PDumpComment("Poll for read ops complete to delta (%u)", psSyncOpsFlushToDeltaIN->ui32Delta);
+ PDumpComment("Poll for read ops complete to delta (%u)",
+ psSyncOpsFlushToDeltaIN->ui32Delta);
psSyncOpsFlushToDeltaOUT->eError =
PDumpMemPolKM(psSyncInfo->psSyncDataMemInfoKM,
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
- ui32MinimumReadOpsComplete,
+ psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
0xFFFFFFFF,
PDUMP_POLL_OPERATOR_GREATEREQUAL,
0,
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
-
-
-
+ PDumpComment("Poll for write ops complete to delta (%u)",
+ psSyncOpsFlushToDeltaIN->ui32Delta);
+ psSyncOpsFlushToDeltaOUT->eError =
+ PDumpMemPolKM(psSyncInfo->psSyncDataMemInfoKM,
+ offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete),
+ psSyncInfo->psSyncData->ui32LastOpDumpVal,
+ 0xFFFFFFFF,
+ PDUMP_POLL_OPERATOR_GREATEREQUAL,
+ 0,
+ MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
#endif
psSyncOpsFlushToDeltaOUT->eError = PVRSRV_OK;
diff --git a/drivers/gpu/pvr/buffer_manager.c b/drivers/gpu/pvr/buffer_manager.c
index cde168391c8..32367e215f8 100644
--- a/drivers/gpu/pvr/buffer_manager.c
+++ b/drivers/gpu/pvr/buffer_manager.c
@@ -1602,9 +1602,21 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext,
EnableHostAccess(pBMContext->psMMUContext);
#endif
+#if defined(PDUMP)
-
- PDUMPMALLOCPAGES(&psDeviceNode->sDevId, pMapping->DevVAddr.uiAddr, pMapping->CpuVAddr, pMapping->hOSMemHandle, ui32PDumpSize, pMapping->pBMHeap->sDevArena.ui32DataPageSize, (IMG_HANDLE)pMapping);
+ PDUMPMALLOCPAGES(&psDeviceNode->sDevId,
+ pMapping->DevVAddr.uiAddr,
+ pMapping->CpuVAddr,
+ pMapping->hOSMemHandle,
+ ui32PDumpSize,
+ pMapping->pBMHeap->sDevArena.ui32DataPageSize,
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ psDeviceNode->pfnMMUIsHeapShared(pMapping->pBMHeap->pMMUHeap),
+#else
+ IMG_FALSE,
+#endif
+ (IMG_HANDLE)pMapping);
+#endif
switch (pMapping->eCpuMemoryOrigin)
{
diff --git a/drivers/gpu/pvr/device.h b/drivers/gpu/pvr/device.h
index 2488aa9de36..bed23510366 100644
--- a/drivers/gpu/pvr/device.h
+++ b/drivers/gpu/pvr/device.h
@@ -217,7 +217,9 @@ typedef struct _PVRSRV_DEVICE_NODE_
IMG_SIZE_T uSize,
IMG_UINT32 ui32MemFlags,
IMG_HANDLE hUniqueTag);
-
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ IMG_BOOL (*pfnMMUIsHeapShared)(MMU_HEAP *);
+#endif
IMG_DEV_PHYADDR (*pfnMMUGetPhysPageAddr)(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR sDevVPageAddr);
IMG_DEV_PHYADDR (*pfnMMUGetPDDevPAddr)(MMU_CONTEXT *pMMUContext);
diff --git a/drivers/gpu/pvr/deviceclass.c b/drivers/gpu/pvr/deviceclass.c
index 869253b2ecb..471ce0cf12b 100644
--- a/drivers/gpu/pvr/deviceclass.c
+++ b/drivers/gpu/pvr/deviceclass.c
@@ -1765,7 +1765,7 @@ static PVRSRV_ERROR CloseBCDeviceCallBack(IMG_PVOID pvParam,
if(psBCInfo->psBuffer)
{
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_BUFFER), psBCInfo->psBuffer, IMG_NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_BUFFER) * psBCInfo->ui32BufferCount, psBCInfo->psBuffer, IMG_NULL);
psBCInfo->psBuffer = IMG_NULL;
}
}
diff --git a/drivers/gpu/pvr/devicemem.c b/drivers/gpu/pvr/devicemem.c
index f15ff9143eb..aeba0deb0cb 100644
--- a/drivers/gpu/pvr/devicemem.c
+++ b/drivers/gpu/pvr/devicemem.c
@@ -488,6 +488,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocSyncInfoKM(IMG_HANDLE hDevCookie,
psSyncData->ui32LastReadOpDumpVal = 0;
#if defined(PDUMP)
+ PDUMPCOMMENT("Allocating kernel sync object");
PDUMPMEM(psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM,
psKernelSyncInfo->psSyncDataMemInfoKM,
0,
@@ -1066,14 +1067,17 @@ static PVRSRV_ERROR UnmapDeviceMemoryCallBack(IMG_PVOID pvParam,
psMapData->psMemInfo->sMemBlk.psIntSysPAddr = IMG_NULL;
}
- psMapData->psMemInfo->psKernelSyncInfo->ui32RefCount--;
- if (psMapData->psMemInfo->psKernelSyncInfo->ui32RefCount == 0)
+ if( psMapData->psMemInfo->psKernelSyncInfo )
{
- eError = PVRSRVFreeSyncInfoKM(psMapData->psMemInfo->psKernelSyncInfo);
- if(eError != PVRSRV_OK)
+ psMapData->psMemInfo->psKernelSyncInfo->ui32RefCount--;
+ if (psMapData->psMemInfo->psKernelSyncInfo->ui32RefCount == 0)
{
- PVR_DPF((PVR_DBG_ERROR,"UnmapDeviceMemoryCallBack: Failed to free sync info"));
- return eError;
+ eError = PVRSRVFreeSyncInfoKM(psMapData->psMemInfo->psKernelSyncInfo);
+ if(eError != PVRSRV_OK)
+ {
+ PVR_DPF((PVR_DBG_ERROR,"UnmapDeviceMemoryCallBack: Failed to free sync info"));
+ return eError;
+ }
}
}
@@ -1223,7 +1227,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceMemoryKM(PVRSRV_PER_PROCESS_DATA *psPer
psMemInfo->psKernelSyncInfo = psSrcMemInfo->psKernelSyncInfo;
- psMemInfo->psKernelSyncInfo->ui32RefCount++;
+ if( psMemInfo->psKernelSyncInfo )
+ psMemInfo->psKernelSyncInfo->ui32RefCount++;
@@ -1523,6 +1528,11 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA *
*ppsMemInfo = psMemInfo;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ PDUMPCOMMENT("Dump display surface");
+ PDUMPMEM(IMG_NULL, psMemInfo, ui32Offset, psMemInfo->ui32AllocSize, PDUMP_FLAGS_CONTINUOUS, ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping);
+#endif
return PVRSRV_OK;
#if defined(SUPPORT_MEMORY_TILING)
diff --git a/drivers/gpu/pvr/display/omap_display.c b/drivers/gpu/pvr/display/omap_display.c
index 1f130753c46..1fb5f353870 100644
--- a/drivers/gpu/pvr/display/omap_display.c
+++ b/drivers/gpu/pvr/display/omap_display.c
@@ -16,7 +16,6 @@
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fb.h>
@@ -425,7 +424,6 @@ static int present_buffer(struct omap_display_buffer *buffer)
struct omapfb2_device *fbdev = ofbi->fbdev;
struct omap_overlay *overlay;
struct omap_overlay_info overlay_info;
- struct omap_dss_device *dss_device;
int i;
omapfb_lock(fbdev);
@@ -445,21 +443,14 @@ static int present_buffer(struct omap_display_buffer *buffer)
if (overlay->manager) {
overlay->manager->apply(overlay->manager);
- dss_device = overlay->manager->device;
- /*
- * FIXME: Is the update really needed?
- * On 2.6.35 calling this code triggers a bug
- */
-#if 0
- if (dss_device &&
- dss_device->driver->update) {
- dss_device->driver->update(
- dss_device,
+ if (overlay->manager->device &&
+ overlay->manager->device->update) {
+ overlay->manager->device->update(
+ overlay->manager->device,
0, 0,
overlay_info.width,
overlay_info.height);
}
-#endif
}
}
@@ -622,13 +613,13 @@ static int present_buffer_sync_virtual(struct omap_display_buffer *buffer)
static int display_sync(struct omap_display_device *display)
{
/* TODO: Synchronize properly with multiple managers */
- struct omap_overlay_manager *manager =
- display->overlay_managers[0];
- if (!manager) {
+ struct omap_dss_device *dss_device =
+ display->overlay_managers[0]->device;
+ if (!dss_device || !dss_device->wait_vsync) {
ERR_PRINT("Unable to synchronize with '%s'", display->name);
return 1;
}
- manager->wait_for_vsync(manager);
+ dss_device->wait_vsync(dss_device);
return 0;
}
@@ -767,7 +758,7 @@ static int populate_display_info(struct omap_display_device *display,
if (!strcmp(dss_device->name, "lcd")) {
display->id = OMAP_DISPID_PRIMARY;
display->name = "primary";
- } else if (!strcmp(dss_device->name, "lcd2")) {
+ } else if (!strcmp(dss_device->name, "2lcd")) {
display->id = OMAP_DISPID_SECONDARY;
display->name = "secondary";
} else if (!strcmp(dss_device->name, "hdmi")) {
@@ -778,7 +769,7 @@ static int populate_display_info(struct omap_display_device *display,
return 1;
}
- dss_device->driver->get_resolution(dss_device, &xres, &yres);
+ dss_device->get_resolution(dss_device, &xres, &yres);
if (xres == 0 || yres == 0) {
ERR_PRINT("Unable to handle display '%s' with width %i "
"and height %i", dss_device->name, xres, yres);
@@ -788,8 +779,7 @@ static int populate_display_info(struct omap_display_device *display,
display->width = xres;
display->height = yres;
- display->bits_per_pixel =
- dss_device->driver->get_recommended_bpp(dss_device);
+ display->bits_per_pixel = dss_device->get_recommended_bpp(dss_device);
switch (display->bits_per_pixel) {
case 16:
/*
@@ -961,6 +951,7 @@ static int populate_virtual_display_info(struct omap_display_device *display)
static int create_display_list(void)
{
int i;
+ unsigned int bytes_to_alloc;
struct omap_display_device *display;
/* Query number of possible displays available first */
@@ -1035,7 +1026,7 @@ int omap_display_count(void)
}
EXPORT_SYMBOL(omap_display_count);
-int omap_display_initialize(void)
+int omap_display_init(void)
{
/*
* TODO: Is there a better way to check if list is already created?
@@ -1049,9 +1040,9 @@ int omap_display_initialize(void)
}
return 0;
}
-EXPORT_SYMBOL(omap_display_initialize);
+EXPORT_SYMBOL(omap_display_init);
-int omap_display_deinitialize(void)
+int omap_display_deinit(void)
{
int i;
int err = 0;
@@ -1083,5 +1074,5 @@ int omap_display_deinitialize(void)
return err;
}
-EXPORT_SYMBOL(omap_display_deinitialize);
+EXPORT_SYMBOL(omap_display_deinit);
diff --git a/drivers/gpu/pvr/display/omap_display.h b/drivers/gpu/pvr/display/omap_display.h
index 71b9dac23b1..13916a9461f 100644
--- a/drivers/gpu/pvr/display/omap_display.h
+++ b/drivers/gpu/pvr/display/omap_display.h
@@ -101,8 +101,8 @@ struct omap_display_device {
int (*present_buffer_sync) (struct omap_display_buffer *buffer);
};
-int omap_display_initialize(void);
-int omap_display_deinitialize(void);
+int omap_display_init(void);
+int omap_display_deinit(void);
int omap_display_count(void);
struct omap_display_device *omap_display_get(enum omap_display_id id);
diff --git a/drivers/gpu/pvr/display/omap_sgx_displayclass.c b/drivers/gpu/pvr/display/omap_sgx_displayclass.c
index fce8f67ac20..7b493f1d94e 100644
--- a/drivers/gpu/pvr/display/omap_sgx_displayclass.c
+++ b/drivers/gpu/pvr/display/omap_sgx_displayclass.c
@@ -24,7 +24,6 @@
*
*************************************************************************/
-#include <linux/slab.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/console.h>
@@ -1308,10 +1307,8 @@ static enum OMAP_ERROR create_display_devices(void)
DEBUG_PRINTK("Initializing 3rd party display driver");
- /* Init display abstraction layer */
- omap_display_initialize();
-
/* Ask for the number of displays available */
+ omap_display_init();
/* TODO: allow more displays */
display_devices_count = 1; // omap_display_count();
diff --git a/drivers/gpu/pvr/event.c b/drivers/gpu/pvr/event.c
index e2ef0d177ca..bb828ec7023 100644
--- a/drivers/gpu/pvr/event.c
+++ b/drivers/gpu/pvr/event.c
@@ -44,6 +44,7 @@
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <asm/hardirq.h>
+#include <linux/spinlock.h>
#include <linux/timer.h>
#include <linux/capability.h>
#include <linux/sched.h>
@@ -62,8 +63,8 @@
typedef struct PVRSRV_LINUX_EVENT_OBJECT_LIST_TAG
{
- rwlock_t sLock;
- struct list_head sList;
+ rwlock_t sLock;
+ struct list_head sList;
} PVRSRV_LINUX_EVENT_OBJECT_LIST;
@@ -77,27 +78,27 @@ typedef struct PVRSRV_LINUX_EVENT_OBJECT_TAG
#endif
wait_queue_head_t sWait;
struct list_head sList;
- IMG_HANDLE hResItem;
+ 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;
+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psEventObjectList;
if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT_LIST),
- (IMG_VOID **)&psEvenObjectList, IMG_NULL,
+ (IMG_VOID **)&psEventObjectList, IMG_NULL,
"Linux Event Object List") != 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);
+ INIT_LIST_HEAD(&psEventObjectList->sList);
- rwlock_init(&psEvenObjectList->sLock);
+ rwlock_init(&psEventObjectList->sLock);
- *phEventObjectList = (IMG_HANDLE *) psEvenObjectList;
+ *phEventObjectList = (IMG_HANDLE *) psEventObjectList;
return PVRSRV_OK;
}
@@ -105,18 +106,26 @@ PVRSRV_ERROR LinuxEventObjectListCreate(IMG_HANDLE *phEventObjectList)
PVRSRV_ERROR LinuxEventObjectListDestroy(IMG_HANDLE hEventObjectList)
{
- PVRSRV_LINUX_EVENT_OBJECT_LIST *psEvenObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST *) hEventObjectList ;
+ PVRSRV_LINUX_EVENT_OBJECT_LIST *psEventObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST *) hEventObjectList ;
- if(psEvenObjectList)
+ if(psEventObjectList)
{
- if (!list_empty(&psEvenObjectList->sList))
+ IMG_BOOL bListEmpty;
+
+ read_lock(&psEventObjectList->sLock);
+ bListEmpty = list_empty(&psEventObjectList->sList);
+ read_unlock(&psEventObjectList->sLock);
+
+ if (!bListEmpty)
{
PVR_DPF((PVR_DBG_ERROR, "LinuxEventObjectListDestroy: Event List is not empty"));
return PVRSRV_ERROR_UNABLE_TO_DESTROY_EVENT;
}
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT_LIST), psEvenObjectList, IMG_NULL);
+
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_LINUX_EVENT_OBJECT_LIST), psEventObjectList, IMG_NULL);
}
+
return PVRSRV_OK;
}
@@ -147,12 +156,13 @@ static PVRSRV_ERROR LinuxEventObjectDeleteCallback(IMG_PVOID pvParam, IMG_UINT32
{
PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject = pvParam;
PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList = psLinuxEventObject->psLinuxEventObjectList;
+ unsigned long ulLockFlags;
PVR_UNREFERENCED_PARAMETER(ui32Param);
- write_lock_bh(&psLinuxEventObjectList->sLock);
+ write_lock_irqsave(&psLinuxEventObjectList->sLock, ulLockFlags);
list_del(&psLinuxEventObject->sList);
- write_unlock_bh(&psLinuxEventObjectList->sLock);
+ write_unlock_irqrestore(&psLinuxEventObjectList->sLock, ulLockFlags);
#if defined(DEBUG)
PVR_DPF((PVR_DBG_MESSAGE, "LinuxEventObjectDeleteCallback: Event object waits: %u", psLinuxEventObject->ui32Stats));
@@ -169,6 +179,7 @@ PVRSRV_ERROR LinuxEventObjectAdd(IMG_HANDLE hOSEventObjectList, IMG_HANDLE *phOS
PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList = (PVRSRV_LINUX_EVENT_OBJECT_LIST*)hOSEventObjectList;
IMG_UINT32 ui32PID = OSGetCurrentProcessIDKM();
PVRSRV_PER_PROCESS_DATA *psPerProc;
+ unsigned long ulLockFlags;
psPerProc = PVRSRVPerProcessData(ui32PID);
if (psPerProc == IMG_NULL)
@@ -204,9 +215,9 @@ PVRSRV_ERROR LinuxEventObjectAdd(IMG_HANDLE hOSEventObjectList, IMG_HANDLE *phOS
0,
&LinuxEventObjectDeleteCallback);
- write_lock_bh(&psLinuxEventObjectList->sLock);
+ write_lock_irqsave(&psLinuxEventObjectList->sLock, ulLockFlags);
list_add(&psLinuxEventObject->sList, &psLinuxEventObjectList->sList);
- write_unlock_bh(&psLinuxEventObjectList->sLock);
+ write_unlock_irqrestore(&psLinuxEventObjectList->sLock, ulLockFlags);
*phOSEventObject = psLinuxEventObject;
@@ -217,10 +228,13 @@ 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;
+ struct list_head *psListEntry, *psList;
+
psList = &psLinuxEventObjectList->sList;
- list_for_each_safe(psListEntry, psListEntryTemp, psList)
+
+ read_lock(&psLinuxEventObjectList->sLock);
+ list_for_each(psListEntry, psList)
{
psLinuxEventObject = (PVRSRV_LINUX_EVENT_OBJECT *)list_entry(psListEntry, PVRSRV_LINUX_EVENT_OBJECT, sList);
@@ -228,6 +242,7 @@ PVRSRV_ERROR LinuxEventObjectSignal(IMG_HANDLE hOSEventObjectList)
atomic_inc(&psLinuxEventObject->sTimeStamp);
wake_up_interruptible(&psLinuxEventObject->sWait);
}
+ read_unlock(&psLinuxEventObjectList->sLock);
return PVRSRV_OK;
diff --git a/drivers/gpu/pvr/linkage.h b/drivers/gpu/pvr/linkage.h
index 1d0d5775246..7e6d09abab6 100644
--- a/drivers/gpu/pvr/linkage.h
+++ b/drivers/gpu/pvr/linkage.h
@@ -28,7 +28,7 @@
#define __LINKAGE_H__
#if !defined(SUPPORT_DRI_DRM)
-IMG_INT32 PVRSRV_BridgeDispatchKM(struct file *file, IMG_UINT cmd, IMG_UINT32 arg);
+long PVRSRV_BridgeDispatchKM(struct file *file, unsigned int cmd, unsigned long arg);
#endif
IMG_VOID PVRDPFInit(IMG_VOID);
diff --git a/drivers/gpu/pvr/module.c b/drivers/gpu/pvr/module.c
index a4620662e17..7696fcd9ada 100644
--- a/drivers/gpu/pvr/module.c
+++ b/drivers/gpu/pvr/module.c
@@ -120,19 +120,18 @@ static struct class *psPvrClass;
#endif
#if !defined(SUPPORT_DRI_DRM)
-static IMG_INT AssignedMajorNumber;
+static int AssignedMajorNumber;
-static IMG_INT PVRSRVOpen(struct inode* pInode, struct file* pFile);
-static IMG_INT PVRSRVRelease(struct inode* pInode, struct file* pFile);
+static int PVRSRVOpen(struct inode* pInode, struct file* pFile);
+static int PVRSRVRelease(struct inode* pInode, struct file* pFile);
static struct file_operations pvrsrv_fops =
{
- .owner=THIS_MODULE,
-
- .unlocked_ioctl=(IMG_VOID*)PVRSRV_BridgeDispatchKM,
- .open=PVRSRVOpen,
- .release=PVRSRVRelease,
- .mmap=PVRMMap,
+ .owner = THIS_MODULE,
+ .unlocked_ioctl = PVRSRV_BridgeDispatchKM,
+ .open = PVRSRVOpen,
+ .release = PVRSRVRelease,
+ .mmap = PVRMMap,
};
#endif
@@ -157,20 +156,23 @@ static IMG_UINT32 gPVRPowerLevel;
#endif
#if defined(PVR_LDM_PLATFORM_MODULE)
-static IMG_INT PVRSRVDriverRemove(LDM_DEV *device);
-static IMG_INT PVRSRVDriverProbe(LDM_DEV *device);
+static int PVRSRVDriverRemove(LDM_DEV *device);
+static int PVRSRVDriverProbe(LDM_DEV *device);
#endif
#if defined(PVR_LDM_PCI_MODULE)
-static IMG_VOID PVRSRVDriverRemove(LDM_DEV *device);
-static IMG_INT PVRSRVDriverProbe(LDM_DEV *device, const struct pci_device_id *id);
+static void PVRSRVDriverRemove(LDM_DEV *device);
+static int PVRSRVDriverProbe(LDM_DEV *device, const struct pci_device_id *id);
#endif
-static IMG_INT PVRSRVDriverSuspend(LDM_DEV *device, pm_message_t state);
-static IMG_VOID PVRSRVDriverShutdown(LDM_DEV *device);
-static IMG_INT PVRSRVDriverResume(LDM_DEV *device);
+static int PVRSRVDriverSuspend(LDM_DEV *device, pm_message_t state);
+static void PVRSRVDriverShutdown(LDM_DEV *device);
+static int PVRSRVDriverResume(LDM_DEV *device);
#if defined(PVR_LDM_PCI_MODULE)
struct pci_device_id powervr_id_table[] __devinitdata = {
{ PCI_DEVICE(SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV_DEVICE_ID) },
+#if defined (SYS_SGX_DEV1_DEVICE_ID)
+ { PCI_DEVICE(SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV1_DEVICE_ID) },
+#endif
{ 0 }
};
@@ -202,12 +204,11 @@ static LDM_DRV powervr_driver = {
struct gpu_platform_data *gpsSgxPlatformData;
LDM_DEV *gpsPVRLDMDev;
-
#if defined(PVR_LDM_PLATFORM_MODULE)
-static IMG_INT PVRSRVDriverProbe(LDM_DEV *pDevice)
+static int PVRSRVDriverProbe(LDM_DEV *pDevice)
#endif
#if defined(PVR_LDM_PCI_MODULE)
-static IMG_INT __devinit PVRSRVDriverProbe(LDM_DEV *pDevice, const struct pci_device_id *id)
+static int __devinit PVRSRVDriverProbe(LDM_DEV *pDevice, const struct pci_device_id *id)
#endif
{
SYS_DATA *psSysData;
@@ -246,10 +247,10 @@ static IMG_INT __devinit PVRSRVDriverProbe(LDM_DEV *pDevice, const struct pci_de
#if defined (PVR_LDM_PLATFORM_MODULE)
-static IMG_INT PVRSRVDriverRemove(LDM_DEV *pDevice)
+static int PVRSRVDriverRemove(LDM_DEV *pDevice)
#endif
#if defined(PVR_LDM_PCI_MODULE)
-static IMG_VOID __devexit PVRSRVDriverRemove(LDM_DEV *pDevice)
+static void __devexit PVRSRVDriverRemove(LDM_DEV *pDevice)
#endif
{
SYS_DATA *psSysData;
@@ -301,9 +302,9 @@ static IMG_VOID PVRSRVDriverShutdown(LDM_DEV *pDevice)
#if defined(PVR_LDM_MODULE) || defined(SUPPORT_DRI_DRM)
#if defined(SUPPORT_DRI_DRM)
-IMG_INT PVRSRVDriverSuspend(struct drm_device *pDevice, pm_message_t state)
+int PVRSRVDriverSuspend(struct drm_device *pDevice, pm_message_t state)
#else
-static IMG_INT PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state)
+static int PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state)
#endif
{
#if !(defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL) && !defined(SUPPORT_DRI_DRM))
@@ -319,9 +320,9 @@ static IMG_INT PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state)
#if defined(SUPPORT_DRI_DRM)
-IMG_INT PVRSRVDriverResume(struct drm_device *pDevice)
+int PVRSRVDriverResume(struct drm_device *pDevice)
#else
-static IMG_INT PVRSRVDriverResume(LDM_DEV *pDevice)
+static int PVRSRVDriverResume(LDM_DEV *pDevice)
#endif
{
#if !(defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL) && !defined(SUPPORT_DRI_DRM))
@@ -385,31 +386,25 @@ void ProcSeqShowPowerLevel(struct seq_file *sfile,void* el)
#endif
#if defined(SUPPORT_DRI_DRM)
-IMG_INT PVRSRVOpen(struct drm_device unref__ *dev, struct drm_file *pFile)
+int PVRSRVOpen(struct drm_device unref__ *dev, struct drm_file *pFile)
#else
-static IMG_INT PVRSRVOpen(struct inode unref__ * pInode, struct file *pFile)
+static int PVRSRVOpen(struct inode unref__ * pInode, struct file *pFile)
#endif
{
PVRSRV_FILE_PRIVATE_DATA *psPrivateData;
IMG_HANDLE hBlockAlloc;
- IMG_INT iRet = -ENOMEM;
+ int iRet = -ENOMEM;
PVRSRV_ERROR eError;
IMG_UINT32 ui32PID;
#if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT)
PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc;
#endif
-#if defined(SUPPORT_DRI_DRM)
- PVR_UNREFERENCED_PARAMETER(dev);
-#else
- PVR_UNREFERENCED_PARAMETER(pInode);
-#endif
-
LinuxLockMutex(&gPVRSRVLock);
ui32PID = OSGetCurrentProcessIDKM();
- if (PVRSRVProcessConnect(ui32PID) != PVRSRV_OK)
+ if (PVRSRVProcessConnect(ui32PID, 0) != PVRSRV_OK)
goto err_unlock;
#if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT)
@@ -449,50 +444,55 @@ err_unlock:
#if defined(SUPPORT_DRI_DRM)
-IMG_INT PVRSRVRelease(struct drm_device unref__ *dev, struct drm_file *pFile)
+void PVRSRVRelease(void *pvPrivData)
#else
-static IMG_INT PVRSRVRelease(struct inode unref__ * pInode, struct file *pFile)
+static int PVRSRVRelease(struct inode unref__ * pInode, struct file *pFile)
#endif
{
PVRSRV_FILE_PRIVATE_DATA *psPrivateData;
-#if defined(SUPPORT_DRI_DRM)
- PVR_UNREFERENCED_PARAMETER(dev);
-#else
- PVR_UNREFERENCED_PARAMETER(pInode);
-#endif
-
LinuxLockMutex(&gPVRSRVLock);
+#if defined(SUPPORT_DRI_DRM)
+ psPrivateData = (PVRSRV_FILE_PRIVATE_DATA *)pvPrivData;
+#else
psPrivateData = PRIVATE_DATA(pFile);
-
+#endif
+ if (psPrivateData != IMG_NULL)
+ {
#if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT)
- list_del(&psPrivateData->sDRMAuthListItem);
+ list_del(&psPrivateData->sDRMAuthListItem);
#endif
-
- gui32ReleasePID = psPrivateData->ui32OpenPID;
- PVRSRVProcessDisconnect(psPrivateData->ui32OpenPID);
- gui32ReleasePID = 0;
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(PVRSRV_FILE_PRIVATE_DATA),
- psPrivateData, psPrivateData->hBlockAlloc);
+ gui32ReleasePID = psPrivateData->ui32OpenPID;
+ PVRSRVProcessDisconnect(psPrivateData->ui32OpenPID);
+ gui32ReleasePID = 0;
+
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ sizeof(PVRSRV_FILE_PRIVATE_DATA),
+ psPrivateData, psPrivateData->hBlockAlloc);
- PRIVATE_DATA(pFile) = NULL;
+#if !defined(SUPPORT_DRI_DRM)
+ PRIVATE_DATA(pFile) = IMG_NULL;
+#endif
+ }
LinuxUnLockMutex(&gPVRSRVLock);
+
+#if !defined(SUPPORT_DRI_DRM)
return 0;
+#endif
}
#if defined(SUPPORT_DRI_DRM)
-IMG_INT PVRCore_Init(IMG_VOID)
+int PVRCore_Init(IMG_VOID)
#else
-static IMG_INT __init PVRCore_Init(IMG_VOID)
+static int __init PVRCore_Init(IMG_VOID)
#endif
{
- IMG_INT error;
+ int error;
#if !defined(PVR_LDM_MODULE)
PVRSRV_ERROR eError;
#else
@@ -651,9 +651,9 @@ init_failed:
#if defined(SUPPORT_DRI_DRM)
-IMG_VOID PVRCore_Cleanup(IMG_VOID)
+void PVRCore_Cleanup(void)
#else
-static IMG_VOID __exit PVRCore_Cleanup(IMG_VOID)
+static void __exit PVRCore_Cleanup(void)
#endif
{
SYS_DATA *psSysData;
@@ -703,7 +703,7 @@ static IMG_VOID __exit PVRCore_Cleanup(IMG_VOID)
}
#endif
- (IMG_VOID)SysDeinitialise(psSysData);
+ (void) SysDeinitialise(psSysData);
#endif
PVRMMapCleanup();
diff --git a/drivers/gpu/pvr/omap3/sysconfig.c b/drivers/gpu/pvr/omap3/sysconfig.c
index 00520992b93..d5036613ce3 100644
--- a/drivers/gpu/pvr/omap3/sysconfig.c
+++ b/drivers/gpu/pvr/omap3/sysconfig.c
@@ -420,12 +420,11 @@ PVRSRV_ERROR SysInitialise(IMG_VOID)
PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to map OCP registers"));
return PVRSRV_ERROR_BAD_MAPPING;
}
+ SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS);
}
#endif
-
-
eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice,
DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID);
if (eError != PVRSRV_OK)
@@ -531,31 +530,24 @@ PVRSRV_ERROR SysFinalise(IMG_VOID)
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to Enable SGX clocks (%d)", eError));
- (IMG_VOID)SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
return eError;
}
#endif
-#if defined(SYS_USING_INTERRUPTS)
-
eError = OSInstallMISR(gpsSysData);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install MISR"));
- (IMG_VOID)SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
return eError;
}
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR);
+#if defined(SYS_USING_INTERRUPTS)
eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install ISR"));
- (IMG_VOID)SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
return eError;
}
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR);
@@ -597,6 +589,7 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
return eError;
}
}
+#endif
if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR))
{
@@ -607,9 +600,6 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
return eError;
}
}
-#else
- PVR_UNREFERENCED_PARAMETER(psSysData);
-#endif
if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV))
{
@@ -634,10 +624,13 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
}
#if defined(SGX_OCP_REGS_ENABLED)
- OSUnMapPhysToLin(gpvOCPRegsLinAddr,
- SYS_OMAP3430_OCP_REGS_SIZE,
- PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY,
- IMG_NULL);
+ if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS))
+ {
+ OSUnMapPhysToLin(gpvOCPRegsLinAddr,
+ SYS_OMAP3430_OCP_REGS_SIZE,
+ PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY,
+ IMG_NULL);
+ }
#endif
diff --git a/drivers/gpu/pvr/omap3/syslocal.h b/drivers/gpu/pvr/omap3/syslocal.h
index 351ed695275..5b0894fc004 100644
--- a/drivers/gpu/pvr/omap3/syslocal.h
+++ b/drivers/gpu/pvr/omap3/syslocal.h
@@ -76,6 +76,7 @@ PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData);
#define SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR 0x00000200
#define SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS 0x00000400
+#define SYS_SPECIFIC_DATA_ENABLE_OCPREGS 0x00000800
#define SYS_SPECIFIC_DATA_SET(psSysSpecData, flag) ((IMG_VOID)((psSysSpecData)->ui32SysSpecificData |= (flag)))
diff --git a/drivers/gpu/pvr/omap3/sysutils_linux_wqueue_compat.c b/drivers/gpu/pvr/omap3/sysutils_linux_wqueue_compat.c
index 93c5b7c5b3a..be90433fdfa 100644
--- a/drivers/gpu/pvr/omap3/sysutils_linux_wqueue_compat.c
+++ b/drivers/gpu/pvr/omap3/sysutils_linux_wqueue_compat.c
@@ -54,27 +54,17 @@
#endif
extern struct platform_device *gpsPVRLDMDev;
-
-static PVRSRV_ERROR ForceMaxSGXClocks(SYS_SPECIFIC_DATA *psSysSpecData)
-{
- PVR_UNREFERENCED_PARAMETER(psSysSpecData);
-
- /* Pin the memory bus bw to the highest value according to CORE_REV */
#if defined(SGX530) && (SGX_CORE_REV == 125)
- omap_pm_set_min_bus_tput(&gpsPVRLDMDev->dev, OCP_INITIATOR_AGENT, 800000);
+#define OMAP_MEMORY_BUS_CLOCK_MAX 800000
#else
- omap_pm_set_min_bus_tput(&gpsPVRLDMDev->dev, OCP_INITIATOR_AGENT, 664000);
+#define OMAP_MEMORY_BUS_CLOCK_MAX 664000
#endif
- return PVRSRV_OK;
-}
-
static IMG_VOID PowerLockWrap(SYS_SPECIFIC_DATA *psSysSpecData)
{
if (!in_interrupt())
{
BUG_ON(in_atomic());
mutex_lock(&psSysSpecData->sPowerLock);
-
}
}
@@ -217,7 +207,10 @@ PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData)
}
#endif
- ForceMaxSGXClocks(psSysSpecData);
+#if defined(SYS_OMAP3430_PIN_MEMORY_BUS_CLOCK)
+ omap_pm_set_min_bus_tput(&gpsPVRLDMDev->dev, OCP_INITIATOR_AGENT, OMAP_MEMORY_BUS_CLOCK_MAX);
+#endif
+
atomic_set(&psSysSpecData->sSGXClocksEnabled, 1);
@@ -250,7 +243,9 @@ IMG_VOID DisableSGXClocks(SYS_DATA *psSysData)
clk_disable(psSysSpecData->psSGX_FCK);
}
+#if defined(SYS_OMAP3430_PIN_MEMORY_BUS_CLOCK)
omap_pm_set_min_bus_tput(&gpsPVRLDMDev->dev, OCP_INITIATOR_AGENT, 0);
+#endif
atomic_set(&psSysSpecData->sSGXClocksEnabled, 0);
diff --git a/drivers/gpu/pvr/omap4/sysconfig.c b/drivers/gpu/pvr/omap4/sysconfig.c
index 27de32dc44e..56ecb5ab9db 100644
--- a/drivers/gpu/pvr/omap4/sysconfig.c
+++ b/drivers/gpu/pvr/omap4/sysconfig.c
@@ -23,7 +23,7 @@
* Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
*
******************************************************************************/
-#include <linux/platform_device.h>
+
#include "services_headers.h"
#include "kerneldisplay.h"
#include "oemfuncs.h"
@@ -52,9 +52,6 @@ static PVRSRV_DEVICE_NODE *gpsSGXDevNode;
#define DEVICE_SGX_INTERRUPT (1 << 0)
-#define LDM_DEV struct platform_device
-extern LDM_DEV *gpsPVRLDMDev;
-
#if defined(NO_HARDWARE)
static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr;
#endif
@@ -159,6 +156,7 @@ static INLINE void dump_omap34xx_clocks(void) {}
#if defined(SGX_OCP_REGS_ENABLED)
+#define SYS_OMAP4430_OCP_REGS_SYS_PHYS_BASE (SYS_OMAP4430_SGX_REGS_SYS_PHYS_BASE + EUR_CR_OCP_REVISION)
#define SYS_OMAP4430_OCP_REGS_SIZE 0x110
static IMG_CPU_VIRTADDR gpvOCPRegsLinAddr;
@@ -208,9 +206,6 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData)
IMG_CPU_PHYADDR sCpuPAddr;
#endif
- struct resource *res;
- int irq;
-
PVR_UNREFERENCED_PARAMETER(psSysData);
@@ -246,29 +241,22 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData)
#else
- res = platform_get_resource(gpsPVRLDMDev, IORESOURCE_MEM,0);
- irq = platform_get_irq(gpsPVRLDMDev,0);
-
- gsSGXDeviceMap.sRegsSysPBase.uiAddr = res->start;
+ gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_OMAP4430_SGX_REGS_SYS_PHYS_BASE;
gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase);
- gsSGXDeviceMap.ui32RegsSize = (unsigned int)(res->end - res->start);
+ gsSGXDeviceMap.ui32RegsSize = SYS_OMAP4430_SGX_REGS_SIZE;
- gsSGXDeviceMap.ui32IRQ = irq;
+ gsSGXDeviceMap.ui32IRQ = SYS_OMAP4430_SGX_IRQ;
#endif
#if defined(PDUMP)
{
-
static IMG_CHAR pszPDumpDevName[] = "SGXMEM";
gsSGXDeviceMap.pszPDumpDevName = pszPDumpDevName;
}
#endif
-
-
-
return PVRSRV_OK;
}
@@ -283,7 +271,7 @@ IMG_CHAR *SysCreateVersionString(IMG_CPU_PHYADDR sRegRegion)
IMG_VOID *pvRegsLinAddr;
pvRegsLinAddr = OSMapPhysToLin(sRegRegion,
- gsSGXDeviceMap.ui32RegsSize,
+ SYS_OMAP4430_SGX_REGS_SIZE,
PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY,
IMG_NULL);
if(!pvRegsLinAddr)
@@ -311,7 +299,7 @@ IMG_CHAR *SysCreateVersionString(IMG_CPU_PHYADDR sRegRegion)
#if !defined(NO_HARDWARE)
OSUnMapPhysToLin(pvRegsLinAddr,
- gsSGXDeviceMap.ui32RegsSize,
+ SYS_OMAP4430_SGX_REGS_SIZE,
PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY,
IMG_NULL);
#endif
@@ -423,7 +411,7 @@ PVRSRV_ERROR SysInitialise(IMG_VOID)
IMG_SYS_PHYADDR sOCPRegsSysPBase;
IMG_CPU_PHYADDR sOCPRegsCpuPBase;
- sOCPRegsSysPBase.uiAddr = gsSGXDeviceMap.sRegsSysPBase.uiAddr + EUR_CR_OCP_REVISION;
+ sOCPRegsSysPBase.uiAddr = SYS_OMAP4430_OCP_REGS_SYS_PHYS_BASE;
sOCPRegsCpuPBase = SysSysPAddrToCpuPAddr(sOCPRegsSysPBase);
gpvOCPRegsLinAddr = OSMapPhysToLin(sOCPRegsCpuPBase,
@@ -436,12 +424,11 @@ PVRSRV_ERROR SysInitialise(IMG_VOID)
PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to map OCP registers"));
return PVRSRV_ERROR_BAD_MAPPING;
}
+ SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS);
}
#endif
-
-
eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice,
DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID);
if (eError != PVRSRV_OK)
@@ -546,31 +533,24 @@ PVRSRV_ERROR SysFinalise(IMG_VOID)
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to Enable SGX clocks (%d)", eError));
- (IMG_VOID)SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
return eError;
}
#endif
-#if defined(SYS_USING_INTERRUPTS)
-
eError = OSInstallMISR(gpsSysData);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install MISR"));
- (IMG_VOID)SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
return eError;
}
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR);
+#if defined(SYS_USING_INTERRUPTS)
eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install ISR"));
- (IMG_VOID)SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
return eError;
}
SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR);
@@ -612,6 +592,7 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
return eError;
}
}
+#endif
if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR))
{
@@ -622,9 +603,6 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
return eError;
}
}
-#else
- PVR_UNREFERENCED_PARAMETER(psSysData);
-#endif
if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV))
{
@@ -649,10 +627,13 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
}
#if defined(SGX_OCP_REGS_ENABLED)
+ if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS))
+ {
OSUnMapPhysToLin(gpvOCPRegsLinAddr,
SYS_OMAP4430_OCP_REGS_SIZE,
PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY,
IMG_NULL);
+ }
#endif
diff --git a/drivers/gpu/pvr/omap4/sysconfig.h b/drivers/gpu/pvr/omap4/sysconfig.h
index 4f49db9a42d..7fcf84b2e8d 100644
--- a/drivers/gpu/pvr/omap4/sysconfig.h
+++ b/drivers/gpu/pvr/omap4/sysconfig.h
@@ -57,6 +57,11 @@
+#define SYS_OMAP4430_SGX_REGS_SYS_PHYS_BASE 0x56000000
+#define SYS_OMAP4430_SGX_REGS_SIZE 0xFFFF
+
+#define SYS_OMAP4430_SGX_IRQ 53 /* OMAP 4 IRQs are offset by 32 */
+
#endif
diff --git a/drivers/gpu/pvr/omap4/syslocal.h b/drivers/gpu/pvr/omap4/syslocal.h
index ecf203b912e..766870f366c 100644
--- a/drivers/gpu/pvr/omap4/syslocal.h
+++ b/drivers/gpu/pvr/omap4/syslocal.h
@@ -76,6 +76,7 @@ PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData);
#define SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR 0x00000200
#define SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS 0x00000400
+#define SYS_SPECIFIC_DATA_ENABLE_OCPREGS 0x00000800
#define SYS_SPECIFIC_DATA_SET(psSysSpecData, flag) ((IMG_VOID)((psSysSpecData)->ui32SysSpecificData |= (flag)))
diff --git a/drivers/gpu/pvr/omap4/sysutils_linux_wqueue_compat.c b/drivers/gpu/pvr/omap4/sysutils_linux_wqueue_compat.c
index 6d9687a648c..d44a39c6939 100644
--- a/drivers/gpu/pvr/omap4/sysutils_linux_wqueue_compat.c
+++ b/drivers/gpu/pvr/omap4/sysutils_linux_wqueue_compat.c
@@ -52,13 +52,6 @@
extern LDM_DEV *gpsPVRLDMDev;
extern struct gpu_platform_data *gpsSgxPlatformData;
-
-#if defined(SUPPORT_OMAP3430_SGXFCLK_96M)
-#define SGX_PARENT_CLOCK "cm_96m_fck"
-#else
-#define SGX_PARENT_CLOCK "core_ck"
-#endif
-
PVRSRV_ERROR SysPowerLockWrap(SYS_DATA unref__ *psSysData)
{
return PVRSRV_OK;
@@ -168,19 +161,8 @@ IMG_VOID DisableSGXClocks(SYS_DATA *psSysData)
PVRSRV_ERROR EnableSystemClocks(SYS_DATA *psSysData)
{
SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
- struct clk *psCLK;
- IMG_INT res;
PVRSRV_ERROR eError;
-#if defined(DEBUG) || defined(TIMING)
- IMG_INT rate;
- struct clk *sys_ck;
- IMG_CPU_PHYADDR TimerRegPhysBase;
- IMG_HANDLE hTimerEnable;
- IMG_UINT32 *pui32TimerEnable;
-
-#endif
-
PVR_TRACE(("EnableSystemClocks: Enabling System Clocks"));
if (!psSysSpecData->bSysClocksOneTimeInit)
@@ -192,58 +174,15 @@ PVRSRV_ERROR EnableSystemClocks(SYS_DATA *psSysData)
}
eError = PVRSRV_OK;
- goto Exit;
-#if !defined(NO_OMAP_TIMER)
-#if defined(DEBUG) || defined(TIMING)
-ExitDisableGPT11ICK:
-ExitDisableGPT11FCK:
-ExitUnRegisterConstraintNotifications:
-#endif
-#endif
-Exit:
return eError;
}
IMG_VOID DisableSystemClocks(SYS_DATA *psSysData)
{
-#if !defined(NO_OMAP_TIMER)
-#if defined(DEBUG) || defined(TIMING)
- SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
- IMG_CPU_PHYADDR TimerRegPhysBase;
- IMG_HANDLE hTimerDisable;
- IMG_UINT32 *pui32TimerDisable;
-#endif
-#endif
PVR_TRACE(("DisableSystemClocks: Disabling System Clocks"));
DisableSGXClocks(psSysData);
-#if !defined(NO_OMAP_TIMER)
-#if defined(DEBUG) || defined(TIMING)
-
- TimerRegPhysBase.uiAddr = SYS_OMAP3430_GP11TIMER_ENABLE_SYS_PHYS_BASE;
- pui32TimerDisable = OSMapPhysToLin(TimerRegPhysBase,
- 4,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- &hTimerDisable);
-
- if (pui32TimerDisable == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR, "DisableSystemClocks: OSMapPhysToLin failed"));
- }
- else
- {
- *pui32TimerDisable = 0;
-
- OSUnMapPhysToLin(pui32TimerDisable,
- 4,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- hTimerDisable);
- }
-
-
-#endif
-#endif
}
diff --git a/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c b/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c
index 548e352c56a..a2ad4e6e5d6 100644
--- a/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c
+++ b/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c
@@ -1470,16 +1470,6 @@ static OMAP_ERROR InitDev(OMAPLFB_DEVINFO *psDevInfo, int fb_idx)
psPVRFBInfo->ulFBSize = FBSize;
psPVRFBInfo->ulBufferSize =
psPVRFBInfo->ulHeight * psPVRFBInfo->ulByteStride;
- /* Get physical display size for DPI calculation */
- if (psLINFBInfo->var.width < 0 || psLINFBInfo->var.height < 0) {
- psDevInfo->sDisplayInfo.ui32PhysicalWidthmm = 0;
- psDevInfo->sDisplayInfo.ui32PhysicalHeightmm = 0;
- } else {
- psDevInfo->sDisplayInfo.ui32PhysicalWidthmm =
- psLINFBInfo->var.width;
- psDevInfo->sDisplayInfo.ui32PhysicalHeightmm =
- psLINFBInfo->var.height;
- }
/* XXX: Page aligning with 16bpp causes the
* position of framebuffer address to look in the wrong place.
diff --git a/drivers/gpu/pvr/osfunc.c b/drivers/gpu/pvr/osfunc.c
index e465228de64..7a9c4769cb8 100644
--- a/drivers/gpu/pvr/osfunc.c
+++ b/drivers/gpu/pvr/osfunc.c
@@ -54,6 +54,7 @@
#if defined(PVR_LINUX_MISR_USING_WORKQUEUE) || \
defined(PVR_LINUX_MISR_USING_PRIVATE_WORKQUEUE) || \
defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || \
+ defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE) || \
defined(PVR_LINUX_USING_WORKQUEUES)
#include <linux/workqueue.h>
#endif
@@ -70,6 +71,16 @@
#include "linkage.h"
#include "pvr_uaccess.h"
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
+#define ON_EACH_CPU(func, info, wait) on_each_cpu(func, info, wait)
+#else
+#define ON_EACH_CPU(func, info, wait) on_each_cpu(func, info, 0, wait)
+#endif
+
+#if defined(PVR_LINUX_USING_WORKQUEUES) && !defined(CONFIG_PREEMPT)
+#error "A preemptible Linux kernel is required when using workqueues"
+#endif
+
#define EVENT_OBJECT_TIMEOUT_MS (100)
#define HOST_ALLOC_MEM_USING_KMALLOC ((IMG_HANDLE)0)
@@ -986,6 +997,7 @@ PVRSRV_ERROR OSUnlockResource (PVRSRV_RESOURCE *psResource, IMG_UINT32 ui32ID)
if(psResource->ui32ID == ui32ID)
{
psResource->ui32ID = 0;
+ smp_mb();
*pui32Access = 0;
}
else
@@ -1734,7 +1746,7 @@ typedef struct TIMER_CALLBACK_DATA_TAG
struct timer_list sTimer;
IMG_UINT32 ui32Delay;
IMG_BOOL bActive;
-#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
struct work_struct sWork;
#endif
}TIMER_CALLBACK_DATA;
@@ -1745,7 +1757,7 @@ static struct workqueue_struct *psTimerWorkQueue;
static TIMER_CALLBACK_DATA sTimers[OS_MAX_TIMERS];
-#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
DEFINE_MUTEX(sTimerStructLock);
#else
@@ -1769,10 +1781,14 @@ static IMG_VOID OSTimerCallbackWrapper(IMG_UINT32 ui32Data)
{
TIMER_CALLBACK_DATA *psTimerCBData = (TIMER_CALLBACK_DATA*)ui32Data;
-#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
int res;
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
res = queue_work(psTimerWorkQueue, &psTimerCBData->sWork);
+#else
+ res = schedule_work(&psTimerCBData->sWork);
+#endif
if (res == 0)
{
PVR_DPF((PVR_DBG_WARNING, "OSTimerCallbackWrapper: work already queued"));
@@ -1783,7 +1799,7 @@ static IMG_VOID OSTimerCallbackWrapper(IMG_UINT32 ui32Data)
}
-#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
static void OSTimerWorkQueueCallBack(struct work_struct *psWork)
{
TIMER_CALLBACK_DATA *psTimerCBData = container_of(psWork, TIMER_CALLBACK_DATA, sWork);
@@ -1796,7 +1812,7 @@ IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32
{
TIMER_CALLBACK_DATA *psTimerCBData;
IMG_UINT32 ui32i;
-#if !defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if !(defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE))
unsigned long ulLockFlags;
#endif
@@ -1808,7 +1824,7 @@ IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32
}
-#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
mutex_lock(&sTimerStructLock);
#else
spin_lock_irqsave(&sTimerStructLock, ulLockFlags);
@@ -1822,7 +1838,7 @@ IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32
break;
}
}
-#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
mutex_unlock(&sTimerStructLock);
#else
spin_unlock_irqrestore(&sTimerStructLock, ulLockFlags);
@@ -1912,6 +1928,9 @@ PVRSRV_ERROR OSDisableTimer (IMG_HANDLE hTimer)
#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
flush_workqueue(psTimerWorkQueue);
#endif
+#if defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
+ flush_scheduled_work();
+#endif
del_timer_sync(&psTimerCBData->sTimer);
@@ -1920,6 +1939,9 @@ PVRSRV_ERROR OSDisableTimer (IMG_HANDLE hTimer)
flush_workqueue(psTimerWorkQueue);
#endif
+#if defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
+ flush_scheduled_work();
+#endif
return PVRSRV_OK;
}
@@ -2602,6 +2624,7 @@ static unsigned long AllocPagesAreaToPhys(LinuxMemArea *psLinuxMemArea,
#endif
+#ifndef __mips__
static
IMG_VOID *FindMMapBaseVAddr(struct list_head *psMMapOffsetStructList,
IMG_VOID *pvRangeAddrStart, IMG_UINT32 ui32Length)
@@ -2639,7 +2662,7 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle,
IMG_VOID *pvMinVAddr;
#if defined(CONFIG_OUTER_CACHE)
- MemAreaToPhys_t pfnMemAreaToPhys;
+ MemAreaToPhys_t pfnMemAreaToPhys = IMG_NULL;
IMG_UINT32 ui32PageNumOffset = 0;
#endif
@@ -2679,10 +2702,20 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle,
case LINUX_MEM_AREA_EXTERNAL_KV:
{
- PVR_ASSERT(psLinuxMemArea->uData.sExternalKV.bPhysContig != IMG_TRUE);
+ if (psLinuxMemArea->uData.sExternalKV.bPhysContig == IMG_TRUE)
+ {
+ PVR_DPF((PVR_DBG_WARNING, "%s: Attempt to flush contiguous external memory", __func__));
+
+ goto err_blocked;
+ }
- PVR_ASSERT(psLinuxMemArea->uData.sExternalKV.pvExternalKV == IMG_NULL);
+ if (psLinuxMemArea->uData.sExternalKV.pvExternalKV != IMG_NULL)
+ {
+ PVR_DPF((PVR_DBG_WARNING, "%s: Attempt to flush external memory with a kernel virtual address", __func__));
+
+ goto err_blocked;
+ }
@@ -2692,7 +2725,7 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle,
goto err_blocked;
#if defined(CONFIG_OUTER_CACHE)
- ui32PageNumOffset = (ui32AreaOffset + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT;
+ ui32PageNumOffset = ((ui32AreaOffset & PAGE_MASK) + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT;
pfnMemAreaToPhys = ExternalKVAreaToPhys;
#endif
break;
@@ -2706,7 +2739,7 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle,
goto err_blocked;
#if defined(CONFIG_OUTER_CACHE)
- ui32PageNumOffset = (ui32AreaOffset + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT;
+ ui32PageNumOffset = ((ui32AreaOffset & PAGE_MASK) + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT;
pfnMemAreaToPhys = AllocPagesAreaToPhys;
#endif
break;
@@ -2721,6 +2754,7 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle,
#if defined(CONFIG_OUTER_CACHE)
+ if (pfnMemAreaToPhys != IMG_NULL)
{
unsigned long ulStart, ulEnd, ulLength, ulStartOffset, ulEndOffset;
IMG_UINT32 i, ui32NumPages;
@@ -2748,6 +2782,10 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle,
pfnOuterCacheOp(ulStart, ulEnd);
}
}
+ else
+ {
+ PVR_DBG_BREAK;
+ }
#endif
return IMG_TRUE;
@@ -2759,6 +2797,7 @@ err_blocked:
psLinuxMemArea->eAreaType));
return IMG_FALSE;
}
+#endif
#if defined(__i386__)
@@ -2788,12 +2827,12 @@ static void x86_flush_cache_range(const void *pvStart, const void *pvEnd)
IMG_VOID OSCleanCPUCacheKM(IMG_VOID)
{
- on_each_cpu(per_cpu_cache_flush, NULL, 1);
+ ON_EACH_CPU(per_cpu_cache_flush, NULL, 1);
}
IMG_VOID OSFlushCPUCacheKM(IMG_VOID)
{
- on_each_cpu(per_cpu_cache_flush, NULL, 1);
+ ON_EACH_CPU(per_cpu_cache_flush, NULL, 1);
}
IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
@@ -2827,15 +2866,27 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
#if defined(__arm__)
-IMG_VOID OSCleanCPUCacheKM(IMG_VOID)
+static void per_cpu_cache_flush(void *arg)
{
-
+ PVR_UNREFERENCED_PARAMETER(arg);
flush_cache_all();
}
+IMG_VOID OSCleanCPUCacheKM(IMG_VOID)
+{
+
+ ON_EACH_CPU(per_cpu_cache_flush, NULL, 1);
+#if defined(CONFIG_OUTER_CACHE) && !defined(PVR_NO_FULL_CACHE_OPS)
+ outer_clean_all();
+#endif
+}
+
IMG_VOID OSFlushCPUCacheKM(IMG_VOID)
{
- flush_cache_all();
+ ON_EACH_CPU(per_cpu_cache_flush, NULL, 1);
+#if defined(CONFIG_OUTER_CACHE) && !defined(PVR_NO_FULL_CACHE_OPS)
+ outer_flush_all();
+#endif
}
IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
@@ -2864,18 +2915,59 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
#else
+#if defined(__mips__)
+
+IMG_VOID OSCleanCPUCacheKM(IMG_VOID)
+{
+
+ dma_cache_wback(0, 0x100000);
+}
+
+IMG_VOID OSFlushCPUCacheKM(IMG_VOID)
+{
+
+ dma_cache_wback_inv(0, 0x100000);
+}
+
+IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
+ IMG_VOID *pvRangeAddrStart,
+ IMG_UINT32 ui32Length)
+{
+ dma_cache_wback_inv((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length);
+ return IMG_TRUE;
+}
+
+IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
+ IMG_VOID *pvRangeAddrStart,
+ IMG_UINT32 ui32Length)
+{
+ dma_cache_wback((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length);
+ return IMG_TRUE;
+}
+
+IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
+ IMG_VOID *pvRangeAddrStart,
+ IMG_UINT32 ui32Length)
+{
+ dma_cache_inv((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length);
+ return IMG_TRUE;
+}
+
+
+#else
+
#error "Implement CPU cache flush/clean/invalidate primitives for this CPU!"
#endif
#endif
+#endif
+
PVRSRV_ERROR PVROSFuncInit(IMG_VOID)
{
#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES)
{
- IMG_UINT32 ui32i;
-
psTimerWorkQueue = create_workqueue("pvr_timer");
if (psTimerWorkQueue == NULL)
{
@@ -2883,6 +2975,12 @@ PVRSRV_ERROR PVROSFuncInit(IMG_VOID)
return PVRSRV_ERROR_UNABLE_TO_CREATE_THREAD;
}
+ }
+#endif
+
+#if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)
+ {
+ IMG_UINT32 ui32i;
for (ui32i = 0; ui32i < OS_MAX_TIMERS; ui32i++)
{
diff --git a/drivers/gpu/pvr/pdump.c b/drivers/gpu/pvr/pdump.c
index 0cae749cd46..0b932b0ae63 100644
--- a/drivers/gpu/pvr/pdump.c
+++ b/drivers/gpu/pvr/pdump.c
@@ -537,7 +537,7 @@ IMG_BOOL PDumpIsLastCaptureFrameKM(IMG_VOID)
}
-IMG_BOOL PDumpIsCaptureFrameKM(IMG_VOID)
+IMG_BOOL PDumpOSIsCaptureFrameKM(IMG_VOID)
{
if (PDumpSuspended())
{
@@ -546,7 +546,7 @@ IMG_BOOL PDumpIsCaptureFrameKM(IMG_VOID)
return gpfnDbgDrv->pfnIsCaptureFrame(gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2], IMG_FALSE);
}
-PVRSRV_ERROR PDumpSetFrameKM(IMG_UINT32 ui32Frame)
+PVRSRV_ERROR PDumpOSSetFrameKM(IMG_UINT32 ui32Frame)
{
IMG_UINT32 ui32Stream;
@@ -573,6 +573,7 @@ static IMG_BOOL PDumpWriteILock(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_U
IMG_UINT32 ui32Written = 0;
if ((psStream == IMG_NULL) || PDumpSuspended() || ((ui32Flags & PDUMP_FLAGS_NEVER) != 0))
{
+ PVR_DPF((PVR_DBG_MESSAGE, "PDumpWriteILock: Failed to write 0x%x bytes to stream 0x%x", ui32Count, (IMG_UINT32)psStream));
return IMG_TRUE;
}
diff --git a/drivers/gpu/pvr/pdump.h b/drivers/gpu/pvr/pdump.h
index 00d884b4ae6..78d907357ff 100644
--- a/drivers/gpu/pvr/pdump.h
+++ b/drivers/gpu/pvr/pdump.h
@@ -27,11 +27,11 @@
#ifndef _SERVICES_PDUMP_H_
#define _SERVICES_PDUMP_H_
-#define PDUMP_FLAGS_NEVER 0x08000000UL
-#define PDUMP_FLAGS_LASTFRAME 0x10000000UL
-#define PDUMP_FLAGS_RESETLFBUFFER 0x20000000UL
-#define PDUMP_FLAGS_CONTINUOUS 0x40000000UL
-#define PDUMP_FLAGS_PERSISTENT 0x80000000UL
+#define PDUMP_FLAGS_NEVER 0x08000000U
+#define PDUMP_FLAGS_LASTFRAME 0x10000000U
+#define PDUMP_FLAGS_RESETLFBUFFER 0x20000000U
+#define PDUMP_FLAGS_CONTINUOUS 0x40000000U
+#define PDUMP_FLAGS_PERSISTENT 0x80000000U
#endif
diff --git a/drivers/gpu/pvr/pdump_common.c b/drivers/gpu/pvr/pdump_common.c
index 430efe4eba0..c2c0dada01f 100644
--- a/drivers/gpu/pvr/pdump_common.c
+++ b/drivers/gpu/pvr/pdump_common.c
@@ -76,6 +76,20 @@ IMG_BOOL _PDumpIsPersistent(IMG_VOID)
return psPerProc->bPDumpPersistent;
}
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+static INLINE
+IMG_BOOL _PDumpIsProcessActive(IMG_VOID)
+{
+ PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
+ if(psPerProc == IMG_NULL)
+ {
+
+ return IMG_TRUE;
+ }
+ return psPerProc->bPDumpActive;
+}
+#endif
+
#if defined(PDUMP_DEBUG_OUTFILES)
static INLINE
IMG_UINT32 _PDumpGetPID(IMG_VOID)
@@ -152,6 +166,31 @@ IMG_BOOL PDumpIsSuspended(IMG_VOID)
return PDumpOSIsSuspended();
}
+IMG_BOOL PDumpIsCaptureFrameKM(IMG_VOID)
+{
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if( _PDumpIsProcessActive() )
+ {
+ return PDumpOSIsCaptureFrameKM();
+ }
+ return IMG_FALSE;
+#else
+ return PDumpOSIsCaptureFrameKM();
+#endif
+}
+
+PVRSRV_ERROR PDumpSetFrameKM(IMG_UINT32 ui32Frame)
+{
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if( _PDumpIsProcessActive() )
+ {
+ return PDumpOSSetFrameKM(ui32Frame);
+ }
+ return PVRSRV_OK;
+#else
+ return PDumpOSSetFrameKM(ui32Frame);
+#endif
+}
PVRSRV_ERROR PDumpRegWithFlagsKM(IMG_CHAR *pszPDumpRegName,
@@ -243,6 +282,7 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID,
IMG_HANDLE hOSMemHandle,
IMG_UINT32 ui32NumBytes,
IMG_UINT32 ui32PageSize,
+ IMG_BOOL bShared,
IMG_HANDLE hUniqueTag)
{
PVRSRV_ERROR eErr;
@@ -254,7 +294,13 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID,
IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
PDUMP_GET_SCRIPT_STRING();
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ ui32Flags |= ( _PDumpIsPersistent() || bShared ) ? PDUMP_FLAGS_PERSISTENT : 0;
+#else
+ PVR_UNREFERENCED_PARAMETER(bShared);
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
+#endif
#if !defined(LINUX)
@@ -323,17 +369,18 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID,
PVRSRV_ERROR PDumpMallocPageTable (PVRSRV_DEVICE_IDENTIFIER *psDevId,
IMG_HANDLE hOSMemHandle,
IMG_UINT32 ui32Offset,
- IMG_CPU_VIRTADDR pvLinAddr,
- IMG_UINT32 ui32PTSize,
- IMG_HANDLE hUniqueTag)
+ IMG_CPU_VIRTADDR pvLinAddr,
+ IMG_UINT32 ui32PTSize,
+ IMG_UINT32 ui32Flags,
+ IMG_HANDLE hUniqueTag)
{
PVRSRV_ERROR eErr;
IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
PDUMP_GET_SCRIPT_STRING();
PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize - 1)) == 0);
+ ui32Flags |= PDUMP_FLAGS_CONTINUOUS;
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
@@ -409,6 +456,18 @@ PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap,
{
return eErr;
}
+
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ {
+ PVRSRV_DEVICE_NODE *psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
+
+ if( psDeviceNode->pfnMMUIsHeapShared(psBMHeap->pMMUHeap) )
+ {
+ ui32Flags |= PDUMP_FLAGS_PERSISTENT;
+ }
+ }
+#endif
PDumpOSWriteString2(hScript, ui32Flags);
@@ -443,15 +502,16 @@ PVRSRV_ERROR PDumpFreePageTable (PVRSRV_DEVICE_IDENTIFIER *psDevID,
IMG_HANDLE hOSMemHandle,
IMG_CPU_VIRTADDR pvLinAddr,
IMG_UINT32 ui32PTSize,
+ IMG_UINT32 ui32Flags,
IMG_HANDLE hUniqueTag)
{
PVRSRV_ERROR eErr;
IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
PDUMP_GET_SCRIPT_STRING();
PVR_UNREFERENCED_PARAMETER(ui32PTSize);
+ ui32Flags |= PDUMP_FLAGS_CONTINUOUS;
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
@@ -707,6 +767,19 @@ PVRSRV_ERROR PDumpMemKM(IMG_PVOID pvAltLinAddr,
return PVRSRV_OK;
}
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ {
+ BM_HEAP *pHeap = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap;
+ PVRSRV_DEVICE_NODE *psDeviceNode = pHeap->pBMContext->psDeviceNode;
+
+ if( psDeviceNode->pfnMMUIsHeapShared(pHeap->pMMUHeap) )
+ {
+ ui32Flags |= PDUMP_FLAGS_PERSISTENT;
+ }
+ }
+#endif
+
if(pvAltLinAddr)
{
@@ -2155,6 +2228,7 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC
{
IMG_UINT32 ui32BytesWritten = 0;
IMG_UINT32 ui32Off = 0;
+ PDBG_STREAM_CONTROL psCtrl = psStream->psCtrl;
if ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)
@@ -2162,30 +2236,63 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC
return ui32BCount;
}
- while (((IMG_UINT32) ui32BCount > 0) && (ui32BytesWritten != 0xFFFFFFFFU))
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ if ( (_PDumpIsProcessActive() == IMG_FALSE ) &&
+ ((ui32Flags & PDUMP_FLAGS_PERSISTENT) == 0) )
+ {
+ return ui32BCount;
+ }
+#endif
+
+
+ if ( ((ui32Flags & PDUMP_FLAGS_PERSISTENT) != 0) && (psCtrl->bInitPhaseComplete) )
{
- if ((ui32Flags & PDUMP_FLAGS_PERSISTENT) != 0)
+ while (((IMG_UINT32) ui32BCount > 0) && (ui32BytesWritten != 0xFFFFFFFFU))
{
- if (psStream->bInitPhaseComplete)
+ ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
+ PDUMP_WRITE_MODE_PERSISTENT,
+ &pui8Data[ui32Off], ui32BCount, 1, 0);
+
+ if (ui32BytesWritten == 0)
{
-
- ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
- PDUMP_WRITE_MODE_PERSISTENT,
- &pui8Data[ui32Off], ui32BCount, 1, 0);
+ PDumpOSReleaseExecution();
+ }
+
+ if (ui32BytesWritten != 0xFFFFFFFFU)
+ {
+ ui32Off += ui32BytesWritten;
+ ui32BCount -= ui32BytesWritten;
+ }
+ else
+ {
+ PVR_DPF((PVR_DBG_ERROR, "DbgWrite: Failed to send persistent data"));
+ if( (psCtrl->ui32Flags & DEBUG_FLAGS_READONLY) != 0)
+ {
+
+ PDumpSuspendKM();
+ }
+ return 0xFFFFFFFFU;
}
}
+
+ ui32BCount = ui32Off; ui32Off = 0; ui32BytesWritten = 0;
+ }
+
+ while (((IMG_UINT32) ui32BCount > 0) && (ui32BytesWritten != 0xFFFFFFFFU))
+ {
if ((ui32Flags & PDUMP_FLAGS_CONTINUOUS) != 0)
{
- if (((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) != 0) &&
- (psStream->ui32Start == 0xFFFFFFFFU) &&
- (psStream->ui32End == 0xFFFFFFFFU) &&
- psStream->bInitPhaseComplete)
+ if (((psCtrl->ui32CapMode & DEBUG_CAPMODE_FRAMED) != 0) &&
+ (psCtrl->ui32Start == 0xFFFFFFFFU) &&
+ (psCtrl->ui32End == 0xFFFFFFFFU) &&
+ psCtrl->bInitPhaseComplete)
{
ui32BytesWritten = ui32BCount;
}
@@ -2228,7 +2335,7 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC
PDumpOSReleaseExecution();
}
- if (ui32BytesWritten != 0xFFFFFFFF)
+ if (ui32BytesWritten != 0xFFFFFFFFU)
{
ui32Off += ui32BytesWritten;
ui32BCount -= ui32BytesWritten;
diff --git a/drivers/gpu/pvr/pdump_km.h b/drivers/gpu/pvr/pdump_km.h
index 782f883608e..1be14d64de7 100644
--- a/drivers/gpu/pvr/pdump_km.h
+++ b/drivers/gpu/pvr/pdump_km.h
@@ -240,12 +240,14 @@ extern IMG_UINT32 g_ui32EveryLineCounter;
IMG_HANDLE hOSMemHandle,
IMG_UINT32 ui32NumBytes,
IMG_UINT32 ui32PageSize,
+ IMG_BOOL bShared,
IMG_HANDLE hUniqueTag);
PVRSRV_ERROR PDumpMallocPageTable(PVRSRV_DEVICE_IDENTIFIER *psDevId,
IMG_HANDLE hOSMemHandle,
IMG_UINT32 ui32Offset,
IMG_CPU_VIRTADDR pvLinAddr,
IMG_UINT32 ui32NumBytes,
+ IMG_UINT32 ui32Flags,
IMG_HANDLE hUniqueTag);
PVRSRV_ERROR PDumpFreePages(struct _BM_HEAP_ *psBMHeap,
IMG_DEV_VIRTADDR sDevVAddr,
@@ -257,6 +259,7 @@ extern IMG_UINT32 g_ui32EveryLineCounter;
IMG_HANDLE hOSMemHandle,
IMG_CPU_VIRTADDR pvLinAddr,
IMG_UINT32 ui32NumBytes,
+ IMG_UINT32 ui32Flags,
IMG_HANDLE hUniqueTag);
IMG_IMPORT PVRSRV_ERROR PDumpHWPerfCBKM(PVRSRV_DEVICE_IDENTIFIER *psDevId,
diff --git a/drivers/gpu/pvr/pdump_osfunc.h b/drivers/gpu/pvr/pdump_osfunc.h
index 334c98da3ad..fe054043f8b 100644
--- a/drivers/gpu/pvr/pdump_osfunc.h
+++ b/drivers/gpu/pvr/pdump_osfunc.h
@@ -34,6 +34,7 @@ extern "C" {
#define MAX_PDUMP_STRING_LENGTH (256)
+
#define PDUMP_GET_SCRIPT_STRING() \
IMG_HANDLE hScript; \
IMG_UINT32 ui32MaxLen; \
@@ -130,6 +131,10 @@ IMG_VOID PDumpOSCPUVAddrToPhysPages(IMG_HANDLE hOSMemHandle,
IMG_VOID PDumpOSReleaseExecution(IMG_VOID);
+IMG_BOOL PDumpOSIsCaptureFrameKM(IMG_VOID);
+
+PVRSRV_ERROR PDumpOSSetFrameKM(IMG_UINT32 ui32Frame);
+
#if defined (__cplusplus)
}
#endif
diff --git a/drivers/gpu/pvr/perproc.c b/drivers/gpu/pvr/perproc.c
index 62f4a3f1144..52d9980b489 100644
--- a/drivers/gpu/pvr/perproc.c
+++ b/drivers/gpu/pvr/perproc.c
@@ -118,7 +118,7 @@ PVRSRV_PER_PROCESS_DATA *PVRSRVPerProcessData(IMG_UINT32 ui32PID)
}
-PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32 ui32PID)
+PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32 ui32PID, IMG_UINT32 ui32Flags)
{
PVRSRV_PER_PROCESS_DATA *psPerProc;
IMG_HANDLE hBlockAlloc;
@@ -155,6 +155,15 @@ PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32 ui32PID)
psPerProc->ui32PID = ui32PID;
psPerProc->ui32RefCount = 0;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if (ui32Flags == SRV_FLAGS_PDUMP_ACTIVE)
+ {
+ psPerProc->bPDumpActive = IMG_TRUE;
+ }
+#else
+ PVR_UNREFERENCED_PARAMETER(ui32Flags);
+#endif
+
eError = OSPerProcessPrivateDataInit(&psPerProc->hOsPrivateData);
if (eError != PVRSRV_OK)
diff --git a/drivers/gpu/pvr/perproc.h b/drivers/gpu/pvr/perproc.h
index 0b7542b930f..37359d50e05 100644
--- a/drivers/gpu/pvr/perproc.h
+++ b/drivers/gpu/pvr/perproc.h
@@ -54,6 +54,10 @@ typedef struct _PVRSRV_PER_PROCESS_DATA_
#if defined(PDUMP)
IMG_BOOL bPDumpPersistent;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ IMG_BOOL bPDumpActive;
+#endif
#endif
IMG_HANDLE hOsPrivateData;
@@ -61,7 +65,7 @@ typedef struct _PVRSRV_PER_PROCESS_DATA_
PVRSRV_PER_PROCESS_DATA *PVRSRVPerProcessData(IMG_UINT32 ui32PID);
-PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32 ui32PID);
+PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32 ui32PID, IMG_UINT32 ui32Flags);
IMG_VOID PVRSRVPerProcessDataDisconnect(IMG_UINT32 ui32PID);
PVRSRV_ERROR PVRSRVPerProcessDataInit(IMG_VOID);
diff --git a/drivers/gpu/pvr/private_data.h b/drivers/gpu/pvr/private_data.h
index 0751765f61f..df9f6ade53a 100644
--- a/drivers/gpu/pvr/private_data.h
+++ b/drivers/gpu/pvr/private_data.h
@@ -32,6 +32,10 @@
#include <drm/drmP.h>
#endif
+#if defined(SUPPORT_DRI_DRM) && defined(PVR_LINUX_USING_WORKQUEUES)
+#include <linux/workqueue.h>
+#endif
+
typedef struct
{
@@ -42,11 +46,21 @@ typedef struct
IMG_HANDLE hKernelMemInfo;
#endif
-#if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT)
+#if defined(SUPPORT_DRI_DRM)
+#if defined(PVR_SECURE_DRM_AUTH_EXPORT)
+ struct drm_file *psDRMFile;
+
struct list_head sDRMAuthListItem;
+#endif
- struct drm_file *psDRMFile;
+#if defined(PVR_LINUX_USING_WORKQUEUES)
+ struct work_struct sReleaseWork;
+#endif
+
+#if defined(SUPPORT_DRI_DRM_EXT)
+ IMG_PVOID pPriv;
+#endif
#endif
#if defined(SUPPORT_MEMINFO_IDS)
@@ -56,10 +70,6 @@ typedef struct
IMG_HANDLE hBlockAlloc;
-
-#if defined(SUPPORT_DRI_DRM_EXT)
- IMG_PVOID pPriv;
-#endif
}
PVRSRV_FILE_PRIVATE_DATA;
diff --git a/drivers/gpu/pvr/proc.c b/drivers/gpu/pvr/proc.c
index 74f313262b8..b47acff0ad5 100644
--- a/drivers/gpu/pvr/proc.c
+++ b/drivers/gpu/pvr/proc.c
@@ -686,8 +686,8 @@ IMG_VOID RemoveProcEntries(IMG_VOID)
#endif
#endif
- RemoveProcEntrySeq(g_pProcQueue);
- RemoveProcEntrySeq(g_pProcVersion);
+ RemoveProcEntrySeq(g_pProcQueue);
+ RemoveProcEntrySeq(g_pProcVersion);
RemoveProcEntrySeq(g_pProcSysNodes);
while (dir->subdir)
@@ -702,24 +702,23 @@ IMG_VOID RemoveProcEntries(IMG_VOID)
static void ProcSeqShowVersion(struct seq_file *sfile,void* el)
{
- SYS_DATA * psSysData;
+ SYS_DATA *psSysData;
IMG_CHAR *pszSystemVersionString = "None";
if(el == PVR_PROC_SEQ_START_TOKEN)
{
- seq_printf( sfile,
- "Version %s (%s) %s\n",
- PVRVERSION_STRING,
- PVR_BUILD_TYPE, PVR_BUILD_DIR);
+ seq_printf(sfile,
+ "Version %s (%s) %s\n",
+ PVRVERSION_STRING,
+ PVR_BUILD_TYPE, PVR_BUILD_DIR);
return;
}
- SysAcquireData(&psSysData);
-
- if(psSysData->pszVersionString)
+ psSysData = SysAcquireDataNoCheck();
+ if(psSysData != IMG_NULL && psSysData->pszVersionString != IMG_NULL)
{
- pszSystemVersionString = psSysData->pszVersionString;
- }
+ pszSystemVersionString = psSysData->pszVersionString;
+ }
seq_printf( sfile, "System Version String: %s\n", pszSystemVersionString);
}
@@ -781,8 +780,7 @@ static IMG_VOID* DecOffPsDev_AnyVaCb(PVRSRV_DEVICE_NODE *psNode, va_list va)
static void ProcSeqShowSysNodes(struct seq_file *sfile,void* el)
{
- SYS_DATA * psSysData;
- PVRSRV_DEVICE_NODE *psDevNode = (PVRSRV_DEVICE_NODE*)el;
+ PVRSRV_DEVICE_NODE *psDevNode;
if(el == PVR_PROC_SEQ_START_TOKEN)
{
@@ -792,42 +790,43 @@ static void ProcSeqShowSysNodes(struct seq_file *sfile,void* el)
return;
}
- SysAcquireData(&psSysData);
+ psDevNode = (PVRSRV_DEVICE_NODE*)el;
seq_printf( sfile,
- "%p %-8s %-8s %4d %2u %p %3u %p\n",
- psDevNode,
- deviceTypeToString(psDevNode->sDevId.eDeviceType),
- deviceClassToString(psDevNode->sDevId.eDeviceClass),
- psDevNode->sDevId.eDeviceClass,
- psDevNode->ui32RefCount,
- psDevNode->pvDevice,
- psDevNode->ui32pvDeviceSize,
- psDevNode->hResManContext);
-
+ "%p %-8s %-8s %4d %2u %p %3u %p\n",
+ psDevNode,
+ deviceTypeToString(psDevNode->sDevId.eDeviceType),
+ deviceClassToString(psDevNode->sDevId.eDeviceClass),
+ psDevNode->sDevId.eDeviceClass,
+ psDevNode->ui32RefCount,
+ psDevNode->pvDevice,
+ psDevNode->ui32pvDeviceSize,
+ psDevNode->hResManContext);
}
static void* ProcSeqOff2ElementSysNodes(struct seq_file * sfile, loff_t off)
{
SYS_DATA *psSysData;
- PVRSRV_DEVICE_NODE *psDevNode;
+ PVRSRV_DEVICE_NODE*psDevNode = IMG_NULL;
PVR_UNREFERENCED_PARAMETER(sfile);
- if(!off)
- {
- return PVR_PROC_SEQ_START_TOKEN;
- }
+ if(!off)
+ {
+ return PVR_PROC_SEQ_START_TOKEN;
+ }
- SysAcquireData(&psSysData);
+ psSysData = SysAcquireDataNoCheck();
+ if (psSysData != IMG_NULL)
+ {
-
psDevNode = (PVRSRV_DEVICE_NODE*)
- List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
+ List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
DecOffPsDev_AnyVaCb,
&off);
+ }
-
- return (void*)psDevNode;
+
+ return (void*)psDevNode;
}
diff --git a/drivers/gpu/pvr/pvr_bridge.h b/drivers/gpu/pvr/pvr_bridge.h
index 469ceb223cd..82c3aa66ef2 100644
--- a/drivers/gpu/pvr/pvr_bridge.h
+++ b/drivers/gpu/pvr/pvr_bridge.h
@@ -246,6 +246,7 @@ typedef struct PVRSRV_BRIDGE_PACKAGE_TAG
typedef struct PVRSRV_BRIDGE_IN_CONNECT_SERVICES_TAG
{
+ IMG_UINT32 ui32BridgeFlags;
IMG_UINT32 ui32Flags;
} PVRSRV_BRIDGE_IN_CONNECT_SERVICES;
diff --git a/drivers/gpu/pvr/pvr_bridge_k.c b/drivers/gpu/pvr/pvr_bridge_k.c
index 81a0201113b..3abf6048fde 100644
--- a/drivers/gpu/pvr/pvr_bridge_k.c
+++ b/drivers/gpu/pvr/pvr_bridge_k.c
@@ -187,11 +187,11 @@ static void ProcSeqShowBridgeStats(struct seq_file *sfile,void* el)
#if defined(SUPPORT_DRI_DRM)
-IMG_INT
-PVRSRV_BridgeDispatchKM(struct drm_device *dev, IMG_VOID *arg, struct drm_file *pFile)
+int
+PVRSRV_BridgeDispatchKM(struct drm_device unref__ *dev, void *arg, struct drm_file *pFile)
#else
-IMG_INT32
-PVRSRV_BridgeDispatchKM(struct file *pFile, IMG_UINT unref__ ioctlCmd, IMG_UINT32 arg)
+long
+PVRSRV_BridgeDispatchKM(struct file *pFile, unsigned int unref__ ioctlCmd, unsigned long arg)
#endif
{
IMG_UINT32 cmd;
@@ -207,13 +207,9 @@ PVRSRV_BridgeDispatchKM(struct file *pFile, IMG_UINT unref__ ioctlCmd, IMG_UINT3
LinuxLockMutex(&gPVRSRVLock);
#if defined(SUPPORT_DRI_DRM)
- PVR_UNREFERENCED_PARAMETER(dev);
-
psBridgePackageKM = (PVRSRV_BRIDGE_PACKAGE *)arg;
PVR_ASSERT(psBridgePackageKM != IMG_NULL);
#else
- PVR_UNREFERENCED_PARAMETER(ioctlCmd);
-
psBridgePackageKM = &sBridgePackageKM;
if(!OSAccessOK(PVR_VERIFY_WRITE,
diff --git a/drivers/gpu/pvr/pvrsrv.c b/drivers/gpu/pvr/pvrsrv.c
index 98aeb23d745..6e19974aca1 100644
--- a/drivers/gpu/pvr/pvrsrv.c
+++ b/drivers/gpu/pvr/pvrsrv.c
@@ -1115,9 +1115,9 @@ IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData)
IMG_EXPORT
-PVRSRV_ERROR IMG_CALLCONV PVRSRVProcessConnect(IMG_UINT32 ui32PID)
+PVRSRV_ERROR IMG_CALLCONV PVRSRVProcessConnect(IMG_UINT32 ui32PID, IMG_UINT32 ui32Flags)
{
- return PVRSRVPerProcessDataConnect(ui32PID);
+ return PVRSRVPerProcessDataConnect(ui32PID, ui32Flags);
}
diff --git a/drivers/gpu/pvr/pvrversion.h b/drivers/gpu/pvr/pvrversion.h
index d7c06c21402..4a47ca2d9cb 100644
--- a/drivers/gpu/pvr/pvrversion.h
+++ b/drivers/gpu/pvr/pvrversion.h
@@ -30,8 +30,8 @@
#define PVRVERSION_MAJ 1
#define PVRVERSION_MIN 6
#define PVRVERSION_BRANCH 16
-#define PVRVERSION_BUILD 3421
-#define PVRVERSION_STRING "1.6.16.3421"
+#define PVRVERSION_BUILD 3924
+#define PVRVERSION_STRING "1.6.16.3924"
#define PVRVERSION_FILE "eurasiacon.pj"
#endif
diff --git a/drivers/gpu/pvr/queue.c b/drivers/gpu/pvr/queue.c
index 5340571d64c..5a3a1449a8e 100644
--- a/drivers/gpu/pvr/queue.c
+++ b/drivers/gpu/pvr/queue.c
@@ -28,54 +28,28 @@
#include "lists.h"
-#if defined(__linux__) && defined(__KERNEL__)
-#include "proc.h"
+#define DC_NUM_COMMANDS_PER_TYPE 1
-static IMG_INT
-QueuePrintCommands (PVRSRV_QUEUE_INFO * psQueue, IMG_CHAR * buffer, size_t size)
+typedef struct _DEVICE_COMMAND_DATA_
{
- off_t off = 0;
- IMG_INT cmds = 0;
- IMG_SIZE_T ui32ReadOffset = psQueue->ui32ReadOffset;
- IMG_SIZE_T ui32WriteOffset = psQueue->ui32WriteOffset;
- PVRSRV_COMMAND * psCmd;
-
- while (ui32ReadOffset != ui32WriteOffset)
- {
- psCmd= (PVRSRV_COMMAND *)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + ui32ReadOffset);
+ PFN_CMD_PROC pfnCmdProc;
+ PCOMMAND_COMPLETE_DATA apsCmdCompleteData[DC_NUM_COMMANDS_PER_TYPE];
+ IMG_UINT32 ui32CCBOffset;
+} DEVICE_COMMAND_DATA;
- off = printAppend(buffer, size, off, "%x %x %5u %6u %3u %5u %2u %2u %3u \n",
- (IMG_UINTPTR_T)psQueue,
- (IMG_UINTPTR_T)psCmd,
- psCmd->ui32ProcessID,
- psCmd->CommandType,
- psCmd->ui32CmdSize,
- psCmd->ui32DevIndex,
- psCmd->ui32DstSyncCount,
- psCmd->ui32SrcSyncCount,
- psCmd->ui32DataSize);
-
- ui32ReadOffset += psCmd->ui32CmdSize;
- ui32ReadOffset &= psQueue->ui32QueueSize - 1;
- cmds++;
- }
- if (cmds == 0)
- {
- off = printAppend(buffer, size, off, "%x <empty>\n", (IMG_UINTPTR_T)psQueue);
- }
- return off;
-}
+#if defined(__linux__) && defined(__KERNEL__)
+#include "proc.h"
void ProcSeqShowQueue(struct seq_file *sfile,void* el)
{
- PVRSRV_QUEUE_INFO * psQueue = (PVRSRV_QUEUE_INFO*)el;
+ PVRSRV_QUEUE_INFO *psQueue = (PVRSRV_QUEUE_INFO*)el;
IMG_INT cmds = 0;
IMG_SIZE_T ui32ReadOffset;
IMG_SIZE_T ui32WriteOffset;
- PVRSRV_COMMAND * psCmd;
+ PVRSRV_COMMAND *psCmd;
if(el == PVR_PROC_SEQ_START_TOKEN)
{
@@ -116,8 +90,8 @@ void ProcSeqShowQueue(struct seq_file *sfile,void* el)
void* ProcSeqOff2ElementQueue(struct seq_file * sfile, loff_t off)
{
- PVRSRV_QUEUE_INFO * psQueue;
- SYS_DATA * psSysData;
+ PVRSRV_QUEUE_INFO *psQueue = IMG_NULL;
+ SYS_DATA *psSysData;
PVR_UNREFERENCED_PARAMETER(sfile);
@@ -127,31 +101,14 @@ void* ProcSeqOff2ElementQueue(struct seq_file * sfile, loff_t off)
}
- SysAcquireData(&psSysData);
+ psSysData = SysAcquireDataNoCheck();
+ if (psSysData != IMG_NULL)
+ {
+ for (psQueue = psSysData->psQueueList; (((--off) > 0) && (psQueue != IMG_NULL)); psQueue = psQueue->psNextKM);
+ }
- for (psQueue = psSysData->psQueueList; (((--off) > 0) && (psQueue != IMG_NULL)); psQueue = psQueue->psNextKM);
return psQueue;
}
-
-off_t
-QueuePrintQueues (IMG_CHAR * buffer, size_t size, off_t off)
-{
- SYS_DATA * psSysData;
- PVRSRV_QUEUE_INFO * psQueue;
-
- SysAcquireData(&psSysData);
-
- if (!off)
- return printAppend (buffer, size, 0,
- "Command Queues\n"
- "Queue CmdPtr Pid Command Size DevInd DSC SSC #Data ...\n");
-
-
- for (psQueue = psSysData->psQueueList; (((--off) > 0) && (psQueue != IMG_NULL)); psQueue = psQueue->psNextKM)
- ;
-
- return psQueue ? QueuePrintCommands (psQueue, buffer, size) : END_OF_FILE;
-}
#endif
#define GET_SPACE_IN_CMDQ(psQueue) \
@@ -196,29 +153,37 @@ static IMG_VOID QueueDumpDebugInfo_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode)
{
if (psDeviceNode->sDevId.eDeviceClass == PVRSRV_DEVICE_CLASS_DISPLAY)
{
- IMG_UINT32 i;
- SYS_DATA *psSysData;
- COMMAND_COMPLETE_DATA **ppsCmdCompleteData;
- COMMAND_COMPLETE_DATA *psCmdCompleteData;
+ IMG_UINT32 ui32CmdCounter, ui32SyncCounter;
+ SYS_DATA *psSysData;
+ DEVICE_COMMAND_DATA *psDeviceCommandData;
+ PCOMMAND_COMPLETE_DATA psCmdCompleteData;
SysAcquireData(&psSysData);
- ppsCmdCompleteData = psSysData->ppsCmdCompleteData[psDeviceNode->sDevId.ui32DeviceIndex];
+ psDeviceCommandData = psSysData->apsDeviceCommandData[psDeviceNode->sDevId.ui32DeviceIndex];
- if (ppsCmdCompleteData != IMG_NULL)
+ if (psDeviceCommandData != IMG_NULL)
{
- psCmdCompleteData = ppsCmdCompleteData[DC_FLIP_COMMAND];
+ for (ui32CmdCounter = 0; ui32CmdCounter < DC_NUM_COMMANDS_PER_TYPE; ui32CmdCounter++)
+ {
+ psCmdCompleteData = psDeviceCommandData[DC_FLIP_COMMAND].apsCmdCompleteData[ui32CmdCounter];
- PVR_LOG(("Command Complete Data for display device %u:", psDeviceNode->sDevId.ui32DeviceIndex))
+ PVR_LOG(("Flip Command Complete Data %u for display device %u:",
+ ui32CmdCounter, psDeviceNode->sDevId.ui32DeviceIndex))
- for (i = 0; i < psCmdCompleteData->ui32SrcSyncCount; i++)
- {
- QueueDumpCmdComplete(psCmdCompleteData, i, IMG_TRUE);
- }
+ for (ui32SyncCounter = 0;
+ ui32SyncCounter < psCmdCompleteData->ui32SrcSyncCount;
+ ui32SyncCounter++)
+ {
+ QueueDumpCmdComplete(psCmdCompleteData, ui32SyncCounter, IMG_TRUE);
+ }
- for (i = 0; i < psCmdCompleteData->ui32DstSyncCount; i++)
- {
- QueueDumpCmdComplete(psCmdCompleteData, i, IMG_FALSE);
+ for (ui32SyncCounter = 0;
+ ui32SyncCounter < psCmdCompleteData->ui32DstSyncCount;
+ ui32SyncCounter++)
+ {
+ QueueDumpCmdComplete(psCmdCompleteData, ui32SyncCounter, IMG_FALSE);
+ }
}
}
else
@@ -644,6 +609,8 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData,
PVRSRV_ERROR eError = PVRSRV_OK;
IMG_UINT32 ui32WriteOpsComplete;
IMG_UINT32 ui32ReadOpsComplete;
+ DEVICE_COMMAND_DATA *psDeviceCommandData;
+ IMG_UINT32 ui32CCBOffset;
psWalkerObj = psCommand->psDstSync;
@@ -711,7 +678,9 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData,
}
- psCmdCompleteData = psSysData->ppsCmdCompleteData[psCommand->ui32DevIndex][psCommand->CommandType];
+ psDeviceCommandData = psSysData->apsDeviceCommandData[psCommand->ui32DevIndex];
+ ui32CCBOffset = psDeviceCommandData[psCommand->CommandType].ui32CCBOffset;
+ psCmdCompleteData = psDeviceCommandData[psCommand->CommandType].apsCmdCompleteData[ui32CCBOffset];
if (psCmdCompleteData->bInUse)
{
@@ -727,11 +696,12 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData,
{
psCmdCompleteData->psDstSync[i] = psCommand->psDstSync[i];
- PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVProcessCommand: Dst %u RO-VA:0x%x WO-VA:0x%x ROP:0x%x WOP:0x%x",
+ PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVProcessCommand: Dst %u RO-VA:0x%x WO-VA:0x%x ROP:0x%x WOP:0x%x (CCB:%u)",
i, psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr,
psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr,
psCmdCompleteData->psDstSync[i].ui32ReadOpsPending,
- psCmdCompleteData->psDstSync[i].ui32WriteOpsPending));
+ psCmdCompleteData->psDstSync[i].ui32WriteOpsPending,
+ ui32CCBOffset));
}
@@ -741,11 +711,12 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData,
{
psCmdCompleteData->psSrcSync[i] = psCommand->psSrcSync[i];
- PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVProcessCommand: Src %u RO-VA:0x%x WO-VA:0x%x ROP:0x%x WOP:0x%x",
+ PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVProcessCommand: Src %u RO-VA:0x%x WO-VA:0x%x ROP:0x%x WOP:0x%x (CCB:%u)",
i, psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr,
psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr,
psCmdCompleteData->psSrcSync[i].ui32ReadOpsPending,
- psCmdCompleteData->psSrcSync[i].ui32WriteOpsPending));
+ psCmdCompleteData->psSrcSync[i].ui32WriteOpsPending,
+ ui32CCBOffset));
}
@@ -758,9 +729,9 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData,
- if (psSysData->ppfnCmdProcList[psCommand->ui32DevIndex][psCommand->CommandType]((IMG_HANDLE)psCmdCompleteData,
- psCommand->ui32DataSize,
- psCommand->pvData) == IMG_FALSE)
+ if (psDeviceCommandData[psCommand->CommandType].pfnCmdProc((IMG_HANDLE)psCmdCompleteData,
+ psCommand->ui32DataSize,
+ psCommand->pvData) == IMG_FALSE)
{
@@ -769,6 +740,9 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData,
eError = PVRSRV_ERROR_CMD_NOT_PROCESSED;
}
+
+ psDeviceCommandData[psCommand->CommandType].ui32CCBOffset = (ui32CCBOffset + 1) % DC_NUM_COMMANDS_PER_TYPE;
+
return eError;
}
@@ -897,14 +871,10 @@ IMG_VOID PVRSRVFreeCommandCompletePacketKM(IMG_HANDLE hCmdCookie,
PVRSRVScheduleDeviceCallbacks();
-#if defined(SYS_USING_INTERRUPTS)
if(bScheduleMISR)
{
OSScheduleMISR(psSysData);
}
-#else
- PVR_UNREFERENCED_PARAMETER(bScheduleMISR);
-#endif
}
#endif
@@ -950,14 +920,10 @@ IMG_VOID PVRSRVCommandCompleteKM(IMG_HANDLE hCmdCookie,
PVRSRVScheduleDeviceCallbacks();
-#if defined(SYS_USING_INTERRUPTS)
if(bScheduleMISR)
{
OSScheduleMISR(psSysData);
}
-#else
- PVR_UNREFERENCED_PARAMETER(bScheduleMISR);
-#endif
}
@@ -971,9 +937,9 @@ PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(IMG_UINT32 ui32DevIndex,
{
SYS_DATA *psSysData;
PVRSRV_ERROR eError;
- IMG_UINT32 i;
+ IMG_UINT32 ui32CmdCounter, ui32CmdTypeCounter;
IMG_SIZE_T ui32AllocSize;
- PFN_CMD_PROC *ppfnCmdProc;
+ DEVICE_COMMAND_DATA *psDeviceCommandData;
COMMAND_COMPLETE_DATA *psCmdCompleteData;
@@ -989,71 +955,59 @@ PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(IMG_UINT32 ui32DevIndex,
SysAcquireData(&psSysData);
- eError = OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- ui32CmdCount * sizeof(PFN_CMD_PROC),
- (IMG_VOID **)&psSysData->ppfnCmdProcList[ui32DevIndex], IMG_NULL,
- "Internal Queue Info structure");
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc queue"));
- return eError;
- }
-
-
- ppfnCmdProc = psSysData->ppfnCmdProcList[ui32DevIndex];
-
-
- for (i=0; i<ui32CmdCount; i++)
- {
- ppfnCmdProc[i] = ppfnCmdProcList[i];
- }
-
-
- ui32AllocSize = ui32CmdCount * sizeof(COMMAND_COMPLETE_DATA*);
- eError = OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP,
- ui32AllocSize,
- (IMG_VOID **)&psSysData->ppsCmdCompleteData[ui32DevIndex], IMG_NULL,
- "Array of Pointers for Command Store");
+ ui32AllocSize = ui32CmdCount * sizeof(*psDeviceCommandData);
+ eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ ui32AllocSize,
+ (IMG_VOID **)&psDeviceCommandData, IMG_NULL,
+ "Array of Pointers for Command Store");
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc CC data"));
goto ErrorExit;
}
- for (i=0; i<ui32CmdCount; i++)
+ psSysData->apsDeviceCommandData[ui32DevIndex] = psDeviceCommandData;
+
+ for (ui32CmdTypeCounter = 0; ui32CmdTypeCounter < ui32CmdCount; ui32CmdTypeCounter++)
{
+ psDeviceCommandData[ui32CmdTypeCounter].pfnCmdProc = ppfnCmdProcList[ui32CmdTypeCounter];
+ psDeviceCommandData[ui32CmdTypeCounter].ui32CCBOffset = 0;
+ for (ui32CmdCounter = 0; ui32CmdCounter < DC_NUM_COMMANDS_PER_TYPE; ui32CmdCounter++)
+ {
- ui32AllocSize = sizeof(COMMAND_COMPLETE_DATA)
- + ((ui32MaxSyncsPerCmd[i][0]
- + ui32MaxSyncsPerCmd[i][1])
- * sizeof(PVRSRV_SYNC_OBJECT));
- eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- ui32AllocSize,
- (IMG_VOID **)&psSysData->ppsCmdCompleteData[ui32DevIndex][i],
- IMG_NULL,
- "Command Complete Data");
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc cmd %d",i));
- goto ErrorExit;
- }
+ ui32AllocSize = sizeof(COMMAND_COMPLETE_DATA)
+ + ((ui32MaxSyncsPerCmd[ui32CmdTypeCounter][0]
+ + ui32MaxSyncsPerCmd[ui32CmdTypeCounter][1])
+ * sizeof(PVRSRV_SYNC_OBJECT));
-
- OSMemSet(psSysData->ppsCmdCompleteData[ui32DevIndex][i], 0x00, ui32AllocSize);
+ eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ ui32AllocSize,
+ (IMG_VOID **)&psCmdCompleteData,
+ IMG_NULL,
+ "Command Complete Data");
+ if (eError != PVRSRV_OK)
+ {
+ PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc cmd %d", ui32CmdTypeCounter));
+ goto ErrorExit;
+ }
- psCmdCompleteData = psSysData->ppsCmdCompleteData[ui32DevIndex][i];
+ psDeviceCommandData[ui32CmdTypeCounter].apsCmdCompleteData[ui32CmdCounter] = psCmdCompleteData;
-
- psCmdCompleteData->psDstSync = (PVRSRV_SYNC_OBJECT*)
- (((IMG_UINTPTR_T)psCmdCompleteData)
- + sizeof(COMMAND_COMPLETE_DATA));
- psCmdCompleteData->psSrcSync = (PVRSRV_SYNC_OBJECT*)
- (((IMG_UINTPTR_T)psCmdCompleteData->psDstSync)
- + (sizeof(PVRSRV_SYNC_OBJECT) * ui32MaxSyncsPerCmd[i][0]));
-
- psCmdCompleteData->ui32AllocSize = ui32AllocSize;
+
+ OSMemSet(psCmdCompleteData, 0x00, ui32AllocSize);
+
+
+ psCmdCompleteData->psDstSync = (PVRSRV_SYNC_OBJECT*)
+ (((IMG_UINTPTR_T)psCmdCompleteData)
+ + sizeof(COMMAND_COMPLETE_DATA));
+ psCmdCompleteData->psSrcSync = (PVRSRV_SYNC_OBJECT*)
+ (((IMG_UINTPTR_T)psCmdCompleteData->psDstSync)
+ + (sizeof(PVRSRV_SYNC_OBJECT) * ui32MaxSyncsPerCmd[ui32CmdTypeCounter][0]));
+
+ psCmdCompleteData->ui32AllocSize = ui32AllocSize;
+ }
}
return PVRSRV_OK;
@@ -1062,31 +1016,12 @@ ErrorExit:
- if(psSysData->ppsCmdCompleteData[ui32DevIndex] != IMG_NULL)
- {
- for (i=0; i<ui32CmdCount; i++)
- {
- if (psSysData->ppsCmdCompleteData[ui32DevIndex][i] != IMG_NULL)
- {
- ui32AllocSize = sizeof(COMMAND_COMPLETE_DATA)
- + ((ui32MaxSyncsPerCmd[i][0]
- + ui32MaxSyncsPerCmd[i][1])
- * sizeof(PVRSRV_SYNC_OBJECT));
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psSysData->ppsCmdCompleteData[ui32DevIndex][i], IMG_NULL);
- psSysData->ppsCmdCompleteData[ui32DevIndex][i] = IMG_NULL;
- }
- }
- ui32AllocSize = ui32CmdCount * sizeof(COMMAND_COMPLETE_DATA*);
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psSysData->ppsCmdCompleteData[ui32DevIndex], IMG_NULL);
- psSysData->ppsCmdCompleteData[ui32DevIndex] = IMG_NULL;
- }
-
- if(psSysData->ppfnCmdProcList[ui32DevIndex] != IMG_NULL)
- {
- ui32AllocSize = ui32CmdCount * sizeof(PFN_CMD_PROC);
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psSysData->ppfnCmdProcList[ui32DevIndex], IMG_NULL);
- psSysData->ppfnCmdProcList[ui32DevIndex] = IMG_NULL;
- }
+ if (PVRSRVRemoveCmdProcListKM(ui32DevIndex, ui32CmdCount) != PVRSRV_OK)
+ {
+ PVR_DPF((PVR_DBG_ERROR,
+ "PVRSRVRegisterCmdProcListKM: Failed to clean up after error, device 0x%x",
+ ui32DevIndex));
+ }
return eError;
}
@@ -1096,57 +1031,47 @@ IMG_EXPORT
PVRSRV_ERROR PVRSRVRemoveCmdProcListKM(IMG_UINT32 ui32DevIndex,
IMG_UINT32 ui32CmdCount)
{
- SYS_DATA *psSysData;
- IMG_UINT32 i;
+ SYS_DATA *psSysData;
+ IMG_UINT32 ui32CmdTypeCounter, ui32CmdCounter;
+ DEVICE_COMMAND_DATA *psDeviceCommandData;
+ COMMAND_COMPLETE_DATA *psCmdCompleteData;
+ IMG_SIZE_T ui32AllocSize;
if(ui32DevIndex >= SYS_DEVICE_COUNT)
{
PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVRemoveCmdProcListKM: invalid DeviceType 0x%x",
- ui32DevIndex));
+ "PVRSRVRemoveCmdProcListKM: invalid DeviceType 0x%x",
+ ui32DevIndex));
return PVRSRV_ERROR_INVALID_PARAMS;
}
SysAcquireData(&psSysData);
- if(psSysData->ppsCmdCompleteData[ui32DevIndex] == IMG_NULL)
+ psDeviceCommandData = psSysData->apsDeviceCommandData[ui32DevIndex];
+ if(psDeviceCommandData != IMG_NULL)
{
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveCmdProcListKM: Invalid command array"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
- else
- {
- for(i=0; i<ui32CmdCount; i++)
+ for (ui32CmdTypeCounter = 0; ui32CmdTypeCounter < ui32CmdCount; ui32CmdTypeCounter++)
{
-
- if(psSysData->ppsCmdCompleteData[ui32DevIndex][i] != IMG_NULL)
+ for (ui32CmdCounter = 0; ui32CmdCounter < DC_NUM_COMMANDS_PER_TYPE; ui32CmdCounter++)
{
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- psSysData->ppsCmdCompleteData[ui32DevIndex][i]->ui32AllocSize,
- psSysData->ppsCmdCompleteData[ui32DevIndex][i],
- IMG_NULL);
- psSysData->ppsCmdCompleteData[ui32DevIndex][i] = IMG_NULL;
+ psCmdCompleteData = psDeviceCommandData[ui32CmdTypeCounter].apsCmdCompleteData[ui32CmdCounter];
+
+
+ if (psCmdCompleteData != IMG_NULL)
+ {
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, psCmdCompleteData->ui32AllocSize,
+ psCmdCompleteData, IMG_NULL);
+ psDeviceCommandData[ui32CmdTypeCounter].apsCmdCompleteData[ui32CmdCounter] = IMG_NULL;
+ }
}
}
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- ui32CmdCount * sizeof(COMMAND_COMPLETE_DATA*),
- psSysData->ppsCmdCompleteData[ui32DevIndex],
- IMG_NULL);
- psSysData->ppsCmdCompleteData[ui32DevIndex] = IMG_NULL;
- }
-
-
- if(psSysData->ppfnCmdProcList[ui32DevIndex] != IMG_NULL)
- {
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- ui32CmdCount * sizeof(PFN_CMD_PROC),
- psSysData->ppfnCmdProcList[ui32DevIndex],
- IMG_NULL);
- psSysData->ppfnCmdProcList[ui32DevIndex] = IMG_NULL;
+ ui32AllocSize = ui32CmdCount * sizeof(*psDeviceCommandData);
+ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psDeviceCommandData, IMG_NULL);
+ psSysData->apsDeviceCommandData[ui32DevIndex] = IMG_NULL;
}
return PVRSRV_OK;
diff --git a/drivers/gpu/pvr/queue.h b/drivers/gpu/pvr/queue.h
index 06aa200140f..9437f0987c8 100644
--- a/drivers/gpu/pvr/queue.h
+++ b/drivers/gpu/pvr/queue.h
@@ -57,9 +57,6 @@ PVRSRV_ERROR PVRSRVProcessQueues (IMG_UINT32 ui32CallerID,
#if defined(__linux__) && defined(__KERNEL__)
#include <linux/types.h>
#include <linux/seq_file.h>
-off_t
-QueuePrintQueues (IMG_CHAR * buffer, size_t size, off_t off);
-
void* ProcSeqOff2ElementQueue(struct seq_file * sfile, loff_t off);
void ProcSeqShowQueue(struct seq_file *sfile,void* el);
#endif
diff --git a/drivers/gpu/pvr/services.h b/drivers/gpu/pvr/services.h
index 71fb4efb7fc..d1afe284912 100644
--- a/drivers/gpu/pvr/services.h
+++ b/drivers/gpu/pvr/services.h
@@ -112,6 +112,10 @@ extern "C" {
#define PVRSRV_MODIFYSYNCOPS_FLAGS_RO_INC 0x00000002
#define SRV_FLAGS_PERSIST 0x1
+#define SRV_FLAGS_PDUMP_ACTIVE 0x2
+
+#define PVRSRV_PDUMP_FLAGS_CONTINUOUS 0x1
+
typedef enum _PVRSRV_DEVICE_TYPE_
{
diff --git a/drivers/gpu/pvr/servicesext.h b/drivers/gpu/pvr/servicesext.h
index 759cffe2e15..2f81b116f74 100644
--- a/drivers/gpu/pvr/servicesext.h
+++ b/drivers/gpu/pvr/servicesext.h
@@ -369,11 +369,11 @@ typedef enum _PVRSRV_PIXEL_FORMAT_ {
PVRSRV_PIXEL_FORMAT_E5BGR9 = 55,
- PVRSRV_PIXEL_FORMAT_DXT1 = 56,
- PVRSRV_PIXEL_FORMAT_DXT2 = 57,
- PVRSRV_PIXEL_FORMAT_DXT3 = 58,
- PVRSRV_PIXEL_FORMAT_DXT4 = 59,
- PVRSRV_PIXEL_FORMAT_DXT5 = 60,
+ PVRSRV_PIXEL_FORMAT_RESERVED1 = 56,
+ PVRSRV_PIXEL_FORMAT_RESERVED2 = 57,
+ PVRSRV_PIXEL_FORMAT_RESERVED3 = 58,
+ PVRSRV_PIXEL_FORMAT_RESERVED4 = 59,
+ PVRSRV_PIXEL_FORMAT_RESERVED5 = 60,
PVRSRV_PIXEL_FORMAT_R8G8_B8G8 = 61,
@@ -495,21 +495,21 @@ typedef enum _PVRSRV_PIXEL_FORMAT_ {
PVRSRV_PIXEL_FORMAT_E5B9G9R9 = 144,
PVRSRV_PIXEL_FORMAT_R1 = 145,
- PVRSRV_PIXEL_FORMAT_BC1 = 146,
- PVRSRV_PIXEL_FORMAT_BC1_UNORM = 147,
- PVRSRV_PIXEL_FORMAT_BC1_SRGB = 148,
- PVRSRV_PIXEL_FORMAT_BC2 = 149,
- PVRSRV_PIXEL_FORMAT_BC2_UNORM = 150,
- PVRSRV_PIXEL_FORMAT_BC2_SRGB = 151,
- PVRSRV_PIXEL_FORMAT_BC3 = 152,
- PVRSRV_PIXEL_FORMAT_BC3_UNORM = 153,
- PVRSRV_PIXEL_FORMAT_BC3_SRGB = 154,
- PVRSRV_PIXEL_FORMAT_BC4 = 155,
- PVRSRV_PIXEL_FORMAT_BC4_UNORM = 156,
- PVRSRV_PIXEL_FORMAT_BC4_SNORM = 157,
- PVRSRV_PIXEL_FORMAT_BC5 = 158,
- PVRSRV_PIXEL_FORMAT_BC5_UNORM = 159,
- PVRSRV_PIXEL_FORMAT_BC5_SNORM = 160,
+ PVRSRV_PIXEL_FORMAT_RESERVED6 = 146,
+ PVRSRV_PIXEL_FORMAT_RESERVED7 = 147,
+ PVRSRV_PIXEL_FORMAT_RESERVED8 = 148,
+ PVRSRV_PIXEL_FORMAT_RESERVED9 = 149,
+ PVRSRV_PIXEL_FORMAT_RESERVED10 = 150,
+ PVRSRV_PIXEL_FORMAT_RESERVED11 = 151,
+ PVRSRV_PIXEL_FORMAT_RESERVED12 = 152,
+ PVRSRV_PIXEL_FORMAT_RESERVED13 = 153,
+ PVRSRV_PIXEL_FORMAT_RESERVED14 = 154,
+ PVRSRV_PIXEL_FORMAT_RESERVED15 = 155,
+ PVRSRV_PIXEL_FORMAT_RESERVED16 = 156,
+ PVRSRV_PIXEL_FORMAT_RESERVED17 = 157,
+ PVRSRV_PIXEL_FORMAT_RESERVED18 = 158,
+ PVRSRV_PIXEL_FORMAT_RESERVED19 = 159,
+ PVRSRV_PIXEL_FORMAT_RESERVED20 = 160,
PVRSRV_PIXEL_FORMAT_UBYTE4 = 161,
diff --git a/drivers/gpu/pvr/sgx/mmu.c b/drivers/gpu/pvr/sgx/mmu.c
index 8cf6682c247..2685fbf169f 100644
--- a/drivers/gpu/pvr/sgx/mmu.c
+++ b/drivers/gpu/pvr/sgx/mmu.c
@@ -68,6 +68,9 @@ struct _MMU_CONTEXT_
#if defined(PDUMP)
IMG_UINT32 ui32PDumpMMUContextID;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ IMG_BOOL bPDumpActive;
+#endif
#endif
struct _MMU_CONTEXT_ *psNext;
@@ -196,6 +199,25 @@ static INLINE IMG_VOID CheckPT(MMU_PT_INFO *psPTInfoList)
}
#endif
+
+IMG_BOOL MMU_IsHeapShared(MMU_HEAP* pMMUHeap)
+{
+ switch(pMMUHeap->psDevArena->DevMemHeapType)
+ {
+ case DEVICE_MEMORY_HEAP_SHARED :
+ case DEVICE_MEMORY_HEAP_SHARED_EXPORTED :
+ return IMG_TRUE;
+ case DEVICE_MEMORY_HEAP_PERCONTEXT :
+ case DEVICE_MEMORY_HEAP_KERNEL :
+ return IMG_FALSE;
+ default:
+ {
+ PVR_DPF((PVR_DBG_ERROR, "MMU_IsHeapShared: ERROR invalid heap type"));
+ return IMG_FALSE;
+ }
+ }
+}
+
#ifdef SUPPORT_SGX_MMU_BYPASS
IMG_VOID
EnableHostAccess (MMU_CONTEXT *psMMUContext)
@@ -362,11 +384,20 @@ _AllocPageTableMemory (MMU_HEAP *pMMUHeap,
OSMemSet(psPTInfoList->PTPageCpuVAddr, 0, pMMUHeap->ui32PTSize);
#endif
-
- PDUMPMALLOCPAGETABLE(&pMMUHeap->psMMUContext->psDeviceNode->sDevId, psPTInfoList->hPTPageOSMemHandle, 0, psPTInfoList->PTPageCpuVAddr, pMMUHeap->ui32PTSize, PDUMP_PT_UNIQUETAG);
-
- PDUMPMEMPTENTRIES(&pMMUHeap->sMMUAttrib, psPTInfoList->hPTPageOSMemHandle, psPTInfoList->PTPageCpuVAddr, pMMUHeap->ui32PTSize, 0, IMG_TRUE, PDUMP_PT_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+#if defined(PDUMP)
+ {
+ IMG_UINT32 ui32Flags = 0;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ ui32Flags |= ( MMU_IsHeapShared(pMMUHeap) ) ? PDUMP_FLAGS_PERSISTENT : 0;
+#endif
+
+ PDUMPMALLOCPAGETABLE(&pMMUHeap->psMMUContext->psDeviceNode->sDevId, psPTInfoList->hPTPageOSMemHandle, 0, psPTInfoList->PTPageCpuVAddr, pMMUHeap->ui32PTSize, ui32Flags, PDUMP_PT_UNIQUETAG);
+
+ PDUMPMEMPTENTRIES(&pMMUHeap->sMMUAttrib, psPTInfoList->hPTPageOSMemHandle, psPTInfoList->PTPageCpuVAddr, pMMUHeap->ui32PTSize, ui32Flags, IMG_TRUE, PDUMP_PT_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ }
+#endif
+
*psDevPAddr = sDevPAddr;
@@ -445,12 +476,20 @@ _DeferredFreePageTable (MMU_HEAP *pMMUHeap, IMG_UINT32 ui32PTIndex, IMG_BOOL bOS
PVR_ASSERT(ppsPTInfoList[ui32PTIndex] == IMG_NULL || ppsPTInfoList[ui32PTIndex]->ui32ValidPTECount == 0);
}
-
- PDUMPCOMMENT("Free page table (page count == %08X)", pMMUHeap->ui32PageTableCount);
- if(ppsPTInfoList[ui32PTIndex] && ppsPTInfoList[ui32PTIndex]->PTPageCpuVAddr)
+#if defined(PDUMP)
{
- PDUMPFREEPAGETABLE(&pMMUHeap->psMMUContext->psDeviceNode->sDevId, ppsPTInfoList[ui32PTIndex]->hPTPageOSMemHandle, ppsPTInfoList[ui32PTIndex]->PTPageCpuVAddr, pMMUHeap->ui32PTSize, PDUMP_PT_UNIQUETAG);
+ IMG_UINT32 ui32Flags = 0;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ ui32Flags |= ( MMU_IsHeapShared(pMMUHeap) ) ? PDUMP_FLAGS_PERSISTENT : 0;
+#endif
+
+ PDUMPCOMMENT("Free page table (page count == %08X)", pMMUHeap->ui32PageTableCount);
+ if(ppsPTInfoList[ui32PTIndex] && ppsPTInfoList[ui32PTIndex]->PTPageCpuVAddr)
+ {
+ PDUMPFREEPAGETABLE(&pMMUHeap->psMMUContext->psDeviceNode->sDevId, ppsPTInfoList[ui32PTIndex]->hPTPageOSMemHandle, ppsPTInfoList[ui32PTIndex]->PTPageCpuVAddr, pMMUHeap->ui32PTSize, ui32Flags, PDUMP_PT_UNIQUETAG);
+ }
}
+#endif
switch(pMMUHeap->psDevArena->DevMemHeapType)
{
@@ -479,10 +518,15 @@ _DeferredFreePageTable (MMU_HEAP *pMMUHeap, IMG_UINT32 ui32PTIndex, IMG_BOOL bOS
pui32PDEntry[ui32PTIndex] = 0;
}
#endif
-
+ #if defined(PDUMP)
- PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[ui32PTIndex], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PT_UNIQUETAG, PDUMP_PT_UNIQUETAG);
-
+ #if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if(psMMUContext->bPDumpActive)
+ #endif
+ {
+ PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[ui32PTIndex], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PT_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ }
+ #endif
psMMUContext = psMMUContext->psNext;
}
@@ -703,8 +747,16 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT
| pMMUHeap->ui32PDEPageSizeCtrl
| SGX_MMU_PDE_VALID;
+ #if defined(PDUMP)
- PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[i], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ #if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if(psMMUContext->bPDumpActive)
+ #endif
+ {
+
+ PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[i], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ }
+ #endif
psMMUContext = psMMUContext->psNext;
@@ -1002,6 +1054,21 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I
}
#if defined(PDUMP)
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+
+ {
+ PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
+ if(psPerProc == IMG_NULL)
+ {
+
+ psMMUContext->bPDumpActive = IMG_TRUE;
+ }
+ else
+ {
+ psMMUContext->bPDumpActive = psPerProc->bPDumpActive;
+ }
+ }
+#endif
#if IMG_ADDRSPACE_PHYSADDR_BITS == 32
PDUMPCOMMENT("Alloc page directory for new MMU context (PDDevPAddr == 0x%08x)",
@@ -1010,6 +1077,7 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I
PDUMPCOMMENT("Alloc page directory for new MMU context, 64-bit arch detected (PDDevPAddr == 0x%08x%08x)",
sPDDevPAddr.uiHighAddr, sPDDevPAddr.uiAddr);
#endif
+ PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPDOSMemHandle, 0, pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, 0, PDUMP_PD_UNIQUETAG);
#endif
#ifdef SUPPORT_SGX_MMU_BYPASS
EnableHostAccess(psMMUContext);
@@ -1025,8 +1093,6 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I
return PVRSRV_ERROR_INVALID_CPU_ADDR;
}
- PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPDOSMemHandle, 0, pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, PDUMP_PD_UNIQUETAG);
-
#if defined(SUPPORT_SGX_MMU_DUMMY_PAGE)
for(i=0; i<SGX_MMU_PD_SIZE; i++)
@@ -1071,12 +1137,17 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I
}
#endif
-
- PDUMPCOMMENT("Page directory contents");
- PDUMPMEMPTENTRIES(&sMMUAttrib, hPDOSMemHandle, pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+#if defined(PDUMP)
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if(psMMUContext->bPDumpActive)
+#endif
+ {
+ PDUMPCOMMENT("Page directory contents");
+ PDUMPPDENTRIES(&sMMUAttrib, hPDOSMemHandle, pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ }
+
-#if defined(PDUMP)
{
PVRSRV_ERROR eError;
@@ -1158,10 +1229,10 @@ MMU_Finalise (MMU_CONTEXT *psMMUContext)
#endif
#endif
- PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psMMUContext->hPDOSMemHandle, psMMUContext->pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
+ PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psMMUContext->hPDOSMemHandle, psMMUContext->pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
#if defined(SUPPORT_SGX_MMU_DUMMY_PAGE)
- PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psDevInfo->hDummyPTPageOSMemHandle, psDevInfo->pvDummyPTPageCpuVAddr, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
- PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psDevInfo->hDummyDataPageOSMemHandle, psDevInfo->pvDummyDataPageCpuVAddr, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
+ PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psDevInfo->hDummyPTPageOSMemHandle, psDevInfo->pvDummyPTPageCpuVAddr, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
+ PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psDevInfo->hDummyDataPageOSMemHandle, psDevInfo->pvDummyDataPageCpuVAddr, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
#endif
pui32Tmp = (IMG_UINT32 *)psMMUContext->pvPDCpuVAddr;
@@ -1312,8 +1383,16 @@ MMU_InsertHeap(MMU_CONTEXT *psMMUContext, MMU_HEAP *psMMUHeap)
pui32PDCpuVAddr[ui32PDEntry] = pui32KernelPDCpuVAddr[ui32PDEntry];
if (pui32PDCpuVAddr[ui32PDEntry])
{
- PDUMPPDENTRIES(&psMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID *) &pui32PDCpuVAddr[ui32PDEntry], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ #if defined(PDUMP)
+
+ #if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ if(psMMUContext->bPDumpActive)
+ #endif
+ {
+ PDUMPPDENTRIES(&psMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID *) &pui32PDCpuVAddr[ui32PDEntry], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
+ }
+ #endif
#if !defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS)
bInvalidateDirectoryCache = IMG_TRUE;
#endif
@@ -1842,8 +1921,12 @@ MMU_PDumpPageTables (MMU_HEAP *pMMUHeap,
if (psPTInfo)
{
+ IMG_UINT32 ui32Flags = 0;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ ui32Flags |= ( MMU_IsHeapShared(pMMUHeap) ) ? PDUMP_FLAGS_PERSISTENT : 0;
+#endif
pui32PTEntry = (IMG_UINT32*)psPTInfo->PTPageCpuVAddr;
- PDUMPMEMPTENTRIES(&pMMUHeap->sMMUAttrib, psPTInfo->hPTPageOSMemHandle, (IMG_VOID *) &pui32PTEntry[ui32PTIndex], ui32PTDumpCount * sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PT_UNIQUETAG, hUniqueTag);
+ PDUMPMEMPTENTRIES(&pMMUHeap->sMMUAttrib, psPTInfo->hPTPageOSMemHandle, (IMG_VOID *) &pui32PTEntry[ui32PTIndex], ui32PTDumpCount * sizeof(IMG_UINT32), ui32Flags, IMG_FALSE, PDUMP_PT_UNIQUETAG, hUniqueTag);
}
@@ -2577,8 +2660,8 @@ PVRSRV_ERROR WorkaroundBRN22997Alloc(PVRSRV_DEVICE_NODE *psDeviceNode)
OSMemSet(pui32PT, 0, SGX_MMU_PAGE_SIZE);
- PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPDPageOSMemHandle, ui32PDOffset, pui32PD, SGX_MMU_PAGE_SIZE, PDUMP_PD_UNIQUETAG);
- PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPTPageOSMemHandle, ui32PTOffset, pui32PT, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
+ PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPDPageOSMemHandle, ui32PDOffset, pui32PD, SGX_MMU_PAGE_SIZE, 0, PDUMP_PD_UNIQUETAG);
+ PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPTPageOSMemHandle, ui32PTOffset, pui32PT, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
PDUMPMEMPTENTRIES(&psDevInfo->sMMUAttrib, hPDPageOSMemHandle, pui32PD, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
PDUMPMEMPTENTRIES(&psDevInfo->sMMUAttrib, hPTPageOSMemHandle, pui32PT, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PT_UNIQUETAG, PDUMP_PD_UNIQUETAG);
@@ -2684,8 +2767,8 @@ IMG_VOID WorkaroundBRN22997Free(PVRSRV_DEVICE_NODE *psDeviceNode)
psLocalDevMemArena = psSysData->apsLocalDevMemArena[0];
- PDUMPFREEPAGETABLE(&psDeviceNode->sDevId, psDevInfo->hBRN22997PDPageOSMemHandle, psDevInfo->pui32BRN22997PD, SGX_MMU_PAGE_SIZE, PDUMP_PD_UNIQUETAG);
- PDUMPFREEPAGETABLE(&psDeviceNode->sDevId, psDevInfo->hBRN22997PTPageOSMemHandle, psDevInfo->pui32BRN22997PT, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
+ PDUMPFREEPAGETABLE(&psDeviceNode->sDevId, psDevInfo->hBRN22997PDPageOSMemHandle, psDevInfo->pui32BRN22997PD, SGX_MMU_PAGE_SIZE, 0, PDUMP_PD_UNIQUETAG);
+ PDUMPFREEPAGETABLE(&psDeviceNode->sDevId, psDevInfo->hBRN22997PTPageOSMemHandle, psDevInfo->pui32BRN22997PT, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
if(psLocalDevMemArena == IMG_NULL)
@@ -2823,7 +2906,7 @@ PVRSRV_ERROR MMU_MapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode)
| SGX_MMU_PTE_VALID;
- PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevID, hPTPageOSMemHandle, 0, pui32PT, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
+ PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevID, hPTPageOSMemHandle, 0, pui32PT, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
PDUMPMEMPTENTRIES(PVRSRV_DEVICE_TYPE_SGX, hPDPageOSMemHandle, pui32PD, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
PDUMPMEMPTENTRIES(PVRSRV_DEVICE_TYPE_SGX, hPTPageOSMemHandle, pui32PT, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PT_UNIQUETAG, PDUMP_PD_UNIQUETAG);
@@ -2855,7 +2938,7 @@ PVRSRV_ERROR MMU_UnmapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode)
pui32PD[ui32PDIndex] = 0;
PDUMPMEMPTENTRIES(PVRSRV_DEVICE_TYPE_SGX, psDeviceNode->sDevMemoryInfo.pBMKernelContext->psMMUContext->hPDOSMemHandle, pui32PD, SGX_MMU_PAGE_SIZE, 0, IMG_TRUE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG);
- PDUMPFREEPAGETABLE(&psDeviceNode->sDevId, psDevInfo->hExtSystemCacheRegsPTPageOSMemHandle, psDevInfo->pui32ExtSystemCacheRegsPT, SGX_MMU_PAGE_SIZE, PDUMP_PT_UNIQUETAG);
+ PDUMPFREEPAGETABLE(&psDeviceNode->sDevId, psDevInfo->hExtSystemCacheRegsPTPageOSMemHandle, psDevInfo->pui32ExtSystemCacheRegsPT, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG);
if(psLocalDevMemArena == IMG_NULL)
diff --git a/drivers/gpu/pvr/sgx/mmu.h b/drivers/gpu/pvr/sgx/mmu.h
index f13fcc0d2d9..80e3122a438 100644
--- a/drivers/gpu/pvr/sgx/mmu.h
+++ b/drivers/gpu/pvr/sgx/mmu.h
@@ -46,10 +46,10 @@ MMU_Create (MMU_CONTEXT *psMMUContext,
PDUMP_MMU_ATTRIB **ppsMMUAttrib);
IMG_VOID
-MMU_Delete (MMU_HEAP *pMMU);
+MMU_Delete (MMU_HEAP *pMMUHeap);
IMG_BOOL
-MMU_Alloc (MMU_HEAP *pMMU,
+MMU_Alloc (MMU_HEAP *pMMUHeap,
IMG_SIZE_T uSize,
IMG_SIZE_T *pActualSize,
IMG_UINT32 uFlags,
@@ -57,28 +57,28 @@ MMU_Alloc (MMU_HEAP *pMMU,
IMG_DEV_VIRTADDR *pDevVAddr);
IMG_VOID
-MMU_Free (MMU_HEAP *pMMU,
+MMU_Free (MMU_HEAP *pMMUHeap,
IMG_DEV_VIRTADDR DevVAddr,
IMG_UINT32 ui32Size);
IMG_VOID
-MMU_Enable (MMU_HEAP *pMMU);
+MMU_Enable (MMU_HEAP *pMMUHeap);
IMG_VOID
-MMU_Disable (MMU_HEAP *pMMU);
+MMU_Disable (MMU_HEAP *pMMUHeap);
IMG_VOID
-MMU_MapPages (MMU_HEAP *pMMU,
- IMG_DEV_VIRTADDR devVAddr,
+MMU_MapPages (MMU_HEAP *pMMUHeap,
+ IMG_DEV_VIRTADDR DevVAddr,
IMG_SYS_PHYADDR SysPAddr,
IMG_SIZE_T uSize,
IMG_UINT32 ui32MemFlags,
IMG_HANDLE hUniqueTag);
IMG_VOID
-MMU_MapShadow (MMU_HEAP * pMMU,
+MMU_MapShadow (MMU_HEAP * pMMUHeap,
IMG_DEV_VIRTADDR MapBaseDevVAddr,
- IMG_SIZE_T uSize,
+ IMG_SIZE_T uByteSize,
IMG_CPU_VIRTADDR CpuVAddr,
IMG_HANDLE hOSMemHandle,
IMG_DEV_VIRTADDR * pDevVAddr,
@@ -86,13 +86,13 @@ MMU_MapShadow (MMU_HEAP * pMMU,
IMG_HANDLE hUniqueTag);
IMG_VOID
-MMU_UnmapPages (MMU_HEAP *pMMU,
- IMG_DEV_VIRTADDR dev_vaddr,
+MMU_UnmapPages (MMU_HEAP *psMMUHeap,
+ IMG_DEV_VIRTADDR sDevVAddr,
IMG_UINT32 ui32PageCount,
IMG_HANDLE hUniqueTag);
IMG_VOID
-MMU_MapScatter (MMU_HEAP *pMMU,
+MMU_MapScatter (MMU_HEAP *pMMUHeap,
IMG_DEV_VIRTADDR DevVAddr,
IMG_SYS_PHYADDR *psSysAddr,
IMG_SIZE_T uSize,
@@ -137,6 +137,8 @@ PVRSRV_ERROR MMU_MapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode);
PVRSRV_ERROR MMU_UnmapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode);
#endif
+IMG_BOOL MMU_IsHeapShared(MMU_HEAP* pMMU_Heap);
+
#if defined(PDUMP)
IMG_UINT32 MMU_GetPDumpContextID(IMG_HANDLE hDevMemContext);
#endif
diff --git a/drivers/gpu/pvr/sgx/sgxinit.c b/drivers/gpu/pvr/sgx/sgxinit.c
index 2471915d10f..f822eb86973 100644
--- a/drivers/gpu/pvr/sgx/sgxinit.c
+++ b/drivers/gpu/pvr/sgx/sgxinit.c
@@ -393,7 +393,9 @@ PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO *psDevInfo,
WAIT_TRY_COUNT) != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "SGXInitialise: Wait for uKernel initialisation failed"));
+ #if !defined(FIX_HW_BRN_23281)
PVR_DBG_BREAK;
+ #endif
return PVRSRV_ERROR_RETRY;
}
#endif
@@ -842,7 +844,7 @@ static PVRSRV_ERROR DevDeInitSGX (IMG_VOID *pvDeviceNode)
if (psDeviceMemoryHeap != IMG_NULL)
{
- OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(DEVICE_MEMORY_HEAP_INFO) * SGX_MAX_HEAP_ID,
psDeviceMemoryHeap,
0);
@@ -1029,7 +1031,14 @@ IMG_VOID HWRecoveryResetSGX (PVRSRV_DEVICE_NODE *psDeviceNode,
PDUMPSUSPEND();
+#if defined(FIX_HW_BRN_23281)
+
+ for (eError = PVRSRV_ERROR_RETRY; eError == PVRSRV_ERROR_RETRY;)
+#endif
+ {
eError = SGXInitialise(psDevInfo, IMG_TRUE);
+ }
+
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"HWRecoveryResetSGX: SGXInitialise failed (%d)", eError));
@@ -1058,6 +1067,9 @@ IMG_VOID SGXOSTimer(IMG_VOID *pvData)
static IMG_UINT32 ui32EDMTasks = 0;
static IMG_UINT32 ui32LockupCounter = 0;
static IMG_UINT32 ui32NumResets = 0;
+#if defined(FIX_HW_BRN_31093)
+ static IMG_BOOL bBRN31093Inval = IMG_FALSE;
+#endif
IMG_UINT32 ui32CurrentEDMTasks;
IMG_BOOL bLockup = IMG_FALSE;
IMG_BOOL bPoweredDown;
@@ -1076,6 +1088,9 @@ IMG_VOID SGXOSTimer(IMG_VOID *pvData)
if (bPoweredDown)
{
ui32LockupCounter = 0;
+ #if defined(FIX_HW_BRN_31093)
+ bBRN31093Inval = IMG_FALSE;
+ #endif
}
else
{
@@ -1092,13 +1107,45 @@ IMG_VOID SGXOSTimer(IMG_VOID *pvData)
if (ui32LockupCounter == 3)
{
ui32LockupCounter = 0;
- PVR_DPF((PVR_DBG_ERROR, "SGXOSTimer() detected SGX lockup (0x%x tasks)", ui32EDMTasks));
- bLockup = IMG_TRUE;
+ #if defined(FIX_HW_BRN_31093)
+ if (bBRN31093Inval == IMG_FALSE)
+ {
+
+ #if defined(FIX_HW_BRN_29997)
+ IMG_UINT32 ui32BIFCtrl;
+
+ ui32BIFCtrl = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL);
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32BIFCtrl | EUR_CR_BIF_CTRL_PAUSE_MASK);
+
+ OSWaitus(200 * 1000000 / psDevInfo->ui32CoreClockSpeed);
+ #endif
+
+ bBRN31093Inval = IMG_TRUE;
+
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL_INVAL, EUR_CR_BIF_CTRL_INVAL_PTE_MASK);
+
+ OSWaitus(200 * 1000000 / psDevInfo->ui32CoreClockSpeed);
+
+ #if defined(FIX_HW_BRN_29997)
+
+ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_CTRL, ui32BIFCtrl);
+ #endif
+ }
+ else
+ #endif
+ {
+ PVR_DPF((PVR_DBG_ERROR, "SGXOSTimer() detected SGX lockup (0x%x tasks)", ui32EDMTasks));
+
+ bLockup = IMG_TRUE;
+ }
}
}
else
{
+ #if defined(FIX_HW_BRN_31093)
+ bBRN31093Inval = IMG_FALSE;
+ #endif
ui32LockupCounter = 0;
ui32EDMTasks = ui32CurrentEDMTasks;
ui32NumResets = psDevInfo->ui32NumResets;
@@ -1370,6 +1417,9 @@ PVRSRV_ERROR SGXRegisterDevice (PVRSRV_DEVICE_NODE *psDeviceNode)
psDeviceNode->pfnMMUMapScatter = &MMU_MapScatter;
psDeviceNode->pfnMMUGetPhysPageAddr = &MMU_GetPhysPageAddr;
psDeviceNode->pfnMMUGetPDDevPAddr = &MMU_GetPDDevPAddr;
+#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
+ psDeviceNode->pfnMMUIsHeapShared = &MMU_IsHeapShared;
+#endif
#if defined (SYS_USING_INTERRUPTS)
diff --git a/drivers/gpu/pvr/sgx/sgxreset.c b/drivers/gpu/pvr/sgx/sgxreset.c
index ee9f572ea74..57f6693c1e7 100644
--- a/drivers/gpu/pvr/sgx/sgxreset.c
+++ b/drivers/gpu/pvr/sgx/sgxreset.c
@@ -321,6 +321,9 @@ IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO *psDevInfo,
#error SGX_BYPASS_SYSTEM_CACHE not supported
#else
ui32RegVal = EUR_CR_MASTER_SLC_CTRL_USSE_INVAL_REQ0_MASK |
+ #if defined(FIX_HW_BRN_30954)
+ EUR_CR_MASTER_SLC_CTRL_DISABLE_REORDERING_MASK |
+ #endif
(0xC << EUR_CR_MASTER_SLC_CTRL_ARB_PAGE_SIZE_SHIFT);
OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_SLC_CTRL, ui32RegVal);
PDUMPREG(SGX_PDUMPREG_NAME, EUR_CR_MASTER_SLC_CTRL, ui32RegVal);
diff --git a/drivers/gpu/pvr/sgx/sgxtransfer.c b/drivers/gpu/pvr/sgx/sgxtransfer.c
index abe5767e25d..317b73f6d8a 100644
--- a/drivers/gpu/pvr/sgx/sgxtransfer.c
+++ b/drivers/gpu/pvr/sgx/sgxtransfer.c
@@ -50,7 +50,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF
SGXMKIF_TRANSFERCMD_SHARED *psSharedTransferCmd;
PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
PVRSRV_ERROR eError;
-
+ IMG_UINT32 loop;
#if defined(PDUMP)
IMG_BOOL bPersistentProcess = IMG_FALSE;
@@ -104,53 +104,46 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF
psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
}
+ psSharedTransferCmd->ui32NumSrcSyncs = psKick->ui32NumSrcSync;
+ psSharedTransferCmd->ui32NumDstSyncs = psKick->ui32NumDstSync;
if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
{
- if (psKick->ui32NumSrcSync > 0)
+ for (loop=0; loop<psKick->ui32NumSrcSync; loop++)
{
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[0];
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
- psSharedTransferCmd->ui32SrcWriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
- psSharedTransferCmd->ui32SrcReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
+ psSharedTransferCmd->asSrcSyncs[loop].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
+ psSharedTransferCmd->asSrcSyncs[loop].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
- psSharedTransferCmd->sSrcWriteOpsCompleteDevAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
- psSharedTransferCmd->sSrcReadOpsCompleteDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
+ psSharedTransferCmd->asSrcSyncs[loop].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
+ psSharedTransferCmd->asSrcSyncs[loop].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
-
- if (psKick->ui32NumDstSync > 0)
+ for (loop=0; loop<psKick->ui32NumDstSync; loop++)
{
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0];
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
- psSharedTransferCmd->ui32DstWriteOpPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
- psSharedTransferCmd->ui32DstReadOpPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
+ psSharedTransferCmd->asDstSyncs[loop].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
+ psSharedTransferCmd->asDstSyncs[loop].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
- psSharedTransferCmd->sDstWriteOpsCompleteDevAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
- psSharedTransferCmd->sDstReadOpsCompleteDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
+ psSharedTransferCmd->asDstSyncs[loop].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
+ psSharedTransferCmd->asDstSyncs[loop].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
- if (psKick->ui32NumSrcSync > 0)
+ for (loop=0; loop<psKick->ui32NumSrcSync; loop++)
{
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[0];
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
psSyncInfo->psSyncData->ui32ReadOpsPending++;
}
- if (psKick->ui32NumDstSync > 0)
+ for (loop=0; loop<psKick->ui32NumDstSync; loop++)
{
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0];
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
psSyncInfo->psSyncData->ui32WriteOpsPending++;
}
}
-
- if (psKick->ui32NumDstSync > 1 || psKick->ui32NumSrcSync > 1)
- {
- PVR_DPF((PVR_DBG_ERROR,
- "Transfer command doesn't support more than 1 sync object per src/dst\ndst: %d, src: %d",
- psKick->ui32NumDstSync, psKick->ui32NumSrcSync));
- }
-
#if defined(PDUMP)
if ((PDumpIsCaptureFrameKM()
|| ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
@@ -164,60 +157,72 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF
psKick->ui32PDumpFlags,
MAKEUNIQUETAG(psCCBMemInfo));
- if((psKick->ui32NumSrcSync > 0) && ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL))
+ if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
{
- psSyncInfo = psKick->ahSrcSyncInfo[0];
-
- PDUMPCOMMENT("Hack src surface write op in transfer cmd\r\n");
- PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
- psCCBMemInfo,
- psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui32SrcWriteOpPendingVal),
+ for (loop=0; loop<psKick->ui32NumSrcSync ; loop++)
+ {
+ psSyncInfo = psKick->ahSrcSyncInfo[loop];
+
+ PDUMPCOMMENT("Hack src surface write op in transfer cmd\r\n");
+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, asSrcSyncs) + loop * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal),
sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
- psKick->ui32PDumpFlags,
- MAKEUNIQUETAG(psCCBMemInfo));
+ psKick->ui32PDumpFlags,
+ MAKEUNIQUETAG(psCCBMemInfo));
- PDUMPCOMMENT("Hack src surface read op in transfer cmd\r\n");
- PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
- psCCBMemInfo,
- psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui32SrcReadOpPendingVal),
- sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
- psKick->ui32PDumpFlags,
- MAKEUNIQUETAG(psCCBMemInfo));
+ PDUMPCOMMENT("Hack src surface read op in transfer cmd\r\n");
+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, asSrcSyncs) + loop * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal),
+ sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
+ psKick->ui32PDumpFlags,
+ MAKEUNIQUETAG(psCCBMemInfo));
+ }
}
- if((psKick->ui32NumDstSync > 0) && ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL))
+ if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
{
- psSyncInfo = psKick->ahDstSyncInfo[0];
+ for (loop=0; loop< psKick->ui32NumDstSync; loop++)
+ {
+ psSyncInfo = psKick->ahDstSyncInfo[loop];
+
+ PDUMPCOMMENT("Hack dest surface write op in transfer cmd\r\n");
+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, asDstSyncs) + loop * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal) ,
+ sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
+ psKick->ui32PDumpFlags,
+ MAKEUNIQUETAG(psCCBMemInfo));
- PDUMPCOMMENT("Hack dest surface write op in transfer cmd\r\n");
- PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
- psCCBMemInfo,
- psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui32DstWriteOpPendingVal),
- sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
- psKick->ui32PDumpFlags,
- MAKEUNIQUETAG(psCCBMemInfo));
-
- PDUMPCOMMENT("Hack dest surface read op in transfer cmd\r\n");
- PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
- psCCBMemInfo,
- psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui32DstReadOpPendingVal),
- sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
- psKick->ui32PDumpFlags,
- MAKEUNIQUETAG(psCCBMemInfo));
+ PDUMPCOMMENT("Hack dest surface read op in transfer cmd\r\n");
+ PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
+ psCCBMemInfo,
+ psKick->ui32CCBDumpWOff + offsetof(SGXMKIF_TRANSFERCMD_SHARED, asDstSyncs) + loop * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal),
+ sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
+ psKick->ui32PDumpFlags,
+ MAKEUNIQUETAG(psCCBMemInfo));
+ }
}
- if((psKick->ui32NumSrcSync > 0) && ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING)== 0UL))
+ if((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING)== 0UL)
{
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[0];
- psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
+ for (loop=0; loop<(psKick->ui32NumSrcSync); loop++)
+ {
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
+ psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
+ }
}
- if((psKick->ui32NumDstSync > 0) && ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL))
+ if((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
{
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0];
- psSyncInfo->psSyncData->ui32LastOpDumpVal++;
+ for (loop=0; loop<(psKick->ui32NumDstSync); loop++)
+ {
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0];
+ psSyncInfo->psSyncData->ui32LastOpDumpVal++;
+ }
}
}
#endif
@@ -549,8 +554,12 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK
psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
}
- psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hDstSyncInfo;
- psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
+ if (psKick->hDstSyncInfo != IMG_NULL)
+ {
+ psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hDstSyncInfo;
+
+ psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
+ }
if (psKick->hTASyncInfo != IMG_NULL)
{
diff --git a/drivers/gpu/pvr/sgx/sgxutils.c b/drivers/gpu/pvr/sgx/sgxutils.c
index 3365af66425..83144de85f8 100644
--- a/drivers/gpu/pvr/sgx/sgxutils.c
+++ b/drivers/gpu/pvr/sgx/sgxutils.c
@@ -168,6 +168,61 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_SGXDEV_INFO *psDevInfo,
PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags);
#endif
+#if defined(FIX_HW_BRN_28889)
+
+
+
+
+ if ( (eCmdType != SGXMKIF_CMD_PROCESS_QUEUES) &&
+ ((psDevInfo->ui32CacheControl & SGXMKIF_CC_INVAL_DATA) != 0) &&
+ ((psDevInfo->ui32CacheControl & (SGXMKIF_CC_INVAL_BIF_PT | SGXMKIF_CC_INVAL_BIF_PD)) != 0))
+ {
+ #if defined(PDUMP)
+ PVRSRV_KERNEL_MEM_INFO *psSGXHostCtlMemInfo = psDevInfo->psKernelSGXHostCtlMemInfo;
+ #endif
+ SGXMKIF_HOST_CTL *psSGXHostCtl = psDevInfo->psSGXHostCtl;
+ SGXMKIF_COMMAND sCacheCommand = {0};
+
+ eError = SGXScheduleCCBCommand(psDevInfo,
+ SGXMKIF_CMD_PROCESS_QUEUES,
+ &sCacheCommand,
+ ui32CallerID,
+ ui32PDumpFlags);
+ if (eError != PVRSRV_OK)
+ {
+ goto Exit;
+ }
+
+
+ #if !defined(NO_HARDWARE)
+ if(PollForValueKM(&psSGXHostCtl->ui32InvalStatus,
+ PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE,
+ PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE,
+ 2 * MAX_HW_TIME_US/WAIT_TRY_COUNT,
+ WAIT_TRY_COUNT) != PVRSRV_OK)
+ {
+ PVR_DPF((PVR_DBG_ERROR,"SGXScheduleCCBCommand: Wait for uKernel to Invalidate BIF cache failed"));
+ PVR_DBG_BREAK;
+ }
+ #endif
+
+ #if defined(PDUMP)
+
+ PDUMPCOMMENTWITHFLAGS(0, "Host Control - Poll for BIF cache invalidate request to complete");
+ PDUMPMEMPOL(psSGXHostCtlMemInfo,
+ offsetof(SGXMKIF_HOST_CTL, ui32InvalStatus),
+ PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE,
+ PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE,
+ PDUMP_POLL_OPERATOR_EQUAL,
+ 0,
+ MAKEUNIQUETAG(psSGXHostCtlMemInfo));
+ #endif
+
+ psSGXHostCtl->ui32InvalStatus &= ~(PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE);
+ PDUMPMEM(IMG_NULL, psSGXHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psSGXHostCtlMemInfo));
+ }
+#endif
+
#if defined(PDUMP)
{
diff --git a/drivers/gpu/pvr/sgx/sgxutils.h b/drivers/gpu/pvr/sgx/sgxutils.h
index bc4c0536795..7b6e473611d 100644
--- a/drivers/gpu/pvr/sgx/sgxutils.h
+++ b/drivers/gpu/pvr/sgx/sgxutils.h
@@ -27,6 +27,7 @@
#include "perproc.h"
#include "sgxinfokm.h"
+
#define CCB_OFFSET_IS_VALID(type, psCCBMemInfo, psCCBKick, offset) \
((sizeof(type) <= (psCCBMemInfo)->ui32AllocSize) && \
((psCCBKick)->offset <= (psCCBMemInfo)->ui32AllocSize - sizeof(type)))
@@ -95,5 +96,5 @@ IMG_UINT32 SGXConvertTimeStamp(PVRSRV_SGXDEV_INFO *psDevInfo,
IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE *psDeviceNode,
IMG_DEV_VIRTADDR *psHWDataDevVAddr,
IMG_UINT32 ui32CleanupType);
-
+
diff --git a/drivers/gpu/pvr/sgx_mkif_km.h b/drivers/gpu/pvr/sgx_mkif_km.h
index 32b3a25d93f..bd8f58b02a2 100644
--- a/drivers/gpu/pvr/sgx_mkif_km.h
+++ b/drivers/gpu/pvr/sgx_mkif_km.h
@@ -81,6 +81,9 @@ typedef struct _SGXMKIF_HOST_CTL_
volatile IMG_UINT32 ui32InitStatus;
volatile IMG_UINT32 ui32PowerStatus;
volatile IMG_UINT32 ui32CleanupStatus;
+#if defined(FIX_HW_BRN_28889)
+ volatile IMG_UINT32 ui32InvalStatus;
+#endif
#if defined(SUPPORT_HW_RECOVERY)
IMG_UINT32 ui32uKernelDetectedLockups;
IMG_UINT32 ui32HostDetectedLockups;
@@ -162,14 +165,13 @@ typedef struct _SGXMKIF_CMDTA_SHARED_
typedef struct _SGXMKIF_TRANSFERCMD_SHARED_
{
-
- IMG_UINT32 ui32SrcReadOpPendingVal;
- IMG_DEV_VIRTADDR sSrcReadOpsCompleteDevAddr;
-
- IMG_UINT32 ui32SrcWriteOpPendingVal;
- IMG_DEV_VIRTADDR sSrcWriteOpsCompleteDevAddr;
+ IMG_UINT32 ui32NumSrcSyncs;
+ PVRSRV_DEVICE_SYNC_OBJECT asSrcSyncs[SGX_MAX_SRC_SYNCS];
+
+ IMG_UINT32 ui32NumDstSyncs;
+ PVRSRV_DEVICE_SYNC_OBJECT asDstSyncs[SGX_MAX_DST_SYNCS];
IMG_UINT32 ui32DstReadOpPendingVal;
IMG_DEV_VIRTADDR sDstReadOpsCompleteDevAddr;
@@ -233,6 +235,10 @@ typedef struct _SGXMKIF_HWDEVICE_SYNC_LIST_
#define PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE (1UL << 0)
+#if defined(FIX_HW_BRN_28889)
+#define PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE (1UL << 0)
+#endif
+
#define PVRSRV_USSE_MISCINFO_READY 0x1UL
#define PVRSRV_USSE_MISCINFO_GET_STRUCT_SIZES 0x2UL
#if defined(SUPPORT_SGX_EDM_MEMORY_DEBUG)
diff --git a/drivers/gpu/pvr/sgx_options.h b/drivers/gpu/pvr/sgx_options.h
index 319db1c5854..6f918947d8d 100644
--- a/drivers/gpu/pvr/sgx_options.h
+++ b/drivers/gpu/pvr/sgx_options.h
@@ -220,5 +220,6 @@
OPTIONS_BIT19 |\
OPTIONS_BIT20 |\
OPTIONS_BIT21 |\
+ OPTIONS_BIT22 |\
OPTIONS_HIGHBYTE
diff --git a/drivers/gpu/pvr/sgxapi_km.h b/drivers/gpu/pvr/sgxapi_km.h
index d9bad0346a5..f38a85c0dcd 100644
--- a/drivers/gpu/pvr/sgxapi_km.h
+++ b/drivers/gpu/pvr/sgxapi_km.h
@@ -80,8 +80,10 @@ extern "C" {
#else
#if defined(ANDROID)
#define SGX_MAX_SRC_SYNCS 8
+#define SGX_MAX_DST_SYNCS 1
#else
#define SGX_MAX_SRC_SYNCS 4
+#define SGX_MAX_DST_SYNCS 1
#endif
#endif
diff --git a/drivers/gpu/pvr/sgxerrata.h b/drivers/gpu/pvr/sgxerrata.h
index 552cb2c3523..ded7a524283 100644
--- a/drivers/gpu/pvr/sgxerrata.h
+++ b/drivers/gpu/pvr/sgxerrata.h
@@ -36,6 +36,10 @@
#endif
#if SGX_CORE_REV == 100
+ #define FIX_HW_BRN_28889
+ #else
+ #if SGX_CORE_REV == 111
+ #define FIX_HW_BRN_28889
#else
#if SGX_CORE_REV == SGX_CORE_REV_HEAD
@@ -43,6 +47,7 @@
#error "sgxerrata.h: SGX520 Core Revision unspecified"
#endif
#endif
+ #endif
#define SGX_CORE_DEFINED
#endif
@@ -56,19 +61,24 @@
#endif
#if SGX_CORE_REV == 110
- #define FIX_HW_BRN_22934
+ #define FIX_HW_BRN_22934
+ #define FIX_HW_BRN_28889
#else
#if SGX_CORE_REV == 111
#define FIX_HW_BRN_22934
+ #define FIX_HW_BRN_28889
#else
#if SGX_CORE_REV == 120
#define FIX_HW_BRN_22934
+ #define FIX_HW_BRN_28889
#else
#if SGX_CORE_REV == 121
#define FIX_HW_BRN_22934
+ #define FIX_HW_BRN_28889
#else
#if SGX_CORE_REV == 125
#define FIX_HW_BRN_22934
+ #define FIX_HW_BRN_28889
#else
#if SGX_CORE_REV == SGX_CORE_REV_HEAD
@@ -230,9 +240,15 @@
#endif
#if SGX_CORE_REV == 113
+ #define FIX_HW_BRN_30954
#else
#if SGX_CORE_REV == 122
+ #define FIX_HW_BRN_30954
+
+ #else
+ #if SGX_CORE_REV == 140
+ #define FIX_HW_BRN_30954
#else
#if SGX_CORE_REV == SGX_CORE_REV_HEAD
@@ -242,6 +258,7 @@
#endif
#endif
#endif
+ #endif
#define SGX_CORE_DEFINED
#endif
@@ -286,6 +303,12 @@
#define FIX_HW_BRN_29702
#define FIX_HW_BRN_29823
#else
+ #if SGX_CORE_REV == 1012
+ #define FIX_HW_BRN_29823
+ #else
+ #if SGX_CORE_REV == 1013
+ #define FIX_HW_BRN_29823
+ #else
#if SGX_CORE_REV == SGX_CORE_REV_HEAD
#else
@@ -293,6 +316,8 @@
#endif
#endif
#endif
+ #endif
+ #endif
#define SGX_CORE_DEFINED
#endif
diff --git a/drivers/gpu/pvr/sgxfeaturedefs.h b/drivers/gpu/pvr/sgxfeaturedefs.h
index d815395523a..714bea3027a 100644
--- a/drivers/gpu/pvr/sgxfeaturedefs.h
+++ b/drivers/gpu/pvr/sgxfeaturedefs.h
@@ -109,7 +109,6 @@
#define SGX_FEATURE_AUTOCLOCKGATING
#define SGX_FEATURE_USE_NO_INSTRUCTION_PAIRING
#define SGX_FEATURE_USE_UNLIMITED_PHASES
- #define SGX_FEATURE_DXT_TEXTURES
#define SGX_FEATURE_VOLUME_TEXTURES
#define SGX_FEATURE_HOST_ALLOC_FROM_DPM
#define SGX_FEATURE_MULTIPLE_MEM_CONTEXTS
diff --git a/drivers/gpu/pvr/srvkm.h b/drivers/gpu/pvr/srvkm.h
index 44a1daa9700..e8e223c66d4 100644
--- a/drivers/gpu/pvr/srvkm.h
+++ b/drivers/gpu/pvr/srvkm.h
@@ -42,7 +42,7 @@ extern "C" {
IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVReleasePrintf(const IMG_CHAR *pszFormat, ...) IMG_FORMAT_PRINTF(1, 2);
- IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVProcessConnect(IMG_UINT32 ui32PID);
+ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVProcessConnect(IMG_UINT32 ui32PID, IMG_UINT32 ui32Flags);
IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVProcessDisconnect(IMG_UINT32 ui32PID);
IMG_IMPORT IMG_VOID PVRSRVScheduleDevicesKM(IMG_VOID);
diff --git a/drivers/gpu/pvr/syscommon.h b/drivers/gpu/pvr/syscommon.h
index 5ae080ad4b2..38b610738dd 100644
--- a/drivers/gpu/pvr/syscommon.h
+++ b/drivers/gpu/pvr/syscommon.h
@@ -77,11 +77,8 @@ typedef struct _SYS_DATA_TAG_
IMG_UINT32 *pvSOCTimerRegisterKM;
IMG_VOID *pvSOCClockGateRegsBase;
IMG_UINT32 ui32SOCClockGateRegsSize;
- PFN_CMD_PROC *ppfnCmdProcList[SYS_DEVICE_COUNT];
-
-
- PCOMMAND_COMPLETE_DATA *ppsCmdCompleteData[SYS_DEVICE_COUNT];
+ struct _DEVICE_COMMAND_DATA_ *apsDeviceCommandData[SYS_DEVICE_COUNT];
IMG_BOOL bReProcessQueues;