diff options
| author | Hemant Hariyani <hemanthariyani@ti.com> | 2011-05-31 09:25:01 +0100 |
|---|---|---|
| committer | Andy Green <andy.green@linaro.org> | 2011-05-31 11:06:31 +0100 |
| commit | 15be2c5ce9b3acd4c9bf9388b7a39311c499d352 (patch) | |
| tree | 1e3ad39a72ef67c4a59dc58b1defebe455b2fad4 | |
| parent | a029707459c63855d49aaa5b9bbf7f5a707e62d4 (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>
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; |
