intel_ringbuffer.h revision b7287d8054d219b3009f7ca82edf24f89fd363e5
18187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai#ifndef _INTEL_RINGBUFFER_H_
28187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai#define _INTEL_RINGBUFFER_H_
38187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
41ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilsonenum {
51ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson    RCS = 0x0,
61ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson    VCS,
71ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson    BCS,
81ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson    I915_NUM_RINGS,
91ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson};
101ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson
118187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan haistruct  intel_hw_status_page {
1278501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	u32	__iomem	*page_addr;
138187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	unsigned int	gfx_addr;
1405394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	struct		drm_i915_gem_object *obj;
158187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai};
168187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
17b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_TAIL(ring) I915_READ(RING_TAIL((ring)->mmio_base))
18b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val)
19cae5852dcaa1139b198e13ebd3aeb7f3c065f875Zou Nan hai
20b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_START(ring) I915_READ(RING_START((ring)->mmio_base))
21b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val)
22cae5852dcaa1139b198e13ebd3aeb7f3c065f875Zou Nan hai
23b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_HEAD(ring)  I915_READ(RING_HEAD((ring)->mmio_base))
24b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val)
25cae5852dcaa1139b198e13ebd3aeb7f3c065f875Zou Nan hai
26b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_CTL(ring) I915_READ(RING_CTL((ring)->mmio_base))
27b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val)
28cae5852dcaa1139b198e13ebd3aeb7f3c065f875Zou Nan hai
29b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_IMR(ring) I915_READ(RING_IMR((ring)->mmio_base))
30b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val)
31870e86ddc2d110124812b277643ed0f2767148eeDaniel Vetter
32b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_NOPID(ring) I915_READ(RING_NOPID((ring)->mmio_base))
33b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base))
34b7287d8054d219b3009f7ca82edf24f89fd363e5Ben Widawsky#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base))
351ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson
368187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan haistruct  intel_ring_buffer {
378187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	const char	*name;
389220434a8768902cd9cf248709972678b74aa8c1Chris Wilson	enum intel_ring_id {
399220434a8768902cd9cf248709972678b74aa8c1Chris Wilson		RING_RENDER = 0x1,
409220434a8768902cd9cf248709972678b74aa8c1Chris Wilson		RING_BSD = 0x2,
41549f7365820a212a1cfd0871d377b1ad0d1e5723Chris Wilson		RING_BLT = 0x4,
429220434a8768902cd9cf248709972678b74aa8c1Chris Wilson	} id;
43333e9fe94d00ce8c334d91099449b9948bf76b92Daniel Vetter	u32		mmio_base;
44311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson	void		__iomem *virtual_start;
458187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	struct		drm_device *dev;
4605394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	struct		drm_i915_gem_object *obj;
478187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
488c0a6bfef165ccdbf5d73afb9dd660107b0c98d5Chris Wilson	u32		head;
498c0a6bfef165ccdbf5d73afb9dd660107b0c98d5Chris Wilson	u32		tail;
50780f0ca3e0cd3f0677d9149b7e14bf0878d1dbdcChris Wilson	int		space;
51c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	int		size;
5255249baaa5cd188ebd9acdb047eeaed8092e4a93Chris Wilson	int		effective_size;
538187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	struct intel_hw_status_page status_page;
548187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
550dc79fb2a36efcadbb39bd8b28933d8aa40408b1Chris Wilson	spinlock_t	irq_lock;
5601a03331e5fe91861937f8b8e72c259f5e9eae67Chris Wilson	u32		irq_refcount;
570f46832fab779a9a3314ce5e833155fe4cf18f6cChris Wilson	u32		irq_mask;
58b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson	u32		irq_seqno;		/* last seq seem at irq time */
59db53a302611c06bde01851f61fa0675a84ca018cChris Wilson	u32		trace_irq_seqno;
60b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson	u32		waiting_seqno;
611ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	u32		sync_seqno[I915_NUM_RINGS-1];
62b13c2b96bf15b9dd0f1a45fd788f3a3025c5aec6Chris Wilson	bool __must_check (*irq_get)(struct intel_ring_buffer *ring);
631ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	void		(*irq_put)(struct intel_ring_buffer *ring);
648187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
6578501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	int		(*init)(struct intel_ring_buffer *ring);
668187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
6778501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	void		(*write_tail)(struct intel_ring_buffer *ring,
68297b0c5be3b6e08890cbd7149313408847e81715Chris Wilson				      u32 value);
69b72f3acb71646de073abdc070fe1108866c96634Chris Wilson	int __must_check (*flush)(struct intel_ring_buffer *ring,
70b72f3acb71646de073abdc070fe1108866c96634Chris Wilson				  u32	invalidate_domains,
71b72f3acb71646de073abdc070fe1108866c96634Chris Wilson				  u32	flush_domains);
723cce469cab880ef8990d2d16d745bf85443fc998Chris Wilson	int		(*add_request)(struct intel_ring_buffer *ring,
733cce469cab880ef8990d2d16d745bf85443fc998Chris Wilson				       u32 *seqno);
7478501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	u32		(*get_seqno)(struct intel_ring_buffer *ring);
7578501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	int		(*dispatch_execbuffer)(struct intel_ring_buffer *ring,
76c4e7a4146798ce22c229dd21ed31f59f07c4119eChris Wilson					       u32 offset, u32 length);
778d19215be8254f4f75e9c5a0d28345947b0382dbZou Nan hai	void		(*cleanup)(struct intel_ring_buffer *ring);
788187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
798187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	/**
808187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * List of objects currently involved in rendering from the
818187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * ringbuffer.
828187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 *
838187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * Includes buffers having the contents of their GPU caches
848187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * flushed, not necessarily primitives.  last_rendering_seqno
858187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * represents when the rendering involved will be completed.
868187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 *
878187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * A reference is held on the buffer while on this list.
888187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 */
898187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	struct list_head active_list;
908187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
918187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	/**
928187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * List of breadcrumbs associated with GPU requests currently
938187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 * outstanding.
948187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	 */
958187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	struct list_head request_list;
968187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
97a56ba56c275b1c2b982c8901ab92bf5a0fd0b757Chris Wilson	/**
98641934069d29211baf82afb93622a426172b67b6Chris Wilson	 * List of objects currently pending a GPU write flush.
99641934069d29211baf82afb93622a426172b67b6Chris Wilson	 *
100641934069d29211baf82afb93622a426172b67b6Chris Wilson	 * All elements on this list will belong to either the
101641934069d29211baf82afb93622a426172b67b6Chris Wilson	 * active_list or flushing_list, last_rendering_seqno can
102641934069d29211baf82afb93622a426172b67b6Chris Wilson	 * be used to differentiate between the two elements.
103641934069d29211baf82afb93622a426172b67b6Chris Wilson	 */
104641934069d29211baf82afb93622a426172b67b6Chris Wilson	struct list_head gpu_write_list;
105641934069d29211baf82afb93622a426172b67b6Chris Wilson
106641934069d29211baf82afb93622a426172b67b6Chris Wilson	/**
107a56ba56c275b1c2b982c8901ab92bf5a0fd0b757Chris Wilson	 * Do we have some not yet emitted requests outstanding?
108a56ba56c275b1c2b982c8901ab92bf5a0fd0b757Chris Wilson	 */
1095d97eb69bd4767ce9973360881fa6ad161510fb0Chris Wilson	u32 outstanding_lazy_request;
110a56ba56c275b1c2b982c8901ab92bf5a0fd0b757Chris Wilson
1118187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	wait_queue_head_t irq_queue;
1128187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	drm_local_map_t map;
1138d19215be8254f4f75e9c5a0d28345947b0382dbZou Nan hai
1148d19215be8254f4f75e9c5a0d28345947b0382dbZou Nan hai	void *private;
1158187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai};
1168187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
1178187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan haistatic inline u32
1181ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilsonintel_ring_sync_index(struct intel_ring_buffer *ring,
1191ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		      struct intel_ring_buffer *other)
1201ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson{
1211ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	int idx;
1221ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson
1231ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	/*
1241ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	 * cs -> 0 = vcs, 1 = bcs
1251ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	 * vcs -> 0 = bcs, 1 = cs,
1261ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	 * bcs -> 0 = cs, 1 = vcs.
1271ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	 */
1281ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson
1291ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	idx = (other - ring) - 1;
1301ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	if (idx < 0)
1311ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		idx += I915_NUM_RINGS;
1321ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson
1331ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	return idx;
1341ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson}
1351ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson
1361ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilsonstatic inline u32
1378187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan haiintel_read_status_page(struct intel_ring_buffer *ring,
13878501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson		       int reg)
1398187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai{
14078501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	return ioread32(ring->status_page.page_addr + reg);
1418187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai}
1428187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
143311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson/**
144311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * Reads a dword out of the status page, which is written to from the command
145311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or
146311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * MI_STORE_DATA_IMM.
147311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson *
148311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * The following dwords have a reserved meaning:
149311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes.
150311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * 0x04: ring 0 head pointer
151311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * 0x05: ring 1 head pointer (915-class)
152311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * 0x06: ring 2 head pointer (915-class)
153311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * 0x10-0x1b: Context status DWords (GM45)
154311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * 0x1f: Last written status offset. (GM45)
155311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson *
156311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson * The area from dword 0x20 to 0x3ff is available for driver usage.
157311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson */
158311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson#define READ_HWSP(dev_priv, reg) intel_read_status_page(LP_RING(dev_priv), reg)
159311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX)
160311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson#define I915_GEM_HWS_INDEX		0x20
161311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson#define I915_BREADCRUMB_INDEX		0x21
162311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson
16378501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilsonvoid intel_cleanup_ring_buffer(struct intel_ring_buffer *ring);
16496f298aa9c9fc9b7c8a2ebaf8c195d178f570e09Ben Widawsky
165e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilsonint __must_check intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n);
16696f298aa9c9fc9b7c8a2ebaf8c195d178f570e09Ben Widawskystatic inline int intel_wait_ring_idle(struct intel_ring_buffer *ring)
16796f298aa9c9fc9b7c8a2ebaf8c195d178f570e09Ben Widawsky{
16896f298aa9c9fc9b7c8a2ebaf8c195d178f570e09Ben Widawsky	return intel_wait_ring_buffer(ring, ring->space - 8);
16996f298aa9c9fc9b7c8a2ebaf8c195d178f570e09Ben Widawsky}
17096f298aa9c9fc9b7c8a2ebaf8c195d178f570e09Ben Widawsky
171e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilsonint __must_check intel_ring_begin(struct intel_ring_buffer *ring, int n);
17278501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson
17378501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilsonstatic inline void intel_ring_emit(struct intel_ring_buffer *ring,
17478501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson				   u32 data)
175e898cd221db65273bfc102fa20e4e228e0b8c7e1Chris Wilson{
17678501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilson	iowrite32(data, ring->virtual_start + ring->tail);
177e898cd221db65273bfc102fa20e4e228e0b8c7e1Chris Wilson	ring->tail += 4;
178e898cd221db65273bfc102fa20e4e228e0b8c7e1Chris Wilson}
179e898cd221db65273bfc102fa20e4e228e0b8c7e1Chris Wilson
18078501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilsonvoid intel_ring_advance(struct intel_ring_buffer *ring);
1818187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
18278501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilsonu32 intel_ring_get_seqno(struct intel_ring_buffer *ring);
1831ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilsonint intel_ring_sync(struct intel_ring_buffer *ring,
1841ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		    struct intel_ring_buffer *to,
1851ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		    u32 seqno);
1868187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
1875c1143bbecf50184ff7cad6287b4e0993bacbd9fXiang, Haihaoint intel_init_render_ring_buffer(struct drm_device *dev);
1885c1143bbecf50184ff7cad6287b4e0993bacbd9fXiang, Haihaoint intel_init_bsd_ring_buffer(struct drm_device *dev);
189549f7365820a212a1cfd0871d377b1ad0d1e5723Chris Wilsonint intel_init_blt_ring_buffer(struct drm_device *dev);
1908187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai
19178501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilsonu32 intel_ring_get_active_head(struct intel_ring_buffer *ring);
19278501eac34f372bfbeb4e1d9de688c13efa916f6Chris Wilsonvoid intel_ring_setup_status_page(struct intel_ring_buffer *ring);
19379f321b7e676bd54f563c5ce513588aa90b2cc21Daniel Vetter
194db53a302611c06bde01851f61fa0675a84ca018cChris Wilsonstatic inline void i915_trace_irq_get(struct intel_ring_buffer *ring, u32 seqno)
195db53a302611c06bde01851f61fa0675a84ca018cChris Wilson{
196db53a302611c06bde01851f61fa0675a84ca018cChris Wilson	if (ring->trace_irq_seqno == 0 && ring->irq_get(ring))
197db53a302611c06bde01851f61fa0675a84ca018cChris Wilson		ring->trace_irq_seqno = seqno;
198db53a302611c06bde01851f61fa0675a84ca018cChris Wilson}
199db53a302611c06bde01851f61fa0675a84ca018cChris Wilson
200e8616b6ced6137085e6657cc63bc2fe3900b8616Chris Wilson/* DRI warts */
201e8616b6ced6137085e6657cc63bc2fe3900b8616Chris Wilsonint intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size);
202e8616b6ced6137085e6657cc63bc2fe3900b8616Chris Wilson
2038187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai#endif /* _INTEL_RINGBUFFER_H_ */
204