forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/qxl/qxl_ioctl.c
....@@ -23,6 +23,9 @@
2323 * Alon Levy
2424 */
2525
26
+#include <linux/pci.h>
27
+#include <linux/uaccess.h>
28
+
2629 #include "qxl_drv.h"
2730 #include "qxl_object.h"
2831
....@@ -33,7 +36,7 @@
3336 static int qxl_alloc_ioctl(struct drm_device *dev, void *data,
3437 struct drm_file *file_priv)
3538 {
36
- struct qxl_device *qdev = dev->dev_private;
39
+ struct qxl_device *qdev = to_qxl(dev);
3740 struct drm_qxl_alloc *qxl_alloc = data;
3841 int ret;
3942 struct qxl_bo *qobj;
....@@ -61,7 +64,7 @@
6164 static int qxl_map_ioctl(struct drm_device *dev, void *data,
6265 struct drm_file *file_priv)
6366 {
64
- struct qxl_device *qdev = dev->dev_private;
67
+ struct qxl_device *qdev = to_qxl(dev);
6568 struct drm_qxl_map *qxl_map = data;
6669
6770 return qxl_mode_dumb_mmap(file_priv, &qdev->ddev, qxl_map->handle,
....@@ -85,11 +88,12 @@
8588 apply_reloc(struct qxl_device *qdev, struct qxl_reloc_info *info)
8689 {
8790 void *reloc_page;
88
- reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
91
+
92
+ reloc_page = qxl_bo_kmap_local_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
8993 *(uint64_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = qxl_bo_physical_address(qdev,
9094 info->src_bo,
9195 info->src_offset);
92
- qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page);
96
+ qxl_bo_kunmap_local_page(qdev, info->dst_bo, reloc_page);
9397 }
9498
9599 static void
....@@ -101,9 +105,9 @@
101105 if (info->src_bo && !info->src_bo->is_primary)
102106 id = info->src_bo->surface_id;
103107
104
- reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
108
+ reloc_page = qxl_bo_kmap_local_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK);
105109 *(uint32_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = id;
106
- qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page);
110
+ qxl_bo_kunmap_local_page(qdev, info->dst_bo, reloc_page);
107111 }
108112
109113 /* return holding the reference to this object */
....@@ -121,7 +125,7 @@
121125 qobj = gem_to_qxl_bo(gobj);
122126
123127 ret = qxl_release_list_add(release, qobj);
124
- drm_gem_object_put_unlocked(gobj);
128
+ drm_gem_object_put(gobj);
125129 if (ret)
126130 return ret;
127131
....@@ -145,7 +149,6 @@
145149 struct qxl_bo *cmd_bo;
146150 void *fb_cmd;
147151 int i, ret, num_relocs;
148
- int unwritten;
149152
150153 switch (cmd->type) {
151154 case QXL_CMD_DRAW:
....@@ -162,8 +165,7 @@
162165 if (cmd->command_size > PAGE_SIZE - sizeof(union qxl_release_info))
163166 return -EINVAL;
164167
165
- if (!access_ok(VERIFY_READ,
166
- u64_to_user_ptr(cmd->command),
168
+ if (!access_ok(u64_to_user_ptr(cmd->command),
167169 cmd->command_size))
168170 return -EFAULT;
169171
....@@ -182,20 +184,21 @@
182184 goto out_free_reloc;
183185
184186 /* TODO copy slow path code from i915 */
185
- fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK));
186
- unwritten = __copy_from_user_inatomic_nocache
187
- (fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_MASK),
188
- u64_to_user_ptr(cmd->command), cmd->command_size);
187
+ fb_cmd = qxl_bo_kmap_local_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK));
189188
190
- {
189
+ if (copy_from_user(fb_cmd + sizeof(union qxl_release_info) +
190
+ (release->release_offset & ~PAGE_MASK),
191
+ u64_to_user_ptr(cmd->command), cmd->command_size)) {
192
+ ret = -EFAULT;
193
+ } else {
191194 struct qxl_drawable *draw = fb_cmd;
195
+
192196 draw->mm_time = qdev->rom->mm_clock;
193197 }
194198
195
- qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd);
196
- if (unwritten) {
197
- DRM_ERROR("got unwritten %d\n", unwritten);
198
- ret = -EFAULT;
199
+ qxl_bo_kunmap_local_page(qdev, cmd_bo, fb_cmd);
200
+ if (ret) {
201
+ DRM_ERROR("copy from user failed %d\n", ret);
199202 goto out_free_release;
200203 }
201204
....@@ -272,7 +275,7 @@
272275 static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
273276 struct drm_file *file_priv)
274277 {
275
- struct qxl_device *qdev = dev->dev_private;
278
+ struct qxl_device *qdev = to_qxl(dev);
276279 struct drm_qxl_execbuffer *execbuffer = data;
277280 struct drm_qxl_command user_cmd;
278281 int cmd_num;
....@@ -297,7 +300,7 @@
297300 static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
298301 struct drm_file *file)
299302 {
300
- struct qxl_device *qdev = dev->dev_private;
303
+ struct qxl_device *qdev = to_qxl(dev);
301304 struct drm_qxl_update_area *update_area = data;
302305 struct qxl_rect area = {.left = update_area->left,
303306 .top = update_area->top,
....@@ -318,7 +321,7 @@
318321
319322 qobj = gem_to_qxl_bo(gobj);
320323
321
- ret = qxl_bo_reserve(qobj, false);
324
+ ret = qxl_bo_reserve(qobj);
322325 if (ret)
323326 goto out;
324327
....@@ -340,14 +343,14 @@
340343 qxl_bo_unreserve(qobj);
341344
342345 out:
343
- drm_gem_object_put_unlocked(gobj);
346
+ drm_gem_object_put(gobj);
344347 return ret;
345348 }
346349
347350 static int qxl_getparam_ioctl(struct drm_device *dev, void *data,
348351 struct drm_file *file_priv)
349352 {
350
- struct qxl_device *qdev = dev->dev_private;
353
+ struct qxl_device *qdev = to_qxl(dev);
351354 struct drm_qxl_getparam *param = data;
352355
353356 switch (param->param) {
....@@ -366,7 +369,7 @@
366369 static int qxl_clientcap_ioctl(struct drm_device *dev, void *data,
367370 struct drm_file *file_priv)
368371 {
369
- struct qxl_device *qdev = dev->dev_private;
372
+ struct qxl_device *qdev = to_qxl(dev);
370373 struct drm_qxl_clientcap *param = data;
371374 int byte, idx;
372375
....@@ -387,7 +390,7 @@
387390 static int qxl_alloc_surf_ioctl(struct drm_device *dev, void *data,
388391 struct drm_file *file)
389392 {
390
- struct qxl_device *qdev = dev->dev_private;
393
+ struct qxl_device *qdev = to_qxl(dev);
391394 struct drm_qxl_alloc_surf *param = data;
392395 struct qxl_bo *qobj;
393396 int handle;