linux/drivers/gpu/drm/i915/intel_ringbuffer.c
<<
>>
Prefs
   1/*
   2 * Copyright © 2008-2010 Intel Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21 * IN THE SOFTWARE.
  22 *
  23 * Authors:
  24 *    Eric Anholt <eric@anholt.net>
  25 *    Zou Nan hai <nanhai.zou@intel.com>
  26 *    Xiang Hai hao<haihao.xiang@intel.com>
  27 *
  28 */
  29
  30#include "drmP.h"
  31#include "drm.h"
  32#include "i915_drv.h"
  33#include "i915_drm.h"
  34#include "i915_trace.h"
  35#include "intel_drv.h"
  36
  37/*
  38 * 965+ support PIPE_CONTROL commands, which provide finer grained control
  39 * over cache flushing.
  40 */
  41struct pipe_control {
  42        struct drm_i915_gem_object *obj;
  43        volatile u32 *cpu_page;
  44        u32 gtt_offset;
  45};
  46
  47static inline int ring_space(struct intel_ring_buffer *ring)
  48{
  49        int space = (ring->head & HEAD_ADDR) - (ring->tail + 8);
  50        if (space < 0)
  51                space += ring->size;
  52        return space;
  53}
  54
  55static u32 i915_gem_get_seqno(struct drm_device *dev)
  56{
  57        drm_i915_private_t *dev_priv = dev->dev_private;
  58        u32 seqno;
  59
  60        seqno = dev_priv->next_seqno;
  61
  62        /* reserve 0 for non-seqno */
  63        if (++dev_priv->next_seqno == 0)
  64                dev_priv->next_seqno = 1;
  65
  66        return seqno;
  67}
  68
  69static int
  70render_ring_flush(struct intel_ring_buffer *ring,
  71                  u32   invalidate_domains,
  72                  u32   flush_domains)
  73{
  74        struct drm_device *dev = ring->dev;
  75        u32 cmd;
  76        int ret;
  77
  78        /*
  79         * read/write caches:
  80         *
  81         * I915_GEM_DOMAIN_RENDER is always invalidated, but is
  82         * only flushed if MI_NO_WRITE_FLUSH is unset.  On 965, it is
  83         * also flushed at 2d versus 3d pipeline switches.
  84         *
  85         * read-only caches:
  86         *
  87         * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
  88         * MI_READ_FLUSH is set, and is always flushed on 965.
  89         *
  90         * I915_GEM_DOMAIN_COMMAND may not exist?
  91         *
  92         * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
  93         * invalidated when MI_EXE_FLUSH is set.
  94         *
  95         * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
  96         * invalidated with every MI_FLUSH.
  97         *
  98         * TLBs:
  99         *
 100         * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
 101         * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
 102         * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
 103         * are flushed at any MI_FLUSH.
 104         */
 105
 106        cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
 107        if ((invalidate_domains|flush_domains) &
 108            I915_GEM_DOMAIN_RENDER)
 109                cmd &= ~MI_NO_WRITE_FLUSH;
 110        if (INTEL_INFO(dev)->gen < 4) {
 111                /*
 112                 * On the 965, the sampler cache always gets flushed
 113                 * and this bit is reserved.
 114                 */
 115                if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
 116                        cmd |= MI_READ_FLUSH;
 117        }
 118        if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
 119                cmd |= MI_EXE_FLUSH;
 120
 121        if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
 122            (IS_G4X(dev) || IS_GEN5(dev)))
 123                cmd |= MI_INVALIDATE_ISP;
 124
 125        ret = intel_ring_begin(ring, 2);
 126        if (ret)
 127                return ret;
 128
 129        intel_ring_emit(ring, cmd);
 130        intel_ring_emit(ring, MI_NOOP);
 131        intel_ring_advance(ring);
 132
 133        return 0;
 134}
 135
 136/**
 137 * Emits a PIPE_CONTROL with a non-zero post-sync operation, for
 138 * implementing two workarounds on gen6.  From section 1.4.7.1
 139 * "PIPE_CONTROL" of the Sandy Bridge PRM volume 2 part 1:
 140 *
 141 * [DevSNB-C+{W/A}] Before any depth stall flush (including those
 142 * produced by non-pipelined state commands), software needs to first
 143 * send a PIPE_CONTROL with no bits set except Post-Sync Operation !=
 144 * 0.
 145 *
 146 * [Dev-SNB{W/A}]: Before a PIPE_CONTROL with Write Cache Flush Enable
 147 * =1, a PIPE_CONTROL with any non-zero post-sync-op is required.
 148 *
 149 * And the workaround for these two requires this workaround first:
 150 *
 151 * [Dev-SNB{W/A}]: Pipe-control with CS-stall bit set must be sent
 152 * BEFORE the pipe-control with a post-sync op and no write-cache
 153 * flushes.
 154 *
 155 * And this last workaround is tricky because of the requirements on
 156 * that bit.  From section 1.4.7.2.3 "Stall" of the Sandy Bridge PRM
 157 * volume 2 part 1:
 158 *
 159 *     "1 of the following must also be set:
 160 *      - Render Target Cache Flush Enable ([12] of DW1)
 161 *      - Depth Cache Flush Enable ([0] of DW1)
 162 *      - Stall at Pixel Scoreboard ([1] of DW1)
 163 *      - Depth Stall ([13] of DW1)
 164 *      - Post-Sync Operation ([13] of DW1)
 165 *      - Notify Enable ([8] of DW1)"
 166 *
 167 * The cache flushes require the workaround flush that triggered this
 168 * one, so we can't use it.  Depth stall would trigger the same.
 169 * Post-sync nonzero is what triggered this second workaround, so we
 170 * can't use that one either.  Notify enable is IRQs, which aren't
 171 * really our business.  That leaves only stall at scoreboard.
 172 */
 173static int
 174intel_emit_post_sync_nonzero_flush(struct intel_ring_buffer *ring)
 175{
 176        struct pipe_control *pc = ring->private;
 177        u32 scratch_addr = pc->gtt_offset + 128;
 178        int ret;
 179
 180
 181        ret = intel_ring_begin(ring, 6);
 182        if (ret)
 183                return ret;
 184
 185        intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
 186        intel_ring_emit(ring, PIPE_CONTROL_CS_STALL |
 187                        PIPE_CONTROL_STALL_AT_SCOREBOARD);
 188        intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
 189        intel_ring_emit(ring, 0); /* low dword */
 190        intel_ring_emit(ring, 0); /* high dword */
 191        intel_ring_emit(ring, MI_NOOP);
 192        intel_ring_advance(ring);
 193
 194        ret = intel_ring_begin(ring, 6);
 195        if (ret)
 196                return ret;
 197
 198        intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
 199        intel_ring_emit(ring, PIPE_CONTROL_QW_WRITE);
 200        intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
 201        intel_ring_emit(ring, 0);
 202        intel_ring_emit(ring, 0);
 203        intel_ring_emit(ring, MI_NOOP);
 204        intel_ring_advance(ring);
 205
 206        return 0;
 207}
 208
 209static int
 210gen6_render_ring_flush(struct intel_ring_buffer *ring,
 211                         u32 invalidate_domains, u32 flush_domains)
 212{
 213        u32 flags = 0;
 214        struct pipe_control *pc = ring->private;
 215        u32 scratch_addr = pc->gtt_offset + 128;
 216        int ret;
 217
 218        /* Force SNB workarounds for PIPE_CONTROL flushes */
 219        intel_emit_post_sync_nonzero_flush(ring);
 220
 221        /* Just flush everything.  Experiments have shown that reducing the
 222         * number of bits based on the write domains has little performance
 223         * impact.
 224         */
 225        flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
 226        flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
 227        flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
 228        flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
 229        flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
 230        flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
 231        flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
 232
 233        ret = intel_ring_begin(ring, 6);
 234        if (ret)
 235                return ret;
 236
 237        intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
 238        intel_ring_emit(ring, flags);
 239        intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
 240        intel_ring_emit(ring, 0); /* lower dword */
 241        intel_ring_emit(ring, 0); /* uppwer dword */
 242        intel_ring_emit(ring, MI_NOOP);
 243        intel_ring_advance(ring);
 244
 245        return 0;
 246}
 247
 248static void ring_write_tail(struct intel_ring_buffer *ring,
 249                            u32 value)
 250{
 251        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 252        I915_WRITE_TAIL(ring, value);
 253}
 254
 255u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
 256{
 257        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 258        u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
 259                        RING_ACTHD(ring->mmio_base) : ACTHD;
 260
 261        return I915_READ(acthd_reg);
 262}
 263
 264static int init_ring_common(struct intel_ring_buffer *ring)
 265{
 266        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 267        struct drm_i915_gem_object *obj = ring->obj;
 268        u32 head;
 269
 270        /* Stop the ring if it's running. */
 271        I915_WRITE_CTL(ring, 0);
 272        I915_WRITE_HEAD(ring, 0);
 273        ring->write_tail(ring, 0);
 274
 275        /* Initialize the ring. */
 276        I915_WRITE_START(ring, obj->gtt_offset);
 277        head = I915_READ_HEAD(ring) & HEAD_ADDR;
 278
 279        /* G45 ring initialization fails to reset head to zero */
 280        if (head != 0) {
 281                DRM_DEBUG_KMS("%s head not reset to zero "
 282                              "ctl %08x head %08x tail %08x start %08x\n",
 283                              ring->name,
 284                              I915_READ_CTL(ring),
 285                              I915_READ_HEAD(ring),
 286                              I915_READ_TAIL(ring),
 287                              I915_READ_START(ring));
 288
 289                I915_WRITE_HEAD(ring, 0);
 290
 291                if (I915_READ_HEAD(ring) & HEAD_ADDR) {
 292                        DRM_ERROR("failed to set %s head to zero "
 293                                  "ctl %08x head %08x tail %08x start %08x\n",
 294                                  ring->name,
 295                                  I915_READ_CTL(ring),
 296                                  I915_READ_HEAD(ring),
 297                                  I915_READ_TAIL(ring),
 298                                  I915_READ_START(ring));
 299                }
 300        }
 301
 302        I915_WRITE_CTL(ring,
 303                        ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
 304                        | RING_REPORT_64K | RING_VALID);
 305
 306        /* If the head is still not zero, the ring is dead */
 307        if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
 308            I915_READ_START(ring) != obj->gtt_offset ||
 309            (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
 310                DRM_ERROR("%s initialization failed "
 311                                "ctl %08x head %08x tail %08x start %08x\n",
 312                                ring->name,
 313                                I915_READ_CTL(ring),
 314                                I915_READ_HEAD(ring),
 315                                I915_READ_TAIL(ring),
 316                                I915_READ_START(ring));
 317                return -EIO;
 318        }
 319
 320        if (!drm_core_check_feature(ring->dev, DRIVER_MODESET))
 321                i915_kernel_lost_context(ring->dev);
 322        else {
 323                ring->head = I915_READ_HEAD(ring);
 324                ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
 325                ring->space = ring_space(ring);
 326        }
 327
 328        return 0;
 329}
 330
 331static int
 332init_pipe_control(struct intel_ring_buffer *ring)
 333{
 334        struct pipe_control *pc;
 335        struct drm_i915_gem_object *obj;
 336        int ret;
 337
 338        if (ring->private)
 339                return 0;
 340
 341        pc = kmalloc(sizeof(*pc), GFP_KERNEL);
 342        if (!pc)
 343                return -ENOMEM;
 344
 345        obj = i915_gem_alloc_object(ring->dev, 4096);
 346        if (obj == NULL) {
 347                DRM_ERROR("Failed to allocate seqno page\n");
 348                ret = -ENOMEM;
 349                goto err;
 350        }
 351
 352        i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
 353
 354        ret = i915_gem_object_pin(obj, 4096, true);
 355        if (ret)
 356                goto err_unref;
 357
 358        pc->gtt_offset = obj->gtt_offset;
 359        pc->cpu_page =  kmap(obj->pages[0]);
 360        if (pc->cpu_page == NULL)
 361                goto err_unpin;
 362
 363        pc->obj = obj;
 364        ring->private = pc;
 365        return 0;
 366
 367err_unpin:
 368        i915_gem_object_unpin(obj);
 369err_unref:
 370        drm_gem_object_unreference(&obj->base);
 371err:
 372        kfree(pc);
 373        return ret;
 374}
 375
 376static void
 377cleanup_pipe_control(struct intel_ring_buffer *ring)
 378{
 379        struct pipe_control *pc = ring->private;
 380        struct drm_i915_gem_object *obj;
 381
 382        if (!ring->private)
 383                return;
 384
 385        obj = pc->obj;
 386        kunmap(obj->pages[0]);
 387        i915_gem_object_unpin(obj);
 388        drm_gem_object_unreference(&obj->base);
 389
 390        kfree(pc);
 391        ring->private = NULL;
 392}
 393
 394static int init_render_ring(struct intel_ring_buffer *ring)
 395{
 396        struct drm_device *dev = ring->dev;
 397        struct drm_i915_private *dev_priv = dev->dev_private;
 398        int ret = init_ring_common(ring);
 399
 400        if (INTEL_INFO(dev)->gen > 3) {
 401                int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
 402                if (IS_GEN6(dev) || IS_GEN7(dev))
 403                        mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
 404                I915_WRITE(MI_MODE, mode);
 405                if (IS_GEN7(dev))
 406                        I915_WRITE(GFX_MODE_GEN7,
 407                                   GFX_MODE_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
 408                                   GFX_MODE_ENABLE(GFX_REPLAY_MODE));
 409        }
 410
 411        if (INTEL_INFO(dev)->gen >= 5) {
 412                ret = init_pipe_control(ring);
 413                if (ret)
 414                        return ret;
 415        }
 416
 417        return ret;
 418}
 419
 420static void render_ring_cleanup(struct intel_ring_buffer *ring)
 421{
 422        if (!ring->private)
 423                return;
 424
 425        cleanup_pipe_control(ring);
 426}
 427
 428static void
 429update_mboxes(struct intel_ring_buffer *ring,
 430            u32 seqno,
 431            u32 mmio_offset)
 432{
 433        intel_ring_emit(ring, MI_SEMAPHORE_MBOX |
 434                              MI_SEMAPHORE_GLOBAL_GTT |
 435                              MI_SEMAPHORE_REGISTER |
 436                              MI_SEMAPHORE_UPDATE);
 437        intel_ring_emit(ring, seqno);
 438        intel_ring_emit(ring, mmio_offset);
 439}
 440
 441/**
 442 * gen6_add_request - Update the semaphore mailbox registers
 443 * 
 444 * @ring - ring that is adding a request
 445 * @seqno - return seqno stuck into the ring
 446 *
 447 * Update the mailbox registers in the *other* rings with the current seqno.
 448 * This acts like a signal in the canonical semaphore.
 449 */
 450static int
 451gen6_add_request(struct intel_ring_buffer *ring,
 452                 u32 *seqno)
 453{
 454        u32 mbox1_reg;
 455        u32 mbox2_reg;
 456        int ret;
 457
 458        ret = intel_ring_begin(ring, 10);
 459        if (ret)
 460                return ret;
 461
 462        mbox1_reg = ring->signal_mbox[0];
 463        mbox2_reg = ring->signal_mbox[1];
 464
 465        *seqno = i915_gem_get_seqno(ring->dev);
 466
 467        update_mboxes(ring, *seqno, mbox1_reg);
 468        update_mboxes(ring, *seqno, mbox2_reg);
 469        intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
 470        intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
 471        intel_ring_emit(ring, *seqno);
 472        intel_ring_emit(ring, MI_USER_INTERRUPT);
 473        intel_ring_advance(ring);
 474
 475        return 0;
 476}
 477
 478/**
 479 * intel_ring_sync - sync the waiter to the signaller on seqno
 480 *
 481 * @waiter - ring that is waiting
 482 * @signaller - ring which has, or will signal
 483 * @seqno - seqno which the waiter will block on
 484 */
 485static int
 486intel_ring_sync(struct intel_ring_buffer *waiter,
 487                struct intel_ring_buffer *signaller,
 488                int ring,
 489                u32 seqno)
 490{
 491        int ret;
 492        u32 dw1 = MI_SEMAPHORE_MBOX |
 493                  MI_SEMAPHORE_COMPARE |
 494                  MI_SEMAPHORE_REGISTER;
 495
 496        ret = intel_ring_begin(waiter, 4);
 497        if (ret)
 498                return ret;
 499
 500        intel_ring_emit(waiter, dw1 | signaller->semaphore_register[ring]);
 501        intel_ring_emit(waiter, seqno);
 502        intel_ring_emit(waiter, 0);
 503        intel_ring_emit(waiter, MI_NOOP);
 504        intel_ring_advance(waiter);
 505
 506        return 0;
 507}
 508
 509/* VCS->RCS (RVSYNC) or BCS->RCS (RBSYNC) */
 510int
 511render_ring_sync_to(struct intel_ring_buffer *waiter,
 512                    struct intel_ring_buffer *signaller,
 513                    u32 seqno)
 514{
 515        WARN_ON(signaller->semaphore_register[RCS] == MI_SEMAPHORE_SYNC_INVALID);
 516        return intel_ring_sync(waiter,
 517                               signaller,
 518                               RCS,
 519                               seqno);
 520}
 521
 522/* RCS->VCS (VRSYNC) or BCS->VCS (VBSYNC) */
 523int
 524gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter,
 525                      struct intel_ring_buffer *signaller,
 526                      u32 seqno)
 527{
 528        WARN_ON(signaller->semaphore_register[VCS] == MI_SEMAPHORE_SYNC_INVALID);
 529        return intel_ring_sync(waiter,
 530                               signaller,
 531                               VCS,
 532                               seqno);
 533}
 534
 535/* RCS->BCS (BRSYNC) or VCS->BCS (BVSYNC) */
 536int
 537gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter,
 538                      struct intel_ring_buffer *signaller,
 539                      u32 seqno)
 540{
 541        WARN_ON(signaller->semaphore_register[BCS] == MI_SEMAPHORE_SYNC_INVALID);
 542        return intel_ring_sync(waiter,
 543                               signaller,
 544                               BCS,
 545                               seqno);
 546}
 547
 548
 549
 550#define PIPE_CONTROL_FLUSH(ring__, addr__)                                      \
 551do {                                                                    \
 552        intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |                \
 553                 PIPE_CONTROL_DEPTH_STALL);                             \
 554        intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT);                    \
 555        intel_ring_emit(ring__, 0);                                                     \
 556        intel_ring_emit(ring__, 0);                                                     \
 557} while (0)
 558
 559static int
 560pc_render_add_request(struct intel_ring_buffer *ring,
 561                      u32 *result)
 562{
 563        struct drm_device *dev = ring->dev;
 564        u32 seqno = i915_gem_get_seqno(dev);
 565        struct pipe_control *pc = ring->private;
 566        u32 scratch_addr = pc->gtt_offset + 128;
 567        int ret;
 568
 569        /* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
 570         * incoherent with writes to memory, i.e. completely fubar,
 571         * so we need to use PIPE_NOTIFY instead.
 572         *
 573         * However, we also need to workaround the qword write
 574         * incoherence by flushing the 6 PIPE_NOTIFY buffers out to
 575         * memory before requesting an interrupt.
 576         */
 577        ret = intel_ring_begin(ring, 32);
 578        if (ret)
 579                return ret;
 580
 581        intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
 582                        PIPE_CONTROL_WRITE_FLUSH |
 583                        PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);
 584        intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
 585        intel_ring_emit(ring, seqno);
 586        intel_ring_emit(ring, 0);
 587        PIPE_CONTROL_FLUSH(ring, scratch_addr);
 588        scratch_addr += 128; /* write to separate cachelines */
 589        PIPE_CONTROL_FLUSH(ring, scratch_addr);
 590        scratch_addr += 128;
 591        PIPE_CONTROL_FLUSH(ring, scratch_addr);
 592        scratch_addr += 128;
 593        PIPE_CONTROL_FLUSH(ring, scratch_addr);
 594        scratch_addr += 128;
 595        PIPE_CONTROL_FLUSH(ring, scratch_addr);
 596        scratch_addr += 128;
 597        PIPE_CONTROL_FLUSH(ring, scratch_addr);
 598        intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
 599                        PIPE_CONTROL_WRITE_FLUSH |
 600                        PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
 601                        PIPE_CONTROL_NOTIFY);
 602        intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
 603        intel_ring_emit(ring, seqno);
 604        intel_ring_emit(ring, 0);
 605        intel_ring_advance(ring);
 606
 607        *result = seqno;
 608        return 0;
 609}
 610
 611static int
 612render_ring_add_request(struct intel_ring_buffer *ring,
 613                        u32 *result)
 614{
 615        struct drm_device *dev = ring->dev;
 616        u32 seqno = i915_gem_get_seqno(dev);
 617        int ret;
 618
 619        ret = intel_ring_begin(ring, 4);
 620        if (ret)
 621                return ret;
 622
 623        intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
 624        intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
 625        intel_ring_emit(ring, seqno);
 626        intel_ring_emit(ring, MI_USER_INTERRUPT);
 627        intel_ring_advance(ring);
 628
 629        *result = seqno;
 630        return 0;
 631}
 632
 633static u32
 634ring_get_seqno(struct intel_ring_buffer *ring)
 635{
 636        return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
 637}
 638
 639static u32
 640pc_render_get_seqno(struct intel_ring_buffer *ring)
 641{
 642        struct pipe_control *pc = ring->private;
 643        return pc->cpu_page[0];
 644}
 645
 646static void
 647ironlake_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
 648{
 649        dev_priv->gt_irq_mask &= ~mask;
 650        I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
 651        POSTING_READ(GTIMR);
 652}
 653
 654static void
 655ironlake_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
 656{
 657        dev_priv->gt_irq_mask |= mask;
 658        I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
 659        POSTING_READ(GTIMR);
 660}
 661
 662static void
 663i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
 664{
 665        dev_priv->irq_mask &= ~mask;
 666        I915_WRITE(IMR, dev_priv->irq_mask);
 667        POSTING_READ(IMR);
 668}
 669
 670static void
 671i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
 672{
 673        dev_priv->irq_mask |= mask;
 674        I915_WRITE(IMR, dev_priv->irq_mask);
 675        POSTING_READ(IMR);
 676}
 677
 678static bool
 679render_ring_get_irq(struct intel_ring_buffer *ring)
 680{
 681        struct drm_device *dev = ring->dev;
 682        drm_i915_private_t *dev_priv = dev->dev_private;
 683
 684        if (!dev->irq_enabled)
 685                return false;
 686
 687        spin_lock(&ring->irq_lock);
 688        if (ring->irq_refcount++ == 0) {
 689                if (HAS_PCH_SPLIT(dev))
 690                        ironlake_enable_irq(dev_priv,
 691                                            GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
 692                else
 693                        i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
 694        }
 695        spin_unlock(&ring->irq_lock);
 696
 697        return true;
 698}
 699
 700static void
 701render_ring_put_irq(struct intel_ring_buffer *ring)
 702{
 703        struct drm_device *dev = ring->dev;
 704        drm_i915_private_t *dev_priv = dev->dev_private;
 705
 706        spin_lock(&ring->irq_lock);
 707        if (--ring->irq_refcount == 0) {
 708                if (HAS_PCH_SPLIT(dev))
 709                        ironlake_disable_irq(dev_priv,
 710                                             GT_USER_INTERRUPT |
 711                                             GT_PIPE_NOTIFY);
 712                else
 713                        i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
 714        }
 715        spin_unlock(&ring->irq_lock);
 716}
 717
 718void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
 719{
 720        struct drm_device *dev = ring->dev;
 721        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 722        u32 mmio = 0;
 723
 724        /* The ring status page addresses are no longer next to the rest of
 725         * the ring registers as of gen7.
 726         */
 727        if (IS_GEN7(dev)) {
 728                switch (ring->id) {
 729                case RING_RENDER:
 730                        mmio = RENDER_HWS_PGA_GEN7;
 731                        break;
 732                case RING_BLT:
 733                        mmio = BLT_HWS_PGA_GEN7;
 734                        break;
 735                case RING_BSD:
 736                        mmio = BSD_HWS_PGA_GEN7;
 737                        break;
 738                }
 739        } else if (IS_GEN6(ring->dev)) {
 740                mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
 741        } else {
 742                mmio = RING_HWS_PGA(ring->mmio_base);
 743        }
 744
 745        I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
 746        POSTING_READ(mmio);
 747}
 748
 749static int
 750bsd_ring_flush(struct intel_ring_buffer *ring,
 751               u32     invalidate_domains,
 752               u32     flush_domains)
 753{
 754        int ret;
 755
 756        ret = intel_ring_begin(ring, 2);
 757        if (ret)
 758                return ret;
 759
 760        intel_ring_emit(ring, MI_FLUSH);
 761        intel_ring_emit(ring, MI_NOOP);
 762        intel_ring_advance(ring);
 763        return 0;
 764}
 765
 766static int
 767ring_add_request(struct intel_ring_buffer *ring,
 768                 u32 *result)
 769{
 770        u32 seqno;
 771        int ret;
 772
 773        ret = intel_ring_begin(ring, 4);
 774        if (ret)
 775                return ret;
 776
 777        seqno = i915_gem_get_seqno(ring->dev);
 778
 779        intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
 780        intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
 781        intel_ring_emit(ring, seqno);
 782        intel_ring_emit(ring, MI_USER_INTERRUPT);
 783        intel_ring_advance(ring);
 784
 785        *result = seqno;
 786        return 0;
 787}
 788
 789static bool
 790gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
 791{
 792        struct drm_device *dev = ring->dev;
 793        drm_i915_private_t *dev_priv = dev->dev_private;
 794
 795        if (!dev->irq_enabled)
 796               return false;
 797
 798        spin_lock(&ring->irq_lock);
 799        if (ring->irq_refcount++ == 0) {
 800                ring->irq_mask &= ~rflag;
 801                I915_WRITE_IMR(ring, ring->irq_mask);
 802                ironlake_enable_irq(dev_priv, gflag);
 803        }
 804        spin_unlock(&ring->irq_lock);
 805
 806        return true;
 807}
 808
 809static void
 810gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
 811{
 812        struct drm_device *dev = ring->dev;
 813        drm_i915_private_t *dev_priv = dev->dev_private;
 814
 815        spin_lock(&ring->irq_lock);
 816        if (--ring->irq_refcount == 0) {
 817                ring->irq_mask |= rflag;
 818                I915_WRITE_IMR(ring, ring->irq_mask);
 819                ironlake_disable_irq(dev_priv, gflag);
 820        }
 821        spin_unlock(&ring->irq_lock);
 822}
 823
 824static bool
 825bsd_ring_get_irq(struct intel_ring_buffer *ring)
 826{
 827        struct drm_device *dev = ring->dev;
 828        drm_i915_private_t *dev_priv = dev->dev_private;
 829
 830        if (!dev->irq_enabled)
 831                return false;
 832
 833        spin_lock(&ring->irq_lock);
 834        if (ring->irq_refcount++ == 0) {
 835                if (IS_G4X(dev))
 836                        i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
 837                else
 838                        ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
 839        }
 840        spin_unlock(&ring->irq_lock);
 841
 842        return true;
 843}
 844static void
 845bsd_ring_put_irq(struct intel_ring_buffer *ring)
 846{
 847        struct drm_device *dev = ring->dev;
 848        drm_i915_private_t *dev_priv = dev->dev_private;
 849
 850        spin_lock(&ring->irq_lock);
 851        if (--ring->irq_refcount == 0) {
 852                if (IS_G4X(dev))
 853                        i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
 854                else
 855                        ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
 856        }
 857        spin_unlock(&ring->irq_lock);
 858}
 859
 860static int
 861ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
 862{
 863        int ret;
 864
 865        ret = intel_ring_begin(ring, 2);
 866        if (ret)
 867                return ret;
 868
 869        intel_ring_emit(ring,
 870                        MI_BATCH_BUFFER_START | (2 << 6) |
 871                        MI_BATCH_NON_SECURE_I965);
 872        intel_ring_emit(ring, offset);
 873        intel_ring_advance(ring);
 874
 875        return 0;
 876}
 877
 878static int
 879render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
 880                                u32 offset, u32 len)
 881{
 882        struct drm_device *dev = ring->dev;
 883        int ret;
 884
 885        if (IS_I830(dev) || IS_845G(dev)) {
 886                ret = intel_ring_begin(ring, 4);
 887                if (ret)
 888                        return ret;
 889
 890                intel_ring_emit(ring, MI_BATCH_BUFFER);
 891                intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
 892                intel_ring_emit(ring, offset + len - 8);
 893                intel_ring_emit(ring, 0);
 894        } else {
 895                ret = intel_ring_begin(ring, 2);
 896                if (ret)
 897                        return ret;
 898
 899                if (INTEL_INFO(dev)->gen >= 4) {
 900                        intel_ring_emit(ring,
 901                                        MI_BATCH_BUFFER_START | (2 << 6) |
 902                                        MI_BATCH_NON_SECURE_I965);
 903                        intel_ring_emit(ring, offset);
 904                } else {
 905                        intel_ring_emit(ring,
 906                                        MI_BATCH_BUFFER_START | (2 << 6));
 907                        intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
 908                }
 909        }
 910        intel_ring_advance(ring);
 911
 912        return 0;
 913}
 914
 915static void cleanup_status_page(struct intel_ring_buffer *ring)
 916{
 917        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 918        struct drm_i915_gem_object *obj;
 919
 920        obj = ring->status_page.obj;
 921        if (obj == NULL)
 922                return;
 923
 924        kunmap(obj->pages[0]);
 925        i915_gem_object_unpin(obj);
 926        drm_gem_object_unreference(&obj->base);
 927        ring->status_page.obj = NULL;
 928
 929        memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
 930}
 931
 932static int init_status_page(struct intel_ring_buffer *ring)
 933{
 934        struct drm_device *dev = ring->dev;
 935        drm_i915_private_t *dev_priv = dev->dev_private;
 936        struct drm_i915_gem_object *obj;
 937        int ret;
 938
 939        obj = i915_gem_alloc_object(dev, 4096);
 940        if (obj == NULL) {
 941                DRM_ERROR("Failed to allocate status page\n");
 942                ret = -ENOMEM;
 943                goto err;
 944        }
 945
 946        i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
 947
 948        ret = i915_gem_object_pin(obj, 4096, true);
 949        if (ret != 0) {
 950                goto err_unref;
 951        }
 952
 953        ring->status_page.gfx_addr = obj->gtt_offset;
 954        ring->status_page.page_addr = kmap(obj->pages[0]);
 955        if (ring->status_page.page_addr == NULL) {
 956                memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
 957                goto err_unpin;
 958        }
 959        ring->status_page.obj = obj;
 960        memset(ring->status_page.page_addr, 0, PAGE_SIZE);
 961
 962        intel_ring_setup_status_page(ring);
 963        DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
 964                        ring->name, ring->status_page.gfx_addr);
 965
 966        return 0;
 967
 968err_unpin:
 969        i915_gem_object_unpin(obj);
 970err_unref:
 971        drm_gem_object_unreference(&obj->base);
 972err:
 973        return ret;
 974}
 975
 976int intel_init_ring_buffer(struct drm_device *dev,
 977                           struct intel_ring_buffer *ring)
 978{
 979        struct drm_i915_gem_object *obj;
 980        int ret;
 981
 982        ring->dev = dev;
 983        INIT_LIST_HEAD(&ring->active_list);
 984        INIT_LIST_HEAD(&ring->request_list);
 985        INIT_LIST_HEAD(&ring->gpu_write_list);
 986
 987        init_waitqueue_head(&ring->irq_queue);
 988        spin_lock_init(&ring->irq_lock);
 989        ring->irq_mask = ~0;
 990
 991        if (I915_NEED_GFX_HWS(dev)) {
 992                ret = init_status_page(ring);
 993                if (ret)
 994                        return ret;
 995        }
 996
 997        obj = i915_gem_alloc_object(dev, ring->size);
 998        if (obj == NULL) {
 999                DRM_ERROR("Failed to allocate ringbuffer\n");
1000                ret = -ENOMEM;
1001                goto err_hws;
1002        }
1003
1004        ring->obj = obj;
1005
1006        ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
1007        if (ret)
1008                goto err_unref;
1009
1010        ring->map.size = ring->size;
1011        ring->map.offset = dev->agp->base + obj->gtt_offset;
1012        ring->map.type = 0;
1013        ring->map.flags = 0;
1014        ring->map.mtrr = 0;
1015
1016        drm_core_ioremap_wc(&ring->map, dev);
1017        if (ring->map.handle == NULL) {
1018                DRM_ERROR("Failed to map ringbuffer.\n");
1019                ret = -EINVAL;
1020                goto err_unpin;
1021        }
1022
1023        ring->virtual_start = ring->map.handle;
1024        ret = ring->init(ring);
1025        if (ret)
1026                goto err_unmap;
1027
1028        /* Workaround an erratum on the i830 which causes a hang if
1029         * the TAIL pointer points to within the last 2 cachelines
1030         * of the buffer.
1031         */
1032        ring->effective_size = ring->size;
1033        if (IS_I830(ring->dev))
1034                ring->effective_size -= 128;
1035
1036        return 0;
1037
1038err_unmap:
1039        drm_core_ioremapfree(&ring->map, dev);
1040err_unpin:
1041        i915_gem_object_unpin(obj);
1042err_unref:
1043        drm_gem_object_unreference(&obj->base);
1044        ring->obj = NULL;
1045err_hws:
1046        cleanup_status_page(ring);
1047        return ret;
1048}
1049
1050void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
1051{
1052        struct drm_i915_private *dev_priv;
1053        int ret;
1054
1055        if (ring->obj == NULL)
1056                return;
1057
1058        /* Disable the ring buffer. The ring must be idle at this point */
1059        dev_priv = ring->dev->dev_private;
1060        ret = intel_wait_ring_idle(ring);
1061        if (ret)
1062                DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
1063                          ring->name, ret);
1064
1065        I915_WRITE_CTL(ring, 0);
1066
1067        drm_core_ioremapfree(&ring->map, ring->dev);
1068
1069        i915_gem_object_unpin(ring->obj);
1070        drm_gem_object_unreference(&ring->obj->base);
1071        ring->obj = NULL;
1072
1073        if (ring->cleanup)
1074                ring->cleanup(ring);
1075
1076        cleanup_status_page(ring);
1077}
1078
1079static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
1080{
1081        unsigned int *virt;
1082        int rem = ring->size - ring->tail;
1083
1084        if (ring->space < rem) {
1085                int ret = intel_wait_ring_buffer(ring, rem);
1086                if (ret)
1087                        return ret;
1088        }
1089
1090        virt = (unsigned int *)(ring->virtual_start + ring->tail);
1091        rem /= 8;
1092        while (rem--) {
1093                *virt++ = MI_NOOP;
1094                *virt++ = MI_NOOP;
1095        }
1096
1097        ring->tail = 0;
1098        ring->space = ring_space(ring);
1099
1100        return 0;
1101}
1102
1103int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
1104{
1105        struct drm_device *dev = ring->dev;
1106        struct drm_i915_private *dev_priv = dev->dev_private;
1107        unsigned long end;
1108        u32 head;
1109
1110        /* If the reported head position has wrapped or hasn't advanced,
1111         * fallback to the slow and accurate path.
1112         */
1113        head = intel_read_status_page(ring, 4);
1114        if (head > ring->head) {
1115                ring->head = head;
1116                ring->space = ring_space(ring);
1117                if (ring->space >= n)
1118                        return 0;
1119        }
1120
1121        trace_i915_ring_wait_begin(ring);
1122        end = jiffies + 3 * HZ;
1123        do {
1124                ring->head = I915_READ_HEAD(ring);
1125                ring->space = ring_space(ring);
1126                if (ring->space >= n) {
1127                        trace_i915_ring_wait_end(ring);
1128                        return 0;
1129                }
1130
1131                if (dev->primary->master) {
1132                        struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1133                        if (master_priv->sarea_priv)
1134                                master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
1135                }
1136
1137                msleep(1);
1138                if (atomic_read(&dev_priv->mm.wedged))
1139                        return -EAGAIN;
1140        } while (!time_after(jiffies, end));
1141        trace_i915_ring_wait_end(ring);
1142        return -EBUSY;
1143}
1144
1145int intel_ring_begin(struct intel_ring_buffer *ring,
1146                     int num_dwords)
1147{
1148        struct drm_i915_private *dev_priv = ring->dev->dev_private;
1149        int n = 4*num_dwords;
1150        int ret;
1151
1152        if (unlikely(atomic_read(&dev_priv->mm.wedged)))
1153                return -EIO;
1154
1155        if (unlikely(ring->tail + n > ring->effective_size)) {
1156                ret = intel_wrap_ring_buffer(ring);
1157                if (unlikely(ret))
1158                        return ret;
1159        }
1160
1161        if (unlikely(ring->space < n)) {
1162                ret = intel_wait_ring_buffer(ring, n);
1163                if (unlikely(ret))
1164                        return ret;
1165        }
1166
1167        ring->space -= n;
1168        return 0;
1169}
1170
1171void intel_ring_advance(struct intel_ring_buffer *ring)
1172{
1173        ring->tail &= ring->size - 1;
1174        ring->write_tail(ring, ring->tail);
1175}
1176
1177static const struct intel_ring_buffer render_ring = {
1178        .name                   = "render ring",
1179        .id                     = RING_RENDER,
1180        .mmio_base              = RENDER_RING_BASE,
1181        .size                   = 32 * PAGE_SIZE,
1182        .init                   = init_render_ring,
1183        .write_tail             = ring_write_tail,
1184        .flush                  = render_ring_flush,
1185        .add_request            = render_ring_add_request,
1186        .get_seqno              = ring_get_seqno,
1187        .irq_get                = render_ring_get_irq,
1188        .irq_put                = render_ring_put_irq,
1189        .dispatch_execbuffer    = render_ring_dispatch_execbuffer,
1190        .cleanup                = render_ring_cleanup,
1191        .sync_to                = render_ring_sync_to,
1192        .semaphore_register     = {MI_SEMAPHORE_SYNC_INVALID,
1193                                   MI_SEMAPHORE_SYNC_RV,
1194                                   MI_SEMAPHORE_SYNC_RB},
1195        .signal_mbox            = {GEN6_VRSYNC, GEN6_BRSYNC},
1196};
1197
1198/* ring buffer for bit-stream decoder */
1199
1200static const struct intel_ring_buffer bsd_ring = {
1201        .name                   = "bsd ring",
1202        .id                     = RING_BSD,
1203        .mmio_base              = BSD_RING_BASE,
1204        .size                   = 32 * PAGE_SIZE,
1205        .init                   = init_ring_common,
1206        .write_tail             = ring_write_tail,
1207        .flush                  = bsd_ring_flush,
1208        .add_request            = ring_add_request,
1209        .get_seqno              = ring_get_seqno,
1210        .irq_get                = bsd_ring_get_irq,
1211        .irq_put                = bsd_ring_put_irq,
1212        .dispatch_execbuffer    = ring_dispatch_execbuffer,
1213};
1214
1215
1216static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1217                                     u32 value)
1218{
1219        drm_i915_private_t *dev_priv = ring->dev->dev_private;
1220
1221       /* Every tail move must follow the sequence below */
1222        I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1223                GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1224                GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
1225        I915_WRITE(GEN6_BSD_RNCID, 0x0);
1226
1227        if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
1228                GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
1229                50))
1230        DRM_ERROR("timed out waiting for IDLE Indicator\n");
1231
1232        I915_WRITE_TAIL(ring, value);
1233        I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1234                GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1235                GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1236}
1237
1238static int gen6_ring_flush(struct intel_ring_buffer *ring,
1239                           u32 invalidate, u32 flush)
1240{
1241        uint32_t cmd;
1242        int ret;
1243
1244        ret = intel_ring_begin(ring, 4);
1245        if (ret)
1246                return ret;
1247
1248        cmd = MI_FLUSH_DW;
1249        if (invalidate & I915_GEM_GPU_DOMAINS)
1250                cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
1251        intel_ring_emit(ring, cmd);
1252        intel_ring_emit(ring, 0);
1253        intel_ring_emit(ring, 0);
1254        intel_ring_emit(ring, MI_NOOP);
1255        intel_ring_advance(ring);
1256        return 0;
1257}
1258
1259static int
1260gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
1261                              u32 offset, u32 len)
1262{
1263        int ret;
1264
1265        ret = intel_ring_begin(ring, 2);
1266        if (ret)
1267                return ret;
1268
1269        intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
1270        /* bit0-7 is the length on GEN6+ */
1271        intel_ring_emit(ring, offset);
1272        intel_ring_advance(ring);
1273
1274        return 0;
1275}
1276
1277static bool
1278gen6_render_ring_get_irq(struct intel_ring_buffer *ring)
1279{
1280        return gen6_ring_get_irq(ring,
1281                                 GT_USER_INTERRUPT,
1282                                 GEN6_RENDER_USER_INTERRUPT);
1283}
1284
1285static void
1286gen6_render_ring_put_irq(struct intel_ring_buffer *ring)
1287{
1288        return gen6_ring_put_irq(ring,
1289                                 GT_USER_INTERRUPT,
1290                                 GEN6_RENDER_USER_INTERRUPT);
1291}
1292
1293static bool
1294gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
1295{
1296        return gen6_ring_get_irq(ring,
1297                                 GT_GEN6_BSD_USER_INTERRUPT,
1298                                 GEN6_BSD_USER_INTERRUPT);
1299}
1300
1301static void
1302gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
1303{
1304        return gen6_ring_put_irq(ring,
1305                                 GT_GEN6_BSD_USER_INTERRUPT,
1306                                 GEN6_BSD_USER_INTERRUPT);
1307}
1308
1309/* ring buffer for Video Codec for Gen6+ */
1310static const struct intel_ring_buffer gen6_bsd_ring = {
1311        .name                   = "gen6 bsd ring",
1312        .id                     = RING_BSD,
1313        .mmio_base              = GEN6_BSD_RING_BASE,
1314        .size                   = 32 * PAGE_SIZE,
1315        .init                   = init_ring_common,
1316        .write_tail             = gen6_bsd_ring_write_tail,
1317        .flush                  = gen6_ring_flush,
1318        .add_request            = gen6_add_request,
1319        .get_seqno              = ring_get_seqno,
1320        .irq_get                = gen6_bsd_ring_get_irq,
1321        .irq_put                = gen6_bsd_ring_put_irq,
1322        .dispatch_execbuffer    = gen6_ring_dispatch_execbuffer,
1323        .sync_to                = gen6_bsd_ring_sync_to,
1324        .semaphore_register     = {MI_SEMAPHORE_SYNC_VR,
1325                                   MI_SEMAPHORE_SYNC_INVALID,
1326                                   MI_SEMAPHORE_SYNC_VB},
1327        .signal_mbox            = {GEN6_RVSYNC, GEN6_BVSYNC},
1328};
1329
1330/* Blitter support (SandyBridge+) */
1331
1332static bool
1333blt_ring_get_irq(struct intel_ring_buffer *ring)
1334{
1335        return gen6_ring_get_irq(ring,
1336                                 GT_BLT_USER_INTERRUPT,
1337                                 GEN6_BLITTER_USER_INTERRUPT);
1338}
1339
1340static void
1341blt_ring_put_irq(struct intel_ring_buffer *ring)
1342{
1343        gen6_ring_put_irq(ring,
1344                          GT_BLT_USER_INTERRUPT,
1345                          GEN6_BLITTER_USER_INTERRUPT);
1346}
1347
1348
1349/* Workaround for some stepping of SNB,
1350 * each time when BLT engine ring tail moved,
1351 * the first command in the ring to be parsed
1352 * should be MI_BATCH_BUFFER_START
1353 */
1354#define NEED_BLT_WORKAROUND(dev) \
1355        (IS_GEN6(dev) && (dev->pdev->revision < 8))
1356
1357static inline struct drm_i915_gem_object *
1358to_blt_workaround(struct intel_ring_buffer *ring)
1359{
1360        return ring->private;
1361}
1362
1363static int blt_ring_init(struct intel_ring_buffer *ring)
1364{
1365        if (NEED_BLT_WORKAROUND(ring->dev)) {
1366                struct drm_i915_gem_object *obj;
1367                u32 *ptr;
1368                int ret;
1369
1370                obj = i915_gem_alloc_object(ring->dev, 4096);
1371                if (obj == NULL)
1372                        return -ENOMEM;
1373
1374                ret = i915_gem_object_pin(obj, 4096, true);
1375                if (ret) {
1376                        drm_gem_object_unreference(&obj->base);
1377                        return ret;
1378                }
1379
1380                ptr = kmap(obj->pages[0]);
1381                *ptr++ = MI_BATCH_BUFFER_END;
1382                *ptr++ = MI_NOOP;
1383                kunmap(obj->pages[0]);
1384
1385                ret = i915_gem_object_set_to_gtt_domain(obj, false);
1386                if (ret) {
1387                        i915_gem_object_unpin(obj);
1388                        drm_gem_object_unreference(&obj->base);
1389                        return ret;
1390                }
1391
1392                ring->private = obj;
1393        }
1394
1395        return init_ring_common(ring);
1396}
1397
1398static int blt_ring_begin(struct intel_ring_buffer *ring,
1399                          int num_dwords)
1400{
1401        if (ring->private) {
1402                int ret = intel_ring_begin(ring, num_dwords+2);
1403                if (ret)
1404                        return ret;
1405
1406                intel_ring_emit(ring, MI_BATCH_BUFFER_START);
1407                intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);
1408
1409                return 0;
1410        } else
1411                return intel_ring_begin(ring, 4);
1412}
1413
1414static int blt_ring_flush(struct intel_ring_buffer *ring,
1415                          u32 invalidate, u32 flush)
1416{
1417        uint32_t cmd;
1418        int ret;
1419
1420        ret = blt_ring_begin(ring, 4);
1421        if (ret)
1422                return ret;
1423
1424        cmd = MI_FLUSH_DW;
1425        if (invalidate & I915_GEM_DOMAIN_RENDER)
1426                cmd |= MI_INVALIDATE_TLB;
1427        intel_ring_emit(ring, cmd);
1428        intel_ring_emit(ring, 0);
1429        intel_ring_emit(ring, 0);
1430        intel_ring_emit(ring, MI_NOOP);
1431        intel_ring_advance(ring);
1432        return 0;
1433}
1434
1435static void blt_ring_cleanup(struct intel_ring_buffer *ring)
1436{
1437        if (!ring->private)
1438                return;
1439
1440        i915_gem_object_unpin(ring->private);
1441        drm_gem_object_unreference(ring->private);
1442        ring->private = NULL;
1443}
1444
1445static const struct intel_ring_buffer gen6_blt_ring = {
1446        .name                   = "blt ring",
1447        .id                     = RING_BLT,
1448        .mmio_base              = BLT_RING_BASE,
1449        .size                   = 32 * PAGE_SIZE,
1450        .init                   = blt_ring_init,
1451        .write_tail             = ring_write_tail,
1452        .flush                  = blt_ring_flush,
1453        .add_request            = gen6_add_request,
1454        .get_seqno              = ring_get_seqno,
1455        .irq_get                = blt_ring_get_irq,
1456        .irq_put                = blt_ring_put_irq,
1457        .dispatch_execbuffer    = gen6_ring_dispatch_execbuffer,
1458        .cleanup                = blt_ring_cleanup,
1459        .sync_to                = gen6_blt_ring_sync_to,
1460        .semaphore_register     = {MI_SEMAPHORE_SYNC_BR,
1461                                   MI_SEMAPHORE_SYNC_BV,
1462                                   MI_SEMAPHORE_SYNC_INVALID},
1463        .signal_mbox            = {GEN6_RBSYNC, GEN6_VBSYNC},
1464};
1465
1466int intel_init_render_ring_buffer(struct drm_device *dev)
1467{
1468        drm_i915_private_t *dev_priv = dev->dev_private;
1469        struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1470
1471        *ring = render_ring;
1472        if (INTEL_INFO(dev)->gen >= 6) {
1473                ring->add_request = gen6_add_request;
1474                ring->flush = gen6_render_ring_flush;
1475                ring->irq_get = gen6_render_ring_get_irq;
1476                ring->irq_put = gen6_render_ring_put_irq;
1477        } else if (IS_GEN5(dev)) {
1478                ring->add_request = pc_render_add_request;
1479                ring->get_seqno = pc_render_get_seqno;
1480        }
1481
1482        if (!I915_NEED_GFX_HWS(dev)) {
1483                ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1484                memset(ring->status_page.page_addr, 0, PAGE_SIZE);
1485        }
1486
1487        return intel_init_ring_buffer(dev, ring);
1488}
1489
1490int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
1491{
1492        drm_i915_private_t *dev_priv = dev->dev_private;
1493        struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1494
1495        *ring = render_ring;
1496        if (INTEL_INFO(dev)->gen >= 6) {
1497                ring->add_request = gen6_add_request;
1498                ring->irq_get = gen6_render_ring_get_irq;
1499                ring->irq_put = gen6_render_ring_put_irq;
1500        } else if (IS_GEN5(dev)) {
1501                ring->add_request = pc_render_add_request;
1502                ring->get_seqno = pc_render_get_seqno;
1503        }
1504
1505        if (!I915_NEED_GFX_HWS(dev))
1506                ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1507
1508        ring->dev = dev;
1509        INIT_LIST_HEAD(&ring->active_list);
1510        INIT_LIST_HEAD(&ring->request_list);
1511        INIT_LIST_HEAD(&ring->gpu_write_list);
1512
1513        ring->size = size;
1514        ring->effective_size = ring->size;
1515        if (IS_I830(ring->dev))
1516                ring->effective_size -= 128;
1517
1518        ring->map.offset = start;
1519        ring->map.size = size;
1520        ring->map.type = 0;
1521        ring->map.flags = 0;
1522        ring->map.mtrr = 0;
1523
1524        drm_core_ioremap_wc(&ring->map, dev);
1525        if (ring->map.handle == NULL) {
1526                DRM_ERROR("can not ioremap virtual address for"
1527                          " ring buffer\n");
1528                return -ENOMEM;
1529        }
1530
1531        ring->virtual_start = (void __force __iomem *)ring->map.handle;
1532        return 0;
1533}
1534
1535int intel_init_bsd_ring_buffer(struct drm_device *dev)
1536{
1537        drm_i915_private_t *dev_priv = dev->dev_private;
1538        struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
1539
1540        if (IS_GEN6(dev) || IS_GEN7(dev))
1541                *ring = gen6_bsd_ring;
1542        else
1543                *ring = bsd_ring;
1544
1545        return intel_init_ring_buffer(dev, ring);
1546}
1547
1548int intel_init_blt_ring_buffer(struct drm_device *dev)
1549{
1550        drm_i915_private_t *dev_priv = dev->dev_private;
1551        struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
1552
1553        *ring = gen6_blt_ring;
1554
1555        return intel_init_ring_buffer(dev, ring);
1556}
1557