diff options
| -rw-r--r-- | arch/arm/configs/minnow_defconfig | 4 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/include4/pvrversion.h | 6 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/common/deviceclass.c | 8 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c | 4 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c | 10 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/env/linux/ion.c | 29 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/env/linux/ion.h | 2 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/env/linux/module.c | 25 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/env/linux/mutils.h | 2 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c | 118 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/env/linux/osperproc.c | 8 | ||||
| -rwxr-xr-x | drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h | 5 |
12 files changed, 147 insertions, 74 deletions
diff --git a/arch/arm/configs/minnow_defconfig b/arch/arm/configs/minnow_defconfig index 902e0dfcd52..83e522a11cc 100644 --- a/arch/arm/configs/minnow_defconfig +++ b/arch/arm/configs/minnow_defconfig @@ -1800,6 +1800,7 @@ CONFIG_REGULATOR_TI_OMAP_PMIC=y # CONFIG_DRM is not set # CONFIG_TEGRA_HOST1X is not set CONFIG_SGX_OMAP3630=y +CONFIG_SGX_SYNC=y CONFIG_SGX_BUILD_RELEASE=y # CONFIG_SGX_BUILD_DEBUG is not set # CONFIG_SGX_PDUMP is not set @@ -2464,7 +2465,8 @@ CONFIG_ANDROID_LOW_MEMORY_KILLER=y CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES=y CONFIG_ANDROID_INTF_ALARM_DEV=y CONFIG_SYNC=y -# CONFIG_SW_SYNC is not set +CONFIG_SW_SYNC=y +# CONFIG_SW_SYNC_USER is not set # CONFIG_ION is not set # CONFIG_USB_WPAN_HCD is not set # CONFIG_WIMAX_GDM72XX is not set diff --git a/drivers/gpu/pvr/include4/pvrversion.h b/drivers/gpu/pvr/include4/pvrversion.h index 840868ed4f8..2436ec449e4 100755 --- a/drivers/gpu/pvr/include4/pvrversion.h +++ b/drivers/gpu/pvr/include4/pvrversion.h @@ -53,7 +53,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define PVRVERSION_FAMILY "sgxddk" #define PVRVERSION_BRANCHNAME "1.12" -#define PVRVERSION_BUILD 2701748 +#define PVRVERSION_BUILD 2917986 #define PVRVERSION_BSCONTROL "SGX_DDK" #if defined(MOT_BUILD) @@ -67,8 +67,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define COPYRIGHT_TXT "Copyright (c) Imagination Technologies Ltd. All Rights Reserved." -#define PVRVERSION_BUILD_HI 270 -#define PVRVERSION_BUILD_LO 1748 +#define PVRVERSION_BUILD_HI 291 +#define PVRVERSION_BUILD_LO 7986 #define PVRVERSION_STRING_NUMERIC PVR_STR2(PVRVERSION_MAJ) "." PVR_STR2(PVRVERSION_MIN) "." PVR_STR2(PVRVERSION_BUILD_HI) "." PVR_STR2(PVRVERSION_BUILD_LO) #endif /* _PVRVERSION_H_ */ diff --git a/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c b/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c index 7a96e0ed533..6ae3618a798 100755 --- a/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c +++ b/drivers/gpu/pvr/services4/srvkm/common/deviceclass.c @@ -1777,8 +1777,12 @@ static IMG_VOID FreePrivateData(IMG_HANDLE hCallbackData) { CALLBACK_DATA *psCallbackData = hCallbackData; - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psCallbackData->ui32PrivDataLength, - psCallbackData->pvPrivData, IMG_NULL); + if(psCallbackData->ui32PrivDataLength) + { + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psCallbackData->ui32PrivDataLength, + psCallbackData->pvPrivData, IMG_NULL); + } + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(IMG_VOID *) * psCallbackData->ui32NumMemInfos, psCallbackData->ppvMemInfos, IMG_NULL); diff --git a/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c b/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c index dcbc09ff677..bb219bf6cb3 100755 --- a/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c +++ b/drivers/gpu/pvr/services4/srvkm/common/pvrsrv.c @@ -182,13 +182,13 @@ IMG_VOID IMG_CALLCONV PVRSRVCompatCheckKM(PVRSRV_BRIDGE_IN_COMPAT_CHECK *psUserM || (psUserModeDDKDetails->ui32DDKBuild != ui32DDKBuild)) { psRetOUT->eError = PVRSRV_ERROR_DDK_VERSION_MISMATCH; - PVR_DPF((PVR_DBG_ERROR, "(FAIL) UM-KM DDK Mismatch UM-(%d) KM-(%d).", + PVR_LOG(("(FAIL) UM-KM DDK Mismatch UM-(%d) KM-(%d).", psUserModeDDKDetails->ui32DDKBuild, ui32DDKBuild)); } else { psRetOUT->eError = PVRSRV_OK; - PVR_DPF((PVR_DBG_MESSAGE, "UM DDK-(%d) and KM DDK-(%d) match. [ OK ]", + PVR_LOG(("UM DDK-(%d) and KM DDK-(%d) match. [ OK ]", psUserModeDDKDetails->ui32DDKBuild, ui32DDKBuild)); } } diff --git a/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c b/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c index 778e5335574..9b234dc0aee 100755 --- a/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c +++ b/drivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c @@ -2710,7 +2710,7 @@ PVRSRV_ERROR SGXDevInitCompatCheck(PVRSRV_DEVICE_NODE *psDeviceNode) /* Clear state (not strictly necessary since this is the first call) */ psSGXMiscInfoInt = psMemInfo->pvLinAddrKM; - psSGXMiscInfoInt->ui32MiscInfoFlags = 0; + psSGXMiscInfoInt->ui32MiscInfoFlags &= ~PVRSRV_USSE_MISCINFO_GET_STRUCT_SIZES; psSGXMiscInfoInt->ui32MiscInfoFlags |= PVRSRV_USSE_MISCINFO_GET_STRUCT_SIZES; eError = SGXGetMiscInfoUkernel(psDevInfo, psDeviceNode, IMG_NULL); @@ -2951,10 +2951,8 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, { PVRSRV_ERROR eError; PPVRSRV_KERNEL_MEM_INFO psMemInfo = psDevInfo->psKernelSGXMiscMemInfo; - IMG_UINT32 *pui32MiscInfoFlags = &((PVRSRV_SGX_MISCINFO_INFO*)(psMemInfo->pvLinAddrKM))->ui32MiscInfoFlags; - - /* Reset the misc info state flags */ - *pui32MiscInfoFlags = 0; + IMG_UINT32 *pui32MiscInfoFlags; + pui32MiscInfoFlags = &((PVRSRV_SGX_MISCINFO_INFO*)(psMemInfo->pvLinAddrKM))->ui32MiscInfoFlags; #if !defined(SUPPORT_SGX_EDM_MEMORY_DEBUG) PVR_UNREFERENCED_PARAMETER(hDevMemContext); @@ -3367,6 +3365,7 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, PVRSRV_SGX_MISCINFO_MEMACCESS *psSGXMemDest; /* user-defined mem write */ { + *pui32MiscInfoFlags &= ~PVRSRV_USSE_MISCINFO_MEMREAD; /* Set the mem read flag; src is user-defined */ *pui32MiscInfoFlags |= PVRSRV_USSE_MISCINFO_MEMREAD; psSGXMemSrc = &((PVRSRV_SGX_MISCINFO_INFO*)(psMemInfo->pvLinAddrKM))->sSGXMemAccessSrc; @@ -3383,6 +3382,7 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, if( psMiscInfo->eRequest == SGX_MISC_INFO_REQUEST_MEMCOPY) { + *pui32MiscInfoFlags &= ~PVRSRV_USSE_MISCINFO_MEMWRITE; /* Set the mem write flag; dest is user-defined */ *pui32MiscInfoFlags |= PVRSRV_USSE_MISCINFO_MEMWRITE; psSGXMemDest = &((PVRSRV_SGX_MISCINFO_INFO*)(psMemInfo->pvLinAddrKM))->sSGXMemAccessDest; diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/ion.c b/drivers/gpu/pvr/services4/srvkm/env/linux/ion.c index 036f1bd7cbe..3bd66594fe3 100755 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/ion.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/ion.c @@ -119,9 +119,31 @@ IMG_VOID IonDeinit(IMG_VOID) #else /* defined(CONFIG_ION_SUNXI) */ +#if defined(CONFIG_ION_INCDHAD1) + +/* Real ion with sharing (incdhad1) */ + +extern struct ion_device *incdhad1_ion_device; +struct ion_device *gpsIonDev; + +PVRSRV_ERROR IonInit(IMG_VOID) +{ + gpsIonDev = incdhad1_ion_device; + return PVRSRV_OK; +} + + +IMG_VOID IonDeinit(IMG_VOID) +{ + gpsIonDev = IMG_NULL; +} + +#else /* defined(CONFIG_ION_INCDHAD1) */ + /* "Reference" ion implementation */ -#include "../drivers/gpu/ion/ion_priv.h" +#include SUPPORT_ION_PRIV_HEADER +#include <linux/version.h> static struct ion_heap **gapsIonHeaps; struct ion_device *gpsIonDev; @@ -138,6 +160,9 @@ static struct ion_platform_data gsGenericConfig = { .nr = 3, .heaps = +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,39)) + (struct ion_platform_heap []) +#endif { { .type = ION_HEAP_TYPE_SYSTEM_CONTIG, @@ -216,6 +241,8 @@ IMG_VOID IonDeinit(IMG_VOID) ion_device_destroy(gpsIonDev); } +#endif /* defined(CONFIG_ION_INCDHAD1) */ + #endif /* defined(CONFIG_ION_SUNXI) */ #endif /* defined(CONFIG_ION_S5P) */ diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/ion.h b/drivers/gpu/pvr/services4/srvkm/env/linux/ion.h index 042d3c4c49c..b71ecd7e394 100755 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/ion.h +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/ion.h @@ -44,7 +44,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if defined(SUPPORT_ION) -#include <linux/ion.h> +#include SUPPORT_ION_HEADER #include "img_types.h" #include "servicesext.h" diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/module.c b/drivers/gpu/pvr/services4/srvkm/env/linux/module.c index a86de684c0a..4c9cf9e214d 100755 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/module.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/module.c @@ -476,13 +476,14 @@ PVR_MOD_STATIC void PVRSRVDriverShutdown(LDM_DEV *pDevice) if (!bDriverIsShutdown && !bDriverIsSuspended) { +#if defined(ANDROID) /* * Take the bridge mutex, and never release it, to stop * processes trying to use the driver after it has been * shutdown. */ LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); - +#endif (void) PVRSRVSetPowerStateKM(PVRSRV_SYS_POWER_STATE_D3); } @@ -542,16 +543,30 @@ PVR_MOD_STATIC int PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state) if (!bDriverIsSuspended && !bDriverIsShutdown) { +#if defined(ANDROID) + /* + * The bridge mutex will be held until we resume. + * The lock doesn't need to be taken on (non-Android) + * Linux systems, as all user processes will have been + * suspended at this point. In any case, taking the mutex + * may result in possible lock ordering problems being + * flagged up by the kernel, as the Linux console lock may + * have already been taken at this point. If the 3rd party + * display driver is Linux Framebuffer based, the previous + * locking order may have been bridge mutex first, followed + * by the console lock. + */ LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); - +#endif if (PVRSRVSetPowerStateKM(PVRSRV_SYS_POWER_STATE_D3) == PVRSRV_OK) { - /* The bridge mutex will be held until we resume */ bDriverIsSuspended = IMG_TRUE; } else { +#if defined(ANDROID) LinuxUnLockMutex(&gPVRSRVLock); +#endif res = -EINVAL; } } @@ -602,11 +617,15 @@ PVR_MOD_STATIC int PVRSRVDriverResume(LDM_DEV *pDevice) if (PVRSRVSetPowerStateKM(PVRSRV_SYS_POWER_STATE_D0) == PVRSRV_OK) { bDriverIsSuspended = IMG_FALSE; +#if defined(ANDROID) LinuxUnLockMutex(&gPVRSRVLock); +#endif } else { +#if defined(ANDROID) /* The bridge mutex is not released on failure */ +#endif res = -EINVAL; } } diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/mutils.h b/drivers/gpu/pvr/services4/srvkm/env/linux/mutils.h index 6bcee26e3eb..a66e9273697 100755 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/mutils.h +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/mutils.h @@ -64,7 +64,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if defined(__arm__) || defined(__sh__) #define PGPROT_WC(pv) pgprot_writecombine(pv) #elif defined(__mips__) - #define PGPROT_WC(pv) pgprot_noncached_wa(pv) + #define PGPROT_WC(pv) pgprot_writecombine(pv) #elif defined(__i386__) || defined(__x86_64) /* PAT support supersedes this */ #define PGPROT_WC(pv) pgprot_noncached(pv) diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c b/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c index f2803abc024..c9b577eddbe 100755 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c @@ -859,29 +859,25 @@ static irqreturn_t DeviceISRWrapper(int irq, void *dev_id #endif ) { - PVRSRV_DEVICE_NODE *psDeviceNode; + PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE*)dev_id; + SYS_DATA *psSysData = psDeviceNode->psSysData; + ENV_DATA *psEnvData = (ENV_DATA *)psSysData->pvEnvSpecificData; IMG_BOOL bStatus = IMG_FALSE; PVR_UNREFERENCED_PARAMETER(irq); - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) PVR_UNREFERENCED_PARAMETER(regs); #endif - psDeviceNode = (PVRSRV_DEVICE_NODE*)dev_id; - if(!psDeviceNode) - { - PVR_DPF((PVR_DBG_ERROR, "DeviceISRWrapper: invalid params\n")); - goto out; - } - bStatus = PVRSRVDeviceLISR(psDeviceNode); - - if (bStatus) + if (psEnvData->bLISRInstalled) { - OSScheduleMISR((IMG_VOID *)psDeviceNode->psSysData); + bStatus = PVRSRVDeviceLISR(psDeviceNode); + if (bStatus) + { + OSScheduleMISR((IMG_VOID *)psSysData); + } } -out: #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) return bStatus ? IRQ_HANDLED : IRQ_NONE; #endif @@ -908,7 +904,8 @@ static irqreturn_t SystemISRWrapper(int irq, void *dev_id #endif ) { - SYS_DATA *psSysData; + SYS_DATA *psSysData = (SYS_DATA *)dev_id; + ENV_DATA *psEnvData = (ENV_DATA *)psSysData->pvEnvSpecificData; IMG_BOOL bStatus = IMG_FALSE; PVR_UNREFERENCED_PARAMETER(irq); @@ -916,21 +913,16 @@ static irqreturn_t SystemISRWrapper(int irq, void *dev_id #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) PVR_UNREFERENCED_PARAMETER(regs); #endif - psSysData = (SYS_DATA *)dev_id; - if(!psSysData) - { - PVR_DPF((PVR_DBG_ERROR, "SystemISRWrapper: invalid params\n")); - goto out; - } - bStatus = PVRSRVSystemLISR(psSysData); - - if (bStatus) + if (psEnvData->bLISRInstalled) { - OSScheduleMISR((IMG_VOID *)psSysData); + bStatus = PVRSRVSystemLISR(psSysData); + if (bStatus) + { + OSScheduleMISR((IMG_VOID *)psSysData); + } } -out: #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) return bStatus ? IRQ_HANDLED : IRQ_NONE; #endif @@ -1011,10 +1003,10 @@ PVRSRV_ERROR OSUninstallDeviceLISR(IMG_VOID *pvSysData) PVR_TRACE(("Uninstalling device LISR on IRQ %d with cookie %p", psEnvData->ui32IRQ, psEnvData->pvISRCookie)); - free_irq(psEnvData->ui32IRQ, psEnvData->pvISRCookie); - psEnvData->bLISRInstalled = IMG_FALSE; + free_irq(psEnvData->ui32IRQ, psEnvData->pvISRCookie); + return PVRSRV_OK; } @@ -1091,10 +1083,10 @@ PVRSRV_ERROR OSUninstallSystemLISR(IMG_VOID *pvSysData) PVR_TRACE(("Uninstalling system LISR on IRQ %d with cookie %p", psEnvData->ui32IRQ, psEnvData->pvISRCookie)); - free_irq(psEnvData->ui32IRQ, psEnvData->pvISRCookie); - psEnvData->bLISRInstalled = IMG_FALSE; + free_irq(psEnvData->ui32IRQ, psEnvData->pvISRCookie); + return PVRSRV_OK; } @@ -4406,6 +4398,7 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, } #elif defined(__mips__) + /* * dmac cache functions are supposed to be used for dma * memory which comes from dma-able memory. However examining @@ -4415,50 +4408,65 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, * */ +static inline size_t pvr_dma_range_len(const void *pvStart, const void *pvEnd) +{ + return (size_t)((char *)pvEnd - (char *)pvStart); +} + +static void pvr_dma_cache_wback_inv(const void *pvStart, const void *pvEnd) +{ + size_t uLength = pvr_dma_range_len(pvStart, pvEnd); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + dma_cache_sync(NULL, (void *)pvStart, uLength, DMA_BIDIRECTIONAL); +#else + dma_cache_wback_inv((unsigned long)pvStart, uLength); +#endif +} + +static void pvr_dma_cache_wback(const void *pvStart, const void *pvEnd) +{ + size_t uLength = pvr_dma_range_len(pvStart, pvEnd); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + dma_cache_sync(NULL, (void *)pvStart, uLength, DMA_TO_DEVICE); +#else + dma_cache_wback((unsigned long)pvStart, uLength); +#endif +} + +static void pvr_dma_cache_inv(const void *pvStart, const void *pvEnd) +{ + size_t uLength = pvr_dma_range_len(pvStart, pvEnd); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + dma_cache_sync(NULL, (void *)pvStart, uLength, DMA_FROM_DEVICE); +#else + dma_cache_inv((unsigned long)pvStart, uLength); +#endif +} + IMG_VOID OSCleanCPUCacheKM(IMG_VOID) { /* dmac functions flush full cache if size is larger than - * p-cache size. This is a workaround for the fact that + * {s,d}-cache size. This is a workaround for the fact that * __flush_cache_all is not an exported symbol. Please * replace with custom function if available in latest * version of linux being used. * Arbitrary large number (1MB) which should be larger than - * mips p-cache sizes for some time in future. + * mips {s,d}-cache sizes for some time in future. * */ - dma_cache_wback(0, 0x100000); + pvr_dma_cache_wback(0, (const void *)0x200000); } IMG_VOID OSFlushCPUCacheKM(IMG_VOID) { /* dmac functions flush full cache if size is larger than - * p-cache size. This is a workaround for the fact that + * {s,d}-cache size. This is a workaround for the fact that * __flush_cache_all is not an exported symbol. Please * replace with custom function if available in latest * version of linux being used. * Arbitrary large number (1MB) which should be larger than - * mips p-cache sizes for some time in future. + * mips {s,d}-cache sizes for some time in future. * */ - dma_cache_wback_inv(0, 0x100000); -} - -static inline IMG_UINT32 pvr_dma_range_len(const void *pvStart, const void *pvEnd) -{ - return (IMG_UINT32)((char *)pvEnd - (char *)pvStart); -} - -static void pvr_dma_cache_wback_inv(const void *pvStart, const void *pvEnd) -{ - dma_cache_wback_inv((IMG_UINTPTR_T)pvStart, pvr_dma_range_len(pvStart, pvEnd)); -} - -static void pvr_dma_cache_wback(const void *pvStart, const void *pvEnd) -{ - dma_cache_wback((IMG_UINTPTR_T)pvStart, pvr_dma_range_len(pvStart, pvEnd)); -} - -static void pvr_dma_cache_inv(const void *pvStart, const void *pvEnd) -{ - dma_cache_inv((IMG_UINTPTR_T)pvStart, pvr_dma_range_len(pvStart, pvEnd)); + pvr_dma_cache_wback_inv(0, (const void *)0x200000); } IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/osperproc.c b/drivers/gpu/pvr/services4/srvkm/env/linux/osperproc.c index 3485d8ae61c..9b014dccd09 100755 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/osperproc.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/osperproc.c @@ -114,6 +114,14 @@ PVRSRV_ERROR OSPerProcessPrivateDataDeInit(IMG_HANDLE hOsPrivateData) psEnvPerProc = (PVRSRV_ENV_PER_PROCESS_DATA *)hOsPrivateData; +#if defined(SUPPORT_ION) + if (psEnvPerProc->psIONClient) + { + ion_client_destroy(psEnvPerProc->psIONClient); + psEnvPerProc->psIONClient = IMG_NULL; + } +#endif /* defined(SUPPORT_ION) */ + /* Linux specific mmap processing */ LinuxMMapPerProcessDisconnect(psEnvPerProc); diff --git a/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h b/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h index 52b13bb5766..42c1f18de6f 100755 --- a/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h +++ b/drivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h @@ -350,6 +350,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ #else #if SGX_CORE_REV == 116 + #if defined(SGX_FEATURE_MP) + #if SGX_FEATURE_MP_CORE_COUNT == 1 + #define FIX_HW_BRN_33809/* workaround in kernel (enable burst combiner) */ + #endif + #endif #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) #define FIX_HW_BRN_33657/* workaround in ukernel */ #endif |