diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-08-07 06:01:39 -0400 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-08-09 14:24:36 -0400 |
commit | 6eeefaf3c86b8937db8ad930c48bfb592fc5e32e (patch) | |
tree | c73c07925f9bc2d23d62271e95fe083a764a3640 /drivers | |
parent | 560b85bb750c3c539641993dd508b61260c9e874 (diff) |
drm/i915: Apply i830 errata for cursor alignment
i830 requires 32bpp cursors to be aligned to 16KB, so we have to expose
the alignment parameter to i915_gem_attach_phys_object().
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 3 |
4 files changed, 14 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 4b0ffb6c5561..8df6ac735187 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -1000,7 +1000,9 @@ int i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, | |||
1000 | int write); | 1000 | int write); |
1001 | int i915_gem_object_set_to_display_plane(struct drm_gem_object *obj); | 1001 | int i915_gem_object_set_to_display_plane(struct drm_gem_object *obj); |
1002 | int i915_gem_attach_phys_object(struct drm_device *dev, | 1002 | int i915_gem_attach_phys_object(struct drm_device *dev, |
1003 | struct drm_gem_object *obj, int id); | 1003 | struct drm_gem_object *obj, |
1004 | int id, | ||
1005 | int align); | ||
1004 | void i915_gem_detach_phys_object(struct drm_device *dev, | 1006 | void i915_gem_detach_phys_object(struct drm_device *dev, |
1005 | struct drm_gem_object *obj); | 1007 | struct drm_gem_object *obj); |
1006 | void i915_gem_free_all_phys_object(struct drm_device *dev); | 1008 | void i915_gem_free_all_phys_object(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 41306217bd7a..b4b25e17d4e9 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -4674,7 +4674,7 @@ i915_gem_load(struct drm_device *dev) | |||
4674 | * e.g. for cursor + overlay regs | 4674 | * e.g. for cursor + overlay regs |
4675 | */ | 4675 | */ |
4676 | int i915_gem_init_phys_object(struct drm_device *dev, | 4676 | int i915_gem_init_phys_object(struct drm_device *dev, |
4677 | int id, int size) | 4677 | int id, int size, int align) |
4678 | { | 4678 | { |
4679 | drm_i915_private_t *dev_priv = dev->dev_private; | 4679 | drm_i915_private_t *dev_priv = dev->dev_private; |
4680 | struct drm_i915_gem_phys_object *phys_obj; | 4680 | struct drm_i915_gem_phys_object *phys_obj; |
@@ -4689,7 +4689,7 @@ int i915_gem_init_phys_object(struct drm_device *dev, | |||
4689 | 4689 | ||
4690 | phys_obj->id = id; | 4690 | phys_obj->id = id; |
4691 | 4691 | ||
4692 | phys_obj->handle = drm_pci_alloc(dev, size, 0); | 4692 | phys_obj->handle = drm_pci_alloc(dev, size, align); |
4693 | if (!phys_obj->handle) { | 4693 | if (!phys_obj->handle) { |
4694 | ret = -ENOMEM; | 4694 | ret = -ENOMEM; |
4695 | goto kfree_obj; | 4695 | goto kfree_obj; |
@@ -4771,7 +4771,9 @@ out: | |||
4771 | 4771 | ||
4772 | int | 4772 | int |
4773 | i915_gem_attach_phys_object(struct drm_device *dev, | 4773 | i915_gem_attach_phys_object(struct drm_device *dev, |
4774 | struct drm_gem_object *obj, int id) | 4774 | struct drm_gem_object *obj, |
4775 | int id, | ||
4776 | int align) | ||
4775 | { | 4777 | { |
4776 | drm_i915_private_t *dev_priv = dev->dev_private; | 4778 | drm_i915_private_t *dev_priv = dev->dev_private; |
4777 | struct drm_i915_gem_object *obj_priv; | 4779 | struct drm_i915_gem_object *obj_priv; |
@@ -4790,11 +4792,10 @@ i915_gem_attach_phys_object(struct drm_device *dev, | |||
4790 | i915_gem_detach_phys_object(dev, obj); | 4792 | i915_gem_detach_phys_object(dev, obj); |
4791 | } | 4793 | } |
4792 | 4794 | ||
4793 | |||
4794 | /* create a new object */ | 4795 | /* create a new object */ |
4795 | if (!dev_priv->mm.phys_objs[id - 1]) { | 4796 | if (!dev_priv->mm.phys_objs[id - 1]) { |
4796 | ret = i915_gem_init_phys_object(dev, id, | 4797 | ret = i915_gem_init_phys_object(dev, id, |
4797 | obj->size); | 4798 | obj->size, align); |
4798 | if (ret) { | 4799 | if (ret) { |
4799 | DRM_ERROR("failed to init phys object %d size: %zu\n", id, obj->size); | 4800 | DRM_ERROR("failed to init phys object %d size: %zu\n", id, obj->size); |
4800 | goto out; | 4801 | goto out; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 6490d8b3867f..53f3a98cc1ae 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -4375,8 +4375,10 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
4375 | 4375 | ||
4376 | addr = obj_priv->gtt_offset; | 4376 | addr = obj_priv->gtt_offset; |
4377 | } else { | 4377 | } else { |
4378 | int align = IS_I830(dev) ? 16 * 1024 : 256; | ||
4378 | ret = i915_gem_attach_phys_object(dev, bo, | 4379 | ret = i915_gem_attach_phys_object(dev, bo, |
4379 | (intel_crtc->pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1); | 4380 | (intel_crtc->pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1, |
4381 | align); | ||
4380 | if (ret) { | 4382 | if (ret) { |
4381 | DRM_ERROR("failed to attach phys object\n"); | 4383 | DRM_ERROR("failed to attach phys object\n"); |
4382 | goto fail_locked; | 4384 | goto fail_locked; |
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index 9ae61aa05a1f..4f00390d7c61 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
@@ -1367,7 +1367,8 @@ void intel_setup_overlay(struct drm_device *dev) | |||
1367 | overlay->flip_addr = overlay->reg_bo->gtt_offset; | 1367 | overlay->flip_addr = overlay->reg_bo->gtt_offset; |
1368 | } else { | 1368 | } else { |
1369 | ret = i915_gem_attach_phys_object(dev, reg_bo, | 1369 | ret = i915_gem_attach_phys_object(dev, reg_bo, |
1370 | I915_GEM_PHYS_OVERLAY_REGS); | 1370 | I915_GEM_PHYS_OVERLAY_REGS, |
1371 | 0); | ||
1371 | if (ret) { | 1372 | if (ret) { |
1372 | DRM_ERROR("failed to attach phys overlay regs\n"); | 1373 | DRM_ERROR("failed to attach phys overlay regs\n"); |
1373 | goto out_free_bo; | 1374 | goto out_free_bo; |