Merge branch 'vendor/MDOCML'
[dragonfly.git] / sys / dev / drm / i915 / i915_gem.c
1 /*-
2  * Copyright © 2008 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  *
26  * Copyright (c) 2011 The FreeBSD Foundation
27  * All rights reserved.
28  *
29  * This software was developed by Konstantin Belousov under sponsorship from
30  * the FreeBSD Foundation.
31  *
32  * Redistribution and use in source and binary forms, with or without
33  * modification, are permitted provided that the following conditions
34  * are met:
35  * 1. Redistributions of source code must retain the above copyright
36  *    notice, this list of conditions and the following disclaimer.
37  * 2. Redistributions in binary form must reproduce the above copyright
38  *    notice, this list of conditions and the following disclaimer in the
39  *    documentation and/or other materials provided with the distribution.
40  *
41  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * $FreeBSD: head/sys/dev/drm2/i915/i915_gem.c 253497 2013-07-20 13:52:40Z kib $
54  */
55
56 #include <sys/resourcevar.h>
57 #include <sys/sfbuf.h>
58
59 #include <drm/drmP.h>
60 #include <drm/i915_drm.h>
61 #include "i915_drv.h"
62 #include "intel_drv.h"
63 #include "intel_ringbuffer.h"
64
65 static void i915_gem_object_flush_cpu_write_domain(
66     struct drm_i915_gem_object *obj);
67 static uint32_t i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size,
68     int tiling_mode);
69 static uint32_t i915_gem_get_gtt_alignment(struct drm_device *dev,
70     uint32_t size, int tiling_mode);
71 static int i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
72     unsigned alignment, bool map_and_fenceable);
73 static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
74     int flags);
75 static void i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj);
76 static int i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj,
77     bool write);
78 static void i915_gem_object_set_to_full_cpu_read_domain(
79     struct drm_i915_gem_object *obj);
80 static int i915_gem_object_set_cpu_read_domain_range(
81     struct drm_i915_gem_object *obj, uint64_t offset, uint64_t size);
82 static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj);
83 static void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
84 static int i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj);
85 static bool i915_gem_object_is_inactive(struct drm_i915_gem_object *obj);
86 static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj);
87 static vm_page_t i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex);
88 static void i915_gem_process_flushing_list(struct intel_ring_buffer *ring,
89     uint32_t flush_domains);
90 static void i915_gem_clear_fence_reg(struct drm_device *dev,
91     struct drm_i915_fence_reg *reg);
92 static void i915_gem_reset_fences(struct drm_device *dev);
93 static void i915_gem_retire_task_handler(void *arg, int pending);
94 static int i915_gem_phys_pwrite(struct drm_device *dev,
95     struct drm_i915_gem_object *obj, uint64_t data_ptr, uint64_t offset,
96     uint64_t size, struct drm_file *file_priv);
97 static void i915_gem_lowmem(void *arg);
98
99 MALLOC_DEFINE(DRM_I915_GEM, "i915gem", "Allocations from i915 gem");
100 long i915_gem_wired_pages_cnt;
101
102 static void
103 i915_gem_info_add_obj(struct drm_i915_private *dev_priv, size_t size)
104 {
105
106         dev_priv->mm.object_count++;
107         dev_priv->mm.object_memory += size;
108 }
109
110 static void
111 i915_gem_info_remove_obj(struct drm_i915_private *dev_priv, size_t size)
112 {
113
114         dev_priv->mm.object_count--;
115         dev_priv->mm.object_memory -= size;
116 }
117
118 static int
119 i915_gem_wait_for_error(struct drm_device *dev)
120 {
121         struct drm_i915_private *dev_priv;
122         int ret;
123
124         dev_priv = dev->dev_private;
125         if (!atomic_load_acq_int(&dev_priv->mm.wedged))
126                 return (0);
127
128         lockmgr(&dev_priv->error_completion_lock, LK_EXCLUSIVE);
129         while (dev_priv->error_completion == 0) {
130                 ret = -lksleep(&dev_priv->error_completion,
131                     &dev_priv->error_completion_lock, PCATCH, "915wco", 0);
132                 if (ret != 0) {
133                         lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
134                         return (ret);
135                 }
136         }
137         lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
138
139         if (atomic_load_acq_int(&dev_priv->mm.wedged)) {
140                 lockmgr(&dev_priv->error_completion_lock, LK_EXCLUSIVE);
141                 dev_priv->error_completion++;
142                 lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
143         }
144         return (0);
145 }
146
147 int
148 i915_mutex_lock_interruptible(struct drm_device *dev)
149 {
150         struct drm_i915_private *dev_priv;
151         int ret;
152
153         dev_priv = dev->dev_private;
154         ret = i915_gem_wait_for_error(dev);
155         if (ret != 0)
156                 return (ret);
157
158         /*
159          * interruptible shall it be. might indeed be if dev_lock is
160          * changed to sx
161          */
162         ret = lockmgr(&dev->dev_struct_lock, LK_EXCLUSIVE|LK_SLEEPFAIL);
163         if (ret != 0)
164                 return (-ret);
165
166         return (0);
167 }
168
169
170 static void
171 i915_gem_free_object_tail(struct drm_i915_gem_object *obj)
172 {
173         struct drm_device *dev;
174         drm_i915_private_t *dev_priv;
175         int ret;
176
177         dev = obj->base.dev;
178         dev_priv = dev->dev_private;
179
180         ret = i915_gem_object_unbind(obj);
181         if (ret == -ERESTART) {
182                 list_move(&obj->mm_list, &dev_priv->mm.deferred_free_list);
183                 return;
184         }
185
186         drm_gem_free_mmap_offset(&obj->base);
187         drm_gem_object_release(&obj->base);
188         i915_gem_info_remove_obj(dev_priv, obj->base.size);
189
190         drm_free(obj->page_cpu_valid, DRM_I915_GEM);
191         drm_free(obj->bit_17, DRM_I915_GEM);
192         drm_free(obj, DRM_I915_GEM);
193 }
194
195 void
196 i915_gem_free_object(struct drm_gem_object *gem_obj)
197 {
198         struct drm_i915_gem_object *obj;
199         struct drm_device *dev;
200
201         obj = to_intel_bo(gem_obj);
202         dev = obj->base.dev;
203
204         while (obj->pin_count > 0)
205                 i915_gem_object_unpin(obj);
206
207         if (obj->phys_obj != NULL)
208                 i915_gem_detach_phys_object(dev, obj);
209
210         i915_gem_free_object_tail(obj);
211 }
212
213 static void
214 init_ring_lists(struct intel_ring_buffer *ring)
215 {
216
217         INIT_LIST_HEAD(&ring->active_list);
218         INIT_LIST_HEAD(&ring->request_list);
219         INIT_LIST_HEAD(&ring->gpu_write_list);
220 }
221
222 void
223 i915_gem_load(struct drm_device *dev)
224 {
225         drm_i915_private_t *dev_priv;
226         int i;
227
228         dev_priv = dev->dev_private;
229
230         INIT_LIST_HEAD(&dev_priv->mm.active_list);
231         INIT_LIST_HEAD(&dev_priv->mm.flushing_list);
232         INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
233         INIT_LIST_HEAD(&dev_priv->mm.pinned_list);
234         INIT_LIST_HEAD(&dev_priv->mm.fence_list);
235         INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
236         INIT_LIST_HEAD(&dev_priv->mm.gtt_list);
237         for (i = 0; i < I915_NUM_RINGS; i++)
238                 init_ring_lists(&dev_priv->rings[i]);
239         for (i = 0; i < I915_MAX_NUM_FENCES; i++)
240                 INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
241         TIMEOUT_TASK_INIT(dev_priv->tq, &dev_priv->mm.retire_task, 0,
242             i915_gem_retire_task_handler, dev_priv);
243         dev_priv->error_completion = 0;
244
245         /* On GEN3 we really need to make sure the ARB C3 LP bit is set */
246         if (IS_GEN3(dev)) {
247                 u32 tmp = I915_READ(MI_ARB_STATE);
248                 if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) {
249                         /*
250                          * arb state is a masked write, so set bit +
251                          * bit in mask.
252                          */
253                         tmp = MI_ARB_C3_LP_WRITE_ENABLE |
254                             (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT);
255                         I915_WRITE(MI_ARB_STATE, tmp);
256                 }
257         }
258
259         dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
260
261         /* Old X drivers will take 0-2 for front, back, depth buffers */
262         if (!drm_core_check_feature(dev, DRIVER_MODESET))
263                 dev_priv->fence_reg_start = 3;
264
265         if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) ||
266             IS_G33(dev))
267                 dev_priv->num_fence_regs = 16;
268         else
269                 dev_priv->num_fence_regs = 8;
270
271         /* Initialize fence registers to zero */
272         for (i = 0; i < dev_priv->num_fence_regs; i++) {
273                 i915_gem_clear_fence_reg(dev, &dev_priv->fence_regs[i]);
274         }
275         i915_gem_detect_bit_6_swizzle(dev);
276         dev_priv->mm.interruptible = true;
277
278         dev_priv->mm.i915_lowmem = EVENTHANDLER_REGISTER(vm_lowmem,
279             i915_gem_lowmem, dev, EVENTHANDLER_PRI_ANY);
280 }
281
282 int
283 i915_gem_do_init(struct drm_device *dev, unsigned long start,
284     unsigned long mappable_end, unsigned long end)
285 {
286         drm_i915_private_t *dev_priv;
287         unsigned long mappable;
288         int error;
289
290         dev_priv = dev->dev_private;
291         mappable = min(end, mappable_end) - start;
292
293         drm_mm_init(&dev_priv->mm.gtt_space, start, end - start);
294
295         dev_priv->mm.gtt_start = start;
296         dev_priv->mm.gtt_mappable_end = mappable_end;
297         dev_priv->mm.gtt_end = end;
298         dev_priv->mm.gtt_total = end - start;
299         dev_priv->mm.mappable_gtt_total = mappable;
300
301         /* Take over this portion of the GTT */
302         intel_gtt_clear_range(start / PAGE_SIZE, (end-start) / PAGE_SIZE);
303         device_printf(dev->device,
304             "taking over the fictitious range 0x%lx-0x%lx\n",
305             dev->agp->base + start, dev->agp->base + start + mappable);
306         error = -vm_phys_fictitious_reg_range(dev->agp->base + start,
307             dev->agp->base + start + mappable, VM_MEMATTR_WRITE_COMBINING);
308         return (error);
309 }
310
311 int
312 i915_gem_init_ioctl(struct drm_device *dev, void *data,
313     struct drm_file *file)
314 {
315         struct drm_i915_gem_init *args;
316         drm_i915_private_t *dev_priv;
317
318         dev_priv = dev->dev_private;
319         args = data;
320
321         if (args->gtt_start >= args->gtt_end ||
322             (args->gtt_end | args->gtt_start) & (PAGE_SIZE - 1))
323                 return (-EINVAL);
324
325         /*
326          * XXXKIB. The second-time initialization should be guarded
327          * against.
328          */
329         lockmgr(&dev->dev_lock, LK_EXCLUSIVE|LK_RETRY|LK_CANRECURSE);
330         i915_gem_do_init(dev, args->gtt_start, args->gtt_end, args->gtt_end);
331         lockmgr(&dev->dev_lock, LK_RELEASE);
332
333         return 0;
334 }
335
336 int
337 i915_gem_idle(struct drm_device *dev)
338 {
339         drm_i915_private_t *dev_priv;
340         int ret;
341
342         dev_priv = dev->dev_private;
343         if (dev_priv->mm.suspended)
344                 return (0);
345
346         ret = i915_gpu_idle(dev, true);
347         if (ret != 0)
348                 return (ret);
349
350         /* Under UMS, be paranoid and evict. */
351         if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
352                 ret = i915_gem_evict_inactive(dev, false);
353                 if (ret != 0)
354                         return ret;
355         }
356
357         i915_gem_reset_fences(dev);
358
359         /* Hack!  Don't let anybody do execbuf while we don't control the chip.
360          * We need to replace this with a semaphore, or something.
361          * And not confound mm.suspended!
362          */
363         dev_priv->mm.suspended = 1;
364         callout_stop(&dev_priv->hangcheck_timer);
365
366         i915_kernel_lost_context(dev);
367         i915_gem_cleanup_ringbuffer(dev);
368
369         /* Cancel the retire work handler, which should be idle now. */
370         taskqueue_cancel_timeout(dev_priv->tq, &dev_priv->mm.retire_task, NULL);
371         return (ret);
372 }
373
374 void
375 i915_gem_init_swizzling(struct drm_device *dev)
376 {
377         drm_i915_private_t *dev_priv;
378
379         dev_priv = dev->dev_private;
380
381         if (INTEL_INFO(dev)->gen < 5 ||
382             dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE)
383                 return;
384
385         I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
386                                  DISP_TILE_SURFACE_SWIZZLING);
387
388         if (IS_GEN5(dev))
389                 return;
390
391         I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL);
392         if (IS_GEN6(dev))
393                 I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_SNB));
394         else
395                 I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_IVB));
396 }
397
398 void
399 i915_gem_init_ppgtt(struct drm_device *dev)
400 {
401         drm_i915_private_t *dev_priv;
402         struct i915_hw_ppgtt *ppgtt;
403         uint32_t pd_offset, pd_entry;
404         vm_paddr_t pt_addr;
405         struct intel_ring_buffer *ring;
406         u_int first_pd_entry_in_global_pt, i;
407
408         dev_priv = dev->dev_private;
409         ppgtt = dev_priv->mm.aliasing_ppgtt;
410         if (ppgtt == NULL)
411                 return;
412
413         first_pd_entry_in_global_pt = 512 * 1024 - I915_PPGTT_PD_ENTRIES;
414         for (i = 0; i < ppgtt->num_pd_entries; i++) {
415                 pt_addr = VM_PAGE_TO_PHYS(ppgtt->pt_pages[i]);
416                 pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr);
417                 pd_entry |= GEN6_PDE_VALID;
418                 intel_gtt_write(first_pd_entry_in_global_pt + i, pd_entry);
419         }
420         intel_gtt_read_pte(first_pd_entry_in_global_pt);
421
422         pd_offset = ppgtt->pd_offset;
423         pd_offset /= 64; /* in cachelines, */
424         pd_offset <<= 16;
425
426         if (INTEL_INFO(dev)->gen == 6) {
427                 uint32_t ecochk = I915_READ(GAM_ECOCHK);
428                 I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT |
429                                        ECOCHK_PPGTT_CACHE64B);
430                 I915_WRITE(GFX_MODE, GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
431         } else if (INTEL_INFO(dev)->gen >= 7) {
432                 I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B);
433                 /* GFX_MODE is per-ring on gen7+ */
434         }
435
436         for (i = 0; i < I915_NUM_RINGS; i++) {
437                 ring = &dev_priv->rings[i];
438
439                 if (INTEL_INFO(dev)->gen >= 7)
440                         I915_WRITE(RING_MODE_GEN7(ring),
441                                    GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
442
443                 I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
444                 I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset);
445         }
446 }
447
448 int
449 i915_gem_init_hw(struct drm_device *dev)
450 {
451         drm_i915_private_t *dev_priv;
452         int ret;
453
454         dev_priv = dev->dev_private;
455
456         i915_gem_init_swizzling(dev);
457
458         ret = intel_init_render_ring_buffer(dev);
459         if (ret != 0)
460                 return (ret);
461
462         if (HAS_BSD(dev)) {
463                 ret = intel_init_bsd_ring_buffer(dev);
464                 if (ret != 0)
465                         goto cleanup_render_ring;
466         }
467
468         if (HAS_BLT(dev)) {
469                 ret = intel_init_blt_ring_buffer(dev);
470                 if (ret != 0)
471                         goto cleanup_bsd_ring;
472         }
473
474         dev_priv->next_seqno = 1;
475         i915_gem_init_ppgtt(dev);
476         return (0);
477
478 cleanup_bsd_ring:
479         intel_cleanup_ring_buffer(&dev_priv->rings[VCS]);
480 cleanup_render_ring:
481         intel_cleanup_ring_buffer(&dev_priv->rings[RCS]);
482         return (ret);
483 }
484
485 int
486 i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
487     struct drm_file *file)
488 {
489         struct drm_i915_private *dev_priv;
490         struct drm_i915_gem_get_aperture *args;
491         struct drm_i915_gem_object *obj;
492         size_t pinned;
493
494         dev_priv = dev->dev_private;
495         args = data;
496
497         if (!(dev->driver->driver_features & DRIVER_GEM))
498                 return (-ENODEV);
499
500         pinned = 0;
501         DRM_LOCK(dev);
502         list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list)
503                 pinned += obj->gtt_space->size;
504         DRM_UNLOCK(dev);
505
506         args->aper_size = dev_priv->mm.gtt_total;
507         args->aper_available_size = args->aper_size - pinned;
508
509         return (0);
510 }
511
512 int
513 i915_gem_object_pin(struct drm_i915_gem_object *obj, uint32_t alignment,
514      bool map_and_fenceable)
515 {
516         struct drm_device *dev;
517         struct drm_i915_private *dev_priv;
518         int ret;
519
520         dev = obj->base.dev;
521         dev_priv = dev->dev_private;
522
523         KASSERT(obj->pin_count != DRM_I915_GEM_OBJECT_MAX_PIN_COUNT,
524             ("Max pin count"));
525
526         if (obj->gtt_space != NULL) {
527                 if ((alignment && obj->gtt_offset & (alignment - 1)) ||
528                     (map_and_fenceable && !obj->map_and_fenceable)) {
529                         DRM_DEBUG("bo is already pinned with incorrect alignment:"
530                              " offset=%x, req.alignment=%x, req.map_and_fenceable=%d,"
531                              " obj->map_and_fenceable=%d\n",
532                              obj->gtt_offset, alignment,
533                              map_and_fenceable,
534                              obj->map_and_fenceable);
535                         ret = i915_gem_object_unbind(obj);
536                         if (ret != 0)
537                                 return (ret);
538                 }
539         }
540
541         if (obj->gtt_space == NULL) {
542                 ret = i915_gem_object_bind_to_gtt(obj, alignment,
543                     map_and_fenceable);
544                 if (ret)
545                         return (ret);
546         }
547
548         if (obj->pin_count++ == 0 && !obj->active)
549                 list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list);
550         obj->pin_mappable |= map_and_fenceable;
551
552 #if 1
553         KIB_NOTYET();
554 #else
555         WARN_ON(i915_verify_lists(dev));
556 #endif
557         return (0);
558 }
559
560 void
561 i915_gem_object_unpin(struct drm_i915_gem_object *obj)
562 {
563         struct drm_device *dev;
564         drm_i915_private_t *dev_priv;
565
566         dev = obj->base.dev;
567         dev_priv = dev->dev_private;
568
569 #if 1
570         KIB_NOTYET();
571 #else
572         WARN_ON(i915_verify_lists(dev));
573 #endif
574         
575         KASSERT(obj->pin_count != 0, ("zero pin count"));
576         KASSERT(obj->gtt_space != NULL, ("No gtt mapping"));
577
578         if (--obj->pin_count == 0) {
579                 if (!obj->active)
580                         list_move_tail(&obj->mm_list,
581                             &dev_priv->mm.inactive_list);
582                 obj->pin_mappable = false;
583         }
584 #if 1
585         KIB_NOTYET();
586 #else
587         WARN_ON(i915_verify_lists(dev));
588 #endif
589 }
590
591 int
592 i915_gem_pin_ioctl(struct drm_device *dev, void *data,
593     struct drm_file *file)
594 {
595         struct drm_i915_gem_pin *args;
596         struct drm_i915_gem_object *obj;
597         struct drm_gem_object *gobj;
598         int ret;
599
600         args = data;
601
602         ret = i915_mutex_lock_interruptible(dev);
603         if (ret != 0)
604                 return ret;
605
606         gobj = drm_gem_object_lookup(dev, file, args->handle);
607         if (gobj == NULL) {
608                 ret = -ENOENT;
609                 goto unlock;
610         }
611         obj = to_intel_bo(gobj);
612
613         if (obj->madv != I915_MADV_WILLNEED) {
614                 DRM_ERROR("Attempting to pin a purgeable buffer\n");
615                 ret = -EINVAL;
616                 goto out;
617         }
618
619         if (obj->pin_filp != NULL && obj->pin_filp != file) {
620                 DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
621                     args->handle);
622                 ret = -EINVAL;
623                 goto out;
624         }
625
626         obj->user_pin_count++;
627         obj->pin_filp = file;
628         if (obj->user_pin_count == 1) {
629                 ret = i915_gem_object_pin(obj, args->alignment, true);
630                 if (ret != 0)
631                         goto out;
632         }
633
634         /* XXX - flush the CPU caches for pinned objects
635          * as the X server doesn't manage domains yet
636          */
637         i915_gem_object_flush_cpu_write_domain(obj);
638         args->offset = obj->gtt_offset;
639 out:
640         drm_gem_object_unreference(&obj->base);
641 unlock:
642         DRM_UNLOCK(dev);
643         return (ret);
644 }
645
646 int
647 i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
648     struct drm_file *file)
649 {
650         struct drm_i915_gem_pin *args;
651         struct drm_i915_gem_object *obj;
652         int ret;
653
654         args = data;
655         ret = i915_mutex_lock_interruptible(dev);
656         if (ret != 0)
657                 return (ret);
658
659         obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
660         if (&obj->base == NULL) {
661                 ret = -ENOENT;
662                 goto unlock;
663         }
664
665         if (obj->pin_filp != file) {
666                 DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n",
667                     args->handle);
668                 ret = -EINVAL;
669                 goto out;
670         }
671         obj->user_pin_count--;
672         if (obj->user_pin_count == 0) {
673                 obj->pin_filp = NULL;
674                 i915_gem_object_unpin(obj);
675         }
676
677 out:
678         drm_gem_object_unreference(&obj->base);
679 unlock:
680         DRM_UNLOCK(dev);
681         return (ret);
682 }
683
684 int
685 i915_gem_busy_ioctl(struct drm_device *dev, void *data,
686     struct drm_file *file)
687 {
688         struct drm_i915_gem_busy *args;
689         struct drm_i915_gem_object *obj;
690         struct drm_i915_gem_request *request;
691         int ret;
692
693         args = data;
694
695         ret = i915_mutex_lock_interruptible(dev);
696         if (ret != 0)
697                 return ret;
698
699         obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
700         if (&obj->base == NULL) {
701                 ret = -ENOENT;
702                 goto unlock;
703         }
704
705         args->busy = obj->active;
706         if (args->busy) {
707                 if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
708                         ret = i915_gem_flush_ring(obj->ring,
709                             0, obj->base.write_domain);
710                 } else if (obj->ring->outstanding_lazy_request ==
711                     obj->last_rendering_seqno) {
712                         request = kmalloc(sizeof(*request), DRM_I915_GEM,
713                             M_WAITOK | M_ZERO);
714                         ret = i915_add_request(obj->ring, NULL, request);
715                         if (ret != 0)
716                                 drm_free(request, DRM_I915_GEM);
717                 }
718
719                 i915_gem_retire_requests_ring(obj->ring);
720                 args->busy = obj->active;
721         }
722
723         drm_gem_object_unreference(&obj->base);
724 unlock:
725         DRM_UNLOCK(dev);
726         return (ret);
727 }
728
729 /* Throttle our rendering by waiting until the ring has completed our requests
730  * emitted over 20 msec ago.
731  *
732  * Note that if we were to use the current jiffies each time around the loop,
733  * we wouldn't escape the function with any frames outstanding if the time to
734  * render a frame was over 20ms.
735  *
736  * This should get us reasonable parallelism between CPU and GPU but also
737  * relatively low latency when blocking on a particular request to finish.
738  */
739 static int
740 i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
741 {
742         struct drm_i915_private *dev_priv = dev->dev_private;
743         struct drm_i915_file_private *file_priv = file->driver_priv;
744         unsigned long recent_enough = ticks - (20 * hz / 1000);
745         struct drm_i915_gem_request *request;
746         struct intel_ring_buffer *ring = NULL;
747         u32 seqno = 0;
748         int ret;
749
750         dev_priv = dev->dev_private;
751         if (atomic_load_acq_int(&dev_priv->mm.wedged))
752                 return (-EIO);
753
754         recent_enough = ticks - (20 * hz / 1000);
755         ring = NULL;
756         seqno = 0;
757
758         spin_lock(&file_priv->mm.lock);
759         list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
760                 if (time_after_eq(request->emitted_jiffies, recent_enough))
761                         break;
762
763                 ring = request->ring;
764                 seqno = request->seqno;
765         }
766         spin_unlock(&file_priv->mm.lock);
767
768         if (seqno == 0)
769                 return 0;
770
771         ret = 0;
772         lockmgr(&ring->irq_lock, LK_EXCLUSIVE);
773         if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
774                 if (ring->irq_get(ring)) {
775                         while (ret == 0 &&
776                             !(i915_seqno_passed(ring->get_seqno(ring), seqno) ||
777                             atomic_load_acq_int(&dev_priv->mm.wedged)))
778                                 ret = -lksleep(ring, &ring->irq_lock, PCATCH,
779                                     "915thr", 0);
780                         ring->irq_put(ring);
781                         if (ret == 0 && atomic_load_acq_int(&dev_priv->mm.wedged))
782                                 ret = -EIO;
783                 } else if (_intel_wait_for(dev,
784                     i915_seqno_passed(ring->get_seqno(ring), seqno) ||
785                     atomic_load_acq_int(&dev_priv->mm.wedged), 3000, 0, "915rtr")) {
786                         ret = -EBUSY;
787                 }
788         }
789         lockmgr(&ring->irq_lock, LK_RELEASE);
790
791         if (ret == 0)
792                 taskqueue_enqueue_timeout(dev_priv->tq,
793                     &dev_priv->mm.retire_task, 0);
794
795         return ret;
796 }
797
798 int
799 i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
800     struct drm_file *file_priv)
801 {
802
803         return (i915_gem_ring_throttle(dev, file_priv));
804 }
805
806 int
807 i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
808     struct drm_file *file_priv)
809 {
810         struct drm_i915_gem_madvise *args;
811         struct drm_i915_gem_object *obj;
812         int ret;
813
814         args = data;
815         switch (args->madv) {
816         case I915_MADV_DONTNEED:
817         case I915_MADV_WILLNEED:
818                 break;
819         default:
820                 return (-EINVAL);
821         }
822
823         ret = i915_mutex_lock_interruptible(dev);
824         if (ret != 0)
825                 return (ret);
826
827         obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
828         if (&obj->base == NULL) {
829                 ret = -ENOENT;
830                 goto unlock;
831         }
832
833         if (obj->pin_count != 0) {
834                 ret = -EINVAL;
835                 goto out;
836         }
837
838         if (obj->madv != I915_MADV_PURGED_INTERNAL)
839                 obj->madv = args->madv;
840         if (i915_gem_object_is_purgeable(obj) && obj->gtt_space == NULL)
841                 i915_gem_object_truncate(obj);
842         args->retained = obj->madv != I915_MADV_PURGED_INTERNAL;
843
844 out:
845         drm_gem_object_unreference(&obj->base);
846 unlock:
847         DRM_UNLOCK(dev);
848         return (ret);
849 }
850
851 void
852 i915_gem_cleanup_ringbuffer(struct drm_device *dev)
853 {
854         drm_i915_private_t *dev_priv;
855         int i;
856
857         dev_priv = dev->dev_private;
858         for (i = 0; i < I915_NUM_RINGS; i++)
859                 intel_cleanup_ring_buffer(&dev_priv->rings[i]);
860 }
861
862 int
863 i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
864     struct drm_file *file_priv)
865 {
866         drm_i915_private_t *dev_priv;
867         int ret, i;
868
869         if (drm_core_check_feature(dev, DRIVER_MODESET))
870                 return (0);
871         dev_priv = dev->dev_private;
872         if (atomic_load_acq_int(&dev_priv->mm.wedged) != 0) {
873                 DRM_ERROR("Reenabling wedged hardware, good luck\n");
874                 atomic_store_rel_int(&dev_priv->mm.wedged, 0);
875         }
876
877         dev_priv->mm.suspended = 0;
878
879         ret = i915_gem_init_hw(dev);
880         if (ret != 0) {
881                 return (ret);
882         }
883
884         KASSERT(list_empty(&dev_priv->mm.active_list), ("active list"));
885         KASSERT(list_empty(&dev_priv->mm.flushing_list), ("flushing list"));
886         KASSERT(list_empty(&dev_priv->mm.inactive_list), ("inactive list"));
887         for (i = 0; i < I915_NUM_RINGS; i++) {
888                 KASSERT(list_empty(&dev_priv->rings[i].active_list),
889                     ("ring %d active list", i));
890                 KASSERT(list_empty(&dev_priv->rings[i].request_list),
891                     ("ring %d request list", i));
892         }
893
894         DRM_UNLOCK(dev);
895         ret = drm_irq_install(dev);
896         DRM_LOCK(dev);
897         if (ret)
898                 goto cleanup_ringbuffer;
899
900         return (0);
901
902 cleanup_ringbuffer:
903         i915_gem_cleanup_ringbuffer(dev);
904         dev_priv->mm.suspended = 1;
905
906         return (ret);
907 }
908
909 int
910 i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
911     struct drm_file *file_priv)
912 {
913
914         if (drm_core_check_feature(dev, DRIVER_MODESET))
915                 return 0;
916
917         drm_irq_uninstall(dev);
918         return (i915_gem_idle(dev));
919 }
920
921 int
922 i915_gem_create(struct drm_file *file, struct drm_device *dev, uint64_t size,
923     uint32_t *handle_p)
924 {
925         struct drm_i915_gem_object *obj;
926         uint32_t handle;
927         int ret;
928
929         size = roundup(size, PAGE_SIZE);
930         if (size == 0)
931                 return (-EINVAL);
932
933         obj = i915_gem_alloc_object(dev, size);
934         if (obj == NULL)
935                 return (-ENOMEM);
936
937         handle = 0;
938         ret = drm_gem_handle_create(file, &obj->base, &handle);
939         if (ret != 0) {
940                 drm_gem_object_release(&obj->base);
941                 i915_gem_info_remove_obj(dev->dev_private, obj->base.size);
942                 drm_free(obj, DRM_I915_GEM);
943                 return (-ret);
944         }
945
946         /* drop reference from allocate - handle holds it now */
947         drm_gem_object_unreference(&obj->base);
948         *handle_p = handle;
949         return (0);
950 }
951
952 int
953 i915_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
954     struct drm_mode_create_dumb *args)
955 {
956
957         /* have to work out size/pitch and return them */
958         args->pitch = roundup2(args->width * ((args->bpp + 7) / 8), 64);
959         args->size = args->pitch * args->height;
960         return (i915_gem_create(file, dev, args->size, &args->handle));
961 }
962
963 int
964 i915_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev,
965     uint32_t handle)
966 {
967
968         return (drm_gem_handle_delete(file, handle));
969 }
970
971 int
972 i915_gem_create_ioctl(struct drm_device *dev, void *data,
973     struct drm_file *file)
974 {
975         struct drm_i915_gem_create *args = data;
976
977         return (i915_gem_create(file, dev, args->size, &args->handle));
978 }
979
980 static inline void vm_page_reference(vm_page_t m)
981 {
982         vm_page_flag_set(m, PG_REFERENCED);
983 }
984
985 static int
986 i915_gem_swap_io(struct drm_device *dev, struct drm_i915_gem_object *obj,
987     uint64_t data_ptr, uint64_t size, uint64_t offset, enum uio_rw rw,
988     struct drm_file *file)
989 {
990         vm_object_t vm_obj;
991         vm_page_t m;
992         struct sf_buf *sf;
993         vm_offset_t mkva;
994         vm_pindex_t obj_pi;
995         int cnt, do_bit17_swizzling, length, obj_po, ret, swizzled_po;
996
997         if (obj->gtt_offset != 0 && rw == UIO_READ)
998                 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
999         else
1000                 do_bit17_swizzling = 0;
1001
1002         obj->dirty = 1;
1003         vm_obj = obj->base.vm_obj;
1004         ret = 0;
1005
1006         VM_OBJECT_LOCK(vm_obj);
1007         vm_object_pip_add(vm_obj, 1);
1008         while (size > 0) {
1009                 obj_pi = OFF_TO_IDX(offset);
1010                 obj_po = offset & PAGE_MASK;
1011
1012                 m = i915_gem_wire_page(vm_obj, obj_pi);
1013                 VM_OBJECT_UNLOCK(vm_obj);
1014
1015                 sf = sf_buf_alloc(m);
1016                 mkva = sf_buf_kva(sf);
1017                 length = min(size, PAGE_SIZE - obj_po);
1018                 while (length > 0) {
1019                         if (do_bit17_swizzling &&
1020                             (VM_PAGE_TO_PHYS(m) & (1 << 17)) != 0) {
1021                                 cnt = roundup2(obj_po + 1, 64);
1022                                 cnt = min(cnt - obj_po, length);
1023                                 swizzled_po = obj_po ^ 64;
1024                         } else {
1025                                 cnt = length;
1026                                 swizzled_po = obj_po;
1027                         }
1028                         if (rw == UIO_READ)
1029                                 ret = -copyout_nofault(
1030                                     (char *)mkva + swizzled_po,
1031                                     (void *)(uintptr_t)data_ptr, cnt);
1032                         else
1033                                 ret = -copyin_nofault(
1034                                     (void *)(uintptr_t)data_ptr,
1035                                     (char *)mkva + swizzled_po, cnt);
1036                         if (ret != 0)
1037                                 break;
1038                         data_ptr += cnt;
1039                         size -= cnt;
1040                         length -= cnt;
1041                         offset += cnt;
1042                         obj_po += cnt;
1043                 }
1044                 sf_buf_free(sf);
1045                 VM_OBJECT_LOCK(vm_obj);
1046                 if (rw == UIO_WRITE)
1047                         vm_page_dirty(m);
1048                 vm_page_reference(m);
1049                 vm_page_busy_wait(m, FALSE, "i915gem");
1050                 vm_page_unwire(m, 1);
1051                 vm_page_wakeup(m);
1052                 atomic_add_long(&i915_gem_wired_pages_cnt, -1);
1053
1054                 if (ret != 0)
1055                         break;
1056         }
1057         vm_object_pip_wakeup(vm_obj);
1058         VM_OBJECT_UNLOCK(vm_obj);
1059
1060         return (ret);
1061 }
1062
1063 static int
1064 i915_gem_gtt_write(struct drm_device *dev, struct drm_i915_gem_object *obj,
1065     uint64_t data_ptr, uint64_t size, uint64_t offset, struct drm_file *file)
1066 {
1067         vm_offset_t mkva;
1068         int ret;
1069
1070         /*
1071          * Pass the unaligned physical address and size to pmap_mapdev_attr()
1072          * so it can properly calculate whether an extra page needs to be
1073          * mapped or not to cover the requested range.  The function will
1074          * add the page offset into the returned mkva for us.
1075          */
1076         mkva = (vm_offset_t)pmap_mapdev_attr(dev->agp->base + obj->gtt_offset +
1077             offset, size, PAT_WRITE_COMBINING);
1078         ret = -copyin_nofault((void *)(uintptr_t)data_ptr, (char *)mkva, size);
1079         pmap_unmapdev(mkva, size);
1080         return (ret);
1081 }
1082
1083 static int
1084 i915_gem_obj_io(struct drm_device *dev, uint32_t handle, uint64_t data_ptr,
1085     uint64_t size, uint64_t offset, enum uio_rw rw, struct drm_file *file)
1086 {
1087         struct drm_i915_gem_object *obj;
1088         vm_page_t *ma;
1089         vm_offset_t start, end;
1090         int npages, ret;
1091
1092         if (size == 0)
1093                 return (0);
1094         start = trunc_page(data_ptr);
1095         end = round_page(data_ptr + size);
1096         npages = howmany(end - start, PAGE_SIZE);
1097         ma = kmalloc(npages * sizeof(vm_page_t), DRM_I915_GEM, M_WAITOK |
1098             M_ZERO);
1099         npages = vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map,
1100             (vm_offset_t)data_ptr, size,
1101             (rw == UIO_READ ? VM_PROT_WRITE : 0 ) | VM_PROT_READ, ma, npages);
1102         if (npages == -1) {
1103                 ret = -EFAULT;
1104                 goto free_ma;
1105         }
1106
1107         ret = i915_mutex_lock_interruptible(dev);
1108         if (ret != 0)
1109                 goto unlocked;
1110
1111         obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1112         if (&obj->base == NULL) {
1113                 ret = -ENOENT;
1114                 goto unlock;
1115         }
1116         if (offset > obj->base.size || size > obj->base.size - offset) {
1117                 ret = -EINVAL;
1118                 goto out;
1119         }
1120
1121         if (rw == UIO_READ) {
1122                 ret = i915_gem_object_set_cpu_read_domain_range(obj,
1123                     offset, size);
1124                 if (ret != 0)
1125                         goto out;
1126                 ret = i915_gem_swap_io(dev, obj, data_ptr, size, offset,
1127                     UIO_READ, file);
1128         } else {
1129                 if (obj->phys_obj) {
1130                         ret = i915_gem_phys_pwrite(dev, obj, data_ptr, offset,
1131                             size, file);
1132                 } else if (obj->gtt_space &&
1133                     obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
1134                         ret = i915_gem_object_pin(obj, 0, true);
1135                         if (ret != 0)
1136                                 goto out;
1137                         ret = i915_gem_object_set_to_gtt_domain(obj, true);
1138                         if (ret != 0)
1139                                 goto out_unpin;
1140                         ret = i915_gem_object_put_fence(obj);
1141                         if (ret != 0)
1142                                 goto out_unpin;
1143                         ret = i915_gem_gtt_write(dev, obj, data_ptr, size,
1144                             offset, file);
1145 out_unpin:
1146                         i915_gem_object_unpin(obj);
1147                 } else {
1148                         ret = i915_gem_object_set_to_cpu_domain(obj, true);
1149                         if (ret != 0)
1150                                 goto out;
1151                         ret = i915_gem_swap_io(dev, obj, data_ptr, size, offset,
1152                             UIO_WRITE, file);
1153                 }
1154         }
1155 out:
1156         drm_gem_object_unreference(&obj->base);
1157 unlock:
1158         DRM_UNLOCK(dev);
1159 unlocked:
1160         vm_page_unhold_pages(ma, npages);
1161 free_ma:
1162         drm_free(ma, DRM_I915_GEM);
1163         return (ret);
1164 }
1165
1166 int
1167 i915_gem_pread_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
1168 {
1169         struct drm_i915_gem_pread *args;
1170
1171         args = data;
1172         return (i915_gem_obj_io(dev, args->handle, args->data_ptr, args->size,
1173             args->offset, UIO_READ, file));
1174 }
1175
1176 int
1177 i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
1178 {
1179         struct drm_i915_gem_pwrite *args;
1180
1181         args = data;
1182         return (i915_gem_obj_io(dev, args->handle, args->data_ptr, args->size,
1183             args->offset, UIO_WRITE, file));
1184 }
1185
1186 int
1187 i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1188     struct drm_file *file)
1189 {
1190         struct drm_i915_gem_set_domain *args;
1191         struct drm_i915_gem_object *obj;
1192         uint32_t read_domains;
1193         uint32_t write_domain;
1194         int ret;
1195
1196         if ((dev->driver->driver_features & DRIVER_GEM) == 0)
1197                 return (-ENODEV);
1198
1199         args = data;
1200         read_domains = args->read_domains;
1201         write_domain = args->write_domain;
1202
1203         if ((write_domain & I915_GEM_GPU_DOMAINS) != 0 ||
1204             (read_domains & I915_GEM_GPU_DOMAINS) != 0 ||
1205             (write_domain != 0 && read_domains != write_domain))
1206                 return (-EINVAL);
1207
1208         ret = i915_mutex_lock_interruptible(dev);
1209         if (ret != 0)
1210                 return (ret);
1211
1212         obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1213         if (&obj->base == NULL) {
1214                 ret = -ENOENT;
1215                 goto unlock;
1216         }
1217
1218         if ((read_domains & I915_GEM_DOMAIN_GTT) != 0) {
1219                 ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
1220                 if (ret == -EINVAL)
1221                         ret = 0;
1222         } else
1223                 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
1224
1225         drm_gem_object_unreference(&obj->base);
1226 unlock:
1227         DRM_UNLOCK(dev);
1228         return (ret);
1229 }
1230
1231 int
1232 i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
1233     struct drm_file *file)
1234 {
1235         struct drm_i915_gem_sw_finish *args;
1236         struct drm_i915_gem_object *obj;
1237         int ret;
1238
1239         args = data;
1240         ret = 0;
1241         if ((dev->driver->driver_features & DRIVER_GEM) == 0)
1242                 return (ENODEV);
1243         ret = i915_mutex_lock_interruptible(dev);
1244         if (ret != 0)
1245                 return (ret);
1246         obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1247         if (&obj->base == NULL) {
1248                 ret = -ENOENT;
1249                 goto unlock;
1250         }
1251         if (obj->pin_count != 0)
1252                 i915_gem_object_flush_cpu_write_domain(obj);
1253         drm_gem_object_unreference(&obj->base);
1254 unlock:
1255         DRM_UNLOCK(dev);
1256         return (ret);
1257 }
1258
1259 int
1260 i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
1261     struct drm_file *file)
1262 {
1263         struct drm_i915_gem_mmap *args;
1264         struct drm_gem_object *obj;
1265         struct proc *p;
1266         vm_map_t map;
1267         vm_offset_t addr;
1268         vm_size_t size;
1269         int error, rv;
1270
1271         args = data;
1272
1273         if ((dev->driver->driver_features & DRIVER_GEM) == 0)
1274                 return (-ENODEV);
1275
1276         obj = drm_gem_object_lookup(dev, file, args->handle);
1277         if (obj == NULL)
1278                 return (-ENOENT);
1279         error = 0;
1280         if (args->size == 0)
1281                 goto out;
1282         p = curproc;
1283         map = &p->p_vmspace->vm_map;
1284         size = round_page(args->size);
1285         PROC_LOCK(p);
1286         if (map->size + size > p->p_rlimit[RLIMIT_VMEM].rlim_cur) {
1287                 PROC_UNLOCK(p);
1288                 error = ENOMEM;
1289                 goto out;
1290         }
1291         PROC_UNLOCK(p);
1292
1293         addr = 0;
1294         vm_object_hold(obj->vm_obj);
1295         vm_object_reference_locked(obj->vm_obj);
1296         vm_object_drop(obj->vm_obj);
1297         DRM_UNLOCK(dev);
1298         rv = vm_map_find(map, obj->vm_obj, args->offset, &addr, args->size,
1299             PAGE_SIZE, /* align */
1300             TRUE, /* fitit */
1301             VM_MAPTYPE_NORMAL, /* maptype */
1302             VM_PROT_READ | VM_PROT_WRITE, /* prot */
1303             VM_PROT_READ | VM_PROT_WRITE, /* max */
1304             MAP_SHARED /* cow */);
1305         if (rv != KERN_SUCCESS) {
1306                 vm_object_deallocate(obj->vm_obj);
1307                 error = -vm_mmap_to_errno(rv);
1308         } else {
1309                 args->addr_ptr = (uint64_t)addr;
1310         }
1311         DRM_LOCK(dev);
1312 out:
1313         drm_gem_object_unreference(obj);
1314         return (error);
1315 }
1316
1317 static int
1318 i915_gem_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot,
1319     vm_ooffset_t foff, struct ucred *cred, u_short *color)
1320 {
1321
1322         *color = 0; /* XXXKIB */
1323         return (0);
1324 }
1325
1326 int i915_intr_pf;
1327
1328 static int
1329 i915_gem_pager_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot,
1330     vm_page_t *mres)
1331 {
1332         struct drm_gem_object *gem_obj;
1333         struct drm_i915_gem_object *obj;
1334         struct drm_device *dev;
1335         drm_i915_private_t *dev_priv;
1336         vm_page_t m, oldm;
1337         int cause, ret;
1338         bool write;
1339
1340         gem_obj = vm_obj->handle;
1341         obj = to_intel_bo(gem_obj);
1342         dev = obj->base.dev;
1343         dev_priv = dev->dev_private;
1344 #if 0
1345         write = (prot & VM_PROT_WRITE) != 0;
1346 #else
1347         write = true;
1348 #endif
1349         vm_object_pip_add(vm_obj, 1);
1350
1351         /*
1352          * Remove the placeholder page inserted by vm_fault() from the
1353          * object before dropping the object lock. If
1354          * i915_gem_release_mmap() is active in parallel on this gem
1355          * object, then it owns the drm device sx and might find the
1356          * placeholder already. Then, since the page is busy,
1357          * i915_gem_release_mmap() sleeps waiting for the busy state
1358          * of the page cleared. We will be not able to acquire drm
1359          * device lock until i915_gem_release_mmap() is able to make a
1360          * progress.
1361          */
1362         if (*mres != NULL) {
1363                 oldm = *mres;
1364                 vm_page_remove(oldm);
1365                 *mres = NULL;
1366         } else
1367                 oldm = NULL;
1368 retry:
1369         VM_OBJECT_UNLOCK(vm_obj);
1370 unlocked_vmobj:
1371         cause = ret = 0;
1372         m = NULL;
1373
1374         if (i915_intr_pf) {
1375                 ret = i915_mutex_lock_interruptible(dev);
1376                 if (ret != 0) {
1377                         cause = 10;
1378                         goto out;
1379                 }
1380         } else
1381                 DRM_LOCK(dev);
1382
1383         /*
1384          * Since the object lock was dropped, other thread might have
1385          * faulted on the same GTT address and instantiated the
1386          * mapping for the page.  Recheck.
1387          */
1388         VM_OBJECT_LOCK(vm_obj);
1389         m = vm_page_lookup(vm_obj, OFF_TO_IDX(offset));
1390         if (m != NULL) {
1391                 if ((m->flags & PG_BUSY) != 0) {
1392                         DRM_UNLOCK(dev);
1393 #if 0 /* XXX */
1394                         vm_page_sleep(m, "915pee");
1395 #endif
1396                         goto retry;
1397                 }
1398                 goto have_page;
1399         } else
1400                 VM_OBJECT_UNLOCK(vm_obj);
1401
1402         /* Now bind it into the GTT if needed */
1403         if (!obj->map_and_fenceable) {
1404                 ret = i915_gem_object_unbind(obj);
1405                 if (ret != 0) {
1406                         cause = 20;
1407                         goto unlock;
1408                 }
1409         }
1410         if (!obj->gtt_space) {
1411                 ret = i915_gem_object_bind_to_gtt(obj, 0, true);
1412                 if (ret != 0) {
1413                         cause = 30;
1414                         goto unlock;
1415                 }
1416
1417                 ret = i915_gem_object_set_to_gtt_domain(obj, write);
1418                 if (ret != 0) {
1419                         cause = 40;
1420                         goto unlock;
1421                 }
1422         }
1423
1424         if (obj->tiling_mode == I915_TILING_NONE)
1425                 ret = i915_gem_object_put_fence(obj);
1426         else
1427                 ret = i915_gem_object_get_fence(obj, NULL);
1428         if (ret != 0) {
1429                 cause = 50;
1430                 goto unlock;
1431         }
1432
1433         if (i915_gem_object_is_inactive(obj))
1434                 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
1435
1436         obj->fault_mappable = true;
1437         VM_OBJECT_LOCK(vm_obj);
1438         m = vm_phys_fictitious_to_vm_page(dev->agp->base + obj->gtt_offset +
1439             offset);
1440         if (m == NULL) {
1441                 cause = 60;
1442                 ret = -EFAULT;
1443                 goto unlock;
1444         }
1445         KASSERT((m->flags & PG_FICTITIOUS) != 0,
1446             ("not fictitious %p", m));
1447         KASSERT(m->wire_count == 1, ("wire_count not 1 %p", m));
1448
1449         if ((m->flags & PG_BUSY) != 0) {
1450                 DRM_UNLOCK(dev);
1451 #if 0 /* XXX */
1452                 vm_page_sleep(m, "915pbs");
1453 #endif
1454                 goto retry;
1455         }
1456         m->valid = VM_PAGE_BITS_ALL;
1457         vm_page_insert(m, vm_obj, OFF_TO_IDX(offset));
1458 have_page:
1459         *mres = m;
1460         vm_page_busy_try(m, false);
1461
1462         DRM_UNLOCK(dev);
1463         if (oldm != NULL) {
1464                 vm_page_free(oldm);
1465         }
1466         vm_object_pip_wakeup(vm_obj);
1467         return (VM_PAGER_OK);
1468
1469 unlock:
1470         DRM_UNLOCK(dev);
1471 out:
1472         KASSERT(ret != 0, ("i915_gem_pager_fault: wrong return"));
1473         if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) {
1474                 goto unlocked_vmobj;
1475         }
1476         VM_OBJECT_LOCK(vm_obj);
1477         vm_object_pip_wakeup(vm_obj);
1478         return (VM_PAGER_ERROR);
1479 }
1480
1481 static void
1482 i915_gem_pager_dtor(void *handle)
1483 {
1484         struct drm_gem_object *obj;
1485         struct drm_device *dev;
1486
1487         obj = handle;
1488         dev = obj->dev;
1489
1490         DRM_LOCK(dev);
1491         drm_gem_free_mmap_offset(obj);
1492         i915_gem_release_mmap(to_intel_bo(obj));
1493         drm_gem_object_unreference(obj);
1494         DRM_UNLOCK(dev);
1495 }
1496
1497 struct cdev_pager_ops i915_gem_pager_ops = {
1498         .cdev_pg_fault  = i915_gem_pager_fault,
1499         .cdev_pg_ctor   = i915_gem_pager_ctor,
1500         .cdev_pg_dtor   = i915_gem_pager_dtor
1501 };
1502
1503 int
1504 i915_gem_mmap_gtt(struct drm_file *file, struct drm_device *dev,
1505     uint32_t handle, uint64_t *offset)
1506 {
1507         struct drm_i915_private *dev_priv;
1508         struct drm_i915_gem_object *obj;
1509         int ret;
1510
1511         if (!(dev->driver->driver_features & DRIVER_GEM))
1512                 return (-ENODEV);
1513
1514         dev_priv = dev->dev_private;
1515
1516         ret = i915_mutex_lock_interruptible(dev);
1517         if (ret != 0)
1518                 return (ret);
1519
1520         obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1521         if (&obj->base == NULL) {
1522                 ret = -ENOENT;
1523                 goto unlock;
1524         }
1525
1526         if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
1527                 ret = -E2BIG;
1528                 goto out;
1529         }
1530
1531         if (obj->madv != I915_MADV_WILLNEED) {
1532                 DRM_ERROR("Attempting to mmap a purgeable buffer\n");
1533                 ret = -EINVAL;
1534                 goto out;
1535         }
1536
1537         ret = drm_gem_create_mmap_offset(&obj->base);
1538         if (ret != 0)
1539                 goto out;
1540
1541         *offset = DRM_GEM_MAPPING_OFF(obj->base.map_list.key) |
1542             DRM_GEM_MAPPING_KEY;
1543 out:
1544         drm_gem_object_unreference(&obj->base);
1545 unlock:
1546         DRM_UNLOCK(dev);
1547         return (ret);
1548 }
1549
1550 int
1551 i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
1552     struct drm_file *file)
1553 {
1554         struct drm_i915_private *dev_priv;
1555         struct drm_i915_gem_mmap_gtt *args;
1556
1557         dev_priv = dev->dev_private;
1558         args = data;
1559
1560         return (i915_gem_mmap_gtt(file, dev, args->handle, &args->offset));
1561 }
1562
1563 struct drm_i915_gem_object *
1564 i915_gem_alloc_object(struct drm_device *dev, size_t size)
1565 {
1566         struct drm_i915_private *dev_priv;
1567         struct drm_i915_gem_object *obj;
1568
1569         dev_priv = dev->dev_private;
1570
1571         obj = kmalloc(sizeof(*obj), DRM_I915_GEM, M_WAITOK | M_ZERO);
1572
1573         if (drm_gem_object_init(dev, &obj->base, size) != 0) {
1574                 drm_free(obj, DRM_I915_GEM);
1575                 return (NULL);
1576         }
1577
1578         obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1579         obj->base.read_domains = I915_GEM_DOMAIN_CPU;
1580
1581         if (HAS_LLC(dev))
1582                 obj->cache_level = I915_CACHE_LLC;
1583         else
1584                 obj->cache_level = I915_CACHE_NONE;
1585         obj->base.driver_private = NULL;
1586         obj->fence_reg = I915_FENCE_REG_NONE;
1587         INIT_LIST_HEAD(&obj->mm_list);
1588         INIT_LIST_HEAD(&obj->gtt_list);
1589         INIT_LIST_HEAD(&obj->ring_list);
1590         INIT_LIST_HEAD(&obj->exec_list);
1591         INIT_LIST_HEAD(&obj->gpu_write_list);
1592         obj->madv = I915_MADV_WILLNEED;
1593         /* Avoid an unnecessary call to unbind on the first bind. */
1594         obj->map_and_fenceable = true;
1595
1596         i915_gem_info_add_obj(dev_priv, size);
1597
1598         return (obj);
1599 }
1600
1601 void
1602 i915_gem_clflush_object(struct drm_i915_gem_object *obj)
1603 {
1604
1605         /* If we don't have a page list set up, then we're not pinned
1606          * to GPU, and we can ignore the cache flush because it'll happen
1607          * again at bind time.
1608          */
1609         if (obj->pages == NULL)
1610                 return;
1611
1612         /* If the GPU is snooping the contents of the CPU cache,
1613          * we do not need to manually clear the CPU cache lines.  However,
1614          * the caches are only snooped when the render cache is
1615          * flushed/invalidated.  As we always have to emit invalidations
1616          * and flushes when moving into and out of the RENDER domain, correct
1617          * snooping behaviour occurs naturally as the result of our domain
1618          * tracking.
1619          */
1620         if (obj->cache_level != I915_CACHE_NONE)
1621                 return;
1622
1623         drm_clflush_pages(obj->pages, obj->base.size / PAGE_SIZE);
1624 }
1625
1626 static void
1627 i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
1628 {
1629         uint32_t old_write_domain;
1630
1631         if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
1632                 return;
1633
1634         i915_gem_clflush_object(obj);
1635         intel_gtt_chipset_flush();
1636         old_write_domain = obj->base.write_domain;
1637         obj->base.write_domain = 0;
1638 }
1639
1640 static int
1641 i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj)
1642 {
1643
1644         if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0)
1645                 return (0);
1646         return (i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain));
1647 }
1648
1649 static void
1650 i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
1651 {
1652         uint32_t old_write_domain;
1653
1654         if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
1655                 return;
1656
1657         cpu_sfence();
1658
1659         old_write_domain = obj->base.write_domain;
1660         obj->base.write_domain = 0;
1661 }
1662
1663 int
1664 i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
1665 {
1666         uint32_t old_write_domain, old_read_domains;
1667         int ret;
1668
1669         if (obj->gtt_space == NULL)
1670                 return (-EINVAL);
1671
1672         if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
1673                 return 0;
1674
1675         ret = i915_gem_object_flush_gpu_write_domain(obj);
1676         if (ret != 0)
1677                 return (ret);
1678
1679         if (obj->pending_gpu_write || write) {
1680                 ret = i915_gem_object_wait_rendering(obj);
1681                 if (ret != 0)
1682                         return (ret);
1683         }
1684
1685         i915_gem_object_flush_cpu_write_domain(obj);
1686
1687         old_write_domain = obj->base.write_domain;
1688         old_read_domains = obj->base.read_domains;
1689
1690         KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) == 0,
1691             ("In GTT write domain"));
1692         obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
1693         if (write) {
1694                 obj->base.read_domains = I915_GEM_DOMAIN_GTT;
1695                 obj->base.write_domain = I915_GEM_DOMAIN_GTT;
1696                 obj->dirty = 1;
1697         }
1698
1699         return (0);
1700 }
1701
1702 int
1703 i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
1704     enum i915_cache_level cache_level)
1705 {
1706         struct drm_device *dev;
1707         drm_i915_private_t *dev_priv;
1708         int ret;
1709
1710         if (obj->cache_level == cache_level)
1711                 return 0;
1712
1713         if (obj->pin_count) {
1714                 DRM_DEBUG("can not change the cache level of pinned objects\n");
1715                 return (-EBUSY);
1716         }
1717
1718         dev = obj->base.dev;
1719         dev_priv = dev->dev_private;
1720         if (obj->gtt_space) {
1721                 ret = i915_gem_object_finish_gpu(obj);
1722                 if (ret != 0)
1723                         return (ret);
1724
1725                 i915_gem_object_finish_gtt(obj);
1726
1727                 /* Before SandyBridge, you could not use tiling or fence
1728                  * registers with snooped memory, so relinquish any fences
1729                  * currently pointing to our region in the aperture.
1730                  */
1731                 if (INTEL_INFO(obj->base.dev)->gen < 6) {
1732                         ret = i915_gem_object_put_fence(obj);
1733                         if (ret != 0)
1734                                 return (ret);
1735                 }
1736
1737                 i915_gem_gtt_rebind_object(obj, cache_level);
1738                 if (obj->has_aliasing_ppgtt_mapping)
1739                         i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
1740                             obj, cache_level);
1741         }
1742
1743         if (cache_level == I915_CACHE_NONE) {
1744                 u32 old_read_domains, old_write_domain;
1745
1746                 /* If we're coming from LLC cached, then we haven't
1747                  * actually been tracking whether the data is in the
1748                  * CPU cache or not, since we only allow one bit set
1749                  * in obj->write_domain and have been skipping the clflushes.
1750                  * Just set it to the CPU cache for now.
1751                  */
1752                 KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0,
1753                     ("obj %p in CPU write domain", obj));
1754                 KASSERT((obj->base.read_domains & ~I915_GEM_DOMAIN_CPU) == 0,
1755                     ("obj %p in CPU read domain", obj));
1756
1757                 old_read_domains = obj->base.read_domains;
1758                 old_write_domain = obj->base.write_domain;
1759
1760                 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
1761                 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1762
1763         }
1764
1765         obj->cache_level = cache_level;
1766         return (0);
1767 }
1768
1769 int
1770 i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
1771     u32 alignment, struct intel_ring_buffer *pipelined)
1772 {
1773         u32 old_read_domains, old_write_domain;
1774         int ret;
1775
1776         ret = i915_gem_object_flush_gpu_write_domain(obj);
1777         if (ret != 0)
1778                 return (ret);
1779
1780         if (pipelined != obj->ring) {
1781                 ret = i915_gem_object_wait_rendering(obj);
1782                 if (ret == -ERESTART || ret == -EINTR)
1783                         return (ret);
1784         }
1785
1786         ret = i915_gem_object_set_cache_level(obj, I915_CACHE_NONE);
1787         if (ret != 0)
1788                 return (ret);
1789
1790         ret = i915_gem_object_pin(obj, alignment, true);
1791         if (ret != 0)
1792                 return (ret);
1793
1794         i915_gem_object_flush_cpu_write_domain(obj);
1795
1796         old_write_domain = obj->base.write_domain;
1797         old_read_domains = obj->base.read_domains;
1798
1799         KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) == 0,
1800             ("obj %p in GTT write domain", obj));
1801         obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
1802
1803         return (0);
1804 }
1805
1806 int
1807 i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj)
1808 {
1809         int ret;
1810
1811         if ((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0)
1812                 return (0);
1813
1814         if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
1815                 ret = i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain);
1816                 if (ret != 0)
1817                         return (ret);
1818         }
1819
1820         ret = i915_gem_object_wait_rendering(obj);
1821         if (ret != 0)
1822                 return (ret);
1823
1824         obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
1825
1826         return (0);
1827 }
1828
1829 static int
1830 i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
1831 {
1832         uint32_t old_write_domain, old_read_domains;
1833         int ret;
1834
1835         if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
1836                 return 0;
1837
1838         ret = i915_gem_object_flush_gpu_write_domain(obj);
1839         if (ret != 0)
1840                 return (ret);
1841
1842         ret = i915_gem_object_wait_rendering(obj);
1843         if (ret != 0)
1844                 return (ret);
1845
1846         i915_gem_object_flush_gtt_write_domain(obj);
1847         i915_gem_object_set_to_full_cpu_read_domain(obj);
1848
1849         old_write_domain = obj->base.write_domain;
1850         old_read_domains = obj->base.read_domains;
1851
1852         if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
1853                 i915_gem_clflush_object(obj);
1854                 obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
1855         }
1856
1857         KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0,
1858             ("In cpu write domain"));
1859
1860         if (write) {
1861                 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
1862                 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1863         }
1864
1865         return (0);
1866 }
1867
1868 static void
1869 i915_gem_object_set_to_full_cpu_read_domain(struct drm_i915_gem_object *obj)
1870 {
1871         int i;
1872
1873         if (obj->page_cpu_valid == NULL)
1874                 return;
1875
1876         if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0) {
1877                 for (i = 0; i <= (obj->base.size - 1) / PAGE_SIZE; i++) {
1878                         if (obj->page_cpu_valid[i] != 0)
1879                                 continue;
1880                         drm_clflush_pages(obj->pages + i, 1);
1881                 }
1882         }
1883
1884         drm_free(obj->page_cpu_valid, DRM_I915_GEM);
1885         obj->page_cpu_valid = NULL;
1886 }
1887
1888 static int
1889 i915_gem_object_set_cpu_read_domain_range(struct drm_i915_gem_object *obj,
1890     uint64_t offset, uint64_t size)
1891 {
1892         uint32_t old_read_domains;
1893         int i, ret;
1894
1895         if (offset == 0 && size == obj->base.size)
1896                 return (i915_gem_object_set_to_cpu_domain(obj, 0));
1897
1898         ret = i915_gem_object_flush_gpu_write_domain(obj);
1899         if (ret != 0)
1900                 return (ret);
1901         ret = i915_gem_object_wait_rendering(obj);
1902         if (ret != 0)
1903                 return (ret);
1904
1905         i915_gem_object_flush_gtt_write_domain(obj);
1906
1907         if (obj->page_cpu_valid == NULL &&
1908             (obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0)
1909                 return (0);
1910
1911         if (obj->page_cpu_valid == NULL) {
1912                 obj->page_cpu_valid = kmalloc(obj->base.size / PAGE_SIZE,
1913                     DRM_I915_GEM, M_WAITOK | M_ZERO);
1914         } else if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0)
1915                 memset(obj->page_cpu_valid, 0, obj->base.size / PAGE_SIZE);
1916
1917         for (i = offset / PAGE_SIZE; i <= (offset + size - 1) / PAGE_SIZE;
1918              i++) {
1919                 if (obj->page_cpu_valid[i])
1920                         continue;
1921                 drm_clflush_pages(obj->pages + i, 1);
1922                 obj->page_cpu_valid[i] = 1;
1923         }
1924
1925         KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0,
1926             ("In gpu write domain"));
1927
1928         old_read_domains = obj->base.read_domains;
1929         obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
1930
1931         return (0);
1932 }
1933
1934 static uint32_t
1935 i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
1936 {
1937         uint32_t gtt_size;
1938
1939         if (INTEL_INFO(dev)->gen >= 4 ||
1940             tiling_mode == I915_TILING_NONE)
1941                 return (size);
1942
1943         /* Previous chips need a power-of-two fence region when tiling */
1944         if (INTEL_INFO(dev)->gen == 3)
1945                 gtt_size = 1024*1024;
1946         else
1947                 gtt_size = 512*1024;
1948
1949         while (gtt_size < size)
1950                 gtt_size <<= 1;
1951
1952         return (gtt_size);
1953 }
1954
1955 /**
1956  * i915_gem_get_gtt_alignment - return required GTT alignment for an object
1957  * @obj: object to check
1958  *
1959  * Return the required GTT alignment for an object, taking into account
1960  * potential fence register mapping.
1961  */
1962 static uint32_t
1963 i915_gem_get_gtt_alignment(struct drm_device *dev, uint32_t size,
1964      int tiling_mode)
1965 {
1966
1967         /*
1968          * Minimum alignment is 4k (GTT page size), but might be greater
1969          * if a fence register is needed for the object.
1970          */
1971         if (INTEL_INFO(dev)->gen >= 4 ||
1972             tiling_mode == I915_TILING_NONE)
1973                 return (4096);
1974
1975         /*
1976          * Previous chips need to be aligned to the size of the smallest
1977          * fence register that can contain the object.
1978          */
1979         return (i915_gem_get_gtt_size(dev, size, tiling_mode));
1980 }
1981
1982 uint32_t
1983 i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, uint32_t size,
1984     int tiling_mode)
1985 {
1986
1987         if (tiling_mode == I915_TILING_NONE)
1988                 return (4096);
1989
1990         /*
1991          * Minimum alignment is 4k (GTT page size) for sane hw.
1992          */
1993         if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev))
1994                 return (4096);
1995
1996         /*
1997          * Previous hardware however needs to be aligned to a power-of-two
1998          * tile height. The simplest method for determining this is to reuse
1999          * the power-of-tile object size.
2000          */
2001         return (i915_gem_get_gtt_size(dev, size, tiling_mode));
2002 }
2003
2004 static int
2005 i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2006     unsigned alignment, bool map_and_fenceable)
2007 {
2008         struct drm_device *dev;
2009         struct drm_i915_private *dev_priv;
2010         struct drm_mm_node *free_space;
2011         uint32_t size, fence_size, fence_alignment, unfenced_alignment;
2012         bool mappable, fenceable;
2013         int ret;
2014
2015         dev = obj->base.dev;
2016         dev_priv = dev->dev_private;
2017
2018         if (obj->madv != I915_MADV_WILLNEED) {
2019                 DRM_ERROR("Attempting to bind a purgeable object\n");
2020                 return (-EINVAL);
2021         }
2022
2023         fence_size = i915_gem_get_gtt_size(dev, obj->base.size,
2024             obj->tiling_mode);
2025         fence_alignment = i915_gem_get_gtt_alignment(dev, obj->base.size,
2026             obj->tiling_mode);
2027         unfenced_alignment = i915_gem_get_unfenced_gtt_alignment(dev,
2028             obj->base.size, obj->tiling_mode);
2029         if (alignment == 0)
2030                 alignment = map_and_fenceable ? fence_alignment :
2031                     unfenced_alignment;
2032         if (map_and_fenceable && (alignment & (fence_alignment - 1)) != 0) {
2033                 DRM_ERROR("Invalid object alignment requested %u\n", alignment);
2034                 return (-EINVAL);
2035         }
2036
2037         size = map_and_fenceable ? fence_size : obj->base.size;
2038
2039         /* If the object is bigger than the entire aperture, reject it early
2040          * before evicting everything in a vain attempt to find space.
2041          */
2042         if (obj->base.size > (map_and_fenceable ?
2043             dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) {
2044                 DRM_ERROR(
2045 "Attempting to bind an object larger than the aperture\n");
2046                 return (-E2BIG);
2047         }
2048
2049  search_free:
2050         if (map_and_fenceable)
2051                 free_space = drm_mm_search_free_in_range(
2052                     &dev_priv->mm.gtt_space, size, alignment, 0,
2053                     dev_priv->mm.gtt_mappable_end, 0);
2054         else
2055                 free_space = drm_mm_search_free(&dev_priv->mm.gtt_space,
2056                     size, alignment, 0);
2057         if (free_space != NULL) {
2058                 if (map_and_fenceable)
2059                         obj->gtt_space = drm_mm_get_block_range_generic(
2060                             free_space, size, alignment, 0,
2061                             dev_priv->mm.gtt_mappable_end, 1);
2062                 else
2063                         obj->gtt_space = drm_mm_get_block_generic(free_space,
2064                             size, alignment, 1);
2065         }
2066         if (obj->gtt_space == NULL) {
2067                 ret = i915_gem_evict_something(dev, size, alignment,
2068                     map_and_fenceable);
2069                 if (ret != 0)
2070                         return (ret);
2071                 goto search_free;
2072         }
2073         ret = i915_gem_object_get_pages_gtt(obj, 0);
2074         if (ret != 0) {
2075                 drm_mm_put_block(obj->gtt_space);
2076                 obj->gtt_space = NULL;
2077                 /*
2078                  * i915_gem_object_get_pages_gtt() cannot return
2079                  * ENOMEM, since we use vm_page_grab(VM_ALLOC_RETRY)
2080                  * (which does not support operation without a flag
2081                  * anyway).
2082                  */
2083                 return (ret);
2084         }
2085
2086         ret = i915_gem_gtt_bind_object(obj);
2087         if (ret != 0) {
2088                 i915_gem_object_put_pages_gtt(obj);
2089                 drm_mm_put_block(obj->gtt_space);
2090                 obj->gtt_space = NULL;
2091                 if (i915_gem_evict_everything(dev, false))
2092                         return (ret);
2093                 goto search_free;
2094         }
2095
2096         list_add_tail(&obj->gtt_list, &dev_priv->mm.gtt_list);
2097         list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
2098
2099         KASSERT((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0,
2100             ("Object in gpu read domain"));
2101         KASSERT((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0,
2102             ("Object in gpu write domain"));
2103
2104         obj->gtt_offset = obj->gtt_space->start;
2105
2106         fenceable =
2107                 obj->gtt_space->size == fence_size &&
2108                 (obj->gtt_space->start & (fence_alignment - 1)) == 0;
2109
2110         mappable =
2111                 obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
2112         obj->map_and_fenceable = mappable && fenceable;
2113
2114         return (0);
2115 }
2116
2117 static void
2118 i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
2119 {
2120         u32 old_write_domain, old_read_domains;
2121
2122         /* Act a barrier for all accesses through the GTT */
2123         cpu_mfence();
2124
2125         /* Force a pagefault for domain tracking on next user access */
2126         i915_gem_release_mmap(obj);
2127
2128         if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
2129                 return;
2130
2131         old_read_domains = obj->base.read_domains;
2132         old_write_domain = obj->base.write_domain;
2133
2134         obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT;
2135         obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT;
2136
2137 }
2138
2139 int
2140 i915_gem_object_unbind(struct drm_i915_gem_object *obj)
2141 {
2142         drm_i915_private_t *dev_priv;
2143         int ret;
2144
2145         dev_priv = obj->base.dev->dev_private;
2146         ret = 0;
2147         if (obj->gtt_space == NULL)
2148                 return (0);
2149         if (obj->pin_count != 0) {
2150                 DRM_ERROR("Attempting to unbind pinned buffer\n");
2151                 return (-EINVAL);
2152         }
2153
2154         ret = i915_gem_object_finish_gpu(obj);
2155         if (ret == -ERESTART || ret == -EINTR)
2156                 return (ret);
2157
2158         i915_gem_object_finish_gtt(obj);
2159
2160         if (ret == 0)
2161                 ret = i915_gem_object_set_to_cpu_domain(obj, 1);
2162         if (ret == -ERESTART || ret == -EINTR)
2163                 return (ret);
2164         if (ret != 0) {
2165                 i915_gem_clflush_object(obj);
2166                 obj->base.read_domains = obj->base.write_domain =
2167                     I915_GEM_DOMAIN_CPU;
2168         }
2169
2170         ret = i915_gem_object_put_fence(obj);
2171         if (ret == -ERESTART)
2172                 return (ret);
2173
2174         i915_gem_gtt_unbind_object(obj);
2175         if (obj->has_aliasing_ppgtt_mapping) {
2176                 i915_ppgtt_unbind_object(dev_priv->mm.aliasing_ppgtt, obj);
2177                 obj->has_aliasing_ppgtt_mapping = 0;
2178         }
2179         i915_gem_object_put_pages_gtt(obj);
2180
2181         list_del_init(&obj->gtt_list);
2182         list_del_init(&obj->mm_list);
2183         obj->map_and_fenceable = true;
2184
2185         drm_mm_put_block(obj->gtt_space);
2186         obj->gtt_space = NULL;
2187         obj->gtt_offset = 0;
2188
2189         if (i915_gem_object_is_purgeable(obj))
2190                 i915_gem_object_truncate(obj);
2191
2192         return (ret);
2193 }
2194
2195 static int
2196 i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
2197     int flags)
2198 {
2199         struct drm_device *dev;
2200         vm_object_t vm_obj;
2201         vm_page_t m;
2202         int page_count, i, j;
2203
2204         dev = obj->base.dev;
2205         KASSERT(obj->pages == NULL, ("Obj already has pages"));
2206         page_count = obj->base.size / PAGE_SIZE;
2207         obj->pages = kmalloc(page_count * sizeof(vm_page_t), DRM_I915_GEM,
2208             M_WAITOK);
2209         vm_obj = obj->base.vm_obj;
2210         VM_OBJECT_LOCK(vm_obj);
2211         for (i = 0; i < page_count; i++) {
2212                 if ((obj->pages[i] = i915_gem_wire_page(vm_obj, i)) == NULL)
2213                         goto failed;
2214         }
2215         VM_OBJECT_UNLOCK(vm_obj);
2216         if (i915_gem_object_needs_bit17_swizzle(obj))
2217                 i915_gem_object_do_bit_17_swizzle(obj);
2218         return (0);
2219
2220 failed:
2221         for (j = 0; j < i; j++) {
2222                 m = obj->pages[j];
2223                 vm_page_busy_wait(m, FALSE, "i915gem");
2224                 vm_page_unwire(m, 0);
2225                 vm_page_wakeup(m);
2226                 atomic_add_long(&i915_gem_wired_pages_cnt, -1);
2227         }
2228         VM_OBJECT_UNLOCK(vm_obj);
2229         drm_free(obj->pages, DRM_I915_GEM);
2230         obj->pages = NULL;
2231         return (-EIO);
2232 }
2233
2234 #define GEM_PARANOID_CHECK_GTT 0
2235 #if GEM_PARANOID_CHECK_GTT
2236 static void
2237 i915_gem_assert_pages_not_mapped(struct drm_device *dev, vm_page_t *ma,
2238     int page_count)
2239 {
2240         struct drm_i915_private *dev_priv;
2241         vm_paddr_t pa;
2242         unsigned long start, end;
2243         u_int i;
2244         int j;
2245
2246         dev_priv = dev->dev_private;
2247         start = OFF_TO_IDX(dev_priv->mm.gtt_start);
2248         end = OFF_TO_IDX(dev_priv->mm.gtt_end);
2249         for (i = start; i < end; i++) {
2250                 pa = intel_gtt_read_pte_paddr(i);
2251                 for (j = 0; j < page_count; j++) {
2252                         if (pa == VM_PAGE_TO_PHYS(ma[j])) {
2253                                 panic("Page %p in GTT pte index %d pte %x",
2254                                     ma[i], i, intel_gtt_read_pte(i));
2255                         }
2256                 }
2257         }
2258 }
2259 #endif
2260
2261 static void
2262 i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
2263 {
2264         vm_page_t m;
2265         int page_count, i;
2266
2267         KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object"));
2268
2269         if (obj->tiling_mode != I915_TILING_NONE)
2270                 i915_gem_object_save_bit_17_swizzle(obj);
2271         if (obj->madv == I915_MADV_DONTNEED)
2272                 obj->dirty = 0;
2273         page_count = obj->base.size / PAGE_SIZE;
2274         VM_OBJECT_LOCK(obj->base.vm_obj);
2275 #if GEM_PARANOID_CHECK_GTT
2276         i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count);
2277 #endif
2278         for (i = 0; i < page_count; i++) {
2279                 m = obj->pages[i];
2280                 if (obj->dirty)
2281                         vm_page_dirty(m);
2282                 if (obj->madv == I915_MADV_WILLNEED)
2283                         vm_page_reference(m);
2284                 vm_page_busy_wait(obj->pages[i], FALSE, "i915gem");
2285                 vm_page_unwire(obj->pages[i], 1);
2286                 vm_page_wakeup(obj->pages[i]);
2287                 atomic_add_long(&i915_gem_wired_pages_cnt, -1);
2288         }
2289         VM_OBJECT_UNLOCK(obj->base.vm_obj);
2290         obj->dirty = 0;
2291         drm_free(obj->pages, DRM_I915_GEM);
2292         obj->pages = NULL;
2293 }
2294
2295 void
2296 i915_gem_release_mmap(struct drm_i915_gem_object *obj)
2297 {
2298         vm_object_t devobj;
2299         vm_page_t m;
2300         int i, page_count;
2301
2302         if (!obj->fault_mappable)
2303                 return;
2304
2305         devobj = cdev_pager_lookup(obj);
2306         if (devobj != NULL) {
2307                 page_count = OFF_TO_IDX(obj->base.size);
2308
2309                 VM_OBJECT_LOCK(devobj);
2310                 for (i = 0; i < page_count; i++) {
2311                         m = vm_page_lookup_busy_wait(devobj, i, TRUE, "915unm");
2312                         if (m == NULL)
2313                                 continue;
2314                         cdev_pager_free_page(devobj, m);
2315                 }
2316                 VM_OBJECT_UNLOCK(devobj);
2317                 vm_object_deallocate(devobj);
2318         }
2319
2320         obj->fault_mappable = false;
2321 }
2322
2323 int
2324 i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj)
2325 {
2326         int ret;
2327
2328         KASSERT((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0,
2329             ("In GPU write domain"));
2330
2331         if (obj->active) {
2332                 ret = i915_wait_request(obj->ring, obj->last_rendering_seqno,
2333                     true);
2334                 if (ret != 0)
2335                         return (ret);
2336         }
2337         return (0);
2338 }
2339
2340 void
2341 i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
2342     struct intel_ring_buffer *ring, uint32_t seqno)
2343 {
2344         struct drm_device *dev = obj->base.dev;
2345         struct drm_i915_private *dev_priv = dev->dev_private;
2346         struct drm_i915_fence_reg *reg;
2347
2348         obj->ring = ring;
2349         KASSERT(ring != NULL, ("NULL ring"));
2350
2351         /* Add a reference if we're newly entering the active list. */
2352         if (!obj->active) {
2353                 drm_gem_object_reference(&obj->base);
2354                 obj->active = 1;
2355         }
2356
2357         /* Move from whatever list we were on to the tail of execution. */
2358         list_move_tail(&obj->mm_list, &dev_priv->mm.active_list);
2359         list_move_tail(&obj->ring_list, &ring->active_list);
2360
2361         obj->last_rendering_seqno = seqno;
2362         if (obj->fenced_gpu_access) {
2363                 obj->last_fenced_seqno = seqno;
2364                 obj->last_fenced_ring = ring;
2365
2366                 /* Bump MRU to take account of the delayed flush */
2367                 if (obj->fence_reg != I915_FENCE_REG_NONE) {
2368                         reg = &dev_priv->fence_regs[obj->fence_reg];
2369                         list_move_tail(&reg->lru_list,
2370                                        &dev_priv->mm.fence_list);
2371                 }
2372         }
2373 }
2374
2375 static void
2376 i915_gem_object_move_off_active(struct drm_i915_gem_object *obj)
2377 {
2378         list_del_init(&obj->ring_list);
2379         obj->last_rendering_seqno = 0;
2380         obj->last_fenced_seqno = 0;
2381 }
2382
2383 static void
2384 i915_gem_object_move_to_flushing(struct drm_i915_gem_object *obj)
2385 {
2386         struct drm_device *dev = obj->base.dev;
2387         drm_i915_private_t *dev_priv = dev->dev_private;
2388
2389         KASSERT(obj->active, ("Object not active"));
2390         list_move_tail(&obj->mm_list, &dev_priv->mm.flushing_list);
2391
2392         i915_gem_object_move_off_active(obj);
2393 }
2394
2395 static void
2396 i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
2397 {
2398         struct drm_device *dev = obj->base.dev;
2399         struct drm_i915_private *dev_priv = dev->dev_private;
2400
2401         if (obj->pin_count != 0)
2402                 list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list);
2403         else
2404                 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
2405
2406         KASSERT(list_empty(&obj->gpu_write_list), ("On gpu_write_list"));
2407         KASSERT(obj->active, ("Object not active"));
2408         obj->ring = NULL;
2409         obj->last_fenced_ring = NULL;
2410
2411         i915_gem_object_move_off_active(obj);
2412         obj->fenced_gpu_access = false;
2413
2414         obj->active = 0;
2415         obj->pending_gpu_write = false;
2416         drm_gem_object_unreference(&obj->base);
2417
2418 #if 1
2419         KIB_NOTYET();
2420 #else
2421         WARN_ON(i915_verify_lists(dev));
2422 #endif
2423 }
2424
2425 static void
2426 i915_gem_object_truncate(struct drm_i915_gem_object *obj)
2427 {
2428         vm_object_t vm_obj;
2429
2430         vm_obj = obj->base.vm_obj;
2431         VM_OBJECT_LOCK(vm_obj);
2432         vm_object_page_remove(vm_obj, 0, 0, false);
2433         VM_OBJECT_UNLOCK(vm_obj);
2434         obj->madv = I915_MADV_PURGED_INTERNAL;
2435 }
2436
2437 static inline int
2438 i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj)
2439 {
2440
2441         return (obj->madv == I915_MADV_DONTNEED);
2442 }
2443
2444 static void
2445 i915_gem_process_flushing_list(struct intel_ring_buffer *ring,
2446     uint32_t flush_domains)
2447 {
2448         struct drm_i915_gem_object *obj, *next;
2449         uint32_t old_write_domain;
2450
2451         list_for_each_entry_safe(obj, next, &ring->gpu_write_list,
2452             gpu_write_list) {
2453                 if (obj->base.write_domain & flush_domains) {
2454                         old_write_domain = obj->base.write_domain;
2455                         obj->base.write_domain = 0;
2456                         list_del_init(&obj->gpu_write_list);
2457                         i915_gem_object_move_to_active(obj, ring,
2458                             i915_gem_next_request_seqno(ring));
2459                 }
2460         }
2461 }
2462
2463 static int
2464 i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
2465 {
2466         drm_i915_private_t *dev_priv;
2467
2468         dev_priv = obj->base.dev->dev_private;
2469         return (dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 &&
2470             obj->tiling_mode != I915_TILING_NONE);
2471 }
2472
2473 #define VM_OBJECT_LOCK_ASSERT_OWNED(object)
2474
2475 static vm_page_t
2476 i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex)
2477 {
2478         vm_page_t m;
2479         int rv;
2480
2481         VM_OBJECT_LOCK_ASSERT_OWNED(object);
2482         m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
2483         if (m->valid != VM_PAGE_BITS_ALL) {
2484                 if (vm_pager_has_page(object, pindex)) {
2485                         rv = vm_pager_get_page(object, &m, 1);
2486                         m = vm_page_lookup(object, pindex);
2487                         if (m == NULL)
2488                                 return (NULL);
2489                         if (rv != VM_PAGER_OK) {
2490                                 vm_page_free(m);
2491                                 return (NULL);
2492                         }
2493                 } else {
2494                         pmap_zero_page(VM_PAGE_TO_PHYS(m));
2495                         m->valid = VM_PAGE_BITS_ALL;
2496                         m->dirty = 0;
2497                 }
2498         }
2499         vm_page_wire(m);
2500         vm_page_wakeup(m);
2501         atomic_add_long(&i915_gem_wired_pages_cnt, 1);
2502         return (m);
2503 }
2504
2505 int
2506 i915_gem_flush_ring(struct intel_ring_buffer *ring, uint32_t invalidate_domains,
2507     uint32_t flush_domains)
2508 {
2509         int ret;
2510
2511         if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0)
2512                 return 0;
2513
2514         ret = ring->flush(ring, invalidate_domains, flush_domains);
2515         if (ret)
2516                 return ret;
2517
2518         if (flush_domains & I915_GEM_GPU_DOMAINS)
2519                 i915_gem_process_flushing_list(ring, flush_domains);
2520         return 0;
2521 }
2522
2523 static int
2524 i915_ring_idle(struct intel_ring_buffer *ring, bool do_retire)
2525 {
2526         int ret;
2527
2528         if (list_empty(&ring->gpu_write_list) && list_empty(&ring->active_list))
2529                 return 0;
2530
2531         if (!list_empty(&ring->gpu_write_list)) {
2532                 ret = i915_gem_flush_ring(ring, I915_GEM_GPU_DOMAINS,
2533                     I915_GEM_GPU_DOMAINS);
2534                 if (ret != 0)
2535                         return ret;
2536         }
2537
2538         return (i915_wait_request(ring, i915_gem_next_request_seqno(ring),
2539             do_retire));
2540 }
2541
2542 int
2543 i915_gpu_idle(struct drm_device *dev, bool do_retire)
2544 {
2545         drm_i915_private_t *dev_priv = dev->dev_private;
2546         int ret, i;
2547
2548         /* Flush everything onto the inactive list. */
2549         for (i = 0; i < I915_NUM_RINGS; i++) {
2550                 ret = i915_ring_idle(&dev_priv->rings[i], do_retire);
2551                 if (ret)
2552                         return ret;
2553         }
2554
2555         return 0;
2556 }
2557
2558 int
2559 i915_wait_request(struct intel_ring_buffer *ring, uint32_t seqno, bool do_retire)
2560 {
2561         drm_i915_private_t *dev_priv;
2562         struct drm_i915_gem_request *request;
2563         uint32_t ier;
2564         int flags, ret;
2565         bool recovery_complete;
2566
2567         KASSERT(seqno != 0, ("Zero seqno"));
2568
2569         dev_priv = ring->dev->dev_private;
2570         ret = 0;
2571
2572         if (atomic_load_acq_int(&dev_priv->mm.wedged) != 0) {
2573                 /* Give the error handler a chance to run. */
2574                 lockmgr(&dev_priv->error_completion_lock, LK_EXCLUSIVE);
2575                 recovery_complete = (&dev_priv->error_completion) > 0;
2576                 lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
2577                 return (recovery_complete ? -EIO : -EAGAIN);
2578         }
2579
2580         if (seqno == ring->outstanding_lazy_request) {
2581                 request = kmalloc(sizeof(*request), DRM_I915_GEM,
2582                     M_WAITOK | M_ZERO);
2583                 if (request == NULL)
2584                         return (-ENOMEM);
2585
2586                 ret = i915_add_request(ring, NULL, request);
2587                 if (ret != 0) {
2588                         drm_free(request, DRM_I915_GEM);
2589                         return (ret);
2590                 }
2591
2592                 seqno = request->seqno;
2593         }
2594
2595         if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
2596                 if (HAS_PCH_SPLIT(ring->dev))
2597                         ier = I915_READ(DEIER) | I915_READ(GTIER);
2598                 else
2599                         ier = I915_READ(IER);
2600                 if (!ier) {
2601                         DRM_ERROR("something (likely vbetool) disabled "
2602                                   "interrupts, re-enabling\n");
2603                         ring->dev->driver->irq_preinstall(ring->dev);
2604                         ring->dev->driver->irq_postinstall(ring->dev);
2605                 }
2606
2607                 ring->waiting_seqno = seqno;
2608                 lockmgr(&ring->irq_lock, LK_EXCLUSIVE);
2609                 if (ring->irq_get(ring)) {
2610                         flags = dev_priv->mm.interruptible ? PCATCH : 0;
2611                         while (!i915_seqno_passed(ring->get_seqno(ring), seqno)
2612                             && !atomic_load_acq_int(&dev_priv->mm.wedged) &&
2613                             ret == 0) {
2614                                 ret = -lksleep(ring, &ring->irq_lock, flags,
2615                                     "915gwr", 0);
2616                         }
2617                         ring->irq_put(ring);
2618                         lockmgr(&ring->irq_lock, LK_RELEASE);
2619                 } else {
2620                         lockmgr(&ring->irq_lock, LK_RELEASE);
2621                         if (_intel_wait_for(ring->dev,
2622                             i915_seqno_passed(ring->get_seqno(ring), seqno) ||
2623                             atomic_load_acq_int(&dev_priv->mm.wedged), 3000,
2624                             0, "i915wrq") != 0)
2625                                 ret = -EBUSY;
2626                 }
2627                 ring->waiting_seqno = 0;
2628
2629         }
2630         if (atomic_load_acq_int(&dev_priv->mm.wedged))
2631                 ret = -EAGAIN;
2632
2633         /* Directly dispatch request retiring.  While we have the work queue
2634          * to handle this, the waiter on a request often wants an associated
2635          * buffer to have made it to the inactive list, and we would need
2636          * a separate wait queue to handle that.
2637          */
2638         if (ret == 0 && do_retire)
2639                 i915_gem_retire_requests_ring(ring);
2640
2641         return (ret);
2642 }
2643
2644 static u32
2645 i915_gem_get_seqno(struct drm_device *dev)
2646 {
2647         drm_i915_private_t *dev_priv = dev->dev_private;
2648         u32 seqno = dev_priv->next_seqno;
2649
2650         /* reserve 0 for non-seqno */
2651         if (++dev_priv->next_seqno == 0)
2652                 dev_priv->next_seqno = 1;
2653
2654         return seqno;
2655 }
2656
2657 u32
2658 i915_gem_next_request_seqno(struct intel_ring_buffer *ring)
2659 {
2660         if (ring->outstanding_lazy_request == 0)
2661                 ring->outstanding_lazy_request = i915_gem_get_seqno(ring->dev);
2662
2663         return ring->outstanding_lazy_request;
2664 }
2665
2666 int
2667 i915_add_request(struct intel_ring_buffer *ring, struct drm_file *file,
2668      struct drm_i915_gem_request *request)
2669 {
2670         drm_i915_private_t *dev_priv;
2671         struct drm_i915_file_private *file_priv;
2672         uint32_t seqno;
2673         u32 request_ring_position;
2674         int was_empty;
2675         int ret;
2676
2677         KASSERT(request != NULL, ("NULL request in add"));
2678         DRM_LOCK_ASSERT(ring->dev);
2679         dev_priv = ring->dev->dev_private;
2680
2681         seqno = i915_gem_next_request_seqno(ring);
2682         request_ring_position = intel_ring_get_tail(ring);
2683
2684         ret = ring->add_request(ring, &seqno);
2685         if (ret != 0)
2686             return ret;
2687
2688         request->seqno = seqno;
2689         request->ring = ring;
2690         request->tail = request_ring_position;
2691         request->emitted_jiffies = ticks;
2692         was_empty = list_empty(&ring->request_list);
2693         list_add_tail(&request->list, &ring->request_list);
2694
2695         if (file != NULL) {
2696                 file_priv = file->driver_priv;
2697
2698                 spin_lock(&file_priv->mm.lock);
2699                 request->file_priv = file_priv;
2700                 list_add_tail(&request->client_list,
2701                     &file_priv->mm.request_list);
2702                 spin_unlock(&file_priv->mm.lock);
2703         }
2704
2705         ring->outstanding_lazy_request = 0;
2706
2707         if (!dev_priv->mm.suspended) {
2708                 if (i915_enable_hangcheck) {
2709                         callout_reset(&dev_priv->hangcheck_timer,
2710                             DRM_I915_HANGCHECK_PERIOD, i915_hangcheck_elapsed, ring->dev);
2711                 }
2712                 if (was_empty)
2713                         taskqueue_enqueue_timeout(dev_priv->tq,
2714                             &dev_priv->mm.retire_task, hz);
2715         }
2716         return (0);
2717 }
2718
2719 static inline void
2720 i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
2721 {
2722         struct drm_i915_file_private *file_priv = request->file_priv;
2723
2724         if (!file_priv)
2725                 return;
2726
2727         DRM_LOCK_ASSERT(request->ring->dev);
2728
2729         spin_lock(&file_priv->mm.lock);
2730         if (request->file_priv != NULL) {
2731                 list_del(&request->client_list);
2732                 request->file_priv = NULL;
2733         }
2734         spin_unlock(&file_priv->mm.lock);
2735 }
2736
2737 void
2738 i915_gem_release(struct drm_device *dev, struct drm_file *file)
2739 {
2740         struct drm_i915_file_private *file_priv;
2741         struct drm_i915_gem_request *request;
2742
2743         file_priv = file->driver_priv;
2744
2745         /* Clean up our request list when the client is going away, so that
2746          * later retire_requests won't dereference our soon-to-be-gone
2747          * file_priv.
2748          */
2749         spin_lock(&file_priv->mm.lock);
2750         while (!list_empty(&file_priv->mm.request_list)) {
2751                 request = list_first_entry(&file_priv->mm.request_list,
2752                                            struct drm_i915_gem_request,
2753                                            client_list);
2754                 list_del(&request->client_list);
2755                 request->file_priv = NULL;
2756         }
2757         spin_unlock(&file_priv->mm.lock);
2758 }
2759
2760 static void
2761 i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
2762     struct intel_ring_buffer *ring)
2763 {
2764
2765         if (ring->dev != NULL)
2766                 DRM_LOCK_ASSERT(ring->dev);
2767
2768         while (!list_empty(&ring->request_list)) {
2769                 struct drm_i915_gem_request *request;
2770
2771                 request = list_first_entry(&ring->request_list,
2772                     struct drm_i915_gem_request, list);
2773
2774                 list_del(&request->list);
2775                 i915_gem_request_remove_from_client(request);
2776                 drm_free(request, DRM_I915_GEM);
2777         }
2778
2779         while (!list_empty(&ring->active_list)) {
2780                 struct drm_i915_gem_object *obj;
2781
2782                 obj = list_first_entry(&ring->active_list,
2783                     struct drm_i915_gem_object, ring_list);
2784
2785                 obj->base.write_domain = 0;
2786                 list_del_init(&obj->gpu_write_list);
2787                 i915_gem_object_move_to_inactive(obj);
2788         }
2789 }
2790
2791 static void
2792 i915_gem_reset_fences(struct drm_device *dev)
2793 {
2794         struct drm_i915_private *dev_priv = dev->dev_private;
2795         int i;
2796
2797         for (i = 0; i < dev_priv->num_fence_regs; i++) {
2798                 struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
2799                 struct drm_i915_gem_object *obj = reg->obj;
2800
2801                 if (!obj)
2802                         continue;
2803
2804                 if (obj->tiling_mode)
2805                         i915_gem_release_mmap(obj);
2806
2807                 reg->obj->fence_reg = I915_FENCE_REG_NONE;
2808                 reg->obj->fenced_gpu_access = false;
2809                 reg->obj->last_fenced_seqno = 0;
2810                 reg->obj->last_fenced_ring = NULL;
2811                 i915_gem_clear_fence_reg(dev, reg);
2812         }
2813 }
2814
2815 void
2816 i915_gem_reset(struct drm_device *dev)
2817 {
2818         struct drm_i915_private *dev_priv = dev->dev_private;
2819         struct drm_i915_gem_object *obj;
2820         int i;
2821
2822         for (i = 0; i < I915_NUM_RINGS; i++)
2823                 i915_gem_reset_ring_lists(dev_priv, &dev_priv->rings[i]);
2824
2825         /* Remove anything from the flushing lists. The GPU cache is likely
2826          * to be lost on reset along with the data, so simply move the
2827          * lost bo to the inactive list.
2828          */
2829         while (!list_empty(&dev_priv->mm.flushing_list)) {
2830                 obj = list_first_entry(&dev_priv->mm.flushing_list,
2831                                       struct drm_i915_gem_object,
2832                                       mm_list);
2833
2834                 obj->base.write_domain = 0;
2835                 list_del_init(&obj->gpu_write_list);
2836                 i915_gem_object_move_to_inactive(obj);
2837         }
2838
2839         /* Move everything out of the GPU domains to ensure we do any
2840          * necessary invalidation upon reuse.
2841          */
2842         list_for_each_entry(obj, &dev_priv->mm.inactive_list, mm_list) {
2843                 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
2844         }
2845
2846         /* The fence registers are invalidated so clear them out */
2847         i915_gem_reset_fences(dev);
2848 }
2849
2850 /**
2851  * This function clears the request list as sequence numbers are passed.
2852  */
2853 void
2854 i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
2855 {
2856         uint32_t seqno;
2857         int i;
2858
2859         if (list_empty(&ring->request_list))
2860                 return;
2861
2862         seqno = ring->get_seqno(ring);
2863         for (i = 0; i < DRM_ARRAY_SIZE(ring->sync_seqno); i++)
2864                 if (seqno >= ring->sync_seqno[i])
2865                         ring->sync_seqno[i] = 0;
2866
2867         while (!list_empty(&ring->request_list)) {
2868                 struct drm_i915_gem_request *request;
2869
2870                 request = list_first_entry(&ring->request_list,
2871                                            struct drm_i915_gem_request,
2872                                            list);
2873
2874                 if (!i915_seqno_passed(seqno, request->seqno))
2875                         break;
2876
2877                 ring->last_retired_head = request->tail;
2878
2879                 list_del(&request->list);
2880                 i915_gem_request_remove_from_client(request);
2881                 drm_free(request, DRM_I915_GEM);
2882         }
2883
2884         /* Move any buffers on the active list that are no longer referenced
2885          * by the ringbuffer to the flushing/inactive lists as appropriate.
2886          */
2887         while (!list_empty(&ring->active_list)) {
2888                 struct drm_i915_gem_object *obj;
2889
2890                 obj = list_first_entry(&ring->active_list,
2891                                       struct drm_i915_gem_object,
2892                                       ring_list);
2893
2894                 if (!i915_seqno_passed(seqno, obj->last_rendering_seqno))
2895                         break;
2896
2897                 if (obj->base.write_domain != 0)
2898                         i915_gem_object_move_to_flushing(obj);
2899                 else
2900                         i915_gem_object_move_to_inactive(obj);
2901         }
2902
2903         if (ring->trace_irq_seqno &&
2904             i915_seqno_passed(seqno, ring->trace_irq_seqno)) {
2905                 lockmgr(&ring->irq_lock, LK_EXCLUSIVE);
2906                 ring->irq_put(ring);
2907                 lockmgr(&ring->irq_lock, LK_RELEASE);
2908                 ring->trace_irq_seqno = 0;
2909         }
2910 }
2911
2912 void
2913 i915_gem_retire_requests(struct drm_device *dev)
2914 {
2915         drm_i915_private_t *dev_priv = dev->dev_private;
2916         struct drm_i915_gem_object *obj, *next;
2917         int i;
2918
2919         if (!list_empty(&dev_priv->mm.deferred_free_list)) {
2920                 list_for_each_entry_safe(obj, next,
2921                     &dev_priv->mm.deferred_free_list, mm_list)
2922                         i915_gem_free_object_tail(obj);
2923         }
2924
2925         for (i = 0; i < I915_NUM_RINGS; i++)
2926                 i915_gem_retire_requests_ring(&dev_priv->rings[i]);
2927 }
2928
2929 static int
2930 sandybridge_write_fence_reg(struct drm_i915_gem_object *obj,
2931     struct intel_ring_buffer *pipelined)
2932 {
2933         struct drm_device *dev = obj->base.dev;
2934         drm_i915_private_t *dev_priv = dev->dev_private;
2935         u32 size = obj->gtt_space->size;
2936         int regnum = obj->fence_reg;
2937         uint64_t val;
2938
2939         val = (uint64_t)((obj->gtt_offset + size - 4096) &
2940                          0xfffff000) << 32;
2941         val |= obj->gtt_offset & 0xfffff000;
2942         val |= (uint64_t)((obj->stride / 128) - 1) <<
2943                 SANDYBRIDGE_FENCE_PITCH_SHIFT;
2944
2945         if (obj->tiling_mode == I915_TILING_Y)
2946                 val |= 1 << I965_FENCE_TILING_Y_SHIFT;
2947         val |= I965_FENCE_REG_VALID;
2948
2949         if (pipelined) {
2950                 int ret = intel_ring_begin(pipelined, 6);
2951                 if (ret)
2952                         return ret;
2953
2954                 intel_ring_emit(pipelined, MI_NOOP);
2955                 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
2956                 intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8);
2957                 intel_ring_emit(pipelined, (u32)val);
2958                 intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8 + 4);
2959                 intel_ring_emit(pipelined, (u32)(val >> 32));
2960                 intel_ring_advance(pipelined);
2961         } else
2962                 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + regnum * 8, val);
2963
2964         return 0;
2965 }
2966
2967 static int
2968 i965_write_fence_reg(struct drm_i915_gem_object *obj,
2969     struct intel_ring_buffer *pipelined)
2970 {
2971         struct drm_device *dev = obj->base.dev;
2972         drm_i915_private_t *dev_priv = dev->dev_private;
2973         u32 size = obj->gtt_space->size;
2974         int regnum = obj->fence_reg;
2975         uint64_t val;
2976
2977         val = (uint64_t)((obj->gtt_offset + size - 4096) &
2978                     0xfffff000) << 32;
2979         val |= obj->gtt_offset & 0xfffff000;
2980         val |= ((obj->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT;
2981         if (obj->tiling_mode == I915_TILING_Y)
2982                 val |= 1 << I965_FENCE_TILING_Y_SHIFT;
2983         val |= I965_FENCE_REG_VALID;
2984
2985         if (pipelined) {
2986                 int ret = intel_ring_begin(pipelined, 6);
2987                 if (ret)
2988                         return ret;
2989
2990                 intel_ring_emit(pipelined, MI_NOOP);
2991                 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
2992                 intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8);
2993                 intel_ring_emit(pipelined, (u32)val);
2994                 intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8 + 4);
2995                 intel_ring_emit(pipelined, (u32)(val >> 32));
2996                 intel_ring_advance(pipelined);
2997         } else
2998                 I915_WRITE64(FENCE_REG_965_0 + regnum * 8, val);
2999
3000         return 0;
3001 }
3002
3003 static int
3004 i915_write_fence_reg(struct drm_i915_gem_object *obj,
3005     struct intel_ring_buffer *pipelined)
3006 {
3007         struct drm_device *dev = obj->base.dev;
3008         drm_i915_private_t *dev_priv = dev->dev_private;
3009         u32 size = obj->gtt_space->size;
3010         u32 fence_reg, val, pitch_val;
3011         int tile_width;
3012
3013         if ((obj->gtt_offset & ~I915_FENCE_START_MASK) ||
3014             (size & -size) != size || (obj->gtt_offset & (size - 1))) {
3015                 kprintf(
3016 "object 0x%08x [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
3017                  obj->gtt_offset, obj->map_and_fenceable, size);
3018                 return -EINVAL;
3019         }
3020
3021         if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
3022                 tile_width = 128;
3023         else
3024                 tile_width = 512;
3025
3026         /* Note: pitch better be a power of two tile widths */
3027         pitch_val = obj->stride / tile_width;
3028         pitch_val = ffs(pitch_val) - 1;
3029
3030         val = obj->gtt_offset;
3031         if (obj->tiling_mode == I915_TILING_Y)
3032                 val |= 1 << I830_FENCE_TILING_Y_SHIFT;
3033         val |= I915_FENCE_SIZE_BITS(size);
3034         val |= pitch_val << I830_FENCE_PITCH_SHIFT;
3035         val |= I830_FENCE_REG_VALID;
3036
3037         fence_reg = obj->fence_reg;
3038         if (fence_reg < 8)
3039                 fence_reg = FENCE_REG_830_0 + fence_reg * 4;
3040         else
3041                 fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
3042
3043         if (pipelined) {
3044                 int ret = intel_ring_begin(pipelined, 4);
3045                 if (ret)
3046                         return ret;
3047
3048                 intel_ring_emit(pipelined, MI_NOOP);
3049                 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
3050                 intel_ring_emit(pipelined, fence_reg);
3051                 intel_ring_emit(pipelined, val);
3052                 intel_ring_advance(pipelined);
3053         } else
3054                 I915_WRITE(fence_reg, val);
3055
3056         return 0;
3057 }
3058
3059 static int
3060 i830_write_fence_reg(struct drm_i915_gem_object *obj,
3061     struct intel_ring_buffer *pipelined)
3062 {
3063         struct drm_device *dev = obj->base.dev;
3064         drm_i915_private_t *dev_priv = dev->dev_private;
3065         u32 size = obj->gtt_space->size;
3066         int regnum = obj->fence_reg;
3067         uint32_t val;
3068         uint32_t pitch_val;
3069
3070         if ((obj->gtt_offset & ~I830_FENCE_START_MASK) ||
3071             (size & -size) != size || (obj->gtt_offset & (size - 1))) {
3072                 kprintf(
3073 "object 0x%08x not 512K or pot-size 0x%08x aligned\n",
3074                     obj->gtt_offset, size);
3075                 return -EINVAL;
3076         }
3077
3078         pitch_val = obj->stride / 128;
3079         pitch_val = ffs(pitch_val) - 1;
3080
3081         val = obj->gtt_offset;
3082         if (obj->tiling_mode == I915_TILING_Y)
3083                 val |= 1 << I830_FENCE_TILING_Y_SHIFT;
3084         val |= I830_FENCE_SIZE_BITS(size);
3085         val |= pitch_val << I830_FENCE_PITCH_SHIFT;
3086         val |= I830_FENCE_REG_VALID;
3087
3088         if (pipelined) {
3089                 int ret = intel_ring_begin(pipelined, 4);
3090                 if (ret)
3091                         return ret;
3092
3093                 intel_ring_emit(pipelined, MI_NOOP);
3094                 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
3095                 intel_ring_emit(pipelined, FENCE_REG_830_0 + regnum*4);
3096                 intel_ring_emit(pipelined, val);
3097                 intel_ring_advance(pipelined);
3098         } else
3099                 I915_WRITE(FENCE_REG_830_0 + regnum * 4, val);
3100
3101         return 0;
3102 }
3103
3104 static bool ring_passed_seqno(struct intel_ring_buffer *ring, u32 seqno)
3105 {
3106         return i915_seqno_passed(ring->get_seqno(ring), seqno);
3107 }
3108
3109 static int
3110 i915_gem_object_flush_fence(struct drm_i915_gem_object *obj,
3111     struct intel_ring_buffer *pipelined)
3112 {
3113         int ret;
3114
3115         if (obj->fenced_gpu_access) {
3116                 if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
3117                         ret = i915_gem_flush_ring(obj->last_fenced_ring, 0,
3118                             obj->base.write_domain);
3119                         if (ret)
3120                                 return ret;
3121                 }
3122
3123                 obj->fenced_gpu_access = false;
3124         }
3125
3126         if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) {
3127                 if (!ring_passed_seqno(obj->last_fenced_ring,
3128                                        obj->last_fenced_seqno)) {
3129                         ret = i915_wait_request(obj->last_fenced_ring,
3130                                                 obj->last_fenced_seqno,
3131                                                 true);
3132                         if (ret)
3133                                 return ret;
3134                 }
3135
3136                 obj->last_fenced_seqno = 0;
3137                 obj->last_fenced_ring = NULL;
3138         }
3139
3140         /* Ensure that all CPU reads are completed before installing a fence
3141          * and all writes before removing the fence.
3142          */
3143         if (obj->base.read_domains & I915_GEM_DOMAIN_GTT)
3144                 cpu_mfence();
3145
3146         return 0;
3147 }
3148
3149 int
3150 i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
3151 {
3152         int ret;
3153
3154         if (obj->tiling_mode)
3155                 i915_gem_release_mmap(obj);
3156
3157         ret = i915_gem_object_flush_fence(obj, NULL);
3158         if (ret)
3159                 return ret;
3160
3161         if (obj->fence_reg != I915_FENCE_REG_NONE) {
3162                 struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
3163
3164                 if (dev_priv->fence_regs[obj->fence_reg].pin_count != 0)
3165                         kprintf("%s: pin_count %d\n", __func__,
3166                             dev_priv->fence_regs[obj->fence_reg].pin_count);
3167                 i915_gem_clear_fence_reg(obj->base.dev,
3168                                          &dev_priv->fence_regs[obj->fence_reg]);
3169
3170                 obj->fence_reg = I915_FENCE_REG_NONE;
3171         }
3172
3173         return 0;
3174 }
3175
3176 static struct drm_i915_fence_reg *
3177 i915_find_fence_reg(struct drm_device *dev, struct intel_ring_buffer *pipelined)
3178 {
3179         struct drm_i915_private *dev_priv = dev->dev_private;
3180         struct drm_i915_fence_reg *reg, *first, *avail;
3181         int i;
3182
3183         /* First try to find a free reg */
3184         avail = NULL;
3185         for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
3186                 reg = &dev_priv->fence_regs[i];
3187                 if (!reg->obj)
3188                         return reg;
3189
3190                 if (!reg->pin_count)
3191                         avail = reg;
3192         }
3193
3194         if (avail == NULL)
3195                 return NULL;
3196
3197         /* None available, try to steal one or wait for a user to finish */
3198         avail = first = NULL;
3199         list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) {
3200                 if (reg->pin_count)
3201                         continue;
3202
3203                 if (first == NULL)
3204                         first = reg;
3205
3206                 if (!pipelined ||
3207                     !reg->obj->last_fenced_ring ||
3208                     reg->obj->last_fenced_ring == pipelined) {
3209                         avail = reg;
3210                         break;
3211                 }
3212         }
3213
3214         if (avail == NULL)
3215                 avail = first;
3216
3217         return avail;
3218 }
3219
3220 int
3221 i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
3222     struct intel_ring_buffer *pipelined)
3223 {
3224         struct drm_device *dev = obj->base.dev;
3225         struct drm_i915_private *dev_priv = dev->dev_private;
3226         struct drm_i915_fence_reg *reg;
3227         int ret;
3228
3229         pipelined = NULL;
3230         ret = 0;
3231
3232         if (obj->fence_reg != I915_FENCE_REG_NONE) {
3233                 reg = &dev_priv->fence_regs[obj->fence_reg];
3234                 list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
3235
3236                 if (obj->tiling_changed) {
3237                         ret = i915_gem_object_flush_fence(obj, pipelined);
3238                         if (ret)
3239                                 return ret;
3240
3241                         if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
3242                                 pipelined = NULL;
3243
3244                         if (pipelined) {
3245                                 reg->setup_seqno =
3246                                         i915_gem_next_request_seqno(pipelined);
3247                                 obj->last_fenced_seqno = reg->setup_seqno;
3248                                 obj->last_fenced_ring = pipelined;
3249                         }
3250
3251                         goto update;
3252                 }
3253
3254                 if (!pipelined) {
3255                         if (reg->setup_seqno) {
3256                                 if (!ring_passed_seqno(obj->last_fenced_ring,
3257                                     reg->setup_seqno)) {
3258                                         ret = i915_wait_request(
3259                                             obj->last_fenced_ring,
3260                                             reg->setup_seqno,
3261                                             true);
3262                                         if (ret)
3263                                                 return ret;
3264                                 }
3265
3266                                 reg->setup_seqno = 0;
3267                         }
3268                 } else if (obj->last_fenced_ring &&
3269                            obj->last_fenced_ring != pipelined) {
3270                         ret = i915_gem_object_flush_fence(obj, pipelined);
3271                         if (ret)
3272                                 return ret;
3273                 }
3274
3275                 if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
3276                         pipelined = NULL;
3277                 KASSERT(pipelined || reg->setup_seqno == 0, ("!pipelined"));
3278
3279                 if (obj->tiling_changed) {
3280                         if (pipelined) {
3281                                 reg->setup_seqno =
3282                                         i915_gem_next_request_seqno(pipelined);
3283                                 obj->last_fenced_seqno = reg->setup_seqno;
3284                                 obj->last_fenced_ring = pipelined;
3285                         }
3286                         goto update;
3287                 }
3288
3289                 return 0;
3290         }
3291
3292         reg = i915_find_fence_reg(dev, pipelined);
3293         if (reg == NULL)
3294                 return -EDEADLK;
3295
3296         ret = i915_gem_object_flush_fence(obj, pipelined);
3297         if (ret)
3298                 return ret;
3299
3300         if (reg->obj) {
3301                 struct drm_i915_gem_object *old = reg->obj;
3302
3303                 drm_gem_object_reference(&old->base);
3304
3305                 if (old->tiling_mode)
3306                         i915_gem_release_mmap(old);
3307
3308                 ret = i915_gem_object_flush_fence(old, pipelined);
3309                 if (ret) {
3310                         drm_gem_object_unreference(&old->base);
3311                         return ret;
3312                 }
3313
3314                 if (old->last_fenced_seqno == 0 && obj->last_fenced_seqno == 0)
3315                         pipelined = NULL;
3316
3317                 old->fence_reg = I915_FENCE_REG_NONE;
3318                 old->last_fenced_ring = pipelined;
3319                 old->last_fenced_seqno =
3320                         pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
3321
3322                 drm_gem_object_unreference(&old->base);
3323         } else if (obj->last_fenced_seqno == 0)
3324                 pipelined = NULL;
3325
3326         reg->obj = obj;
3327         list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
3328         obj->fence_reg = reg - dev_priv->fence_regs;
3329         obj->last_fenced_ring = pipelined;
3330
3331         reg->setup_seqno =
3332                 pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
3333         obj->last_fenced_seqno = reg->setup_seqno;
3334
3335 update:
3336         obj->tiling_changed = false;
3337         switch (INTEL_INFO(dev)->gen) {
3338         case 7:
3339         case 6:
3340                 ret = sandybridge_write_fence_reg(obj, pipelined);
3341                 break;
3342         case 5:
3343         case 4:
3344                 ret = i965_write_fence_reg(obj, pipelined);
3345                 break;
3346         case 3:
3347                 ret = i915_write_fence_reg(obj, pipelined);
3348                 break;
3349         case 2:
3350                 ret = i830_write_fence_reg(obj, pipelined);
3351                 break;
3352         }
3353
3354         return ret;
3355 }
3356
3357 static void
3358 i915_gem_clear_fence_reg(struct drm_device *dev, struct drm_i915_fence_reg *reg)
3359 {
3360         drm_i915_private_t *dev_priv = dev->dev_private;
3361         uint32_t fence_reg = reg - dev_priv->fence_regs;
3362
3363         switch (INTEL_INFO(dev)->gen) {
3364         case 7:
3365         case 6:
3366                 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + fence_reg*8, 0);
3367                 break;
3368         case 5:
3369         case 4:
3370                 I915_WRITE64(FENCE_REG_965_0 + fence_reg*8, 0);
3371                 break;
3372         case 3:
3373                 if (fence_reg >= 8)
3374                         fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
3375                 else
3376         case 2:
3377                         fence_reg = FENCE_REG_830_0 + fence_reg * 4;
3378
3379                 I915_WRITE(fence_reg, 0);
3380                 break;
3381         }
3382
3383         list_del_init(&reg->lru_list);
3384         reg->obj = NULL;
3385         reg->setup_seqno = 0;
3386         reg->pin_count = 0;
3387 }
3388
3389 int
3390 i915_gem_init_object(struct drm_gem_object *obj)
3391 {
3392
3393         kprintf("i915_gem_init_object called\n");
3394         return (0);
3395 }
3396
3397 static bool
3398 i915_gem_object_is_inactive(struct drm_i915_gem_object *obj)
3399 {
3400
3401         return (obj->gtt_space && !obj->active && obj->pin_count == 0);
3402 }
3403
3404 static void
3405 i915_gem_retire_task_handler(void *arg, int pending)
3406 {
3407         drm_i915_private_t *dev_priv;
3408         struct drm_device *dev;
3409         bool idle;
3410         int i;
3411
3412         dev_priv = arg;
3413         dev = dev_priv->dev;
3414
3415         /* Come back later if the device is busy... */
3416         if (lockmgr(&dev->dev_struct_lock, LK_EXCLUSIVE|LK_NOWAIT)) {
3417                 taskqueue_enqueue_timeout(dev_priv->tq,
3418                     &dev_priv->mm.retire_task, hz);
3419                 return;
3420         }
3421
3422         i915_gem_retire_requests(dev);
3423
3424         /* Send a periodic flush down the ring so we don't hold onto GEM
3425          * objects indefinitely.
3426          */
3427         idle = true;
3428         for (i = 0; i < I915_NUM_RINGS; i++) {
3429                 struct intel_ring_buffer *ring = &dev_priv->rings[i];
3430
3431                 if (!list_empty(&ring->gpu_write_list)) {
3432                         struct drm_i915_gem_request *request;
3433                         int ret;
3434
3435                         ret = i915_gem_flush_ring(ring,
3436                                                   0, I915_GEM_GPU_DOMAINS);
3437                         request = kmalloc(sizeof(*request), DRM_I915_GEM,
3438                             M_WAITOK | M_ZERO);
3439                         if (ret || request == NULL ||
3440                             i915_add_request(ring, NULL, request))
3441                                 drm_free(request, DRM_I915_GEM);
3442                 }
3443
3444                 idle &= list_empty(&ring->request_list);
3445         }
3446
3447         if (!dev_priv->mm.suspended && !idle)
3448                 taskqueue_enqueue_timeout(dev_priv->tq,
3449                     &dev_priv->mm.retire_task, hz);
3450
3451         DRM_UNLOCK(dev);
3452 }
3453
3454 void
3455 i915_gem_lastclose(struct drm_device *dev)
3456 {
3457         int ret;
3458
3459         if (drm_core_check_feature(dev, DRIVER_MODESET))
3460                 return;
3461
3462         ret = i915_gem_idle(dev);
3463         if (ret != 0)
3464                 DRM_ERROR("failed to idle hardware: %d\n", ret);
3465 }
3466
3467 static int
3468 i915_gem_init_phys_object(struct drm_device *dev, int id, int size, int align)
3469 {
3470         drm_i915_private_t *dev_priv;
3471         struct drm_i915_gem_phys_object *phys_obj;
3472         int ret;
3473
3474         dev_priv = dev->dev_private;
3475         if (dev_priv->mm.phys_objs[id - 1] != NULL || size == 0)
3476                 return (0);
3477
3478         phys_obj = kmalloc(sizeof(struct drm_i915_gem_phys_object), DRM_I915_GEM,
3479             M_WAITOK | M_ZERO);
3480
3481         phys_obj->id = id;
3482
3483         phys_obj->handle = drm_pci_alloc(dev, size, align, ~0);
3484         if (phys_obj->handle == NULL) {
3485                 ret = -ENOMEM;
3486                 goto free_obj;
3487         }
3488         pmap_change_attr((vm_offset_t)phys_obj->handle->vaddr,
3489             size / PAGE_SIZE, PAT_WRITE_COMBINING);
3490
3491         dev_priv->mm.phys_objs[id - 1] = phys_obj;
3492
3493         return (0);
3494
3495 free_obj:
3496         drm_free(phys_obj, DRM_I915_GEM);
3497         return (ret);
3498 }
3499
3500 static void
3501 i915_gem_free_phys_object(struct drm_device *dev, int id)
3502 {
3503         drm_i915_private_t *dev_priv;
3504         struct drm_i915_gem_phys_object *phys_obj;
3505
3506         dev_priv = dev->dev_private;
3507         if (dev_priv->mm.phys_objs[id - 1] == NULL)
3508                 return;
3509
3510         phys_obj = dev_priv->mm.phys_objs[id - 1];
3511         if (phys_obj->cur_obj != NULL)
3512                 i915_gem_detach_phys_object(dev, phys_obj->cur_obj);
3513
3514         drm_pci_free(dev, phys_obj->handle);
3515         drm_free(phys_obj, DRM_I915_GEM);
3516         dev_priv->mm.phys_objs[id - 1] = NULL;
3517 }
3518
3519 void
3520 i915_gem_free_all_phys_object(struct drm_device *dev)
3521 {
3522         int i;
3523
3524         for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++)
3525                 i915_gem_free_phys_object(dev, i);
3526 }
3527
3528 void
3529 i915_gem_detach_phys_object(struct drm_device *dev,
3530     struct drm_i915_gem_object *obj)
3531 {
3532         vm_page_t m;
3533         struct sf_buf *sf;
3534         char *vaddr, *dst;
3535         int i, page_count;
3536
3537         if (obj->phys_obj == NULL)
3538                 return;
3539         vaddr = obj->phys_obj->handle->vaddr;
3540
3541         page_count = obj->base.size / PAGE_SIZE;
3542         VM_OBJECT_LOCK(obj->base.vm_obj);
3543         for (i = 0; i < page_count; i++) {
3544                 m = i915_gem_wire_page(obj->base.vm_obj, i);
3545                 if (m == NULL)
3546                         continue; /* XXX */
3547
3548                 VM_OBJECT_UNLOCK(obj->base.vm_obj);
3549                 sf = sf_buf_alloc(m);
3550                 if (sf != NULL) {
3551                         dst = (char *)sf_buf_kva(sf);
3552                         memcpy(dst, vaddr + IDX_TO_OFF(i), PAGE_SIZE);
3553                         sf_buf_free(sf);
3554                 }
3555                 drm_clflush_pages(&m, 1);
3556
3557                 VM_OBJECT_LOCK(obj->base.vm_obj);
3558                 vm_page_reference(m);
3559                 vm_page_dirty(m);
3560                 vm_page_busy_wait(m, FALSE, "i915gem");
3561                 vm_page_unwire(m, 0);
3562                 vm_page_wakeup(m);
3563                 atomic_add_long(&i915_gem_wired_pages_cnt, -1);
3564         }
3565         VM_OBJECT_UNLOCK(obj->base.vm_obj);
3566         intel_gtt_chipset_flush();
3567
3568         obj->phys_obj->cur_obj = NULL;
3569         obj->phys_obj = NULL;
3570 }
3571
3572 int
3573 i915_gem_attach_phys_object(struct drm_device *dev,
3574     struct drm_i915_gem_object *obj, int id, int align)
3575 {
3576         drm_i915_private_t *dev_priv;
3577         vm_page_t m;
3578         struct sf_buf *sf;
3579         char *dst, *src;
3580         int i, page_count, ret;
3581
3582         if (id > I915_MAX_PHYS_OBJECT)
3583                 return (-EINVAL);
3584
3585         if (obj->phys_obj != NULL) {
3586                 if (obj->phys_obj->id == id)
3587                         return (0);
3588                 i915_gem_detach_phys_object(dev, obj);
3589         }
3590
3591         dev_priv = dev->dev_private;
3592         if (dev_priv->mm.phys_objs[id - 1] == NULL) {
3593                 ret = i915_gem_init_phys_object(dev, id, obj->base.size, align);
3594                 if (ret != 0) {
3595                         DRM_ERROR("failed to init phys object %d size: %zu\n",
3596                                   id, obj->base.size);
3597                         return (ret);
3598                 }
3599         }
3600
3601         /* bind to the object */
3602         obj->phys_obj = dev_priv->mm.phys_objs[id - 1];
3603         obj->phys_obj->cur_obj = obj;
3604
3605         page_count = obj->base.size / PAGE_SIZE;
3606
3607         VM_OBJECT_LOCK(obj->base.vm_obj);
3608         ret = 0;
3609         for (i = 0; i < page_count; i++) {
3610                 m = i915_gem_wire_page(obj->base.vm_obj, i);
3611                 if (m == NULL) {
3612                         ret = -EIO;
3613                         break;
3614                 }
3615                 VM_OBJECT_UNLOCK(obj->base.vm_obj);
3616                 sf = sf_buf_alloc(m);
3617                 src = (char *)sf_buf_kva(sf);
3618                 dst = (char *)obj->phys_obj->handle->vaddr + IDX_TO_OFF(i);
3619                 memcpy(dst, src, PAGE_SIZE);
3620                 sf_buf_free(sf);
3621
3622                 VM_OBJECT_LOCK(obj->base.vm_obj);
3623
3624                 vm_page_reference(m);
3625                 vm_page_busy_wait(m, FALSE, "i915gem");
3626                 vm_page_unwire(m, 0);
3627                 vm_page_wakeup(m);
3628                 atomic_add_long(&i915_gem_wired_pages_cnt, -1);
3629         }
3630         VM_OBJECT_UNLOCK(obj->base.vm_obj);
3631
3632         return (0);
3633 }
3634
3635 static int
3636 i915_gem_phys_pwrite(struct drm_device *dev, struct drm_i915_gem_object *obj,
3637     uint64_t data_ptr, uint64_t offset, uint64_t size,
3638     struct drm_file *file_priv)
3639 {
3640         char *user_data, *vaddr;
3641         int ret;
3642
3643         vaddr = (char *)obj->phys_obj->handle->vaddr + offset;
3644         user_data = (char *)(uintptr_t)data_ptr;
3645
3646         if (copyin_nofault(user_data, vaddr, size) != 0) {
3647                 /* The physical object once assigned is fixed for the lifetime
3648                  * of the obj, so we can safely drop the lock and continue
3649                  * to access vaddr.
3650                  */
3651                 DRM_UNLOCK(dev);
3652                 ret = -copyin(user_data, vaddr, size);
3653                 DRM_LOCK(dev);
3654                 if (ret != 0)
3655                         return (ret);
3656         }
3657
3658         intel_gtt_chipset_flush();
3659         return (0);
3660 }
3661
3662 static int
3663 i915_gpu_is_active(struct drm_device *dev)
3664 {
3665         drm_i915_private_t *dev_priv;
3666
3667         dev_priv = dev->dev_private;
3668         return (!list_empty(&dev_priv->mm.flushing_list) ||
3669             !list_empty(&dev_priv->mm.active_list));
3670 }
3671
3672 static void
3673 i915_gem_lowmem(void *arg)
3674 {
3675         struct drm_device *dev;
3676         struct drm_i915_private *dev_priv;
3677         struct drm_i915_gem_object *obj, *next;
3678         int cnt, cnt_fail, cnt_total;
3679
3680         dev = arg;
3681         dev_priv = dev->dev_private;
3682
3683         if (lockmgr(&dev->dev_struct_lock, LK_EXCLUSIVE|LK_NOWAIT))
3684                 return;
3685
3686 rescan:
3687         /* first scan for clean buffers */
3688         i915_gem_retire_requests(dev);
3689
3690         cnt_total = cnt_fail = cnt = 0;
3691
3692         list_for_each_entry_safe(obj, next, &dev_priv->mm.inactive_list,
3693             mm_list) {
3694                 if (i915_gem_object_is_purgeable(obj)) {
3695                         if (i915_gem_object_unbind(obj) != 0)
3696                                 cnt_total++;
3697                 } else
3698                         cnt_total++;
3699         }
3700
3701         /* second pass, evict/count anything still on the inactive list */
3702         list_for_each_entry_safe(obj, next, &dev_priv->mm.inactive_list,
3703             mm_list) {
3704                 if (i915_gem_object_unbind(obj) == 0)
3705                         cnt++;
3706                 else
3707                         cnt_fail++;
3708         }
3709
3710         if (cnt_fail > cnt_total / 100 && i915_gpu_is_active(dev)) {
3711                 /*
3712                  * We are desperate for pages, so as a last resort, wait
3713                  * for the GPU to finish and discard whatever we can.
3714                  * This has a dramatic impact to reduce the number of
3715                  * OOM-killer events whilst running the GPU aggressively.
3716                  */
3717                 if (i915_gpu_idle(dev, true) == 0)
3718                         goto rescan;
3719         }
3720         DRM_UNLOCK(dev);
3721 }
3722
3723 void
3724 i915_gem_unload(struct drm_device *dev)
3725 {
3726         struct drm_i915_private *dev_priv;
3727
3728         dev_priv = dev->dev_private;
3729         EVENTHANDLER_DEREGISTER(vm_lowmem, dev_priv->mm.i915_lowmem);
3730 }