blob: 38053434da8a0a564af53b62e36b922fd44a2775 [file] [log] [blame]
Eric Anholt673a3942008-07-30 12:06:12 -07001/*
Daniel Vetterbe6a0372015-03-18 10:46:04 +01002 * Copyright © 2008-2015 Intel Corporation
Eric Anholt673a3942008-07-30 12:06:12 -07003 *
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 */
27
David Howells760285e2012-10-02 18:01:07 +010028#include <drm/drmP.h>
David Herrmann0de23972013-07-24 21:07:52 +020029#include <drm/drm_vma_manager.h>
David Howells760285e2012-10-02 18:01:07 +010030#include <drm/i915_drm.h>
Eric Anholt673a3942008-07-30 12:06:12 -070031#include "i915_drv.h"
Chris Wilsonc13d87e2016-07-20 09:21:15 +010032#include "i915_gem_dmabuf.h"
Yu Zhangeb822892015-02-10 19:05:49 +080033#include "i915_vgpu.h"
Chris Wilson1c5d22f2009-08-25 11:15:50 +010034#include "i915_trace.h"
Jesse Barnes652c3932009-08-17 13:31:43 -070035#include "intel_drv.h"
Chris Wilson5d723d72016-08-04 16:32:35 +010036#include "intel_frontbuffer.h"
Peter Antoine0ccdacf2016-04-13 15:03:25 +010037#include "intel_mocs.h"
Chris Wilsonc13d87e2016-07-20 09:21:15 +010038#include <linux/reservation.h>
Hugh Dickins5949eac2011-06-27 16:18:18 -070039#include <linux/shmem_fs.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090040#include <linux/slab.h>
Eric Anholt673a3942008-07-30 12:06:12 -070041#include <linux/swap.h>
Jesse Barnes79e53942008-11-07 14:24:08 -080042#include <linux/pci.h>
Daniel Vetter1286ff72012-05-10 15:25:09 +020043#include <linux/dma-buf.h>
Eric Anholt673a3942008-07-30 12:06:12 -070044
Chris Wilson05394f32010-11-08 19:18:58 +000045static void i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj);
Daniel Vettere62b59e2015-01-21 14:53:48 +010046static void i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj);
Chris Wilson61050802012-04-17 15:31:31 +010047
Chris Wilsonc76ce032013-08-08 14:41:03 +010048static bool cpu_cache_is_coherent(struct drm_device *dev,
49 enum i915_cache_level level)
50{
51 return HAS_LLC(dev) || level != I915_CACHE_NONE;
52}
53
Chris Wilson2c225692013-08-09 12:26:45 +010054static bool cpu_write_needs_clflush(struct drm_i915_gem_object *obj)
55{
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +053056 if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
57 return false;
58
Chris Wilson2c225692013-08-09 12:26:45 +010059 if (!cpu_cache_is_coherent(obj->base.dev, obj->cache_level))
60 return true;
61
62 return obj->pin_display;
63}
64
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +053065static int
66insert_mappable_node(struct drm_i915_private *i915,
67 struct drm_mm_node *node, u32 size)
68{
69 memset(node, 0, sizeof(*node));
70 return drm_mm_insert_node_in_range_generic(&i915->ggtt.base.mm, node,
71 size, 0, 0, 0,
72 i915->ggtt.mappable_end,
73 DRM_MM_SEARCH_DEFAULT,
74 DRM_MM_CREATE_DEFAULT);
75}
76
77static void
78remove_mappable_node(struct drm_mm_node *node)
79{
80 drm_mm_remove_node(node);
81}
82
Chris Wilson73aa8082010-09-30 11:46:12 +010083/* some bookkeeping */
84static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv,
Chris Wilson3ef7f222016-10-18 13:02:48 +010085 u64 size)
Chris Wilson73aa8082010-09-30 11:46:12 +010086{
Daniel Vetterc20e8352013-07-24 22:40:23 +020087 spin_lock(&dev_priv->mm.object_stat_lock);
Chris Wilson73aa8082010-09-30 11:46:12 +010088 dev_priv->mm.object_count++;
89 dev_priv->mm.object_memory += size;
Daniel Vetterc20e8352013-07-24 22:40:23 +020090 spin_unlock(&dev_priv->mm.object_stat_lock);
Chris Wilson73aa8082010-09-30 11:46:12 +010091}
92
93static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv,
Chris Wilson3ef7f222016-10-18 13:02:48 +010094 u64 size)
Chris Wilson73aa8082010-09-30 11:46:12 +010095{
Daniel Vetterc20e8352013-07-24 22:40:23 +020096 spin_lock(&dev_priv->mm.object_stat_lock);
Chris Wilson73aa8082010-09-30 11:46:12 +010097 dev_priv->mm.object_count--;
98 dev_priv->mm.object_memory -= size;
Daniel Vetterc20e8352013-07-24 22:40:23 +020099 spin_unlock(&dev_priv->mm.object_stat_lock);
Chris Wilson73aa8082010-09-30 11:46:12 +0100100}
101
Chris Wilson21dd3732011-01-26 15:55:56 +0000102static int
Daniel Vetter33196de2012-11-14 17:14:05 +0100103i915_gem_wait_for_error(struct i915_gpu_error *error)
Chris Wilson30dbf0c2010-09-25 10:19:17 +0100104{
Chris Wilson30dbf0c2010-09-25 10:19:17 +0100105 int ret;
106
Chris Wilsond98c52c2016-04-13 17:35:05 +0100107 if (!i915_reset_in_progress(error))
Chris Wilson30dbf0c2010-09-25 10:19:17 +0100108 return 0;
109
Daniel Vetter0a6759c2012-07-04 22:18:41 +0200110 /*
111 * Only wait 10 seconds for the gpu reset to complete to avoid hanging
112 * userspace. If it takes that long something really bad is going on and
113 * we should simply try to bail out and fail as gracefully as possible.
114 */
Daniel Vetter1f83fee2012-11-15 17:17:22 +0100115 ret = wait_event_interruptible_timeout(error->reset_queue,
Chris Wilsond98c52c2016-04-13 17:35:05 +0100116 !i915_reset_in_progress(error),
Daniel Vetter1f83fee2012-11-15 17:17:22 +0100117 10*HZ);
Daniel Vetter0a6759c2012-07-04 22:18:41 +0200118 if (ret == 0) {
119 DRM_ERROR("Timed out waiting for the gpu reset to complete\n");
120 return -EIO;
121 } else if (ret < 0) {
Chris Wilson30dbf0c2010-09-25 10:19:17 +0100122 return ret;
Chris Wilsond98c52c2016-04-13 17:35:05 +0100123 } else {
124 return 0;
Daniel Vetter0a6759c2012-07-04 22:18:41 +0200125 }
Chris Wilson30dbf0c2010-09-25 10:19:17 +0100126}
127
Chris Wilson54cf91d2010-11-25 18:00:26 +0000128int i915_mutex_lock_interruptible(struct drm_device *dev)
Chris Wilson76c1dec2010-09-25 11:22:51 +0100129{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100130 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson76c1dec2010-09-25 11:22:51 +0100131 int ret;
132
Daniel Vetter33196de2012-11-14 17:14:05 +0100133 ret = i915_gem_wait_for_error(&dev_priv->gpu_error);
Chris Wilson76c1dec2010-09-25 11:22:51 +0100134 if (ret)
135 return ret;
136
137 ret = mutex_lock_interruptible(&dev->struct_mutex);
138 if (ret)
139 return ret;
140
Chris Wilson76c1dec2010-09-25 11:22:51 +0100141 return 0;
142}
Chris Wilson30dbf0c2010-09-25 10:19:17 +0100143
Eric Anholt673a3942008-07-30 12:06:12 -0700144int
Eric Anholt5a125c32008-10-22 21:40:13 -0700145i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +0000146 struct drm_file *file)
Eric Anholt5a125c32008-10-22 21:40:13 -0700147{
Joonas Lahtinen72e96d62016-03-30 16:57:10 +0300148 struct drm_i915_private *dev_priv = to_i915(dev);
Joonas Lahtinen62106b42016-03-18 10:42:57 +0200149 struct i915_ggtt *ggtt = &dev_priv->ggtt;
Joonas Lahtinen72e96d62016-03-30 16:57:10 +0300150 struct drm_i915_gem_get_aperture *args = data;
Tvrtko Ursulinca1543b2015-07-01 11:51:10 +0100151 struct i915_vma *vma;
Chris Wilson6299f992010-11-24 12:23:44 +0000152 size_t pinned;
Eric Anholt5a125c32008-10-22 21:40:13 -0700153
Chris Wilson6299f992010-11-24 12:23:44 +0000154 pinned = 0;
Chris Wilson73aa8082010-09-30 11:46:12 +0100155 mutex_lock(&dev->struct_mutex);
Chris Wilson1c7f4bc2016-02-26 11:03:19 +0000156 list_for_each_entry(vma, &ggtt->base.active_list, vm_link)
Chris Wilson20dfbde2016-08-04 16:32:30 +0100157 if (i915_vma_is_pinned(vma))
Tvrtko Ursulinca1543b2015-07-01 11:51:10 +0100158 pinned += vma->node.size;
Chris Wilson1c7f4bc2016-02-26 11:03:19 +0000159 list_for_each_entry(vma, &ggtt->base.inactive_list, vm_link)
Chris Wilson20dfbde2016-08-04 16:32:30 +0100160 if (i915_vma_is_pinned(vma))
Tvrtko Ursulinca1543b2015-07-01 11:51:10 +0100161 pinned += vma->node.size;
Chris Wilson73aa8082010-09-30 11:46:12 +0100162 mutex_unlock(&dev->struct_mutex);
Eric Anholt5a125c32008-10-22 21:40:13 -0700163
Joonas Lahtinen72e96d62016-03-30 16:57:10 +0300164 args->aper_size = ggtt->base.total;
Akshay Joshi0206e352011-08-16 15:34:10 -0400165 args->aper_available_size = args->aper_size - pinned;
Chris Wilson6299f992010-11-24 12:23:44 +0000166
Eric Anholt5a125c32008-10-22 21:40:13 -0700167 return 0;
168}
169
Chris Wilson6a2c4232014-11-04 04:51:40 -0800170static int
171i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
Chris Wilson00731152014-05-21 12:42:56 +0100172{
Al Viro93c76a32015-12-04 23:45:44 -0500173 struct address_space *mapping = obj->base.filp->f_mapping;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800174 char *vaddr = obj->phys_handle->vaddr;
175 struct sg_table *st;
176 struct scatterlist *sg;
177 int i;
Chris Wilson00731152014-05-21 12:42:56 +0100178
Chris Wilson6a2c4232014-11-04 04:51:40 -0800179 if (WARN_ON(i915_gem_object_needs_bit17_swizzle(obj)))
180 return -EINVAL;
Chris Wilson00731152014-05-21 12:42:56 +0100181
Chris Wilson6a2c4232014-11-04 04:51:40 -0800182 for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
183 struct page *page;
184 char *src;
185
186 page = shmem_read_mapping_page(mapping, i);
187 if (IS_ERR(page))
188 return PTR_ERR(page);
189
190 src = kmap_atomic(page);
191 memcpy(vaddr, src, PAGE_SIZE);
192 drm_clflush_virt_range(vaddr, PAGE_SIZE);
193 kunmap_atomic(src);
194
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +0300195 put_page(page);
Chris Wilson6a2c4232014-11-04 04:51:40 -0800196 vaddr += PAGE_SIZE;
197 }
198
Chris Wilsonc0336662016-05-06 15:40:21 +0100199 i915_gem_chipset_flush(to_i915(obj->base.dev));
Chris Wilson6a2c4232014-11-04 04:51:40 -0800200
201 st = kmalloc(sizeof(*st), GFP_KERNEL);
202 if (st == NULL)
203 return -ENOMEM;
204
205 if (sg_alloc_table(st, 1, GFP_KERNEL)) {
206 kfree(st);
207 return -ENOMEM;
208 }
209
210 sg = st->sgl;
211 sg->offset = 0;
212 sg->length = obj->base.size;
213
214 sg_dma_address(sg) = obj->phys_handle->busaddr;
215 sg_dma_len(sg) = obj->base.size;
216
217 obj->pages = st;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800218 return 0;
219}
220
221static void
222i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj)
223{
224 int ret;
225
226 BUG_ON(obj->madv == __I915_MADV_PURGED);
227
228 ret = i915_gem_object_set_to_cpu_domain(obj, true);
Chris Wilsonf4457ae2016-04-13 17:35:08 +0100229 if (WARN_ON(ret)) {
Chris Wilson6a2c4232014-11-04 04:51:40 -0800230 /* In the event of a disaster, abandon all caches and
231 * hope for the best.
232 */
Chris Wilson6a2c4232014-11-04 04:51:40 -0800233 obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
234 }
235
236 if (obj->madv == I915_MADV_DONTNEED)
237 obj->dirty = 0;
238
239 if (obj->dirty) {
Al Viro93c76a32015-12-04 23:45:44 -0500240 struct address_space *mapping = obj->base.filp->f_mapping;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800241 char *vaddr = obj->phys_handle->vaddr;
Chris Wilson00731152014-05-21 12:42:56 +0100242 int i;
243
244 for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
Chris Wilson6a2c4232014-11-04 04:51:40 -0800245 struct page *page;
246 char *dst;
Chris Wilson00731152014-05-21 12:42:56 +0100247
Chris Wilson6a2c4232014-11-04 04:51:40 -0800248 page = shmem_read_mapping_page(mapping, i);
249 if (IS_ERR(page))
250 continue;
251
252 dst = kmap_atomic(page);
253 drm_clflush_virt_range(vaddr, PAGE_SIZE);
254 memcpy(dst, vaddr, PAGE_SIZE);
255 kunmap_atomic(dst);
256
257 set_page_dirty(page);
258 if (obj->madv == I915_MADV_WILLNEED)
Chris Wilson00731152014-05-21 12:42:56 +0100259 mark_page_accessed(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +0300260 put_page(page);
Chris Wilson00731152014-05-21 12:42:56 +0100261 vaddr += PAGE_SIZE;
262 }
Chris Wilson6a2c4232014-11-04 04:51:40 -0800263 obj->dirty = 0;
Chris Wilson00731152014-05-21 12:42:56 +0100264 }
265
Chris Wilson6a2c4232014-11-04 04:51:40 -0800266 sg_free_table(obj->pages);
267 kfree(obj->pages);
Chris Wilson6a2c4232014-11-04 04:51:40 -0800268}
269
270static void
271i915_gem_object_release_phys(struct drm_i915_gem_object *obj)
272{
273 drm_pci_free(obj->base.dev, obj->phys_handle);
274}
275
276static const struct drm_i915_gem_object_ops i915_gem_phys_ops = {
277 .get_pages = i915_gem_object_get_pages_phys,
278 .put_pages = i915_gem_object_put_pages_phys,
279 .release = i915_gem_object_release_phys,
280};
281
Chris Wilson35a96112016-08-14 18:44:40 +0100282int i915_gem_object_unbind(struct drm_i915_gem_object *obj)
Chris Wilsonaa653a62016-08-04 07:52:27 +0100283{
284 struct i915_vma *vma;
285 LIST_HEAD(still_in_list);
Chris Wilson02bef8f2016-08-14 18:44:41 +0100286 int ret;
Chris Wilsonaa653a62016-08-04 07:52:27 +0100287
Chris Wilson02bef8f2016-08-14 18:44:41 +0100288 lockdep_assert_held(&obj->base.dev->struct_mutex);
289
290 /* Closed vma are removed from the obj->vma_list - but they may
291 * still have an active binding on the object. To remove those we
292 * must wait for all rendering to complete to the object (as unbinding
293 * must anyway), and retire the requests.
Chris Wilsonaa653a62016-08-04 07:52:27 +0100294 */
Chris Wilson02bef8f2016-08-14 18:44:41 +0100295 ret = i915_gem_object_wait_rendering(obj, false);
296 if (ret)
297 return ret;
298
299 i915_gem_retire_requests(to_i915(obj->base.dev));
300
Chris Wilsonaa653a62016-08-04 07:52:27 +0100301 while ((vma = list_first_entry_or_null(&obj->vma_list,
302 struct i915_vma,
303 obj_link))) {
304 list_move_tail(&vma->obj_link, &still_in_list);
305 ret = i915_vma_unbind(vma);
306 if (ret)
307 break;
308 }
309 list_splice(&still_in_list, &obj->vma_list);
310
311 return ret;
312}
313
Chris Wilson00e60f22016-08-04 16:32:40 +0100314/**
315 * Ensures that all rendering to the object has completed and the object is
316 * safe to unbind from the GTT or access from the CPU.
317 * @obj: i915 gem object
318 * @readonly: waiting for just read access or read-write access
319 */
320int
321i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
322 bool readonly)
323{
324 struct reservation_object *resv;
325 struct i915_gem_active *active;
326 unsigned long active_mask;
327 int idx;
328
329 lockdep_assert_held(&obj->base.dev->struct_mutex);
330
331 if (!readonly) {
332 active = obj->last_read;
333 active_mask = i915_gem_object_get_active(obj);
334 } else {
335 active_mask = 1;
336 active = &obj->last_write;
337 }
338
339 for_each_active(active_mask, idx) {
340 int ret;
341
342 ret = i915_gem_active_wait(&active[idx],
343 &obj->base.dev->struct_mutex);
344 if (ret)
345 return ret;
346 }
347
348 resv = i915_gem_object_get_dmabuf_resv(obj);
349 if (resv) {
350 long err;
351
352 err = reservation_object_wait_timeout_rcu(resv, !readonly, true,
353 MAX_SCHEDULE_TIMEOUT);
354 if (err < 0)
355 return err;
356 }
357
358 return 0;
359}
360
Chris Wilsonb8f90962016-08-05 10:14:07 +0100361/* A nonblocking variant of the above wait. Must be called prior to
362 * acquiring the mutex for the object, as the object state may change
363 * during this call. A reference must be held by the caller for the object.
Chris Wilson00e60f22016-08-04 16:32:40 +0100364 */
365static __must_check int
Chris Wilsonb8f90962016-08-05 10:14:07 +0100366__unsafe_wait_rendering(struct drm_i915_gem_object *obj,
367 struct intel_rps_client *rps,
368 bool readonly)
Chris Wilson00e60f22016-08-04 16:32:40 +0100369{
Chris Wilson00e60f22016-08-04 16:32:40 +0100370 struct i915_gem_active *active;
371 unsigned long active_mask;
Chris Wilsonb8f90962016-08-05 10:14:07 +0100372 int idx;
Chris Wilson00e60f22016-08-04 16:32:40 +0100373
Chris Wilsonb8f90962016-08-05 10:14:07 +0100374 active_mask = __I915_BO_ACTIVE(obj);
Chris Wilson00e60f22016-08-04 16:32:40 +0100375 if (!active_mask)
376 return 0;
377
378 if (!readonly) {
379 active = obj->last_read;
380 } else {
381 active_mask = 1;
382 active = &obj->last_write;
383 }
384
Chris Wilsonb8f90962016-08-05 10:14:07 +0100385 for_each_active(active_mask, idx) {
386 int ret;
Chris Wilson00e60f22016-08-04 16:32:40 +0100387
Chris Wilsonb8f90962016-08-05 10:14:07 +0100388 ret = i915_gem_active_wait_unlocked(&active[idx],
Chris Wilsonea746f32016-09-09 14:11:49 +0100389 I915_WAIT_INTERRUPTIBLE,
390 NULL, rps);
Chris Wilsonb8f90962016-08-05 10:14:07 +0100391 if (ret)
392 return ret;
Chris Wilson00e60f22016-08-04 16:32:40 +0100393 }
394
Chris Wilsonb8f90962016-08-05 10:14:07 +0100395 return 0;
Chris Wilson00e60f22016-08-04 16:32:40 +0100396}
397
398static struct intel_rps_client *to_rps_client(struct drm_file *file)
399{
400 struct drm_i915_file_private *fpriv = file->driver_priv;
401
402 return &fpriv->rps;
403}
404
Chris Wilson00731152014-05-21 12:42:56 +0100405int
406i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
407 int align)
408{
409 drm_dma_handle_t *phys;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800410 int ret;
Chris Wilson00731152014-05-21 12:42:56 +0100411
412 if (obj->phys_handle) {
413 if ((unsigned long)obj->phys_handle->vaddr & (align -1))
414 return -EBUSY;
415
416 return 0;
417 }
418
419 if (obj->madv != I915_MADV_WILLNEED)
420 return -EFAULT;
421
422 if (obj->base.filp == NULL)
423 return -EINVAL;
424
Chris Wilson4717ca92016-08-04 07:52:28 +0100425 ret = i915_gem_object_unbind(obj);
426 if (ret)
427 return ret;
428
429 ret = i915_gem_object_put_pages(obj);
Chris Wilson6a2c4232014-11-04 04:51:40 -0800430 if (ret)
431 return ret;
432
Chris Wilson00731152014-05-21 12:42:56 +0100433 /* create a new object */
434 phys = drm_pci_alloc(obj->base.dev, obj->base.size, align);
435 if (!phys)
436 return -ENOMEM;
437
Chris Wilson00731152014-05-21 12:42:56 +0100438 obj->phys_handle = phys;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800439 obj->ops = &i915_gem_phys_ops;
440
441 return i915_gem_object_get_pages(obj);
Chris Wilson00731152014-05-21 12:42:56 +0100442}
443
444static int
445i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
446 struct drm_i915_gem_pwrite *args,
447 struct drm_file *file_priv)
448{
449 struct drm_device *dev = obj->base.dev;
450 void *vaddr = obj->phys_handle->vaddr + args->offset;
Gustavo Padovan3ed605b2016-04-26 12:32:27 -0300451 char __user *user_data = u64_to_user_ptr(args->data_ptr);
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200452 int ret = 0;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800453
454 /* We manually control the domain here and pretend that it
455 * remains coherent i.e. in the GTT domain, like shmem_pwrite.
456 */
457 ret = i915_gem_object_wait_rendering(obj, false);
458 if (ret)
459 return ret;
Chris Wilson00731152014-05-21 12:42:56 +0100460
Rodrigo Vivi77a0d1c2015-06-18 11:43:24 -0700461 intel_fb_obj_invalidate(obj, ORIGIN_CPU);
Chris Wilson00731152014-05-21 12:42:56 +0100462 if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
463 unsigned long unwritten;
464
465 /* The physical object once assigned is fixed for the lifetime
466 * of the obj, so we can safely drop the lock and continue
467 * to access vaddr.
468 */
469 mutex_unlock(&dev->struct_mutex);
470 unwritten = copy_from_user(vaddr, user_data, args->size);
471 mutex_lock(&dev->struct_mutex);
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200472 if (unwritten) {
473 ret = -EFAULT;
474 goto out;
475 }
Chris Wilson00731152014-05-21 12:42:56 +0100476 }
477
Chris Wilson6a2c4232014-11-04 04:51:40 -0800478 drm_clflush_virt_range(vaddr, args->size);
Chris Wilsonc0336662016-05-06 15:40:21 +0100479 i915_gem_chipset_flush(to_i915(dev));
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200480
481out:
Rodrigo Vivide152b62015-07-07 16:28:51 -0700482 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200483 return ret;
Chris Wilson00731152014-05-21 12:42:56 +0100484}
485
Chris Wilson42dcedd2012-11-15 11:32:30 +0000486void *i915_gem_object_alloc(struct drm_device *dev)
487{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100488 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilsonefab6d82015-04-07 16:20:57 +0100489 return kmem_cache_zalloc(dev_priv->objects, GFP_KERNEL);
Chris Wilson42dcedd2012-11-15 11:32:30 +0000490}
491
492void i915_gem_object_free(struct drm_i915_gem_object *obj)
493{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100494 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilsonefab6d82015-04-07 16:20:57 +0100495 kmem_cache_free(dev_priv->objects, obj);
Chris Wilson42dcedd2012-11-15 11:32:30 +0000496}
497
Dave Airlieff72145b2011-02-07 12:16:14 +1000498static int
499i915_gem_create(struct drm_file *file,
500 struct drm_device *dev,
501 uint64_t size,
502 uint32_t *handle_p)
Eric Anholt673a3942008-07-30 12:06:12 -0700503{
Chris Wilson05394f32010-11-08 19:18:58 +0000504 struct drm_i915_gem_object *obj;
Pekka Paalanena1a2d1d2009-08-23 12:40:55 +0300505 int ret;
506 u32 handle;
Eric Anholt673a3942008-07-30 12:06:12 -0700507
Dave Airlieff72145b2011-02-07 12:16:14 +1000508 size = roundup(size, PAGE_SIZE);
Chris Wilson8ffc0242011-09-14 14:14:28 +0200509 if (size == 0)
510 return -EINVAL;
Eric Anholt673a3942008-07-30 12:06:12 -0700511
512 /* Allocate the new object */
Dave Gordond37cd8a2016-04-22 19:14:32 +0100513 obj = i915_gem_object_create(dev, size);
Chris Wilsonfe3db792016-04-25 13:32:13 +0100514 if (IS_ERR(obj))
515 return PTR_ERR(obj);
Eric Anholt673a3942008-07-30 12:06:12 -0700516
Chris Wilson05394f32010-11-08 19:18:58 +0000517 ret = drm_gem_handle_create(file, &obj->base, &handle);
Chris Wilson202f2fe2010-10-14 13:20:40 +0100518 /* drop reference from allocate - handle holds it now */
Chris Wilson34911fd2016-07-20 13:31:54 +0100519 i915_gem_object_put_unlocked(obj);
Daniel Vetterd861e332013-07-24 23:25:03 +0200520 if (ret)
521 return ret;
Chris Wilson202f2fe2010-10-14 13:20:40 +0100522
Dave Airlieff72145b2011-02-07 12:16:14 +1000523 *handle_p = handle;
Eric Anholt673a3942008-07-30 12:06:12 -0700524 return 0;
525}
526
Dave Airlieff72145b2011-02-07 12:16:14 +1000527int
528i915_gem_dumb_create(struct drm_file *file,
529 struct drm_device *dev,
530 struct drm_mode_create_dumb *args)
531{
532 /* have to work out size/pitch and return them */
Paulo Zanonide45eaf2013-10-18 18:48:24 -0300533 args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64);
Dave Airlieff72145b2011-02-07 12:16:14 +1000534 args->size = args->pitch * args->height;
535 return i915_gem_create(file, dev,
Dave Airlieda6b51d2014-12-24 13:11:17 +1000536 args->size, &args->handle);
Dave Airlieff72145b2011-02-07 12:16:14 +1000537}
538
Dave Airlieff72145b2011-02-07 12:16:14 +1000539/**
540 * Creates a new mm object and returns a handle to it.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +0100541 * @dev: drm device pointer
542 * @data: ioctl data blob
543 * @file: drm file pointer
Dave Airlieff72145b2011-02-07 12:16:14 +1000544 */
545int
546i915_gem_create_ioctl(struct drm_device *dev, void *data,
547 struct drm_file *file)
548{
549 struct drm_i915_gem_create *args = data;
Daniel Vetter63ed2cb2012-04-23 16:50:50 +0200550
Dave Airlieff72145b2011-02-07 12:16:14 +1000551 return i915_gem_create(file, dev,
Dave Airlieda6b51d2014-12-24 13:11:17 +1000552 args->size, &args->handle);
Dave Airlieff72145b2011-02-07 12:16:14 +1000553}
554
Daniel Vetter8c599672011-12-14 13:57:31 +0100555static inline int
Daniel Vetter8461d222011-12-14 13:57:32 +0100556__copy_to_user_swizzled(char __user *cpu_vaddr,
557 const char *gpu_vaddr, int gpu_offset,
558 int length)
559{
560 int ret, cpu_offset = 0;
561
562 while (length > 0) {
563 int cacheline_end = ALIGN(gpu_offset + 1, 64);
564 int this_length = min(cacheline_end - gpu_offset, length);
565 int swizzled_gpu_offset = gpu_offset ^ 64;
566
567 ret = __copy_to_user(cpu_vaddr + cpu_offset,
568 gpu_vaddr + swizzled_gpu_offset,
569 this_length);
570 if (ret)
571 return ret + length;
572
573 cpu_offset += this_length;
574 gpu_offset += this_length;
575 length -= this_length;
576 }
577
578 return 0;
579}
580
581static inline int
Ben Widawsky4f0c7cf2012-04-16 14:07:47 -0700582__copy_from_user_swizzled(char *gpu_vaddr, int gpu_offset,
583 const char __user *cpu_vaddr,
Daniel Vetter8c599672011-12-14 13:57:31 +0100584 int length)
585{
586 int ret, cpu_offset = 0;
587
588 while (length > 0) {
589 int cacheline_end = ALIGN(gpu_offset + 1, 64);
590 int this_length = min(cacheline_end - gpu_offset, length);
591 int swizzled_gpu_offset = gpu_offset ^ 64;
592
593 ret = __copy_from_user(gpu_vaddr + swizzled_gpu_offset,
594 cpu_vaddr + cpu_offset,
595 this_length);
596 if (ret)
597 return ret + length;
598
599 cpu_offset += this_length;
600 gpu_offset += this_length;
601 length -= this_length;
602 }
603
604 return 0;
605}
606
Brad Volkin4c914c02014-02-18 10:15:45 -0800607/*
608 * Pins the specified object's pages and synchronizes the object with
609 * GPU accesses. Sets needs_clflush to non-zero if the caller should
610 * flush the object from the CPU cache.
611 */
612int i915_gem_obj_prepare_shmem_read(struct drm_i915_gem_object *obj,
Chris Wilson43394c72016-08-18 17:16:47 +0100613 unsigned int *needs_clflush)
Brad Volkin4c914c02014-02-18 10:15:45 -0800614{
615 int ret;
616
617 *needs_clflush = 0;
618
Chris Wilson43394c72016-08-18 17:16:47 +0100619 if (!i915_gem_object_has_struct_page(obj))
620 return -ENODEV;
Brad Volkin4c914c02014-02-18 10:15:45 -0800621
Chris Wilsonc13d87e2016-07-20 09:21:15 +0100622 ret = i915_gem_object_wait_rendering(obj, true);
623 if (ret)
624 return ret;
625
Chris Wilson97649512016-08-18 17:16:50 +0100626 ret = i915_gem_object_get_pages(obj);
627 if (ret)
628 return ret;
629
630 i915_gem_object_pin_pages(obj);
631
Chris Wilsona314d5c2016-08-18 17:16:48 +0100632 i915_gem_object_flush_gtt_write_domain(obj);
633
Chris Wilson43394c72016-08-18 17:16:47 +0100634 /* If we're not in the cpu read domain, set ourself into the gtt
635 * read domain and manually flush cachelines (if required). This
636 * optimizes for the case when the gpu will dirty the data
637 * anyway again before the next pread happens.
638 */
639 if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU))
Brad Volkin4c914c02014-02-18 10:15:45 -0800640 *needs_clflush = !cpu_cache_is_coherent(obj->base.dev,
641 obj->cache_level);
Brad Volkin4c914c02014-02-18 10:15:45 -0800642
Chris Wilson43394c72016-08-18 17:16:47 +0100643 if (*needs_clflush && !static_cpu_has(X86_FEATURE_CLFLUSH)) {
644 ret = i915_gem_object_set_to_cpu_domain(obj, false);
Chris Wilson97649512016-08-18 17:16:50 +0100645 if (ret)
646 goto err_unpin;
647
Chris Wilson43394c72016-08-18 17:16:47 +0100648 *needs_clflush = 0;
649 }
650
Chris Wilson97649512016-08-18 17:16:50 +0100651 /* return with the pages pinned */
Chris Wilson43394c72016-08-18 17:16:47 +0100652 return 0;
Chris Wilson97649512016-08-18 17:16:50 +0100653
654err_unpin:
655 i915_gem_object_unpin_pages(obj);
656 return ret;
Chris Wilson43394c72016-08-18 17:16:47 +0100657}
658
659int i915_gem_obj_prepare_shmem_write(struct drm_i915_gem_object *obj,
660 unsigned int *needs_clflush)
661{
662 int ret;
663
664 *needs_clflush = 0;
665 if (!i915_gem_object_has_struct_page(obj))
666 return -ENODEV;
667
668 ret = i915_gem_object_wait_rendering(obj, false);
669 if (ret)
670 return ret;
671
Chris Wilson97649512016-08-18 17:16:50 +0100672 ret = i915_gem_object_get_pages(obj);
673 if (ret)
674 return ret;
675
676 i915_gem_object_pin_pages(obj);
677
Chris Wilsona314d5c2016-08-18 17:16:48 +0100678 i915_gem_object_flush_gtt_write_domain(obj);
679
Chris Wilson43394c72016-08-18 17:16:47 +0100680 /* If we're not in the cpu write domain, set ourself into the
681 * gtt write domain and manually flush cachelines (as required).
682 * This optimizes for the case when the gpu will use the data
683 * right away and we therefore have to clflush anyway.
684 */
685 if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
686 *needs_clflush |= cpu_write_needs_clflush(obj) << 1;
687
688 /* Same trick applies to invalidate partially written cachelines read
689 * before writing.
690 */
691 if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU))
692 *needs_clflush |= !cpu_cache_is_coherent(obj->base.dev,
693 obj->cache_level);
694
Chris Wilson43394c72016-08-18 17:16:47 +0100695 if (*needs_clflush && !static_cpu_has(X86_FEATURE_CLFLUSH)) {
696 ret = i915_gem_object_set_to_cpu_domain(obj, true);
Chris Wilson97649512016-08-18 17:16:50 +0100697 if (ret)
698 goto err_unpin;
699
Chris Wilson43394c72016-08-18 17:16:47 +0100700 *needs_clflush = 0;
701 }
702
703 if ((*needs_clflush & CLFLUSH_AFTER) == 0)
704 obj->cache_dirty = true;
705
706 intel_fb_obj_invalidate(obj, ORIGIN_CPU);
707 obj->dirty = 1;
Chris Wilson97649512016-08-18 17:16:50 +0100708 /* return with the pages pinned */
Chris Wilson43394c72016-08-18 17:16:47 +0100709 return 0;
Chris Wilson97649512016-08-18 17:16:50 +0100710
711err_unpin:
712 i915_gem_object_unpin_pages(obj);
713 return ret;
Brad Volkin4c914c02014-02-18 10:15:45 -0800714}
715
Daniel Vetterd174bd62012-03-25 19:47:40 +0200716/* Per-page copy function for the shmem pread fastpath.
717 * Flushes invalid cachelines before reading the target if
718 * needs_clflush is set. */
Eric Anholteb014592009-03-10 11:44:52 -0700719static int
Daniel Vetterd174bd62012-03-25 19:47:40 +0200720shmem_pread_fast(struct page *page, int shmem_page_offset, int page_length,
721 char __user *user_data,
722 bool page_do_bit17_swizzling, bool needs_clflush)
723{
724 char *vaddr;
725 int ret;
726
Daniel Vettere7e58eb2012-03-25 19:47:43 +0200727 if (unlikely(page_do_bit17_swizzling))
Daniel Vetterd174bd62012-03-25 19:47:40 +0200728 return -EINVAL;
729
730 vaddr = kmap_atomic(page);
731 if (needs_clflush)
732 drm_clflush_virt_range(vaddr + shmem_page_offset,
733 page_length);
734 ret = __copy_to_user_inatomic(user_data,
735 vaddr + shmem_page_offset,
736 page_length);
737 kunmap_atomic(vaddr);
738
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100739 return ret ? -EFAULT : 0;
Daniel Vetterd174bd62012-03-25 19:47:40 +0200740}
741
Daniel Vetter23c18c72012-03-25 19:47:42 +0200742static void
743shmem_clflush_swizzled_range(char *addr, unsigned long length,
744 bool swizzled)
745{
Daniel Vettere7e58eb2012-03-25 19:47:43 +0200746 if (unlikely(swizzled)) {
Daniel Vetter23c18c72012-03-25 19:47:42 +0200747 unsigned long start = (unsigned long) addr;
748 unsigned long end = (unsigned long) addr + length;
749
750 /* For swizzling simply ensure that we always flush both
751 * channels. Lame, but simple and it works. Swizzled
752 * pwrite/pread is far from a hotpath - current userspace
753 * doesn't use it at all. */
754 start = round_down(start, 128);
755 end = round_up(end, 128);
756
757 drm_clflush_virt_range((void *)start, end - start);
758 } else {
759 drm_clflush_virt_range(addr, length);
760 }
761
762}
763
Daniel Vetterd174bd62012-03-25 19:47:40 +0200764/* Only difference to the fast-path function is that this can handle bit17
765 * and uses non-atomic copy and kmap functions. */
766static int
767shmem_pread_slow(struct page *page, int shmem_page_offset, int page_length,
768 char __user *user_data,
769 bool page_do_bit17_swizzling, bool needs_clflush)
770{
771 char *vaddr;
772 int ret;
773
774 vaddr = kmap(page);
775 if (needs_clflush)
Daniel Vetter23c18c72012-03-25 19:47:42 +0200776 shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
777 page_length,
778 page_do_bit17_swizzling);
Daniel Vetterd174bd62012-03-25 19:47:40 +0200779
780 if (page_do_bit17_swizzling)
781 ret = __copy_to_user_swizzled(user_data,
782 vaddr, shmem_page_offset,
783 page_length);
784 else
785 ret = __copy_to_user(user_data,
786 vaddr + shmem_page_offset,
787 page_length);
788 kunmap(page);
789
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100790 return ret ? - EFAULT : 0;
Daniel Vetterd174bd62012-03-25 19:47:40 +0200791}
792
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530793static inline unsigned long
794slow_user_access(struct io_mapping *mapping,
795 uint64_t page_base, int page_offset,
796 char __user *user_data,
797 unsigned long length, bool pwrite)
798{
799 void __iomem *ioaddr;
800 void *vaddr;
801 uint64_t unwritten;
802
803 ioaddr = io_mapping_map_wc(mapping, page_base, PAGE_SIZE);
804 /* We can use the cpu mem copy function because this is X86. */
805 vaddr = (void __force *)ioaddr + page_offset;
806 if (pwrite)
807 unwritten = __copy_from_user(vaddr, user_data, length);
808 else
809 unwritten = __copy_to_user(user_data, vaddr, length);
810
811 io_mapping_unmap(ioaddr);
812 return unwritten;
813}
814
815static int
816i915_gem_gtt_pread(struct drm_device *dev,
817 struct drm_i915_gem_object *obj, uint64_t size,
818 uint64_t data_offset, uint64_t data_ptr)
819{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100820 struct drm_i915_private *dev_priv = to_i915(dev);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530821 struct i915_ggtt *ggtt = &dev_priv->ggtt;
Chris Wilson058d88c2016-08-15 10:49:06 +0100822 struct i915_vma *vma;
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530823 struct drm_mm_node node;
824 char __user *user_data;
825 uint64_t remain;
826 uint64_t offset;
827 int ret;
828
Chris Wilson9c870d02016-10-24 13:42:15 +0100829 intel_runtime_pm_get(to_i915(dev));
Chris Wilson058d88c2016-08-15 10:49:06 +0100830 vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, PIN_MAPPABLE);
Chris Wilson18034582016-08-18 17:16:45 +0100831 if (!IS_ERR(vma)) {
832 node.start = i915_ggtt_offset(vma);
833 node.allocated = false;
Chris Wilson49ef5292016-08-18 17:17:00 +0100834 ret = i915_vma_put_fence(vma);
Chris Wilson18034582016-08-18 17:16:45 +0100835 if (ret) {
836 i915_vma_unpin(vma);
837 vma = ERR_PTR(ret);
838 }
839 }
Chris Wilson058d88c2016-08-15 10:49:06 +0100840 if (IS_ERR(vma)) {
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530841 ret = insert_mappable_node(dev_priv, &node, PAGE_SIZE);
842 if (ret)
843 goto out;
844
845 ret = i915_gem_object_get_pages(obj);
846 if (ret) {
847 remove_mappable_node(&node);
848 goto out;
849 }
850
851 i915_gem_object_pin_pages(obj);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530852 }
853
854 ret = i915_gem_object_set_to_gtt_domain(obj, false);
855 if (ret)
856 goto out_unpin;
857
858 user_data = u64_to_user_ptr(data_ptr);
859 remain = size;
860 offset = data_offset;
861
862 mutex_unlock(&dev->struct_mutex);
863 if (likely(!i915.prefault_disable)) {
864 ret = fault_in_multipages_writeable(user_data, remain);
865 if (ret) {
866 mutex_lock(&dev->struct_mutex);
867 goto out_unpin;
868 }
869 }
870
871 while (remain > 0) {
872 /* Operation in this page
873 *
874 * page_base = page offset within aperture
875 * page_offset = offset within page
876 * page_length = bytes to copy for this page
877 */
878 u32 page_base = node.start;
879 unsigned page_offset = offset_in_page(offset);
880 unsigned page_length = PAGE_SIZE - page_offset;
881 page_length = remain < page_length ? remain : page_length;
882 if (node.allocated) {
883 wmb();
884 ggtt->base.insert_page(&ggtt->base,
885 i915_gem_object_get_dma_address(obj, offset >> PAGE_SHIFT),
886 node.start,
887 I915_CACHE_NONE, 0);
888 wmb();
889 } else {
890 page_base += offset & PAGE_MASK;
891 }
892 /* This is a slow read/write as it tries to read from
893 * and write to user memory which may result into page
894 * faults, and so we cannot perform this under struct_mutex.
895 */
Chris Wilsonf7bbe782016-08-19 16:54:27 +0100896 if (slow_user_access(&ggtt->mappable, page_base,
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530897 page_offset, user_data,
898 page_length, false)) {
899 ret = -EFAULT;
900 break;
901 }
902
903 remain -= page_length;
904 user_data += page_length;
905 offset += page_length;
906 }
907
908 mutex_lock(&dev->struct_mutex);
909 if (ret == 0 && (obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) {
910 /* The user has modified the object whilst we tried
911 * reading from it, and we now have no idea what domain
912 * the pages should be in. As we have just been touching
913 * them directly, flush everything back to the GTT
914 * domain.
915 */
916 ret = i915_gem_object_set_to_gtt_domain(obj, false);
917 }
918
919out_unpin:
920 if (node.allocated) {
921 wmb();
922 ggtt->base.clear_range(&ggtt->base,
Michał Winiarski4fb84d92016-10-13 14:02:40 +0200923 node.start, node.size);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530924 i915_gem_object_unpin_pages(obj);
925 remove_mappable_node(&node);
926 } else {
Chris Wilson058d88c2016-08-15 10:49:06 +0100927 i915_vma_unpin(vma);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530928 }
929out:
Chris Wilson9c870d02016-10-24 13:42:15 +0100930 intel_runtime_pm_put(to_i915(dev));
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530931 return ret;
932}
933
Eric Anholteb014592009-03-10 11:44:52 -0700934static int
Daniel Vetterdbf7bff2012-03-25 19:47:29 +0200935i915_gem_shmem_pread(struct drm_device *dev,
936 struct drm_i915_gem_object *obj,
937 struct drm_i915_gem_pread *args,
938 struct drm_file *file)
Eric Anholteb014592009-03-10 11:44:52 -0700939{
Daniel Vetter8461d222011-12-14 13:57:32 +0100940 char __user *user_data;
Eric Anholteb014592009-03-10 11:44:52 -0700941 ssize_t remain;
Daniel Vetter8461d222011-12-14 13:57:32 +0100942 loff_t offset;
Ben Widawskyeb2c0c82012-02-15 14:42:43 +0100943 int shmem_page_offset, page_length, ret = 0;
Daniel Vetter8461d222011-12-14 13:57:32 +0100944 int obj_do_bit17_swizzling, page_do_bit17_swizzling;
Daniel Vetter96d79b52012-03-25 19:47:36 +0200945 int prefaulted = 0;
Daniel Vetter84897312012-03-25 19:47:31 +0200946 int needs_clflush = 0;
Imre Deak67d5a502013-02-18 19:28:02 +0200947 struct sg_page_iter sg_iter;
Eric Anholteb014592009-03-10 11:44:52 -0700948
Brad Volkin4c914c02014-02-18 10:15:45 -0800949 ret = i915_gem_obj_prepare_shmem_read(obj, &needs_clflush);
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100950 if (ret)
951 return ret;
952
Chris Wilson43394c72016-08-18 17:16:47 +0100953 obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
954 user_data = u64_to_user_ptr(args->data_ptr);
Eric Anholteb014592009-03-10 11:44:52 -0700955 offset = args->offset;
Chris Wilson43394c72016-08-18 17:16:47 +0100956 remain = args->size;
Daniel Vetter8461d222011-12-14 13:57:32 +0100957
Imre Deak67d5a502013-02-18 19:28:02 +0200958 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
959 offset >> PAGE_SHIFT) {
Imre Deak2db76d72013-03-26 15:14:18 +0200960 struct page *page = sg_page_iter_page(&sg_iter);
Chris Wilson9da3da62012-06-01 15:20:22 +0100961
962 if (remain <= 0)
963 break;
964
Eric Anholteb014592009-03-10 11:44:52 -0700965 /* Operation in this page
966 *
Eric Anholteb014592009-03-10 11:44:52 -0700967 * shmem_page_offset = offset within page in shmem file
Eric Anholteb014592009-03-10 11:44:52 -0700968 * page_length = bytes to copy for this page
969 */
Chris Wilsonc8cbbb82011-05-12 22:17:11 +0100970 shmem_page_offset = offset_in_page(offset);
Eric Anholteb014592009-03-10 11:44:52 -0700971 page_length = remain;
972 if ((shmem_page_offset + page_length) > PAGE_SIZE)
973 page_length = PAGE_SIZE - shmem_page_offset;
Eric Anholteb014592009-03-10 11:44:52 -0700974
Daniel Vetter8461d222011-12-14 13:57:32 +0100975 page_do_bit17_swizzling = obj_do_bit17_swizzling &&
976 (page_to_phys(page) & (1 << 17)) != 0;
977
Daniel Vetterd174bd62012-03-25 19:47:40 +0200978 ret = shmem_pread_fast(page, shmem_page_offset, page_length,
979 user_data, page_do_bit17_swizzling,
980 needs_clflush);
981 if (ret == 0)
982 goto next_page;
Eric Anholteb014592009-03-10 11:44:52 -0700983
Daniel Vetterdbf7bff2012-03-25 19:47:29 +0200984 mutex_unlock(&dev->struct_mutex);
985
Jani Nikulad330a952014-01-21 11:24:25 +0200986 if (likely(!i915.prefault_disable) && !prefaulted) {
Daniel Vetterf56f8212012-03-25 19:47:41 +0200987 ret = fault_in_multipages_writeable(user_data, remain);
Daniel Vetter96d79b52012-03-25 19:47:36 +0200988 /* Userspace is tricking us, but we've already clobbered
989 * its pages with the prefault and promised to write the
990 * data up to the first fault. Hence ignore any errors
991 * and just continue. */
992 (void)ret;
993 prefaulted = 1;
994 }
995
Daniel Vetterd174bd62012-03-25 19:47:40 +0200996 ret = shmem_pread_slow(page, shmem_page_offset, page_length,
997 user_data, page_do_bit17_swizzling,
998 needs_clflush);
Eric Anholteb014592009-03-10 11:44:52 -0700999
Daniel Vetterdbf7bff2012-03-25 19:47:29 +02001000 mutex_lock(&dev->struct_mutex);
Chris Wilsonf60d7f02012-09-04 21:02:56 +01001001
Chris Wilsonf60d7f02012-09-04 21:02:56 +01001002 if (ret)
Daniel Vetter8461d222011-12-14 13:57:32 +01001003 goto out;
Daniel Vetter8461d222011-12-14 13:57:32 +01001004
Chris Wilson17793c92014-03-07 08:30:36 +00001005next_page:
Eric Anholteb014592009-03-10 11:44:52 -07001006 remain -= page_length;
Daniel Vetter8461d222011-12-14 13:57:32 +01001007 user_data += page_length;
Eric Anholteb014592009-03-10 11:44:52 -07001008 offset += page_length;
1009 }
1010
Chris Wilson4f27b752010-10-14 15:26:45 +01001011out:
Chris Wilson43394c72016-08-18 17:16:47 +01001012 i915_gem_obj_finish_shmem_access(obj);
Chris Wilsonf60d7f02012-09-04 21:02:56 +01001013
Eric Anholteb014592009-03-10 11:44:52 -07001014 return ret;
1015}
1016
Eric Anholt673a3942008-07-30 12:06:12 -07001017/**
1018 * Reads data from the object referenced by handle.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001019 * @dev: drm device pointer
1020 * @data: ioctl data blob
1021 * @file: drm file pointer
Eric Anholt673a3942008-07-30 12:06:12 -07001022 *
1023 * On error, the contents of *data are undefined.
1024 */
1025int
1026i915_gem_pread_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001027 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001028{
1029 struct drm_i915_gem_pread *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001030 struct drm_i915_gem_object *obj;
Chris Wilson35b62a82010-09-26 20:23:38 +01001031 int ret = 0;
Eric Anholt673a3942008-07-30 12:06:12 -07001032
Chris Wilson51311d02010-11-17 09:10:42 +00001033 if (args->size == 0)
1034 return 0;
1035
1036 if (!access_ok(VERIFY_WRITE,
Gustavo Padovan3ed605b2016-04-26 12:32:27 -03001037 u64_to_user_ptr(args->data_ptr),
Chris Wilson51311d02010-11-17 09:10:42 +00001038 args->size))
1039 return -EFAULT;
1040
Chris Wilson03ac0642016-07-20 13:31:51 +01001041 obj = i915_gem_object_lookup(file, args->handle);
Chris Wilson258a5ed2016-08-05 10:14:16 +01001042 if (!obj)
1043 return -ENOENT;
Eric Anholt673a3942008-07-30 12:06:12 -07001044
Chris Wilson7dcd2492010-09-26 20:21:44 +01001045 /* Bounds check source. */
Chris Wilson05394f32010-11-08 19:18:58 +00001046 if (args->offset > obj->base.size ||
1047 args->size > obj->base.size - args->offset) {
Chris Wilsonce9d4192010-09-26 20:50:05 +01001048 ret = -EINVAL;
Chris Wilson258a5ed2016-08-05 10:14:16 +01001049 goto err;
Chris Wilsonce9d4192010-09-26 20:50:05 +01001050 }
1051
Chris Wilsondb53a302011-02-03 11:57:46 +00001052 trace_i915_gem_object_pread(obj, args->offset, args->size);
1053
Chris Wilson258a5ed2016-08-05 10:14:16 +01001054 ret = __unsafe_wait_rendering(obj, to_rps_client(file), true);
1055 if (ret)
1056 goto err;
1057
1058 ret = i915_mutex_lock_interruptible(dev);
1059 if (ret)
1060 goto err;
1061
Daniel Vetterdbf7bff2012-03-25 19:47:29 +02001062 ret = i915_gem_shmem_pread(dev, obj, args, file);
Eric Anholt673a3942008-07-30 12:06:12 -07001063
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301064 /* pread for non shmem backed objects */
Chris Wilson9c870d02016-10-24 13:42:15 +01001065 if (ret == -EFAULT || ret == -ENODEV)
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301066 ret = i915_gem_gtt_pread(dev, obj, args->size,
1067 args->offset, args->data_ptr);
1068
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001069 i915_gem_object_put(obj);
Chris Wilson4f27b752010-10-14 15:26:45 +01001070 mutex_unlock(&dev->struct_mutex);
Chris Wilson258a5ed2016-08-05 10:14:16 +01001071
1072 return ret;
1073
1074err:
1075 i915_gem_object_put_unlocked(obj);
Eric Anholteb014592009-03-10 11:44:52 -07001076 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001077}
1078
Keith Packard0839ccb2008-10-30 19:38:48 -07001079/* This is the fast write path which cannot handle
1080 * page faults in the source data
Linus Torvalds9b7530cc2008-10-20 14:16:43 -07001081 */
Linus Torvalds9b7530cc2008-10-20 14:16:43 -07001082
Keith Packard0839ccb2008-10-30 19:38:48 -07001083static inline int
1084fast_user_write(struct io_mapping *mapping,
1085 loff_t page_base, int page_offset,
1086 char __user *user_data,
1087 int length)
1088{
Ben Widawsky4f0c7cf2012-04-16 14:07:47 -07001089 void __iomem *vaddr_atomic;
1090 void *vaddr;
Keith Packard0839ccb2008-10-30 19:38:48 -07001091 unsigned long unwritten;
1092
Peter Zijlstra3e4d3af2010-10-26 14:21:51 -07001093 vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
Ben Widawsky4f0c7cf2012-04-16 14:07:47 -07001094 /* We can use the cpu mem copy function because this is X86. */
1095 vaddr = (void __force*)vaddr_atomic + page_offset;
1096 unwritten = __copy_from_user_inatomic_nocache(vaddr,
Keith Packard0839ccb2008-10-30 19:38:48 -07001097 user_data, length);
Peter Zijlstra3e4d3af2010-10-26 14:21:51 -07001098 io_mapping_unmap_atomic(vaddr_atomic);
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001099 return unwritten;
Keith Packard0839ccb2008-10-30 19:38:48 -07001100}
1101
Eric Anholt3de09aa2009-03-09 09:42:23 -07001102/**
1103 * This is the fast pwrite path, where we copy the data directly from the
1104 * user into the GTT, uncached.
Daniel Vetter62f90b32016-07-15 21:48:07 +02001105 * @i915: i915 device private data
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001106 * @obj: i915 gem object
1107 * @args: pwrite arguments structure
1108 * @file: drm file pointer
Eric Anholt3de09aa2009-03-09 09:42:23 -07001109 */
Eric Anholt673a3942008-07-30 12:06:12 -07001110static int
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301111i915_gem_gtt_pwrite_fast(struct drm_i915_private *i915,
Chris Wilson05394f32010-11-08 19:18:58 +00001112 struct drm_i915_gem_object *obj,
Eric Anholt3de09aa2009-03-09 09:42:23 -07001113 struct drm_i915_gem_pwrite *args,
Chris Wilson05394f32010-11-08 19:18:58 +00001114 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001115{
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301116 struct i915_ggtt *ggtt = &i915->ggtt;
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301117 struct drm_device *dev = obj->base.dev;
Chris Wilson058d88c2016-08-15 10:49:06 +01001118 struct i915_vma *vma;
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301119 struct drm_mm_node node;
1120 uint64_t remain, offset;
Eric Anholt673a3942008-07-30 12:06:12 -07001121 char __user *user_data;
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301122 int ret;
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301123 bool hit_slow_path = false;
1124
Chris Wilson3e510a82016-08-05 10:14:23 +01001125 if (i915_gem_object_is_tiled(obj))
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301126 return -EFAULT;
Daniel Vetter935aaa62012-03-25 19:47:35 +02001127
Chris Wilson9c870d02016-10-24 13:42:15 +01001128 intel_runtime_pm_get(i915);
Chris Wilson058d88c2016-08-15 10:49:06 +01001129 vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
Chris Wilsonde895082016-08-04 16:32:34 +01001130 PIN_MAPPABLE | PIN_NONBLOCK);
Chris Wilson18034582016-08-18 17:16:45 +01001131 if (!IS_ERR(vma)) {
1132 node.start = i915_ggtt_offset(vma);
1133 node.allocated = false;
Chris Wilson49ef5292016-08-18 17:17:00 +01001134 ret = i915_vma_put_fence(vma);
Chris Wilson18034582016-08-18 17:16:45 +01001135 if (ret) {
1136 i915_vma_unpin(vma);
1137 vma = ERR_PTR(ret);
1138 }
1139 }
Chris Wilson058d88c2016-08-15 10:49:06 +01001140 if (IS_ERR(vma)) {
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301141 ret = insert_mappable_node(i915, &node, PAGE_SIZE);
1142 if (ret)
1143 goto out;
1144
1145 ret = i915_gem_object_get_pages(obj);
1146 if (ret) {
1147 remove_mappable_node(&node);
1148 goto out;
1149 }
1150
1151 i915_gem_object_pin_pages(obj);
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301152 }
Daniel Vetter935aaa62012-03-25 19:47:35 +02001153
1154 ret = i915_gem_object_set_to_gtt_domain(obj, true);
1155 if (ret)
1156 goto out_unpin;
1157
Chris Wilsonb19482d2016-08-18 17:16:43 +01001158 intel_fb_obj_invalidate(obj, ORIGIN_CPU);
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301159 obj->dirty = true;
Paulo Zanoni063e4e62015-02-13 17:23:45 -02001160
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301161 user_data = u64_to_user_ptr(args->data_ptr);
1162 offset = args->offset;
1163 remain = args->size;
1164 while (remain) {
Eric Anholt673a3942008-07-30 12:06:12 -07001165 /* Operation in this page
1166 *
Keith Packard0839ccb2008-10-30 19:38:48 -07001167 * page_base = page offset within aperture
1168 * page_offset = offset within page
1169 * page_length = bytes to copy for this page
Eric Anholt673a3942008-07-30 12:06:12 -07001170 */
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301171 u32 page_base = node.start;
1172 unsigned page_offset = offset_in_page(offset);
1173 unsigned page_length = PAGE_SIZE - page_offset;
1174 page_length = remain < page_length ? remain : page_length;
1175 if (node.allocated) {
1176 wmb(); /* flush the write before we modify the GGTT */
1177 ggtt->base.insert_page(&ggtt->base,
1178 i915_gem_object_get_dma_address(obj, offset >> PAGE_SHIFT),
1179 node.start, I915_CACHE_NONE, 0);
1180 wmb(); /* flush modifications to the GGTT (insert_page) */
1181 } else {
1182 page_base += offset & PAGE_MASK;
1183 }
Keith Packard0839ccb2008-10-30 19:38:48 -07001184 /* If we get a fault while copying data, then (presumably) our
Eric Anholt3de09aa2009-03-09 09:42:23 -07001185 * source page isn't available. Return the error and we'll
1186 * retry in the slow path.
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301187 * If the object is non-shmem backed, we retry again with the
1188 * path that handles page fault.
Keith Packard0839ccb2008-10-30 19:38:48 -07001189 */
Chris Wilsonf7bbe782016-08-19 16:54:27 +01001190 if (fast_user_write(&ggtt->mappable, page_base,
Daniel Vetter935aaa62012-03-25 19:47:35 +02001191 page_offset, user_data, page_length)) {
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301192 hit_slow_path = true;
1193 mutex_unlock(&dev->struct_mutex);
Chris Wilsonf7bbe782016-08-19 16:54:27 +01001194 if (slow_user_access(&ggtt->mappable,
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301195 page_base,
1196 page_offset, user_data,
1197 page_length, true)) {
1198 ret = -EFAULT;
1199 mutex_lock(&dev->struct_mutex);
1200 goto out_flush;
1201 }
1202
1203 mutex_lock(&dev->struct_mutex);
Daniel Vetter935aaa62012-03-25 19:47:35 +02001204 }
Eric Anholt673a3942008-07-30 12:06:12 -07001205
Keith Packard0839ccb2008-10-30 19:38:48 -07001206 remain -= page_length;
1207 user_data += page_length;
1208 offset += page_length;
Eric Anholt673a3942008-07-30 12:06:12 -07001209 }
Eric Anholt673a3942008-07-30 12:06:12 -07001210
Paulo Zanoni063e4e62015-02-13 17:23:45 -02001211out_flush:
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301212 if (hit_slow_path) {
1213 if (ret == 0 &&
1214 (obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) {
1215 /* The user has modified the object whilst we tried
1216 * reading from it, and we now have no idea what domain
1217 * the pages should be in. As we have just been touching
1218 * them directly, flush everything back to the GTT
1219 * domain.
1220 */
1221 ret = i915_gem_object_set_to_gtt_domain(obj, false);
1222 }
1223 }
1224
Chris Wilsonb19482d2016-08-18 17:16:43 +01001225 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Daniel Vetter935aaa62012-03-25 19:47:35 +02001226out_unpin:
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301227 if (node.allocated) {
1228 wmb();
1229 ggtt->base.clear_range(&ggtt->base,
Michał Winiarski4fb84d92016-10-13 14:02:40 +02001230 node.start, node.size);
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301231 i915_gem_object_unpin_pages(obj);
1232 remove_mappable_node(&node);
1233 } else {
Chris Wilson058d88c2016-08-15 10:49:06 +01001234 i915_vma_unpin(vma);
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301235 }
Daniel Vetter935aaa62012-03-25 19:47:35 +02001236out:
Chris Wilson9c870d02016-10-24 13:42:15 +01001237 intel_runtime_pm_put(i915);
Eric Anholt3de09aa2009-03-09 09:42:23 -07001238 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001239}
1240
Daniel Vetterd174bd62012-03-25 19:47:40 +02001241/* Per-page copy function for the shmem pwrite fastpath.
1242 * Flushes invalid cachelines before writing to the target if
1243 * needs_clflush_before is set and flushes out any written cachelines after
1244 * writing if needs_clflush is set. */
Eric Anholt673a3942008-07-30 12:06:12 -07001245static int
Daniel Vetterd174bd62012-03-25 19:47:40 +02001246shmem_pwrite_fast(struct page *page, int shmem_page_offset, int page_length,
1247 char __user *user_data,
1248 bool page_do_bit17_swizzling,
1249 bool needs_clflush_before,
1250 bool needs_clflush_after)
Eric Anholt673a3942008-07-30 12:06:12 -07001251{
Daniel Vetterd174bd62012-03-25 19:47:40 +02001252 char *vaddr;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001253 int ret;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001254
Daniel Vettere7e58eb2012-03-25 19:47:43 +02001255 if (unlikely(page_do_bit17_swizzling))
Daniel Vetterd174bd62012-03-25 19:47:40 +02001256 return -EINVAL;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001257
Daniel Vetterd174bd62012-03-25 19:47:40 +02001258 vaddr = kmap_atomic(page);
1259 if (needs_clflush_before)
1260 drm_clflush_virt_range(vaddr + shmem_page_offset,
1261 page_length);
Chris Wilsonc2831a92014-03-07 08:30:37 +00001262 ret = __copy_from_user_inatomic(vaddr + shmem_page_offset,
1263 user_data, page_length);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001264 if (needs_clflush_after)
1265 drm_clflush_virt_range(vaddr + shmem_page_offset,
1266 page_length);
1267 kunmap_atomic(vaddr);
Eric Anholt3de09aa2009-03-09 09:42:23 -07001268
Chris Wilson755d2212012-09-04 21:02:55 +01001269 return ret ? -EFAULT : 0;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001270}
1271
Daniel Vetterd174bd62012-03-25 19:47:40 +02001272/* Only difference to the fast-path function is that this can handle bit17
1273 * and uses non-atomic copy and kmap functions. */
Eric Anholt3043c602008-10-02 12:24:47 -07001274static int
Daniel Vetterd174bd62012-03-25 19:47:40 +02001275shmem_pwrite_slow(struct page *page, int shmem_page_offset, int page_length,
1276 char __user *user_data,
1277 bool page_do_bit17_swizzling,
1278 bool needs_clflush_before,
1279 bool needs_clflush_after)
Eric Anholt673a3942008-07-30 12:06:12 -07001280{
Daniel Vetterd174bd62012-03-25 19:47:40 +02001281 char *vaddr;
1282 int ret;
Eric Anholt40123c12009-03-09 13:42:30 -07001283
Daniel Vetterd174bd62012-03-25 19:47:40 +02001284 vaddr = kmap(page);
Daniel Vettere7e58eb2012-03-25 19:47:43 +02001285 if (unlikely(needs_clflush_before || page_do_bit17_swizzling))
Daniel Vetter23c18c72012-03-25 19:47:42 +02001286 shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
1287 page_length,
1288 page_do_bit17_swizzling);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001289 if (page_do_bit17_swizzling)
1290 ret = __copy_from_user_swizzled(vaddr, shmem_page_offset,
Chris Wilsone5281cc2010-10-28 13:45:36 +01001291 user_data,
1292 page_length);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001293 else
1294 ret = __copy_from_user(vaddr + shmem_page_offset,
1295 user_data,
1296 page_length);
1297 if (needs_clflush_after)
Daniel Vetter23c18c72012-03-25 19:47:42 +02001298 shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
1299 page_length,
1300 page_do_bit17_swizzling);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001301 kunmap(page);
Chris Wilsone5281cc2010-10-28 13:45:36 +01001302
Chris Wilson755d2212012-09-04 21:02:55 +01001303 return ret ? -EFAULT : 0;
Eric Anholt40123c12009-03-09 13:42:30 -07001304}
1305
Eric Anholt40123c12009-03-09 13:42:30 -07001306static int
Daniel Vettere244a442012-03-25 19:47:28 +02001307i915_gem_shmem_pwrite(struct drm_device *dev,
1308 struct drm_i915_gem_object *obj,
1309 struct drm_i915_gem_pwrite *args,
1310 struct drm_file *file)
Eric Anholt40123c12009-03-09 13:42:30 -07001311{
Eric Anholt40123c12009-03-09 13:42:30 -07001312 ssize_t remain;
Daniel Vetter8c599672011-12-14 13:57:31 +01001313 loff_t offset;
1314 char __user *user_data;
Ben Widawskyeb2c0c82012-02-15 14:42:43 +01001315 int shmem_page_offset, page_length, ret = 0;
Daniel Vetter8c599672011-12-14 13:57:31 +01001316 int obj_do_bit17_swizzling, page_do_bit17_swizzling;
Daniel Vettere244a442012-03-25 19:47:28 +02001317 int hit_slowpath = 0;
Chris Wilson43394c72016-08-18 17:16:47 +01001318 unsigned int needs_clflush;
Imre Deak67d5a502013-02-18 19:28:02 +02001319 struct sg_page_iter sg_iter;
Eric Anholt40123c12009-03-09 13:42:30 -07001320
Chris Wilson43394c72016-08-18 17:16:47 +01001321 ret = i915_gem_obj_prepare_shmem_write(obj, &needs_clflush);
1322 if (ret)
1323 return ret;
Eric Anholt40123c12009-03-09 13:42:30 -07001324
Daniel Vetter8c599672011-12-14 13:57:31 +01001325 obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
Chris Wilson43394c72016-08-18 17:16:47 +01001326 user_data = u64_to_user_ptr(args->data_ptr);
Eric Anholt40123c12009-03-09 13:42:30 -07001327 offset = args->offset;
Chris Wilson43394c72016-08-18 17:16:47 +01001328 remain = args->size;
Eric Anholt40123c12009-03-09 13:42:30 -07001329
Imre Deak67d5a502013-02-18 19:28:02 +02001330 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
1331 offset >> PAGE_SHIFT) {
Imre Deak2db76d72013-03-26 15:14:18 +02001332 struct page *page = sg_page_iter_page(&sg_iter);
Daniel Vetter58642882012-03-25 19:47:37 +02001333 int partial_cacheline_write;
Chris Wilsone5281cc2010-10-28 13:45:36 +01001334
Chris Wilson9da3da62012-06-01 15:20:22 +01001335 if (remain <= 0)
1336 break;
1337
Eric Anholt40123c12009-03-09 13:42:30 -07001338 /* Operation in this page
1339 *
Eric Anholt40123c12009-03-09 13:42:30 -07001340 * shmem_page_offset = offset within page in shmem file
Eric Anholt40123c12009-03-09 13:42:30 -07001341 * page_length = bytes to copy for this page
1342 */
Chris Wilsonc8cbbb82011-05-12 22:17:11 +01001343 shmem_page_offset = offset_in_page(offset);
Eric Anholt40123c12009-03-09 13:42:30 -07001344
1345 page_length = remain;
1346 if ((shmem_page_offset + page_length) > PAGE_SIZE)
1347 page_length = PAGE_SIZE - shmem_page_offset;
Eric Anholt40123c12009-03-09 13:42:30 -07001348
Daniel Vetter58642882012-03-25 19:47:37 +02001349 /* If we don't overwrite a cacheline completely we need to be
1350 * careful to have up-to-date data by first clflushing. Don't
1351 * overcomplicate things and flush the entire patch. */
Chris Wilson43394c72016-08-18 17:16:47 +01001352 partial_cacheline_write = needs_clflush & CLFLUSH_BEFORE &&
Daniel Vetter58642882012-03-25 19:47:37 +02001353 ((shmem_page_offset | page_length)
1354 & (boot_cpu_data.x86_clflush_size - 1));
1355
Daniel Vetter8c599672011-12-14 13:57:31 +01001356 page_do_bit17_swizzling = obj_do_bit17_swizzling &&
1357 (page_to_phys(page) & (1 << 17)) != 0;
1358
Daniel Vetterd174bd62012-03-25 19:47:40 +02001359 ret = shmem_pwrite_fast(page, shmem_page_offset, page_length,
1360 user_data, page_do_bit17_swizzling,
1361 partial_cacheline_write,
Chris Wilson43394c72016-08-18 17:16:47 +01001362 needs_clflush & CLFLUSH_AFTER);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001363 if (ret == 0)
1364 goto next_page;
Eric Anholt40123c12009-03-09 13:42:30 -07001365
Daniel Vettere244a442012-03-25 19:47:28 +02001366 hit_slowpath = 1;
Daniel Vettere244a442012-03-25 19:47:28 +02001367 mutex_unlock(&dev->struct_mutex);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001368 ret = shmem_pwrite_slow(page, shmem_page_offset, page_length,
1369 user_data, page_do_bit17_swizzling,
1370 partial_cacheline_write,
Chris Wilson43394c72016-08-18 17:16:47 +01001371 needs_clflush & CLFLUSH_AFTER);
Eric Anholt40123c12009-03-09 13:42:30 -07001372
Daniel Vettere244a442012-03-25 19:47:28 +02001373 mutex_lock(&dev->struct_mutex);
Chris Wilson755d2212012-09-04 21:02:55 +01001374
Chris Wilson755d2212012-09-04 21:02:55 +01001375 if (ret)
Daniel Vetter8c599672011-12-14 13:57:31 +01001376 goto out;
Daniel Vetter8c599672011-12-14 13:57:31 +01001377
Chris Wilson17793c92014-03-07 08:30:36 +00001378next_page:
Eric Anholt40123c12009-03-09 13:42:30 -07001379 remain -= page_length;
Daniel Vetter8c599672011-12-14 13:57:31 +01001380 user_data += page_length;
Eric Anholt40123c12009-03-09 13:42:30 -07001381 offset += page_length;
1382 }
1383
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001384out:
Chris Wilson43394c72016-08-18 17:16:47 +01001385 i915_gem_obj_finish_shmem_access(obj);
Chris Wilson755d2212012-09-04 21:02:55 +01001386
Daniel Vettere244a442012-03-25 19:47:28 +02001387 if (hit_slowpath) {
Daniel Vetter8dcf0152012-11-15 16:53:58 +01001388 /*
1389 * Fixup: Flush cpu caches in case we didn't flush the dirty
1390 * cachelines in-line while writing and the object moved
1391 * out of the cpu write domain while we've dropped the lock.
1392 */
Chris Wilson43394c72016-08-18 17:16:47 +01001393 if (!(needs_clflush & CLFLUSH_AFTER) &&
Daniel Vetter8dcf0152012-11-15 16:53:58 +01001394 obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
Chris Wilson000433b2013-08-08 14:41:09 +01001395 if (i915_gem_clflush_object(obj, obj->pin_display))
Chris Wilson43394c72016-08-18 17:16:47 +01001396 needs_clflush |= CLFLUSH_AFTER;
Daniel Vettere244a442012-03-25 19:47:28 +02001397 }
Daniel Vetter8c599672011-12-14 13:57:31 +01001398 }
Eric Anholt40123c12009-03-09 13:42:30 -07001399
Chris Wilson43394c72016-08-18 17:16:47 +01001400 if (needs_clflush & CLFLUSH_AFTER)
Chris Wilsonc0336662016-05-06 15:40:21 +01001401 i915_gem_chipset_flush(to_i915(dev));
Daniel Vetter58642882012-03-25 19:47:37 +02001402
Rodrigo Vivide152b62015-07-07 16:28:51 -07001403 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Eric Anholt40123c12009-03-09 13:42:30 -07001404 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001405}
1406
1407/**
1408 * Writes data to the object referenced by handle.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001409 * @dev: drm device
1410 * @data: ioctl data blob
1411 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001412 *
1413 * On error, the contents of the buffer that were to be modified are undefined.
1414 */
1415int
1416i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001417 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001418{
Chris Wilsonfac5e232016-07-04 11:34:36 +01001419 struct drm_i915_private *dev_priv = to_i915(dev);
Eric Anholt673a3942008-07-30 12:06:12 -07001420 struct drm_i915_gem_pwrite *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001421 struct drm_i915_gem_object *obj;
Chris Wilson51311d02010-11-17 09:10:42 +00001422 int ret;
1423
1424 if (args->size == 0)
1425 return 0;
1426
1427 if (!access_ok(VERIFY_READ,
Gustavo Padovan3ed605b2016-04-26 12:32:27 -03001428 u64_to_user_ptr(args->data_ptr),
Chris Wilson51311d02010-11-17 09:10:42 +00001429 args->size))
1430 return -EFAULT;
1431
Jani Nikulad330a952014-01-21 11:24:25 +02001432 if (likely(!i915.prefault_disable)) {
Gustavo Padovan3ed605b2016-04-26 12:32:27 -03001433 ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
Xiong Zhang0b74b502013-07-19 13:51:24 +08001434 args->size);
1435 if (ret)
1436 return -EFAULT;
1437 }
Eric Anholt673a3942008-07-30 12:06:12 -07001438
Chris Wilson03ac0642016-07-20 13:31:51 +01001439 obj = i915_gem_object_lookup(file, args->handle);
Chris Wilson258a5ed2016-08-05 10:14:16 +01001440 if (!obj)
1441 return -ENOENT;
Eric Anholt673a3942008-07-30 12:06:12 -07001442
Chris Wilson7dcd2492010-09-26 20:21:44 +01001443 /* Bounds check destination. */
Chris Wilson05394f32010-11-08 19:18:58 +00001444 if (args->offset > obj->base.size ||
1445 args->size > obj->base.size - args->offset) {
Chris Wilsonce9d4192010-09-26 20:50:05 +01001446 ret = -EINVAL;
Chris Wilson258a5ed2016-08-05 10:14:16 +01001447 goto err;
Chris Wilsonce9d4192010-09-26 20:50:05 +01001448 }
1449
Chris Wilsondb53a302011-02-03 11:57:46 +00001450 trace_i915_gem_object_pwrite(obj, args->offset, args->size);
1451
Chris Wilson258a5ed2016-08-05 10:14:16 +01001452 ret = __unsafe_wait_rendering(obj, to_rps_client(file), false);
1453 if (ret)
1454 goto err;
1455
1456 intel_runtime_pm_get(dev_priv);
1457
1458 ret = i915_mutex_lock_interruptible(dev);
1459 if (ret)
1460 goto err_rpm;
1461
Daniel Vetter935aaa62012-03-25 19:47:35 +02001462 ret = -EFAULT;
Eric Anholt673a3942008-07-30 12:06:12 -07001463 /* We can only do the GTT pwrite on untiled buffers, as otherwise
1464 * it would end up going through the fenced access, and we'll get
1465 * different detiling behavior between reading and writing.
1466 * pread/pwrite currently are reading and writing from the CPU
1467 * perspective, requiring manual detiling by the client.
1468 */
Chris Wilson6eae0052016-06-20 15:05:52 +01001469 if (!i915_gem_object_has_struct_page(obj) ||
Chris Wilson9c870d02016-10-24 13:42:15 +01001470 cpu_write_needs_clflush(obj))
Daniel Vetter935aaa62012-03-25 19:47:35 +02001471 /* Note that the gtt paths might fail with non-page-backed user
1472 * pointers (e.g. gtt mappings when moving data between
Chris Wilson9c870d02016-10-24 13:42:15 +01001473 * textures). Fallback to the shmem path in that case.
1474 */
1475 ret = i915_gem_gtt_pwrite_fast(dev_priv, obj, args, file);
Eric Anholt673a3942008-07-30 12:06:12 -07001476
Chris Wilsond1054ee2016-07-16 18:42:36 +01001477 if (ret == -EFAULT || ret == -ENOSPC) {
Chris Wilson6a2c4232014-11-04 04:51:40 -08001478 if (obj->phys_handle)
1479 ret = i915_gem_phys_pwrite(obj, args, file);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301480 else
Chris Wilson43394c72016-08-18 17:16:47 +01001481 ret = i915_gem_shmem_pwrite(dev, obj, args, file);
Chris Wilson6a2c4232014-11-04 04:51:40 -08001482 }
Daniel Vetter5c0480f2011-12-14 13:57:30 +01001483
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001484 i915_gem_object_put(obj);
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001485 mutex_unlock(&dev->struct_mutex);
Imre Deak5d77d9c2014-11-12 16:40:35 +02001486 intel_runtime_pm_put(dev_priv);
1487
Eric Anholt673a3942008-07-30 12:06:12 -07001488 return ret;
Chris Wilson258a5ed2016-08-05 10:14:16 +01001489
1490err_rpm:
1491 intel_runtime_pm_put(dev_priv);
1492err:
1493 i915_gem_object_put_unlocked(obj);
1494 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001495}
1496
Chris Wilsond243ad82016-08-18 17:16:44 +01001497static inline enum fb_op_origin
Chris Wilsonaeecc962016-06-17 14:46:39 -03001498write_origin(struct drm_i915_gem_object *obj, unsigned domain)
1499{
Chris Wilson50349242016-08-18 17:17:04 +01001500 return (domain == I915_GEM_DOMAIN_GTT ?
1501 obj->frontbuffer_ggtt_origin : ORIGIN_CPU);
Chris Wilsonaeecc962016-06-17 14:46:39 -03001502}
1503
Eric Anholt673a3942008-07-30 12:06:12 -07001504/**
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001505 * Called when user space prepares to use an object with the CPU, either
1506 * through the mmap ioctl's mapping or a GTT mapping.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001507 * @dev: drm device
1508 * @data: ioctl data blob
1509 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001510 */
1511int
1512i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001513 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001514{
1515 struct drm_i915_gem_set_domain *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001516 struct drm_i915_gem_object *obj;
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001517 uint32_t read_domains = args->read_domains;
1518 uint32_t write_domain = args->write_domain;
Eric Anholt673a3942008-07-30 12:06:12 -07001519 int ret;
1520
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001521 /* Only handle setting domains to types used by the CPU. */
Chris Wilsonb8f90962016-08-05 10:14:07 +01001522 if ((write_domain | read_domains) & I915_GEM_GPU_DOMAINS)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001523 return -EINVAL;
1524
1525 /* Having something in the write domain implies it's in the read
1526 * domain, and only that read domain. Enforce that in the request.
1527 */
1528 if (write_domain != 0 && read_domains != write_domain)
1529 return -EINVAL;
1530
Chris Wilson03ac0642016-07-20 13:31:51 +01001531 obj = i915_gem_object_lookup(file, args->handle);
Chris Wilsonb8f90962016-08-05 10:14:07 +01001532 if (!obj)
1533 return -ENOENT;
Jesse Barnes652c3932009-08-17 13:31:43 -07001534
Chris Wilson3236f572012-08-24 09:35:09 +01001535 /* Try to flush the object off the GPU without holding the lock.
1536 * We will repeat the flush holding the lock in the normal manner
1537 * to catch cases where we are gazumped.
1538 */
Chris Wilsonb8f90962016-08-05 10:14:07 +01001539 ret = __unsafe_wait_rendering(obj, to_rps_client(file), !write_domain);
Chris Wilson3236f572012-08-24 09:35:09 +01001540 if (ret)
Chris Wilsonb8f90962016-08-05 10:14:07 +01001541 goto err;
1542
1543 ret = i915_mutex_lock_interruptible(dev);
1544 if (ret)
1545 goto err;
Chris Wilson3236f572012-08-24 09:35:09 +01001546
Chris Wilson43566de2015-01-02 16:29:29 +05301547 if (read_domains & I915_GEM_DOMAIN_GTT)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001548 ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
Chris Wilson43566de2015-01-02 16:29:29 +05301549 else
Eric Anholte47c68e2008-11-14 13:35:19 -08001550 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001551
Daniel Vetter031b6982015-06-26 19:35:16 +02001552 if (write_domain != 0)
Chris Wilsonaeecc962016-06-17 14:46:39 -03001553 intel_fb_obj_invalidate(obj, write_origin(obj, write_domain));
Daniel Vetter031b6982015-06-26 19:35:16 +02001554
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001555 i915_gem_object_put(obj);
Eric Anholt673a3942008-07-30 12:06:12 -07001556 mutex_unlock(&dev->struct_mutex);
1557 return ret;
Chris Wilsonb8f90962016-08-05 10:14:07 +01001558
1559err:
1560 i915_gem_object_put_unlocked(obj);
1561 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001562}
1563
1564/**
1565 * Called when user space has done writes to this buffer
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001566 * @dev: drm device
1567 * @data: ioctl data blob
1568 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001569 */
1570int
1571i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001572 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001573{
1574 struct drm_i915_gem_sw_finish *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001575 struct drm_i915_gem_object *obj;
Chris Wilsonc21724c2016-08-05 10:14:19 +01001576 int err = 0;
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001577
Chris Wilson03ac0642016-07-20 13:31:51 +01001578 obj = i915_gem_object_lookup(file, args->handle);
Chris Wilsonc21724c2016-08-05 10:14:19 +01001579 if (!obj)
1580 return -ENOENT;
Eric Anholt673a3942008-07-30 12:06:12 -07001581
Eric Anholt673a3942008-07-30 12:06:12 -07001582 /* Pinned buffers may be scanout, so flush the cache */
Chris Wilsonc21724c2016-08-05 10:14:19 +01001583 if (READ_ONCE(obj->pin_display)) {
1584 err = i915_mutex_lock_interruptible(dev);
1585 if (!err) {
1586 i915_gem_object_flush_cpu_write_domain(obj);
1587 mutex_unlock(&dev->struct_mutex);
1588 }
1589 }
Eric Anholte47c68e2008-11-14 13:35:19 -08001590
Chris Wilsonc21724c2016-08-05 10:14:19 +01001591 i915_gem_object_put_unlocked(obj);
1592 return err;
Eric Anholt673a3942008-07-30 12:06:12 -07001593}
1594
1595/**
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001596 * i915_gem_mmap_ioctl - Maps the contents of an object, returning the address
1597 * it is mapped to.
1598 * @dev: drm device
1599 * @data: ioctl data blob
1600 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001601 *
1602 * While the mapping holds a reference on the contents of the object, it doesn't
1603 * imply a ref on the object itself.
Daniel Vetter34367382014-10-16 12:28:18 +02001604 *
1605 * IMPORTANT:
1606 *
1607 * DRM driver writers who look a this function as an example for how to do GEM
1608 * mmap support, please don't implement mmap support like here. The modern way
1609 * to implement DRM mmap support is with an mmap offset ioctl (like
1610 * i915_gem_mmap_gtt) and then using the mmap syscall on the DRM fd directly.
1611 * That way debug tooling like valgrind will understand what's going on, hiding
1612 * the mmap call in a driver private ioctl will break that. The i915 driver only
1613 * does cpu mmaps this way because we didn't know better.
Eric Anholt673a3942008-07-30 12:06:12 -07001614 */
1615int
1616i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001617 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001618{
1619 struct drm_i915_gem_mmap *args = data;
Chris Wilson03ac0642016-07-20 13:31:51 +01001620 struct drm_i915_gem_object *obj;
Eric Anholt673a3942008-07-30 12:06:12 -07001621 unsigned long addr;
1622
Akash Goel1816f922015-01-02 16:29:30 +05301623 if (args->flags & ~(I915_MMAP_WC))
1624 return -EINVAL;
1625
Borislav Petkov568a58e2016-03-29 17:42:01 +02001626 if (args->flags & I915_MMAP_WC && !boot_cpu_has(X86_FEATURE_PAT))
Akash Goel1816f922015-01-02 16:29:30 +05301627 return -ENODEV;
1628
Chris Wilson03ac0642016-07-20 13:31:51 +01001629 obj = i915_gem_object_lookup(file, args->handle);
1630 if (!obj)
Chris Wilsonbf79cb92010-08-04 14:19:46 +01001631 return -ENOENT;
Eric Anholt673a3942008-07-30 12:06:12 -07001632
Daniel Vetter1286ff72012-05-10 15:25:09 +02001633 /* prime objects have no backing filp to GEM mmap
1634 * pages from.
1635 */
Chris Wilson03ac0642016-07-20 13:31:51 +01001636 if (!obj->base.filp) {
Chris Wilson34911fd2016-07-20 13:31:54 +01001637 i915_gem_object_put_unlocked(obj);
Daniel Vetter1286ff72012-05-10 15:25:09 +02001638 return -EINVAL;
1639 }
1640
Chris Wilson03ac0642016-07-20 13:31:51 +01001641 addr = vm_mmap(obj->base.filp, 0, args->size,
Eric Anholt673a3942008-07-30 12:06:12 -07001642 PROT_READ | PROT_WRITE, MAP_SHARED,
1643 args->offset);
Akash Goel1816f922015-01-02 16:29:30 +05301644 if (args->flags & I915_MMAP_WC) {
1645 struct mm_struct *mm = current->mm;
1646 struct vm_area_struct *vma;
1647
Michal Hocko80a89a52016-05-23 16:26:11 -07001648 if (down_write_killable(&mm->mmap_sem)) {
Chris Wilson34911fd2016-07-20 13:31:54 +01001649 i915_gem_object_put_unlocked(obj);
Michal Hocko80a89a52016-05-23 16:26:11 -07001650 return -EINTR;
1651 }
Akash Goel1816f922015-01-02 16:29:30 +05301652 vma = find_vma(mm, addr);
1653 if (vma)
1654 vma->vm_page_prot =
1655 pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
1656 else
1657 addr = -ENOMEM;
1658 up_write(&mm->mmap_sem);
Chris Wilsonaeecc962016-06-17 14:46:39 -03001659
1660 /* This may race, but that's ok, it only gets set */
Chris Wilson50349242016-08-18 17:17:04 +01001661 WRITE_ONCE(obj->frontbuffer_ggtt_origin, ORIGIN_CPU);
Akash Goel1816f922015-01-02 16:29:30 +05301662 }
Chris Wilson34911fd2016-07-20 13:31:54 +01001663 i915_gem_object_put_unlocked(obj);
Eric Anholt673a3942008-07-30 12:06:12 -07001664 if (IS_ERR((void *)addr))
1665 return addr;
1666
1667 args->addr_ptr = (uint64_t) addr;
1668
1669 return 0;
1670}
1671
Chris Wilson03af84f2016-08-18 17:17:01 +01001672static unsigned int tile_row_pages(struct drm_i915_gem_object *obj)
1673{
1674 u64 size;
1675
1676 size = i915_gem_object_get_stride(obj);
1677 size *= i915_gem_object_get_tiling(obj) == I915_TILING_Y ? 32 : 8;
1678
1679 return size >> PAGE_SHIFT;
1680}
1681
Jesse Barnesde151cf2008-11-12 10:03:55 -08001682/**
Chris Wilson4cc69072016-08-25 19:05:19 +01001683 * i915_gem_mmap_gtt_version - report the current feature set for GTT mmaps
1684 *
1685 * A history of the GTT mmap interface:
1686 *
1687 * 0 - Everything had to fit into the GTT. Both parties of a memcpy had to
1688 * aligned and suitable for fencing, and still fit into the available
1689 * mappable space left by the pinned display objects. A classic problem
1690 * we called the page-fault-of-doom where we would ping-pong between
1691 * two objects that could not fit inside the GTT and so the memcpy
1692 * would page one object in at the expense of the other between every
1693 * single byte.
1694 *
1695 * 1 - Objects can be any size, and have any compatible fencing (X Y, or none
1696 * as set via i915_gem_set_tiling() [DRM_I915_GEM_SET_TILING]). If the
1697 * object is too large for the available space (or simply too large
1698 * for the mappable aperture!), a view is created instead and faulted
1699 * into userspace. (This view is aligned and sized appropriately for
1700 * fenced access.)
1701 *
1702 * Restrictions:
1703 *
1704 * * snoopable objects cannot be accessed via the GTT. It can cause machine
1705 * hangs on some architectures, corruption on others. An attempt to service
1706 * a GTT page fault from a snoopable object will generate a SIGBUS.
1707 *
1708 * * the object must be able to fit into RAM (physical memory, though no
1709 * limited to the mappable aperture).
1710 *
1711 *
1712 * Caveats:
1713 *
1714 * * a new GTT page fault will synchronize rendering from the GPU and flush
1715 * all data to system memory. Subsequent access will not be synchronized.
1716 *
1717 * * all mappings are revoked on runtime device suspend.
1718 *
1719 * * there are only 8, 16 or 32 fence registers to share between all users
1720 * (older machines require fence register for display and blitter access
1721 * as well). Contention of the fence registers will cause the previous users
1722 * to be unmapped and any new access will generate new page faults.
1723 *
1724 * * running out of memory while servicing a fault may generate a SIGBUS,
1725 * rather than the expected SIGSEGV.
1726 */
1727int i915_gem_mmap_gtt_version(void)
1728{
1729 return 1;
1730}
1731
1732/**
Jesse Barnesde151cf2008-11-12 10:03:55 -08001733 * i915_gem_fault - fault a page into the GTT
Chris Wilson058d88c2016-08-15 10:49:06 +01001734 * @area: CPU VMA in question
Geliang Tangd9072a32015-09-15 05:58:44 -07001735 * @vmf: fault info
Jesse Barnesde151cf2008-11-12 10:03:55 -08001736 *
1737 * The fault handler is set up by drm_gem_mmap() when a object is GTT mapped
1738 * from userspace. The fault handler takes care of binding the object to
1739 * the GTT (if needed), allocating and programming a fence register (again,
1740 * only if needed based on whether the old reg is still valid or the object
1741 * is tiled) and inserting a new PTE into the faulting process.
1742 *
1743 * Note that the faulting process may involve evicting existing objects
1744 * from the GTT and/or fence registers to make room. So performance may
1745 * suffer if the GTT working set is large or there are few fence registers
1746 * left.
Chris Wilson4cc69072016-08-25 19:05:19 +01001747 *
1748 * The current feature set supported by i915_gem_fault() and thus GTT mmaps
1749 * is exposed via I915_PARAM_MMAP_GTT_VERSION (see i915_gem_mmap_gtt_version).
Jesse Barnesde151cf2008-11-12 10:03:55 -08001750 */
Chris Wilson058d88c2016-08-15 10:49:06 +01001751int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf)
Jesse Barnesde151cf2008-11-12 10:03:55 -08001752{
Chris Wilson03af84f2016-08-18 17:17:01 +01001753#define MIN_CHUNK_PAGES ((1 << 20) >> PAGE_SHIFT) /* 1 MiB */
Chris Wilson058d88c2016-08-15 10:49:06 +01001754 struct drm_i915_gem_object *obj = to_intel_bo(area->vm_private_data);
Chris Wilson05394f32010-11-08 19:18:58 +00001755 struct drm_device *dev = obj->base.dev;
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03001756 struct drm_i915_private *dev_priv = to_i915(dev);
1757 struct i915_ggtt *ggtt = &dev_priv->ggtt;
Chris Wilsonb8f90962016-08-05 10:14:07 +01001758 bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
Chris Wilson058d88c2016-08-15 10:49:06 +01001759 struct i915_vma *vma;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001760 pgoff_t page_offset;
Chris Wilson82118872016-08-18 17:17:05 +01001761 unsigned int flags;
Chris Wilsonb8f90962016-08-05 10:14:07 +01001762 int ret;
Paulo Zanonif65c9162013-11-27 18:20:34 -02001763
Jesse Barnesde151cf2008-11-12 10:03:55 -08001764 /* We don't use vmf->pgoff since that has the fake offset */
Chris Wilson058d88c2016-08-15 10:49:06 +01001765 page_offset = ((unsigned long)vmf->virtual_address - area->vm_start) >>
Jesse Barnesde151cf2008-11-12 10:03:55 -08001766 PAGE_SHIFT;
1767
Chris Wilsondb53a302011-02-03 11:57:46 +00001768 trace_i915_gem_object_fault(obj, page_offset, true, write);
1769
Chris Wilson6e4930f2014-02-07 18:37:06 -02001770 /* Try to flush the object off the GPU first without holding the lock.
Chris Wilsonb8f90962016-08-05 10:14:07 +01001771 * Upon acquiring the lock, we will perform our sanity checks and then
Chris Wilson6e4930f2014-02-07 18:37:06 -02001772 * repeat the flush holding the lock in the normal manner to catch cases
1773 * where we are gazumped.
1774 */
Chris Wilsonb8f90962016-08-05 10:14:07 +01001775 ret = __unsafe_wait_rendering(obj, NULL, !write);
Chris Wilson6e4930f2014-02-07 18:37:06 -02001776 if (ret)
Chris Wilsonb8f90962016-08-05 10:14:07 +01001777 goto err;
1778
1779 intel_runtime_pm_get(dev_priv);
1780
1781 ret = i915_mutex_lock_interruptible(dev);
1782 if (ret)
1783 goto err_rpm;
Chris Wilson6e4930f2014-02-07 18:37:06 -02001784
Chris Wilsoneb119bd2012-12-16 12:43:36 +00001785 /* Access to snoopable pages through the GTT is incoherent. */
1786 if (obj->cache_level != I915_CACHE_NONE && !HAS_LLC(dev)) {
Chris Wilsonddeff6e2014-05-28 16:16:41 +01001787 ret = -EFAULT;
Chris Wilsonb8f90962016-08-05 10:14:07 +01001788 goto err_unlock;
Chris Wilsoneb119bd2012-12-16 12:43:36 +00001789 }
1790
Chris Wilson82118872016-08-18 17:17:05 +01001791 /* If the object is smaller than a couple of partial vma, it is
1792 * not worth only creating a single partial vma - we may as well
1793 * clear enough space for the full object.
1794 */
1795 flags = PIN_MAPPABLE;
1796 if (obj->base.size > 2 * MIN_CHUNK_PAGES << PAGE_SHIFT)
1797 flags |= PIN_NONBLOCK | PIN_NONFAULT;
1798
Chris Wilsona61007a2016-08-18 17:17:02 +01001799 /* Now pin it into the GTT as needed */
Chris Wilson82118872016-08-18 17:17:05 +01001800 vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, flags);
Chris Wilsona61007a2016-08-18 17:17:02 +01001801 if (IS_ERR(vma)) {
1802 struct i915_ggtt_view view;
Chris Wilson03af84f2016-08-18 17:17:01 +01001803 unsigned int chunk_size;
1804
Chris Wilsona61007a2016-08-18 17:17:02 +01001805 /* Use a partial view if it is bigger than available space */
Chris Wilson03af84f2016-08-18 17:17:01 +01001806 chunk_size = MIN_CHUNK_PAGES;
1807 if (i915_gem_object_is_tiled(obj))
1808 chunk_size = max(chunk_size, tile_row_pages(obj));
Joonas Lahtinene7ded2d2015-05-08 14:37:39 +03001809
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001810 memset(&view, 0, sizeof(view));
1811 view.type = I915_GGTT_VIEW_PARTIAL;
1812 view.params.partial.offset = rounddown(page_offset, chunk_size);
1813 view.params.partial.size =
Chris Wilsona61007a2016-08-18 17:17:02 +01001814 min_t(unsigned int, chunk_size,
Chris Wilson908b1232016-10-11 10:06:56 +01001815 vma_pages(area) - view.params.partial.offset);
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001816
Chris Wilsonaa136d92016-08-18 17:17:03 +01001817 /* If the partial covers the entire object, just create a
1818 * normal VMA.
1819 */
1820 if (chunk_size >= obj->base.size >> PAGE_SHIFT)
1821 view.type = I915_GGTT_VIEW_NORMAL;
1822
Chris Wilson50349242016-08-18 17:17:04 +01001823 /* Userspace is now writing through an untracked VMA, abandon
1824 * all hope that the hardware is able to track future writes.
1825 */
1826 obj->frontbuffer_ggtt_origin = ORIGIN_CPU;
1827
Chris Wilsona61007a2016-08-18 17:17:02 +01001828 vma = i915_gem_object_ggtt_pin(obj, &view, 0, 0, PIN_MAPPABLE);
1829 }
Chris Wilson058d88c2016-08-15 10:49:06 +01001830 if (IS_ERR(vma)) {
1831 ret = PTR_ERR(vma);
Chris Wilsonb8f90962016-08-05 10:14:07 +01001832 goto err_unlock;
Chris Wilson058d88c2016-08-15 10:49:06 +01001833 }
Jesse Barnesde151cf2008-11-12 10:03:55 -08001834
Chris Wilsonc9839302012-11-20 10:45:17 +00001835 ret = i915_gem_object_set_to_gtt_domain(obj, write);
1836 if (ret)
Chris Wilsonb8f90962016-08-05 10:14:07 +01001837 goto err_unpin;
Chris Wilsonc9839302012-11-20 10:45:17 +00001838
Chris Wilson49ef5292016-08-18 17:17:00 +01001839 ret = i915_vma_get_fence(vma);
Chris Wilsonc9839302012-11-20 10:45:17 +00001840 if (ret)
Chris Wilsonb8f90962016-08-05 10:14:07 +01001841 goto err_unpin;
Chris Wilson7d1c4802010-08-07 21:45:03 +01001842
Chris Wilson275f0392016-10-24 13:42:14 +01001843 /* Mark as being mmapped into userspace for later revocation */
Chris Wilson9c870d02016-10-24 13:42:15 +01001844 assert_rpm_wakelock_held(dev_priv);
Chris Wilson275f0392016-10-24 13:42:14 +01001845 if (list_empty(&obj->userfault_link))
1846 list_add(&obj->userfault_link, &dev_priv->mm.userfault_list);
Chris Wilson275f0392016-10-24 13:42:14 +01001847
Chris Wilsonb90b91d2014-06-10 12:14:40 +01001848 /* Finally, remap it using the new GTT offset */
Chris Wilsonc58305a2016-08-19 16:54:28 +01001849 ret = remap_io_mapping(area,
1850 area->vm_start + (vma->ggtt_view.params.partial.offset << PAGE_SHIFT),
1851 (ggtt->mappable_base + vma->node.start) >> PAGE_SHIFT,
1852 min_t(u64, vma->size, area->vm_end - area->vm_start),
1853 &ggtt->mappable);
Chris Wilsona61007a2016-08-18 17:17:02 +01001854
Chris Wilsonb8f90962016-08-05 10:14:07 +01001855err_unpin:
Chris Wilson058d88c2016-08-15 10:49:06 +01001856 __i915_vma_unpin(vma);
Chris Wilsonb8f90962016-08-05 10:14:07 +01001857err_unlock:
Jesse Barnesde151cf2008-11-12 10:03:55 -08001858 mutex_unlock(&dev->struct_mutex);
Chris Wilsonb8f90962016-08-05 10:14:07 +01001859err_rpm:
1860 intel_runtime_pm_put(dev_priv);
1861err:
Jesse Barnesde151cf2008-11-12 10:03:55 -08001862 switch (ret) {
Chris Wilsond9bc7e92011-02-07 13:09:31 +00001863 case -EIO:
Daniel Vetter2232f032014-09-04 09:36:18 +02001864 /*
1865 * We eat errors when the gpu is terminally wedged to avoid
1866 * userspace unduly crashing (gl has no provisions for mmaps to
1867 * fail). But any other -EIO isn't ours (e.g. swap in failure)
1868 * and so needs to be reported.
1869 */
1870 if (!i915_terminally_wedged(&dev_priv->gpu_error)) {
Paulo Zanonif65c9162013-11-27 18:20:34 -02001871 ret = VM_FAULT_SIGBUS;
1872 break;
1873 }
Chris Wilson045e7692010-11-07 09:18:22 +00001874 case -EAGAIN:
Daniel Vetter571c6082013-09-12 17:57:28 +02001875 /*
1876 * EAGAIN means the gpu is hung and we'll wait for the error
1877 * handler to reset everything when re-faulting in
1878 * i915_mutex_lock_interruptible.
Chris Wilsond9bc7e92011-02-07 13:09:31 +00001879 */
Chris Wilsonc7150892009-09-23 00:43:56 +01001880 case 0:
1881 case -ERESTARTSYS:
Chris Wilsonbed636a2011-02-11 20:31:19 +00001882 case -EINTR:
Dmitry Rogozhkine79e0fe2012-10-03 17:15:26 +03001883 case -EBUSY:
1884 /*
1885 * EBUSY is ok: this just means that another thread
1886 * already did the job.
1887 */
Paulo Zanonif65c9162013-11-27 18:20:34 -02001888 ret = VM_FAULT_NOPAGE;
1889 break;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001890 case -ENOMEM:
Paulo Zanonif65c9162013-11-27 18:20:34 -02001891 ret = VM_FAULT_OOM;
1892 break;
Daniel Vettera7c2e1a2012-10-17 11:17:16 +02001893 case -ENOSPC:
Chris Wilson45d67812014-01-31 11:34:57 +00001894 case -EFAULT:
Paulo Zanonif65c9162013-11-27 18:20:34 -02001895 ret = VM_FAULT_SIGBUS;
1896 break;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001897 default:
Daniel Vettera7c2e1a2012-10-17 11:17:16 +02001898 WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret);
Paulo Zanonif65c9162013-11-27 18:20:34 -02001899 ret = VM_FAULT_SIGBUS;
1900 break;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001901 }
Paulo Zanonif65c9162013-11-27 18:20:34 -02001902 return ret;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001903}
1904
1905/**
Chris Wilson901782b2009-07-10 08:18:50 +01001906 * i915_gem_release_mmap - remove physical page mappings
1907 * @obj: obj in question
1908 *
André Goddard Rosaaf901ca2009-11-14 13:09:05 -02001909 * Preserve the reservation of the mmapping with the DRM core code, but
Chris Wilson901782b2009-07-10 08:18:50 +01001910 * relinquish ownership of the pages back to the system.
1911 *
1912 * It is vital that we remove the page mapping if we have mapped a tiled
1913 * object through the GTT and then lose the fence register due to
1914 * resource pressure. Similarly if the object has been moved out of the
1915 * aperture, than pages mapped into userspace must be revoked. Removing the
1916 * mapping will then trigger a page fault on the next user access, allowing
1917 * fixup by i915_gem_fault().
1918 */
Eric Anholtd05ca302009-07-10 13:02:26 -07001919void
Chris Wilson05394f32010-11-08 19:18:58 +00001920i915_gem_release_mmap(struct drm_i915_gem_object *obj)
Chris Wilson901782b2009-07-10 08:18:50 +01001921{
Chris Wilson275f0392016-10-24 13:42:14 +01001922 struct drm_i915_private *i915 = to_i915(obj->base.dev);
Chris Wilson275f0392016-10-24 13:42:14 +01001923
Chris Wilson349f2cc2016-04-13 17:35:12 +01001924 /* Serialisation between user GTT access and our code depends upon
1925 * revoking the CPU's PTE whilst the mutex is held. The next user
1926 * pagefault then has to wait until we release the mutex.
Chris Wilson9c870d02016-10-24 13:42:15 +01001927 *
1928 * Note that RPM complicates somewhat by adding an additional
1929 * requirement that operations to the GGTT be made holding the RPM
1930 * wakeref.
Chris Wilson349f2cc2016-04-13 17:35:12 +01001931 */
Chris Wilson275f0392016-10-24 13:42:14 +01001932 lockdep_assert_held(&i915->drm.struct_mutex);
Chris Wilson9c870d02016-10-24 13:42:15 +01001933 intel_runtime_pm_get(i915);
Chris Wilson349f2cc2016-04-13 17:35:12 +01001934
Chris Wilson3594a3e2016-10-24 13:42:16 +01001935 if (list_empty(&obj->userfault_link))
Chris Wilson9c870d02016-10-24 13:42:15 +01001936 goto out;
Chris Wilson901782b2009-07-10 08:18:50 +01001937
Chris Wilson3594a3e2016-10-24 13:42:16 +01001938 list_del_init(&obj->userfault_link);
David Herrmann6796cb12014-01-03 14:24:19 +01001939 drm_vma_node_unmap(&obj->base.vma_node,
1940 obj->base.dev->anon_inode->i_mapping);
Chris Wilson349f2cc2016-04-13 17:35:12 +01001941
1942 /* Ensure that the CPU's PTE are revoked and there are not outstanding
1943 * memory transactions from userspace before we return. The TLB
1944 * flushing implied above by changing the PTE above *should* be
1945 * sufficient, an extra barrier here just provides us with a bit
1946 * of paranoid documentation about our requirement to serialise
1947 * memory writes before touching registers / GSM.
1948 */
1949 wmb();
Chris Wilson9c870d02016-10-24 13:42:15 +01001950
1951out:
1952 intel_runtime_pm_put(i915);
Chris Wilson901782b2009-07-10 08:18:50 +01001953}
1954
Chris Wilsoneedd10f2014-06-16 08:57:44 +01001955void
1956i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv)
1957{
Chris Wilson3594a3e2016-10-24 13:42:16 +01001958 struct drm_i915_gem_object *obj, *on;
Chris Wilsoneedd10f2014-06-16 08:57:44 +01001959
Chris Wilson3594a3e2016-10-24 13:42:16 +01001960 /*
1961 * Only called during RPM suspend. All users of the userfault_list
1962 * must be holding an RPM wakeref to ensure that this can not
1963 * run concurrently with themselves (and use the struct_mutex for
1964 * protection between themselves).
1965 */
1966
1967 list_for_each_entry_safe(obj, on,
1968 &dev_priv->mm.userfault_list, userfault_link) {
Chris Wilson275f0392016-10-24 13:42:14 +01001969 list_del_init(&obj->userfault_link);
Chris Wilson275f0392016-10-24 13:42:14 +01001970 drm_vma_node_unmap(&obj->base.vma_node,
1971 obj->base.dev->anon_inode->i_mapping);
Chris Wilson275f0392016-10-24 13:42:14 +01001972 }
Chris Wilsoneedd10f2014-06-16 08:57:44 +01001973}
1974
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001975/**
1976 * i915_gem_get_ggtt_size - return required global GTT size for an object
Chris Wilsona9f14812016-08-04 16:32:28 +01001977 * @dev_priv: i915 device
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001978 * @size: object size
1979 * @tiling_mode: tiling mode
1980 *
1981 * Return the required global GTT size for an object, taking into account
1982 * potential fence register mapping.
1983 */
Chris Wilsona9f14812016-08-04 16:32:28 +01001984u64 i915_gem_get_ggtt_size(struct drm_i915_private *dev_priv,
1985 u64 size, int tiling_mode)
Chris Wilson92b88ae2010-11-09 11:47:32 +00001986{
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001987 u64 ggtt_size;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001988
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001989 GEM_BUG_ON(size == 0);
1990
Chris Wilsona9f14812016-08-04 16:32:28 +01001991 if (INTEL_GEN(dev_priv) >= 4 ||
Chris Wilsone28f8712011-07-18 13:11:49 -07001992 tiling_mode == I915_TILING_NONE)
1993 return size;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001994
1995 /* Previous chips need a power-of-two fence region when tiling */
Chris Wilsona9f14812016-08-04 16:32:28 +01001996 if (IS_GEN3(dev_priv))
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001997 ggtt_size = 1024*1024;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001998 else
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001999 ggtt_size = 512*1024;
Chris Wilson92b88ae2010-11-09 11:47:32 +00002000
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002001 while (ggtt_size < size)
2002 ggtt_size <<= 1;
Chris Wilson92b88ae2010-11-09 11:47:32 +00002003
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002004 return ggtt_size;
Chris Wilson92b88ae2010-11-09 11:47:32 +00002005}
2006
Jesse Barnesde151cf2008-11-12 10:03:55 -08002007/**
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002008 * i915_gem_get_ggtt_alignment - return required global GTT alignment
Chris Wilsona9f14812016-08-04 16:32:28 +01002009 * @dev_priv: i915 device
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01002010 * @size: object size
2011 * @tiling_mode: tiling mode
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002012 * @fenced: is fenced alignment required or not
Jesse Barnesde151cf2008-11-12 10:03:55 -08002013 *
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002014 * Return the required global GTT alignment for an object, taking into account
Daniel Vetter5e783302010-11-14 22:32:36 +01002015 * potential fence register mapping.
Jesse Barnesde151cf2008-11-12 10:03:55 -08002016 */
Chris Wilsona9f14812016-08-04 16:32:28 +01002017u64 i915_gem_get_ggtt_alignment(struct drm_i915_private *dev_priv, u64 size,
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002018 int tiling_mode, bool fenced)
Jesse Barnesde151cf2008-11-12 10:03:55 -08002019{
Chris Wilsonad1a7d22016-08-04 16:32:27 +01002020 GEM_BUG_ON(size == 0);
2021
Jesse Barnesde151cf2008-11-12 10:03:55 -08002022 /*
2023 * Minimum alignment is 4k (GTT page size), but might be greater
2024 * if a fence register is needed for the object.
2025 */
Chris Wilsona9f14812016-08-04 16:32:28 +01002026 if (INTEL_GEN(dev_priv) >= 4 || (!fenced && IS_G33(dev_priv)) ||
Chris Wilsone28f8712011-07-18 13:11:49 -07002027 tiling_mode == I915_TILING_NONE)
Jesse Barnesde151cf2008-11-12 10:03:55 -08002028 return 4096;
2029
2030 /*
2031 * Previous chips need to be aligned to the size of the smallest
2032 * fence register that can contain the object.
2033 */
Chris Wilsona9f14812016-08-04 16:32:28 +01002034 return i915_gem_get_ggtt_size(dev_priv, size, tiling_mode);
Chris Wilsona00b10c2010-09-24 21:15:47 +01002035}
2036
Chris Wilsond8cb5082012-08-11 15:41:03 +01002037static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
2038{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002039 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilsonf3f61842016-08-05 10:14:14 +01002040 int err;
Chris Wilsond8cb5082012-08-11 15:41:03 +01002041
Chris Wilsonf3f61842016-08-05 10:14:14 +01002042 err = drm_gem_create_mmap_offset(&obj->base);
2043 if (!err)
2044 return 0;
Daniel Vetterda494d72012-12-20 15:11:16 +01002045
Chris Wilsonf3f61842016-08-05 10:14:14 +01002046 /* We can idle the GPU locklessly to flush stale objects, but in order
2047 * to claim that space for ourselves, we need to take the big
2048 * struct_mutex to free the requests+objects and allocate our slot.
Chris Wilsond8cb5082012-08-11 15:41:03 +01002049 */
Chris Wilsonea746f32016-09-09 14:11:49 +01002050 err = i915_gem_wait_for_idle(dev_priv, I915_WAIT_INTERRUPTIBLE);
Chris Wilsonf3f61842016-08-05 10:14:14 +01002051 if (err)
2052 return err;
Chris Wilsond8cb5082012-08-11 15:41:03 +01002053
Chris Wilsonf3f61842016-08-05 10:14:14 +01002054 err = i915_mutex_lock_interruptible(&dev_priv->drm);
2055 if (!err) {
2056 i915_gem_retire_requests(dev_priv);
2057 err = drm_gem_create_mmap_offset(&obj->base);
2058 mutex_unlock(&dev_priv->drm.struct_mutex);
2059 }
Daniel Vetterda494d72012-12-20 15:11:16 +01002060
Chris Wilsonf3f61842016-08-05 10:14:14 +01002061 return err;
Chris Wilsond8cb5082012-08-11 15:41:03 +01002062}
2063
2064static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
2065{
Chris Wilsond8cb5082012-08-11 15:41:03 +01002066 drm_gem_free_mmap_offset(&obj->base);
2067}
2068
Dave Airlieda6b51d2014-12-24 13:11:17 +10002069int
Dave Airlieff72145b2011-02-07 12:16:14 +10002070i915_gem_mmap_gtt(struct drm_file *file,
2071 struct drm_device *dev,
Dave Airlieda6b51d2014-12-24 13:11:17 +10002072 uint32_t handle,
Dave Airlieff72145b2011-02-07 12:16:14 +10002073 uint64_t *offset)
Jesse Barnesde151cf2008-11-12 10:03:55 -08002074{
Chris Wilson05394f32010-11-08 19:18:58 +00002075 struct drm_i915_gem_object *obj;
Jesse Barnesde151cf2008-11-12 10:03:55 -08002076 int ret;
2077
Chris Wilson03ac0642016-07-20 13:31:51 +01002078 obj = i915_gem_object_lookup(file, handle);
Chris Wilsonf3f61842016-08-05 10:14:14 +01002079 if (!obj)
2080 return -ENOENT;
Chris Wilsonab182822009-09-22 18:46:17 +01002081
Chris Wilsond8cb5082012-08-11 15:41:03 +01002082 ret = i915_gem_object_create_mmap_offset(obj);
Chris Wilsonf3f61842016-08-05 10:14:14 +01002083 if (ret == 0)
2084 *offset = drm_vma_node_offset_addr(&obj->base.vma_node);
Jesse Barnesde151cf2008-11-12 10:03:55 -08002085
Chris Wilsonf3f61842016-08-05 10:14:14 +01002086 i915_gem_object_put_unlocked(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01002087 return ret;
Jesse Barnesde151cf2008-11-12 10:03:55 -08002088}
2089
Dave Airlieff72145b2011-02-07 12:16:14 +10002090/**
2091 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
2092 * @dev: DRM device
2093 * @data: GTT mapping ioctl data
2094 * @file: GEM object info
2095 *
2096 * Simply returns the fake offset to userspace so it can mmap it.
2097 * The mmap call will end up in drm_gem_mmap(), which will set things
2098 * up so we can get faults in the handler above.
2099 *
2100 * The fault handler will take care of binding the object into the GTT
2101 * (since it may have been evicted to make room for something), allocating
2102 * a fence register, and mapping the appropriate aperture address into
2103 * userspace.
2104 */
2105int
2106i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
2107 struct drm_file *file)
2108{
2109 struct drm_i915_gem_mmap_gtt *args = data;
2110
Dave Airlieda6b51d2014-12-24 13:11:17 +10002111 return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
Dave Airlieff72145b2011-02-07 12:16:14 +10002112}
2113
Daniel Vetter225067e2012-08-20 10:23:20 +02002114/* Immediately discard the backing storage */
2115static void
2116i915_gem_object_truncate(struct drm_i915_gem_object *obj)
Chris Wilsone5281cc2010-10-28 13:45:36 +01002117{
Chris Wilson4d6294bf2012-08-11 15:41:05 +01002118 i915_gem_object_free_mmap_offset(obj);
Daniel Vetter1286ff72012-05-10 15:25:09 +02002119
Chris Wilson4d6294bf2012-08-11 15:41:05 +01002120 if (obj->base.filp == NULL)
2121 return;
2122
Daniel Vetter225067e2012-08-20 10:23:20 +02002123 /* Our goal here is to return as much of the memory as
2124 * is possible back to the system as we are called from OOM.
2125 * To do this we must instruct the shmfs to drop all of its
2126 * backing pages, *now*.
Chris Wilsone5281cc2010-10-28 13:45:36 +01002127 */
Chris Wilson55372522014-03-25 13:23:06 +00002128 shmem_truncate_range(file_inode(obj->base.filp), 0, (loff_t)-1);
Daniel Vetter225067e2012-08-20 10:23:20 +02002129 obj->madv = __I915_MADV_PURGED;
Chris Wilsone5281cc2010-10-28 13:45:36 +01002130}
Chris Wilsone5281cc2010-10-28 13:45:36 +01002131
Chris Wilson55372522014-03-25 13:23:06 +00002132/* Try to discard unwanted pages */
2133static void
2134i915_gem_object_invalidate(struct drm_i915_gem_object *obj)
Daniel Vetter225067e2012-08-20 10:23:20 +02002135{
Chris Wilson55372522014-03-25 13:23:06 +00002136 struct address_space *mapping;
2137
2138 switch (obj->madv) {
2139 case I915_MADV_DONTNEED:
2140 i915_gem_object_truncate(obj);
2141 case __I915_MADV_PURGED:
2142 return;
2143 }
2144
2145 if (obj->base.filp == NULL)
2146 return;
2147
Al Viro93c76a32015-12-04 23:45:44 -05002148 mapping = obj->base.filp->f_mapping,
Chris Wilson55372522014-03-25 13:23:06 +00002149 invalidate_mapping_pages(mapping, 0, (loff_t)-1);
Chris Wilsone5281cc2010-10-28 13:45:36 +01002150}
2151
Chris Wilson5cdf5882010-09-27 15:51:07 +01002152static void
Chris Wilson05394f32010-11-08 19:18:58 +00002153i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
Eric Anholt673a3942008-07-30 12:06:12 -07002154{
Dave Gordon85d12252016-05-20 11:54:06 +01002155 struct sgt_iter sgt_iter;
2156 struct page *page;
Imre Deak90797e62013-02-18 19:28:03 +02002157 int ret;
Daniel Vetter1286ff72012-05-10 15:25:09 +02002158
Chris Wilson05394f32010-11-08 19:18:58 +00002159 BUG_ON(obj->madv == __I915_MADV_PURGED);
Eric Anholt856fa192009-03-19 14:10:50 -07002160
Chris Wilson6c085a72012-08-20 11:40:46 +02002161 ret = i915_gem_object_set_to_cpu_domain(obj, true);
Chris Wilsonf4457ae2016-04-13 17:35:08 +01002162 if (WARN_ON(ret)) {
Chris Wilson6c085a72012-08-20 11:40:46 +02002163 /* In the event of a disaster, abandon all caches and
2164 * hope for the best.
2165 */
Chris Wilson2c225692013-08-09 12:26:45 +01002166 i915_gem_clflush_object(obj, true);
Chris Wilson6c085a72012-08-20 11:40:46 +02002167 obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
2168 }
2169
Imre Deake2273302015-07-09 12:59:05 +03002170 i915_gem_gtt_finish_object(obj);
2171
Daniel Vetter6dacfd22011-09-12 21:30:02 +02002172 if (i915_gem_object_needs_bit17_swizzle(obj))
Eric Anholt280b7132009-03-12 16:56:27 -07002173 i915_gem_object_save_bit_17_swizzle(obj);
2174
Chris Wilson05394f32010-11-08 19:18:58 +00002175 if (obj->madv == I915_MADV_DONTNEED)
2176 obj->dirty = 0;
Chris Wilson3ef94da2009-09-14 16:50:29 +01002177
Dave Gordon85d12252016-05-20 11:54:06 +01002178 for_each_sgt_page(page, sgt_iter, obj->pages) {
Chris Wilson05394f32010-11-08 19:18:58 +00002179 if (obj->dirty)
Chris Wilson9da3da62012-06-01 15:20:22 +01002180 set_page_dirty(page);
Chris Wilson3ef94da2009-09-14 16:50:29 +01002181
Chris Wilson05394f32010-11-08 19:18:58 +00002182 if (obj->madv == I915_MADV_WILLNEED)
Chris Wilson9da3da62012-06-01 15:20:22 +01002183 mark_page_accessed(page);
Chris Wilson3ef94da2009-09-14 16:50:29 +01002184
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002185 put_page(page);
Chris Wilson3ef94da2009-09-14 16:50:29 +01002186 }
Chris Wilson05394f32010-11-08 19:18:58 +00002187 obj->dirty = 0;
Eric Anholt673a3942008-07-30 12:06:12 -07002188
Chris Wilson9da3da62012-06-01 15:20:22 +01002189 sg_free_table(obj->pages);
2190 kfree(obj->pages);
Chris Wilson37e680a2012-06-07 15:38:42 +01002191}
2192
Chris Wilsondd624af2013-01-15 12:39:35 +00002193int
Chris Wilson37e680a2012-06-07 15:38:42 +01002194i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
2195{
2196 const struct drm_i915_gem_object_ops *ops = obj->ops;
2197
Chris Wilson2f745ad2012-09-04 21:02:58 +01002198 if (obj->pages == NULL)
Chris Wilson37e680a2012-06-07 15:38:42 +01002199 return 0;
2200
Chris Wilsona5570172012-09-04 21:02:54 +01002201 if (obj->pages_pin_count)
2202 return -EBUSY;
2203
Chris Wilson15717de2016-08-04 07:52:26 +01002204 GEM_BUG_ON(obj->bind_count);
Ben Widawsky3e123022013-07-31 17:00:04 -07002205
Chris Wilsona2165e32012-12-03 11:49:00 +00002206 /* ->put_pages might need to allocate memory for the bit17 swizzle
2207 * array, hence protect them from being reaped by removing them from gtt
2208 * lists early. */
Ben Widawsky35c20a62013-05-31 11:28:48 -07002209 list_del(&obj->global_list);
Chris Wilsona2165e32012-12-03 11:49:00 +00002210
Chris Wilson0a798eb2016-04-08 12:11:11 +01002211 if (obj->mapping) {
Chris Wilson4b30cb22016-08-18 17:16:42 +01002212 void *ptr;
2213
2214 ptr = ptr_mask_bits(obj->mapping);
2215 if (is_vmalloc_addr(ptr))
2216 vunmap(ptr);
Chris Wilsonfb8621d2016-04-08 12:11:14 +01002217 else
Chris Wilson4b30cb22016-08-18 17:16:42 +01002218 kunmap(kmap_to_page(ptr));
2219
Chris Wilson0a798eb2016-04-08 12:11:11 +01002220 obj->mapping = NULL;
2221 }
2222
Chris Wilson37e680a2012-06-07 15:38:42 +01002223 ops->put_pages(obj);
Chris Wilson05394f32010-11-08 19:18:58 +00002224 obj->pages = NULL;
Chris Wilson6c085a72012-08-20 11:40:46 +02002225
Chris Wilson55372522014-03-25 13:23:06 +00002226 i915_gem_object_invalidate(obj);
Chris Wilson6c085a72012-08-20 11:40:46 +02002227
2228 return 0;
2229}
2230
Chris Wilson4ff340f02016-10-18 13:02:50 +01002231static unsigned int swiotlb_max_size(void)
Chris Wilson871dfbd2016-10-11 09:20:21 +01002232{
2233#if IS_ENABLED(CONFIG_SWIOTLB)
2234 return rounddown(swiotlb_nr_tbl() << IO_TLB_SHIFT, PAGE_SIZE);
2235#else
2236 return 0;
2237#endif
2238}
2239
Chris Wilson37e680a2012-06-07 15:38:42 +01002240static int
Chris Wilson6c085a72012-08-20 11:40:46 +02002241i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
Eric Anholt673a3942008-07-30 12:06:12 -07002242{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002243 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Eric Anholt673a3942008-07-30 12:06:12 -07002244 int page_count, i;
2245 struct address_space *mapping;
Chris Wilson9da3da62012-06-01 15:20:22 +01002246 struct sg_table *st;
2247 struct scatterlist *sg;
Dave Gordon85d12252016-05-20 11:54:06 +01002248 struct sgt_iter sgt_iter;
Eric Anholt673a3942008-07-30 12:06:12 -07002249 struct page *page;
Imre Deak90797e62013-02-18 19:28:03 +02002250 unsigned long last_pfn = 0; /* suppress gcc warning */
Chris Wilson4ff340f02016-10-18 13:02:50 +01002251 unsigned int max_segment;
Imre Deake2273302015-07-09 12:59:05 +03002252 int ret;
Chris Wilson6c085a72012-08-20 11:40:46 +02002253 gfp_t gfp;
Eric Anholt673a3942008-07-30 12:06:12 -07002254
Chris Wilson6c085a72012-08-20 11:40:46 +02002255 /* Assert that the object is not currently in any GPU domain. As it
2256 * wasn't in the GTT, there shouldn't be any way it could have been in
2257 * a GPU cache
2258 */
2259 BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
2260 BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
2261
Chris Wilson871dfbd2016-10-11 09:20:21 +01002262 max_segment = swiotlb_max_size();
2263 if (!max_segment)
Chris Wilson4ff340f02016-10-18 13:02:50 +01002264 max_segment = rounddown(UINT_MAX, PAGE_SIZE);
Chris Wilson871dfbd2016-10-11 09:20:21 +01002265
Chris Wilson9da3da62012-06-01 15:20:22 +01002266 st = kmalloc(sizeof(*st), GFP_KERNEL);
2267 if (st == NULL)
Eric Anholt673a3942008-07-30 12:06:12 -07002268 return -ENOMEM;
2269
Chris Wilson9da3da62012-06-01 15:20:22 +01002270 page_count = obj->base.size / PAGE_SIZE;
2271 if (sg_alloc_table(st, page_count, GFP_KERNEL)) {
Chris Wilson9da3da62012-06-01 15:20:22 +01002272 kfree(st);
2273 return -ENOMEM;
2274 }
2275
2276 /* Get the list of pages out of our struct file. They'll be pinned
2277 * at this point until we release them.
2278 *
2279 * Fail silently without starting the shrinker
2280 */
Al Viro93c76a32015-12-04 23:45:44 -05002281 mapping = obj->base.filp->f_mapping;
Michal Hockoc62d2552015-11-06 16:28:49 -08002282 gfp = mapping_gfp_constraint(mapping, ~(__GFP_IO | __GFP_RECLAIM));
Mel Gormand0164ad2015-11-06 16:28:21 -08002283 gfp |= __GFP_NORETRY | __GFP_NOWARN;
Imre Deak90797e62013-02-18 19:28:03 +02002284 sg = st->sgl;
2285 st->nents = 0;
2286 for (i = 0; i < page_count; i++) {
Chris Wilson6c085a72012-08-20 11:40:46 +02002287 page = shmem_read_mapping_page_gfp(mapping, i, gfp);
2288 if (IS_ERR(page)) {
Chris Wilson21ab4e72014-09-09 11:16:08 +01002289 i915_gem_shrink(dev_priv,
2290 page_count,
2291 I915_SHRINK_BOUND |
2292 I915_SHRINK_UNBOUND |
2293 I915_SHRINK_PURGEABLE);
Chris Wilson6c085a72012-08-20 11:40:46 +02002294 page = shmem_read_mapping_page_gfp(mapping, i, gfp);
2295 }
2296 if (IS_ERR(page)) {
2297 /* We've tried hard to allocate the memory by reaping
2298 * our own buffer, now let the real VM do its job and
2299 * go down in flames if truly OOM.
2300 */
David Herrmannf461d1be22014-05-25 14:34:10 +02002301 page = shmem_read_mapping_page(mapping, i);
Imre Deake2273302015-07-09 12:59:05 +03002302 if (IS_ERR(page)) {
2303 ret = PTR_ERR(page);
Chris Wilson6c085a72012-08-20 11:40:46 +02002304 goto err_pages;
Imre Deake2273302015-07-09 12:59:05 +03002305 }
Chris Wilson6c085a72012-08-20 11:40:46 +02002306 }
Chris Wilson871dfbd2016-10-11 09:20:21 +01002307 if (!i ||
2308 sg->length >= max_segment ||
2309 page_to_pfn(page) != last_pfn + 1) {
Imre Deak90797e62013-02-18 19:28:03 +02002310 if (i)
2311 sg = sg_next(sg);
2312 st->nents++;
2313 sg_set_page(sg, page, PAGE_SIZE, 0);
2314 } else {
2315 sg->length += PAGE_SIZE;
2316 }
2317 last_pfn = page_to_pfn(page);
Daniel Vetter3bbbe702013-10-07 17:15:45 -03002318
2319 /* Check that the i965g/gm workaround works. */
2320 WARN_ON((gfp & __GFP_DMA32) && (last_pfn >= 0x00100000UL));
Eric Anholt673a3942008-07-30 12:06:12 -07002321 }
Chris Wilson871dfbd2016-10-11 09:20:21 +01002322 if (sg) /* loop terminated early; short sg table */
Konrad Rzeszutek Wilk426729d2013-06-24 11:47:48 -04002323 sg_mark_end(sg);
Chris Wilson74ce6b62012-10-19 15:51:06 +01002324 obj->pages = st;
2325
Imre Deake2273302015-07-09 12:59:05 +03002326 ret = i915_gem_gtt_prepare_object(obj);
2327 if (ret)
2328 goto err_pages;
2329
Eric Anholt673a3942008-07-30 12:06:12 -07002330 if (i915_gem_object_needs_bit17_swizzle(obj))
2331 i915_gem_object_do_bit_17_swizzle(obj);
2332
Chris Wilson3e510a82016-08-05 10:14:23 +01002333 if (i915_gem_object_is_tiled(obj) &&
Daniel Vetter656bfa32014-11-20 09:26:30 +01002334 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
2335 i915_gem_object_pin_pages(obj);
2336
Eric Anholt673a3942008-07-30 12:06:12 -07002337 return 0;
2338
2339err_pages:
Imre Deak90797e62013-02-18 19:28:03 +02002340 sg_mark_end(sg);
Dave Gordon85d12252016-05-20 11:54:06 +01002341 for_each_sgt_page(page, sgt_iter, st)
2342 put_page(page);
Chris Wilson9da3da62012-06-01 15:20:22 +01002343 sg_free_table(st);
2344 kfree(st);
Chris Wilson0820baf2014-03-25 13:23:03 +00002345
2346 /* shmemfs first checks if there is enough memory to allocate the page
2347 * and reports ENOSPC should there be insufficient, along with the usual
2348 * ENOMEM for a genuine allocation failure.
2349 *
2350 * We use ENOSPC in our driver to mean that we have run out of aperture
2351 * space and so want to translate the error from shmemfs back to our
2352 * usual understanding of ENOMEM.
2353 */
Imre Deake2273302015-07-09 12:59:05 +03002354 if (ret == -ENOSPC)
2355 ret = -ENOMEM;
2356
2357 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07002358}
2359
Chris Wilson37e680a2012-06-07 15:38:42 +01002360/* Ensure that the associated pages are gathered from the backing storage
2361 * and pinned into our object. i915_gem_object_get_pages() may be called
2362 * multiple times before they are released by a single call to
2363 * i915_gem_object_put_pages() - once the pages are no longer referenced
2364 * either as a result of memory pressure (reaping pages under the shrinker)
2365 * or as the object is itself released.
2366 */
2367int
2368i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
2369{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002370 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilson37e680a2012-06-07 15:38:42 +01002371 const struct drm_i915_gem_object_ops *ops = obj->ops;
2372 int ret;
2373
Chris Wilson2f745ad2012-09-04 21:02:58 +01002374 if (obj->pages)
Chris Wilson37e680a2012-06-07 15:38:42 +01002375 return 0;
2376
Chris Wilson43e28f02013-01-08 10:53:09 +00002377 if (obj->madv != I915_MADV_WILLNEED) {
Chris Wilsonbd9b6a42014-02-10 09:03:50 +00002378 DRM_DEBUG("Attempting to obtain a purgeable object\n");
Chris Wilson8c99e572014-01-31 11:34:58 +00002379 return -EFAULT;
Chris Wilson43e28f02013-01-08 10:53:09 +00002380 }
2381
Chris Wilsona5570172012-09-04 21:02:54 +01002382 BUG_ON(obj->pages_pin_count);
2383
Chris Wilson37e680a2012-06-07 15:38:42 +01002384 ret = ops->get_pages(obj);
2385 if (ret)
2386 return ret;
2387
Ben Widawsky35c20a62013-05-31 11:28:48 -07002388 list_add_tail(&obj->global_list, &dev_priv->mm.unbound_list);
Chris Wilsonee286372015-04-07 16:20:25 +01002389
2390 obj->get_page.sg = obj->pages->sgl;
2391 obj->get_page.last = 0;
2392
Chris Wilson37e680a2012-06-07 15:38:42 +01002393 return 0;
Eric Anholt673a3942008-07-30 12:06:12 -07002394}
2395
Dave Gordondd6034c2016-05-20 11:54:04 +01002396/* The 'mapping' part of i915_gem_object_pin_map() below */
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002397static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,
2398 enum i915_map_type type)
Dave Gordondd6034c2016-05-20 11:54:04 +01002399{
2400 unsigned long n_pages = obj->base.size >> PAGE_SHIFT;
2401 struct sg_table *sgt = obj->pages;
Dave Gordon85d12252016-05-20 11:54:06 +01002402 struct sgt_iter sgt_iter;
2403 struct page *page;
Dave Gordonb338fa42016-05-20 11:54:05 +01002404 struct page *stack_pages[32];
2405 struct page **pages = stack_pages;
Dave Gordondd6034c2016-05-20 11:54:04 +01002406 unsigned long i = 0;
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002407 pgprot_t pgprot;
Dave Gordondd6034c2016-05-20 11:54:04 +01002408 void *addr;
2409
2410 /* A single page can always be kmapped */
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002411 if (n_pages == 1 && type == I915_MAP_WB)
Dave Gordondd6034c2016-05-20 11:54:04 +01002412 return kmap(sg_page(sgt->sgl));
2413
Dave Gordonb338fa42016-05-20 11:54:05 +01002414 if (n_pages > ARRAY_SIZE(stack_pages)) {
2415 /* Too big for stack -- allocate temporary array instead */
2416 pages = drm_malloc_gfp(n_pages, sizeof(*pages), GFP_TEMPORARY);
2417 if (!pages)
2418 return NULL;
2419 }
Dave Gordondd6034c2016-05-20 11:54:04 +01002420
Dave Gordon85d12252016-05-20 11:54:06 +01002421 for_each_sgt_page(page, sgt_iter, sgt)
2422 pages[i++] = page;
Dave Gordondd6034c2016-05-20 11:54:04 +01002423
2424 /* Check that we have the expected number of pages */
2425 GEM_BUG_ON(i != n_pages);
2426
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002427 switch (type) {
2428 case I915_MAP_WB:
2429 pgprot = PAGE_KERNEL;
2430 break;
2431 case I915_MAP_WC:
2432 pgprot = pgprot_writecombine(PAGE_KERNEL_IO);
2433 break;
2434 }
2435 addr = vmap(pages, n_pages, 0, pgprot);
Dave Gordondd6034c2016-05-20 11:54:04 +01002436
Dave Gordonb338fa42016-05-20 11:54:05 +01002437 if (pages != stack_pages)
2438 drm_free_large(pages);
Dave Gordondd6034c2016-05-20 11:54:04 +01002439
2440 return addr;
2441}
2442
2443/* get, pin, and map the pages of the object into kernel space */
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002444void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
2445 enum i915_map_type type)
Chris Wilson0a798eb2016-04-08 12:11:11 +01002446{
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002447 enum i915_map_type has_type;
2448 bool pinned;
2449 void *ptr;
Chris Wilson0a798eb2016-04-08 12:11:11 +01002450 int ret;
2451
2452 lockdep_assert_held(&obj->base.dev->struct_mutex);
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002453 GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
Chris Wilson0a798eb2016-04-08 12:11:11 +01002454
2455 ret = i915_gem_object_get_pages(obj);
2456 if (ret)
2457 return ERR_PTR(ret);
2458
2459 i915_gem_object_pin_pages(obj);
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002460 pinned = obj->pages_pin_count > 1;
Chris Wilson0a798eb2016-04-08 12:11:11 +01002461
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002462 ptr = ptr_unpack_bits(obj->mapping, has_type);
2463 if (ptr && has_type != type) {
2464 if (pinned) {
2465 ret = -EBUSY;
2466 goto err;
Chris Wilson0a798eb2016-04-08 12:11:11 +01002467 }
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002468
2469 if (is_vmalloc_addr(ptr))
2470 vunmap(ptr);
2471 else
2472 kunmap(kmap_to_page(ptr));
2473
2474 ptr = obj->mapping = NULL;
Chris Wilson0a798eb2016-04-08 12:11:11 +01002475 }
2476
Chris Wilsond31d7cb2016-08-12 12:39:58 +01002477 if (!ptr) {
2478 ptr = i915_gem_object_map(obj, type);
2479 if (!ptr) {
2480 ret = -ENOMEM;
2481 goto err;
2482 }
2483
2484 obj->mapping = ptr_pack_bits(ptr, type);
2485 }
2486
2487 return ptr;
2488
2489err:
2490 i915_gem_object_unpin_pages(obj);
2491 return ERR_PTR(ret);
Chris Wilson0a798eb2016-04-08 12:11:11 +01002492}
2493
Chris Wilsoncaea7472010-11-12 13:53:37 +00002494static void
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002495i915_gem_object_retire__write(struct i915_gem_active *active,
2496 struct drm_i915_gem_request *request)
Chris Wilsonb4716182015-04-27 13:41:17 +01002497{
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002498 struct drm_i915_gem_object *obj =
2499 container_of(active, struct drm_i915_gem_object, last_write);
Chris Wilsonb4716182015-04-27 13:41:17 +01002500
Rodrigo Vivide152b62015-07-07 16:28:51 -07002501 intel_fb_obj_flush(obj, true, ORIGIN_CS);
Chris Wilsonb4716182015-04-27 13:41:17 +01002502}
2503
2504static void
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002505i915_gem_object_retire__read(struct i915_gem_active *active,
2506 struct drm_i915_gem_request *request)
Chris Wilsoncaea7472010-11-12 13:53:37 +00002507{
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002508 int idx = request->engine->id;
2509 struct drm_i915_gem_object *obj =
2510 container_of(active, struct drm_i915_gem_object, last_read[idx]);
Chris Wilsoncaea7472010-11-12 13:53:37 +00002511
Chris Wilson573adb32016-08-04 16:32:39 +01002512 GEM_BUG_ON(!i915_gem_object_has_active_engine(obj, idx));
Chris Wilsonb4716182015-04-27 13:41:17 +01002513
Chris Wilson573adb32016-08-04 16:32:39 +01002514 i915_gem_object_clear_active(obj, idx);
2515 if (i915_gem_object_is_active(obj))
Chris Wilsonb4716182015-04-27 13:41:17 +01002516 return;
Chris Wilson65ce3022012-07-20 12:41:02 +01002517
Chris Wilson6c246952015-07-27 10:26:26 +01002518 /* Bump our place on the bound list to keep it roughly in LRU order
2519 * so that we don't steal from recently used but inactive objects
2520 * (unless we are forced to ofc!)
2521 */
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002522 if (obj->bind_count)
2523 list_move_tail(&obj->global_list,
2524 &request->i915->mm.bound_list);
Chris Wilsoncaea7472010-11-12 13:53:37 +00002525
Chris Wilsonf8c417c2016-07-20 13:31:53 +01002526 i915_gem_object_put(obj);
Chris Wilsonc8725f32014-03-17 12:21:55 +00002527}
2528
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002529static bool i915_context_is_banned(const struct i915_gem_context *ctx)
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002530{
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002531 unsigned long elapsed;
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002532
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002533 if (ctx->hang_stats.banned)
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002534 return true;
2535
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002536 elapsed = get_seconds() - ctx->hang_stats.guilty_ts;
Chris Wilson676fa572014-12-24 08:13:39 -08002537 if (ctx->hang_stats.ban_period_seconds &&
2538 elapsed <= ctx->hang_stats.ban_period_seconds) {
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002539 DRM_DEBUG("context hanging too fast, banning!\n");
2540 return true;
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002541 }
2542
2543 return false;
2544}
2545
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002546static void i915_set_reset_status(struct i915_gem_context *ctx,
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002547 const bool guilty)
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002548{
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002549 struct i915_ctx_hang_stats *hs = &ctx->hang_stats;
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002550
2551 if (guilty) {
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002552 hs->banned = i915_context_is_banned(ctx);
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002553 hs->batch_active++;
2554 hs->guilty_ts = get_seconds();
2555 } else {
2556 hs->batch_pending++;
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002557 }
2558}
2559
Chris Wilson8d9fc7f2014-02-25 17:11:23 +02002560struct drm_i915_gem_request *
Tvrtko Ursulin0bc40be2016-03-16 11:00:37 +00002561i915_gem_find_active_request(struct intel_engine_cs *engine)
Chris Wilson9375e442010-09-19 12:21:28 +01002562{
Chris Wilson4db080f2013-12-04 11:37:09 +00002563 struct drm_i915_gem_request *request;
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002564
Chris Wilsonf69a02c2016-07-01 17:23:16 +01002565 /* We are called by the error capture and reset at a random
2566 * point in time. In particular, note that neither is crucially
2567 * ordered with an interrupt. After a hang, the GPU is dead and we
2568 * assume that no more writes can happen (we waited long enough for
2569 * all writes that were in transaction to be flushed) - adding an
2570 * extra delay for a recent interrupt is pointless. Hence, we do
2571 * not need an engine->irq_seqno_barrier() before the seqno reads.
2572 */
Chris Wilsonefdf7c02016-08-04 07:52:33 +01002573 list_for_each_entry(request, &engine->request_list, link) {
Chris Wilsonf69a02c2016-07-01 17:23:16 +01002574 if (i915_gem_request_completed(request))
Chris Wilson4db080f2013-12-04 11:37:09 +00002575 continue;
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002576
Chris Wilson5590af32016-09-09 14:11:54 +01002577 if (!i915_sw_fence_done(&request->submit))
2578 break;
2579
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002580 return request;
Chris Wilson4db080f2013-12-04 11:37:09 +00002581 }
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002582
2583 return NULL;
2584}
2585
Chris Wilson821ed7d2016-09-09 14:11:53 +01002586static void reset_request(struct drm_i915_gem_request *request)
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002587{
Chris Wilson821ed7d2016-09-09 14:11:53 +01002588 void *vaddr = request->ring->vaddr;
2589 u32 head;
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002590
Chris Wilson821ed7d2016-09-09 14:11:53 +01002591 /* As this request likely depends on state from the lost
2592 * context, clear out all the user operations leaving the
2593 * breadcrumb at the end (so we get the fence notifications).
2594 */
2595 head = request->head;
2596 if (request->postfix < head) {
2597 memset(vaddr + head, 0, request->ring->size - head);
2598 head = 0;
2599 }
2600 memset(vaddr + head, 0, request->postfix - head);
Chris Wilson4db080f2013-12-04 11:37:09 +00002601}
2602
Chris Wilson821ed7d2016-09-09 14:11:53 +01002603static void i915_gem_reset_engine(struct intel_engine_cs *engine)
Chris Wilson4db080f2013-12-04 11:37:09 +00002604{
Chris Wilsondcff85c2016-08-05 10:14:11 +01002605 struct drm_i915_gem_request *request;
Chris Wilson821ed7d2016-09-09 14:11:53 +01002606 struct i915_gem_context *incomplete_ctx;
2607 bool ring_hung;
Chris Wilson608c1a52015-09-03 13:01:40 +01002608
Chris Wilson821ed7d2016-09-09 14:11:53 +01002609 if (engine->irq_seqno_barrier)
2610 engine->irq_seqno_barrier(engine);
2611
2612 request = i915_gem_find_active_request(engine);
2613 if (!request)
2614 return;
2615
2616 ring_hung = engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG;
Chris Wilson77c60702016-10-04 21:11:29 +01002617 if (engine->hangcheck.seqno != intel_engine_get_seqno(engine))
2618 ring_hung = false;
2619
Chris Wilson821ed7d2016-09-09 14:11:53 +01002620 i915_set_reset_status(request->ctx, ring_hung);
2621 if (!ring_hung)
2622 return;
2623
2624 DRM_DEBUG_DRIVER("resetting %s to restart from tail of request 0x%x\n",
2625 engine->name, request->fence.seqno);
2626
2627 /* Setup the CS to resume from the breadcrumb of the hung request */
2628 engine->reset_hw(engine, request);
2629
2630 /* Users of the default context do not rely on logical state
2631 * preserved between batches. They have to emit full state on
2632 * every batch and so it is safe to execute queued requests following
2633 * the hang.
2634 *
2635 * Other contexts preserve state, now corrupt. We want to skip all
2636 * queued requests that reference the corrupt context.
2637 */
2638 incomplete_ctx = request->ctx;
2639 if (i915_gem_context_is_default(incomplete_ctx))
2640 return;
2641
2642 list_for_each_entry_continue(request, &engine->request_list, link)
2643 if (request->ctx == incomplete_ctx)
2644 reset_request(request);
2645}
2646
2647void i915_gem_reset(struct drm_i915_private *dev_priv)
2648{
2649 struct intel_engine_cs *engine;
Akash Goel3b3f1652016-10-13 22:44:48 +05302650 enum intel_engine_id id;
Chris Wilson821ed7d2016-09-09 14:11:53 +01002651
2652 i915_gem_retire_requests(dev_priv);
2653
Akash Goel3b3f1652016-10-13 22:44:48 +05302654 for_each_engine(engine, dev_priv, id)
Chris Wilson821ed7d2016-09-09 14:11:53 +01002655 i915_gem_reset_engine(engine);
2656
2657 i915_gem_restore_fences(&dev_priv->drm);
Chris Wilsonf2a91d12016-09-21 14:51:06 +01002658
2659 if (dev_priv->gt.awake) {
2660 intel_sanitize_gt_powersave(dev_priv);
2661 intel_enable_gt_powersave(dev_priv);
2662 if (INTEL_GEN(dev_priv) >= 6)
2663 gen6_rps_busy(dev_priv);
2664 }
Chris Wilson821ed7d2016-09-09 14:11:53 +01002665}
2666
2667static void nop_submit_request(struct drm_i915_gem_request *request)
2668{
2669}
2670
2671static void i915_gem_cleanup_engine(struct intel_engine_cs *engine)
2672{
2673 engine->submit_request = nop_submit_request;
Chris Wilson70c2a242016-09-09 14:11:46 +01002674
Chris Wilsonc4b09302016-07-20 09:21:10 +01002675 /* Mark all pending requests as complete so that any concurrent
2676 * (lockless) lookup doesn't try and wait upon the request as we
2677 * reset it.
2678 */
Chris Wilson87b723a2016-08-09 08:37:02 +01002679 intel_engine_init_seqno(engine, engine->last_submitted_seqno);
Chris Wilsonc4b09302016-07-20 09:21:10 +01002680
Ben Widawsky1d62bee2014-01-01 10:15:13 -08002681 /*
Oscar Mateodcb4c122014-11-13 10:28:10 +00002682 * Clear the execlists queue up before freeing the requests, as those
2683 * are the ones that keep the context and ringbuffer backing objects
2684 * pinned in place.
2685 */
Oscar Mateodcb4c122014-11-13 10:28:10 +00002686
Tomas Elf7de1691a2015-10-19 16:32:32 +01002687 if (i915.enable_execlists) {
Chris Wilson70c2a242016-09-09 14:11:46 +01002688 spin_lock(&engine->execlist_lock);
2689 INIT_LIST_HEAD(&engine->execlist_queue);
2690 i915_gem_request_put(engine->execlist_port[0].request);
2691 i915_gem_request_put(engine->execlist_port[1].request);
2692 memset(engine->execlist_port, 0, sizeof(engine->execlist_port));
2693 spin_unlock(&engine->execlist_lock);
Oscar Mateodcb4c122014-11-13 10:28:10 +00002694 }
2695
Chris Wilsonb913b332016-07-13 09:10:31 +01002696 engine->i915->gt.active_engines &= ~intel_engine_flag(engine);
Eric Anholt673a3942008-07-30 12:06:12 -07002697}
2698
Chris Wilson821ed7d2016-09-09 14:11:53 +01002699void i915_gem_set_wedged(struct drm_i915_private *dev_priv)
Eric Anholt673a3942008-07-30 12:06:12 -07002700{
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00002701 struct intel_engine_cs *engine;
Akash Goel3b3f1652016-10-13 22:44:48 +05302702 enum intel_engine_id id;
Eric Anholt673a3942008-07-30 12:06:12 -07002703
Chris Wilson821ed7d2016-09-09 14:11:53 +01002704 lockdep_assert_held(&dev_priv->drm.struct_mutex);
2705 set_bit(I915_WEDGED, &dev_priv->gpu_error.flags);
Chris Wilson4db080f2013-12-04 11:37:09 +00002706
Chris Wilson821ed7d2016-09-09 14:11:53 +01002707 i915_gem_context_lost(dev_priv);
Akash Goel3b3f1652016-10-13 22:44:48 +05302708 for_each_engine(engine, dev_priv, id)
Chris Wilson821ed7d2016-09-09 14:11:53 +01002709 i915_gem_cleanup_engine(engine);
Chris Wilsonb913b332016-07-13 09:10:31 +01002710 mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0);
Chris Wilsondfaae392010-09-22 10:31:52 +01002711
Chris Wilson821ed7d2016-09-09 14:11:53 +01002712 i915_gem_retire_requests(dev_priv);
Eric Anholt673a3942008-07-30 12:06:12 -07002713}
2714
Daniel Vetter75ef9da2010-08-21 00:25:16 +02002715static void
Eric Anholt673a3942008-07-30 12:06:12 -07002716i915_gem_retire_work_handler(struct work_struct *work)
2717{
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002718 struct drm_i915_private *dev_priv =
Chris Wilson67d97da2016-07-04 08:08:31 +01002719 container_of(work, typeof(*dev_priv), gt.retire_work.work);
Chris Wilson91c8a322016-07-05 10:40:23 +01002720 struct drm_device *dev = &dev_priv->drm;
Eric Anholt673a3942008-07-30 12:06:12 -07002721
Chris Wilson891b48c2010-09-29 12:26:37 +01002722 /* Come back later if the device is busy... */
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002723 if (mutex_trylock(&dev->struct_mutex)) {
Chris Wilson67d97da2016-07-04 08:08:31 +01002724 i915_gem_retire_requests(dev_priv);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002725 mutex_unlock(&dev->struct_mutex);
2726 }
Chris Wilson67d97da2016-07-04 08:08:31 +01002727
2728 /* Keep the retire handler running until we are finally idle.
2729 * We do not need to do this test under locking as in the worst-case
2730 * we queue the retire worker once too often.
2731 */
Chris Wilsonc9615612016-07-09 10:12:06 +01002732 if (READ_ONCE(dev_priv->gt.awake)) {
2733 i915_queue_hangcheck(dev_priv);
Chris Wilson67d97da2016-07-04 08:08:31 +01002734 queue_delayed_work(dev_priv->wq,
2735 &dev_priv->gt.retire_work,
Chris Wilsonbcb45082012-10-05 17:02:57 +01002736 round_jiffies_up_relative(HZ));
Chris Wilsonc9615612016-07-09 10:12:06 +01002737 }
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002738}
Chris Wilson891b48c2010-09-29 12:26:37 +01002739
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002740static void
2741i915_gem_idle_work_handler(struct work_struct *work)
2742{
2743 struct drm_i915_private *dev_priv =
Chris Wilson67d97da2016-07-04 08:08:31 +01002744 container_of(work, typeof(*dev_priv), gt.idle_work.work);
Chris Wilson91c8a322016-07-05 10:40:23 +01002745 struct drm_device *dev = &dev_priv->drm;
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002746 struct intel_engine_cs *engine;
Akash Goel3b3f1652016-10-13 22:44:48 +05302747 enum intel_engine_id id;
Chris Wilson67d97da2016-07-04 08:08:31 +01002748 bool rearm_hangcheck;
2749
2750 if (!READ_ONCE(dev_priv->gt.awake))
2751 return;
2752
2753 if (READ_ONCE(dev_priv->gt.active_engines))
2754 return;
2755
2756 rearm_hangcheck =
2757 cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
2758
2759 if (!mutex_trylock(&dev->struct_mutex)) {
2760 /* Currently busy, come back later */
2761 mod_delayed_work(dev_priv->wq,
2762 &dev_priv->gt.idle_work,
2763 msecs_to_jiffies(50));
2764 goto out_rearm;
2765 }
2766
2767 if (dev_priv->gt.active_engines)
2768 goto out_unlock;
Zou Nan haid1b851f2010-05-21 09:08:57 +08002769
Akash Goel3b3f1652016-10-13 22:44:48 +05302770 for_each_engine(engine, dev_priv, id)
Chris Wilson67d97da2016-07-04 08:08:31 +01002771 i915_gem_batch_pool_fini(&engine->batch_pool);
Zou Nan hai852835f2010-05-21 09:08:56 +08002772
Chris Wilson67d97da2016-07-04 08:08:31 +01002773 GEM_BUG_ON(!dev_priv->gt.awake);
2774 dev_priv->gt.awake = false;
2775 rearm_hangcheck = false;
Daniel Vetter30ecad72015-12-09 09:29:36 +01002776
Chris Wilson67d97da2016-07-04 08:08:31 +01002777 if (INTEL_GEN(dev_priv) >= 6)
2778 gen6_rps_idle(dev_priv);
2779 intel_runtime_pm_put(dev_priv);
2780out_unlock:
2781 mutex_unlock(&dev->struct_mutex);
Chris Wilson35c94182015-04-07 16:20:37 +01002782
Chris Wilson67d97da2016-07-04 08:08:31 +01002783out_rearm:
2784 if (rearm_hangcheck) {
2785 GEM_BUG_ON(!dev_priv->gt.awake);
2786 i915_queue_hangcheck(dev_priv);
Chris Wilson35c94182015-04-07 16:20:37 +01002787 }
Eric Anholt673a3942008-07-30 12:06:12 -07002788}
2789
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002790void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
2791{
2792 struct drm_i915_gem_object *obj = to_intel_bo(gem);
2793 struct drm_i915_file_private *fpriv = file->driver_priv;
2794 struct i915_vma *vma, *vn;
2795
2796 mutex_lock(&obj->base.dev->struct_mutex);
2797 list_for_each_entry_safe(vma, vn, &obj->vma_list, obj_link)
2798 if (vma->vm->file == fpriv)
2799 i915_vma_close(vma);
2800 mutex_unlock(&obj->base.dev->struct_mutex);
2801}
2802
Ben Widawsky5816d642012-04-11 11:18:19 -07002803/**
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002804 * i915_gem_wait_ioctl - implements DRM_IOCTL_I915_GEM_WAIT
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01002805 * @dev: drm device pointer
2806 * @data: ioctl data blob
2807 * @file: drm file pointer
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002808 *
2809 * Returns 0 if successful, else an error is returned with the remaining time in
2810 * the timeout parameter.
2811 * -ETIME: object is still busy after timeout
2812 * -ERESTARTSYS: signal interrupted the wait
2813 * -ENONENT: object doesn't exist
2814 * Also possible, but rare:
2815 * -EAGAIN: GPU wedged
2816 * -ENOMEM: damn
2817 * -ENODEV: Internal IRQ fail
2818 * -E?: The add request failed
2819 *
2820 * The wait ioctl with a timeout of 0 reimplements the busy ioctl. With any
2821 * non-zero timeout parameter the wait ioctl will wait for the given number of
2822 * nanoseconds on an object becoming unbusy. Since the wait itself does so
2823 * without holding struct_mutex the object may become re-busied before this
2824 * function completes. A similar but shorter * race condition exists in the busy
2825 * ioctl
2826 */
2827int
2828i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
2829{
2830 struct drm_i915_gem_wait *args = data;
Chris Wilson033d5492016-08-05 10:14:17 +01002831 struct intel_rps_client *rps = to_rps_client(file);
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002832 struct drm_i915_gem_object *obj;
Chris Wilson033d5492016-08-05 10:14:17 +01002833 unsigned long active;
2834 int idx, ret = 0;
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002835
Daniel Vetter11b5d512014-09-29 15:31:26 +02002836 if (args->flags != 0)
2837 return -EINVAL;
2838
Chris Wilson03ac0642016-07-20 13:31:51 +01002839 obj = i915_gem_object_lookup(file, args->bo_handle);
Chris Wilson033d5492016-08-05 10:14:17 +01002840 if (!obj)
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002841 return -ENOENT;
Chris Wilson033d5492016-08-05 10:14:17 +01002842
2843 active = __I915_BO_ACTIVE(obj);
2844 for_each_active(active, idx) {
2845 s64 *timeout = args->timeout_ns >= 0 ? &args->timeout_ns : NULL;
Chris Wilsonea746f32016-09-09 14:11:49 +01002846 ret = i915_gem_active_wait_unlocked(&obj->last_read[idx],
2847 I915_WAIT_INTERRUPTIBLE,
Chris Wilson033d5492016-08-05 10:14:17 +01002848 timeout, rps);
2849 if (ret)
2850 break;
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002851 }
2852
Chris Wilson033d5492016-08-05 10:14:17 +01002853 i915_gem_object_put_unlocked(obj);
John Harrisonff865882014-11-24 18:49:28 +00002854 return ret;
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002855}
2856
Chris Wilson8ef85612016-04-28 09:56:39 +01002857static void __i915_vma_iounmap(struct i915_vma *vma)
2858{
Chris Wilson20dfbde2016-08-04 16:32:30 +01002859 GEM_BUG_ON(i915_vma_is_pinned(vma));
Chris Wilson8ef85612016-04-28 09:56:39 +01002860
2861 if (vma->iomap == NULL)
2862 return;
2863
2864 io_mapping_unmap(vma->iomap);
2865 vma->iomap = NULL;
2866}
2867
Chris Wilsondf0e9a22016-08-04 07:52:47 +01002868int i915_vma_unbind(struct i915_vma *vma)
Eric Anholt673a3942008-07-30 12:06:12 -07002869{
Ben Widawsky07fe0b12013-07-31 17:00:10 -07002870 struct drm_i915_gem_object *obj = vma->obj;
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002871 unsigned long active;
Chris Wilson43e28f02013-01-08 10:53:09 +00002872 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07002873
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002874 /* First wait upon any activity as retiring the request may
2875 * have side-effects such as unpinning or even unbinding this vma.
2876 */
2877 active = i915_vma_get_active(vma);
Chris Wilsondf0e9a22016-08-04 07:52:47 +01002878 if (active) {
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002879 int idx;
2880
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002881 /* When a closed VMA is retired, it is unbound - eek.
2882 * In order to prevent it from being recursively closed,
2883 * take a pin on the vma so that the second unbind is
2884 * aborted.
2885 */
Chris Wilson20dfbde2016-08-04 16:32:30 +01002886 __i915_vma_pin(vma);
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002887
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002888 for_each_active(active, idx) {
2889 ret = i915_gem_active_retire(&vma->last_read[idx],
2890 &vma->vm->dev->struct_mutex);
2891 if (ret)
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002892 break;
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002893 }
2894
Chris Wilson20dfbde2016-08-04 16:32:30 +01002895 __i915_vma_unpin(vma);
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002896 if (ret)
2897 return ret;
2898
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002899 GEM_BUG_ON(i915_vma_is_active(vma));
2900 }
2901
Chris Wilson20dfbde2016-08-04 16:32:30 +01002902 if (i915_vma_is_pinned(vma))
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002903 return -EBUSY;
2904
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002905 if (!drm_mm_node_allocated(&vma->node))
2906 goto destroy;
Ben Widawsky433544b2013-08-13 18:09:06 -07002907
Chris Wilson15717de2016-08-04 07:52:26 +01002908 GEM_BUG_ON(obj->bind_count == 0);
2909 GEM_BUG_ON(!obj->pages);
Chris Wilsonc4670ad2012-08-20 10:23:27 +01002910
Chris Wilson05a20d02016-08-18 17:16:55 +01002911 if (i915_vma_is_map_and_fenceable(vma)) {
Daniel Vetter8b1bc9b2014-02-14 14:06:07 +01002912 /* release the fence reg _after_ flushing */
Chris Wilson49ef5292016-08-18 17:17:00 +01002913 ret = i915_vma_put_fence(vma);
Daniel Vetter8b1bc9b2014-02-14 14:06:07 +01002914 if (ret)
2915 return ret;
Chris Wilson8ef85612016-04-28 09:56:39 +01002916
Chris Wilsoncd3127d2016-08-18 17:17:09 +01002917 /* Force a pagefault for domain tracking on next user access */
2918 i915_gem_release_mmap(obj);
2919
Chris Wilson8ef85612016-04-28 09:56:39 +01002920 __i915_vma_iounmap(vma);
Chris Wilson05a20d02016-08-18 17:16:55 +01002921 vma->flags &= ~I915_VMA_CAN_FENCE;
Daniel Vetter8b1bc9b2014-02-14 14:06:07 +01002922 }
Daniel Vetter96b47b62009-12-15 17:50:00 +01002923
Chris Wilson50e046b2016-08-04 07:52:46 +01002924 if (likely(!vma->vm->closed)) {
2925 trace_i915_vma_unbind(vma);
2926 vma->vm->unbind_vma(vma);
2927 }
Chris Wilson3272db52016-08-04 16:32:32 +01002928 vma->flags &= ~(I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND);
Ben Widawsky6f65e292013-12-06 14:10:56 -08002929
Chris Wilson50e046b2016-08-04 07:52:46 +01002930 drm_mm_remove_node(&vma->node);
2931 list_move_tail(&vma->vm_link, &vma->vm->unbound_list);
2932
Chris Wilson05a20d02016-08-18 17:16:55 +01002933 if (vma->pages != obj->pages) {
2934 GEM_BUG_ON(!vma->pages);
2935 sg_free_table(vma->pages);
2936 kfree(vma->pages);
Tvrtko Ursulinfe14d5f2014-12-10 17:27:58 +00002937 }
Chris Wilson247177d2016-08-15 10:48:47 +01002938 vma->pages = NULL;
Eric Anholt673a3942008-07-30 12:06:12 -07002939
Ben Widawsky2f633152013-07-17 12:19:03 -07002940 /* Since the unbound list is global, only move to that list if
Daniel Vetterb93dab62013-08-26 11:23:47 +02002941 * no more VMAs exist. */
Chris Wilson15717de2016-08-04 07:52:26 +01002942 if (--obj->bind_count == 0)
2943 list_move_tail(&obj->global_list,
2944 &to_i915(obj->base.dev)->mm.unbound_list);
Eric Anholt673a3942008-07-30 12:06:12 -07002945
Chris Wilson70903c32013-12-04 09:59:09 +00002946 /* And finally now the object is completely decoupled from this vma,
2947 * we can drop its hold on the backing storage and allow it to be
2948 * reaped by the shrinker.
2949 */
2950 i915_gem_object_unpin_pages(obj);
2951
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002952destroy:
Chris Wilson3272db52016-08-04 16:32:32 +01002953 if (unlikely(i915_vma_is_closed(vma)))
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002954 i915_vma_destroy(vma);
2955
Chris Wilson88241782011-01-07 17:09:48 +00002956 return 0;
Chris Wilson54cf91d2010-11-25 18:00:26 +00002957}
2958
Chris Wilsondcff85c2016-08-05 10:14:11 +01002959int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
Chris Wilsonea746f32016-09-09 14:11:49 +01002960 unsigned int flags)
Daniel Vetter4df2faf2010-02-19 11:52:00 +01002961{
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00002962 struct intel_engine_cs *engine;
Akash Goel3b3f1652016-10-13 22:44:48 +05302963 enum intel_engine_id id;
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002964 int ret;
Daniel Vetter4df2faf2010-02-19 11:52:00 +01002965
Akash Goel3b3f1652016-10-13 22:44:48 +05302966 for_each_engine(engine, dev_priv, id) {
Chris Wilson62e63002016-06-24 14:55:52 +01002967 if (engine->last_context == NULL)
2968 continue;
2969
Chris Wilsonea746f32016-09-09 14:11:49 +01002970 ret = intel_engine_idle(engine, flags);
Chris Wilson1ec14ad2010-12-04 11:30:53 +00002971 if (ret)
2972 return ret;
2973 }
Zou Nan haid1b851f2010-05-21 09:08:57 +08002974
Daniel Vetter8a1a49f2010-02-11 22:29:04 +01002975 return 0;
Daniel Vetter4df2faf2010-02-19 11:52:00 +01002976}
2977
Chris Wilson4144f9b2014-09-11 08:43:48 +01002978static bool i915_gem_valid_gtt_space(struct i915_vma *vma,
Chris Wilson42d6ab42012-07-26 11:49:32 +01002979 unsigned long cache_level)
2980{
Chris Wilson4144f9b2014-09-11 08:43:48 +01002981 struct drm_mm_node *gtt_space = &vma->node;
Chris Wilson42d6ab42012-07-26 11:49:32 +01002982 struct drm_mm_node *other;
2983
Chris Wilson4144f9b2014-09-11 08:43:48 +01002984 /*
2985 * On some machines we have to be careful when putting differing types
2986 * of snoopable memory together to avoid the prefetcher crossing memory
2987 * domains and dying. During vm initialisation, we decide whether or not
2988 * these constraints apply and set the drm_mm.color_adjust
2989 * appropriately.
Chris Wilson42d6ab42012-07-26 11:49:32 +01002990 */
Chris Wilson4144f9b2014-09-11 08:43:48 +01002991 if (vma->vm->mm.color_adjust == NULL)
Chris Wilson42d6ab42012-07-26 11:49:32 +01002992 return true;
2993
Ben Widawskyc6cfb322013-07-05 14:41:06 -07002994 if (!drm_mm_node_allocated(gtt_space))
Chris Wilson42d6ab42012-07-26 11:49:32 +01002995 return true;
2996
2997 if (list_empty(&gtt_space->node_list))
2998 return true;
2999
3000 other = list_entry(gtt_space->node_list.prev, struct drm_mm_node, node_list);
3001 if (other->allocated && !other->hole_follows && other->color != cache_level)
3002 return false;
3003
3004 other = list_entry(gtt_space->node_list.next, struct drm_mm_node, node_list);
3005 if (other->allocated && !gtt_space->hole_follows && other->color != cache_level)
3006 return false;
3007
3008 return true;
3009}
3010
Jesse Barnesde151cf2008-11-12 10:03:55 -08003011/**
Chris Wilson59bfa122016-08-04 16:32:31 +01003012 * i915_vma_insert - finds a slot for the vma in its address space
3013 * @vma: the vma
Chris Wilson91b2db62016-08-04 16:32:23 +01003014 * @size: requested size in bytes (can be larger than the VMA)
Chris Wilson59bfa122016-08-04 16:32:31 +01003015 * @alignment: required alignment
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003016 * @flags: mask of PIN_* flags to use
Chris Wilson59bfa122016-08-04 16:32:31 +01003017 *
3018 * First we try to allocate some free space that meets the requirements for
3019 * the VMA. Failiing that, if the flags permit, it will evict an old VMA,
3020 * preferrably the oldest idle entry to make room for the new VMA.
3021 *
3022 * Returns:
3023 * 0 on success, negative error code otherwise.
Eric Anholt673a3942008-07-30 12:06:12 -07003024 */
Chris Wilson59bfa122016-08-04 16:32:31 +01003025static int
3026i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
Eric Anholt673a3942008-07-30 12:06:12 -07003027{
Chris Wilson59bfa122016-08-04 16:32:31 +01003028 struct drm_i915_private *dev_priv = to_i915(vma->vm->dev);
3029 struct drm_i915_gem_object *obj = vma->obj;
Chris Wilsonde180032016-08-04 16:32:29 +01003030 u64 start, end;
Chris Wilson07f73f62009-09-14 16:50:30 +01003031 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003032
Chris Wilson3272db52016-08-04 16:32:32 +01003033 GEM_BUG_ON(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND));
Chris Wilson59bfa122016-08-04 16:32:31 +01003034 GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003035
Chris Wilsonde180032016-08-04 16:32:29 +01003036 size = max(size, vma->size);
3037 if (flags & PIN_MAPPABLE)
Chris Wilson3e510a82016-08-05 10:14:23 +01003038 size = i915_gem_get_ggtt_size(dev_priv, size,
3039 i915_gem_object_get_tiling(obj));
Joonas Lahtinen91e67112015-05-06 14:33:58 +03003040
Chris Wilsond8923dc2016-08-18 17:17:07 +01003041 alignment = max(max(alignment, vma->display_alignment),
3042 i915_gem_get_ggtt_alignment(dev_priv, size,
3043 i915_gem_object_get_tiling(obj),
3044 flags & PIN_MAPPABLE));
Chris Wilsona00b10c2010-09-24 21:15:47 +01003045
Michel Thierry101b5062015-10-01 13:33:57 +01003046 start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0;
Chris Wilsonde180032016-08-04 16:32:29 +01003047
3048 end = vma->vm->total;
Michel Thierry101b5062015-10-01 13:33:57 +01003049 if (flags & PIN_MAPPABLE)
Chris Wilson91b2db62016-08-04 16:32:23 +01003050 end = min_t(u64, end, dev_priv->ggtt.mappable_end);
Michel Thierry101b5062015-10-01 13:33:57 +01003051 if (flags & PIN_ZONE_4G)
Michel Thierry48ea1e32016-01-11 11:39:27 +00003052 end = min_t(u64, end, (1ULL << 32) - PAGE_SIZE);
Michel Thierry101b5062015-10-01 13:33:57 +01003053
Joonas Lahtinen91e67112015-05-06 14:33:58 +03003054 /* If binding the object/GGTT view requires more space than the entire
3055 * aperture has, reject it early before evicting everything in a vain
3056 * attempt to find space.
Chris Wilson654fc602010-05-27 13:18:21 +01003057 */
Joonas Lahtinen91e67112015-05-06 14:33:58 +03003058 if (size > end) {
Chris Wilsonde180032016-08-04 16:32:29 +01003059 DRM_DEBUG("Attempting to bind an object larger than the aperture: request=%llu [object=%zd] > %s aperture=%llu\n",
Chris Wilson91b2db62016-08-04 16:32:23 +01003060 size, obj->base.size,
Daniel Vetter1ec9e262014-02-14 14:01:11 +01003061 flags & PIN_MAPPABLE ? "mappable" : "total",
Chris Wilsond23db882014-05-23 08:48:08 +02003062 end);
Chris Wilson59bfa122016-08-04 16:32:31 +01003063 return -E2BIG;
Chris Wilson654fc602010-05-27 13:18:21 +01003064 }
3065
Chris Wilson37e680a2012-06-07 15:38:42 +01003066 ret = i915_gem_object_get_pages(obj);
Chris Wilson6c085a72012-08-20 11:40:46 +02003067 if (ret)
Chris Wilson59bfa122016-08-04 16:32:31 +01003068 return ret;
Chris Wilson6c085a72012-08-20 11:40:46 +02003069
Chris Wilsonfbdda6f2012-11-20 10:45:16 +00003070 i915_gem_object_pin_pages(obj);
3071
Chris Wilson506a8e82015-12-08 11:55:07 +00003072 if (flags & PIN_OFFSET_FIXED) {
Chris Wilson59bfa122016-08-04 16:32:31 +01003073 u64 offset = flags & PIN_OFFSET_MASK;
Chris Wilsonde180032016-08-04 16:32:29 +01003074 if (offset & (alignment - 1) || offset > end - size) {
Chris Wilson506a8e82015-12-08 11:55:07 +00003075 ret = -EINVAL;
Chris Wilsonde180032016-08-04 16:32:29 +01003076 goto err_unpin;
Chris Wilson506a8e82015-12-08 11:55:07 +00003077 }
Chris Wilsonde180032016-08-04 16:32:29 +01003078
Chris Wilson506a8e82015-12-08 11:55:07 +00003079 vma->node.start = offset;
3080 vma->node.size = size;
3081 vma->node.color = obj->cache_level;
Chris Wilsonde180032016-08-04 16:32:29 +01003082 ret = drm_mm_reserve_node(&vma->vm->mm, &vma->node);
Chris Wilson506a8e82015-12-08 11:55:07 +00003083 if (ret) {
3084 ret = i915_gem_evict_for_vma(vma);
3085 if (ret == 0)
Chris Wilsonde180032016-08-04 16:32:29 +01003086 ret = drm_mm_reserve_node(&vma->vm->mm, &vma->node);
3087 if (ret)
3088 goto err_unpin;
Chris Wilson506a8e82015-12-08 11:55:07 +00003089 }
Michel Thierry101b5062015-10-01 13:33:57 +01003090 } else {
Chris Wilsonde180032016-08-04 16:32:29 +01003091 u32 search_flag, alloc_flag;
3092
Chris Wilson506a8e82015-12-08 11:55:07 +00003093 if (flags & PIN_HIGH) {
3094 search_flag = DRM_MM_SEARCH_BELOW;
3095 alloc_flag = DRM_MM_CREATE_TOP;
3096 } else {
3097 search_flag = DRM_MM_SEARCH_DEFAULT;
3098 alloc_flag = DRM_MM_CREATE_DEFAULT;
3099 }
Michel Thierry101b5062015-10-01 13:33:57 +01003100
Chris Wilson954c4692016-08-04 16:32:26 +01003101 /* We only allocate in PAGE_SIZE/GTT_PAGE_SIZE (4096) chunks,
3102 * so we know that we always have a minimum alignment of 4096.
3103 * The drm_mm range manager is optimised to return results
3104 * with zero alignment, so where possible use the optimal
3105 * path.
3106 */
3107 if (alignment <= 4096)
3108 alignment = 0;
3109
Ben Widawsky0a9ae0d2013-05-25 12:26:35 -07003110search_free:
Chris Wilsonde180032016-08-04 16:32:29 +01003111 ret = drm_mm_insert_node_in_range_generic(&vma->vm->mm,
3112 &vma->node,
Chris Wilson506a8e82015-12-08 11:55:07 +00003113 size, alignment,
3114 obj->cache_level,
3115 start, end,
3116 search_flag,
3117 alloc_flag);
3118 if (ret) {
Chris Wilsonde180032016-08-04 16:32:29 +01003119 ret = i915_gem_evict_something(vma->vm, size, alignment,
Chris Wilson506a8e82015-12-08 11:55:07 +00003120 obj->cache_level,
3121 start, end,
3122 flags);
3123 if (ret == 0)
3124 goto search_free;
Chris Wilson97311292009-09-21 00:22:34 +01003125
Chris Wilsonde180032016-08-04 16:32:29 +01003126 goto err_unpin;
Chris Wilson506a8e82015-12-08 11:55:07 +00003127 }
Chris Wilsonad16d2e2016-10-13 09:55:04 +01003128
3129 GEM_BUG_ON(vma->node.start < start);
3130 GEM_BUG_ON(vma->node.start + vma->node.size > end);
Chris Wilsondc9dd7a2012-12-07 20:37:07 +00003131 }
Chris Wilson37508582016-08-04 16:32:24 +01003132 GEM_BUG_ON(!i915_gem_valid_gtt_space(vma, obj->cache_level));
Eric Anholt673a3942008-07-30 12:06:12 -07003133
Ben Widawsky35c20a62013-05-31 11:28:48 -07003134 list_move_tail(&obj->global_list, &dev_priv->mm.bound_list);
Chris Wilsonde180032016-08-04 16:32:29 +01003135 list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
Chris Wilson15717de2016-08-04 07:52:26 +01003136 obj->bind_count++;
Chris Wilsonbf1a1092010-08-07 11:01:20 +01003137
Chris Wilson59bfa122016-08-04 16:32:31 +01003138 return 0;
Ben Widawsky2f633152013-07-17 12:19:03 -07003139
Daniel Vetterbc6bc152013-07-22 12:12:38 +02003140err_unpin:
Ben Widawsky2f633152013-07-17 12:19:03 -07003141 i915_gem_object_unpin_pages(obj);
Chris Wilson59bfa122016-08-04 16:32:31 +01003142 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003143}
3144
Chris Wilson000433b2013-08-08 14:41:09 +01003145bool
Chris Wilson2c225692013-08-09 12:26:45 +01003146i915_gem_clflush_object(struct drm_i915_gem_object *obj,
3147 bool force)
Eric Anholt673a3942008-07-30 12:06:12 -07003148{
Eric Anholt673a3942008-07-30 12:06:12 -07003149 /* If we don't have a page list set up, then we're not pinned
3150 * to GPU, and we can ignore the cache flush because it'll happen
3151 * again at bind time.
3152 */
Chris Wilson05394f32010-11-08 19:18:58 +00003153 if (obj->pages == NULL)
Chris Wilson000433b2013-08-08 14:41:09 +01003154 return false;
Eric Anholt673a3942008-07-30 12:06:12 -07003155
Imre Deak769ce462013-02-13 21:56:05 +02003156 /*
3157 * Stolen memory is always coherent with the GPU as it is explicitly
3158 * marked as wc by the system, or the system is cache-coherent.
3159 */
Chris Wilson6a2c4232014-11-04 04:51:40 -08003160 if (obj->stolen || obj->phys_handle)
Chris Wilson000433b2013-08-08 14:41:09 +01003161 return false;
Imre Deak769ce462013-02-13 21:56:05 +02003162
Chris Wilson9c23f7f2011-03-29 16:59:52 -07003163 /* If the GPU is snooping the contents of the CPU cache,
3164 * we do not need to manually clear the CPU cache lines. However,
3165 * the caches are only snooped when the render cache is
3166 * flushed/invalidated. As we always have to emit invalidations
3167 * and flushes when moving into and out of the RENDER domain, correct
3168 * snooping behaviour occurs naturally as the result of our domain
3169 * tracking.
3170 */
Chris Wilson0f719792015-01-13 13:32:52 +00003171 if (!force && cpu_cache_is_coherent(obj->base.dev, obj->cache_level)) {
3172 obj->cache_dirty = true;
Chris Wilson000433b2013-08-08 14:41:09 +01003173 return false;
Chris Wilson0f719792015-01-13 13:32:52 +00003174 }
Chris Wilson9c23f7f2011-03-29 16:59:52 -07003175
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003176 trace_i915_gem_object_clflush(obj);
Chris Wilson9da3da62012-06-01 15:20:22 +01003177 drm_clflush_sg(obj->pages);
Chris Wilson0f719792015-01-13 13:32:52 +00003178 obj->cache_dirty = false;
Chris Wilson000433b2013-08-08 14:41:09 +01003179
3180 return true;
Eric Anholte47c68e2008-11-14 13:35:19 -08003181}
3182
3183/** Flushes the GTT write domain for the object if it's dirty. */
3184static void
Chris Wilson05394f32010-11-08 19:18:58 +00003185i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
Eric Anholte47c68e2008-11-14 13:35:19 -08003186{
Chris Wilson3b5724d2016-08-18 17:16:49 +01003187 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003188
Chris Wilson05394f32010-11-08 19:18:58 +00003189 if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
Eric Anholte47c68e2008-11-14 13:35:19 -08003190 return;
3191
Chris Wilson63256ec2011-01-04 18:42:07 +00003192 /* No actual flushing is required for the GTT write domain. Writes
Chris Wilson3b5724d2016-08-18 17:16:49 +01003193 * to it "immediately" go to main memory as far as we know, so there's
Eric Anholte47c68e2008-11-14 13:35:19 -08003194 * no chipset flush. It also doesn't land in render cache.
Chris Wilson63256ec2011-01-04 18:42:07 +00003195 *
3196 * However, we do have to enforce the order so that all writes through
3197 * the GTT land before any writes to the device, such as updates to
3198 * the GATT itself.
Chris Wilson3b5724d2016-08-18 17:16:49 +01003199 *
3200 * We also have to wait a bit for the writes to land from the GTT.
3201 * An uncached read (i.e. mmio) seems to be ideal for the round-trip
3202 * timing. This issue has only been observed when switching quickly
3203 * between GTT writes and CPU reads from inside the kernel on recent hw,
3204 * and it appears to only affect discrete GTT blocks (i.e. on LLC
3205 * system agents we cannot reproduce this behaviour).
Eric Anholte47c68e2008-11-14 13:35:19 -08003206 */
Chris Wilson63256ec2011-01-04 18:42:07 +00003207 wmb();
Chris Wilson3b5724d2016-08-18 17:16:49 +01003208 if (INTEL_GEN(dev_priv) >= 6 && !HAS_LLC(dev_priv))
Akash Goel3b3f1652016-10-13 22:44:48 +05303209 POSTING_READ(RING_ACTHD(dev_priv->engine[RCS]->mmio_base));
Chris Wilson63256ec2011-01-04 18:42:07 +00003210
Chris Wilsond243ad82016-08-18 17:16:44 +01003211 intel_fb_obj_flush(obj, false, write_origin(obj, I915_GEM_DOMAIN_GTT));
Daniel Vetterf99d7062014-06-19 16:01:59 +02003212
Chris Wilsonb0dc4652016-08-18 17:16:51 +01003213 obj->base.write_domain = 0;
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003214 trace_i915_gem_object_change_domain(obj,
Chris Wilson05394f32010-11-08 19:18:58 +00003215 obj->base.read_domains,
Chris Wilsonb0dc4652016-08-18 17:16:51 +01003216 I915_GEM_DOMAIN_GTT);
Eric Anholte47c68e2008-11-14 13:35:19 -08003217}
3218
3219/** Flushes the CPU write domain for the object if it's dirty. */
3220static void
Daniel Vettere62b59e2015-01-21 14:53:48 +01003221i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
Eric Anholte47c68e2008-11-14 13:35:19 -08003222{
Chris Wilson05394f32010-11-08 19:18:58 +00003223 if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
Eric Anholte47c68e2008-11-14 13:35:19 -08003224 return;
3225
Daniel Vettere62b59e2015-01-21 14:53:48 +01003226 if (i915_gem_clflush_object(obj, obj->pin_display))
Chris Wilsonc0336662016-05-06 15:40:21 +01003227 i915_gem_chipset_flush(to_i915(obj->base.dev));
Chris Wilson000433b2013-08-08 14:41:09 +01003228
Rodrigo Vivide152b62015-07-07 16:28:51 -07003229 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Daniel Vetterf99d7062014-06-19 16:01:59 +02003230
Chris Wilsonb0dc4652016-08-18 17:16:51 +01003231 obj->base.write_domain = 0;
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003232 trace_i915_gem_object_change_domain(obj,
Chris Wilson05394f32010-11-08 19:18:58 +00003233 obj->base.read_domains,
Chris Wilsonb0dc4652016-08-18 17:16:51 +01003234 I915_GEM_DOMAIN_CPU);
Eric Anholte47c68e2008-11-14 13:35:19 -08003235}
3236
Chris Wilson383d5822016-08-18 17:17:08 +01003237static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)
3238{
3239 struct i915_vma *vma;
3240
3241 list_for_each_entry(vma, &obj->vma_list, obj_link) {
3242 if (!i915_vma_is_ggtt(vma))
3243 continue;
3244
3245 if (i915_vma_is_active(vma))
3246 continue;
3247
3248 if (!drm_mm_node_allocated(&vma->node))
3249 continue;
3250
3251 list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
3252 }
3253}
3254
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003255/**
3256 * Moves a single object to the GTT read, and possibly write domain.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003257 * @obj: object to act on
3258 * @write: ask for write access or read only
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003259 *
3260 * This function returns when the move is complete, including waiting on
3261 * flushes to occur.
3262 */
Jesse Barnes79e53942008-11-07 14:24:08 -08003263int
Chris Wilson20217462010-11-23 15:26:33 +00003264i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003265{
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003266 uint32_t old_write_domain, old_read_domains;
Eric Anholte47c68e2008-11-14 13:35:19 -08003267 int ret;
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003268
Chris Wilson0201f1e2012-07-20 12:41:01 +01003269 ret = i915_gem_object_wait_rendering(obj, !write);
Chris Wilson88241782011-01-07 17:09:48 +00003270 if (ret)
3271 return ret;
3272
Chris Wilsonc13d87e2016-07-20 09:21:15 +01003273 if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
3274 return 0;
3275
Chris Wilson43566de2015-01-02 16:29:29 +05303276 /* Flush and acquire obj->pages so that we are coherent through
3277 * direct access in memory with previous cached writes through
3278 * shmemfs and that our cache domain tracking remains valid.
3279 * For example, if the obj->filp was moved to swap without us
3280 * being notified and releasing the pages, we would mistakenly
3281 * continue to assume that the obj remained out of the CPU cached
3282 * domain.
3283 */
3284 ret = i915_gem_object_get_pages(obj);
3285 if (ret)
3286 return ret;
3287
Daniel Vettere62b59e2015-01-21 14:53:48 +01003288 i915_gem_object_flush_cpu_write_domain(obj);
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003289
Chris Wilsond0a57782012-10-09 19:24:37 +01003290 /* Serialise direct access to this object with the barriers for
3291 * coherent writes from the GPU, by effectively invalidating the
3292 * GTT domain upon first access.
3293 */
3294 if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
3295 mb();
3296
Chris Wilson05394f32010-11-08 19:18:58 +00003297 old_write_domain = obj->base.write_domain;
3298 old_read_domains = obj->base.read_domains;
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003299
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003300 /* It should now be out of any other write domains, and we can update
3301 * the domain values for our changes.
3302 */
Chris Wilson05394f32010-11-08 19:18:58 +00003303 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
3304 obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
Eric Anholte47c68e2008-11-14 13:35:19 -08003305 if (write) {
Chris Wilson05394f32010-11-08 19:18:58 +00003306 obj->base.read_domains = I915_GEM_DOMAIN_GTT;
3307 obj->base.write_domain = I915_GEM_DOMAIN_GTT;
3308 obj->dirty = 1;
Eric Anholte47c68e2008-11-14 13:35:19 -08003309 }
3310
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003311 trace_i915_gem_object_change_domain(obj,
3312 old_read_domains,
3313 old_write_domain);
3314
Chris Wilson8325a092012-04-24 15:52:35 +01003315 /* And bump the LRU for this access */
Chris Wilson383d5822016-08-18 17:17:08 +01003316 i915_gem_object_bump_inactive_ggtt(obj);
Chris Wilson8325a092012-04-24 15:52:35 +01003317
Eric Anholte47c68e2008-11-14 13:35:19 -08003318 return 0;
3319}
3320
Chris Wilsonef55f922015-10-09 14:11:27 +01003321/**
3322 * Changes the cache-level of an object across all VMA.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003323 * @obj: object to act on
3324 * @cache_level: new cache level to set for the object
Chris Wilsonef55f922015-10-09 14:11:27 +01003325 *
3326 * After this function returns, the object will be in the new cache-level
3327 * across all GTT and the contents of the backing storage will be coherent,
3328 * with respect to the new cache-level. In order to keep the backing storage
3329 * coherent for all users, we only allow a single cache level to be set
3330 * globally on the object and prevent it from being changed whilst the
3331 * hardware is reading from the object. That is if the object is currently
3332 * on the scanout it will be set to uncached (or equivalent display
3333 * cache coherency) and all non-MOCS GPU access will also be uncached so
3334 * that all direct access to the scanout remains coherent.
3335 */
Chris Wilsone4ffd172011-04-04 09:44:39 +01003336int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
3337 enum i915_cache_level cache_level)
3338{
Chris Wilsonaa653a62016-08-04 07:52:27 +01003339 struct i915_vma *vma;
Ville Syrjäläed75a552015-08-11 19:47:10 +03003340 int ret = 0;
Chris Wilsone4ffd172011-04-04 09:44:39 +01003341
3342 if (obj->cache_level == cache_level)
Ville Syrjäläed75a552015-08-11 19:47:10 +03003343 goto out;
Chris Wilsone4ffd172011-04-04 09:44:39 +01003344
Chris Wilsonef55f922015-10-09 14:11:27 +01003345 /* Inspect the list of currently bound VMA and unbind any that would
3346 * be invalid given the new cache-level. This is principally to
3347 * catch the issue of the CS prefetch crossing page boundaries and
3348 * reading an invalid PTE on older architectures.
3349 */
Chris Wilsonaa653a62016-08-04 07:52:27 +01003350restart:
3351 list_for_each_entry(vma, &obj->vma_list, obj_link) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003352 if (!drm_mm_node_allocated(&vma->node))
3353 continue;
3354
Chris Wilson20dfbde2016-08-04 16:32:30 +01003355 if (i915_vma_is_pinned(vma)) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003356 DRM_DEBUG("can not change the cache level of pinned objects\n");
3357 return -EBUSY;
3358 }
3359
Chris Wilsonaa653a62016-08-04 07:52:27 +01003360 if (i915_gem_valid_gtt_space(vma, cache_level))
3361 continue;
3362
3363 ret = i915_vma_unbind(vma);
3364 if (ret)
3365 return ret;
3366
3367 /* As unbinding may affect other elements in the
3368 * obj->vma_list (due to side-effects from retiring
3369 * an active vma), play safe and restart the iterator.
3370 */
3371 goto restart;
Chris Wilson42d6ab42012-07-26 11:49:32 +01003372 }
3373
Chris Wilsonef55f922015-10-09 14:11:27 +01003374 /* We can reuse the existing drm_mm nodes but need to change the
3375 * cache-level on the PTE. We could simply unbind them all and
3376 * rebind with the correct cache-level on next use. However since
3377 * we already have a valid slot, dma mapping, pages etc, we may as
3378 * rewrite the PTE in the belief that doing so tramples upon less
3379 * state and so involves less work.
3380 */
Chris Wilson15717de2016-08-04 07:52:26 +01003381 if (obj->bind_count) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003382 /* Before we change the PTE, the GPU must not be accessing it.
3383 * If we wait upon the object, we know that all the bound
3384 * VMA are no longer active.
3385 */
Chris Wilson2e2f3512015-04-27 13:41:14 +01003386 ret = i915_gem_object_wait_rendering(obj, false);
Chris Wilsone4ffd172011-04-04 09:44:39 +01003387 if (ret)
3388 return ret;
3389
Chris Wilsonaa653a62016-08-04 07:52:27 +01003390 if (!HAS_LLC(obj->base.dev) && cache_level != I915_CACHE_NONE) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003391 /* Access to snoopable pages through the GTT is
3392 * incoherent and on some machines causes a hard
3393 * lockup. Relinquish the CPU mmaping to force
3394 * userspace to refault in the pages and we can
3395 * then double check if the GTT mapping is still
3396 * valid for that pointer access.
3397 */
3398 i915_gem_release_mmap(obj);
Chris Wilsone4ffd172011-04-04 09:44:39 +01003399
Chris Wilsonef55f922015-10-09 14:11:27 +01003400 /* As we no longer need a fence for GTT access,
3401 * we can relinquish it now (and so prevent having
3402 * to steal a fence from someone else on the next
3403 * fence request). Note GPU activity would have
3404 * dropped the fence as all snoopable access is
3405 * supposed to be linear.
3406 */
Chris Wilson49ef5292016-08-18 17:17:00 +01003407 list_for_each_entry(vma, &obj->vma_list, obj_link) {
3408 ret = i915_vma_put_fence(vma);
3409 if (ret)
3410 return ret;
3411 }
Chris Wilsonef55f922015-10-09 14:11:27 +01003412 } else {
3413 /* We either have incoherent backing store and
3414 * so no GTT access or the architecture is fully
3415 * coherent. In such cases, existing GTT mmaps
3416 * ignore the cache bit in the PTE and we can
3417 * rewrite it without confusing the GPU or having
3418 * to force userspace to fault back in its mmaps.
3419 */
Chris Wilsone4ffd172011-04-04 09:44:39 +01003420 }
3421
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00003422 list_for_each_entry(vma, &obj->vma_list, obj_link) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003423 if (!drm_mm_node_allocated(&vma->node))
3424 continue;
3425
3426 ret = i915_vma_bind(vma, cache_level, PIN_UPDATE);
3427 if (ret)
3428 return ret;
3429 }
Chris Wilsone4ffd172011-04-04 09:44:39 +01003430 }
3431
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00003432 list_for_each_entry(vma, &obj->vma_list, obj_link)
Chris Wilson2c225692013-08-09 12:26:45 +01003433 vma->node.color = cache_level;
3434 obj->cache_level = cache_level;
3435
Ville Syrjäläed75a552015-08-11 19:47:10 +03003436out:
Chris Wilsonef55f922015-10-09 14:11:27 +01003437 /* Flush the dirty CPU caches to the backing storage so that the
3438 * object is now coherent at its new cache level (with respect
3439 * to the access domain).
3440 */
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05303441 if (obj->cache_dirty && cpu_write_needs_clflush(obj)) {
Chris Wilson0f719792015-01-13 13:32:52 +00003442 if (i915_gem_clflush_object(obj, true))
Chris Wilsonc0336662016-05-06 15:40:21 +01003443 i915_gem_chipset_flush(to_i915(obj->base.dev));
Chris Wilsone4ffd172011-04-04 09:44:39 +01003444 }
3445
Chris Wilsone4ffd172011-04-04 09:44:39 +01003446 return 0;
3447}
3448
Ben Widawsky199adf42012-09-21 17:01:20 -07003449int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data,
3450 struct drm_file *file)
Chris Wilsone6994ae2012-07-10 10:27:08 +01003451{
Ben Widawsky199adf42012-09-21 17:01:20 -07003452 struct drm_i915_gem_caching *args = data;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003453 struct drm_i915_gem_object *obj;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003454
Chris Wilson03ac0642016-07-20 13:31:51 +01003455 obj = i915_gem_object_lookup(file, args->handle);
3456 if (!obj)
Chris Wilson432be692015-05-07 12:14:55 +01003457 return -ENOENT;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003458
Chris Wilson651d7942013-08-08 14:41:10 +01003459 switch (obj->cache_level) {
3460 case I915_CACHE_LLC:
3461 case I915_CACHE_L3_LLC:
3462 args->caching = I915_CACHING_CACHED;
3463 break;
3464
Chris Wilson4257d3b2013-08-08 14:41:11 +01003465 case I915_CACHE_WT:
3466 args->caching = I915_CACHING_DISPLAY;
3467 break;
3468
Chris Wilson651d7942013-08-08 14:41:10 +01003469 default:
3470 args->caching = I915_CACHING_NONE;
3471 break;
3472 }
Chris Wilsone6994ae2012-07-10 10:27:08 +01003473
Chris Wilson34911fd2016-07-20 13:31:54 +01003474 i915_gem_object_put_unlocked(obj);
Chris Wilson432be692015-05-07 12:14:55 +01003475 return 0;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003476}
3477
Ben Widawsky199adf42012-09-21 17:01:20 -07003478int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
3479 struct drm_file *file)
Chris Wilsone6994ae2012-07-10 10:27:08 +01003480{
Chris Wilson9c870d02016-10-24 13:42:15 +01003481 struct drm_i915_private *i915 = to_i915(dev);
Ben Widawsky199adf42012-09-21 17:01:20 -07003482 struct drm_i915_gem_caching *args = data;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003483 struct drm_i915_gem_object *obj;
3484 enum i915_cache_level level;
3485 int ret;
3486
Ben Widawsky199adf42012-09-21 17:01:20 -07003487 switch (args->caching) {
3488 case I915_CACHING_NONE:
Chris Wilsone6994ae2012-07-10 10:27:08 +01003489 level = I915_CACHE_NONE;
3490 break;
Ben Widawsky199adf42012-09-21 17:01:20 -07003491 case I915_CACHING_CACHED:
Imre Deake5756c12015-08-14 18:43:30 +03003492 /*
3493 * Due to a HW issue on BXT A stepping, GPU stores via a
3494 * snooped mapping may leave stale data in a corresponding CPU
3495 * cacheline, whereas normally such cachelines would get
3496 * invalidated.
3497 */
Chris Wilson9c870d02016-10-24 13:42:15 +01003498 if (!HAS_LLC(i915) && !HAS_SNOOP(i915))
Imre Deake5756c12015-08-14 18:43:30 +03003499 return -ENODEV;
3500
Chris Wilsone6994ae2012-07-10 10:27:08 +01003501 level = I915_CACHE_LLC;
3502 break;
Chris Wilson4257d3b2013-08-08 14:41:11 +01003503 case I915_CACHING_DISPLAY:
Chris Wilson9c870d02016-10-24 13:42:15 +01003504 level = HAS_WT(i915) ? I915_CACHE_WT : I915_CACHE_NONE;
Chris Wilson4257d3b2013-08-08 14:41:11 +01003505 break;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003506 default:
3507 return -EINVAL;
3508 }
3509
Ben Widawsky3bc29132012-09-26 16:15:20 -07003510 ret = i915_mutex_lock_interruptible(dev);
3511 if (ret)
Chris Wilson9c870d02016-10-24 13:42:15 +01003512 return ret;
Ben Widawsky3bc29132012-09-26 16:15:20 -07003513
Chris Wilson03ac0642016-07-20 13:31:51 +01003514 obj = i915_gem_object_lookup(file, args->handle);
3515 if (!obj) {
Chris Wilsone6994ae2012-07-10 10:27:08 +01003516 ret = -ENOENT;
3517 goto unlock;
3518 }
3519
3520 ret = i915_gem_object_set_cache_level(obj, level);
Chris Wilsonf8c417c2016-07-20 13:31:53 +01003521 i915_gem_object_put(obj);
Chris Wilsone6994ae2012-07-10 10:27:08 +01003522unlock:
3523 mutex_unlock(&dev->struct_mutex);
3524 return ret;
3525}
3526
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003527/*
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003528 * Prepare buffer for display plane (scanout, cursors, etc).
3529 * Can be called from an uninterruptible phase (modesetting) and allows
3530 * any flushes to be pipelined (for pageflips).
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003531 */
Chris Wilson058d88c2016-08-15 10:49:06 +01003532struct i915_vma *
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003533i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
3534 u32 alignment,
Tvrtko Ursuline6617332015-03-23 11:10:33 +00003535 const struct i915_ggtt_view *view)
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003536{
Chris Wilson058d88c2016-08-15 10:49:06 +01003537 struct i915_vma *vma;
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003538 u32 old_read_domains, old_write_domain;
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003539 int ret;
3540
Chris Wilsoncc98b412013-08-09 12:25:09 +01003541 /* Mark the pin_display early so that we account for the
3542 * display coherency whilst setting up the cache domains.
3543 */
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003544 obj->pin_display++;
Chris Wilsoncc98b412013-08-09 12:25:09 +01003545
Eric Anholta7ef0642011-03-29 16:59:54 -07003546 /* The display engine is not coherent with the LLC cache on gen6. As
3547 * a result, we make sure that the pinning that is about to occur is
3548 * done with uncached PTEs. This is lowest common denominator for all
3549 * chipsets.
3550 *
3551 * However for gen6+, we could do better by using the GFDT bit instead
3552 * of uncaching, which would allow us to flush all the LLC-cached data
3553 * with that bit in the PTE to main memory with just one PIPE_CONTROL.
3554 */
Chris Wilson651d7942013-08-08 14:41:10 +01003555 ret = i915_gem_object_set_cache_level(obj,
Tvrtko Ursulin86527442016-10-13 11:03:00 +01003556 HAS_WT(to_i915(obj->base.dev)) ?
3557 I915_CACHE_WT : I915_CACHE_NONE);
Chris Wilson058d88c2016-08-15 10:49:06 +01003558 if (ret) {
3559 vma = ERR_PTR(ret);
Chris Wilsoncc98b412013-08-09 12:25:09 +01003560 goto err_unpin_display;
Chris Wilson058d88c2016-08-15 10:49:06 +01003561 }
Eric Anholta7ef0642011-03-29 16:59:54 -07003562
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003563 /* As the user may map the buffer once pinned in the display plane
3564 * (e.g. libkms for the bootup splash), we have to ensure that we
Chris Wilson2efb8132016-08-18 17:17:06 +01003565 * always use map_and_fenceable for all scanout buffers. However,
3566 * it may simply be too big to fit into mappable, in which case
3567 * put it anyway and hope that userspace can cope (but always first
3568 * try to preserve the existing ABI).
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003569 */
Chris Wilson2efb8132016-08-18 17:17:06 +01003570 vma = ERR_PTR(-ENOSPC);
3571 if (view->type == I915_GGTT_VIEW_NORMAL)
3572 vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment,
3573 PIN_MAPPABLE | PIN_NONBLOCK);
3574 if (IS_ERR(vma))
3575 vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, 0);
Chris Wilson058d88c2016-08-15 10:49:06 +01003576 if (IS_ERR(vma))
Chris Wilsoncc98b412013-08-09 12:25:09 +01003577 goto err_unpin_display;
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003578
Chris Wilsond8923dc2016-08-18 17:17:07 +01003579 vma->display_alignment = max_t(u64, vma->display_alignment, alignment);
3580
Chris Wilson058d88c2016-08-15 10:49:06 +01003581 WARN_ON(obj->pin_display > i915_vma_pin_count(vma));
3582
Daniel Vettere62b59e2015-01-21 14:53:48 +01003583 i915_gem_object_flush_cpu_write_domain(obj);
Chris Wilsonb118c1e2010-05-27 13:18:14 +01003584
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003585 old_write_domain = obj->base.write_domain;
Chris Wilson05394f32010-11-08 19:18:58 +00003586 old_read_domains = obj->base.read_domains;
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003587
3588 /* It should now be out of any other write domains, and we can update
3589 * the domain values for our changes.
3590 */
Chris Wilsone5f1d962012-07-20 12:41:00 +01003591 obj->base.write_domain = 0;
Chris Wilson05394f32010-11-08 19:18:58 +00003592 obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003593
3594 trace_i915_gem_object_change_domain(obj,
3595 old_read_domains,
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003596 old_write_domain);
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003597
Chris Wilson058d88c2016-08-15 10:49:06 +01003598 return vma;
Chris Wilsoncc98b412013-08-09 12:25:09 +01003599
3600err_unpin_display:
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003601 obj->pin_display--;
Chris Wilson058d88c2016-08-15 10:49:06 +01003602 return vma;
Chris Wilsoncc98b412013-08-09 12:25:09 +01003603}
3604
3605void
Chris Wilson058d88c2016-08-15 10:49:06 +01003606i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
Chris Wilsoncc98b412013-08-09 12:25:09 +01003607{
Chris Wilson058d88c2016-08-15 10:49:06 +01003608 if (WARN_ON(vma->obj->pin_display == 0))
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003609 return;
3610
Chris Wilsond8923dc2016-08-18 17:17:07 +01003611 if (--vma->obj->pin_display == 0)
3612 vma->display_alignment = 0;
Tvrtko Ursuline6617332015-03-23 11:10:33 +00003613
Chris Wilson383d5822016-08-18 17:17:08 +01003614 /* Bump the LRU to try and avoid premature eviction whilst flipping */
3615 if (!i915_vma_is_active(vma))
3616 list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
3617
Chris Wilson058d88c2016-08-15 10:49:06 +01003618 i915_vma_unpin(vma);
3619 WARN_ON(vma->obj->pin_display > i915_vma_pin_count(vma));
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003620}
3621
Eric Anholte47c68e2008-11-14 13:35:19 -08003622/**
3623 * Moves a single object to the CPU read, and possibly write domain.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003624 * @obj: object to act on
3625 * @write: requesting write or read-only access
Eric Anholte47c68e2008-11-14 13:35:19 -08003626 *
3627 * This function returns when the move is complete, including waiting on
3628 * flushes to occur.
3629 */
Chris Wilsondabdfe02012-03-26 10:10:27 +02003630int
Chris Wilson919926a2010-11-12 13:42:53 +00003631i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
Eric Anholte47c68e2008-11-14 13:35:19 -08003632{
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003633 uint32_t old_write_domain, old_read_domains;
Eric Anholte47c68e2008-11-14 13:35:19 -08003634 int ret;
3635
Chris Wilson0201f1e2012-07-20 12:41:01 +01003636 ret = i915_gem_object_wait_rendering(obj, !write);
Chris Wilson88241782011-01-07 17:09:48 +00003637 if (ret)
3638 return ret;
3639
Chris Wilsonc13d87e2016-07-20 09:21:15 +01003640 if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
3641 return 0;
3642
Eric Anholte47c68e2008-11-14 13:35:19 -08003643 i915_gem_object_flush_gtt_write_domain(obj);
3644
Chris Wilson05394f32010-11-08 19:18:58 +00003645 old_write_domain = obj->base.write_domain;
3646 old_read_domains = obj->base.read_domains;
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003647
Eric Anholte47c68e2008-11-14 13:35:19 -08003648 /* Flush the CPU cache if it's still invalid. */
Chris Wilson05394f32010-11-08 19:18:58 +00003649 if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
Chris Wilson2c225692013-08-09 12:26:45 +01003650 i915_gem_clflush_object(obj, false);
Eric Anholte47c68e2008-11-14 13:35:19 -08003651
Chris Wilson05394f32010-11-08 19:18:58 +00003652 obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
Eric Anholte47c68e2008-11-14 13:35:19 -08003653 }
3654
3655 /* It should now be out of any other write domains, and we can update
3656 * the domain values for our changes.
3657 */
Chris Wilson05394f32010-11-08 19:18:58 +00003658 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) != 0);
Eric Anholte47c68e2008-11-14 13:35:19 -08003659
3660 /* If we're writing through the CPU, then the GPU read domains will
3661 * need to be invalidated at next use.
3662 */
3663 if (write) {
Chris Wilson05394f32010-11-08 19:18:58 +00003664 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
3665 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
Eric Anholte47c68e2008-11-14 13:35:19 -08003666 }
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003667
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003668 trace_i915_gem_object_change_domain(obj,
3669 old_read_domains,
3670 old_write_domain);
3671
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003672 return 0;
3673}
3674
Eric Anholt673a3942008-07-30 12:06:12 -07003675/* Throttle our rendering by waiting until the ring has completed our requests
3676 * emitted over 20 msec ago.
3677 *
Eric Anholtb9624422009-06-03 07:27:35 +00003678 * Note that if we were to use the current jiffies each time around the loop,
3679 * we wouldn't escape the function with any frames outstanding if the time to
3680 * render a frame was over 20ms.
3681 *
Eric Anholt673a3942008-07-30 12:06:12 -07003682 * This should get us reasonable parallelism between CPU and GPU but also
3683 * relatively low latency when blocking on a particular request to finish.
3684 */
3685static int
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003686i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07003687{
Chris Wilsonfac5e232016-07-04 11:34:36 +01003688 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003689 struct drm_i915_file_private *file_priv = file->driver_priv;
Chris Wilsond0bc54f2015-05-21 21:01:48 +01003690 unsigned long recent_enough = jiffies - DRM_I915_THROTTLE_JIFFIES;
John Harrison54fb2412014-11-24 18:49:27 +00003691 struct drm_i915_gem_request *request, *target = NULL;
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003692 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003693
Daniel Vetter308887a2012-11-14 17:14:06 +01003694 ret = i915_gem_wait_for_error(&dev_priv->gpu_error);
3695 if (ret)
3696 return ret;
3697
Chris Wilsonf4457ae2016-04-13 17:35:08 +01003698 /* ABI: return -EIO if already wedged */
3699 if (i915_terminally_wedged(&dev_priv->gpu_error))
3700 return -EIO;
Chris Wilsone110e8d2011-01-26 15:39:14 +00003701
Chris Wilson1c255952010-09-26 11:03:27 +01003702 spin_lock(&file_priv->mm.lock);
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003703 list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
Eric Anholtb9624422009-06-03 07:27:35 +00003704 if (time_after_eq(request->emitted_jiffies, recent_enough))
3705 break;
3706
John Harrisonfcfa423c2015-05-29 17:44:12 +01003707 /*
3708 * Note that the request might not have been submitted yet.
3709 * In which case emitted_jiffies will be zero.
3710 */
3711 if (!request->emitted_jiffies)
3712 continue;
3713
John Harrison54fb2412014-11-24 18:49:27 +00003714 target = request;
Eric Anholtb9624422009-06-03 07:27:35 +00003715 }
John Harrisonff865882014-11-24 18:49:28 +00003716 if (target)
Chris Wilsone8a261e2016-07-20 13:31:49 +01003717 i915_gem_request_get(target);
Chris Wilson1c255952010-09-26 11:03:27 +01003718 spin_unlock(&file_priv->mm.lock);
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003719
John Harrison54fb2412014-11-24 18:49:27 +00003720 if (target == NULL)
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003721 return 0;
3722
Chris Wilsonea746f32016-09-09 14:11:49 +01003723 ret = i915_wait_request(target, I915_WAIT_INTERRUPTIBLE, NULL, NULL);
Chris Wilsone8a261e2016-07-20 13:31:49 +01003724 i915_gem_request_put(target);
John Harrisonff865882014-11-24 18:49:28 +00003725
Eric Anholt673a3942008-07-30 12:06:12 -07003726 return ret;
3727}
3728
Chris Wilsond23db882014-05-23 08:48:08 +02003729static bool
Chris Wilson91b2db62016-08-04 16:32:23 +01003730i915_vma_misplaced(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
Chris Wilsond23db882014-05-23 08:48:08 +02003731{
Chris Wilson59bfa122016-08-04 16:32:31 +01003732 if (!drm_mm_node_allocated(&vma->node))
3733 return false;
3734
Chris Wilson91b2db62016-08-04 16:32:23 +01003735 if (vma->node.size < size)
3736 return true;
3737
3738 if (alignment && vma->node.start & (alignment - 1))
Chris Wilsond23db882014-05-23 08:48:08 +02003739 return true;
3740
Chris Wilson05a20d02016-08-18 17:16:55 +01003741 if (flags & PIN_MAPPABLE && !i915_vma_is_map_and_fenceable(vma))
Chris Wilsond23db882014-05-23 08:48:08 +02003742 return true;
3743
3744 if (flags & PIN_OFFSET_BIAS &&
3745 vma->node.start < (flags & PIN_OFFSET_MASK))
3746 return true;
3747
Chris Wilson506a8e82015-12-08 11:55:07 +00003748 if (flags & PIN_OFFSET_FIXED &&
3749 vma->node.start != (flags & PIN_OFFSET_MASK))
3750 return true;
3751
Chris Wilsond23db882014-05-23 08:48:08 +02003752 return false;
3753}
3754
Chris Wilsond0710ab2015-11-20 14:16:39 +00003755void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
3756{
3757 struct drm_i915_gem_object *obj = vma->obj;
Chris Wilsona9f14812016-08-04 16:32:28 +01003758 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilsond0710ab2015-11-20 14:16:39 +00003759 bool mappable, fenceable;
3760 u32 fence_size, fence_alignment;
3761
Chris Wilsona9f14812016-08-04 16:32:28 +01003762 fence_size = i915_gem_get_ggtt_size(dev_priv,
Chris Wilson05a20d02016-08-18 17:16:55 +01003763 vma->size,
Chris Wilson3e510a82016-08-05 10:14:23 +01003764 i915_gem_object_get_tiling(obj));
Chris Wilsona9f14812016-08-04 16:32:28 +01003765 fence_alignment = i915_gem_get_ggtt_alignment(dev_priv,
Chris Wilson05a20d02016-08-18 17:16:55 +01003766 vma->size,
Chris Wilson3e510a82016-08-05 10:14:23 +01003767 i915_gem_object_get_tiling(obj),
Chris Wilsonad1a7d22016-08-04 16:32:27 +01003768 true);
Chris Wilsond0710ab2015-11-20 14:16:39 +00003769
3770 fenceable = (vma->node.size == fence_size &&
3771 (vma->node.start & (fence_alignment - 1)) == 0);
3772
3773 mappable = (vma->node.start + fence_size <=
Chris Wilsona9f14812016-08-04 16:32:28 +01003774 dev_priv->ggtt.mappable_end);
Chris Wilsond0710ab2015-11-20 14:16:39 +00003775
Chris Wilson05a20d02016-08-18 17:16:55 +01003776 if (mappable && fenceable)
3777 vma->flags |= I915_VMA_CAN_FENCE;
3778 else
3779 vma->flags &= ~I915_VMA_CAN_FENCE;
Chris Wilsond0710ab2015-11-20 14:16:39 +00003780}
3781
Chris Wilson305bc232016-08-04 16:32:33 +01003782int __i915_vma_do_pin(struct i915_vma *vma,
3783 u64 size, u64 alignment, u64 flags)
Eric Anholt673a3942008-07-30 12:06:12 -07003784{
Chris Wilson305bc232016-08-04 16:32:33 +01003785 unsigned int bound = vma->flags;
Eric Anholt673a3942008-07-30 12:06:12 -07003786 int ret;
3787
Chris Wilson59bfa122016-08-04 16:32:31 +01003788 GEM_BUG_ON((flags & (PIN_GLOBAL | PIN_USER)) == 0);
Chris Wilson3272db52016-08-04 16:32:32 +01003789 GEM_BUG_ON((flags & PIN_GLOBAL) && !i915_vma_is_ggtt(vma));
Ben Widawsky6e7186a2014-05-06 22:21:36 -07003790
Chris Wilson305bc232016-08-04 16:32:33 +01003791 if (WARN_ON(bound & I915_VMA_PIN_OVERFLOW)) {
3792 ret = -EBUSY;
3793 goto err;
3794 }
Chris Wilsonc826c442014-10-31 13:53:53 +00003795
Chris Wilsonde895082016-08-04 16:32:34 +01003796 if ((bound & I915_VMA_BIND_MASK) == 0) {
Chris Wilson59bfa122016-08-04 16:32:31 +01003797 ret = i915_vma_insert(vma, size, alignment, flags);
3798 if (ret)
3799 goto err;
Chris Wilsonac0c6b52010-05-27 13:18:18 +01003800 }
3801
Chris Wilson59bfa122016-08-04 16:32:31 +01003802 ret = i915_vma_bind(vma, vma->obj->cache_level, flags);
Chris Wilson3b165252016-08-04 16:32:25 +01003803 if (ret)
Chris Wilson59bfa122016-08-04 16:32:31 +01003804 goto err;
Chris Wilson3b165252016-08-04 16:32:25 +01003805
Chris Wilson3272db52016-08-04 16:32:32 +01003806 if ((bound ^ vma->flags) & I915_VMA_GLOBAL_BIND)
Chris Wilsond0710ab2015-11-20 14:16:39 +00003807 __i915_vma_set_map_and_fenceable(vma);
Chris Wilsonef79e172014-10-31 13:53:52 +00003808
Chris Wilson3b165252016-08-04 16:32:25 +01003809 GEM_BUG_ON(i915_vma_misplaced(vma, size, alignment, flags));
Eric Anholt673a3942008-07-30 12:06:12 -07003810 return 0;
Eric Anholt673a3942008-07-30 12:06:12 -07003811
Chris Wilson59bfa122016-08-04 16:32:31 +01003812err:
3813 __i915_vma_unpin(vma);
3814 return ret;
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003815}
3816
Chris Wilson058d88c2016-08-15 10:49:06 +01003817struct i915_vma *
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003818i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
3819 const struct i915_ggtt_view *view,
Chris Wilson91b2db62016-08-04 16:32:23 +01003820 u64 size,
Chris Wilson2ffffd02016-08-04 16:32:22 +01003821 u64 alignment,
3822 u64 flags)
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003823{
Chris Wilsonad16d2e2016-10-13 09:55:04 +01003824 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
3825 struct i915_address_space *vm = &dev_priv->ggtt.base;
Chris Wilson59bfa122016-08-04 16:32:31 +01003826 struct i915_vma *vma;
3827 int ret;
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03003828
Chris Wilson058d88c2016-08-15 10:49:06 +01003829 vma = i915_gem_obj_lookup_or_create_vma(obj, vm, view);
Chris Wilson59bfa122016-08-04 16:32:31 +01003830 if (IS_ERR(vma))
Chris Wilson058d88c2016-08-15 10:49:06 +01003831 return vma;
Chris Wilson59bfa122016-08-04 16:32:31 +01003832
3833 if (i915_vma_misplaced(vma, size, alignment, flags)) {
3834 if (flags & PIN_NONBLOCK &&
3835 (i915_vma_is_pinned(vma) || i915_vma_is_active(vma)))
Chris Wilson058d88c2016-08-15 10:49:06 +01003836 return ERR_PTR(-ENOSPC);
Chris Wilson59bfa122016-08-04 16:32:31 +01003837
Chris Wilsonad16d2e2016-10-13 09:55:04 +01003838 if (flags & PIN_MAPPABLE) {
3839 u32 fence_size;
3840
3841 fence_size = i915_gem_get_ggtt_size(dev_priv, vma->size,
3842 i915_gem_object_get_tiling(obj));
3843 /* If the required space is larger than the available
3844 * aperture, we will not able to find a slot for the
3845 * object and unbinding the object now will be in
3846 * vain. Worse, doing so may cause us to ping-pong
3847 * the object in and out of the Global GTT and
3848 * waste a lot of cycles under the mutex.
3849 */
3850 if (fence_size > dev_priv->ggtt.mappable_end)
3851 return ERR_PTR(-E2BIG);
3852
3853 /* If NONBLOCK is set the caller is optimistically
3854 * trying to cache the full object within the mappable
3855 * aperture, and *must* have a fallback in place for
3856 * situations where we cannot bind the object. We
3857 * can be a little more lax here and use the fallback
3858 * more often to avoid costly migrations of ourselves
3859 * and other objects within the aperture.
3860 *
3861 * Half-the-aperture is used as a simple heuristic.
3862 * More interesting would to do search for a free
3863 * block prior to making the commitment to unbind.
3864 * That caters for the self-harm case, and with a
3865 * little more heuristics (e.g. NOFAULT, NOEVICT)
3866 * we could try to minimise harm to others.
3867 */
3868 if (flags & PIN_NONBLOCK &&
3869 fence_size > dev_priv->ggtt.mappable_end / 2)
3870 return ERR_PTR(-ENOSPC);
3871 }
3872
Chris Wilson59bfa122016-08-04 16:32:31 +01003873 WARN(i915_vma_is_pinned(vma),
3874 "bo is already pinned in ggtt with incorrect alignment:"
Chris Wilson05a20d02016-08-18 17:16:55 +01003875 " offset=%08x, req.alignment=%llx,"
3876 " req.map_and_fenceable=%d, vma->map_and_fenceable=%d\n",
3877 i915_ggtt_offset(vma), alignment,
Chris Wilson59bfa122016-08-04 16:32:31 +01003878 !!(flags & PIN_MAPPABLE),
Chris Wilson05a20d02016-08-18 17:16:55 +01003879 i915_vma_is_map_and_fenceable(vma));
Chris Wilson59bfa122016-08-04 16:32:31 +01003880 ret = i915_vma_unbind(vma);
3881 if (ret)
Chris Wilson058d88c2016-08-15 10:49:06 +01003882 return ERR_PTR(ret);
Chris Wilson59bfa122016-08-04 16:32:31 +01003883 }
3884
Chris Wilson058d88c2016-08-15 10:49:06 +01003885 ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
3886 if (ret)
3887 return ERR_PTR(ret);
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003888
Chris Wilson058d88c2016-08-15 10:49:06 +01003889 return vma;
Eric Anholt673a3942008-07-30 12:06:12 -07003890}
3891
Chris Wilsonedf6b762016-08-09 09:23:33 +01003892static __always_inline unsigned int __busy_read_flag(unsigned int id)
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003893{
3894 /* Note that we could alias engines in the execbuf API, but
3895 * that would be very unwise as it prevents userspace from
3896 * fine control over engine selection. Ahem.
3897 *
3898 * This should be something like EXEC_MAX_ENGINE instead of
3899 * I915_NUM_ENGINES.
3900 */
3901 BUILD_BUG_ON(I915_NUM_ENGINES > 16);
3902 return 0x10000 << id;
3903}
3904
3905static __always_inline unsigned int __busy_write_id(unsigned int id)
3906{
Chris Wilson70cb4722016-08-09 18:08:25 +01003907 /* The uABI guarantees an active writer is also amongst the read
3908 * engines. This would be true if we accessed the activity tracking
3909 * under the lock, but as we perform the lookup of the object and
3910 * its activity locklessly we can not guarantee that the last_write
3911 * being active implies that we have set the same engine flag from
3912 * last_read - hence we always set both read and write busy for
3913 * last_write.
3914 */
3915 return id | __busy_read_flag(id);
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003916}
3917
Chris Wilsonedf6b762016-08-09 09:23:33 +01003918static __always_inline unsigned int
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003919__busy_set_if_active(const struct i915_gem_active *active,
3920 unsigned int (*flag)(unsigned int id))
3921{
Chris Wilson12555012016-08-16 09:50:40 +01003922 struct drm_i915_gem_request *request;
3923
3924 request = rcu_dereference(active->request);
3925 if (!request || i915_gem_request_completed(request))
3926 return 0;
3927
3928 /* This is racy. See __i915_gem_active_get_rcu() for an in detail
3929 * discussion of how to handle the race correctly, but for reporting
3930 * the busy state we err on the side of potentially reporting the
3931 * wrong engine as being busy (but we guarantee that the result
3932 * is at least self-consistent).
3933 *
3934 * As we use SLAB_DESTROY_BY_RCU, the request may be reallocated
3935 * whilst we are inspecting it, even under the RCU read lock as we are.
3936 * This means that there is a small window for the engine and/or the
3937 * seqno to have been overwritten. The seqno will always be in the
3938 * future compared to the intended, and so we know that if that
3939 * seqno is idle (on whatever engine) our request is idle and the
3940 * return 0 above is correct.
3941 *
3942 * The issue is that if the engine is switched, it is just as likely
3943 * to report that it is busy (but since the switch happened, we know
3944 * the request should be idle). So there is a small chance that a busy
3945 * result is actually the wrong engine.
3946 *
3947 * So why don't we care?
3948 *
3949 * For starters, the busy ioctl is a heuristic that is by definition
3950 * racy. Even with perfect serialisation in the driver, the hardware
3951 * state is constantly advancing - the state we report to the user
3952 * is stale.
3953 *
3954 * The critical information for the busy-ioctl is whether the object
3955 * is idle as userspace relies on that to detect whether its next
3956 * access will stall, or if it has missed submitting commands to
3957 * the hardware allowing the GPU to stall. We never generate a
3958 * false-positive for idleness, thus busy-ioctl is reliable at the
3959 * most fundamental level, and we maintain the guarantee that a
3960 * busy object left to itself will eventually become idle (and stay
3961 * idle!).
3962 *
3963 * We allow ourselves the leeway of potentially misreporting the busy
3964 * state because that is an optimisation heuristic that is constantly
3965 * in flux. Being quickly able to detect the busy/idle state is much
3966 * more important than accurate logging of exactly which engines were
3967 * busy.
3968 *
3969 * For accuracy in reporting the engine, we could use
3970 *
3971 * result = 0;
3972 * request = __i915_gem_active_get_rcu(active);
3973 * if (request) {
3974 * if (!i915_gem_request_completed(request))
3975 * result = flag(request->engine->exec_id);
3976 * i915_gem_request_put(request);
3977 * }
3978 *
3979 * but that still remains susceptible to both hardware and userspace
3980 * races. So we accept making the result of that race slightly worse,
3981 * given the rarity of the race and its low impact on the result.
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003982 */
Chris Wilson12555012016-08-16 09:50:40 +01003983 return flag(READ_ONCE(request->engine->exec_id));
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003984}
3985
Chris Wilsonedf6b762016-08-09 09:23:33 +01003986static __always_inline unsigned int
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003987busy_check_reader(const struct i915_gem_active *active)
3988{
3989 return __busy_set_if_active(active, __busy_read_flag);
3990}
3991
Chris Wilsonedf6b762016-08-09 09:23:33 +01003992static __always_inline unsigned int
Chris Wilson3fdc13c2016-08-05 10:14:18 +01003993busy_check_writer(const struct i915_gem_active *active)
3994{
3995 return __busy_set_if_active(active, __busy_write_id);
3996}
3997
Eric Anholt673a3942008-07-30 12:06:12 -07003998int
Eric Anholt673a3942008-07-30 12:06:12 -07003999i915_gem_busy_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00004000 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07004001{
4002 struct drm_i915_gem_busy *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00004003 struct drm_i915_gem_object *obj;
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004004 unsigned long active;
Eric Anholt673a3942008-07-30 12:06:12 -07004005
Chris Wilson03ac0642016-07-20 13:31:51 +01004006 obj = i915_gem_object_lookup(file, args->handle);
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004007 if (!obj)
4008 return -ENOENT;
Zou Nan haid1b851f2010-05-21 09:08:57 +08004009
Chris Wilson426960b2016-01-15 16:51:46 +00004010 args->busy = 0;
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004011 active = __I915_BO_ACTIVE(obj);
4012 if (active) {
4013 int idx;
Chris Wilson426960b2016-01-15 16:51:46 +00004014
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004015 /* Yes, the lookups are intentionally racy.
4016 *
4017 * First, we cannot simply rely on __I915_BO_ACTIVE. We have
4018 * to regard the value as stale and as our ABI guarantees
4019 * forward progress, we confirm the status of each active
4020 * request with the hardware.
4021 *
4022 * Even though we guard the pointer lookup by RCU, that only
4023 * guarantees that the pointer and its contents remain
4024 * dereferencable and does *not* mean that the request we
4025 * have is the same as the one being tracked by the object.
4026 *
4027 * Consider that we lookup the request just as it is being
4028 * retired and freed. We take a local copy of the pointer,
4029 * but before we add its engine into the busy set, the other
4030 * thread reallocates it and assigns it to a task on another
Chris Wilson12555012016-08-16 09:50:40 +01004031 * engine with a fresh and incomplete seqno. Guarding against
4032 * that requires careful serialisation and reference counting,
4033 * i.e. using __i915_gem_active_get_request_rcu(). We don't,
4034 * instead we expect that if the result is busy, which engines
4035 * are busy is not completely reliable - we only guarantee
4036 * that the object was busy.
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004037 */
4038 rcu_read_lock();
4039
4040 for_each_active(active, idx)
4041 args->busy |= busy_check_reader(&obj->last_read[idx]);
4042
4043 /* For ABI sanity, we only care that the write engine is in
Chris Wilson70cb4722016-08-09 18:08:25 +01004044 * the set of read engines. This should be ensured by the
4045 * ordering of setting last_read/last_write in
4046 * i915_vma_move_to_active(), and then in reverse in retire.
4047 * However, for good measure, we always report the last_write
4048 * request as a busy read as well as being a busy write.
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004049 *
4050 * We don't care that the set of active read/write engines
4051 * may change during construction of the result, as it is
4052 * equally liable to change before userspace can inspect
4053 * the result.
4054 */
4055 args->busy |= busy_check_writer(&obj->last_write);
4056
4057 rcu_read_unlock();
Chris Wilson426960b2016-01-15 16:51:46 +00004058 }
Eric Anholt673a3942008-07-30 12:06:12 -07004059
Chris Wilson3fdc13c2016-08-05 10:14:18 +01004060 i915_gem_object_put_unlocked(obj);
4061 return 0;
Eric Anholt673a3942008-07-30 12:06:12 -07004062}
4063
4064int
4065i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
4066 struct drm_file *file_priv)
4067{
Akshay Joshi0206e352011-08-16 15:34:10 -04004068 return i915_gem_ring_throttle(dev, file_priv);
Eric Anholt673a3942008-07-30 12:06:12 -07004069}
4070
Chris Wilson3ef94da2009-09-14 16:50:29 +01004071int
4072i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
4073 struct drm_file *file_priv)
4074{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004075 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson3ef94da2009-09-14 16:50:29 +01004076 struct drm_i915_gem_madvise *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00004077 struct drm_i915_gem_object *obj;
Chris Wilson76c1dec2010-09-25 11:22:51 +01004078 int ret;
Chris Wilson3ef94da2009-09-14 16:50:29 +01004079
4080 switch (args->madv) {
4081 case I915_MADV_DONTNEED:
4082 case I915_MADV_WILLNEED:
4083 break;
4084 default:
4085 return -EINVAL;
4086 }
4087
Chris Wilson1d7cfea2010-10-17 09:45:41 +01004088 ret = i915_mutex_lock_interruptible(dev);
4089 if (ret)
4090 return ret;
4091
Chris Wilson03ac0642016-07-20 13:31:51 +01004092 obj = i915_gem_object_lookup(file_priv, args->handle);
4093 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01004094 ret = -ENOENT;
4095 goto unlock;
Chris Wilson3ef94da2009-09-14 16:50:29 +01004096 }
Chris Wilson3ef94da2009-09-14 16:50:29 +01004097
Daniel Vetter656bfa32014-11-20 09:26:30 +01004098 if (obj->pages &&
Chris Wilson3e510a82016-08-05 10:14:23 +01004099 i915_gem_object_is_tiled(obj) &&
Daniel Vetter656bfa32014-11-20 09:26:30 +01004100 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
4101 if (obj->madv == I915_MADV_WILLNEED)
4102 i915_gem_object_unpin_pages(obj);
4103 if (args->madv == I915_MADV_WILLNEED)
4104 i915_gem_object_pin_pages(obj);
4105 }
4106
Chris Wilson05394f32010-11-08 19:18:58 +00004107 if (obj->madv != __I915_MADV_PURGED)
4108 obj->madv = args->madv;
Chris Wilson3ef94da2009-09-14 16:50:29 +01004109
Chris Wilson6c085a72012-08-20 11:40:46 +02004110 /* if the object is no longer attached, discard its backing storage */
Daniel Vetterbe6a0372015-03-18 10:46:04 +01004111 if (obj->madv == I915_MADV_DONTNEED && obj->pages == NULL)
Chris Wilson2d7ef392009-09-20 23:13:10 +01004112 i915_gem_object_truncate(obj);
4113
Chris Wilson05394f32010-11-08 19:18:58 +00004114 args->retained = obj->madv != __I915_MADV_PURGED;
Chris Wilsonbb6baf72009-09-22 14:24:13 +01004115
Chris Wilsonf8c417c2016-07-20 13:31:53 +01004116 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01004117unlock:
Chris Wilson3ef94da2009-09-14 16:50:29 +01004118 mutex_unlock(&dev->struct_mutex);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01004119 return ret;
Chris Wilson3ef94da2009-09-14 16:50:29 +01004120}
4121
Chris Wilson37e680a2012-06-07 15:38:42 +01004122void i915_gem_object_init(struct drm_i915_gem_object *obj,
4123 const struct drm_i915_gem_object_ops *ops)
Chris Wilson0327d6b2012-08-11 15:41:06 +01004124{
Chris Wilsonb4716182015-04-27 13:41:17 +01004125 int i;
4126
Ben Widawsky35c20a62013-05-31 11:28:48 -07004127 INIT_LIST_HEAD(&obj->global_list);
Chris Wilson275f0392016-10-24 13:42:14 +01004128 INIT_LIST_HEAD(&obj->userfault_link);
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00004129 for (i = 0; i < I915_NUM_ENGINES; i++)
Chris Wilsonfa545cb2016-08-04 07:52:35 +01004130 init_request_active(&obj->last_read[i],
4131 i915_gem_object_retire__read);
4132 init_request_active(&obj->last_write,
4133 i915_gem_object_retire__write);
Ben Widawskyb25cb2f2013-08-14 11:38:33 +02004134 INIT_LIST_HEAD(&obj->obj_exec_link);
Ben Widawsky2f633152013-07-17 12:19:03 -07004135 INIT_LIST_HEAD(&obj->vma_list);
Chris Wilson8d9d5742015-04-07 16:20:38 +01004136 INIT_LIST_HEAD(&obj->batch_pool_link);
Chris Wilson0327d6b2012-08-11 15:41:06 +01004137
Chris Wilson37e680a2012-06-07 15:38:42 +01004138 obj->ops = ops;
4139
Chris Wilson50349242016-08-18 17:17:04 +01004140 obj->frontbuffer_ggtt_origin = ORIGIN_GTT;
Chris Wilson0327d6b2012-08-11 15:41:06 +01004141 obj->madv = I915_MADV_WILLNEED;
Chris Wilson0327d6b2012-08-11 15:41:06 +01004142
Dave Gordonf19ec8c2016-07-04 11:34:37 +01004143 i915_gem_info_add_obj(to_i915(obj->base.dev), obj->base.size);
Chris Wilson0327d6b2012-08-11 15:41:06 +01004144}
4145
Chris Wilson37e680a2012-06-07 15:38:42 +01004146static const struct drm_i915_gem_object_ops i915_gem_object_ops = {
Chris Wilsonde472662016-01-22 18:32:31 +00004147 .flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE,
Chris Wilson37e680a2012-06-07 15:38:42 +01004148 .get_pages = i915_gem_object_get_pages_gtt,
4149 .put_pages = i915_gem_object_put_pages_gtt,
4150};
4151
Chris Wilsonb4bcbe22016-10-18 13:02:49 +01004152/* Note we don't consider signbits :| */
4153#define overflows_type(x, T) \
4154 (sizeof(x) > sizeof(T) && (x) >> (sizeof(T) * BITS_PER_BYTE))
4155
4156struct drm_i915_gem_object *
4157i915_gem_object_create(struct drm_device *dev, u64 size)
Daniel Vetterac52bc52010-04-09 19:05:06 +00004158{
Daniel Vetterc397b902010-04-09 19:05:07 +00004159 struct drm_i915_gem_object *obj;
Hugh Dickins5949eac2011-06-27 16:18:18 -07004160 struct address_space *mapping;
Daniel Vetter1a240d42012-11-29 22:18:51 +01004161 gfp_t mask;
Chris Wilsonfe3db792016-04-25 13:32:13 +01004162 int ret;
Daniel Vetterc397b902010-04-09 19:05:07 +00004163
Chris Wilsonb4bcbe22016-10-18 13:02:49 +01004164 /* There is a prevalence of the assumption that we fit the object's
4165 * page count inside a 32bit _signed_ variable. Let's document this and
4166 * catch if we ever need to fix it. In the meantime, if you do spot
4167 * such a local variable, please consider fixing!
4168 */
4169 if (WARN_ON(size >> PAGE_SHIFT > INT_MAX))
4170 return ERR_PTR(-E2BIG);
4171
4172 if (overflows_type(size, obj->base.size))
4173 return ERR_PTR(-E2BIG);
4174
Chris Wilson42dcedd2012-11-15 11:32:30 +00004175 obj = i915_gem_object_alloc(dev);
Daniel Vetterc397b902010-04-09 19:05:07 +00004176 if (obj == NULL)
Chris Wilsonfe3db792016-04-25 13:32:13 +01004177 return ERR_PTR(-ENOMEM);
Daniel Vetterc397b902010-04-09 19:05:07 +00004178
Chris Wilsonfe3db792016-04-25 13:32:13 +01004179 ret = drm_gem_object_init(dev, &obj->base, size);
4180 if (ret)
4181 goto fail;
Daniel Vetterc397b902010-04-09 19:05:07 +00004182
Chris Wilsonbed1ea92012-05-24 20:48:12 +01004183 mask = GFP_HIGHUSER | __GFP_RECLAIMABLE;
4184 if (IS_CRESTLINE(dev) || IS_BROADWATER(dev)) {
4185 /* 965gm cannot relocate objects above 4GiB. */
4186 mask &= ~__GFP_HIGHMEM;
4187 mask |= __GFP_DMA32;
4188 }
4189
Al Viro93c76a32015-12-04 23:45:44 -05004190 mapping = obj->base.filp->f_mapping;
Chris Wilsonbed1ea92012-05-24 20:48:12 +01004191 mapping_set_gfp_mask(mapping, mask);
Hugh Dickins5949eac2011-06-27 16:18:18 -07004192
Chris Wilson37e680a2012-06-07 15:38:42 +01004193 i915_gem_object_init(obj, &i915_gem_object_ops);
Chris Wilson73aa8082010-09-30 11:46:12 +01004194
Daniel Vetterc397b902010-04-09 19:05:07 +00004195 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
4196 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
4197
Eugeni Dodonov3d29b842012-01-17 14:43:53 -02004198 if (HAS_LLC(dev)) {
4199 /* On some devices, we can have the GPU use the LLC (the CPU
Eric Anholta1871112011-03-29 16:59:55 -07004200 * cache) for about a 10% performance improvement
4201 * compared to uncached. Graphics requests other than
4202 * display scanout are coherent with the CPU in
4203 * accessing this cache. This means in this mode we
4204 * don't need to clflush on the CPU side, and on the
4205 * GPU side we only need to flush internal caches to
4206 * get data visible to the CPU.
4207 *
4208 * However, we maintain the display planes as UC, and so
4209 * need to rebind when first used as such.
4210 */
4211 obj->cache_level = I915_CACHE_LLC;
4212 } else
4213 obj->cache_level = I915_CACHE_NONE;
4214
Daniel Vetterd861e332013-07-24 23:25:03 +02004215 trace_i915_gem_object_create(obj);
4216
Chris Wilson05394f32010-11-08 19:18:58 +00004217 return obj;
Chris Wilsonfe3db792016-04-25 13:32:13 +01004218
4219fail:
4220 i915_gem_object_free(obj);
4221
4222 return ERR_PTR(ret);
Daniel Vetterac52bc52010-04-09 19:05:06 +00004223}
4224
Chris Wilson340fbd82014-05-22 09:16:52 +01004225static bool discard_backing_storage(struct drm_i915_gem_object *obj)
4226{
4227 /* If we are the last user of the backing storage (be it shmemfs
4228 * pages or stolen etc), we know that the pages are going to be
4229 * immediately released. In this case, we can then skip copying
4230 * back the contents from the GPU.
4231 */
4232
4233 if (obj->madv != I915_MADV_WILLNEED)
4234 return false;
4235
4236 if (obj->base.filp == NULL)
4237 return true;
4238
4239 /* At first glance, this looks racy, but then again so would be
4240 * userspace racing mmap against close. However, the first external
4241 * reference to the filp can only be obtained through the
4242 * i915_gem_mmap_ioctl() which safeguards us against the user
4243 * acquiring such a reference whilst we are in the middle of
4244 * freeing the object.
4245 */
4246 return atomic_long_read(&obj->base.filp->f_count) == 1;
4247}
4248
Chris Wilson1488fc02012-04-24 15:47:31 +01004249void i915_gem_free_object(struct drm_gem_object *gem_obj)
Chris Wilsonbe726152010-07-23 23:18:50 +01004250{
Chris Wilson1488fc02012-04-24 15:47:31 +01004251 struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
Chris Wilson05394f32010-11-08 19:18:58 +00004252 struct drm_device *dev = obj->base.dev;
Chris Wilsonfac5e232016-07-04 11:34:36 +01004253 struct drm_i915_private *dev_priv = to_i915(dev);
Ben Widawsky07fe0b12013-07-31 17:00:10 -07004254 struct i915_vma *vma, *next;
Chris Wilsonbe726152010-07-23 23:18:50 +01004255
Paulo Zanonif65c9162013-11-27 18:20:34 -02004256 intel_runtime_pm_get(dev_priv);
4257
Chris Wilson26e12f82011-03-20 11:20:19 +00004258 trace_i915_gem_object_destroy(obj);
4259
Chris Wilsonb1f788c2016-08-04 07:52:45 +01004260 /* All file-owned VMA should have been released by this point through
4261 * i915_gem_close_object(), or earlier by i915_gem_context_close().
4262 * However, the object may also be bound into the global GTT (e.g.
4263 * older GPUs without per-process support, or for direct access through
4264 * the GTT either for the user or for scanout). Those VMA still need to
4265 * unbound now.
4266 */
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004267 list_for_each_entry_safe(vma, next, &obj->vma_list, obj_link) {
Chris Wilson3272db52016-08-04 16:32:32 +01004268 GEM_BUG_ON(!i915_vma_is_ggtt(vma));
Chris Wilsonb1f788c2016-08-04 07:52:45 +01004269 GEM_BUG_ON(i915_vma_is_active(vma));
Chris Wilson3272db52016-08-04 16:32:32 +01004270 vma->flags &= ~I915_VMA_PIN_MASK;
Chris Wilsonb1f788c2016-08-04 07:52:45 +01004271 i915_vma_close(vma);
Chris Wilson1488fc02012-04-24 15:47:31 +01004272 }
Chris Wilson15717de2016-08-04 07:52:26 +01004273 GEM_BUG_ON(obj->bind_count);
Chris Wilson1488fc02012-04-24 15:47:31 +01004274
Ben Widawsky1d64ae72013-05-31 14:46:20 -07004275 /* Stolen objects don't hold a ref, but do hold pin count. Fix that up
4276 * before progressing. */
4277 if (obj->stolen)
4278 i915_gem_object_unpin_pages(obj);
4279
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004280 WARN_ON(atomic_read(&obj->frontbuffer_bits));
Daniel Vettera071fa02014-06-18 23:28:09 +02004281
Daniel Vetter656bfa32014-11-20 09:26:30 +01004282 if (obj->pages && obj->madv == I915_MADV_WILLNEED &&
4283 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES &&
Chris Wilson3e510a82016-08-05 10:14:23 +01004284 i915_gem_object_is_tiled(obj))
Daniel Vetter656bfa32014-11-20 09:26:30 +01004285 i915_gem_object_unpin_pages(obj);
4286
Ben Widawsky401c29f2013-05-31 11:28:47 -07004287 if (WARN_ON(obj->pages_pin_count))
4288 obj->pages_pin_count = 0;
Chris Wilson340fbd82014-05-22 09:16:52 +01004289 if (discard_backing_storage(obj))
Chris Wilson55372522014-03-25 13:23:06 +00004290 obj->madv = I915_MADV_DONTNEED;
Chris Wilson37e680a2012-06-07 15:38:42 +01004291 i915_gem_object_put_pages(obj);
Chris Wilsonbe726152010-07-23 23:18:50 +01004292
Chris Wilson9da3da62012-06-01 15:20:22 +01004293 BUG_ON(obj->pages);
4294
Chris Wilson2f745ad2012-09-04 21:02:58 +01004295 if (obj->base.import_attach)
4296 drm_prime_gem_destroy(&obj->base, NULL);
Chris Wilsonbe726152010-07-23 23:18:50 +01004297
Chris Wilson5cc9ed42014-05-16 14:22:37 +01004298 if (obj->ops->release)
4299 obj->ops->release(obj);
4300
Chris Wilson05394f32010-11-08 19:18:58 +00004301 drm_gem_object_release(&obj->base);
4302 i915_gem_info_remove_obj(dev_priv, obj->base.size);
Chris Wilsonbe726152010-07-23 23:18:50 +01004303
Chris Wilson05394f32010-11-08 19:18:58 +00004304 kfree(obj->bit_17);
Chris Wilson42dcedd2012-11-15 11:32:30 +00004305 i915_gem_object_free(obj);
Paulo Zanonif65c9162013-11-27 18:20:34 -02004306
4307 intel_runtime_pm_put(dev_priv);
Chris Wilsonbe726152010-07-23 23:18:50 +01004308}
4309
Chris Wilsondcff85c2016-08-05 10:14:11 +01004310int i915_gem_suspend(struct drm_device *dev)
Eric Anholt673a3942008-07-30 12:06:12 -07004311{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004312 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilsondcff85c2016-08-05 10:14:11 +01004313 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07004314
Chris Wilson54b4f682016-07-21 21:16:19 +01004315 intel_suspend_gt_powersave(dev_priv);
4316
Chris Wilson45c5f202013-10-16 11:50:01 +01004317 mutex_lock(&dev->struct_mutex);
Chris Wilson5ab57c72016-07-15 14:56:20 +01004318
4319 /* We have to flush all the executing contexts to main memory so
4320 * that they can saved in the hibernation image. To ensure the last
4321 * context image is coherent, we have to switch away from it. That
4322 * leaves the dev_priv->kernel_context still active when
4323 * we actually suspend, and its image in memory may not match the GPU
4324 * state. Fortunately, the kernel_context is disposable and we do
4325 * not rely on its state.
4326 */
4327 ret = i915_gem_switch_to_kernel_context(dev_priv);
4328 if (ret)
4329 goto err;
4330
Chris Wilson22dd3bb2016-09-09 14:11:50 +01004331 ret = i915_gem_wait_for_idle(dev_priv,
4332 I915_WAIT_INTERRUPTIBLE |
4333 I915_WAIT_LOCKED);
Chris Wilsonf7403342013-09-13 23:57:04 +01004334 if (ret)
Chris Wilson45c5f202013-10-16 11:50:01 +01004335 goto err;
Chris Wilsonf7403342013-09-13 23:57:04 +01004336
Chris Wilsonc0336662016-05-06 15:40:21 +01004337 i915_gem_retire_requests(dev_priv);
Eric Anholt673a3942008-07-30 12:06:12 -07004338
Chris Wilsonb2e862d2016-04-28 09:56:41 +01004339 i915_gem_context_lost(dev_priv);
Chris Wilson45c5f202013-10-16 11:50:01 +01004340 mutex_unlock(&dev->struct_mutex);
4341
Chris Wilson737b1502015-01-26 18:03:03 +02004342 cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
Chris Wilson67d97da2016-07-04 08:08:31 +01004343 cancel_delayed_work_sync(&dev_priv->gt.retire_work);
4344 flush_delayed_work(&dev_priv->gt.idle_work);
Chris Wilson29105cc2010-01-07 10:39:13 +00004345
Chris Wilsonbdcf1202014-11-25 11:56:33 +00004346 /* Assert that we sucessfully flushed all the work and
4347 * reset the GPU back to its idle, low power state.
4348 */
Chris Wilson67d97da2016-07-04 08:08:31 +01004349 WARN_ON(dev_priv->gt.awake);
Chris Wilsonbdcf1202014-11-25 11:56:33 +00004350
Imre Deak1c777c52016-10-12 17:46:37 +03004351 /*
4352 * Neither the BIOS, ourselves or any other kernel
4353 * expects the system to be in execlists mode on startup,
4354 * so we need to reset the GPU back to legacy mode. And the only
4355 * known way to disable logical contexts is through a GPU reset.
4356 *
4357 * So in order to leave the system in a known default configuration,
4358 * always reset the GPU upon unload and suspend. Afterwards we then
4359 * clean up the GEM state tracking, flushing off the requests and
4360 * leaving the system in a known idle state.
4361 *
4362 * Note that is of the upmost importance that the GPU is idle and
4363 * all stray writes are flushed *before* we dismantle the backing
4364 * storage for the pinned objects.
4365 *
4366 * However, since we are uncertain that resetting the GPU on older
4367 * machines is a good idea, we don't - just in case it leaves the
4368 * machine in an unusable condition.
4369 */
4370 if (HAS_HW_CONTEXTS(dev)) {
4371 int reset = intel_gpu_reset(dev_priv, ALL_ENGINES);
4372 WARN_ON(reset && reset != -ENODEV);
4373 }
4374
Eric Anholt673a3942008-07-30 12:06:12 -07004375 return 0;
Chris Wilson45c5f202013-10-16 11:50:01 +01004376
4377err:
4378 mutex_unlock(&dev->struct_mutex);
4379 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07004380}
4381
Chris Wilson5ab57c72016-07-15 14:56:20 +01004382void i915_gem_resume(struct drm_device *dev)
4383{
4384 struct drm_i915_private *dev_priv = to_i915(dev);
4385
4386 mutex_lock(&dev->struct_mutex);
4387 i915_gem_restore_gtt_mappings(dev);
4388
4389 /* As we didn't flush the kernel context before suspend, we cannot
4390 * guarantee that the context image is complete. So let's just reset
4391 * it and start again.
4392 */
Chris Wilson821ed7d2016-09-09 14:11:53 +01004393 dev_priv->gt.resume(dev_priv);
Chris Wilson5ab57c72016-07-15 14:56:20 +01004394
4395 mutex_unlock(&dev->struct_mutex);
4396}
4397
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004398void i915_gem_init_swizzling(struct drm_device *dev)
4399{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004400 struct drm_i915_private *dev_priv = to_i915(dev);
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004401
Daniel Vetter11782b02012-01-31 16:47:55 +01004402 if (INTEL_INFO(dev)->gen < 5 ||
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004403 dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE)
4404 return;
4405
4406 I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
4407 DISP_TILE_SURFACE_SWIZZLING);
4408
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01004409 if (IS_GEN5(dev_priv))
Daniel Vetter11782b02012-01-31 16:47:55 +01004410 return;
4411
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004412 I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL);
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01004413 if (IS_GEN6(dev_priv))
Daniel Vetter6b26c862012-04-24 14:04:12 +02004414 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_SNB));
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01004415 else if (IS_GEN7(dev_priv))
Daniel Vetter6b26c862012-04-24 14:04:12 +02004416 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_IVB));
Tvrtko Ursulin5db94012016-10-13 11:03:10 +01004417 else if (IS_GEN8(dev_priv))
Ben Widawsky31a53362013-11-02 21:07:04 -07004418 I915_WRITE(GAMTARBMODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_BDW));
Ben Widawsky8782e262012-12-18 10:31:23 -08004419 else
4420 BUG();
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004421}
Daniel Vettere21af882012-02-09 20:53:27 +01004422
Tvrtko Ursulin50a0bc92016-10-13 11:02:58 +01004423static void init_unused_ring(struct drm_i915_private *dev_priv, u32 base)
Ville Syrjälä81e7f202014-08-15 01:21:55 +03004424{
Ville Syrjälä81e7f202014-08-15 01:21:55 +03004425 I915_WRITE(RING_CTL(base), 0);
4426 I915_WRITE(RING_HEAD(base), 0);
4427 I915_WRITE(RING_TAIL(base), 0);
4428 I915_WRITE(RING_START(base), 0);
4429}
4430
Tvrtko Ursulin50a0bc92016-10-13 11:02:58 +01004431static void init_unused_rings(struct drm_i915_private *dev_priv)
Ville Syrjälä81e7f202014-08-15 01:21:55 +03004432{
Tvrtko Ursulin50a0bc92016-10-13 11:02:58 +01004433 if (IS_I830(dev_priv)) {
4434 init_unused_ring(dev_priv, PRB1_BASE);
4435 init_unused_ring(dev_priv, SRB0_BASE);
4436 init_unused_ring(dev_priv, SRB1_BASE);
4437 init_unused_ring(dev_priv, SRB2_BASE);
4438 init_unused_ring(dev_priv, SRB3_BASE);
4439 } else if (IS_GEN2(dev_priv)) {
4440 init_unused_ring(dev_priv, SRB0_BASE);
4441 init_unused_ring(dev_priv, SRB1_BASE);
4442 } else if (IS_GEN3(dev_priv)) {
4443 init_unused_ring(dev_priv, PRB1_BASE);
4444 init_unused_ring(dev_priv, PRB2_BASE);
Ville Syrjälä81e7f202014-08-15 01:21:55 +03004445 }
4446}
4447
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004448int
4449i915_gem_init_hw(struct drm_device *dev)
4450{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004451 struct drm_i915_private *dev_priv = to_i915(dev);
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004452 struct intel_engine_cs *engine;
Akash Goel3b3f1652016-10-13 22:44:48 +05304453 enum intel_engine_id id;
Chris Wilsond200cda2016-04-28 09:56:44 +01004454 int ret;
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004455
Chris Wilson5e4f5182015-02-13 14:35:59 +00004456 /* Double layer security blanket, see i915_gem_init() */
4457 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
4458
Mika Kuoppala3accaf72016-04-13 17:26:43 +03004459 if (HAS_EDRAM(dev) && INTEL_GEN(dev_priv) < 9)
Ben Widawsky05e21cc2013-07-04 11:02:04 -07004460 I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf));
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004461
Tvrtko Ursulin772c2a52016-10-13 11:03:01 +01004462 if (IS_HASWELL(dev_priv))
Tvrtko Ursulin50a0bc92016-10-13 11:02:58 +01004463 I915_WRITE(MI_PREDICATE_RESULT_2, IS_HSW_GT3(dev_priv) ?
Ville Syrjälä0bf21342013-11-29 14:56:12 +02004464 LOWER_SLICE_ENABLED : LOWER_SLICE_DISABLED);
Rodrigo Vivi94353732013-08-28 16:45:46 -03004465
Tvrtko Ursulin6e266952016-10-13 11:02:53 +01004466 if (HAS_PCH_NOP(dev_priv)) {
Tvrtko Ursulinfd6b8f42016-10-14 10:13:06 +01004467 if (IS_IVYBRIDGE(dev_priv)) {
Daniel Vetter6ba844b2014-01-22 23:39:30 +01004468 u32 temp = I915_READ(GEN7_MSG_CTL);
4469 temp &= ~(WAIT_FOR_PCH_FLR_ACK | WAIT_FOR_PCH_RESET_ACK);
4470 I915_WRITE(GEN7_MSG_CTL, temp);
4471 } else if (INTEL_INFO(dev)->gen >= 7) {
4472 u32 temp = I915_READ(HSW_NDE_RSTWRN_OPT);
4473 temp &= ~RESET_PCH_HANDSHAKE_ENABLE;
4474 I915_WRITE(HSW_NDE_RSTWRN_OPT, temp);
4475 }
Ben Widawsky88a2b2a2013-04-05 13:12:43 -07004476 }
4477
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004478 i915_gem_init_swizzling(dev);
4479
Daniel Vetterd5abdfd2014-11-20 09:45:19 +01004480 /*
4481 * At least 830 can leave some of the unused rings
4482 * "active" (ie. head != tail) after resume which
4483 * will prevent c3 entry. Makes sure all unused rings
4484 * are totally idle.
4485 */
Tvrtko Ursulin50a0bc92016-10-13 11:02:58 +01004486 init_unused_rings(dev_priv);
Daniel Vetterd5abdfd2014-11-20 09:45:19 +01004487
Dave Gordoned54c1a2016-01-19 19:02:54 +00004488 BUG_ON(!dev_priv->kernel_context);
John Harrison90638cc2015-05-29 17:43:37 +01004489
John Harrison4ad2fd82015-06-18 13:11:20 +01004490 ret = i915_ppgtt_init_hw(dev);
4491 if (ret) {
4492 DRM_ERROR("PPGTT enable HW failed %d\n", ret);
4493 goto out;
4494 }
4495
4496 /* Need to do basic initialisation of all rings first: */
Akash Goel3b3f1652016-10-13 22:44:48 +05304497 for_each_engine(engine, dev_priv, id) {
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004498 ret = engine->init_hw(engine);
Daniel Vetter35a57ff2014-11-20 00:33:07 +01004499 if (ret)
Chris Wilson5e4f5182015-02-13 14:35:59 +00004500 goto out;
Daniel Vetter35a57ff2014-11-20 00:33:07 +01004501 }
Mika Kuoppala99433932013-01-22 14:12:17 +02004502
Peter Antoine0ccdacf2016-04-13 15:03:25 +01004503 intel_mocs_init_l3cc_table(dev);
4504
Alex Dai33a732f2015-08-12 15:43:36 +01004505 /* We can't enable contexts until all firmware is loaded */
Dave Gordone556f7c2016-06-07 09:14:49 +01004506 ret = intel_guc_setup(dev);
4507 if (ret)
4508 goto out;
Alex Dai33a732f2015-08-12 15:43:36 +01004509
Chris Wilson5e4f5182015-02-13 14:35:59 +00004510out:
4511 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
Ben Widawsky2fa48d82013-12-06 14:11:04 -08004512 return ret;
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004513}
4514
Chris Wilson39df9192016-07-20 13:31:57 +01004515bool intel_sanitize_semaphores(struct drm_i915_private *dev_priv, int value)
4516{
4517 if (INTEL_INFO(dev_priv)->gen < 6)
4518 return false;
4519
4520 /* TODO: make semaphores and Execlists play nicely together */
4521 if (i915.enable_execlists)
4522 return false;
4523
4524 if (value >= 0)
4525 return value;
4526
4527#ifdef CONFIG_INTEL_IOMMU
4528 /* Enable semaphores on SNB when IO remapping is off */
4529 if (INTEL_INFO(dev_priv)->gen == 6 && intel_iommu_gfx_mapped)
4530 return false;
4531#endif
4532
4533 return true;
4534}
4535
Chris Wilson1070a422012-04-24 15:47:41 +01004536int i915_gem_init(struct drm_device *dev)
4537{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004538 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson1070a422012-04-24 15:47:41 +01004539 int ret;
4540
Chris Wilson1070a422012-04-24 15:47:41 +01004541 mutex_lock(&dev->struct_mutex);
Jesse Barnesd62b4892013-03-08 10:45:53 -08004542
Oscar Mateoa83014d2014-07-24 17:04:21 +01004543 if (!i915.enable_execlists) {
Chris Wilson821ed7d2016-09-09 14:11:53 +01004544 dev_priv->gt.resume = intel_legacy_submission_resume;
Chris Wilson7e37f882016-08-02 22:50:21 +01004545 dev_priv->gt.cleanup_engine = intel_engine_cleanup;
Oscar Mateo454afeb2014-07-24 17:04:22 +01004546 } else {
Chris Wilson821ed7d2016-09-09 14:11:53 +01004547 dev_priv->gt.resume = intel_lr_context_resume;
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004548 dev_priv->gt.cleanup_engine = intel_logical_ring_cleanup;
Oscar Mateoa83014d2014-07-24 17:04:21 +01004549 }
4550
Chris Wilson5e4f5182015-02-13 14:35:59 +00004551 /* This is just a security blanket to placate dragons.
4552 * On some systems, we very sporadically observe that the first TLBs
4553 * used by the CS may be stale, despite us poking the TLB reset. If
4554 * we hold the forcewake during initialisation these problems
4555 * just magically go away.
4556 */
4557 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
4558
Chris Wilson72778cb2016-05-19 16:17:16 +01004559 i915_gem_init_userptr(dev_priv);
Chris Wilsonf6b9d5c2016-08-04 07:52:23 +01004560
4561 ret = i915_gem_init_ggtt(dev_priv);
4562 if (ret)
4563 goto out_unlock;
Jesse Barnesd62b4892013-03-08 10:45:53 -08004564
Ben Widawsky2fa48d82013-12-06 14:11:04 -08004565 ret = i915_gem_context_init(dev);
Jani Nikula7bcc3772014-12-05 14:17:42 +02004566 if (ret)
4567 goto out_unlock;
Ben Widawsky2fa48d82013-12-06 14:11:04 -08004568
Tvrtko Ursulin8b3e2d32016-07-13 16:03:37 +01004569 ret = intel_engines_init(dev);
Daniel Vetter35a57ff2014-11-20 00:33:07 +01004570 if (ret)
Jani Nikula7bcc3772014-12-05 14:17:42 +02004571 goto out_unlock;
Daniel Vetter53ca26c2012-04-26 23:28:03 +02004572
4573 ret = i915_gem_init_hw(dev);
Chris Wilson60990322014-04-09 09:19:42 +01004574 if (ret == -EIO) {
Chris Wilson7e21d642016-07-27 09:07:29 +01004575 /* Allow engine initialisation to fail by marking the GPU as
Chris Wilson60990322014-04-09 09:19:42 +01004576 * wedged. But we only want to do this where the GPU is angry,
4577 * for all other failure, such as an allocation failure, bail.
4578 */
4579 DRM_ERROR("Failed to initialize GPU, declaring it wedged\n");
Chris Wilson821ed7d2016-09-09 14:11:53 +01004580 i915_gem_set_wedged(dev_priv);
Chris Wilson60990322014-04-09 09:19:42 +01004581 ret = 0;
Chris Wilson1070a422012-04-24 15:47:41 +01004582 }
Jani Nikula7bcc3772014-12-05 14:17:42 +02004583
4584out_unlock:
Chris Wilson5e4f5182015-02-13 14:35:59 +00004585 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
Chris Wilson60990322014-04-09 09:19:42 +01004586 mutex_unlock(&dev->struct_mutex);
Chris Wilson1070a422012-04-24 15:47:41 +01004587
Chris Wilson60990322014-04-09 09:19:42 +01004588 return ret;
Chris Wilson1070a422012-04-24 15:47:41 +01004589}
4590
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004591void
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004592i915_gem_cleanup_engines(struct drm_device *dev)
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004593{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004594 struct drm_i915_private *dev_priv = to_i915(dev);
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004595 struct intel_engine_cs *engine;
Akash Goel3b3f1652016-10-13 22:44:48 +05304596 enum intel_engine_id id;
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004597
Akash Goel3b3f1652016-10-13 22:44:48 +05304598 for_each_engine(engine, dev_priv, id)
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004599 dev_priv->gt.cleanup_engine(engine);
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004600}
4601
Eric Anholt673a3942008-07-30 12:06:12 -07004602void
Imre Deak40ae4e12016-03-16 14:54:03 +02004603i915_gem_load_init_fences(struct drm_i915_private *dev_priv)
4604{
Chris Wilson91c8a322016-07-05 10:40:23 +01004605 struct drm_device *dev = &dev_priv->drm;
Chris Wilson49ef5292016-08-18 17:17:00 +01004606 int i;
Imre Deak40ae4e12016-03-16 14:54:03 +02004607
4608 if (INTEL_INFO(dev_priv)->gen >= 7 && !IS_VALLEYVIEW(dev_priv) &&
4609 !IS_CHERRYVIEW(dev_priv))
4610 dev_priv->num_fence_regs = 32;
4611 else if (INTEL_INFO(dev_priv)->gen >= 4 || IS_I945G(dev_priv) ||
4612 IS_I945GM(dev_priv) || IS_G33(dev_priv))
4613 dev_priv->num_fence_regs = 16;
4614 else
4615 dev_priv->num_fence_regs = 8;
4616
Chris Wilsonc0336662016-05-06 15:40:21 +01004617 if (intel_vgpu_active(dev_priv))
Imre Deak40ae4e12016-03-16 14:54:03 +02004618 dev_priv->num_fence_regs =
4619 I915_READ(vgtif_reg(avail_rs.fence_num));
4620
4621 /* Initialize fence registers to zero */
Chris Wilson49ef5292016-08-18 17:17:00 +01004622 for (i = 0; i < dev_priv->num_fence_regs; i++) {
4623 struct drm_i915_fence_reg *fence = &dev_priv->fence_regs[i];
4624
4625 fence->i915 = dev_priv;
4626 fence->id = i;
4627 list_add_tail(&fence->link, &dev_priv->mm.fence_list);
4628 }
Imre Deak40ae4e12016-03-16 14:54:03 +02004629 i915_gem_restore_fences(dev);
4630
4631 i915_gem_detect_bit_6_swizzle(dev);
4632}
4633
4634void
Imre Deakd64aa092016-01-19 15:26:29 +02004635i915_gem_load_init(struct drm_device *dev)
Eric Anholt673a3942008-07-30 12:06:12 -07004636{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004637 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson42dcedd2012-11-15 11:32:30 +00004638
Chris Wilsonefab6d82015-04-07 16:20:57 +01004639 dev_priv->objects =
Chris Wilson42dcedd2012-11-15 11:32:30 +00004640 kmem_cache_create("i915_gem_object",
4641 sizeof(struct drm_i915_gem_object), 0,
4642 SLAB_HWCACHE_ALIGN,
4643 NULL);
Chris Wilsone20d2ab2015-04-07 16:20:58 +01004644 dev_priv->vmas =
4645 kmem_cache_create("i915_gem_vma",
4646 sizeof(struct i915_vma), 0,
4647 SLAB_HWCACHE_ALIGN,
4648 NULL);
Chris Wilsonefab6d82015-04-07 16:20:57 +01004649 dev_priv->requests =
4650 kmem_cache_create("i915_gem_request",
4651 sizeof(struct drm_i915_gem_request), 0,
Chris Wilson0eafec62016-08-04 16:32:41 +01004652 SLAB_HWCACHE_ALIGN |
4653 SLAB_RECLAIM_ACCOUNT |
4654 SLAB_DESTROY_BY_RCU,
Chris Wilsonefab6d82015-04-07 16:20:57 +01004655 NULL);
Eric Anholt673a3942008-07-30 12:06:12 -07004656
Ben Widawskya33afea2013-09-17 21:12:45 -07004657 INIT_LIST_HEAD(&dev_priv->context_list);
Chris Wilson6c085a72012-08-20 11:40:46 +02004658 INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
4659 INIT_LIST_HEAD(&dev_priv->mm.bound_list);
Eric Anholta09ba7f2009-08-29 12:49:51 -07004660 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
Chris Wilson275f0392016-10-24 13:42:14 +01004661 INIT_LIST_HEAD(&dev_priv->mm.userfault_list);
Chris Wilson67d97da2016-07-04 08:08:31 +01004662 INIT_DELAYED_WORK(&dev_priv->gt.retire_work,
Eric Anholt673a3942008-07-30 12:06:12 -07004663 i915_gem_retire_work_handler);
Chris Wilson67d97da2016-07-04 08:08:31 +01004664 INIT_DELAYED_WORK(&dev_priv->gt.idle_work,
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004665 i915_gem_idle_work_handler);
Chris Wilson1f15b762016-07-01 17:23:14 +01004666 init_waitqueue_head(&dev_priv->gpu_error.wait_queue);
Daniel Vetter1f83fee2012-11-15 17:17:22 +01004667 init_waitqueue_head(&dev_priv->gpu_error.reset_queue);
Chris Wilson31169712009-09-14 16:50:28 +01004668
Chris Wilson72bfa192010-12-19 11:42:05 +00004669 dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
4670
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05004671 init_waitqueue_head(&dev_priv->pending_flip_queue);
Chris Wilson17250b72010-10-28 12:51:39 +01004672
Chris Wilsonce453d82011-02-21 14:43:56 +00004673 dev_priv->mm.interruptible = true;
4674
Joonas Lahtinen6f633402016-09-01 14:58:21 +03004675 atomic_set(&dev_priv->mm.bsd_engine_dispatch_index, 0);
4676
Chris Wilsonb5add952016-08-04 16:32:36 +01004677 spin_lock_init(&dev_priv->fb_tracking.lock);
Eric Anholt673a3942008-07-30 12:06:12 -07004678}
Dave Airlie71acb5e2008-12-30 20:31:46 +10004679
Imre Deakd64aa092016-01-19 15:26:29 +02004680void i915_gem_load_cleanup(struct drm_device *dev)
4681{
4682 struct drm_i915_private *dev_priv = to_i915(dev);
4683
4684 kmem_cache_destroy(dev_priv->requests);
4685 kmem_cache_destroy(dev_priv->vmas);
4686 kmem_cache_destroy(dev_priv->objects);
Chris Wilson0eafec62016-08-04 16:32:41 +01004687
4688 /* And ensure that our DESTROY_BY_RCU slabs are truly destroyed */
4689 rcu_barrier();
Imre Deakd64aa092016-01-19 15:26:29 +02004690}
4691
Chris Wilson6a800ea2016-09-21 14:51:07 +01004692int i915_gem_freeze(struct drm_i915_private *dev_priv)
4693{
4694 intel_runtime_pm_get(dev_priv);
4695
4696 mutex_lock(&dev_priv->drm.struct_mutex);
4697 i915_gem_shrink_all(dev_priv);
4698 mutex_unlock(&dev_priv->drm.struct_mutex);
4699
4700 intel_runtime_pm_put(dev_priv);
4701
4702 return 0;
4703}
4704
Chris Wilson461fb992016-05-14 07:26:33 +01004705int i915_gem_freeze_late(struct drm_i915_private *dev_priv)
4706{
4707 struct drm_i915_gem_object *obj;
Chris Wilson7aab2d52016-09-09 20:02:18 +01004708 struct list_head *phases[] = {
4709 &dev_priv->mm.unbound_list,
4710 &dev_priv->mm.bound_list,
4711 NULL
4712 }, **p;
Chris Wilson461fb992016-05-14 07:26:33 +01004713
4714 /* Called just before we write the hibernation image.
4715 *
4716 * We need to update the domain tracking to reflect that the CPU
4717 * will be accessing all the pages to create and restore from the
4718 * hibernation, and so upon restoration those pages will be in the
4719 * CPU domain.
4720 *
4721 * To make sure the hibernation image contains the latest state,
4722 * we update that state just before writing out the image.
Chris Wilson7aab2d52016-09-09 20:02:18 +01004723 *
4724 * To try and reduce the hibernation image, we manually shrink
4725 * the objects as well.
Chris Wilson461fb992016-05-14 07:26:33 +01004726 */
4727
Chris Wilson6a800ea2016-09-21 14:51:07 +01004728 mutex_lock(&dev_priv->drm.struct_mutex);
4729 i915_gem_shrink(dev_priv, -1UL, I915_SHRINK_UNBOUND);
Chris Wilson461fb992016-05-14 07:26:33 +01004730
Chris Wilson7aab2d52016-09-09 20:02:18 +01004731 for (p = phases; *p; p++) {
4732 list_for_each_entry(obj, *p, global_list) {
4733 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
4734 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
4735 }
Chris Wilson461fb992016-05-14 07:26:33 +01004736 }
Chris Wilson6a800ea2016-09-21 14:51:07 +01004737 mutex_unlock(&dev_priv->drm.struct_mutex);
Chris Wilson461fb992016-05-14 07:26:33 +01004738
4739 return 0;
4740}
4741
Chris Wilsonf787a5f2010-09-24 16:02:42 +01004742void i915_gem_release(struct drm_device *dev, struct drm_file *file)
Eric Anholtb9624422009-06-03 07:27:35 +00004743{
Chris Wilsonf787a5f2010-09-24 16:02:42 +01004744 struct drm_i915_file_private *file_priv = file->driver_priv;
Chris Wilson15f7bbc2016-07-26 12:01:52 +01004745 struct drm_i915_gem_request *request;
Eric Anholtb9624422009-06-03 07:27:35 +00004746
4747 /* Clean up our request list when the client is going away, so that
4748 * later retire_requests won't dereference our soon-to-be-gone
4749 * file_priv.
4750 */
Chris Wilson1c255952010-09-26 11:03:27 +01004751 spin_lock(&file_priv->mm.lock);
Chris Wilson15f7bbc2016-07-26 12:01:52 +01004752 list_for_each_entry(request, &file_priv->mm.request_list, client_list)
Chris Wilsonf787a5f2010-09-24 16:02:42 +01004753 request->file_priv = NULL;
Chris Wilson1c255952010-09-26 11:03:27 +01004754 spin_unlock(&file_priv->mm.lock);
Chris Wilson31169712009-09-14 16:50:28 +01004755
Chris Wilson2e1b8732015-04-27 13:41:22 +01004756 if (!list_empty(&file_priv->rps.link)) {
Chris Wilson8d3afd72015-05-21 21:01:47 +01004757 spin_lock(&to_i915(dev)->rps.client_lock);
Chris Wilson2e1b8732015-04-27 13:41:22 +01004758 list_del(&file_priv->rps.link);
Chris Wilson8d3afd72015-05-21 21:01:47 +01004759 spin_unlock(&to_i915(dev)->rps.client_lock);
Chris Wilson1854d5c2015-04-07 16:20:32 +01004760 }
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004761}
4762
4763int i915_gem_open(struct drm_device *dev, struct drm_file *file)
4764{
4765 struct drm_i915_file_private *file_priv;
Ben Widawskye422b882013-12-06 14:10:58 -08004766 int ret;
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004767
4768 DRM_DEBUG_DRIVER("\n");
4769
4770 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
4771 if (!file_priv)
4772 return -ENOMEM;
4773
4774 file->driver_priv = file_priv;
Dave Gordonf19ec8c2016-07-04 11:34:37 +01004775 file_priv->dev_priv = to_i915(dev);
Chris Wilsonab0e7ff2014-02-25 17:11:24 +02004776 file_priv->file = file;
Chris Wilson2e1b8732015-04-27 13:41:22 +01004777 INIT_LIST_HEAD(&file_priv->rps.link);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004778
4779 spin_lock_init(&file_priv->mm.lock);
4780 INIT_LIST_HEAD(&file_priv->mm.request_list);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004781
Chris Wilsonc80ff162016-07-27 09:07:27 +01004782 file_priv->bsd_engine = -1;
Tvrtko Ursulinde1add32016-01-15 15:12:50 +00004783
Ben Widawskye422b882013-12-06 14:10:58 -08004784 ret = i915_gem_context_open(dev, file);
4785 if (ret)
4786 kfree(file_priv);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004787
Ben Widawskye422b882013-12-06 14:10:58 -08004788 return ret;
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004789}
4790
Daniel Vetterb680c372014-09-19 18:27:27 +02004791/**
4792 * i915_gem_track_fb - update frontbuffer tracking
Geliang Tangd9072a32015-09-15 05:58:44 -07004793 * @old: current GEM buffer for the frontbuffer slots
4794 * @new: new GEM buffer for the frontbuffer slots
4795 * @frontbuffer_bits: bitmask of frontbuffer slots
Daniel Vetterb680c372014-09-19 18:27:27 +02004796 *
4797 * This updates the frontbuffer tracking bits @frontbuffer_bits by clearing them
4798 * from @old and setting them in @new. Both @old and @new can be NULL.
4799 */
Daniel Vettera071fa02014-06-18 23:28:09 +02004800void i915_gem_track_fb(struct drm_i915_gem_object *old,
4801 struct drm_i915_gem_object *new,
4802 unsigned frontbuffer_bits)
4803{
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004804 /* Control of individual bits within the mask are guarded by
4805 * the owning plane->mutex, i.e. we can never see concurrent
4806 * manipulation of individual bits. But since the bitfield as a whole
4807 * is updated using RMW, we need to use atomics in order to update
4808 * the bits.
4809 */
4810 BUILD_BUG_ON(INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES >
4811 sizeof(atomic_t) * BITS_PER_BYTE);
4812
Daniel Vettera071fa02014-06-18 23:28:09 +02004813 if (old) {
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004814 WARN_ON(!(atomic_read(&old->frontbuffer_bits) & frontbuffer_bits));
4815 atomic_andnot(frontbuffer_bits, &old->frontbuffer_bits);
Daniel Vettera071fa02014-06-18 23:28:09 +02004816 }
4817
4818 if (new) {
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004819 WARN_ON(atomic_read(&new->frontbuffer_bits) & frontbuffer_bits);
4820 atomic_or(frontbuffer_bits, &new->frontbuffer_bits);
Daniel Vettera071fa02014-06-18 23:28:09 +02004821 }
4822}
4823
Dave Gordon033908a2015-12-10 18:51:23 +00004824/* Like i915_gem_object_get_page(), but mark the returned page dirty */
4825struct page *
4826i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, int n)
4827{
4828 struct page *page;
4829
4830 /* Only default objects have per-page dirty tracking */
Chris Wilsonb9bcd142016-06-20 15:05:51 +01004831 if (WARN_ON(!i915_gem_object_has_struct_page(obj)))
Dave Gordon033908a2015-12-10 18:51:23 +00004832 return NULL;
4833
4834 page = i915_gem_object_get_page(obj, n);
4835 set_page_dirty(page);
4836 return page;
4837}
4838
Dave Gordonea702992015-07-09 19:29:02 +01004839/* Allocate a new GEM object and fill it with the supplied data */
4840struct drm_i915_gem_object *
4841i915_gem_object_create_from_data(struct drm_device *dev,
4842 const void *data, size_t size)
4843{
4844 struct drm_i915_gem_object *obj;
4845 struct sg_table *sg;
4846 size_t bytes;
4847 int ret;
4848
Dave Gordond37cd8a2016-04-22 19:14:32 +01004849 obj = i915_gem_object_create(dev, round_up(size, PAGE_SIZE));
Chris Wilsonfe3db792016-04-25 13:32:13 +01004850 if (IS_ERR(obj))
Dave Gordonea702992015-07-09 19:29:02 +01004851 return obj;
4852
4853 ret = i915_gem_object_set_to_cpu_domain(obj, true);
4854 if (ret)
4855 goto fail;
4856
4857 ret = i915_gem_object_get_pages(obj);
4858 if (ret)
4859 goto fail;
4860
4861 i915_gem_object_pin_pages(obj);
4862 sg = obj->pages;
4863 bytes = sg_copy_from_buffer(sg->sgl, sg->nents, (void *)data, size);
Dave Gordon9e7d18c2015-12-10 18:51:24 +00004864 obj->dirty = 1; /* Backing store is now out of date */
Dave Gordonea702992015-07-09 19:29:02 +01004865 i915_gem_object_unpin_pages(obj);
4866
4867 if (WARN_ON(bytes != size)) {
4868 DRM_ERROR("Incomplete copy, wrote %zu of %zu", bytes, size);
4869 ret = -EFAULT;
4870 goto fail;
4871 }
4872
4873 return obj;
4874
4875fail:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01004876 i915_gem_object_put(obj);
Dave Gordonea702992015-07-09 19:29:02 +01004877 return ERR_PTR(ret);
4878}