Commit 088e0df4 authored by Michel Thierry's avatar Michel Thierry Committed by Daniel Vetter

drm/i915/gtt: Allow >= 4GB offsets in X86_32

Similar to commit c44ef60e ("drm/i915/gtt:
Allow >= 4GB sizes for vm"), i915_gem_obj_offset and i915_gem_obj_ggtt_offset
return an unsigned long, which in only 4-bytes long in 32-bit kernels.

Change return type (and other related offset variables) to u64.

Since Global GTT is always limited to 4GB, this change would not be required
in i915_gem_obj_ggtt_offset, but this is done for consistency.

v2: Remove unnecessary offset variable in do_pin, as we already have
    vma->node.start (Chris).
    Update GGTT offset too (Tvrtko).

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: default avatarMichel Thierry <michel.thierry@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent aabc95dc
...@@ -2977,13 +2977,11 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev, ...@@ -2977,13 +2977,11 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
struct dma_buf *i915_gem_prime_export(struct drm_device *dev, struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *gem_obj, int flags); struct drm_gem_object *gem_obj, int flags);
unsigned long u64 i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o, const struct i915_ggtt_view *view);
const struct i915_ggtt_view *view); u64 i915_gem_obj_offset(struct drm_i915_gem_object *o,
unsigned long struct i915_address_space *vm);
i915_gem_obj_offset(struct drm_i915_gem_object *o, static inline u64
struct i915_address_space *vm);
static inline unsigned long
i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o) i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o)
{ {
return i915_gem_obj_ggtt_offset_view(o, &i915_ggtt_view_normal); return i915_gem_obj_ggtt_offset_view(o, &i915_ggtt_view_normal);
......
...@@ -4012,15 +4012,13 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj, ...@@ -4012,15 +4012,13 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
return -EBUSY; return -EBUSY;
if (i915_vma_misplaced(vma, alignment, flags)) { if (i915_vma_misplaced(vma, alignment, flags)) {
unsigned long offset;
offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, ggtt_view) :
i915_gem_obj_offset(obj, vm);
WARN(vma->pin_count, WARN(vma->pin_count,
"bo is already pinned in %s with incorrect alignment:" "bo is already pinned in %s with incorrect alignment:"
" offset=%lx, req.alignment=%x, req.map_and_fenceable=%d," " offset=%08x %08x, req.alignment=%x, req.map_and_fenceable=%d,"
" obj->map_and_fenceable=%d\n", " obj->map_and_fenceable=%d\n",
ggtt_view ? "ggtt" : "ppgtt", ggtt_view ? "ggtt" : "ppgtt",
offset, upper_32_bits(vma->node.start),
lower_32_bits(vma->node.start),
alignment, alignment,
!!(flags & PIN_MAPPABLE), !!(flags & PIN_MAPPABLE),
obj->map_and_fenceable); obj->map_and_fenceable);
...@@ -4975,9 +4973,8 @@ void i915_gem_track_fb(struct drm_i915_gem_object *old, ...@@ -4975,9 +4973,8 @@ void i915_gem_track_fb(struct drm_i915_gem_object *old,
} }
/* All the new VM stuff */ /* All the new VM stuff */
unsigned long u64 i915_gem_obj_offset(struct drm_i915_gem_object *o,
i915_gem_obj_offset(struct drm_i915_gem_object *o, struct i915_address_space *vm)
struct i915_address_space *vm)
{ {
struct drm_i915_private *dev_priv = o->base.dev->dev_private; struct drm_i915_private *dev_priv = o->base.dev->dev_private;
struct i915_vma *vma; struct i915_vma *vma;
...@@ -4997,9 +4994,8 @@ i915_gem_obj_offset(struct drm_i915_gem_object *o, ...@@ -4997,9 +4994,8 @@ i915_gem_obj_offset(struct drm_i915_gem_object *o,
return -1; return -1;
} }
unsigned long u64 i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o, const struct i915_ggtt_view *view)
const struct i915_ggtt_view *view)
{ {
struct i915_address_space *ggtt = i915_obj_to_ggtt(o); struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
struct i915_vma *vma; struct i915_vma *vma;
......
...@@ -128,7 +128,7 @@ static void i915_write_fence_reg(struct drm_device *dev, int reg, ...@@ -128,7 +128,7 @@ static void i915_write_fence_reg(struct drm_device *dev, int reg,
WARN((i915_gem_obj_ggtt_offset(obj) & ~I915_FENCE_START_MASK) || WARN((i915_gem_obj_ggtt_offset(obj) & ~I915_FENCE_START_MASK) ||
(size & -size) != size || (size & -size) != size ||
(i915_gem_obj_ggtt_offset(obj) & (size - 1)), (i915_gem_obj_ggtt_offset(obj) & (size - 1)),
"object 0x%08lx [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n", "object 0x%08llx [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
i915_gem_obj_ggtt_offset(obj), obj->map_and_fenceable, size); i915_gem_obj_ggtt_offset(obj), obj->map_and_fenceable, size);
if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
...@@ -171,7 +171,7 @@ static void i830_write_fence_reg(struct drm_device *dev, int reg, ...@@ -171,7 +171,7 @@ static void i830_write_fence_reg(struct drm_device *dev, int reg,
WARN((i915_gem_obj_ggtt_offset(obj) & ~I830_FENCE_START_MASK) || WARN((i915_gem_obj_ggtt_offset(obj) & ~I830_FENCE_START_MASK) ||
(size & -size) != size || (size & -size) != size ||
(i915_gem_obj_ggtt_offset(obj) & (size - 1)), (i915_gem_obj_ggtt_offset(obj) & (size - 1)),
"object 0x%08lx not 512K or pot-size 0x%08x aligned\n", "object 0x%08llx not 512K or pot-size 0x%08x aligned\n",
i915_gem_obj_ggtt_offset(obj), size); i915_gem_obj_ggtt_offset(obj), size);
pitch_val = obj->stride / 128; pitch_val = obj->stride / 128;
......
...@@ -2543,9 +2543,9 @@ static void i915_gtt_color_adjust(struct drm_mm_node *node, ...@@ -2543,9 +2543,9 @@ static void i915_gtt_color_adjust(struct drm_mm_node *node,
} }
static int i915_gem_setup_global_gtt(struct drm_device *dev, static int i915_gem_setup_global_gtt(struct drm_device *dev,
unsigned long start, u64 start,
unsigned long mappable_end, u64 mappable_end,
unsigned long end) u64 end)
{ {
/* Let GEM Manage all of the aperture. /* Let GEM Manage all of the aperture.
* *
...@@ -2584,7 +2584,7 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev, ...@@ -2584,7 +2584,7 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
struct i915_vma *vma = i915_gem_obj_to_vma(obj, ggtt_vm); struct i915_vma *vma = i915_gem_obj_to_vma(obj, ggtt_vm);
DRM_DEBUG_KMS("reserving preallocated space: %lx + %zx\n", DRM_DEBUG_KMS("reserving preallocated space: %llx + %zx\n",
i915_gem_obj_ggtt_offset(obj), obj->base.size); i915_gem_obj_ggtt_offset(obj), obj->base.size);
WARN_ON(i915_gem_obj_ggtt_bound(obj)); WARN_ON(i915_gem_obj_ggtt_bound(obj));
......
...@@ -149,7 +149,7 @@ struct i915_ggtt_view { ...@@ -149,7 +149,7 @@ struct i915_ggtt_view {
union { union {
struct { struct {
unsigned long offset; u64 offset;
unsigned int size; unsigned int size;
} partial; } partial;
} params; } params;
......
...@@ -295,7 +295,7 @@ static int intelfb_create(struct drm_fb_helper *helper, ...@@ -295,7 +295,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
/* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08lx, bo %p\n", DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08llx, bo %p\n",
fb->width, fb->height, fb->width, fb->height,
i915_gem_obj_ggtt_offset(obj), obj); i915_gem_obj_ggtt_offset(obj), obj);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment