| From d052bf6eac12777b408ee1ce28a52d3af056234b Mon Sep 17 00:00:00 2001 |
| From: Rodrigo Vivi <rodrigo.vivi@gmail.com> |
| Date: Wed, 28 Aug 2013 16:45:46 -0300 |
| Subject: drm/i915: Report enabled slices on Haswell GT3 |
| |
| Batchbuffers constructed by userspace can conditionalise their URB |
| allocations through the use of the MI_SET_PREDICATE command. This |
| command can read the MI_PREDICATE_RESULT_2 register to see how many |
| slices are enabled on GT3, and by virtue of the result, scale their |
| memory allocations to fit enabled memory. |
| |
| Of course, this only works if the kernel sets the appropriate bit in the |
| register first. |
| |
| v2: Better commit subject and message by Chris Wilson. |
| |
| Cc: Chris Wilson <chris@chris-wilson.co.uk> |
| Credits-to: Yejun Guo <yejun.guo@intel.com> |
| Signed-off-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> |
| Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 9435373ef8870e0a84b6fec0ad89b952bf3097fa) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_drv.h | 2 ++ |
| drivers/gpu/drm/i915/i915_gem.c | 5 +++++ |
| drivers/gpu/drm/i915/i915_reg.h | 5 +++++ |
| 3 files changed, 12 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
| index 2cf9dabbfe5d..e52648927475 100644 |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1603,6 +1603,8 @@ struct drm_i915_file_private { |
| ((dev)->pci_device & 0xFF00) == 0x0C00) |
| #define IS_ULT(dev) (IS_HASWELL(dev) && \ |
| ((dev)->pci_device & 0xFF00) == 0x0A00) |
| +#define IS_HSW_GT3(dev) (IS_HASWELL(dev) && \ |
| + ((dev)->pci_device & 0x00F0) == 0x0020) |
| |
| /* |
| * The genX designation typically refers to the render engine, so render |
| diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
| index d57368d5fc1d..2d4b72ab1229 100644 |
| --- a/drivers/gpu/drm/i915/i915_gem.c |
| +++ b/drivers/gpu/drm/i915/i915_gem.c |
| @@ -4331,6 +4331,11 @@ i915_gem_init_hw(struct drm_device *dev) |
| if (dev_priv->ellc_size) |
| I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf)); |
| |
| + if (IS_HSW_GT3(dev)) |
| + I915_WRITE(MI_PREDICATE_RESULT_2, LOWER_SLICE_ENABLED); |
| + else |
| + I915_WRITE(MI_PREDICATE_RESULT_2, LOWER_SLICE_DISABLED); |
| + |
| if (HAS_PCH_NOP(dev)) { |
| u32 temp = I915_READ(GEN7_MSG_CTL); |
| temp &= ~(WAIT_FOR_PCH_FLR_ACK | WAIT_FOR_PCH_RESET_ACK); |
| diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
| index f626a16a14fa..c7f2da36f4a8 100644 |
| --- a/drivers/gpu/drm/i915/i915_reg.h |
| +++ b/drivers/gpu/drm/i915/i915_reg.h |
| @@ -264,6 +264,11 @@ |
| #define MI_SEMAPHORE_SYNC_VVE (1<<16) /* VECS wait for VCS (VEVSYNC) */ |
| #define MI_SEMAPHORE_SYNC_RVE (2<<16) /* VECS wait for RCS (VERSYNC) */ |
| #define MI_SEMAPHORE_SYNC_INVALID (3<<16) |
| + |
| +#define MI_PREDICATE_RESULT_2 (0x2214) |
| +#define LOWER_SLICE_ENABLED (1<<0) |
| +#define LOWER_SLICE_DISABLED (0<<0) |
| + |
| /* |
| * 3D instructions used by the kernel |
| */ |
| -- |
| 1.8.5.rc3 |
| |