diff options
Diffstat (limited to 'drivers/gpu/pvr/osfunc.c')
-rw-r--r-- | drivers/gpu/pvr/osfunc.c | 45 |
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 | |||
120 | static 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) |
120 | PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc) | 129 | PVRSRV_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 | ||
2962 | static inline size_t pvr_dmac_range_len(const void *pvStart, const void *pvEnd) | ||
2963 | { | ||
2964 | return (size_t)((char *)pvEnd - (char *)pvStart); | ||
2965 | } | ||
2966 | |||
2967 | static 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 | |||
2976 | static 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 | |||
2953 | IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, | 2985 | IMG_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 | ||
2969 | IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, | 3001 | IMG_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 | ||