summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/configs/minnow_defconfig4
-rwxr-xr-xdrivers/gpu/pvr/include4/pvrversion.h6
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/common/deviceclass.c8
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/common/pvrsrv.c4
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/devices/sgx/sgxinit.c10
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/env/linux/ion.c29
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/env/linux/ion.h2
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/env/linux/module.c25
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/env/linux/mutils.h2
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c118
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/env/linux/osperproc.c8
-rwxr-xr-xdrivers/gpu/pvr/services4/srvkm/hwdefs/sgxerrata.h5
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