aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Protsenko <semen.protsenko@linaro.org>2019-05-16 02:24:52 +0300
committerSam Protsenko <semen.protsenko@linaro.org>2019-05-25 01:40:28 +0300
commit7244da2f2bbc98071f525bd823c1ef6e3229c8b2 (patch)
tree8c64c2511a0dfba402ad52a213a92c1de88e962f
parenta5272d6d898ea460fc2a449d7a29120ebefa282d (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>
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/mmap.c13
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/osfunc.c5
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/pvr_fence.c28
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/pvr_linux_fence.c4
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync.c24
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/pvr_sync_dma_fence.c20
-rw-r--r--drivers/gpu/pvr/services4/srvkm/env/linux/pvr_uaccess.h8
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);
}