diff options
| author | Wengang Wu <wgw@motorola.com> | 2014-07-14 22:15:17 -0500 | 
|---|---|---|
| committer | Jee Su Chang <w20740@motorola.com> | 2014-07-16 19:12:10 +0000 | 
| commit | 56071cb85478ccac30a0ef54d9db13e6bbed50b4 (patch) | |
| tree | 7f50ad569cc4bdf2b759dba14d78387ee9ddc89f /drivers/gpu/pvr/services4/srvkm/env/linux | |
| parent | 74fb453848774aa38c1a32934c40b053aa99d09c (diff) | |
| download | olio-linux-3.10-56071cb85478ccac30a0ef54d9db13e6bbed50b4.tar.xz olio-linux-3.10-56071cb85478ccac30a0ef54d9db13e6bbed50b4.zip  | |
IKXCLOCK-2893 Merge changes based on ImgTech SGX DDK 1.12@2917986
Change-Id: I5f884bc0d76942433d0a451384b1b4bbdc324208
Diffstat (limited to 'drivers/gpu/pvr/services4/srvkm/env/linux')
| -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 | 
6 files changed, 123 insertions, 61 deletions
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);  |