aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Widawsky <benjamin.widawsky@intel.com>2014-04-28 20:18:28 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-05-05 10:04:23 -0400
commitd9ceb957fd97836c7fb0e403062e68ad2f737021 (patch)
tree78cadbb7fee22b6511c7670e07c6985ea9e7ccc7
parent9bcb144c83d4df12c8150352fa876aeff289e39c (diff)
drm/i915: Support 64b relocations
All the rest of the code to enable this is in my branch. Without my branch, hitting > 32b offsets is impossible. The code has always "supported" 64b, but it's never actually been run of tested. This change doesn't actually fix anything. [1] I am not sure why X won't work yet. I do not get hangs or obvious errors. There are 3 fixes grouped together here. First is to remove the hardcoded 0 for the upper dword of the relocation. The next fix is to use a 64b value for target_offset. The final fix is to not directly apply target_offset to reloc->delta. reloc->delta is part of ABI, and so we cannot change it. As it stands, 32b is enough to represent everything we're interested in representing anyway. The main problem is, we cannot add greater than 32b values to it directly. [1] Almost all of intel-gpu-tools is not yet ready to test 64b relocations. There are a few places that expect 32b values for offsets and these all won't work. Cc: Rafael Barbalho <rafael.barbalho@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 3c4e77024dcd..47fe8ecef135 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -262,10 +262,12 @@ static inline int use_cpu_reloc(struct drm_i915_gem_object *obj)
262 262
263static int 263static int
264relocate_entry_cpu(struct drm_i915_gem_object *obj, 264relocate_entry_cpu(struct drm_i915_gem_object *obj,
265 struct drm_i915_gem_relocation_entry *reloc) 265 struct drm_i915_gem_relocation_entry *reloc,
266 uint64_t target_offset)
266{ 267{
267 struct drm_device *dev = obj->base.dev; 268 struct drm_device *dev = obj->base.dev;
268 uint32_t page_offset = offset_in_page(reloc->offset); 269 uint32_t page_offset = offset_in_page(reloc->offset);
270 uint64_t delta = reloc->delta + target_offset;
269 char *vaddr; 271 char *vaddr;
270 int ret; 272 int ret;
271 273
@@ -275,7 +277,7 @@ relocate_entry_cpu(struct drm_i915_gem_object *obj,
275 277
276 vaddr = kmap_atomic(i915_gem_object_get_page(obj, 278 vaddr = kmap_atomic(i915_gem_object_get_page(obj,
277 reloc->offset >> PAGE_SHIFT)); 279 reloc->offset >> PAGE_SHIFT));
278 *(uint32_t *)(vaddr + page_offset) = reloc->delta; 280 *(uint32_t *)(vaddr + page_offset) = lower_32_bits(delta);
279 281
280 if (INTEL_INFO(dev)->gen >= 8) { 282 if (INTEL_INFO(dev)->gen >= 8) {
281 page_offset = offset_in_page(page_offset + sizeof(uint32_t)); 283 page_offset = offset_in_page(page_offset + sizeof(uint32_t));
@@ -286,7 +288,7 @@ relocate_entry_cpu(struct drm_i915_gem_object *obj,
286 (reloc->offset + sizeof(uint32_t)) >> PAGE_SHIFT)); 288 (reloc->offset + sizeof(uint32_t)) >> PAGE_SHIFT));
287 } 289 }
288 290
289 *(uint32_t *)(vaddr + page_offset) = 0; 291 *(uint32_t *)(vaddr + page_offset) = upper_32_bits(delta);
290 } 292 }
291 293
292 kunmap_atomic(vaddr); 294 kunmap_atomic(vaddr);
@@ -296,10 +298,12 @@ relocate_entry_cpu(struct drm_i915_gem_object *obj,
296 298
297static int 299static int
298relocate_entry_gtt(struct drm_i915_gem_object *obj, 300relocate_entry_gtt(struct drm_i915_gem_object *obj,
299 struct drm_i915_gem_relocation_entry *reloc) 301 struct drm_i915_gem_relocation_entry *reloc,
302 uint64_t target_offset)
300{ 303{
301 struct drm_device *dev = obj->base.dev; 304 struct drm_device *dev = obj->base.dev;
302 struct drm_i915_private *dev_priv = dev->dev_private; 305 struct drm_i915_private *dev_priv = dev->dev_private;
306 uint64_t delta = reloc->delta + target_offset;
303 uint32_t __iomem *reloc_entry; 307 uint32_t __iomem *reloc_entry;
304 void __iomem *reloc_page; 308 void __iomem *reloc_page;
305 int ret; 309 int ret;
@@ -318,7 +322,7 @@ relocate_entry_gtt(struct drm_i915_gem_object *obj,
318 reloc->offset & PAGE_MASK); 322 reloc->offset & PAGE_MASK);
319 reloc_entry = (uint32_t __iomem *) 323 reloc_entry = (uint32_t __iomem *)
320 (reloc_page + offset_in_page(reloc->offset)); 324 (reloc_page + offset_in_page(reloc->offset));
321 iowrite32(reloc->delta, reloc_entry); 325 iowrite32(lower_32_bits(delta), reloc_entry);
322 326
323 if (INTEL_INFO(dev)->gen >= 8) { 327 if (INTEL_INFO(dev)->gen >= 8) {
324 reloc_entry += 1; 328 reloc_entry += 1;
@@ -331,7 +335,7 @@ relocate_entry_gtt(struct drm_i915_gem_object *obj,
331 reloc_entry = reloc_page; 335 reloc_entry = reloc_page;
332 } 336 }
333 337
334 iowrite32(0, reloc_entry); 338 iowrite32(upper_32_bits(delta), reloc_entry);
335 } 339 }
336 340
337 io_mapping_unmap_atomic(reloc_page); 341 io_mapping_unmap_atomic(reloc_page);
@@ -348,7 +352,7 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
348 struct drm_gem_object *target_obj; 352 struct drm_gem_object *target_obj;
349 struct drm_i915_gem_object *target_i915_obj; 353 struct drm_i915_gem_object *target_i915_obj;
350 struct i915_vma *target_vma; 354 struct i915_vma *target_vma;
351 uint32_t target_offset; 355 uint64_t target_offset;
352 int ret; 356 int ret;
353 357
354 /* we've already hold a reference to all valid objects */ 358 /* we've already hold a reference to all valid objects */
@@ -426,11 +430,10 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
426 if (obj->active && in_atomic()) 430 if (obj->active && in_atomic())
427 return -EFAULT; 431 return -EFAULT;
428 432
429 reloc->delta += target_offset;
430 if (use_cpu_reloc(obj)) 433 if (use_cpu_reloc(obj))
431 ret = relocate_entry_cpu(obj, reloc); 434 ret = relocate_entry_cpu(obj, reloc, target_offset);
432 else 435 else
433 ret = relocate_entry_gtt(obj, reloc); 436 ret = relocate_entry_gtt(obj, reloc, target_offset);
434 437
435 if (ret) 438 if (ret)
436 return ret; 439 return ret;