intel_ringbuffer.c 33.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * Copyright © 2008-2010 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * Authors:
 *    Eric Anholt <eric@anholt.net>
 *    Zou Nan hai <nanhai.zou@intel.com>
 *    Xiang Hai hao<haihao.xiang@intel.com>
 *
 */

#include "drmP.h"
#include "drm.h"
#include "i915_drv.h"
33
#include "i915_drm.h"
34
#include "i915_trace.h"
35
#include "intel_drv.h"
36

37 38 39 40 41 42 43 44
static inline int ring_space(struct intel_ring_buffer *ring)
{
	int space = (ring->head & HEAD_ADDR) - (ring->tail + 8);
	if (space < 0)
		space += ring->size;
	return space;
}

45 46 47 48 49 50 51 52 53 54 55 56 57 58
static u32 i915_gem_get_seqno(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	u32 seqno;

	seqno = dev_priv->next_seqno;

	/* reserve 0 for non-seqno */
	if (++dev_priv->next_seqno == 0)
		dev_priv->next_seqno = 1;

	return seqno;
}

59
static int
60
render_ring_flush(struct intel_ring_buffer *ring,
61 62
		  u32	invalidate_domains,
		  u32	flush_domains)
63
{
64
	struct drm_device *dev = ring->dev;
65
	u32 cmd;
66
	int ret;
67

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
	/*
	 * read/write caches:
	 *
	 * I915_GEM_DOMAIN_RENDER is always invalidated, but is
	 * only flushed if MI_NO_WRITE_FLUSH is unset.  On 965, it is
	 * also flushed at 2d versus 3d pipeline switches.
	 *
	 * read-only caches:
	 *
	 * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
	 * MI_READ_FLUSH is set, and is always flushed on 965.
	 *
	 * I915_GEM_DOMAIN_COMMAND may not exist?
	 *
	 * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
	 * invalidated when MI_EXE_FLUSH is set.
	 *
	 * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
	 * invalidated with every MI_FLUSH.
	 *
	 * TLBs:
	 *
	 * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
	 * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
	 * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
	 * are flushed at any MI_FLUSH.
	 */

	cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
	if ((invalidate_domains|flush_domains) &
	    I915_GEM_DOMAIN_RENDER)
		cmd &= ~MI_NO_WRITE_FLUSH;
	if (INTEL_INFO(dev)->gen < 4) {
101
		/*
102 103
		 * On the 965, the sampler cache always gets flushed
		 * and this bit is reserved.
104
		 */
105 106 107 108 109
		if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
			cmd |= MI_READ_FLUSH;
	}
	if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
		cmd |= MI_EXE_FLUSH;
110

111 112 113
	if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
	    (IS_G4X(dev) || IS_GEN5(dev)))
		cmd |= MI_INVALIDATE_ISP;
114

115 116 117
	ret = intel_ring_begin(ring, 2);
	if (ret)
		return ret;
118

119 120 121
	intel_ring_emit(ring, cmd);
	intel_ring_emit(ring, MI_NOOP);
	intel_ring_advance(ring);
122 123

	return 0;
124 125
}

126
static void ring_write_tail(struct intel_ring_buffer *ring,
127
			    u32 value)
128
{
129
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
130
	I915_WRITE_TAIL(ring, value);
131 132
}

133
u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
134
{
135 136
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
	u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
D
Daniel Vetter 已提交
137
			RING_ACTHD(ring->mmio_base) : ACTHD;
138 139 140 141

	return I915_READ(acthd_reg);
}

142
static int init_ring_common(struct intel_ring_buffer *ring)
143
{
144
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
145
	struct drm_i915_gem_object *obj = ring->obj;
146 147 148
	u32 head;

	/* Stop the ring if it's running. */
149
	I915_WRITE_CTL(ring, 0);
150
	I915_WRITE_HEAD(ring, 0);
151
	ring->write_tail(ring, 0);
152 153

	/* Initialize the ring. */
154
	I915_WRITE_START(ring, obj->gtt_offset);
155
	head = I915_READ_HEAD(ring) & HEAD_ADDR;
156 157 158

	/* G45 ring initialization fails to reset head to zero */
	if (head != 0) {
159 160 161 162 163 164 165
		DRM_DEBUG_KMS("%s head not reset to zero "
			      "ctl %08x head %08x tail %08x start %08x\n",
			      ring->name,
			      I915_READ_CTL(ring),
			      I915_READ_HEAD(ring),
			      I915_READ_TAIL(ring),
			      I915_READ_START(ring));
166

167
		I915_WRITE_HEAD(ring, 0);
168

169 170 171 172 173 174 175 176 177
		if (I915_READ_HEAD(ring) & HEAD_ADDR) {
			DRM_ERROR("failed to set %s head to zero "
				  "ctl %08x head %08x tail %08x start %08x\n",
				  ring->name,
				  I915_READ_CTL(ring),
				  I915_READ_HEAD(ring),
				  I915_READ_TAIL(ring),
				  I915_READ_START(ring));
		}
178 179
	}

180
	I915_WRITE_CTL(ring,
181
			((ring->size - PAGE_SIZE) & RING_NR_PAGES)
182
			| RING_REPORT_64K | RING_VALID);
183 184

	/* If the head is still not zero, the ring is dead */
185
	if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
186
	    I915_READ_START(ring) != obj->gtt_offset ||
187
	    (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
188 189 190 191 192 193 194 195
		DRM_ERROR("%s initialization failed "
				"ctl %08x head %08x tail %08x start %08x\n",
				ring->name,
				I915_READ_CTL(ring),
				I915_READ_HEAD(ring),
				I915_READ_TAIL(ring),
				I915_READ_START(ring));
		return -EIO;
196 197
	}

198 199
	if (!drm_core_check_feature(ring->dev, DRIVER_MODESET))
		i915_kernel_lost_context(ring->dev);
200
	else {
201
		ring->head = I915_READ_HEAD(ring);
202
		ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
203
		ring->space = ring_space(ring);
204
	}
205

206 207 208
	return 0;
}

209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
/*
 * 965+ support PIPE_CONTROL commands, which provide finer grained control
 * over cache flushing.
 */
struct pipe_control {
	struct drm_i915_gem_object *obj;
	volatile u32 *cpu_page;
	u32 gtt_offset;
};

static int
init_pipe_control(struct intel_ring_buffer *ring)
{
	struct pipe_control *pc;
	struct drm_i915_gem_object *obj;
	int ret;

	if (ring->private)
		return 0;

	pc = kmalloc(sizeof(*pc), GFP_KERNEL);
	if (!pc)
		return -ENOMEM;

	obj = i915_gem_alloc_object(ring->dev, 4096);
	if (obj == NULL) {
		DRM_ERROR("Failed to allocate seqno page\n");
		ret = -ENOMEM;
		goto err;
	}
239 240

	i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281

	ret = i915_gem_object_pin(obj, 4096, true);
	if (ret)
		goto err_unref;

	pc->gtt_offset = obj->gtt_offset;
	pc->cpu_page =  kmap(obj->pages[0]);
	if (pc->cpu_page == NULL)
		goto err_unpin;

	pc->obj = obj;
	ring->private = pc;
	return 0;

err_unpin:
	i915_gem_object_unpin(obj);
err_unref:
	drm_gem_object_unreference(&obj->base);
err:
	kfree(pc);
	return ret;
}

static void
cleanup_pipe_control(struct intel_ring_buffer *ring)
{
	struct pipe_control *pc = ring->private;
	struct drm_i915_gem_object *obj;

	if (!ring->private)
		return;

	obj = pc->obj;
	kunmap(obj->pages[0]);
	i915_gem_object_unpin(obj);
	drm_gem_object_unreference(&obj->base);

	kfree(pc);
	ring->private = NULL;
}

282
static int init_render_ring(struct intel_ring_buffer *ring)
283
{
284
	struct drm_device *dev = ring->dev;
285
	struct drm_i915_private *dev_priv = dev->dev_private;
286
	int ret = init_ring_common(ring);
287

288
	if (INTEL_INFO(dev)->gen > 3) {
289
		int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
290
		if (IS_GEN6(dev) || IS_GEN7(dev))
291 292
			mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
		I915_WRITE(MI_MODE, mode);
293 294 295 296
		if (IS_GEN7(dev))
			I915_WRITE(GFX_MODE_GEN7,
				   GFX_MODE_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
				   GFX_MODE_ENABLE(GFX_REPLAY_MODE));
297
	}
298

299 300 301 302 303 304 305
	if (INTEL_INFO(dev)->gen >= 6) {
	} else if (IS_GEN5(dev)) {
		ret = init_pipe_control(ring);
		if (ret)
			return ret;
	}

306 307 308
	return ret;
}

309 310 311 312 313 314 315 316
static void render_ring_cleanup(struct intel_ring_buffer *ring)
{
	if (!ring->private)
		return;

	cleanup_pipe_control(ring);
}

317
static void
318 319 320
update_mboxes(struct intel_ring_buffer *ring,
	    u32 seqno,
	    u32 mmio_offset)
321
{
322 323 324 325
	intel_ring_emit(ring, MI_SEMAPHORE_MBOX |
			      MI_SEMAPHORE_GLOBAL_GTT |
			      MI_SEMAPHORE_REGISTER |
			      MI_SEMAPHORE_UPDATE);
326
	intel_ring_emit(ring, seqno);
327
	intel_ring_emit(ring, mmio_offset);
328 329
}

330 331 332 333 334 335 336 337 338
/**
 * gen6_add_request - Update the semaphore mailbox registers
 * 
 * @ring - ring that is adding a request
 * @seqno - return seqno stuck into the ring
 *
 * Update the mailbox registers in the *other* rings with the current seqno.
 * This acts like a signal in the canonical semaphore.
 */
339 340
static int
gen6_add_request(struct intel_ring_buffer *ring,
341
		 u32 *seqno)
342
{
343 344
	u32 mbox1_reg;
	u32 mbox2_reg;
345 346 347 348 349 350
	int ret;

	ret = intel_ring_begin(ring, 10);
	if (ret)
		return ret;

351 352
	mbox1_reg = ring->signal_mbox[0];
	mbox2_reg = ring->signal_mbox[1];
353

354 355 356 357
	*seqno = i915_gem_get_seqno(ring->dev);

	update_mboxes(ring, *seqno, mbox1_reg);
	update_mboxes(ring, *seqno, mbox2_reg);
358 359
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
360
	intel_ring_emit(ring, *seqno);
361 362 363 364 365 366
	intel_ring_emit(ring, MI_USER_INTERRUPT);
	intel_ring_advance(ring);

	return 0;
}

367 368 369 370 371 372 373 374 375 376 377
/**
 * intel_ring_sync - sync the waiter to the signaller on seqno
 *
 * @waiter - ring that is waiting
 * @signaller - ring which has, or will signal
 * @seqno - seqno which the waiter will block on
 */
static int
intel_ring_sync(struct intel_ring_buffer *waiter,
		struct intel_ring_buffer *signaller,
		int ring,
378 379 380
		u32 seqno)
{
	int ret;
381 382 383
	u32 dw1 = MI_SEMAPHORE_MBOX |
		  MI_SEMAPHORE_COMPARE |
		  MI_SEMAPHORE_REGISTER;
384

385
	ret = intel_ring_begin(waiter, 4);
386 387 388
	if (ret)
		return ret;

389 390 391 392 393
	intel_ring_emit(waiter, dw1 | signaller->semaphore_register[ring]);
	intel_ring_emit(waiter, seqno);
	intel_ring_emit(waiter, 0);
	intel_ring_emit(waiter, MI_NOOP);
	intel_ring_advance(waiter);
394 395 396 397

	return 0;
}

398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
/* VCS->RCS (RVSYNC) or BCS->RCS (RBSYNC) */
int
render_ring_sync_to(struct intel_ring_buffer *waiter,
		    struct intel_ring_buffer *signaller,
		    u32 seqno)
{
	WARN_ON(signaller->semaphore_register[RCS] == MI_SEMAPHORE_SYNC_INVALID);
	return intel_ring_sync(waiter,
			       signaller,
			       RCS,
			       seqno);
}

/* RCS->VCS (VRSYNC) or BCS->VCS (VBSYNC) */
int
gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter,
		      struct intel_ring_buffer *signaller,
		      u32 seqno)
{
	WARN_ON(signaller->semaphore_register[VCS] == MI_SEMAPHORE_SYNC_INVALID);
	return intel_ring_sync(waiter,
			       signaller,
			       VCS,
			       seqno);
}

/* RCS->BCS (BRSYNC) or VCS->BCS (BVSYNC) */
int
gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter,
		      struct intel_ring_buffer *signaller,
		      u32 seqno)
{
	WARN_ON(signaller->semaphore_register[BCS] == MI_SEMAPHORE_SYNC_INVALID);
	return intel_ring_sync(waiter,
			       signaller,
			       BCS,
			       seqno);
}



439 440
#define PIPE_CONTROL_FLUSH(ring__, addr__)					\
do {									\
441 442
	intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |		\
		 PIPE_CONTROL_DEPTH_STALL);				\
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
	intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT);			\
	intel_ring_emit(ring__, 0);							\
	intel_ring_emit(ring__, 0);							\
} while (0)

static int
pc_render_add_request(struct intel_ring_buffer *ring,
		      u32 *result)
{
	struct drm_device *dev = ring->dev;
	u32 seqno = i915_gem_get_seqno(dev);
	struct pipe_control *pc = ring->private;
	u32 scratch_addr = pc->gtt_offset + 128;
	int ret;

	/* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
	 * incoherent with writes to memory, i.e. completely fubar,
	 * so we need to use PIPE_NOTIFY instead.
	 *
	 * However, we also need to workaround the qword write
	 * incoherence by flushing the 6 PIPE_NOTIFY buffers out to
	 * memory before requesting an interrupt.
	 */
	ret = intel_ring_begin(ring, 32);
	if (ret)
		return ret;

470
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
			PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH);
	intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
	intel_ring_emit(ring, seqno);
	intel_ring_emit(ring, 0);
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
	scratch_addr += 128; /* write to separate cachelines */
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
	scratch_addr += 128;
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
	scratch_addr += 128;
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
	scratch_addr += 128;
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
	scratch_addr += 128;
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
486
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
487 488 489 490 491 492 493 494 495 496 497
			PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH |
			PIPE_CONTROL_NOTIFY);
	intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
	intel_ring_emit(ring, seqno);
	intel_ring_emit(ring, 0);
	intel_ring_advance(ring);

	*result = seqno;
	return 0;
}

498 499 500 501 502 503 504
static int
render_ring_add_request(struct intel_ring_buffer *ring,
			u32 *result)
{
	struct drm_device *dev = ring->dev;
	u32 seqno = i915_gem_get_seqno(dev);
	int ret;
505

506 507 508
	ret = intel_ring_begin(ring, 4);
	if (ret)
		return ret;
509

510 511 512 513
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
	intel_ring_emit(ring, seqno);
	intel_ring_emit(ring, MI_USER_INTERRUPT);
514
	intel_ring_advance(ring);
515

516 517
	*result = seqno;
	return 0;
518 519
}

520
static u32
521
ring_get_seqno(struct intel_ring_buffer *ring)
522
{
523 524 525
	return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
}

526 527 528 529 530 531 532
static u32
pc_render_get_seqno(struct intel_ring_buffer *ring)
{
	struct pipe_control *pc = ring->private;
	return pc->cpu_page[0];
}

533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
static void
ironlake_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
{
	dev_priv->gt_irq_mask &= ~mask;
	I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
	POSTING_READ(GTIMR);
}

static void
ironlake_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
{
	dev_priv->gt_irq_mask |= mask;
	I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
	POSTING_READ(GTIMR);
}

static void
i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
{
	dev_priv->irq_mask &= ~mask;
	I915_WRITE(IMR, dev_priv->irq_mask);
	POSTING_READ(IMR);
}

static void
i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
{
	dev_priv->irq_mask |= mask;
	I915_WRITE(IMR, dev_priv->irq_mask);
	POSTING_READ(IMR);
}

565
static bool
566
render_ring_get_irq(struct intel_ring_buffer *ring)
567
{
568
	struct drm_device *dev = ring->dev;
569
	drm_i915_private_t *dev_priv = dev->dev_private;
570

571 572 573
	if (!dev->irq_enabled)
		return false;

574
	spin_lock(&ring->irq_lock);
575
	if (ring->irq_refcount++ == 0) {
576
		if (HAS_PCH_SPLIT(dev))
577 578
			ironlake_enable_irq(dev_priv,
					    GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
579 580 581
		else
			i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
	}
582
	spin_unlock(&ring->irq_lock);
583 584

	return true;
585 586
}

587
static void
588
render_ring_put_irq(struct intel_ring_buffer *ring)
589
{
590
	struct drm_device *dev = ring->dev;
591
	drm_i915_private_t *dev_priv = dev->dev_private;
592

593
	spin_lock(&ring->irq_lock);
594
	if (--ring->irq_refcount == 0) {
595
		if (HAS_PCH_SPLIT(dev))
596 597 598
			ironlake_disable_irq(dev_priv,
					     GT_USER_INTERRUPT |
					     GT_PIPE_NOTIFY);
599 600 601
		else
			i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
	}
602
	spin_unlock(&ring->irq_lock);
603 604
}

605
void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
606
{
607
	struct drm_device *dev = ring->dev;
608
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631
	u32 mmio = 0;

	/* The ring status page addresses are no longer next to the rest of
	 * the ring registers as of gen7.
	 */
	if (IS_GEN7(dev)) {
		switch (ring->id) {
		case RING_RENDER:
			mmio = RENDER_HWS_PGA_GEN7;
			break;
		case RING_BLT:
			mmio = BLT_HWS_PGA_GEN7;
			break;
		case RING_BSD:
			mmio = BSD_HWS_PGA_GEN7;
			break;
		}
	} else if (IS_GEN6(ring->dev)) {
		mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
	} else {
		mmio = RING_HWS_PGA(ring->mmio_base);
	}

632 633
	I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
	POSTING_READ(mmio);
634 635
}

636
static int
637 638 639
bsd_ring_flush(struct intel_ring_buffer *ring,
	       u32     invalidate_domains,
	       u32     flush_domains)
640
{
641 642 643 644 645 646 647 648 649 650
	int ret;

	ret = intel_ring_begin(ring, 2);
	if (ret)
		return ret;

	intel_ring_emit(ring, MI_FLUSH);
	intel_ring_emit(ring, MI_NOOP);
	intel_ring_advance(ring);
	return 0;
651 652
}

653
static int
654
ring_add_request(struct intel_ring_buffer *ring,
655
		 u32 *result)
656 657
{
	u32 seqno;
658 659 660 661 662
	int ret;

	ret = intel_ring_begin(ring, 4);
	if (ret)
		return ret;
663

664
	seqno = i915_gem_get_seqno(ring->dev);
665

666 667 668 669 670
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
	intel_ring_emit(ring, seqno);
	intel_ring_emit(ring, MI_USER_INTERRUPT);
	intel_ring_advance(ring);
671

672 673
	*result = seqno;
	return 0;
674 675
}

676 677 678 679
static bool
gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
{
	struct drm_device *dev = ring->dev;
680
	drm_i915_private_t *dev_priv = dev->dev_private;
681 682 683 684

	if (!dev->irq_enabled)
	       return false;

685
	spin_lock(&ring->irq_lock);
686
	if (ring->irq_refcount++ == 0) {
687 688 689 690
		ring->irq_mask &= ~rflag;
		I915_WRITE_IMR(ring, ring->irq_mask);
		ironlake_enable_irq(dev_priv, gflag);
	}
691
	spin_unlock(&ring->irq_lock);
692 693 694 695 696 697 698 699

	return true;
}

static void
gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
{
	struct drm_device *dev = ring->dev;
700
	drm_i915_private_t *dev_priv = dev->dev_private;
701

702
	spin_lock(&ring->irq_lock);
703
	if (--ring->irq_refcount == 0) {
704 705 706
		ring->irq_mask |= rflag;
		I915_WRITE_IMR(ring, ring->irq_mask);
		ironlake_disable_irq(dev_priv, gflag);
707
	}
708
	spin_unlock(&ring->irq_lock);
709 710
}

711
static bool
712
bsd_ring_get_irq(struct intel_ring_buffer *ring)
713
{
714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
	struct drm_device *dev = ring->dev;
	drm_i915_private_t *dev_priv = dev->dev_private;

	if (!dev->irq_enabled)
		return false;

	spin_lock(&ring->irq_lock);
	if (ring->irq_refcount++ == 0) {
		if (IS_G4X(dev))
			i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
		else
			ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
	}
	spin_unlock(&ring->irq_lock);

	return true;
730 731 732 733
}
static void
bsd_ring_put_irq(struct intel_ring_buffer *ring)
{
734 735 736 737 738 739 740 741 742 743 744
	struct drm_device *dev = ring->dev;
	drm_i915_private_t *dev_priv = dev->dev_private;

	spin_lock(&ring->irq_lock);
	if (--ring->irq_refcount == 0) {
		if (IS_G4X(dev))
			i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
		else
			ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
	}
	spin_unlock(&ring->irq_lock);
745 746 747
}

static int
748
ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
749
{
750
	int ret;
751

752 753 754 755
	ret = intel_ring_begin(ring, 2);
	if (ret)
		return ret;

756
	intel_ring_emit(ring,
757
			MI_BATCH_BUFFER_START | (2 << 6) |
758
			MI_BATCH_NON_SECURE_I965);
759
	intel_ring_emit(ring, offset);
760 761
	intel_ring_advance(ring);

762 763 764
	return 0;
}

765
static int
766
render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
767
				u32 offset, u32 len)
768
{
769
	struct drm_device *dev = ring->dev;
770
	int ret;
771

772 773 774 775
	if (IS_I830(dev) || IS_845G(dev)) {
		ret = intel_ring_begin(ring, 4);
		if (ret)
			return ret;
776

777 778 779 780 781 782 783 784
		intel_ring_emit(ring, MI_BATCH_BUFFER);
		intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
		intel_ring_emit(ring, offset + len - 8);
		intel_ring_emit(ring, 0);
	} else {
		ret = intel_ring_begin(ring, 2);
		if (ret)
			return ret;
785

786 787 788 789 790
		if (INTEL_INFO(dev)->gen >= 4) {
			intel_ring_emit(ring,
					MI_BATCH_BUFFER_START | (2 << 6) |
					MI_BATCH_NON_SECURE_I965);
			intel_ring_emit(ring, offset);
791
		} else {
792 793 794
			intel_ring_emit(ring,
					MI_BATCH_BUFFER_START | (2 << 6));
			intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
795 796
		}
	}
797
	intel_ring_advance(ring);
798 799 800 801

	return 0;
}

802
static void cleanup_status_page(struct intel_ring_buffer *ring)
803
{
804
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
805
	struct drm_i915_gem_object *obj;
806

807 808
	obj = ring->status_page.obj;
	if (obj == NULL)
809 810
		return;

811
	kunmap(obj->pages[0]);
812
	i915_gem_object_unpin(obj);
813
	drm_gem_object_unreference(&obj->base);
814
	ring->status_page.obj = NULL;
815 816 817 818

	memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
}

819
static int init_status_page(struct intel_ring_buffer *ring)
820
{
821
	struct drm_device *dev = ring->dev;
822
	drm_i915_private_t *dev_priv = dev->dev_private;
823
	struct drm_i915_gem_object *obj;
824 825 826 827 828 829 830 831
	int ret;

	obj = i915_gem_alloc_object(dev, 4096);
	if (obj == NULL) {
		DRM_ERROR("Failed to allocate status page\n");
		ret = -ENOMEM;
		goto err;
	}
832 833

	i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
834

835
	ret = i915_gem_object_pin(obj, 4096, true);
836 837 838 839
	if (ret != 0) {
		goto err_unref;
	}

840 841
	ring->status_page.gfx_addr = obj->gtt_offset;
	ring->status_page.page_addr = kmap(obj->pages[0]);
842
	if (ring->status_page.page_addr == NULL) {
843 844 845
		memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
		goto err_unpin;
	}
846 847
	ring->status_page.obj = obj;
	memset(ring->status_page.page_addr, 0, PAGE_SIZE);
848

849
	intel_ring_setup_status_page(ring);
850 851
	DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
			ring->name, ring->status_page.gfx_addr);
852 853 854 855 856 857

	return 0;

err_unpin:
	i915_gem_object_unpin(obj);
err_unref:
858
	drm_gem_object_unreference(&obj->base);
859
err:
860
	return ret;
861 862
}

863
int intel_init_ring_buffer(struct drm_device *dev,
864
			   struct intel_ring_buffer *ring)
865
{
866
	struct drm_i915_gem_object *obj;
867 868
	int ret;

869
	ring->dev = dev;
870 871
	INIT_LIST_HEAD(&ring->active_list);
	INIT_LIST_HEAD(&ring->request_list);
872
	INIT_LIST_HEAD(&ring->gpu_write_list);
873

874
	init_waitqueue_head(&ring->irq_queue);
875
	spin_lock_init(&ring->irq_lock);
876
	ring->irq_mask = ~0;
877

878
	if (I915_NEED_GFX_HWS(dev)) {
879
		ret = init_status_page(ring);
880 881 882
		if (ret)
			return ret;
	}
883

884
	obj = i915_gem_alloc_object(dev, ring->size);
885 886
	if (obj == NULL) {
		DRM_ERROR("Failed to allocate ringbuffer\n");
887
		ret = -ENOMEM;
888
		goto err_hws;
889 890
	}

891
	ring->obj = obj;
892

893
	ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
894 895
	if (ret)
		goto err_unref;
896

897
	ring->map.size = ring->size;
898
	ring->map.offset = dev->agp->base + obj->gtt_offset;
899 900 901 902 903 904 905
	ring->map.type = 0;
	ring->map.flags = 0;
	ring->map.mtrr = 0;

	drm_core_ioremap_wc(&ring->map, dev);
	if (ring->map.handle == NULL) {
		DRM_ERROR("Failed to map ringbuffer.\n");
906
		ret = -EINVAL;
907
		goto err_unpin;
908 909
	}

910
	ring->virtual_start = ring->map.handle;
911
	ret = ring->init(ring);
912 913
	if (ret)
		goto err_unmap;
914

915 916 917 918 919 920 921 922
	/* Workaround an erratum on the i830 which causes a hang if
	 * the TAIL pointer points to within the last 2 cachelines
	 * of the buffer.
	 */
	ring->effective_size = ring->size;
	if (IS_I830(ring->dev))
		ring->effective_size -= 128;

923
	return 0;
924 925 926 927 928 929

err_unmap:
	drm_core_ioremapfree(&ring->map, dev);
err_unpin:
	i915_gem_object_unpin(obj);
err_unref:
930 931
	drm_gem_object_unreference(&obj->base);
	ring->obj = NULL;
932
err_hws:
933
	cleanup_status_page(ring);
934
	return ret;
935 936
}

937
void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
938
{
939 940 941
	struct drm_i915_private *dev_priv;
	int ret;

942
	if (ring->obj == NULL)
943 944
		return;

945 946
	/* Disable the ring buffer. The ring must be idle at this point */
	dev_priv = ring->dev->dev_private;
947
	ret = intel_wait_ring_idle(ring);
948 949 950 951
	if (ret)
		DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
			  ring->name, ret);

952 953
	I915_WRITE_CTL(ring, 0);

954
	drm_core_ioremapfree(&ring->map, ring->dev);
955

956 957 958
	i915_gem_object_unpin(ring->obj);
	drm_gem_object_unreference(&ring->obj->base);
	ring->obj = NULL;
959

Z
Zou Nan hai 已提交
960 961 962
	if (ring->cleanup)
		ring->cleanup(ring);

963
	cleanup_status_page(ring);
964 965
}

966
static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
967
{
968
	unsigned int *virt;
969
	int rem = ring->size - ring->tail;
970

971
	if (ring->space < rem) {
972
		int ret = intel_wait_ring_buffer(ring, rem);
973 974 975 976
		if (ret)
			return ret;
	}

977
	virt = (unsigned int *)(ring->virtual_start + ring->tail);
978 979
	rem /= 8;
	while (rem--) {
980
		*virt++ = MI_NOOP;
981 982
		*virt++ = MI_NOOP;
	}
983

984
	ring->tail = 0;
985
	ring->space = ring_space(ring);
986 987 988 989

	return 0;
}

990
int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
991
{
992
	struct drm_device *dev = ring->dev;
993
	struct drm_i915_private *dev_priv = dev->dev_private;
994
	unsigned long end;
995 996
	u32 head;

997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
	/* If the reported head position has wrapped or hasn't advanced,
	 * fallback to the slow and accurate path.
	 */
	head = intel_read_status_page(ring, 4);
	if (head > ring->head) {
		ring->head = head;
		ring->space = ring_space(ring);
		if (ring->space >= n)
			return 0;
	}

C
Chris Wilson 已提交
1008
	trace_i915_ring_wait_begin(ring);
1009 1010
	end = jiffies + 3 * HZ;
	do {
1011 1012
		ring->head = I915_READ_HEAD(ring);
		ring->space = ring_space(ring);
1013
		if (ring->space >= n) {
C
Chris Wilson 已提交
1014
			trace_i915_ring_wait_end(ring);
1015 1016 1017 1018 1019 1020 1021 1022
			return 0;
		}

		if (dev->primary->master) {
			struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
			if (master_priv->sarea_priv)
				master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
		}
1023

1024
		msleep(1);
1025 1026
		if (atomic_read(&dev_priv->mm.wedged))
			return -EAGAIN;
1027
	} while (!time_after(jiffies, end));
C
Chris Wilson 已提交
1028
	trace_i915_ring_wait_end(ring);
1029 1030
	return -EBUSY;
}
1031

1032 1033
int intel_ring_begin(struct intel_ring_buffer *ring,
		     int num_dwords)
1034
{
1035
	struct drm_i915_private *dev_priv = ring->dev->dev_private;
1036
	int n = 4*num_dwords;
1037
	int ret;
1038

1039 1040 1041
	if (unlikely(atomic_read(&dev_priv->mm.wedged)))
		return -EIO;

1042
	if (unlikely(ring->tail + n > ring->effective_size)) {
1043 1044 1045 1046
		ret = intel_wrap_ring_buffer(ring);
		if (unlikely(ret))
			return ret;
	}
1047

1048 1049 1050 1051 1052
	if (unlikely(ring->space < n)) {
		ret = intel_wait_ring_buffer(ring, n);
		if (unlikely(ret))
			return ret;
	}
1053 1054

	ring->space -= n;
1055
	return 0;
1056
}
1057

1058
void intel_ring_advance(struct intel_ring_buffer *ring)
1059
{
1060
	ring->tail &= ring->size - 1;
1061
	ring->write_tail(ring, ring->tail);
1062
}
1063

1064
static const struct intel_ring_buffer render_ring = {
1065
	.name			= "render ring",
1066
	.id			= RING_RENDER,
1067
	.mmio_base		= RENDER_RING_BASE,
1068 1069
	.size			= 32 * PAGE_SIZE,
	.init			= init_render_ring,
1070
	.write_tail		= ring_write_tail,
1071 1072
	.flush			= render_ring_flush,
	.add_request		= render_ring_add_request,
1073 1074 1075
	.get_seqno		= ring_get_seqno,
	.irq_get		= render_ring_get_irq,
	.irq_put		= render_ring_put_irq,
1076
	.dispatch_execbuffer	= render_ring_dispatch_execbuffer,
1077
	.cleanup		= render_ring_cleanup,
1078 1079 1080 1081 1082
	.sync_to		= render_ring_sync_to,
	.semaphore_register	= {MI_SEMAPHORE_SYNC_INVALID,
				   MI_SEMAPHORE_SYNC_RV,
				   MI_SEMAPHORE_SYNC_RB},
	.signal_mbox		= {GEN6_VRSYNC, GEN6_BRSYNC},
1083
};
1084 1085 1086

/* ring buffer for bit-stream decoder */

1087
static const struct intel_ring_buffer bsd_ring = {
1088
	.name                   = "bsd ring",
1089
	.id			= RING_BSD,
1090
	.mmio_base		= BSD_RING_BASE,
1091
	.size			= 32 * PAGE_SIZE,
1092
	.init			= init_ring_common,
1093
	.write_tail		= ring_write_tail,
1094
	.flush			= bsd_ring_flush,
1095
	.add_request		= ring_add_request,
1096 1097 1098
	.get_seqno		= ring_get_seqno,
	.irq_get		= bsd_ring_get_irq,
	.irq_put		= bsd_ring_put_irq,
1099
	.dispatch_execbuffer	= ring_dispatch_execbuffer,
1100
};
1101

1102

1103
static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1104
				     u32 value)
1105
{
1106
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
1107 1108

       /* Every tail move must follow the sequence below */
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
	I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
		GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
		GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
	I915_WRITE(GEN6_BSD_RNCID, 0x0);

	if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
		GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
		50))
	DRM_ERROR("timed out waiting for IDLE Indicator\n");

	I915_WRITE_TAIL(ring, value);
	I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
		GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
		GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1123 1124
}

1125
static int gen6_ring_flush(struct intel_ring_buffer *ring,
1126
			   u32 invalidate, u32 flush)
1127
{
1128
	uint32_t cmd;
1129 1130 1131 1132 1133 1134
	int ret;

	ret = intel_ring_begin(ring, 4);
	if (ret)
		return ret;

1135 1136 1137 1138
	cmd = MI_FLUSH_DW;
	if (invalidate & I915_GEM_GPU_DOMAINS)
		cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
	intel_ring_emit(ring, cmd);
1139 1140
	intel_ring_emit(ring, 0);
	intel_ring_emit(ring, 0);
1141
	intel_ring_emit(ring, MI_NOOP);
1142 1143
	intel_ring_advance(ring);
	return 0;
1144 1145 1146
}

static int
1147
gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
1148
			      u32 offset, u32 len)
1149
{
1150
	int ret;
1151

1152 1153 1154
	ret = intel_ring_begin(ring, 2);
	if (ret)
		return ret;
1155

1156 1157 1158 1159
	intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
	/* bit0-7 is the length on GEN6+ */
	intel_ring_emit(ring, offset);
	intel_ring_advance(ring);
1160

1161
	return 0;
1162 1163
}

1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
static bool
gen6_render_ring_get_irq(struct intel_ring_buffer *ring)
{
	return gen6_ring_get_irq(ring,
				 GT_USER_INTERRUPT,
				 GEN6_RENDER_USER_INTERRUPT);
}

static void
gen6_render_ring_put_irq(struct intel_ring_buffer *ring)
{
	return gen6_ring_put_irq(ring,
				 GT_USER_INTERRUPT,
				 GEN6_RENDER_USER_INTERRUPT);
}

1180
static bool
1181 1182
gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
{
1183 1184 1185
	return gen6_ring_get_irq(ring,
				 GT_GEN6_BSD_USER_INTERRUPT,
				 GEN6_BSD_USER_INTERRUPT);
1186 1187 1188 1189 1190
}

static void
gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
{
1191 1192 1193
	return gen6_ring_put_irq(ring,
				 GT_GEN6_BSD_USER_INTERRUPT,
				 GEN6_BSD_USER_INTERRUPT);
1194 1195
}

1196
/* ring buffer for Video Codec for Gen6+ */
1197
static const struct intel_ring_buffer gen6_bsd_ring = {
1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
	.name			= "gen6 bsd ring",
	.id			= RING_BSD,
	.mmio_base		= GEN6_BSD_RING_BASE,
	.size			= 32 * PAGE_SIZE,
	.init			= init_ring_common,
	.write_tail		= gen6_bsd_ring_write_tail,
	.flush			= gen6_ring_flush,
	.add_request		= gen6_add_request,
	.get_seqno		= ring_get_seqno,
	.irq_get		= gen6_bsd_ring_get_irq,
	.irq_put		= gen6_bsd_ring_put_irq,
	.dispatch_execbuffer	= gen6_ring_dispatch_execbuffer,
1210 1211 1212 1213 1214
	.sync_to		= gen6_bsd_ring_sync_to,
	.semaphore_register	= {MI_SEMAPHORE_SYNC_VR,
				   MI_SEMAPHORE_SYNC_INVALID,
				   MI_SEMAPHORE_SYNC_VB},
	.signal_mbox		= {GEN6_RVSYNC, GEN6_BVSYNC},
1215 1216 1217 1218
};

/* Blitter support (SandyBridge+) */

1219
static bool
1220
blt_ring_get_irq(struct intel_ring_buffer *ring)
1221
{
1222 1223 1224
	return gen6_ring_get_irq(ring,
				 GT_BLT_USER_INTERRUPT,
				 GEN6_BLITTER_USER_INTERRUPT);
1225
}
1226

1227
static void
1228
blt_ring_put_irq(struct intel_ring_buffer *ring)
1229
{
1230 1231 1232
	gen6_ring_put_irq(ring,
			  GT_BLT_USER_INTERRUPT,
			  GEN6_BLITTER_USER_INTERRUPT);
1233 1234
}

Z
Zou Nan hai 已提交
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253

/* Workaround for some stepping of SNB,
 * each time when BLT engine ring tail moved,
 * the first command in the ring to be parsed
 * should be MI_BATCH_BUFFER_START
 */
#define NEED_BLT_WORKAROUND(dev) \
	(IS_GEN6(dev) && (dev->pdev->revision < 8))

static inline struct drm_i915_gem_object *
to_blt_workaround(struct intel_ring_buffer *ring)
{
	return ring->private;
}

static int blt_ring_init(struct intel_ring_buffer *ring)
{
	if (NEED_BLT_WORKAROUND(ring->dev)) {
		struct drm_i915_gem_object *obj;
1254
		u32 *ptr;
Z
Zou Nan hai 已提交
1255 1256
		int ret;

1257
		obj = i915_gem_alloc_object(ring->dev, 4096);
Z
Zou Nan hai 已提交
1258 1259 1260
		if (obj == NULL)
			return -ENOMEM;

1261
		ret = i915_gem_object_pin(obj, 4096, true);
Z
Zou Nan hai 已提交
1262 1263 1264 1265 1266 1267
		if (ret) {
			drm_gem_object_unreference(&obj->base);
			return ret;
		}

		ptr = kmap(obj->pages[0]);
1268 1269
		*ptr++ = MI_BATCH_BUFFER_END;
		*ptr++ = MI_NOOP;
Z
Zou Nan hai 已提交
1270 1271
		kunmap(obj->pages[0]);

1272
		ret = i915_gem_object_set_to_gtt_domain(obj, false);
Z
Zou Nan hai 已提交
1273
		if (ret) {
1274
			i915_gem_object_unpin(obj);
Z
Zou Nan hai 已提交
1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
			drm_gem_object_unreference(&obj->base);
			return ret;
		}

		ring->private = obj;
	}

	return init_ring_common(ring);
}

static int blt_ring_begin(struct intel_ring_buffer *ring,
			  int num_dwords)
{
	if (ring->private) {
		int ret = intel_ring_begin(ring, num_dwords+2);
		if (ret)
			return ret;

		intel_ring_emit(ring, MI_BATCH_BUFFER_START);
		intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);

		return 0;
	} else
		return intel_ring_begin(ring, 4);
}

1301
static int blt_ring_flush(struct intel_ring_buffer *ring,
1302
			  u32 invalidate, u32 flush)
Z
Zou Nan hai 已提交
1303
{
1304
	uint32_t cmd;
1305 1306 1307 1308 1309 1310
	int ret;

	ret = blt_ring_begin(ring, 4);
	if (ret)
		return ret;

1311 1312 1313 1314
	cmd = MI_FLUSH_DW;
	if (invalidate & I915_GEM_DOMAIN_RENDER)
		cmd |= MI_INVALIDATE_TLB;
	intel_ring_emit(ring, cmd);
1315 1316
	intel_ring_emit(ring, 0);
	intel_ring_emit(ring, 0);
1317
	intel_ring_emit(ring, MI_NOOP);
1318 1319
	intel_ring_advance(ring);
	return 0;
Z
Zou Nan hai 已提交
1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331
}

static void blt_ring_cleanup(struct intel_ring_buffer *ring)
{
	if (!ring->private)
		return;

	i915_gem_object_unpin(ring->private);
	drm_gem_object_unreference(ring->private);
	ring->private = NULL;
}

1332
static const struct intel_ring_buffer gen6_blt_ring = {
1333 1334 1335 1336 1337 1338 1339 1340 1341
	.name			= "blt ring",
	.id			= RING_BLT,
	.mmio_base		= BLT_RING_BASE,
	.size			= 32 * PAGE_SIZE,
	.init			= blt_ring_init,
	.write_tail		= ring_write_tail,
	.flush			= blt_ring_flush,
	.add_request		= gen6_add_request,
	.get_seqno		= ring_get_seqno,
1342 1343
	.irq_get		= blt_ring_get_irq,
	.irq_put		= blt_ring_put_irq,
1344
	.dispatch_execbuffer	= gen6_ring_dispatch_execbuffer,
1345 1346 1347 1348 1349 1350
	.cleanup		= blt_ring_cleanup,
	.sync_to		= gen6_blt_ring_sync_to,
	.semaphore_register	= {MI_SEMAPHORE_SYNC_BR,
				   MI_SEMAPHORE_SYNC_BV,
				   MI_SEMAPHORE_SYNC_INVALID},
	.signal_mbox		= {GEN6_RBSYNC, GEN6_VBSYNC},
1351 1352
};

1353 1354 1355
int intel_init_render_ring_buffer(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
1356
	struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1357

1358 1359 1360
	*ring = render_ring;
	if (INTEL_INFO(dev)->gen >= 6) {
		ring->add_request = gen6_add_request;
1361 1362
		ring->irq_get = gen6_render_ring_get_irq;
		ring->irq_put = gen6_render_ring_put_irq;
1363 1364 1365
	} else if (IS_GEN5(dev)) {
		ring->add_request = pc_render_add_request;
		ring->get_seqno = pc_render_get_seqno;
1366
	}
1367 1368

	if (!I915_NEED_GFX_HWS(dev)) {
1369 1370
		ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
		memset(ring->status_page.page_addr, 0, PAGE_SIZE);
1371 1372
	}

1373
	return intel_init_ring_buffer(dev, ring);
1374 1375
}

1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	struct intel_ring_buffer *ring = &dev_priv->ring[RCS];

	*ring = render_ring;
	if (INTEL_INFO(dev)->gen >= 6) {
		ring->add_request = gen6_add_request;
		ring->irq_get = gen6_render_ring_get_irq;
		ring->irq_put = gen6_render_ring_put_irq;
	} else if (IS_GEN5(dev)) {
		ring->add_request = pc_render_add_request;
		ring->get_seqno = pc_render_get_seqno;
	}

1391 1392 1393
	if (!I915_NEED_GFX_HWS(dev))
		ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;

1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
	ring->dev = dev;
	INIT_LIST_HEAD(&ring->active_list);
	INIT_LIST_HEAD(&ring->request_list);
	INIT_LIST_HEAD(&ring->gpu_write_list);

	ring->size = size;
	ring->effective_size = ring->size;
	if (IS_I830(ring->dev))
		ring->effective_size -= 128;

	ring->map.offset = start;
	ring->map.size = size;
	ring->map.type = 0;
	ring->map.flags = 0;
	ring->map.mtrr = 0;

	drm_core_ioremap_wc(&ring->map, dev);
	if (ring->map.handle == NULL) {
		DRM_ERROR("can not ioremap virtual address for"
			  " ring buffer\n");
		return -ENOMEM;
	}

	ring->virtual_start = (void __force __iomem *)ring->map.handle;
	return 0;
}

1421 1422 1423
int intel_init_bsd_ring_buffer(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
1424
	struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
1425

1426
	if (IS_GEN6(dev) || IS_GEN7(dev))
1427
		*ring = gen6_bsd_ring;
1428
	else
1429
		*ring = bsd_ring;
1430

1431
	return intel_init_ring_buffer(dev, ring);
1432
}
1433 1434 1435 1436

int intel_init_blt_ring_buffer(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
1437
	struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
1438

1439
	*ring = gen6_blt_ring;
1440

1441
	return intel_init_ring_buffer(dev, ring);
1442
}