aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/pvr/osfunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/pvr/osfunc.c')
-rw-r--r--drivers/gpu/pvr/osfunc.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/drivers/gpu/pvr/osfunc.c b/drivers/gpu/pvr/osfunc.c
index 9a264d23a87..2bcf0ed40ce 100644
--- a/drivers/gpu/pvr/osfunc.c
+++ b/drivers/gpu/pvr/osfunc.c
@@ -115,6 +115,15 @@ PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOI
115 return PVRSRV_OK; 115 return PVRSRV_OK;
116} 116}
117 117
118#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24))
119
120static inline int is_vmalloc_addr(const void *pvCpuVAddr)
121{
122 unsigned long lAddr = (unsigned long)pvCpuVAddr;
123 return lAddr >= VMALLOC_START && lAddr < VMALLOC_END;
124}
125
126#endif
118 127
119#if !defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) 128#if !defined(DEBUG_LINUX_MEMORY_ALLOCATIONS)
120PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc) 129PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc)
@@ -2950,6 +2959,29 @@ IMG_VOID OSFlushCPUCacheKM(IMG_VOID)
2950#endif 2959#endif
2951} 2960}
2952 2961
2962static inline size_t pvr_dmac_range_len(const void *pvStart, const void *pvEnd)
2963{
2964 return (size_t)((char *)pvEnd - (char *)pvStart);
2965}
2966
2967static void pvr_dmac_inv_range(const void *pvStart, const void *pvEnd)
2968{
2969#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34))
2970 dmac_inv_range(pvStart, pvEnd);
2971#else
2972 dmac_map_area(pvStart, pvr_dmac_range_len(pvStart, pvEnd), DMA_FROM_DEVICE);
2973#endif
2974}
2975
2976static void pvr_dmac_clean_range(const void *pvStart, const void *pvEnd)
2977{
2978#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34))
2979 dmac_clean_range(pvStart, pvEnd);
2980#else
2981 dmac_map_area(pvStart, pvr_dmac_range_len(pvStart, pvEnd), DMA_TO_DEVICE);
2982#endif
2983}
2984
2953IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, 2985IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
2954 IMG_VOID *pvRangeAddrStart, 2986 IMG_VOID *pvRangeAddrStart,
2955 IMG_UINT32 ui32Length) 2987 IMG_UINT32 ui32Length)
@@ -2963,7 +2995,7 @@ IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
2963 IMG_UINT32 ui32Length) 2995 IMG_UINT32 ui32Length)
2964{ 2996{
2965 return CheckExecuteCacheOp(hOSMemHandle, pvRangeAddrStart, ui32Length, 2997 return CheckExecuteCacheOp(hOSMemHandle, pvRangeAddrStart, ui32Length,
2966 dmac_clean_range, outer_clean_range); 2998 pvr_dmac_clean_range, outer_clean_range);
2967} 2999}
2968 3000
2969IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, 3001IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
@@ -2971,7 +3003,7 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
2971 IMG_UINT32 ui32Length) 3003 IMG_UINT32 ui32Length)
2972{ 3004{
2973 return CheckExecuteCacheOp(hOSMemHandle, pvRangeAddrStart, ui32Length, 3005 return CheckExecuteCacheOp(hOSMemHandle, pvRangeAddrStart, ui32Length,
2974 dmac_inv_range, outer_inv_range); 3006 pvr_dmac_inv_range, outer_inv_range);
2975} 3007}
2976 3008
2977#else 3009#else
@@ -2993,7 +3025,8 @@ IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
2993 IMG_VOID *pvRangeAddrStart, 3025 IMG_VOID *pvRangeAddrStart,
2994 IMG_UINT32 ui32Length) 3026 IMG_UINT32 ui32Length)
2995{ 3027{
2996 dma_cache_wback_inv((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length); 3028 if (ui32Length)
3029 dma_cache_wback_inv((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length);
2997 return IMG_TRUE; 3030 return IMG_TRUE;
2998} 3031}
2999 3032
@@ -3001,7 +3034,8 @@ IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
3001 IMG_VOID *pvRangeAddrStart, 3034 IMG_VOID *pvRangeAddrStart,
3002 IMG_UINT32 ui32Length) 3035 IMG_UINT32 ui32Length)
3003{ 3036{
3004 dma_cache_wback((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length); 3037 if (ui32Length)
3038 dma_cache_wback((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length);
3005 return IMG_TRUE; 3039 return IMG_TRUE;
3006} 3040}
3007 3041
@@ -3009,7 +3043,8 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle,
3009 IMG_VOID *pvRangeAddrStart, 3043 IMG_VOID *pvRangeAddrStart,
3010 IMG_UINT32 ui32Length) 3044 IMG_UINT32 ui32Length)
3011{ 3045{
3012 dma_cache_inv((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length); 3046 if (ui32Length)
3047 dma_cache_inv((IMG_UINTPTR_T)pvRangeAddrStart, ui32Length);
3013 return IMG_TRUE; 3048 return IMG_TRUE;
3014} 3049}
3015 3050