diff options
author | Sam Protsenko <semen.protsenko@linaro.org> | 2019-05-16 02:24:52 +0300 |
---|---|---|
committer | Sam Protsenko <semen.protsenko@linaro.org> | 2019-05-25 01:40:28 +0300 |
commit | 7244da2f2bbc98071f525bd823c1ef6e3229c8b2 (patch) | |
tree | 8c64c2511a0dfba402ad52a213a92c1de88e962f | |
parent | a5272d6d898ea460fc2a449d7a29120ebefa282d (diff) |
drivers: gpu: pvr: Fix build on kernel v5.0+
Next changes are included here (author: Sam Protsenko):
* drivers: gpu: pvr: Convert to use vmf_insert_mixed
vm_insert_mixed() API was removed in kernel 4.20. Let's use new
vmf_insert_mixed() API in that case.
This patch fixes build with CONFIG_PVR_SGX544 option enabled on
linux-mainline.
* drivers: gpu: pvr: Fix access_ok() for kernel v5.0+
access_ok() signature was changed in kernel v5.0. Provide corresponding
support for new API to fix the build.
* drivers: gpu: pvr: Fix reservation_object_reserve_shared() in k5.0
Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
7 files changed, 99 insertions, 3 deletions
diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/mmap.c b/drivers/gpu/pvr/services4/srvkm/env/linux/mmap.c index 3a2a16b58b5e..0c3fe26fd976 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/mmap.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/mmap.c @@ -709,7 +709,7 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, * that attempt to interpret it). * The only alternative is to use VM_INSERT_PAGE, which requires * finding the page structure corresponding to each page, or - * if mixed maps are supported (VM_MIXEDMAP), vm_insert_mixed. + * if mixed maps are supported (VM_MIXEDMAP), vmf_insert_mixed. */ IMG_UINTPTR_T ulVMAPos; IMG_UINTPTR_T uiByteEnd = uiByteOffset + uiByteSize; @@ -766,7 +766,7 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, for(uiPA = uiByteOffset; uiPA < uiByteEnd; uiPA += PAGE_SIZE) { IMG_UINTPTR_T pfn; - IMG_INT result; + IMG_INT result = 0; IMG_BOOL bMapPage = IMG_TRUE; if (psLinuxMemArea->hBMHandle) @@ -785,7 +785,14 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, #if defined(PVR_MAKE_ALL_PFNS_SPECIAL) if (bMixedMap) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0)) + pfn_t pfns = { pfn }; + vm_fault_t vmf; + + vmf = vmf_insert_mixed(ps_vma, ulVMAPos, pfns); + if (vmf & VM_FAULT_ERROR) + result = vm_fault_to_errno(vmf, 0); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)) pfn_t pfns = { pfn }; result = vm_insert_mixed(ps_vma, ulVMAPos, pfns); diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c b/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c index feee7dbaea1d..6ce3a1ebbc10 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c @@ -3400,6 +3400,10 @@ PVRSRV_ERROR OSCopyFromUser( IMG_PVOID pvProcess, ******************************************************************************/ IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_SIZE_T uiBytes) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + (void)eVerification; /* unused */ + return access_ok(pvUserPtr, uiBytes); +#else IMG_INT linuxType; if (eVerification == PVR_VERIFY_READ) @@ -3413,6 +3417,7 @@ IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_SIZE } return access_ok(linuxType, pvUserPtr, uiBytes); +#endif } typedef enum _eWrapMemType_ diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_fence.c b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_fence.c index 78ea248ea1c2..3d418c2afefd 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_fence.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_fence.c @@ -882,7 +882,11 @@ static long PVRSyncIOCTLCreate(struct PVR_SYNC_TIMELINE *psTimeline, void __user goto err_out; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_put_fd; if (copy_from_user(&sData, pvData, sizeof(sData))) @@ -943,7 +947,11 @@ static long PVRSyncIOCTLCreate(struct PVR_SYNC_TIMELINE *psTimeline, void __user sData.fence = iFd; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif { goto err_destroy_fence; } @@ -987,7 +995,11 @@ static long PVRSyncIOCTLRename(struct PVR_SYNC_TIMELINE *psTimeline, void __user int err = 0; struct PVR_SYNC_RENAME_IOCTL_DATA data; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(user_data, sizeof(data))) { +#else if (!access_ok(VERIFY_READ, user_data, sizeof(data))) { +#endif err = -EFAULT; goto err; } @@ -1150,7 +1162,11 @@ PVRSyncIOCTLAlloc(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) goto err_out; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_put_fd; if (copy_from_user(&sData, pvData, sizeof(sData))) @@ -1224,7 +1240,11 @@ PVRSyncIOCTLAlloc(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) LinuxUnLockMutex(&gPVRSRVLock); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif goto err_release_file; if (copy_to_user(pvData, &sData, sizeof(sData))) @@ -1267,7 +1287,11 @@ PVRSyncIOCTLDebug(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) int err = -EFAULT; PVR_SYNC_DEBUG *psMetaData; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if(!access_ok(pvData, sizeof(sData))) +#else if(!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_out; if(copy_from_user(&sData, pvData, sizeof(sData))) @@ -1302,7 +1326,11 @@ PVRSyncIOCTLDebug(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) sData.ui32NumPoints = 1; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if(!access_ok(pvData, sizeof(sData))) +#else if(!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif goto err_out; if(copy_to_user(pvData, &sData, sizeof(sData))) diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_linux_fence.c b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_linux_fence.c index dac4ba86a1cf..4c7ae3681a4b 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_linux_fence.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_linux_fence.c @@ -440,7 +440,11 @@ static int update_reservation_object_fences_src(struct pvr_fence_frame *pvr_fenc struct dma_fence *fence; int ret; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + ret = reservation_object_reserve_shared(resv, 1); +#else ret = reservation_object_reserve_shared(resv); +#endif if (ret) { return ret; diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync.c b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync.c index 56f5949ae4bb..534dc77be3d9 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync.c @@ -633,7 +633,11 @@ PVRSyncIOCTLCreate(struct PVR_SYNC_TIMELINE *psObj, void __user *pvData) goto err_out; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_put_fd; if (copy_from_user(&sData, pvData, sizeof(sData))) @@ -690,7 +694,11 @@ PVRSyncIOCTLCreate(struct PVR_SYNC_TIMELINE *psObj, void __user *pvData) sData.fence = iFd; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif { sync_fence_put(psFence); goto err_put_fd; @@ -735,7 +743,11 @@ PVRSyncIOCTLDebug(struct PVR_SYNC_TIMELINE *psObj, void __user *pvData) struct sync_pt *sync_pt; int i = 0, j, err = -EFAULT; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if(!access_ok(pvData, sizeof(sData))) +#else if(!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_out; if(copy_from_user(&sData, pvData, sizeof(sData))) @@ -788,7 +800,11 @@ PVRSyncIOCTLDebug(struct PVR_SYNC_TIMELINE *psObj, void __user *pvData) sData.ui32NumPoints = i; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if(!access_ok(pvData, sizeof(sData))) +#else if(!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif goto err_out; if(copy_to_user(pvData, &sData, sizeof(sData))) @@ -863,7 +879,11 @@ PVRSyncIOCTLAlloc(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) goto err_out; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_put_fd; if (copy_from_user(&sData, pvData, sizeof(sData))) @@ -938,7 +958,11 @@ PVRSyncIOCTLAlloc(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) LinuxUnLockMutex(&gPVRSRVLock); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif goto err_release_file; if (copy_to_user(pvData, &sData, sizeof(sData))) diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync_dma_fence.c b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync_dma_fence.c index 75dc9436189a..9710840357f7 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync_dma_fence.c +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync_dma_fence.c @@ -184,7 +184,11 @@ static long PVRSyncIOCTLCreate(struct pvr_sync_timeline *psTimeline, void __user goto err_out; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_put_fd; if (copy_from_user(&sData, pvData, sizeof(sData))) @@ -241,7 +245,11 @@ static long PVRSyncIOCTLCreate(struct pvr_sync_timeline *psTimeline, void __user sData.fence = iFd; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif { goto err_destroy_fence; } @@ -274,7 +282,11 @@ static long pvr_sync_ioctl_rename(struct pvr_sync_timeline *timeline, void __use int err = 0; struct PVR_SYNC_RENAME_IOCTL_DATA data; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(user_data, sizeof(data))) { +#else if (!access_ok(VERIFY_READ, user_data, sizeof(data))) { +#endif err = -EFAULT; goto err; } @@ -394,7 +406,11 @@ PVRSyncIOCTLAlloc(struct pvr_sync_timeline *psTimeline, void __user *pvData) goto err_out; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) +#endif goto err_put_fd; if (copy_from_user(&sData, pvData, sizeof(sData))) @@ -469,7 +485,11 @@ PVRSyncIOCTLAlloc(struct pvr_sync_timeline *psTimeline, void __user *pvData) LinuxUnLockMutex(&gPVRSRVLock); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (!access_ok(pvData, sizeof(sData))) +#else if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) +#endif goto err_release_file; if (copy_to_user(pvData, &sData, sizeof(sData))) diff --git a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_uaccess.h b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_uaccess.h index 3a6383672869..a39c0df3cd6a 100644 --- a/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_uaccess.h +++ b/drivers/gpu/pvr/services4/srvkm/env/linux/pvr_uaccess.h @@ -54,7 +54,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. static inline unsigned long pvr_copy_to_user(void __user *pvTo, const void *pvFrom, unsigned long ulBytes) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (access_ok(pvTo, ulBytes)) +# else if (access_ok(VERIFY_WRITE, pvTo, ulBytes)) +# endif { return __copy_to_user(pvTo, pvFrom, ulBytes); } @@ -71,7 +75,11 @@ static inline unsigned long pvr_copy_from_user(void *pvTo, const void __user *pv * The compile time correctness checking introduced for copy_from_user in * Linux 2.6.33 isn't fully comaptible with our usage of the function. */ +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)) + if (access_ok(pvFrom, ulBytes)) +# else if (access_ok(VERIFY_READ, pvFrom, ulBytes)) +# endif { return __copy_from_user(pvTo, pvFrom, ulBytes); } |