diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 54 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 29 | 
2 files changed, 37 insertions, 46 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 4b862f36690..083644ef8f3 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1325,10 +1325,30 @@ extern void intel_display_print_error_state(struct seq_file *m,  		LOCK_TEST_WITH_RETURN(dev, file);			\  } while (0) +/* On SNB platform, before reading ring registers forcewake bit + * must be set to prevent GT core from power down and stale values being + * returned. + */ +void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); +void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); +void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); + +/* We give fast paths for the really cool registers */ +#define NEEDS_FORCE_WAKE(dev_priv, reg) \ +	(((dev_priv)->info->gen >= 6) && \ +	((reg) < 0x40000) && \ +	((reg) != FORCEWAKE))  #define __i915_read(x, y) \  static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ -	u##x val = read##y(dev_priv->regs + reg); \ +	u##x val = 0; \ +	if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ +		__gen6_gt_force_wake_get(dev_priv); \ +		val = read##y(dev_priv->regs + reg); \ +		__gen6_gt_force_wake_put(dev_priv); \ +	} else { \ +		val = read##y(dev_priv->regs + reg); \ +	} \  	trace_i915_reg_rw(false, reg, val, sizeof(val)); \  	return val; \  } @@ -1341,6 +1361,9 @@ __i915_read(64, q)  #define __i915_write(x, y) \  static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \  	trace_i915_reg_rw(true, reg, val, sizeof(val)); \ +	if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ +		__gen6_gt_wait_for_fifo(dev_priv); \ +	} \  	write##y(val, dev_priv->regs + reg); \  }  __i915_write(8, b) @@ -1369,33 +1392,4 @@ __i915_write(64, q)  #define POSTING_READ16(reg)	(void)I915_READ16_NOTRACE(reg) -/* On SNB platform, before reading ring registers forcewake bit - * must be set to prevent GT core from power down and stale values being - * returned. - */ -void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); -void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); -void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); - -static inline u32 i915_gt_read(struct drm_i915_private *dev_priv, u32 reg) -{ -	u32 val; - -	if (dev_priv->info->gen >= 6) { -		__gen6_gt_force_wake_get(dev_priv); -		val = I915_READ(reg); -		__gen6_gt_force_wake_put(dev_priv); -	} else -		val = I915_READ(reg); - -	return val; -} - -static inline void i915_gt_write(struct drm_i915_private *dev_priv, -				u32 reg, u32 val) -{ -	if (dev_priv->info->gen >= 6) -		__gen6_gt_wait_for_fifo(dev_priv); -	I915_WRITE(reg, val); -}  #endif diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 16cb125eb11..c0e0ee63fbf 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h @@ -14,27 +14,24 @@ struct  intel_hw_status_page {  	struct		drm_i915_gem_object *obj;  }; -#define I915_RING_READ(reg) i915_gt_read(dev_priv, reg) -#define I915_RING_WRITE(reg, val) i915_gt_write(dev_priv, reg, val) +#define I915_READ_TAIL(ring) I915_READ(RING_TAIL((ring)->mmio_base)) +#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val) -#define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) -#define I915_WRITE_TAIL(ring, val) I915_RING_WRITE(RING_TAIL((ring)->mmio_base), val) +#define I915_READ_START(ring) I915_READ(RING_START((ring)->mmio_base)) +#define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val) -#define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) -#define I915_WRITE_START(ring, val) I915_RING_WRITE(RING_START((ring)->mmio_base), val) +#define I915_READ_HEAD(ring)  I915_READ(RING_HEAD((ring)->mmio_base)) +#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val) -#define I915_READ_HEAD(ring)  I915_RING_READ(RING_HEAD((ring)->mmio_base)) -#define I915_WRITE_HEAD(ring, val) I915_RING_WRITE(RING_HEAD((ring)->mmio_base), val) +#define I915_READ_CTL(ring) I915_READ(RING_CTL((ring)->mmio_base)) +#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val) -#define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) -#define I915_WRITE_CTL(ring, val) I915_RING_WRITE(RING_CTL((ring)->mmio_base), val) +#define I915_READ_IMR(ring) I915_READ(RING_IMR((ring)->mmio_base)) +#define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val) -#define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) -#define I915_WRITE_IMR(ring, val) I915_RING_WRITE(RING_IMR((ring)->mmio_base), val) - -#define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base)) -#define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base)) -#define I915_READ_SYNC_1(ring) I915_RING_READ(RING_SYNC_1((ring)->mmio_base)) +#define I915_READ_NOPID(ring) I915_READ(RING_NOPID((ring)->mmio_base)) +#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base)) +#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base))  struct  intel_ring_buffer {  	const char	*name;  |