diff options
Diffstat (limited to 'drivers/gpu/pvr/services4/srvkm/env')
| -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); |