Rev 4392 | Rev 4560 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4392 | Rev 4539 | ||
---|---|---|---|
Line 188... | Line 188... | ||
188 | 188 | ||
189 | static int |
189 | static int |
190 | relocate_entry_cpu(struct drm_i915_gem_object *obj, |
190 | relocate_entry_cpu(struct drm_i915_gem_object *obj, |
191 | struct drm_i915_gem_relocation_entry *reloc) |
191 | struct drm_i915_gem_relocation_entry *reloc) |
- | 192 | { |
|
- | 193 | struct drm_device *dev = obj->base.dev; |
|
192 | { |
194 | struct drm_i915_private *dev_priv = dev->dev_private; |
193 | uint32_t page_offset = offset_in_page(reloc->offset); |
195 | uint32_t page_offset = offset_in_page(reloc->offset); |
194 | char *vaddr; |
196 | char *vaddr; |
Line 195... | Line 197... | ||
195 | int ret = -EINVAL; |
197 | int ret = -EINVAL; |
196 | 198 | ||
197 | ret = i915_gem_object_set_to_cpu_domain(obj, 1); |
199 | ret = i915_gem_object_set_to_cpu_domain(obj, 1); |
Line 198... | Line 200... | ||
198 | if (ret) |
200 | if (ret) |
199 | return ret; |
201 | return ret; |
200 | 202 | ||
201 | vaddr = (char *)MapIoMem((addr_t)i915_gem_object_get_page(obj, |
- | |
Line 202... | Line 203... | ||
202 | reloc->offset >> PAGE_SHIFT), 4096, 3); |
203 | vaddr = dev_priv->gtt.mappable+4096; |
203 | *(uint32_t *)(vaddr + page_offset) = reloc->delta; |
204 | MapPage(vaddr,(addr_t)i915_gem_object_get_page(obj,reloc->offset >> PAGE_SHIFT), PG_SW); |
Line 204... | Line 205... | ||
204 | FreeKernelSpace(vaddr); |
205 | *(uint32_t *)(vaddr + page_offset) = reloc->delta; |
Line 224... | Line 225... | ||
224 | if (ret) |
225 | if (ret) |
225 | return ret; |
226 | return ret; |
Line 226... | Line 227... | ||
226 | 227 | ||
227 | /* Map the page containing the relocation we're going to perform. */ |
228 | /* Map the page containing the relocation we're going to perform. */ |
228 | reloc->offset += i915_gem_obj_ggtt_offset(obj); |
229 | reloc->offset += i915_gem_obj_ggtt_offset(obj); |
229 | reloc_page = (void*)MapIoMem(dev_priv->gtt.mappable_base + |
230 | MapPage(dev_priv->gtt.mappable,dev_priv->gtt.mappable_base + |
- | 231 | (reloc->offset & PAGE_MASK), PG_SW); |
|
230 | (reloc->offset & PAGE_MASK), 4096, 0x18|3); |
232 | reloc_page = dev_priv->gtt.mappable; |
231 | reloc_entry = (uint32_t __iomem *) |
233 | reloc_entry = (uint32_t __iomem *) |
232 | (reloc_page + offset_in_page(reloc->offset)); |
234 | (reloc_page + offset_in_page(reloc->offset)); |
233 | iowrite32(reloc->delta, reloc_entry); |
- | |
Line 234... | Line 235... | ||
234 | FreeKernelSpace(reloc_page); |
235 | iowrite32(reloc->delta, reloc_entry); |
235 | 236 | ||
Line 236... | Line 237... | ||
236 | return 0; |
237 | return 0; |
Line 341... | Line 342... | ||
341 | struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(64)]; |
342 | struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(64)]; |
342 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
343 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
343 | struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; |
344 | struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; |
344 | int remain, ret; |
345 | int remain, ret; |
Line 345... | Line 346... | ||
345 | 346 | ||
Line 346... | Line 347... | ||
346 | user_relocs = (void __user *)(uintptr_t)entry->relocs_ptr; |
347 | user_relocs = to_user_ptr(entry->relocs_ptr); |
347 | 348 | ||
348 | remain = entry->relocation_count; |
349 | remain = entry->relocation_count; |
349 | while (remain) { |
350 | while (remain) { |
Line 665... | Line 666... | ||
665 | for (i = 0; i < count; i++) { |
666 | for (i = 0; i < count; i++) { |
666 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
667 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
667 | u64 invalid_offset = (u64)-1; |
668 | u64 invalid_offset = (u64)-1; |
668 | int j; |
669 | int j; |
Line 669... | Line 670... | ||
669 | 670 | ||
Line 670... | Line 671... | ||
670 | user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr; |
671 | user_relocs = to_user_ptr(exec[i].relocs_ptr); |
671 | 672 | ||
672 | if (copy_from_user(reloc+total, user_relocs, |
673 | if (copy_from_user(reloc+total, user_relocs, |
673 | exec[i].relocation_count * sizeof(*reloc))) { |
674 | exec[i].relocation_count * sizeof(*reloc))) { |
Line 1258... | Line 1259... | ||
1258 | DRM_DEBUG("Failed to allocate exec list for %d buffers\n", |
1259 | DRM_DEBUG("Failed to allocate exec list for %d buffers\n", |
1259 | args->buffer_count); |
1260 | args->buffer_count); |
1260 | return -ENOMEM; |
1261 | return -ENOMEM; |
1261 | } |
1262 | } |
1262 | ret = copy_from_user(exec2_list, |
1263 | ret = copy_from_user(exec2_list, |
1263 | (struct drm_i915_relocation_entry __user *) |
- | |
1264 | (uintptr_t) args->buffers_ptr, |
1264 | to_user_ptr(args->buffers_ptr), |
1265 | sizeof(*exec2_list) * args->buffer_count); |
1265 | sizeof(*exec2_list) * args->buffer_count); |
1266 | if (ret != 0) { |
1266 | if (ret != 0) { |
1267 | DRM_DEBUG("copy %d exec entries failed %d\n", |
1267 | DRM_DEBUG("copy %d exec entries failed %d\n", |
1268 | args->buffer_count, ret); |
1268 | args->buffer_count, ret); |
1269 | kfree(exec2_list); |
1269 | kfree(exec2_list); |
Line 1273... | Line 1273... | ||
1273 | 1273 | ||
1274 | ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list, |
1274 | ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list, |
1275 | &dev_priv->gtt.base); |
1275 | &dev_priv->gtt.base); |
1276 | if (!ret) { |
1276 | if (!ret) { |
1277 | /* Copy the new buffer offsets back to the user's exec list. */ |
1277 | /* Copy the new buffer offsets back to the user's exec list. */ |
1278 | ret = copy_to_user((void __user *)(uintptr_t)args->buffers_ptr, |
1278 | ret = copy_to_user(to_user_ptr(args->buffers_ptr), |
1279 | exec2_list, |
1279 | exec2_list, |
1280 | sizeof(*exec2_list) * args->buffer_count); |
1280 | sizeof(*exec2_list) * args->buffer_count); |
1281 | if (ret) { |
1281 | if (ret) { |
1282 | ret = -EFAULT; |
1282 | ret = -EFAULT; |