blob: 16b388e2c9c584adf18f5f278de56347dffeaa0a [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,
85 size_t size)
86{
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,
94 size_t size)
95{
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{
Chris Wilson6a2c4232014-11-04 04:51:40 -0800173 struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;
174 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) {
Chris Wilson00731152014-05-21 12:42:56 +0100240 struct address_space *mapping = file_inode(obj->base.filp)->i_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 Wilsonaa653a62016-08-04 07:52:27 +0100282int
283i915_gem_object_unbind(struct drm_i915_gem_object *obj)
284{
285 struct i915_vma *vma;
286 LIST_HEAD(still_in_list);
287 int ret;
288
289 /* The vma will only be freed if it is marked as closed, and if we wait
290 * upon rendering to the vma, we may unbind anything in the list.
291 */
292 while ((vma = list_first_entry_or_null(&obj->vma_list,
293 struct i915_vma,
294 obj_link))) {
295 list_move_tail(&vma->obj_link, &still_in_list);
296 ret = i915_vma_unbind(vma);
297 if (ret)
298 break;
299 }
300 list_splice(&still_in_list, &obj->vma_list);
301
302 return ret;
303}
304
Chris Wilson00e60f22016-08-04 16:32:40 +0100305/**
306 * Ensures that all rendering to the object has completed and the object is
307 * safe to unbind from the GTT or access from the CPU.
308 * @obj: i915 gem object
309 * @readonly: waiting for just read access or read-write access
310 */
311int
312i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
313 bool readonly)
314{
315 struct reservation_object *resv;
316 struct i915_gem_active *active;
317 unsigned long active_mask;
318 int idx;
319
320 lockdep_assert_held(&obj->base.dev->struct_mutex);
321
322 if (!readonly) {
323 active = obj->last_read;
324 active_mask = i915_gem_object_get_active(obj);
325 } else {
326 active_mask = 1;
327 active = &obj->last_write;
328 }
329
330 for_each_active(active_mask, idx) {
331 int ret;
332
333 ret = i915_gem_active_wait(&active[idx],
334 &obj->base.dev->struct_mutex);
335 if (ret)
336 return ret;
337 }
338
339 resv = i915_gem_object_get_dmabuf_resv(obj);
340 if (resv) {
341 long err;
342
343 err = reservation_object_wait_timeout_rcu(resv, !readonly, true,
344 MAX_SCHEDULE_TIMEOUT);
345 if (err < 0)
346 return err;
347 }
348
349 return 0;
350}
351
352/* A nonblocking variant of the above wait. This is a highly dangerous routine
353 * as the object state may change during this call.
354 */
355static __must_check int
356i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
357 struct intel_rps_client *rps,
358 bool readonly)
359{
360 struct drm_device *dev = obj->base.dev;
361 struct drm_i915_gem_request *requests[I915_NUM_ENGINES];
362 struct i915_gem_active *active;
363 unsigned long active_mask;
364 int ret, i, n = 0;
365
366 lockdep_assert_held(&dev->struct_mutex);
367 GEM_BUG_ON(!to_i915(dev)->mm.interruptible);
368
369 active_mask = i915_gem_object_get_active(obj);
370 if (!active_mask)
371 return 0;
372
373 if (!readonly) {
374 active = obj->last_read;
375 } else {
376 active_mask = 1;
377 active = &obj->last_write;
378 }
379
380 for_each_active(active_mask, i) {
381 struct drm_i915_gem_request *req;
382
383 req = i915_gem_active_get(&active[i],
384 &obj->base.dev->struct_mutex);
385 if (req)
386 requests[n++] = req;
387 }
388
389 mutex_unlock(&dev->struct_mutex);
390 ret = 0;
391 for (i = 0; ret == 0 && i < n; i++)
392 ret = i915_wait_request(requests[i], true, NULL, rps);
393 mutex_lock(&dev->struct_mutex);
394
395 for (i = 0; i < n; i++)
396 i915_gem_request_put(requests[i]);
397
398 return ret;
399}
400
401static struct intel_rps_client *to_rps_client(struct drm_file *file)
402{
403 struct drm_i915_file_private *fpriv = file->driver_priv;
404
405 return &fpriv->rps;
406}
407
Chris Wilson00731152014-05-21 12:42:56 +0100408int
409i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
410 int align)
411{
412 drm_dma_handle_t *phys;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800413 int ret;
Chris Wilson00731152014-05-21 12:42:56 +0100414
415 if (obj->phys_handle) {
416 if ((unsigned long)obj->phys_handle->vaddr & (align -1))
417 return -EBUSY;
418
419 return 0;
420 }
421
422 if (obj->madv != I915_MADV_WILLNEED)
423 return -EFAULT;
424
425 if (obj->base.filp == NULL)
426 return -EINVAL;
427
Chris Wilson4717ca92016-08-04 07:52:28 +0100428 ret = i915_gem_object_unbind(obj);
429 if (ret)
430 return ret;
431
432 ret = i915_gem_object_put_pages(obj);
Chris Wilson6a2c4232014-11-04 04:51:40 -0800433 if (ret)
434 return ret;
435
Chris Wilson00731152014-05-21 12:42:56 +0100436 /* create a new object */
437 phys = drm_pci_alloc(obj->base.dev, obj->base.size, align);
438 if (!phys)
439 return -ENOMEM;
440
Chris Wilson00731152014-05-21 12:42:56 +0100441 obj->phys_handle = phys;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800442 obj->ops = &i915_gem_phys_ops;
443
444 return i915_gem_object_get_pages(obj);
Chris Wilson00731152014-05-21 12:42:56 +0100445}
446
447static int
448i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
449 struct drm_i915_gem_pwrite *args,
450 struct drm_file *file_priv)
451{
452 struct drm_device *dev = obj->base.dev;
453 void *vaddr = obj->phys_handle->vaddr + args->offset;
Gustavo Padovan3ed605b2016-04-26 12:32:27 -0300454 char __user *user_data = u64_to_user_ptr(args->data_ptr);
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200455 int ret = 0;
Chris Wilson6a2c4232014-11-04 04:51:40 -0800456
457 /* We manually control the domain here and pretend that it
458 * remains coherent i.e. in the GTT domain, like shmem_pwrite.
459 */
460 ret = i915_gem_object_wait_rendering(obj, false);
461 if (ret)
462 return ret;
Chris Wilson00731152014-05-21 12:42:56 +0100463
Rodrigo Vivi77a0d1c2015-06-18 11:43:24 -0700464 intel_fb_obj_invalidate(obj, ORIGIN_CPU);
Chris Wilson00731152014-05-21 12:42:56 +0100465 if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
466 unsigned long unwritten;
467
468 /* The physical object once assigned is fixed for the lifetime
469 * of the obj, so we can safely drop the lock and continue
470 * to access vaddr.
471 */
472 mutex_unlock(&dev->struct_mutex);
473 unwritten = copy_from_user(vaddr, user_data, args->size);
474 mutex_lock(&dev->struct_mutex);
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200475 if (unwritten) {
476 ret = -EFAULT;
477 goto out;
478 }
Chris Wilson00731152014-05-21 12:42:56 +0100479 }
480
Chris Wilson6a2c4232014-11-04 04:51:40 -0800481 drm_clflush_virt_range(vaddr, args->size);
Chris Wilsonc0336662016-05-06 15:40:21 +0100482 i915_gem_chipset_flush(to_i915(dev));
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200483
484out:
Rodrigo Vivide152b62015-07-07 16:28:51 -0700485 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Paulo Zanoni063e4e62015-02-13 17:23:45 -0200486 return ret;
Chris Wilson00731152014-05-21 12:42:56 +0100487}
488
Chris Wilson42dcedd2012-11-15 11:32:30 +0000489void *i915_gem_object_alloc(struct drm_device *dev)
490{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100491 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilsonefab6d82015-04-07 16:20:57 +0100492 return kmem_cache_zalloc(dev_priv->objects, GFP_KERNEL);
Chris Wilson42dcedd2012-11-15 11:32:30 +0000493}
494
495void i915_gem_object_free(struct drm_i915_gem_object *obj)
496{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100497 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilsonefab6d82015-04-07 16:20:57 +0100498 kmem_cache_free(dev_priv->objects, obj);
Chris Wilson42dcedd2012-11-15 11:32:30 +0000499}
500
Dave Airlieff72145b2011-02-07 12:16:14 +1000501static int
502i915_gem_create(struct drm_file *file,
503 struct drm_device *dev,
504 uint64_t size,
505 uint32_t *handle_p)
Eric Anholt673a3942008-07-30 12:06:12 -0700506{
Chris Wilson05394f32010-11-08 19:18:58 +0000507 struct drm_i915_gem_object *obj;
Pekka Paalanena1a2d1d2009-08-23 12:40:55 +0300508 int ret;
509 u32 handle;
Eric Anholt673a3942008-07-30 12:06:12 -0700510
Dave Airlieff72145b2011-02-07 12:16:14 +1000511 size = roundup(size, PAGE_SIZE);
Chris Wilson8ffc0242011-09-14 14:14:28 +0200512 if (size == 0)
513 return -EINVAL;
Eric Anholt673a3942008-07-30 12:06:12 -0700514
515 /* Allocate the new object */
Dave Gordond37cd8a2016-04-22 19:14:32 +0100516 obj = i915_gem_object_create(dev, size);
Chris Wilsonfe3db792016-04-25 13:32:13 +0100517 if (IS_ERR(obj))
518 return PTR_ERR(obj);
Eric Anholt673a3942008-07-30 12:06:12 -0700519
Chris Wilson05394f32010-11-08 19:18:58 +0000520 ret = drm_gem_handle_create(file, &obj->base, &handle);
Chris Wilson202f2fe2010-10-14 13:20:40 +0100521 /* drop reference from allocate - handle holds it now */
Chris Wilson34911fd2016-07-20 13:31:54 +0100522 i915_gem_object_put_unlocked(obj);
Daniel Vetterd861e332013-07-24 23:25:03 +0200523 if (ret)
524 return ret;
Chris Wilson202f2fe2010-10-14 13:20:40 +0100525
Dave Airlieff72145b2011-02-07 12:16:14 +1000526 *handle_p = handle;
Eric Anholt673a3942008-07-30 12:06:12 -0700527 return 0;
528}
529
Dave Airlieff72145b2011-02-07 12:16:14 +1000530int
531i915_gem_dumb_create(struct drm_file *file,
532 struct drm_device *dev,
533 struct drm_mode_create_dumb *args)
534{
535 /* have to work out size/pitch and return them */
Paulo Zanonide45eaf2013-10-18 18:48:24 -0300536 args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64);
Dave Airlieff72145b2011-02-07 12:16:14 +1000537 args->size = args->pitch * args->height;
538 return i915_gem_create(file, dev,
Dave Airlieda6b51d2014-12-24 13:11:17 +1000539 args->size, &args->handle);
Dave Airlieff72145b2011-02-07 12:16:14 +1000540}
541
Dave Airlieff72145b2011-02-07 12:16:14 +1000542/**
543 * Creates a new mm object and returns a handle to it.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +0100544 * @dev: drm device pointer
545 * @data: ioctl data blob
546 * @file: drm file pointer
Dave Airlieff72145b2011-02-07 12:16:14 +1000547 */
548int
549i915_gem_create_ioctl(struct drm_device *dev, void *data,
550 struct drm_file *file)
551{
552 struct drm_i915_gem_create *args = data;
Daniel Vetter63ed2cb2012-04-23 16:50:50 +0200553
Dave Airlieff72145b2011-02-07 12:16:14 +1000554 return i915_gem_create(file, dev,
Dave Airlieda6b51d2014-12-24 13:11:17 +1000555 args->size, &args->handle);
Dave Airlieff72145b2011-02-07 12:16:14 +1000556}
557
Daniel Vetter8c599672011-12-14 13:57:31 +0100558static inline int
Daniel Vetter8461d222011-12-14 13:57:32 +0100559__copy_to_user_swizzled(char __user *cpu_vaddr,
560 const char *gpu_vaddr, int gpu_offset,
561 int length)
562{
563 int ret, cpu_offset = 0;
564
565 while (length > 0) {
566 int cacheline_end = ALIGN(gpu_offset + 1, 64);
567 int this_length = min(cacheline_end - gpu_offset, length);
568 int swizzled_gpu_offset = gpu_offset ^ 64;
569
570 ret = __copy_to_user(cpu_vaddr + cpu_offset,
571 gpu_vaddr + swizzled_gpu_offset,
572 this_length);
573 if (ret)
574 return ret + length;
575
576 cpu_offset += this_length;
577 gpu_offset += this_length;
578 length -= this_length;
579 }
580
581 return 0;
582}
583
584static inline int
Ben Widawsky4f0c7cf2012-04-16 14:07:47 -0700585__copy_from_user_swizzled(char *gpu_vaddr, int gpu_offset,
586 const char __user *cpu_vaddr,
Daniel Vetter8c599672011-12-14 13:57:31 +0100587 int length)
588{
589 int ret, cpu_offset = 0;
590
591 while (length > 0) {
592 int cacheline_end = ALIGN(gpu_offset + 1, 64);
593 int this_length = min(cacheline_end - gpu_offset, length);
594 int swizzled_gpu_offset = gpu_offset ^ 64;
595
596 ret = __copy_from_user(gpu_vaddr + swizzled_gpu_offset,
597 cpu_vaddr + cpu_offset,
598 this_length);
599 if (ret)
600 return ret + length;
601
602 cpu_offset += this_length;
603 gpu_offset += this_length;
604 length -= this_length;
605 }
606
607 return 0;
608}
609
Brad Volkin4c914c02014-02-18 10:15:45 -0800610/*
611 * Pins the specified object's pages and synchronizes the object with
612 * GPU accesses. Sets needs_clflush to non-zero if the caller should
613 * flush the object from the CPU cache.
614 */
615int i915_gem_obj_prepare_shmem_read(struct drm_i915_gem_object *obj,
616 int *needs_clflush)
617{
618 int ret;
619
620 *needs_clflush = 0;
621
Chris Wilsonb9bcd142016-06-20 15:05:51 +0100622 if (WARN_ON(!i915_gem_object_has_struct_page(obj)))
Brad Volkin4c914c02014-02-18 10:15:45 -0800623 return -EINVAL;
624
Chris Wilsonc13d87e2016-07-20 09:21:15 +0100625 ret = i915_gem_object_wait_rendering(obj, true);
626 if (ret)
627 return ret;
628
Brad Volkin4c914c02014-02-18 10:15:45 -0800629 if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU)) {
630 /* If we're not in the cpu read domain, set ourself into the gtt
631 * read domain and manually flush cachelines (if required). This
632 * optimizes for the case when the gpu will dirty the data
633 * anyway again before the next pread happens. */
634 *needs_clflush = !cpu_cache_is_coherent(obj->base.dev,
635 obj->cache_level);
Brad Volkin4c914c02014-02-18 10:15:45 -0800636 }
637
638 ret = i915_gem_object_get_pages(obj);
639 if (ret)
640 return ret;
641
642 i915_gem_object_pin_pages(obj);
643
644 return ret;
645}
646
Daniel Vetterd174bd62012-03-25 19:47:40 +0200647/* Per-page copy function for the shmem pread fastpath.
648 * Flushes invalid cachelines before reading the target if
649 * needs_clflush is set. */
Eric Anholteb014592009-03-10 11:44:52 -0700650static int
Daniel Vetterd174bd62012-03-25 19:47:40 +0200651shmem_pread_fast(struct page *page, int shmem_page_offset, int page_length,
652 char __user *user_data,
653 bool page_do_bit17_swizzling, bool needs_clflush)
654{
655 char *vaddr;
656 int ret;
657
Daniel Vettere7e58eb2012-03-25 19:47:43 +0200658 if (unlikely(page_do_bit17_swizzling))
Daniel Vetterd174bd62012-03-25 19:47:40 +0200659 return -EINVAL;
660
661 vaddr = kmap_atomic(page);
662 if (needs_clflush)
663 drm_clflush_virt_range(vaddr + shmem_page_offset,
664 page_length);
665 ret = __copy_to_user_inatomic(user_data,
666 vaddr + shmem_page_offset,
667 page_length);
668 kunmap_atomic(vaddr);
669
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100670 return ret ? -EFAULT : 0;
Daniel Vetterd174bd62012-03-25 19:47:40 +0200671}
672
Daniel Vetter23c18c72012-03-25 19:47:42 +0200673static void
674shmem_clflush_swizzled_range(char *addr, unsigned long length,
675 bool swizzled)
676{
Daniel Vettere7e58eb2012-03-25 19:47:43 +0200677 if (unlikely(swizzled)) {
Daniel Vetter23c18c72012-03-25 19:47:42 +0200678 unsigned long start = (unsigned long) addr;
679 unsigned long end = (unsigned long) addr + length;
680
681 /* For swizzling simply ensure that we always flush both
682 * channels. Lame, but simple and it works. Swizzled
683 * pwrite/pread is far from a hotpath - current userspace
684 * doesn't use it at all. */
685 start = round_down(start, 128);
686 end = round_up(end, 128);
687
688 drm_clflush_virt_range((void *)start, end - start);
689 } else {
690 drm_clflush_virt_range(addr, length);
691 }
692
693}
694
Daniel Vetterd174bd62012-03-25 19:47:40 +0200695/* Only difference to the fast-path function is that this can handle bit17
696 * and uses non-atomic copy and kmap functions. */
697static int
698shmem_pread_slow(struct page *page, int shmem_page_offset, int page_length,
699 char __user *user_data,
700 bool page_do_bit17_swizzling, bool needs_clflush)
701{
702 char *vaddr;
703 int ret;
704
705 vaddr = kmap(page);
706 if (needs_clflush)
Daniel Vetter23c18c72012-03-25 19:47:42 +0200707 shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
708 page_length,
709 page_do_bit17_swizzling);
Daniel Vetterd174bd62012-03-25 19:47:40 +0200710
711 if (page_do_bit17_swizzling)
712 ret = __copy_to_user_swizzled(user_data,
713 vaddr, shmem_page_offset,
714 page_length);
715 else
716 ret = __copy_to_user(user_data,
717 vaddr + shmem_page_offset,
718 page_length);
719 kunmap(page);
720
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100721 return ret ? - EFAULT : 0;
Daniel Vetterd174bd62012-03-25 19:47:40 +0200722}
723
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530724static inline unsigned long
725slow_user_access(struct io_mapping *mapping,
726 uint64_t page_base, int page_offset,
727 char __user *user_data,
728 unsigned long length, bool pwrite)
729{
730 void __iomem *ioaddr;
731 void *vaddr;
732 uint64_t unwritten;
733
734 ioaddr = io_mapping_map_wc(mapping, page_base, PAGE_SIZE);
735 /* We can use the cpu mem copy function because this is X86. */
736 vaddr = (void __force *)ioaddr + page_offset;
737 if (pwrite)
738 unwritten = __copy_from_user(vaddr, user_data, length);
739 else
740 unwritten = __copy_to_user(user_data, vaddr, length);
741
742 io_mapping_unmap(ioaddr);
743 return unwritten;
744}
745
746static int
747i915_gem_gtt_pread(struct drm_device *dev,
748 struct drm_i915_gem_object *obj, uint64_t size,
749 uint64_t data_offset, uint64_t data_ptr)
750{
Chris Wilsonfac5e232016-07-04 11:34:36 +0100751 struct drm_i915_private *dev_priv = to_i915(dev);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530752 struct i915_ggtt *ggtt = &dev_priv->ggtt;
753 struct drm_mm_node node;
754 char __user *user_data;
755 uint64_t remain;
756 uint64_t offset;
757 int ret;
758
Chris Wilsonde895082016-08-04 16:32:34 +0100759 ret = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, PIN_MAPPABLE);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530760 if (ret) {
761 ret = insert_mappable_node(dev_priv, &node, PAGE_SIZE);
762 if (ret)
763 goto out;
764
765 ret = i915_gem_object_get_pages(obj);
766 if (ret) {
767 remove_mappable_node(&node);
768 goto out;
769 }
770
771 i915_gem_object_pin_pages(obj);
772 } else {
773 node.start = i915_gem_obj_ggtt_offset(obj);
774 node.allocated = false;
775 ret = i915_gem_object_put_fence(obj);
776 if (ret)
777 goto out_unpin;
778 }
779
780 ret = i915_gem_object_set_to_gtt_domain(obj, false);
781 if (ret)
782 goto out_unpin;
783
784 user_data = u64_to_user_ptr(data_ptr);
785 remain = size;
786 offset = data_offset;
787
788 mutex_unlock(&dev->struct_mutex);
789 if (likely(!i915.prefault_disable)) {
790 ret = fault_in_multipages_writeable(user_data, remain);
791 if (ret) {
792 mutex_lock(&dev->struct_mutex);
793 goto out_unpin;
794 }
795 }
796
797 while (remain > 0) {
798 /* Operation in this page
799 *
800 * page_base = page offset within aperture
801 * page_offset = offset within page
802 * page_length = bytes to copy for this page
803 */
804 u32 page_base = node.start;
805 unsigned page_offset = offset_in_page(offset);
806 unsigned page_length = PAGE_SIZE - page_offset;
807 page_length = remain < page_length ? remain : page_length;
808 if (node.allocated) {
809 wmb();
810 ggtt->base.insert_page(&ggtt->base,
811 i915_gem_object_get_dma_address(obj, offset >> PAGE_SHIFT),
812 node.start,
813 I915_CACHE_NONE, 0);
814 wmb();
815 } else {
816 page_base += offset & PAGE_MASK;
817 }
818 /* This is a slow read/write as it tries to read from
819 * and write to user memory which may result into page
820 * faults, and so we cannot perform this under struct_mutex.
821 */
822 if (slow_user_access(ggtt->mappable, page_base,
823 page_offset, user_data,
824 page_length, false)) {
825 ret = -EFAULT;
826 break;
827 }
828
829 remain -= page_length;
830 user_data += page_length;
831 offset += page_length;
832 }
833
834 mutex_lock(&dev->struct_mutex);
835 if (ret == 0 && (obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) {
836 /* The user has modified the object whilst we tried
837 * reading from it, and we now have no idea what domain
838 * the pages should be in. As we have just been touching
839 * them directly, flush everything back to the GTT
840 * domain.
841 */
842 ret = i915_gem_object_set_to_gtt_domain(obj, false);
843 }
844
845out_unpin:
846 if (node.allocated) {
847 wmb();
848 ggtt->base.clear_range(&ggtt->base,
849 node.start, node.size,
850 true);
851 i915_gem_object_unpin_pages(obj);
852 remove_mappable_node(&node);
853 } else {
854 i915_gem_object_ggtt_unpin(obj);
855 }
856out:
857 return ret;
858}
859
Eric Anholteb014592009-03-10 11:44:52 -0700860static int
Daniel Vetterdbf7bff2012-03-25 19:47:29 +0200861i915_gem_shmem_pread(struct drm_device *dev,
862 struct drm_i915_gem_object *obj,
863 struct drm_i915_gem_pread *args,
864 struct drm_file *file)
Eric Anholteb014592009-03-10 11:44:52 -0700865{
Daniel Vetter8461d222011-12-14 13:57:32 +0100866 char __user *user_data;
Eric Anholteb014592009-03-10 11:44:52 -0700867 ssize_t remain;
Daniel Vetter8461d222011-12-14 13:57:32 +0100868 loff_t offset;
Ben Widawskyeb2c0c82012-02-15 14:42:43 +0100869 int shmem_page_offset, page_length, ret = 0;
Daniel Vetter8461d222011-12-14 13:57:32 +0100870 int obj_do_bit17_swizzling, page_do_bit17_swizzling;
Daniel Vetter96d79b52012-03-25 19:47:36 +0200871 int prefaulted = 0;
Daniel Vetter84897312012-03-25 19:47:31 +0200872 int needs_clflush = 0;
Imre Deak67d5a502013-02-18 19:28:02 +0200873 struct sg_page_iter sg_iter;
Eric Anholteb014592009-03-10 11:44:52 -0700874
Chris Wilson6eae0052016-06-20 15:05:52 +0100875 if (!i915_gem_object_has_struct_page(obj))
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530876 return -ENODEV;
877
Gustavo Padovan3ed605b2016-04-26 12:32:27 -0300878 user_data = u64_to_user_ptr(args->data_ptr);
Eric Anholteb014592009-03-10 11:44:52 -0700879 remain = args->size;
880
Daniel Vetter8461d222011-12-14 13:57:32 +0100881 obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
Eric Anholteb014592009-03-10 11:44:52 -0700882
Brad Volkin4c914c02014-02-18 10:15:45 -0800883 ret = i915_gem_obj_prepare_shmem_read(obj, &needs_clflush);
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100884 if (ret)
885 return ret;
886
Eric Anholteb014592009-03-10 11:44:52 -0700887 offset = args->offset;
Daniel Vetter8461d222011-12-14 13:57:32 +0100888
Imre Deak67d5a502013-02-18 19:28:02 +0200889 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
890 offset >> PAGE_SHIFT) {
Imre Deak2db76d72013-03-26 15:14:18 +0200891 struct page *page = sg_page_iter_page(&sg_iter);
Chris Wilson9da3da62012-06-01 15:20:22 +0100892
893 if (remain <= 0)
894 break;
895
Eric Anholteb014592009-03-10 11:44:52 -0700896 /* Operation in this page
897 *
Eric Anholteb014592009-03-10 11:44:52 -0700898 * shmem_page_offset = offset within page in shmem file
Eric Anholteb014592009-03-10 11:44:52 -0700899 * page_length = bytes to copy for this page
900 */
Chris Wilsonc8cbbb82011-05-12 22:17:11 +0100901 shmem_page_offset = offset_in_page(offset);
Eric Anholteb014592009-03-10 11:44:52 -0700902 page_length = remain;
903 if ((shmem_page_offset + page_length) > PAGE_SIZE)
904 page_length = PAGE_SIZE - shmem_page_offset;
Eric Anholteb014592009-03-10 11:44:52 -0700905
Daniel Vetter8461d222011-12-14 13:57:32 +0100906 page_do_bit17_swizzling = obj_do_bit17_swizzling &&
907 (page_to_phys(page) & (1 << 17)) != 0;
908
Daniel Vetterd174bd62012-03-25 19:47:40 +0200909 ret = shmem_pread_fast(page, shmem_page_offset, page_length,
910 user_data, page_do_bit17_swizzling,
911 needs_clflush);
912 if (ret == 0)
913 goto next_page;
Eric Anholteb014592009-03-10 11:44:52 -0700914
Daniel Vetterdbf7bff2012-03-25 19:47:29 +0200915 mutex_unlock(&dev->struct_mutex);
916
Jani Nikulad330a952014-01-21 11:24:25 +0200917 if (likely(!i915.prefault_disable) && !prefaulted) {
Daniel Vetterf56f8212012-03-25 19:47:41 +0200918 ret = fault_in_multipages_writeable(user_data, remain);
Daniel Vetter96d79b52012-03-25 19:47:36 +0200919 /* Userspace is tricking us, but we've already clobbered
920 * its pages with the prefault and promised to write the
921 * data up to the first fault. Hence ignore any errors
922 * and just continue. */
923 (void)ret;
924 prefaulted = 1;
925 }
926
Daniel Vetterd174bd62012-03-25 19:47:40 +0200927 ret = shmem_pread_slow(page, shmem_page_offset, page_length,
928 user_data, page_do_bit17_swizzling,
929 needs_clflush);
Eric Anholteb014592009-03-10 11:44:52 -0700930
Daniel Vetterdbf7bff2012-03-25 19:47:29 +0200931 mutex_lock(&dev->struct_mutex);
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100932
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100933 if (ret)
Daniel Vetter8461d222011-12-14 13:57:32 +0100934 goto out;
Daniel Vetter8461d222011-12-14 13:57:32 +0100935
Chris Wilson17793c92014-03-07 08:30:36 +0000936next_page:
Eric Anholteb014592009-03-10 11:44:52 -0700937 remain -= page_length;
Daniel Vetter8461d222011-12-14 13:57:32 +0100938 user_data += page_length;
Eric Anholteb014592009-03-10 11:44:52 -0700939 offset += page_length;
940 }
941
Chris Wilson4f27b752010-10-14 15:26:45 +0100942out:
Chris Wilsonf60d7f02012-09-04 21:02:56 +0100943 i915_gem_object_unpin_pages(obj);
944
Eric Anholteb014592009-03-10 11:44:52 -0700945 return ret;
946}
947
Eric Anholt673a3942008-07-30 12:06:12 -0700948/**
949 * Reads data from the object referenced by handle.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +0100950 * @dev: drm device pointer
951 * @data: ioctl data blob
952 * @file: drm file pointer
Eric Anholt673a3942008-07-30 12:06:12 -0700953 *
954 * On error, the contents of *data are undefined.
955 */
956int
957i915_gem_pread_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +0000958 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -0700959{
960 struct drm_i915_gem_pread *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +0000961 struct drm_i915_gem_object *obj;
Chris Wilson35b62a82010-09-26 20:23:38 +0100962 int ret = 0;
Eric Anholt673a3942008-07-30 12:06:12 -0700963
Chris Wilson51311d02010-11-17 09:10:42 +0000964 if (args->size == 0)
965 return 0;
966
967 if (!access_ok(VERIFY_WRITE,
Gustavo Padovan3ed605b2016-04-26 12:32:27 -0300968 u64_to_user_ptr(args->data_ptr),
Chris Wilson51311d02010-11-17 09:10:42 +0000969 args->size))
970 return -EFAULT;
971
Chris Wilson4f27b752010-10-14 15:26:45 +0100972 ret = i915_mutex_lock_interruptible(dev);
Chris Wilson1d7cfea2010-10-17 09:45:41 +0100973 if (ret)
Chris Wilson4f27b752010-10-14 15:26:45 +0100974 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -0700975
Chris Wilson03ac0642016-07-20 13:31:51 +0100976 obj = i915_gem_object_lookup(file, args->handle);
977 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +0100978 ret = -ENOENT;
979 goto unlock;
Chris Wilson4f27b752010-10-14 15:26:45 +0100980 }
Eric Anholt673a3942008-07-30 12:06:12 -0700981
Chris Wilson7dcd2492010-09-26 20:21:44 +0100982 /* Bounds check source. */
Chris Wilson05394f32010-11-08 19:18:58 +0000983 if (args->offset > obj->base.size ||
984 args->size > obj->base.size - args->offset) {
Chris Wilsonce9d4192010-09-26 20:50:05 +0100985 ret = -EINVAL;
Chris Wilson35b62a82010-09-26 20:23:38 +0100986 goto out;
Chris Wilsonce9d4192010-09-26 20:50:05 +0100987 }
988
Chris Wilsondb53a302011-02-03 11:57:46 +0000989 trace_i915_gem_object_pread(obj, args->offset, args->size);
990
Daniel Vetterdbf7bff2012-03-25 19:47:29 +0200991 ret = i915_gem_shmem_pread(dev, obj, args, file);
Eric Anholt673a3942008-07-30 12:06:12 -0700992
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530993 /* pread for non shmem backed objects */
Chris Wilson1dd5b6f2016-08-04 09:09:53 +0100994 if (ret == -EFAULT || ret == -ENODEV) {
995 intel_runtime_pm_get(to_i915(dev));
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +0530996 ret = i915_gem_gtt_pread(dev, obj, args->size,
997 args->offset, args->data_ptr);
Chris Wilson1dd5b6f2016-08-04 09:09:53 +0100998 intel_runtime_pm_put(to_i915(dev));
999 }
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301000
Chris Wilson35b62a82010-09-26 20:23:38 +01001001out:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001002 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001003unlock:
Chris Wilson4f27b752010-10-14 15:26:45 +01001004 mutex_unlock(&dev->struct_mutex);
Eric Anholteb014592009-03-10 11:44:52 -07001005 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001006}
1007
Keith Packard0839ccb2008-10-30 19:38:48 -07001008/* This is the fast write path which cannot handle
1009 * page faults in the source data
Linus Torvalds9b7530cc2008-10-20 14:16:43 -07001010 */
Linus Torvalds9b7530cc2008-10-20 14:16:43 -07001011
Keith Packard0839ccb2008-10-30 19:38:48 -07001012static inline int
1013fast_user_write(struct io_mapping *mapping,
1014 loff_t page_base, int page_offset,
1015 char __user *user_data,
1016 int length)
1017{
Ben Widawsky4f0c7cf2012-04-16 14:07:47 -07001018 void __iomem *vaddr_atomic;
1019 void *vaddr;
Keith Packard0839ccb2008-10-30 19:38:48 -07001020 unsigned long unwritten;
1021
Peter Zijlstra3e4d3af2010-10-26 14:21:51 -07001022 vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
Ben Widawsky4f0c7cf2012-04-16 14:07:47 -07001023 /* We can use the cpu mem copy function because this is X86. */
1024 vaddr = (void __force*)vaddr_atomic + page_offset;
1025 unwritten = __copy_from_user_inatomic_nocache(vaddr,
Keith Packard0839ccb2008-10-30 19:38:48 -07001026 user_data, length);
Peter Zijlstra3e4d3af2010-10-26 14:21:51 -07001027 io_mapping_unmap_atomic(vaddr_atomic);
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001028 return unwritten;
Keith Packard0839ccb2008-10-30 19:38:48 -07001029}
1030
Eric Anholt3de09aa2009-03-09 09:42:23 -07001031/**
1032 * This is the fast pwrite path, where we copy the data directly from the
1033 * user into the GTT, uncached.
Daniel Vetter62f90b32016-07-15 21:48:07 +02001034 * @i915: i915 device private data
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001035 * @obj: i915 gem object
1036 * @args: pwrite arguments structure
1037 * @file: drm file pointer
Eric Anholt3de09aa2009-03-09 09:42:23 -07001038 */
Eric Anholt673a3942008-07-30 12:06:12 -07001039static int
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301040i915_gem_gtt_pwrite_fast(struct drm_i915_private *i915,
Chris Wilson05394f32010-11-08 19:18:58 +00001041 struct drm_i915_gem_object *obj,
Eric Anholt3de09aa2009-03-09 09:42:23 -07001042 struct drm_i915_gem_pwrite *args,
Chris Wilson05394f32010-11-08 19:18:58 +00001043 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001044{
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301045 struct i915_ggtt *ggtt = &i915->ggtt;
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301046 struct drm_device *dev = obj->base.dev;
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301047 struct drm_mm_node node;
1048 uint64_t remain, offset;
Eric Anholt673a3942008-07-30 12:06:12 -07001049 char __user *user_data;
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301050 int ret;
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301051 bool hit_slow_path = false;
1052
1053 if (obj->tiling_mode != I915_TILING_NONE)
1054 return -EFAULT;
Daniel Vetter935aaa62012-03-25 19:47:35 +02001055
Chris Wilsonde895082016-08-04 16:32:34 +01001056 ret = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
1057 PIN_MAPPABLE | PIN_NONBLOCK);
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301058 if (ret) {
1059 ret = insert_mappable_node(i915, &node, PAGE_SIZE);
1060 if (ret)
1061 goto out;
1062
1063 ret = i915_gem_object_get_pages(obj);
1064 if (ret) {
1065 remove_mappable_node(&node);
1066 goto out;
1067 }
1068
1069 i915_gem_object_pin_pages(obj);
1070 } else {
1071 node.start = i915_gem_obj_ggtt_offset(obj);
1072 node.allocated = false;
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301073 ret = i915_gem_object_put_fence(obj);
1074 if (ret)
1075 goto out_unpin;
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301076 }
Daniel Vetter935aaa62012-03-25 19:47:35 +02001077
1078 ret = i915_gem_object_set_to_gtt_domain(obj, true);
1079 if (ret)
1080 goto out_unpin;
1081
Rodrigo Vivi77a0d1c2015-06-18 11:43:24 -07001082 intel_fb_obj_invalidate(obj, ORIGIN_GTT);
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301083 obj->dirty = true;
Paulo Zanoni063e4e62015-02-13 17:23:45 -02001084
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301085 user_data = u64_to_user_ptr(args->data_ptr);
1086 offset = args->offset;
1087 remain = args->size;
1088 while (remain) {
Eric Anholt673a3942008-07-30 12:06:12 -07001089 /* Operation in this page
1090 *
Keith Packard0839ccb2008-10-30 19:38:48 -07001091 * page_base = page offset within aperture
1092 * page_offset = offset within page
1093 * page_length = bytes to copy for this page
Eric Anholt673a3942008-07-30 12:06:12 -07001094 */
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301095 u32 page_base = node.start;
1096 unsigned page_offset = offset_in_page(offset);
1097 unsigned page_length = PAGE_SIZE - page_offset;
1098 page_length = remain < page_length ? remain : page_length;
1099 if (node.allocated) {
1100 wmb(); /* flush the write before we modify the GGTT */
1101 ggtt->base.insert_page(&ggtt->base,
1102 i915_gem_object_get_dma_address(obj, offset >> PAGE_SHIFT),
1103 node.start, I915_CACHE_NONE, 0);
1104 wmb(); /* flush modifications to the GGTT (insert_page) */
1105 } else {
1106 page_base += offset & PAGE_MASK;
1107 }
Keith Packard0839ccb2008-10-30 19:38:48 -07001108 /* If we get a fault while copying data, then (presumably) our
Eric Anholt3de09aa2009-03-09 09:42:23 -07001109 * source page isn't available. Return the error and we'll
1110 * retry in the slow path.
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301111 * If the object is non-shmem backed, we retry again with the
1112 * path that handles page fault.
Keith Packard0839ccb2008-10-30 19:38:48 -07001113 */
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03001114 if (fast_user_write(ggtt->mappable, page_base,
Daniel Vetter935aaa62012-03-25 19:47:35 +02001115 page_offset, user_data, page_length)) {
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301116 hit_slow_path = true;
1117 mutex_unlock(&dev->struct_mutex);
1118 if (slow_user_access(ggtt->mappable,
1119 page_base,
1120 page_offset, user_data,
1121 page_length, true)) {
1122 ret = -EFAULT;
1123 mutex_lock(&dev->struct_mutex);
1124 goto out_flush;
1125 }
1126
1127 mutex_lock(&dev->struct_mutex);
Daniel Vetter935aaa62012-03-25 19:47:35 +02001128 }
Eric Anholt673a3942008-07-30 12:06:12 -07001129
Keith Packard0839ccb2008-10-30 19:38:48 -07001130 remain -= page_length;
1131 user_data += page_length;
1132 offset += page_length;
Eric Anholt673a3942008-07-30 12:06:12 -07001133 }
Eric Anholt673a3942008-07-30 12:06:12 -07001134
Paulo Zanoni063e4e62015-02-13 17:23:45 -02001135out_flush:
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301136 if (hit_slow_path) {
1137 if (ret == 0 &&
1138 (obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) {
1139 /* The user has modified the object whilst we tried
1140 * reading from it, and we now have no idea what domain
1141 * the pages should be in. As we have just been touching
1142 * them directly, flush everything back to the GTT
1143 * domain.
1144 */
1145 ret = i915_gem_object_set_to_gtt_domain(obj, false);
1146 }
1147 }
1148
Rodrigo Vivide152b62015-07-07 16:28:51 -07001149 intel_fb_obj_flush(obj, false, ORIGIN_GTT);
Daniel Vetter935aaa62012-03-25 19:47:35 +02001150out_unpin:
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301151 if (node.allocated) {
1152 wmb();
1153 ggtt->base.clear_range(&ggtt->base,
1154 node.start, node.size,
1155 true);
1156 i915_gem_object_unpin_pages(obj);
1157 remove_mappable_node(&node);
1158 } else {
1159 i915_gem_object_ggtt_unpin(obj);
1160 }
Daniel Vetter935aaa62012-03-25 19:47:35 +02001161out:
Eric Anholt3de09aa2009-03-09 09:42:23 -07001162 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001163}
1164
Daniel Vetterd174bd62012-03-25 19:47:40 +02001165/* Per-page copy function for the shmem pwrite fastpath.
1166 * Flushes invalid cachelines before writing to the target if
1167 * needs_clflush_before is set and flushes out any written cachelines after
1168 * writing if needs_clflush is set. */
Eric Anholt673a3942008-07-30 12:06:12 -07001169static int
Daniel Vetterd174bd62012-03-25 19:47:40 +02001170shmem_pwrite_fast(struct page *page, int shmem_page_offset, int page_length,
1171 char __user *user_data,
1172 bool page_do_bit17_swizzling,
1173 bool needs_clflush_before,
1174 bool needs_clflush_after)
Eric Anholt673a3942008-07-30 12:06:12 -07001175{
Daniel Vetterd174bd62012-03-25 19:47:40 +02001176 char *vaddr;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001177 int ret;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001178
Daniel Vettere7e58eb2012-03-25 19:47:43 +02001179 if (unlikely(page_do_bit17_swizzling))
Daniel Vetterd174bd62012-03-25 19:47:40 +02001180 return -EINVAL;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001181
Daniel Vetterd174bd62012-03-25 19:47:40 +02001182 vaddr = kmap_atomic(page);
1183 if (needs_clflush_before)
1184 drm_clflush_virt_range(vaddr + shmem_page_offset,
1185 page_length);
Chris Wilsonc2831a92014-03-07 08:30:37 +00001186 ret = __copy_from_user_inatomic(vaddr + shmem_page_offset,
1187 user_data, page_length);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001188 if (needs_clflush_after)
1189 drm_clflush_virt_range(vaddr + shmem_page_offset,
1190 page_length);
1191 kunmap_atomic(vaddr);
Eric Anholt3de09aa2009-03-09 09:42:23 -07001192
Chris Wilson755d2212012-09-04 21:02:55 +01001193 return ret ? -EFAULT : 0;
Eric Anholt3de09aa2009-03-09 09:42:23 -07001194}
1195
Daniel Vetterd174bd62012-03-25 19:47:40 +02001196/* Only difference to the fast-path function is that this can handle bit17
1197 * and uses non-atomic copy and kmap functions. */
Eric Anholt3043c602008-10-02 12:24:47 -07001198static int
Daniel Vetterd174bd62012-03-25 19:47:40 +02001199shmem_pwrite_slow(struct page *page, int shmem_page_offset, int page_length,
1200 char __user *user_data,
1201 bool page_do_bit17_swizzling,
1202 bool needs_clflush_before,
1203 bool needs_clflush_after)
Eric Anholt673a3942008-07-30 12:06:12 -07001204{
Daniel Vetterd174bd62012-03-25 19:47:40 +02001205 char *vaddr;
1206 int ret;
Eric Anholt40123c12009-03-09 13:42:30 -07001207
Daniel Vetterd174bd62012-03-25 19:47:40 +02001208 vaddr = kmap(page);
Daniel Vettere7e58eb2012-03-25 19:47:43 +02001209 if (unlikely(needs_clflush_before || page_do_bit17_swizzling))
Daniel Vetter23c18c72012-03-25 19:47:42 +02001210 shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
1211 page_length,
1212 page_do_bit17_swizzling);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001213 if (page_do_bit17_swizzling)
1214 ret = __copy_from_user_swizzled(vaddr, shmem_page_offset,
Chris Wilsone5281cc2010-10-28 13:45:36 +01001215 user_data,
1216 page_length);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001217 else
1218 ret = __copy_from_user(vaddr + shmem_page_offset,
1219 user_data,
1220 page_length);
1221 if (needs_clflush_after)
Daniel Vetter23c18c72012-03-25 19:47:42 +02001222 shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
1223 page_length,
1224 page_do_bit17_swizzling);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001225 kunmap(page);
Chris Wilsone5281cc2010-10-28 13:45:36 +01001226
Chris Wilson755d2212012-09-04 21:02:55 +01001227 return ret ? -EFAULT : 0;
Eric Anholt40123c12009-03-09 13:42:30 -07001228}
1229
Eric Anholt40123c12009-03-09 13:42:30 -07001230static int
Daniel Vettere244a442012-03-25 19:47:28 +02001231i915_gem_shmem_pwrite(struct drm_device *dev,
1232 struct drm_i915_gem_object *obj,
1233 struct drm_i915_gem_pwrite *args,
1234 struct drm_file *file)
Eric Anholt40123c12009-03-09 13:42:30 -07001235{
Eric Anholt40123c12009-03-09 13:42:30 -07001236 ssize_t remain;
Daniel Vetter8c599672011-12-14 13:57:31 +01001237 loff_t offset;
1238 char __user *user_data;
Ben Widawskyeb2c0c82012-02-15 14:42:43 +01001239 int shmem_page_offset, page_length, ret = 0;
Daniel Vetter8c599672011-12-14 13:57:31 +01001240 int obj_do_bit17_swizzling, page_do_bit17_swizzling;
Daniel Vettere244a442012-03-25 19:47:28 +02001241 int hit_slowpath = 0;
Daniel Vetter58642882012-03-25 19:47:37 +02001242 int needs_clflush_after = 0;
1243 int needs_clflush_before = 0;
Imre Deak67d5a502013-02-18 19:28:02 +02001244 struct sg_page_iter sg_iter;
Eric Anholt40123c12009-03-09 13:42:30 -07001245
Gustavo Padovan3ed605b2016-04-26 12:32:27 -03001246 user_data = u64_to_user_ptr(args->data_ptr);
Eric Anholt40123c12009-03-09 13:42:30 -07001247 remain = args->size;
1248
Daniel Vetter8c599672011-12-14 13:57:31 +01001249 obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
Eric Anholt40123c12009-03-09 13:42:30 -07001250
Chris Wilsonc13d87e2016-07-20 09:21:15 +01001251 ret = i915_gem_object_wait_rendering(obj, false);
1252 if (ret)
1253 return ret;
1254
Daniel Vetter58642882012-03-25 19:47:37 +02001255 if (obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
1256 /* If we're not in the cpu write domain, set ourself into the gtt
1257 * write domain and manually flush cachelines (if required). This
1258 * optimizes for the case when the gpu will use the data
1259 * right away and we therefore have to clflush anyway. */
Chris Wilson2c225692013-08-09 12:26:45 +01001260 needs_clflush_after = cpu_write_needs_clflush(obj);
Daniel Vetter58642882012-03-25 19:47:37 +02001261 }
Chris Wilsonc76ce032013-08-08 14:41:03 +01001262 /* Same trick applies to invalidate partially written cachelines read
1263 * before writing. */
1264 if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0)
1265 needs_clflush_before =
1266 !cpu_cache_is_coherent(dev, obj->cache_level);
Daniel Vetter58642882012-03-25 19:47:37 +02001267
Chris Wilson755d2212012-09-04 21:02:55 +01001268 ret = i915_gem_object_get_pages(obj);
1269 if (ret)
1270 return ret;
1271
Rodrigo Vivi77a0d1c2015-06-18 11:43:24 -07001272 intel_fb_obj_invalidate(obj, ORIGIN_CPU);
Paulo Zanoni063e4e62015-02-13 17:23:45 -02001273
Chris Wilson755d2212012-09-04 21:02:55 +01001274 i915_gem_object_pin_pages(obj);
1275
Eric Anholt40123c12009-03-09 13:42:30 -07001276 offset = args->offset;
Chris Wilson05394f32010-11-08 19:18:58 +00001277 obj->dirty = 1;
Eric Anholt40123c12009-03-09 13:42:30 -07001278
Imre Deak67d5a502013-02-18 19:28:02 +02001279 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
1280 offset >> PAGE_SHIFT) {
Imre Deak2db76d72013-03-26 15:14:18 +02001281 struct page *page = sg_page_iter_page(&sg_iter);
Daniel Vetter58642882012-03-25 19:47:37 +02001282 int partial_cacheline_write;
Chris Wilsone5281cc2010-10-28 13:45:36 +01001283
Chris Wilson9da3da62012-06-01 15:20:22 +01001284 if (remain <= 0)
1285 break;
1286
Eric Anholt40123c12009-03-09 13:42:30 -07001287 /* Operation in this page
1288 *
Eric Anholt40123c12009-03-09 13:42:30 -07001289 * shmem_page_offset = offset within page in shmem file
Eric Anholt40123c12009-03-09 13:42:30 -07001290 * page_length = bytes to copy for this page
1291 */
Chris Wilsonc8cbbb82011-05-12 22:17:11 +01001292 shmem_page_offset = offset_in_page(offset);
Eric Anholt40123c12009-03-09 13:42:30 -07001293
1294 page_length = remain;
1295 if ((shmem_page_offset + page_length) > PAGE_SIZE)
1296 page_length = PAGE_SIZE - shmem_page_offset;
Eric Anholt40123c12009-03-09 13:42:30 -07001297
Daniel Vetter58642882012-03-25 19:47:37 +02001298 /* If we don't overwrite a cacheline completely we need to be
1299 * careful to have up-to-date data by first clflushing. Don't
1300 * overcomplicate things and flush the entire patch. */
1301 partial_cacheline_write = needs_clflush_before &&
1302 ((shmem_page_offset | page_length)
1303 & (boot_cpu_data.x86_clflush_size - 1));
1304
Daniel Vetter8c599672011-12-14 13:57:31 +01001305 page_do_bit17_swizzling = obj_do_bit17_swizzling &&
1306 (page_to_phys(page) & (1 << 17)) != 0;
1307
Daniel Vetterd174bd62012-03-25 19:47:40 +02001308 ret = shmem_pwrite_fast(page, shmem_page_offset, page_length,
1309 user_data, page_do_bit17_swizzling,
1310 partial_cacheline_write,
1311 needs_clflush_after);
1312 if (ret == 0)
1313 goto next_page;
Eric Anholt40123c12009-03-09 13:42:30 -07001314
Daniel Vettere244a442012-03-25 19:47:28 +02001315 hit_slowpath = 1;
Daniel Vettere244a442012-03-25 19:47:28 +02001316 mutex_unlock(&dev->struct_mutex);
Daniel Vetterd174bd62012-03-25 19:47:40 +02001317 ret = shmem_pwrite_slow(page, shmem_page_offset, page_length,
1318 user_data, page_do_bit17_swizzling,
1319 partial_cacheline_write,
1320 needs_clflush_after);
Eric Anholt40123c12009-03-09 13:42:30 -07001321
Daniel Vettere244a442012-03-25 19:47:28 +02001322 mutex_lock(&dev->struct_mutex);
Chris Wilson755d2212012-09-04 21:02:55 +01001323
Chris Wilson755d2212012-09-04 21:02:55 +01001324 if (ret)
Daniel Vetter8c599672011-12-14 13:57:31 +01001325 goto out;
Daniel Vetter8c599672011-12-14 13:57:31 +01001326
Chris Wilson17793c92014-03-07 08:30:36 +00001327next_page:
Eric Anholt40123c12009-03-09 13:42:30 -07001328 remain -= page_length;
Daniel Vetter8c599672011-12-14 13:57:31 +01001329 user_data += page_length;
Eric Anholt40123c12009-03-09 13:42:30 -07001330 offset += page_length;
1331 }
1332
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001333out:
Chris Wilson755d2212012-09-04 21:02:55 +01001334 i915_gem_object_unpin_pages(obj);
1335
Daniel Vettere244a442012-03-25 19:47:28 +02001336 if (hit_slowpath) {
Daniel Vetter8dcf0152012-11-15 16:53:58 +01001337 /*
1338 * Fixup: Flush cpu caches in case we didn't flush the dirty
1339 * cachelines in-line while writing and the object moved
1340 * out of the cpu write domain while we've dropped the lock.
1341 */
1342 if (!needs_clflush_after &&
1343 obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
Chris Wilson000433b2013-08-08 14:41:09 +01001344 if (i915_gem_clflush_object(obj, obj->pin_display))
Ville Syrjäläed75a552015-08-11 19:47:10 +03001345 needs_clflush_after = true;
Daniel Vettere244a442012-03-25 19:47:28 +02001346 }
Daniel Vetter8c599672011-12-14 13:57:31 +01001347 }
Eric Anholt40123c12009-03-09 13:42:30 -07001348
Daniel Vetter58642882012-03-25 19:47:37 +02001349 if (needs_clflush_after)
Chris Wilsonc0336662016-05-06 15:40:21 +01001350 i915_gem_chipset_flush(to_i915(dev));
Ville Syrjäläed75a552015-08-11 19:47:10 +03001351 else
1352 obj->cache_dirty = true;
Daniel Vetter58642882012-03-25 19:47:37 +02001353
Rodrigo Vivide152b62015-07-07 16:28:51 -07001354 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Eric Anholt40123c12009-03-09 13:42:30 -07001355 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001356}
1357
1358/**
1359 * Writes data to the object referenced by handle.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001360 * @dev: drm device
1361 * @data: ioctl data blob
1362 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001363 *
1364 * On error, the contents of the buffer that were to be modified are undefined.
1365 */
1366int
1367i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001368 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001369{
Chris Wilsonfac5e232016-07-04 11:34:36 +01001370 struct drm_i915_private *dev_priv = to_i915(dev);
Eric Anholt673a3942008-07-30 12:06:12 -07001371 struct drm_i915_gem_pwrite *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001372 struct drm_i915_gem_object *obj;
Chris Wilson51311d02010-11-17 09:10:42 +00001373 int ret;
1374
1375 if (args->size == 0)
1376 return 0;
1377
1378 if (!access_ok(VERIFY_READ,
Gustavo Padovan3ed605b2016-04-26 12:32:27 -03001379 u64_to_user_ptr(args->data_ptr),
Chris Wilson51311d02010-11-17 09:10:42 +00001380 args->size))
1381 return -EFAULT;
1382
Jani Nikulad330a952014-01-21 11:24:25 +02001383 if (likely(!i915.prefault_disable)) {
Gustavo Padovan3ed605b2016-04-26 12:32:27 -03001384 ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
Xiong Zhang0b74b502013-07-19 13:51:24 +08001385 args->size);
1386 if (ret)
1387 return -EFAULT;
1388 }
Eric Anholt673a3942008-07-30 12:06:12 -07001389
Imre Deak5d77d9c2014-11-12 16:40:35 +02001390 intel_runtime_pm_get(dev_priv);
1391
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001392 ret = i915_mutex_lock_interruptible(dev);
1393 if (ret)
Imre Deak5d77d9c2014-11-12 16:40:35 +02001394 goto put_rpm;
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001395
Chris Wilson03ac0642016-07-20 13:31:51 +01001396 obj = i915_gem_object_lookup(file, args->handle);
1397 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001398 ret = -ENOENT;
1399 goto unlock;
1400 }
Eric Anholt673a3942008-07-30 12:06:12 -07001401
Chris Wilson7dcd2492010-09-26 20:21:44 +01001402 /* Bounds check destination. */
Chris Wilson05394f32010-11-08 19:18:58 +00001403 if (args->offset > obj->base.size ||
1404 args->size > obj->base.size - args->offset) {
Chris Wilsonce9d4192010-09-26 20:50:05 +01001405 ret = -EINVAL;
Chris Wilson35b62a82010-09-26 20:23:38 +01001406 goto out;
Chris Wilsonce9d4192010-09-26 20:50:05 +01001407 }
1408
Chris Wilsondb53a302011-02-03 11:57:46 +00001409 trace_i915_gem_object_pwrite(obj, args->offset, args->size);
1410
Daniel Vetter935aaa62012-03-25 19:47:35 +02001411 ret = -EFAULT;
Eric Anholt673a3942008-07-30 12:06:12 -07001412 /* We can only do the GTT pwrite on untiled buffers, as otherwise
1413 * it would end up going through the fenced access, and we'll get
1414 * different detiling behavior between reading and writing.
1415 * pread/pwrite currently are reading and writing from the CPU
1416 * perspective, requiring manual detiling by the client.
1417 */
Chris Wilson6eae0052016-06-20 15:05:52 +01001418 if (!i915_gem_object_has_struct_page(obj) ||
1419 cpu_write_needs_clflush(obj)) {
Ankitprasad Sharma4f1959e2016-06-10 14:23:01 +05301420 ret = i915_gem_gtt_pwrite_fast(dev_priv, obj, args, file);
Daniel Vetter935aaa62012-03-25 19:47:35 +02001421 /* Note that the gtt paths might fail with non-page-backed user
1422 * pointers (e.g. gtt mappings when moving data between
1423 * textures). Fallback to the shmem path in that case. */
Eric Anholt40123c12009-03-09 13:42:30 -07001424 }
Eric Anholt673a3942008-07-30 12:06:12 -07001425
Chris Wilsond1054ee2016-07-16 18:42:36 +01001426 if (ret == -EFAULT || ret == -ENOSPC) {
Chris Wilson6a2c4232014-11-04 04:51:40 -08001427 if (obj->phys_handle)
1428 ret = i915_gem_phys_pwrite(obj, args, file);
Chris Wilson6eae0052016-06-20 15:05:52 +01001429 else if (i915_gem_object_has_struct_page(obj))
Chris Wilson6a2c4232014-11-04 04:51:40 -08001430 ret = i915_gem_shmem_pwrite(dev, obj, args, file);
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05301431 else
1432 ret = -ENODEV;
Chris Wilson6a2c4232014-11-04 04:51:40 -08001433 }
Daniel Vetter5c0480f2011-12-14 13:57:30 +01001434
Chris Wilson35b62a82010-09-26 20:23:38 +01001435out:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001436 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001437unlock:
Chris Wilsonfbd5a262010-10-14 15:03:58 +01001438 mutex_unlock(&dev->struct_mutex);
Imre Deak5d77d9c2014-11-12 16:40:35 +02001439put_rpm:
1440 intel_runtime_pm_put(dev_priv);
1441
Eric Anholt673a3942008-07-30 12:06:12 -07001442 return ret;
1443}
1444
Chris Wilsonaeecc962016-06-17 14:46:39 -03001445static enum fb_op_origin
1446write_origin(struct drm_i915_gem_object *obj, unsigned domain)
1447{
1448 return domain == I915_GEM_DOMAIN_GTT && !obj->has_wc_mmap ?
1449 ORIGIN_GTT : ORIGIN_CPU;
1450}
1451
Eric Anholt673a3942008-07-30 12:06:12 -07001452/**
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001453 * Called when user space prepares to use an object with the CPU, either
1454 * through the mmap ioctl's mapping or a GTT mapping.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001455 * @dev: drm device
1456 * @data: ioctl data blob
1457 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001458 */
1459int
1460i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001461 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001462{
1463 struct drm_i915_gem_set_domain *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001464 struct drm_i915_gem_object *obj;
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001465 uint32_t read_domains = args->read_domains;
1466 uint32_t write_domain = args->write_domain;
Eric Anholt673a3942008-07-30 12:06:12 -07001467 int ret;
1468
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001469 /* Only handle setting domains to types used by the CPU. */
Chris Wilson21d509e2009-06-06 09:46:02 +01001470 if (write_domain & I915_GEM_GPU_DOMAINS)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001471 return -EINVAL;
1472
Chris Wilson21d509e2009-06-06 09:46:02 +01001473 if (read_domains & I915_GEM_GPU_DOMAINS)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001474 return -EINVAL;
1475
1476 /* Having something in the write domain implies it's in the read
1477 * domain, and only that read domain. Enforce that in the request.
1478 */
1479 if (write_domain != 0 && read_domains != write_domain)
1480 return -EINVAL;
1481
Chris Wilson76c1dec2010-09-25 11:22:51 +01001482 ret = i915_mutex_lock_interruptible(dev);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001483 if (ret)
Chris Wilson76c1dec2010-09-25 11:22:51 +01001484 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07001485
Chris Wilson03ac0642016-07-20 13:31:51 +01001486 obj = i915_gem_object_lookup(file, args->handle);
1487 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001488 ret = -ENOENT;
1489 goto unlock;
Chris Wilson76c1dec2010-09-25 11:22:51 +01001490 }
Jesse Barnes652c3932009-08-17 13:31:43 -07001491
Chris Wilson3236f572012-08-24 09:35:09 +01001492 /* Try to flush the object off the GPU without holding the lock.
1493 * We will repeat the flush holding the lock in the normal manner
1494 * to catch cases where we are gazumped.
1495 */
Chris Wilson6e4930f2014-02-07 18:37:06 -02001496 ret = i915_gem_object_wait_rendering__nonblocking(obj,
Chris Wilson2e1b8732015-04-27 13:41:22 +01001497 to_rps_client(file),
Chris Wilson6e4930f2014-02-07 18:37:06 -02001498 !write_domain);
Chris Wilson3236f572012-08-24 09:35:09 +01001499 if (ret)
1500 goto unref;
1501
Chris Wilson43566de2015-01-02 16:29:29 +05301502 if (read_domains & I915_GEM_DOMAIN_GTT)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001503 ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
Chris Wilson43566de2015-01-02 16:29:29 +05301504 else
Eric Anholte47c68e2008-11-14 13:35:19 -08001505 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
Eric Anholt2ef7eea2008-11-10 10:53:25 -08001506
Daniel Vetter031b6982015-06-26 19:35:16 +02001507 if (write_domain != 0)
Chris Wilsonaeecc962016-06-17 14:46:39 -03001508 intel_fb_obj_invalidate(obj, write_origin(obj, write_domain));
Daniel Vetter031b6982015-06-26 19:35:16 +02001509
Chris Wilson3236f572012-08-24 09:35:09 +01001510unref:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001511 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001512unlock:
Eric Anholt673a3942008-07-30 12:06:12 -07001513 mutex_unlock(&dev->struct_mutex);
1514 return ret;
1515}
1516
1517/**
1518 * Called when user space has done writes to this buffer
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001519 * @dev: drm device
1520 * @data: ioctl data blob
1521 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001522 */
1523int
1524i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001525 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001526{
1527 struct drm_i915_gem_sw_finish *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00001528 struct drm_i915_gem_object *obj;
Eric Anholt673a3942008-07-30 12:06:12 -07001529 int ret = 0;
1530
Chris Wilson76c1dec2010-09-25 11:22:51 +01001531 ret = i915_mutex_lock_interruptible(dev);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001532 if (ret)
Chris Wilson76c1dec2010-09-25 11:22:51 +01001533 return ret;
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001534
Chris Wilson03ac0642016-07-20 13:31:51 +01001535 obj = i915_gem_object_lookup(file, args->handle);
1536 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001537 ret = -ENOENT;
1538 goto unlock;
Eric Anholt673a3942008-07-30 12:06:12 -07001539 }
1540
Eric Anholt673a3942008-07-30 12:06:12 -07001541 /* Pinned buffers may be scanout, so flush the cache */
Chris Wilson2c225692013-08-09 12:26:45 +01001542 if (obj->pin_display)
Daniel Vettere62b59e2015-01-21 14:53:48 +01001543 i915_gem_object_flush_cpu_write_domain(obj);
Eric Anholte47c68e2008-11-14 13:35:19 -08001544
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001545 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001546unlock:
Eric Anholt673a3942008-07-30 12:06:12 -07001547 mutex_unlock(&dev->struct_mutex);
1548 return ret;
1549}
1550
1551/**
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001552 * i915_gem_mmap_ioctl - Maps the contents of an object, returning the address
1553 * it is mapped to.
1554 * @dev: drm device
1555 * @data: ioctl data blob
1556 * @file: drm file
Eric Anholt673a3942008-07-30 12:06:12 -07001557 *
1558 * While the mapping holds a reference on the contents of the object, it doesn't
1559 * imply a ref on the object itself.
Daniel Vetter34367382014-10-16 12:28:18 +02001560 *
1561 * IMPORTANT:
1562 *
1563 * DRM driver writers who look a this function as an example for how to do GEM
1564 * mmap support, please don't implement mmap support like here. The modern way
1565 * to implement DRM mmap support is with an mmap offset ioctl (like
1566 * i915_gem_mmap_gtt) and then using the mmap syscall on the DRM fd directly.
1567 * That way debug tooling like valgrind will understand what's going on, hiding
1568 * the mmap call in a driver private ioctl will break that. The i915 driver only
1569 * does cpu mmaps this way because we didn't know better.
Eric Anholt673a3942008-07-30 12:06:12 -07001570 */
1571int
1572i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00001573 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07001574{
1575 struct drm_i915_gem_mmap *args = data;
Chris Wilson03ac0642016-07-20 13:31:51 +01001576 struct drm_i915_gem_object *obj;
Eric Anholt673a3942008-07-30 12:06:12 -07001577 unsigned long addr;
1578
Akash Goel1816f922015-01-02 16:29:30 +05301579 if (args->flags & ~(I915_MMAP_WC))
1580 return -EINVAL;
1581
Borislav Petkov568a58e2016-03-29 17:42:01 +02001582 if (args->flags & I915_MMAP_WC && !boot_cpu_has(X86_FEATURE_PAT))
Akash Goel1816f922015-01-02 16:29:30 +05301583 return -ENODEV;
1584
Chris Wilson03ac0642016-07-20 13:31:51 +01001585 obj = i915_gem_object_lookup(file, args->handle);
1586 if (!obj)
Chris Wilsonbf79cb92010-08-04 14:19:46 +01001587 return -ENOENT;
Eric Anholt673a3942008-07-30 12:06:12 -07001588
Daniel Vetter1286ff72012-05-10 15:25:09 +02001589 /* prime objects have no backing filp to GEM mmap
1590 * pages from.
1591 */
Chris Wilson03ac0642016-07-20 13:31:51 +01001592 if (!obj->base.filp) {
Chris Wilson34911fd2016-07-20 13:31:54 +01001593 i915_gem_object_put_unlocked(obj);
Daniel Vetter1286ff72012-05-10 15:25:09 +02001594 return -EINVAL;
1595 }
1596
Chris Wilson03ac0642016-07-20 13:31:51 +01001597 addr = vm_mmap(obj->base.filp, 0, args->size,
Eric Anholt673a3942008-07-30 12:06:12 -07001598 PROT_READ | PROT_WRITE, MAP_SHARED,
1599 args->offset);
Akash Goel1816f922015-01-02 16:29:30 +05301600 if (args->flags & I915_MMAP_WC) {
1601 struct mm_struct *mm = current->mm;
1602 struct vm_area_struct *vma;
1603
Michal Hocko80a89a52016-05-23 16:26:11 -07001604 if (down_write_killable(&mm->mmap_sem)) {
Chris Wilson34911fd2016-07-20 13:31:54 +01001605 i915_gem_object_put_unlocked(obj);
Michal Hocko80a89a52016-05-23 16:26:11 -07001606 return -EINTR;
1607 }
Akash Goel1816f922015-01-02 16:29:30 +05301608 vma = find_vma(mm, addr);
1609 if (vma)
1610 vma->vm_page_prot =
1611 pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
1612 else
1613 addr = -ENOMEM;
1614 up_write(&mm->mmap_sem);
Chris Wilsonaeecc962016-06-17 14:46:39 -03001615
1616 /* This may race, but that's ok, it only gets set */
Chris Wilson03ac0642016-07-20 13:31:51 +01001617 WRITE_ONCE(obj->has_wc_mmap, true);
Akash Goel1816f922015-01-02 16:29:30 +05301618 }
Chris Wilson34911fd2016-07-20 13:31:54 +01001619 i915_gem_object_put_unlocked(obj);
Eric Anholt673a3942008-07-30 12:06:12 -07001620 if (IS_ERR((void *)addr))
1621 return addr;
1622
1623 args->addr_ptr = (uint64_t) addr;
1624
1625 return 0;
1626}
1627
Jesse Barnesde151cf2008-11-12 10:03:55 -08001628/**
1629 * i915_gem_fault - fault a page into the GTT
Geliang Tangd9072a32015-09-15 05:58:44 -07001630 * @vma: VMA in question
1631 * @vmf: fault info
Jesse Barnesde151cf2008-11-12 10:03:55 -08001632 *
1633 * The fault handler is set up by drm_gem_mmap() when a object is GTT mapped
1634 * from userspace. The fault handler takes care of binding the object to
1635 * the GTT (if needed), allocating and programming a fence register (again,
1636 * only if needed based on whether the old reg is still valid or the object
1637 * is tiled) and inserting a new PTE into the faulting process.
1638 *
1639 * Note that the faulting process may involve evicting existing objects
1640 * from the GTT and/or fence registers to make room. So performance may
1641 * suffer if the GTT working set is large or there are few fence registers
1642 * left.
1643 */
1644int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1645{
Chris Wilson05394f32010-11-08 19:18:58 +00001646 struct drm_i915_gem_object *obj = to_intel_bo(vma->vm_private_data);
1647 struct drm_device *dev = obj->base.dev;
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03001648 struct drm_i915_private *dev_priv = to_i915(dev);
1649 struct i915_ggtt *ggtt = &dev_priv->ggtt;
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001650 struct i915_ggtt_view view = i915_ggtt_view_normal;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001651 pgoff_t page_offset;
1652 unsigned long pfn;
1653 int ret = 0;
Jesse Barnes0f973f22009-01-26 17:10:45 -08001654 bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
Jesse Barnesde151cf2008-11-12 10:03:55 -08001655
Paulo Zanonif65c9162013-11-27 18:20:34 -02001656 intel_runtime_pm_get(dev_priv);
1657
Jesse Barnesde151cf2008-11-12 10:03:55 -08001658 /* We don't use vmf->pgoff since that has the fake offset */
1659 page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
1660 PAGE_SHIFT;
1661
Chris Wilsond9bc7e92011-02-07 13:09:31 +00001662 ret = i915_mutex_lock_interruptible(dev);
1663 if (ret)
1664 goto out;
Chris Wilsona00b10c2010-09-24 21:15:47 +01001665
Chris Wilsondb53a302011-02-03 11:57:46 +00001666 trace_i915_gem_object_fault(obj, page_offset, true, write);
1667
Chris Wilson6e4930f2014-02-07 18:37:06 -02001668 /* Try to flush the object off the GPU first without holding the lock.
1669 * Upon reacquiring the lock, we will perform our sanity checks and then
1670 * repeat the flush holding the lock in the normal manner to catch cases
1671 * where we are gazumped.
1672 */
1673 ret = i915_gem_object_wait_rendering__nonblocking(obj, NULL, !write);
1674 if (ret)
1675 goto unlock;
1676
Chris Wilsoneb119bd2012-12-16 12:43:36 +00001677 /* Access to snoopable pages through the GTT is incoherent. */
1678 if (obj->cache_level != I915_CACHE_NONE && !HAS_LLC(dev)) {
Chris Wilsonddeff6e2014-05-28 16:16:41 +01001679 ret = -EFAULT;
Chris Wilsoneb119bd2012-12-16 12:43:36 +00001680 goto unlock;
1681 }
1682
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001683 /* Use a partial view if the object is bigger than the aperture. */
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03001684 if (obj->base.size >= ggtt->mappable_end &&
Joonas Lahtinene7ded2d2015-05-08 14:37:39 +03001685 obj->tiling_mode == I915_TILING_NONE) {
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001686 static const unsigned int chunk_size = 256; // 1 MiB
Joonas Lahtinene7ded2d2015-05-08 14:37:39 +03001687
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001688 memset(&view, 0, sizeof(view));
1689 view.type = I915_GGTT_VIEW_PARTIAL;
1690 view.params.partial.offset = rounddown(page_offset, chunk_size);
1691 view.params.partial.size =
1692 min_t(unsigned int,
1693 chunk_size,
1694 (vma->vm_end - vma->vm_start)/PAGE_SIZE -
1695 view.params.partial.offset);
1696 }
1697
1698 /* Now pin it into the GTT if needed */
Chris Wilson91b2db62016-08-04 16:32:23 +01001699 ret = i915_gem_object_ggtt_pin(obj, &view, 0, 0, PIN_MAPPABLE);
Chris Wilsond9e86c02010-11-10 16:40:20 +00001700 if (ret)
1701 goto unlock;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001702
Chris Wilsonc9839302012-11-20 10:45:17 +00001703 ret = i915_gem_object_set_to_gtt_domain(obj, write);
1704 if (ret)
1705 goto unpin;
1706
1707 ret = i915_gem_object_get_fence(obj);
1708 if (ret)
1709 goto unpin;
Chris Wilson7d1c4802010-08-07 21:45:03 +01001710
Chris Wilsonb90b91d2014-06-10 12:14:40 +01001711 /* Finally, remap it using the new GTT offset */
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03001712 pfn = ggtt->mappable_base +
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001713 i915_gem_obj_ggtt_offset_view(obj, &view);
Ben Widawskyf343c5f2013-07-05 14:41:04 -07001714 pfn >>= PAGE_SHIFT;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001715
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001716 if (unlikely(view.type == I915_GGTT_VIEW_PARTIAL)) {
1717 /* Overriding existing pages in partial view does not cause
1718 * us any trouble as TLBs are still valid because the fault
1719 * is due to userspace losing part of the mapping or never
1720 * having accessed it before (at this partials' range).
1721 */
1722 unsigned long base = vma->vm_start +
1723 (view.params.partial.offset << PAGE_SHIFT);
1724 unsigned int i;
Chris Wilsonb90b91d2014-06-10 12:14:40 +01001725
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001726 for (i = 0; i < view.params.partial.size; i++) {
1727 ret = vm_insert_pfn(vma, base + i * PAGE_SIZE, pfn + i);
Chris Wilsonb90b91d2014-06-10 12:14:40 +01001728 if (ret)
1729 break;
1730 }
1731
1732 obj->fault_mappable = true;
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001733 } else {
1734 if (!obj->fault_mappable) {
1735 unsigned long size = min_t(unsigned long,
1736 vma->vm_end - vma->vm_start,
1737 obj->base.size);
1738 int i;
1739
1740 for (i = 0; i < size >> PAGE_SHIFT; i++) {
1741 ret = vm_insert_pfn(vma,
1742 (unsigned long)vma->vm_start + i * PAGE_SIZE,
1743 pfn + i);
1744 if (ret)
1745 break;
1746 }
1747
1748 obj->fault_mappable = true;
1749 } else
1750 ret = vm_insert_pfn(vma,
1751 (unsigned long)vmf->virtual_address,
1752 pfn + page_offset);
1753 }
Chris Wilsonc9839302012-11-20 10:45:17 +00001754unpin:
Joonas Lahtinenc5ad54c2015-05-06 14:36:09 +03001755 i915_gem_object_ggtt_unpin_view(obj, &view);
Chris Wilsonc7150892009-09-23 00:43:56 +01001756unlock:
Jesse Barnesde151cf2008-11-12 10:03:55 -08001757 mutex_unlock(&dev->struct_mutex);
Chris Wilsond9bc7e92011-02-07 13:09:31 +00001758out:
Jesse Barnesde151cf2008-11-12 10:03:55 -08001759 switch (ret) {
Chris Wilsond9bc7e92011-02-07 13:09:31 +00001760 case -EIO:
Daniel Vetter2232f032014-09-04 09:36:18 +02001761 /*
1762 * We eat errors when the gpu is terminally wedged to avoid
1763 * userspace unduly crashing (gl has no provisions for mmaps to
1764 * fail). But any other -EIO isn't ours (e.g. swap in failure)
1765 * and so needs to be reported.
1766 */
1767 if (!i915_terminally_wedged(&dev_priv->gpu_error)) {
Paulo Zanonif65c9162013-11-27 18:20:34 -02001768 ret = VM_FAULT_SIGBUS;
1769 break;
1770 }
Chris Wilson045e7692010-11-07 09:18:22 +00001771 case -EAGAIN:
Daniel Vetter571c6082013-09-12 17:57:28 +02001772 /*
1773 * EAGAIN means the gpu is hung and we'll wait for the error
1774 * handler to reset everything when re-faulting in
1775 * i915_mutex_lock_interruptible.
Chris Wilsond9bc7e92011-02-07 13:09:31 +00001776 */
Chris Wilsonc7150892009-09-23 00:43:56 +01001777 case 0:
1778 case -ERESTARTSYS:
Chris Wilsonbed636a2011-02-11 20:31:19 +00001779 case -EINTR:
Dmitry Rogozhkine79e0fe2012-10-03 17:15:26 +03001780 case -EBUSY:
1781 /*
1782 * EBUSY is ok: this just means that another thread
1783 * already did the job.
1784 */
Paulo Zanonif65c9162013-11-27 18:20:34 -02001785 ret = VM_FAULT_NOPAGE;
1786 break;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001787 case -ENOMEM:
Paulo Zanonif65c9162013-11-27 18:20:34 -02001788 ret = VM_FAULT_OOM;
1789 break;
Daniel Vettera7c2e1a2012-10-17 11:17:16 +02001790 case -ENOSPC:
Chris Wilson45d67812014-01-31 11:34:57 +00001791 case -EFAULT:
Paulo Zanonif65c9162013-11-27 18:20:34 -02001792 ret = VM_FAULT_SIGBUS;
1793 break;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001794 default:
Daniel Vettera7c2e1a2012-10-17 11:17:16 +02001795 WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret);
Paulo Zanonif65c9162013-11-27 18:20:34 -02001796 ret = VM_FAULT_SIGBUS;
1797 break;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001798 }
Paulo Zanonif65c9162013-11-27 18:20:34 -02001799
1800 intel_runtime_pm_put(dev_priv);
1801 return ret;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001802}
1803
1804/**
Chris Wilson901782b2009-07-10 08:18:50 +01001805 * i915_gem_release_mmap - remove physical page mappings
1806 * @obj: obj in question
1807 *
André Goddard Rosaaf901ca2009-11-14 13:09:05 -02001808 * Preserve the reservation of the mmapping with the DRM core code, but
Chris Wilson901782b2009-07-10 08:18:50 +01001809 * relinquish ownership of the pages back to the system.
1810 *
1811 * It is vital that we remove the page mapping if we have mapped a tiled
1812 * object through the GTT and then lose the fence register due to
1813 * resource pressure. Similarly if the object has been moved out of the
1814 * aperture, than pages mapped into userspace must be revoked. Removing the
1815 * mapping will then trigger a page fault on the next user access, allowing
1816 * fixup by i915_gem_fault().
1817 */
Eric Anholtd05ca302009-07-10 13:02:26 -07001818void
Chris Wilson05394f32010-11-08 19:18:58 +00001819i915_gem_release_mmap(struct drm_i915_gem_object *obj)
Chris Wilson901782b2009-07-10 08:18:50 +01001820{
Chris Wilson349f2cc2016-04-13 17:35:12 +01001821 /* Serialisation between user GTT access and our code depends upon
1822 * revoking the CPU's PTE whilst the mutex is held. The next user
1823 * pagefault then has to wait until we release the mutex.
1824 */
1825 lockdep_assert_held(&obj->base.dev->struct_mutex);
1826
Chris Wilson6299f992010-11-24 12:23:44 +00001827 if (!obj->fault_mappable)
1828 return;
Chris Wilson901782b2009-07-10 08:18:50 +01001829
David Herrmann6796cb12014-01-03 14:24:19 +01001830 drm_vma_node_unmap(&obj->base.vma_node,
1831 obj->base.dev->anon_inode->i_mapping);
Chris Wilson349f2cc2016-04-13 17:35:12 +01001832
1833 /* Ensure that the CPU's PTE are revoked and there are not outstanding
1834 * memory transactions from userspace before we return. The TLB
1835 * flushing implied above by changing the PTE above *should* be
1836 * sufficient, an extra barrier here just provides us with a bit
1837 * of paranoid documentation about our requirement to serialise
1838 * memory writes before touching registers / GSM.
1839 */
1840 wmb();
1841
Chris Wilson6299f992010-11-24 12:23:44 +00001842 obj->fault_mappable = false;
Chris Wilson901782b2009-07-10 08:18:50 +01001843}
1844
Chris Wilsoneedd10f2014-06-16 08:57:44 +01001845void
1846i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv)
1847{
1848 struct drm_i915_gem_object *obj;
1849
1850 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list)
1851 i915_gem_release_mmap(obj);
1852}
1853
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001854/**
1855 * i915_gem_get_ggtt_size - return required global GTT size for an object
Chris Wilsona9f14812016-08-04 16:32:28 +01001856 * @dev_priv: i915 device
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001857 * @size: object size
1858 * @tiling_mode: tiling mode
1859 *
1860 * Return the required global GTT size for an object, taking into account
1861 * potential fence register mapping.
1862 */
Chris Wilsona9f14812016-08-04 16:32:28 +01001863u64 i915_gem_get_ggtt_size(struct drm_i915_private *dev_priv,
1864 u64 size, int tiling_mode)
Chris Wilson92b88ae2010-11-09 11:47:32 +00001865{
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001866 u64 ggtt_size;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001867
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001868 GEM_BUG_ON(size == 0);
1869
Chris Wilsona9f14812016-08-04 16:32:28 +01001870 if (INTEL_GEN(dev_priv) >= 4 ||
Chris Wilsone28f8712011-07-18 13:11:49 -07001871 tiling_mode == I915_TILING_NONE)
1872 return size;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001873
1874 /* Previous chips need a power-of-two fence region when tiling */
Chris Wilsona9f14812016-08-04 16:32:28 +01001875 if (IS_GEN3(dev_priv))
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001876 ggtt_size = 1024*1024;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001877 else
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001878 ggtt_size = 512*1024;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001879
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001880 while (ggtt_size < size)
1881 ggtt_size <<= 1;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001882
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001883 return ggtt_size;
Chris Wilson92b88ae2010-11-09 11:47:32 +00001884}
1885
Jesse Barnesde151cf2008-11-12 10:03:55 -08001886/**
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001887 * i915_gem_get_ggtt_alignment - return required global GTT alignment
Chris Wilsona9f14812016-08-04 16:32:28 +01001888 * @dev_priv: i915 device
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01001889 * @size: object size
1890 * @tiling_mode: tiling mode
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001891 * @fenced: is fenced alignment required or not
Jesse Barnesde151cf2008-11-12 10:03:55 -08001892 *
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001893 * Return the required global GTT alignment for an object, taking into account
Daniel Vetter5e783302010-11-14 22:32:36 +01001894 * potential fence register mapping.
Jesse Barnesde151cf2008-11-12 10:03:55 -08001895 */
Chris Wilsona9f14812016-08-04 16:32:28 +01001896u64 i915_gem_get_ggtt_alignment(struct drm_i915_private *dev_priv, u64 size,
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001897 int tiling_mode, bool fenced)
Jesse Barnesde151cf2008-11-12 10:03:55 -08001898{
Chris Wilsonad1a7d22016-08-04 16:32:27 +01001899 GEM_BUG_ON(size == 0);
1900
Jesse Barnesde151cf2008-11-12 10:03:55 -08001901 /*
1902 * Minimum alignment is 4k (GTT page size), but might be greater
1903 * if a fence register is needed for the object.
1904 */
Chris Wilsona9f14812016-08-04 16:32:28 +01001905 if (INTEL_GEN(dev_priv) >= 4 || (!fenced && IS_G33(dev_priv)) ||
Chris Wilsone28f8712011-07-18 13:11:49 -07001906 tiling_mode == I915_TILING_NONE)
Jesse Barnesde151cf2008-11-12 10:03:55 -08001907 return 4096;
1908
1909 /*
1910 * Previous chips need to be aligned to the size of the smallest
1911 * fence register that can contain the object.
1912 */
Chris Wilsona9f14812016-08-04 16:32:28 +01001913 return i915_gem_get_ggtt_size(dev_priv, size, tiling_mode);
Chris Wilsona00b10c2010-09-24 21:15:47 +01001914}
1915
Chris Wilsond8cb5082012-08-11 15:41:03 +01001916static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
1917{
Chris Wilsonfac5e232016-07-04 11:34:36 +01001918 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilsond8cb5082012-08-11 15:41:03 +01001919 int ret;
1920
Daniel Vetterda494d72012-12-20 15:11:16 +01001921 dev_priv->mm.shrinker_no_lock_stealing = true;
1922
Chris Wilsond8cb5082012-08-11 15:41:03 +01001923 ret = drm_gem_create_mmap_offset(&obj->base);
1924 if (ret != -ENOSPC)
Daniel Vetterda494d72012-12-20 15:11:16 +01001925 goto out;
Chris Wilsond8cb5082012-08-11 15:41:03 +01001926
1927 /* Badly fragmented mmap space? The only way we can recover
1928 * space is by destroying unwanted objects. We can't randomly release
1929 * mmap_offsets as userspace expects them to be persistent for the
1930 * lifetime of the objects. The closest we can is to release the
1931 * offsets on purgeable objects by truncating it and marking it purged,
1932 * which prevents userspace from ever using that object again.
1933 */
Chris Wilson21ab4e72014-09-09 11:16:08 +01001934 i915_gem_shrink(dev_priv,
1935 obj->base.size >> PAGE_SHIFT,
1936 I915_SHRINK_BOUND |
1937 I915_SHRINK_UNBOUND |
1938 I915_SHRINK_PURGEABLE);
Chris Wilsond8cb5082012-08-11 15:41:03 +01001939 ret = drm_gem_create_mmap_offset(&obj->base);
1940 if (ret != -ENOSPC)
Daniel Vetterda494d72012-12-20 15:11:16 +01001941 goto out;
Chris Wilsond8cb5082012-08-11 15:41:03 +01001942
1943 i915_gem_shrink_all(dev_priv);
Daniel Vetterda494d72012-12-20 15:11:16 +01001944 ret = drm_gem_create_mmap_offset(&obj->base);
1945out:
1946 dev_priv->mm.shrinker_no_lock_stealing = false;
1947
1948 return ret;
Chris Wilsond8cb5082012-08-11 15:41:03 +01001949}
1950
1951static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
1952{
Chris Wilsond8cb5082012-08-11 15:41:03 +01001953 drm_gem_free_mmap_offset(&obj->base);
1954}
1955
Dave Airlieda6b51d2014-12-24 13:11:17 +10001956int
Dave Airlieff72145b2011-02-07 12:16:14 +10001957i915_gem_mmap_gtt(struct drm_file *file,
1958 struct drm_device *dev,
Dave Airlieda6b51d2014-12-24 13:11:17 +10001959 uint32_t handle,
Dave Airlieff72145b2011-02-07 12:16:14 +10001960 uint64_t *offset)
Jesse Barnesde151cf2008-11-12 10:03:55 -08001961{
Chris Wilson05394f32010-11-08 19:18:58 +00001962 struct drm_i915_gem_object *obj;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001963 int ret;
1964
Chris Wilson76c1dec2010-09-25 11:22:51 +01001965 ret = i915_mutex_lock_interruptible(dev);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001966 if (ret)
Chris Wilson76c1dec2010-09-25 11:22:51 +01001967 return ret;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001968
Chris Wilson03ac0642016-07-20 13:31:51 +01001969 obj = i915_gem_object_lookup(file, handle);
1970 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001971 ret = -ENOENT;
1972 goto unlock;
1973 }
Jesse Barnesde151cf2008-11-12 10:03:55 -08001974
Chris Wilson05394f32010-11-08 19:18:58 +00001975 if (obj->madv != I915_MADV_WILLNEED) {
Chris Wilsonbd9b6a42014-02-10 09:03:50 +00001976 DRM_DEBUG("Attempting to mmap a purgeable buffer\n");
Chris Wilson8c99e572014-01-31 11:34:58 +00001977 ret = -EFAULT;
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001978 goto out;
Chris Wilsonab182822009-09-22 18:46:17 +01001979 }
1980
Chris Wilsond8cb5082012-08-11 15:41:03 +01001981 ret = i915_gem_object_create_mmap_offset(obj);
1982 if (ret)
1983 goto out;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001984
David Herrmann0de23972013-07-24 21:07:52 +02001985 *offset = drm_vma_node_offset_addr(&obj->base.vma_node);
Jesse Barnesde151cf2008-11-12 10:03:55 -08001986
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001987out:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01001988 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001989unlock:
Jesse Barnesde151cf2008-11-12 10:03:55 -08001990 mutex_unlock(&dev->struct_mutex);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01001991 return ret;
Jesse Barnesde151cf2008-11-12 10:03:55 -08001992}
1993
Dave Airlieff72145b2011-02-07 12:16:14 +10001994/**
1995 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
1996 * @dev: DRM device
1997 * @data: GTT mapping ioctl data
1998 * @file: GEM object info
1999 *
2000 * Simply returns the fake offset to userspace so it can mmap it.
2001 * The mmap call will end up in drm_gem_mmap(), which will set things
2002 * up so we can get faults in the handler above.
2003 *
2004 * The fault handler will take care of binding the object into the GTT
2005 * (since it may have been evicted to make room for something), allocating
2006 * a fence register, and mapping the appropriate aperture address into
2007 * userspace.
2008 */
2009int
2010i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
2011 struct drm_file *file)
2012{
2013 struct drm_i915_gem_mmap_gtt *args = data;
2014
Dave Airlieda6b51d2014-12-24 13:11:17 +10002015 return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
Dave Airlieff72145b2011-02-07 12:16:14 +10002016}
2017
Daniel Vetter225067e2012-08-20 10:23:20 +02002018/* Immediately discard the backing storage */
2019static void
2020i915_gem_object_truncate(struct drm_i915_gem_object *obj)
Chris Wilsone5281cc2010-10-28 13:45:36 +01002021{
Chris Wilson4d6294bf2012-08-11 15:41:05 +01002022 i915_gem_object_free_mmap_offset(obj);
Daniel Vetter1286ff72012-05-10 15:25:09 +02002023
Chris Wilson4d6294bf2012-08-11 15:41:05 +01002024 if (obj->base.filp == NULL)
2025 return;
2026
Daniel Vetter225067e2012-08-20 10:23:20 +02002027 /* Our goal here is to return as much of the memory as
2028 * is possible back to the system as we are called from OOM.
2029 * To do this we must instruct the shmfs to drop all of its
2030 * backing pages, *now*.
Chris Wilsone5281cc2010-10-28 13:45:36 +01002031 */
Chris Wilson55372522014-03-25 13:23:06 +00002032 shmem_truncate_range(file_inode(obj->base.filp), 0, (loff_t)-1);
Daniel Vetter225067e2012-08-20 10:23:20 +02002033 obj->madv = __I915_MADV_PURGED;
Chris Wilsone5281cc2010-10-28 13:45:36 +01002034}
Chris Wilsone5281cc2010-10-28 13:45:36 +01002035
Chris Wilson55372522014-03-25 13:23:06 +00002036/* Try to discard unwanted pages */
2037static void
2038i915_gem_object_invalidate(struct drm_i915_gem_object *obj)
Daniel Vetter225067e2012-08-20 10:23:20 +02002039{
Chris Wilson55372522014-03-25 13:23:06 +00002040 struct address_space *mapping;
2041
2042 switch (obj->madv) {
2043 case I915_MADV_DONTNEED:
2044 i915_gem_object_truncate(obj);
2045 case __I915_MADV_PURGED:
2046 return;
2047 }
2048
2049 if (obj->base.filp == NULL)
2050 return;
2051
2052 mapping = file_inode(obj->base.filp)->i_mapping,
2053 invalidate_mapping_pages(mapping, 0, (loff_t)-1);
Chris Wilsone5281cc2010-10-28 13:45:36 +01002054}
2055
Chris Wilson5cdf5882010-09-27 15:51:07 +01002056static void
Chris Wilson05394f32010-11-08 19:18:58 +00002057i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
Eric Anholt673a3942008-07-30 12:06:12 -07002058{
Dave Gordon85d12252016-05-20 11:54:06 +01002059 struct sgt_iter sgt_iter;
2060 struct page *page;
Imre Deak90797e62013-02-18 19:28:03 +02002061 int ret;
Daniel Vetter1286ff72012-05-10 15:25:09 +02002062
Chris Wilson05394f32010-11-08 19:18:58 +00002063 BUG_ON(obj->madv == __I915_MADV_PURGED);
Eric Anholt856fa192009-03-19 14:10:50 -07002064
Chris Wilson6c085a72012-08-20 11:40:46 +02002065 ret = i915_gem_object_set_to_cpu_domain(obj, true);
Chris Wilsonf4457ae2016-04-13 17:35:08 +01002066 if (WARN_ON(ret)) {
Chris Wilson6c085a72012-08-20 11:40:46 +02002067 /* In the event of a disaster, abandon all caches and
2068 * hope for the best.
2069 */
Chris Wilson2c225692013-08-09 12:26:45 +01002070 i915_gem_clflush_object(obj, true);
Chris Wilson6c085a72012-08-20 11:40:46 +02002071 obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
2072 }
2073
Imre Deake2273302015-07-09 12:59:05 +03002074 i915_gem_gtt_finish_object(obj);
2075
Daniel Vetter6dacfd22011-09-12 21:30:02 +02002076 if (i915_gem_object_needs_bit17_swizzle(obj))
Eric Anholt280b7132009-03-12 16:56:27 -07002077 i915_gem_object_save_bit_17_swizzle(obj);
2078
Chris Wilson05394f32010-11-08 19:18:58 +00002079 if (obj->madv == I915_MADV_DONTNEED)
2080 obj->dirty = 0;
Chris Wilson3ef94da2009-09-14 16:50:29 +01002081
Dave Gordon85d12252016-05-20 11:54:06 +01002082 for_each_sgt_page(page, sgt_iter, obj->pages) {
Chris Wilson05394f32010-11-08 19:18:58 +00002083 if (obj->dirty)
Chris Wilson9da3da62012-06-01 15:20:22 +01002084 set_page_dirty(page);
Chris Wilson3ef94da2009-09-14 16:50:29 +01002085
Chris Wilson05394f32010-11-08 19:18:58 +00002086 if (obj->madv == I915_MADV_WILLNEED)
Chris Wilson9da3da62012-06-01 15:20:22 +01002087 mark_page_accessed(page);
Chris Wilson3ef94da2009-09-14 16:50:29 +01002088
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002089 put_page(page);
Chris Wilson3ef94da2009-09-14 16:50:29 +01002090 }
Chris Wilson05394f32010-11-08 19:18:58 +00002091 obj->dirty = 0;
Eric Anholt673a3942008-07-30 12:06:12 -07002092
Chris Wilson9da3da62012-06-01 15:20:22 +01002093 sg_free_table(obj->pages);
2094 kfree(obj->pages);
Chris Wilson37e680a2012-06-07 15:38:42 +01002095}
2096
Chris Wilsondd624af2013-01-15 12:39:35 +00002097int
Chris Wilson37e680a2012-06-07 15:38:42 +01002098i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
2099{
2100 const struct drm_i915_gem_object_ops *ops = obj->ops;
2101
Chris Wilson2f745ad2012-09-04 21:02:58 +01002102 if (obj->pages == NULL)
Chris Wilson37e680a2012-06-07 15:38:42 +01002103 return 0;
2104
Chris Wilsona5570172012-09-04 21:02:54 +01002105 if (obj->pages_pin_count)
2106 return -EBUSY;
2107
Chris Wilson15717de2016-08-04 07:52:26 +01002108 GEM_BUG_ON(obj->bind_count);
Ben Widawsky3e123022013-07-31 17:00:04 -07002109
Chris Wilsona2165e32012-12-03 11:49:00 +00002110 /* ->put_pages might need to allocate memory for the bit17 swizzle
2111 * array, hence protect them from being reaped by removing them from gtt
2112 * lists early. */
Ben Widawsky35c20a62013-05-31 11:28:48 -07002113 list_del(&obj->global_list);
Chris Wilsona2165e32012-12-03 11:49:00 +00002114
Chris Wilson0a798eb2016-04-08 12:11:11 +01002115 if (obj->mapping) {
Chris Wilsonfb8621d2016-04-08 12:11:14 +01002116 if (is_vmalloc_addr(obj->mapping))
2117 vunmap(obj->mapping);
2118 else
2119 kunmap(kmap_to_page(obj->mapping));
Chris Wilson0a798eb2016-04-08 12:11:11 +01002120 obj->mapping = NULL;
2121 }
2122
Chris Wilson37e680a2012-06-07 15:38:42 +01002123 ops->put_pages(obj);
Chris Wilson05394f32010-11-08 19:18:58 +00002124 obj->pages = NULL;
Chris Wilson6c085a72012-08-20 11:40:46 +02002125
Chris Wilson55372522014-03-25 13:23:06 +00002126 i915_gem_object_invalidate(obj);
Chris Wilson6c085a72012-08-20 11:40:46 +02002127
2128 return 0;
2129}
2130
Chris Wilson37e680a2012-06-07 15:38:42 +01002131static int
Chris Wilson6c085a72012-08-20 11:40:46 +02002132i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
Eric Anholt673a3942008-07-30 12:06:12 -07002133{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002134 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Eric Anholt673a3942008-07-30 12:06:12 -07002135 int page_count, i;
2136 struct address_space *mapping;
Chris Wilson9da3da62012-06-01 15:20:22 +01002137 struct sg_table *st;
2138 struct scatterlist *sg;
Dave Gordon85d12252016-05-20 11:54:06 +01002139 struct sgt_iter sgt_iter;
Eric Anholt673a3942008-07-30 12:06:12 -07002140 struct page *page;
Imre Deak90797e62013-02-18 19:28:03 +02002141 unsigned long last_pfn = 0; /* suppress gcc warning */
Imre Deake2273302015-07-09 12:59:05 +03002142 int ret;
Chris Wilson6c085a72012-08-20 11:40:46 +02002143 gfp_t gfp;
Eric Anholt673a3942008-07-30 12:06:12 -07002144
Chris Wilson6c085a72012-08-20 11:40:46 +02002145 /* Assert that the object is not currently in any GPU domain. As it
2146 * wasn't in the GTT, there shouldn't be any way it could have been in
2147 * a GPU cache
2148 */
2149 BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
2150 BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
2151
Chris Wilson9da3da62012-06-01 15:20:22 +01002152 st = kmalloc(sizeof(*st), GFP_KERNEL);
2153 if (st == NULL)
Eric Anholt673a3942008-07-30 12:06:12 -07002154 return -ENOMEM;
2155
Chris Wilson9da3da62012-06-01 15:20:22 +01002156 page_count = obj->base.size / PAGE_SIZE;
2157 if (sg_alloc_table(st, page_count, GFP_KERNEL)) {
Chris Wilson9da3da62012-06-01 15:20:22 +01002158 kfree(st);
2159 return -ENOMEM;
2160 }
2161
2162 /* Get the list of pages out of our struct file. They'll be pinned
2163 * at this point until we release them.
2164 *
2165 * Fail silently without starting the shrinker
2166 */
Al Viro496ad9a2013-01-23 17:07:38 -05002167 mapping = file_inode(obj->base.filp)->i_mapping;
Michal Hockoc62d2552015-11-06 16:28:49 -08002168 gfp = mapping_gfp_constraint(mapping, ~(__GFP_IO | __GFP_RECLAIM));
Mel Gormand0164ad2015-11-06 16:28:21 -08002169 gfp |= __GFP_NORETRY | __GFP_NOWARN;
Imre Deak90797e62013-02-18 19:28:03 +02002170 sg = st->sgl;
2171 st->nents = 0;
2172 for (i = 0; i < page_count; i++) {
Chris Wilson6c085a72012-08-20 11:40:46 +02002173 page = shmem_read_mapping_page_gfp(mapping, i, gfp);
2174 if (IS_ERR(page)) {
Chris Wilson21ab4e72014-09-09 11:16:08 +01002175 i915_gem_shrink(dev_priv,
2176 page_count,
2177 I915_SHRINK_BOUND |
2178 I915_SHRINK_UNBOUND |
2179 I915_SHRINK_PURGEABLE);
Chris Wilson6c085a72012-08-20 11:40:46 +02002180 page = shmem_read_mapping_page_gfp(mapping, i, gfp);
2181 }
2182 if (IS_ERR(page)) {
2183 /* We've tried hard to allocate the memory by reaping
2184 * our own buffer, now let the real VM do its job and
2185 * go down in flames if truly OOM.
2186 */
Chris Wilson6c085a72012-08-20 11:40:46 +02002187 i915_gem_shrink_all(dev_priv);
David Herrmannf461d1be22014-05-25 14:34:10 +02002188 page = shmem_read_mapping_page(mapping, i);
Imre Deake2273302015-07-09 12:59:05 +03002189 if (IS_ERR(page)) {
2190 ret = PTR_ERR(page);
Chris Wilson6c085a72012-08-20 11:40:46 +02002191 goto err_pages;
Imre Deake2273302015-07-09 12:59:05 +03002192 }
Chris Wilson6c085a72012-08-20 11:40:46 +02002193 }
Konrad Rzeszutek Wilk426729d2013-06-24 11:47:48 -04002194#ifdef CONFIG_SWIOTLB
2195 if (swiotlb_nr_tbl()) {
2196 st->nents++;
2197 sg_set_page(sg, page, PAGE_SIZE, 0);
2198 sg = sg_next(sg);
2199 continue;
2200 }
2201#endif
Imre Deak90797e62013-02-18 19:28:03 +02002202 if (!i || page_to_pfn(page) != last_pfn + 1) {
2203 if (i)
2204 sg = sg_next(sg);
2205 st->nents++;
2206 sg_set_page(sg, page, PAGE_SIZE, 0);
2207 } else {
2208 sg->length += PAGE_SIZE;
2209 }
2210 last_pfn = page_to_pfn(page);
Daniel Vetter3bbbe702013-10-07 17:15:45 -03002211
2212 /* Check that the i965g/gm workaround works. */
2213 WARN_ON((gfp & __GFP_DMA32) && (last_pfn >= 0x00100000UL));
Eric Anholt673a3942008-07-30 12:06:12 -07002214 }
Konrad Rzeszutek Wilk426729d2013-06-24 11:47:48 -04002215#ifdef CONFIG_SWIOTLB
2216 if (!swiotlb_nr_tbl())
2217#endif
2218 sg_mark_end(sg);
Chris Wilson74ce6b62012-10-19 15:51:06 +01002219 obj->pages = st;
2220
Imre Deake2273302015-07-09 12:59:05 +03002221 ret = i915_gem_gtt_prepare_object(obj);
2222 if (ret)
2223 goto err_pages;
2224
Eric Anholt673a3942008-07-30 12:06:12 -07002225 if (i915_gem_object_needs_bit17_swizzle(obj))
2226 i915_gem_object_do_bit_17_swizzle(obj);
2227
Daniel Vetter656bfa32014-11-20 09:26:30 +01002228 if (obj->tiling_mode != I915_TILING_NONE &&
2229 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
2230 i915_gem_object_pin_pages(obj);
2231
Eric Anholt673a3942008-07-30 12:06:12 -07002232 return 0;
2233
2234err_pages:
Imre Deak90797e62013-02-18 19:28:03 +02002235 sg_mark_end(sg);
Dave Gordon85d12252016-05-20 11:54:06 +01002236 for_each_sgt_page(page, sgt_iter, st)
2237 put_page(page);
Chris Wilson9da3da62012-06-01 15:20:22 +01002238 sg_free_table(st);
2239 kfree(st);
Chris Wilson0820baf2014-03-25 13:23:03 +00002240
2241 /* shmemfs first checks if there is enough memory to allocate the page
2242 * and reports ENOSPC should there be insufficient, along with the usual
2243 * ENOMEM for a genuine allocation failure.
2244 *
2245 * We use ENOSPC in our driver to mean that we have run out of aperture
2246 * space and so want to translate the error from shmemfs back to our
2247 * usual understanding of ENOMEM.
2248 */
Imre Deake2273302015-07-09 12:59:05 +03002249 if (ret == -ENOSPC)
2250 ret = -ENOMEM;
2251
2252 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07002253}
2254
Chris Wilson37e680a2012-06-07 15:38:42 +01002255/* Ensure that the associated pages are gathered from the backing storage
2256 * and pinned into our object. i915_gem_object_get_pages() may be called
2257 * multiple times before they are released by a single call to
2258 * i915_gem_object_put_pages() - once the pages are no longer referenced
2259 * either as a result of memory pressure (reaping pages under the shrinker)
2260 * or as the object is itself released.
2261 */
2262int
2263i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
2264{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002265 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilson37e680a2012-06-07 15:38:42 +01002266 const struct drm_i915_gem_object_ops *ops = obj->ops;
2267 int ret;
2268
Chris Wilson2f745ad2012-09-04 21:02:58 +01002269 if (obj->pages)
Chris Wilson37e680a2012-06-07 15:38:42 +01002270 return 0;
2271
Chris Wilson43e28f02013-01-08 10:53:09 +00002272 if (obj->madv != I915_MADV_WILLNEED) {
Chris Wilsonbd9b6a42014-02-10 09:03:50 +00002273 DRM_DEBUG("Attempting to obtain a purgeable object\n");
Chris Wilson8c99e572014-01-31 11:34:58 +00002274 return -EFAULT;
Chris Wilson43e28f02013-01-08 10:53:09 +00002275 }
2276
Chris Wilsona5570172012-09-04 21:02:54 +01002277 BUG_ON(obj->pages_pin_count);
2278
Chris Wilson37e680a2012-06-07 15:38:42 +01002279 ret = ops->get_pages(obj);
2280 if (ret)
2281 return ret;
2282
Ben Widawsky35c20a62013-05-31 11:28:48 -07002283 list_add_tail(&obj->global_list, &dev_priv->mm.unbound_list);
Chris Wilsonee286372015-04-07 16:20:25 +01002284
2285 obj->get_page.sg = obj->pages->sgl;
2286 obj->get_page.last = 0;
2287
Chris Wilson37e680a2012-06-07 15:38:42 +01002288 return 0;
Eric Anholt673a3942008-07-30 12:06:12 -07002289}
2290
Dave Gordondd6034c2016-05-20 11:54:04 +01002291/* The 'mapping' part of i915_gem_object_pin_map() below */
2292static void *i915_gem_object_map(const struct drm_i915_gem_object *obj)
2293{
2294 unsigned long n_pages = obj->base.size >> PAGE_SHIFT;
2295 struct sg_table *sgt = obj->pages;
Dave Gordon85d12252016-05-20 11:54:06 +01002296 struct sgt_iter sgt_iter;
2297 struct page *page;
Dave Gordonb338fa42016-05-20 11:54:05 +01002298 struct page *stack_pages[32];
2299 struct page **pages = stack_pages;
Dave Gordondd6034c2016-05-20 11:54:04 +01002300 unsigned long i = 0;
2301 void *addr;
2302
2303 /* A single page can always be kmapped */
2304 if (n_pages == 1)
2305 return kmap(sg_page(sgt->sgl));
2306
Dave Gordonb338fa42016-05-20 11:54:05 +01002307 if (n_pages > ARRAY_SIZE(stack_pages)) {
2308 /* Too big for stack -- allocate temporary array instead */
2309 pages = drm_malloc_gfp(n_pages, sizeof(*pages), GFP_TEMPORARY);
2310 if (!pages)
2311 return NULL;
2312 }
Dave Gordondd6034c2016-05-20 11:54:04 +01002313
Dave Gordon85d12252016-05-20 11:54:06 +01002314 for_each_sgt_page(page, sgt_iter, sgt)
2315 pages[i++] = page;
Dave Gordondd6034c2016-05-20 11:54:04 +01002316
2317 /* Check that we have the expected number of pages */
2318 GEM_BUG_ON(i != n_pages);
2319
2320 addr = vmap(pages, n_pages, 0, PAGE_KERNEL);
2321
Dave Gordonb338fa42016-05-20 11:54:05 +01002322 if (pages != stack_pages)
2323 drm_free_large(pages);
Dave Gordondd6034c2016-05-20 11:54:04 +01002324
2325 return addr;
2326}
2327
2328/* get, pin, and map the pages of the object into kernel space */
Chris Wilson0a798eb2016-04-08 12:11:11 +01002329void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj)
2330{
2331 int ret;
2332
2333 lockdep_assert_held(&obj->base.dev->struct_mutex);
2334
2335 ret = i915_gem_object_get_pages(obj);
2336 if (ret)
2337 return ERR_PTR(ret);
2338
2339 i915_gem_object_pin_pages(obj);
2340
Dave Gordondd6034c2016-05-20 11:54:04 +01002341 if (!obj->mapping) {
2342 obj->mapping = i915_gem_object_map(obj);
2343 if (!obj->mapping) {
Chris Wilson0a798eb2016-04-08 12:11:11 +01002344 i915_gem_object_unpin_pages(obj);
2345 return ERR_PTR(-ENOMEM);
2346 }
2347 }
2348
2349 return obj->mapping;
2350}
2351
Chris Wilsoncaea7472010-11-12 13:53:37 +00002352static void
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002353i915_gem_object_retire__write(struct i915_gem_active *active,
2354 struct drm_i915_gem_request *request)
Chris Wilsonb4716182015-04-27 13:41:17 +01002355{
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002356 struct drm_i915_gem_object *obj =
2357 container_of(active, struct drm_i915_gem_object, last_write);
Chris Wilsonb4716182015-04-27 13:41:17 +01002358
Rodrigo Vivide152b62015-07-07 16:28:51 -07002359 intel_fb_obj_flush(obj, true, ORIGIN_CS);
Chris Wilsonb4716182015-04-27 13:41:17 +01002360}
2361
2362static void
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002363i915_gem_object_retire__read(struct i915_gem_active *active,
2364 struct drm_i915_gem_request *request)
Chris Wilsoncaea7472010-11-12 13:53:37 +00002365{
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002366 int idx = request->engine->id;
2367 struct drm_i915_gem_object *obj =
2368 container_of(active, struct drm_i915_gem_object, last_read[idx]);
Chris Wilsoncaea7472010-11-12 13:53:37 +00002369
Chris Wilson573adb32016-08-04 16:32:39 +01002370 GEM_BUG_ON(!i915_gem_object_has_active_engine(obj, idx));
Chris Wilsonb4716182015-04-27 13:41:17 +01002371
Chris Wilson573adb32016-08-04 16:32:39 +01002372 i915_gem_object_clear_active(obj, idx);
2373 if (i915_gem_object_is_active(obj))
Chris Wilsonb4716182015-04-27 13:41:17 +01002374 return;
Chris Wilson65ce3022012-07-20 12:41:02 +01002375
Chris Wilson6c246952015-07-27 10:26:26 +01002376 /* Bump our place on the bound list to keep it roughly in LRU order
2377 * so that we don't steal from recently used but inactive objects
2378 * (unless we are forced to ofc!)
2379 */
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002380 if (obj->bind_count)
2381 list_move_tail(&obj->global_list,
2382 &request->i915->mm.bound_list);
Chris Wilsoncaea7472010-11-12 13:53:37 +00002383
Chris Wilsonf8c417c2016-07-20 13:31:53 +01002384 i915_gem_object_put(obj);
Chris Wilsonc8725f32014-03-17 12:21:55 +00002385}
2386
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002387static bool i915_context_is_banned(const struct i915_gem_context *ctx)
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002388{
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002389 unsigned long elapsed;
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002390
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002391 if (ctx->hang_stats.banned)
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002392 return true;
2393
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002394 elapsed = get_seconds() - ctx->hang_stats.guilty_ts;
Chris Wilson676fa572014-12-24 08:13:39 -08002395 if (ctx->hang_stats.ban_period_seconds &&
2396 elapsed <= ctx->hang_stats.ban_period_seconds) {
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002397 DRM_DEBUG("context hanging too fast, banning!\n");
2398 return true;
Mika Kuoppalabe62acb2013-08-30 16:19:28 +03002399 }
2400
2401 return false;
2402}
2403
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002404static void i915_set_reset_status(struct i915_gem_context *ctx,
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002405 const bool guilty)
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002406{
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002407 struct i915_ctx_hang_stats *hs = &ctx->hang_stats;
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002408
2409 if (guilty) {
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002410 hs->banned = i915_context_is_banned(ctx);
Mika Kuoppala44e2c072014-01-30 16:01:15 +02002411 hs->batch_active++;
2412 hs->guilty_ts = get_seconds();
2413 } else {
2414 hs->batch_pending++;
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002415 }
2416}
2417
Chris Wilson8d9fc7f2014-02-25 17:11:23 +02002418struct drm_i915_gem_request *
Tvrtko Ursulin0bc40be2016-03-16 11:00:37 +00002419i915_gem_find_active_request(struct intel_engine_cs *engine)
Chris Wilson9375e442010-09-19 12:21:28 +01002420{
Chris Wilson4db080f2013-12-04 11:37:09 +00002421 struct drm_i915_gem_request *request;
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002422
Chris Wilsonf69a02c2016-07-01 17:23:16 +01002423 /* We are called by the error capture and reset at a random
2424 * point in time. In particular, note that neither is crucially
2425 * ordered with an interrupt. After a hang, the GPU is dead and we
2426 * assume that no more writes can happen (we waited long enough for
2427 * all writes that were in transaction to be flushed) - adding an
2428 * extra delay for a recent interrupt is pointless. Hence, we do
2429 * not need an engine->irq_seqno_barrier() before the seqno reads.
2430 */
Chris Wilsonefdf7c02016-08-04 07:52:33 +01002431 list_for_each_entry(request, &engine->request_list, link) {
Chris Wilsonf69a02c2016-07-01 17:23:16 +01002432 if (i915_gem_request_completed(request))
Chris Wilson4db080f2013-12-04 11:37:09 +00002433 continue;
Mika Kuoppalaaa60c662013-06-12 15:13:20 +03002434
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002435 return request;
Chris Wilson4db080f2013-12-04 11:37:09 +00002436 }
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002437
2438 return NULL;
2439}
2440
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002441static void i915_gem_reset_engine_status(struct intel_engine_cs *engine)
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002442{
2443 struct drm_i915_gem_request *request;
2444 bool ring_hung;
2445
Tvrtko Ursulin0bc40be2016-03-16 11:00:37 +00002446 request = i915_gem_find_active_request(engine);
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002447 if (request == NULL)
2448 return;
2449
Tvrtko Ursulin0bc40be2016-03-16 11:00:37 +00002450 ring_hung = engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG;
Mika Kuoppalab6b0fac2014-01-30 19:04:43 +02002451
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002452 i915_set_reset_status(request->ctx, ring_hung);
Chris Wilsonefdf7c02016-08-04 07:52:33 +01002453 list_for_each_entry_continue(request, &engine->request_list, link)
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002454 i915_set_reset_status(request->ctx, false);
Chris Wilson4db080f2013-12-04 11:37:09 +00002455}
2456
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002457static void i915_gem_reset_engine_cleanup(struct intel_engine_cs *engine)
Chris Wilson4db080f2013-12-04 11:37:09 +00002458{
Chris Wilson7e37f882016-08-02 22:50:21 +01002459 struct intel_ring *ring;
Chris Wilson608c1a52015-09-03 13:01:40 +01002460
Chris Wilsonc4b09302016-07-20 09:21:10 +01002461 /* Mark all pending requests as complete so that any concurrent
2462 * (lockless) lookup doesn't try and wait upon the request as we
2463 * reset it.
2464 */
Chris Wilson7e37f882016-08-02 22:50:21 +01002465 intel_engine_init_seqno(engine, engine->last_submitted_seqno);
Chris Wilsonc4b09302016-07-20 09:21:10 +01002466
Ben Widawsky1d62bee2014-01-01 10:15:13 -08002467 /*
Oscar Mateodcb4c122014-11-13 10:28:10 +00002468 * Clear the execlists queue up before freeing the requests, as those
2469 * are the ones that keep the context and ringbuffer backing objects
2470 * pinned in place.
2471 */
Oscar Mateodcb4c122014-11-13 10:28:10 +00002472
Tomas Elf7de1691a2015-10-19 16:32:32 +01002473 if (i915.enable_execlists) {
Tvrtko Ursulin27af5ee2016-04-04 12:11:56 +01002474 /* Ensure irq handler finishes or is cancelled. */
2475 tasklet_kill(&engine->irq_tasklet);
Mika Kuoppala1197b4f2015-01-13 11:32:24 +02002476
Tvrtko Ursuline39d42f2016-04-28 09:56:58 +01002477 intel_execlists_cancel_requests(engine);
Oscar Mateodcb4c122014-11-13 10:28:10 +00002478 }
2479
2480 /*
Ben Widawsky1d62bee2014-01-01 10:15:13 -08002481 * We must free the requests after all the corresponding objects have
2482 * been moved off active lists. Which is the same order as the normal
2483 * retire_requests function does. This is important if object hold
2484 * implicit references on things like e.g. ppgtt address spaces through
2485 * the request.
2486 */
Chris Wilson05235c52016-07-20 09:21:08 +01002487 if (!list_empty(&engine->request_list)) {
Ben Widawsky1d62bee2014-01-01 10:15:13 -08002488 struct drm_i915_gem_request *request;
2489
Chris Wilson05235c52016-07-20 09:21:08 +01002490 request = list_last_entry(&engine->request_list,
2491 struct drm_i915_gem_request,
Chris Wilsonefdf7c02016-08-04 07:52:33 +01002492 link);
Ben Widawsky1d62bee2014-01-01 10:15:13 -08002493
Chris Wilson05235c52016-07-20 09:21:08 +01002494 i915_gem_request_retire_upto(request);
Ben Widawsky1d62bee2014-01-01 10:15:13 -08002495 }
Chris Wilson608c1a52015-09-03 13:01:40 +01002496
2497 /* Having flushed all requests from all queues, we know that all
2498 * ringbuffers must now be empty. However, since we do not reclaim
2499 * all space when retiring the request (to prevent HEADs colliding
2500 * with rapid ringbuffer wraparound) the amount of available space
2501 * upon reset is less than when we start. Do one more pass over
2502 * all the ringbuffers to reset last_retired_head.
2503 */
Chris Wilson7e37f882016-08-02 22:50:21 +01002504 list_for_each_entry(ring, &engine->buffers, link) {
2505 ring->last_retired_head = ring->tail;
2506 intel_ring_update_space(ring);
Chris Wilson608c1a52015-09-03 13:01:40 +01002507 }
Chris Wilson2ed53a92016-04-07 07:29:11 +01002508
Chris Wilsonb913b332016-07-13 09:10:31 +01002509 engine->i915->gt.active_engines &= ~intel_engine_flag(engine);
Eric Anholt673a3942008-07-30 12:06:12 -07002510}
2511
Chris Wilson069efc12010-09-30 16:53:18 +01002512void i915_gem_reset(struct drm_device *dev)
Eric Anholt673a3942008-07-30 12:06:12 -07002513{
Chris Wilsonfac5e232016-07-04 11:34:36 +01002514 struct drm_i915_private *dev_priv = to_i915(dev);
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00002515 struct intel_engine_cs *engine;
Eric Anholt673a3942008-07-30 12:06:12 -07002516
Chris Wilson4db080f2013-12-04 11:37:09 +00002517 /*
2518 * Before we free the objects from the requests, we need to inspect
2519 * them for finding the guilty party. As the requests only borrow
2520 * their reference to the objects, the inspection must be done first.
2521 */
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002522 for_each_engine(engine, dev_priv)
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002523 i915_gem_reset_engine_status(engine);
Chris Wilson4db080f2013-12-04 11:37:09 +00002524
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002525 for_each_engine(engine, dev_priv)
Chris Wilson7b4d3a12016-07-04 08:08:37 +01002526 i915_gem_reset_engine_cleanup(engine);
Chris Wilsonb913b332016-07-13 09:10:31 +01002527 mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0);
Chris Wilsondfaae392010-09-22 10:31:52 +01002528
Ben Widawskyacce9ff2013-12-06 14:11:03 -08002529 i915_gem_context_reset(dev);
2530
Chris Wilson19b2dbd2013-06-12 10:15:12 +01002531 i915_gem_restore_fences(dev);
Eric Anholt673a3942008-07-30 12:06:12 -07002532}
2533
Daniel Vetter75ef9da2010-08-21 00:25:16 +02002534static void
Eric Anholt673a3942008-07-30 12:06:12 -07002535i915_gem_retire_work_handler(struct work_struct *work)
2536{
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002537 struct drm_i915_private *dev_priv =
Chris Wilson67d97da2016-07-04 08:08:31 +01002538 container_of(work, typeof(*dev_priv), gt.retire_work.work);
Chris Wilson91c8a322016-07-05 10:40:23 +01002539 struct drm_device *dev = &dev_priv->drm;
Eric Anholt673a3942008-07-30 12:06:12 -07002540
Chris Wilson891b48c2010-09-29 12:26:37 +01002541 /* Come back later if the device is busy... */
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002542 if (mutex_trylock(&dev->struct_mutex)) {
Chris Wilson67d97da2016-07-04 08:08:31 +01002543 i915_gem_retire_requests(dev_priv);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002544 mutex_unlock(&dev->struct_mutex);
2545 }
Chris Wilson67d97da2016-07-04 08:08:31 +01002546
2547 /* Keep the retire handler running until we are finally idle.
2548 * We do not need to do this test under locking as in the worst-case
2549 * we queue the retire worker once too often.
2550 */
Chris Wilsonc9615612016-07-09 10:12:06 +01002551 if (READ_ONCE(dev_priv->gt.awake)) {
2552 i915_queue_hangcheck(dev_priv);
Chris Wilson67d97da2016-07-04 08:08:31 +01002553 queue_delayed_work(dev_priv->wq,
2554 &dev_priv->gt.retire_work,
Chris Wilsonbcb45082012-10-05 17:02:57 +01002555 round_jiffies_up_relative(HZ));
Chris Wilsonc9615612016-07-09 10:12:06 +01002556 }
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002557}
Chris Wilson891b48c2010-09-29 12:26:37 +01002558
Chris Wilsonb29c19b2013-09-25 17:34:56 +01002559static void
2560i915_gem_idle_work_handler(struct work_struct *work)
2561{
2562 struct drm_i915_private *dev_priv =
Chris Wilson67d97da2016-07-04 08:08:31 +01002563 container_of(work, typeof(*dev_priv), gt.idle_work.work);
Chris Wilson91c8a322016-07-05 10:40:23 +01002564 struct drm_device *dev = &dev_priv->drm;
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002565 struct intel_engine_cs *engine;
Chris Wilson67d97da2016-07-04 08:08:31 +01002566 unsigned int stuck_engines;
2567 bool rearm_hangcheck;
2568
2569 if (!READ_ONCE(dev_priv->gt.awake))
2570 return;
2571
2572 if (READ_ONCE(dev_priv->gt.active_engines))
2573 return;
2574
2575 rearm_hangcheck =
2576 cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
2577
2578 if (!mutex_trylock(&dev->struct_mutex)) {
2579 /* Currently busy, come back later */
2580 mod_delayed_work(dev_priv->wq,
2581 &dev_priv->gt.idle_work,
2582 msecs_to_jiffies(50));
2583 goto out_rearm;
2584 }
2585
2586 if (dev_priv->gt.active_engines)
2587 goto out_unlock;
Zou Nan haid1b851f2010-05-21 09:08:57 +08002588
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002589 for_each_engine(engine, dev_priv)
Chris Wilson67d97da2016-07-04 08:08:31 +01002590 i915_gem_batch_pool_fini(&engine->batch_pool);
Zou Nan hai852835f2010-05-21 09:08:56 +08002591
Chris Wilson67d97da2016-07-04 08:08:31 +01002592 GEM_BUG_ON(!dev_priv->gt.awake);
2593 dev_priv->gt.awake = false;
2594 rearm_hangcheck = false;
Daniel Vetter30ecad72015-12-09 09:29:36 +01002595
Chris Wilson2529d572016-07-24 10:10:20 +01002596 /* As we have disabled hangcheck, we need to unstick any waiters still
2597 * hanging around. However, as we may be racing against the interrupt
2598 * handler or the waiters themselves, we skip enabling the fake-irq.
2599 */
Chris Wilson67d97da2016-07-04 08:08:31 +01002600 stuck_engines = intel_kick_waiters(dev_priv);
Chris Wilson2529d572016-07-24 10:10:20 +01002601 if (unlikely(stuck_engines))
2602 DRM_DEBUG_DRIVER("kicked stuck waiters (%x)...missed irq?\n",
2603 stuck_engines);
Chris Wilson35c94182015-04-07 16:20:37 +01002604
Chris Wilson67d97da2016-07-04 08:08:31 +01002605 if (INTEL_GEN(dev_priv) >= 6)
2606 gen6_rps_idle(dev_priv);
2607 intel_runtime_pm_put(dev_priv);
2608out_unlock:
2609 mutex_unlock(&dev->struct_mutex);
Chris Wilson35c94182015-04-07 16:20:37 +01002610
Chris Wilson67d97da2016-07-04 08:08:31 +01002611out_rearm:
2612 if (rearm_hangcheck) {
2613 GEM_BUG_ON(!dev_priv->gt.awake);
2614 i915_queue_hangcheck(dev_priv);
Chris Wilson35c94182015-04-07 16:20:37 +01002615 }
Eric Anholt673a3942008-07-30 12:06:12 -07002616}
2617
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002618void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
2619{
2620 struct drm_i915_gem_object *obj = to_intel_bo(gem);
2621 struct drm_i915_file_private *fpriv = file->driver_priv;
2622 struct i915_vma *vma, *vn;
2623
2624 mutex_lock(&obj->base.dev->struct_mutex);
2625 list_for_each_entry_safe(vma, vn, &obj->vma_list, obj_link)
2626 if (vma->vm->file == fpriv)
2627 i915_vma_close(vma);
2628 mutex_unlock(&obj->base.dev->struct_mutex);
2629}
2630
Ben Widawsky5816d642012-04-11 11:18:19 -07002631/**
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002632 * i915_gem_wait_ioctl - implements DRM_IOCTL_I915_GEM_WAIT
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01002633 * @dev: drm device pointer
2634 * @data: ioctl data blob
2635 * @file: drm file pointer
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002636 *
2637 * Returns 0 if successful, else an error is returned with the remaining time in
2638 * the timeout parameter.
2639 * -ETIME: object is still busy after timeout
2640 * -ERESTARTSYS: signal interrupted the wait
2641 * -ENONENT: object doesn't exist
2642 * Also possible, but rare:
2643 * -EAGAIN: GPU wedged
2644 * -ENOMEM: damn
2645 * -ENODEV: Internal IRQ fail
2646 * -E?: The add request failed
2647 *
2648 * The wait ioctl with a timeout of 0 reimplements the busy ioctl. With any
2649 * non-zero timeout parameter the wait ioctl will wait for the given number of
2650 * nanoseconds on an object becoming unbusy. Since the wait itself does so
2651 * without holding struct_mutex the object may become re-busied before this
2652 * function completes. A similar but shorter * race condition exists in the busy
2653 * ioctl
2654 */
2655int
2656i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
2657{
2658 struct drm_i915_gem_wait *args = data;
2659 struct drm_i915_gem_object *obj;
Chris Wilson27c01aa2016-08-04 07:52:30 +01002660 struct drm_i915_gem_request *requests[I915_NUM_ENGINES];
Chris Wilsonb4716182015-04-27 13:41:17 +01002661 int i, n = 0;
2662 int ret;
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002663
Daniel Vetter11b5d512014-09-29 15:31:26 +02002664 if (args->flags != 0)
2665 return -EINVAL;
2666
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002667 ret = i915_mutex_lock_interruptible(dev);
2668 if (ret)
2669 return ret;
2670
Chris Wilson03ac0642016-07-20 13:31:51 +01002671 obj = i915_gem_object_lookup(file, args->bo_handle);
2672 if (!obj) {
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002673 mutex_unlock(&dev->struct_mutex);
2674 return -ENOENT;
2675 }
2676
Chris Wilson573adb32016-08-04 16:32:39 +01002677 if (!i915_gem_object_is_active(obj))
John Harrison97b2a6a2014-11-24 18:49:26 +00002678 goto out;
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002679
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00002680 for (i = 0; i < I915_NUM_ENGINES; i++) {
Chris Wilson27c01aa2016-08-04 07:52:30 +01002681 struct drm_i915_gem_request *req;
Chris Wilsonb4716182015-04-27 13:41:17 +01002682
Chris Wilsond72d9082016-08-04 07:52:31 +01002683 req = i915_gem_active_get(&obj->last_read[i],
2684 &obj->base.dev->struct_mutex);
Chris Wilson27c01aa2016-08-04 07:52:30 +01002685 if (req)
2686 requests[n++] = req;
Chris Wilsonb4716182015-04-27 13:41:17 +01002687 }
2688
Chris Wilson21c310f2016-08-04 07:52:34 +01002689out:
2690 i915_gem_object_put(obj);
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002691 mutex_unlock(&dev->struct_mutex);
2692
Chris Wilsonb4716182015-04-27 13:41:17 +01002693 for (i = 0; i < n; i++) {
2694 if (ret == 0)
Chris Wilson776f3232016-08-04 07:52:40 +01002695 ret = i915_wait_request(requests[i], true,
2696 args->timeout_ns > 0 ? &args->timeout_ns : NULL,
2697 to_rps_client(file));
Chris Wilson27c01aa2016-08-04 07:52:30 +01002698 i915_gem_request_put(requests[i]);
Chris Wilsonb4716182015-04-27 13:41:17 +01002699 }
John Harrisonff865882014-11-24 18:49:28 +00002700 return ret;
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002701}
2702
Chris Wilsonb4716182015-04-27 13:41:17 +01002703static int
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002704__i915_gem_object_sync(struct drm_i915_gem_request *to,
Chris Wilson8e637172016-08-02 22:50:26 +01002705 struct drm_i915_gem_request *from)
Chris Wilsonb4716182015-04-27 13:41:17 +01002706{
Chris Wilsonb4716182015-04-27 13:41:17 +01002707 int ret;
2708
Chris Wilson8e637172016-08-02 22:50:26 +01002709 if (to->engine == from->engine)
Chris Wilsonb4716182015-04-27 13:41:17 +01002710 return 0;
2711
Chris Wilson39df9192016-07-20 13:31:57 +01002712 if (!i915.semaphores) {
Chris Wilson776f3232016-08-04 07:52:40 +01002713 ret = i915_wait_request(from,
2714 from->i915->mm.interruptible,
2715 NULL,
2716 NO_WAITBOOST);
Chris Wilsonb4716182015-04-27 13:41:17 +01002717 if (ret)
2718 return ret;
Chris Wilsonb4716182015-04-27 13:41:17 +01002719 } else {
Chris Wilson8e637172016-08-02 22:50:26 +01002720 int idx = intel_engine_sync_index(from->engine, to->engine);
Chris Wilsonddf07be2016-08-02 22:50:39 +01002721 if (from->fence.seqno <= from->engine->semaphore.sync_seqno[idx])
Chris Wilsonb4716182015-04-27 13:41:17 +01002722 return 0;
2723
Chris Wilson8e637172016-08-02 22:50:26 +01002724 trace_i915_gem_ring_sync_to(to, from);
Chris Wilsonddf07be2016-08-02 22:50:39 +01002725 ret = to->engine->semaphore.sync_to(to, from);
Chris Wilsonb4716182015-04-27 13:41:17 +01002726 if (ret)
2727 return ret;
2728
Chris Wilsonddf07be2016-08-02 22:50:39 +01002729 from->engine->semaphore.sync_seqno[idx] = from->fence.seqno;
Chris Wilsonb4716182015-04-27 13:41:17 +01002730 }
2731
2732 return 0;
2733}
2734
Ben Widawsky23ba4fd2012-05-24 15:03:10 -07002735/**
Ben Widawsky5816d642012-04-11 11:18:19 -07002736 * i915_gem_object_sync - sync an object to a ring.
2737 *
2738 * @obj: object which may be in use on another ring.
Chris Wilson8e637172016-08-02 22:50:26 +01002739 * @to: request we are wishing to use
Ben Widawsky5816d642012-04-11 11:18:19 -07002740 *
2741 * This code is meant to abstract object synchronization with the GPU.
Chris Wilson8e637172016-08-02 22:50:26 +01002742 * Conceptually we serialise writes between engines inside the GPU.
2743 * We only allow one engine to write into a buffer at any time, but
2744 * multiple readers. To ensure each has a coherent view of memory, we must:
Chris Wilsonb4716182015-04-27 13:41:17 +01002745 *
2746 * - If there is an outstanding write request to the object, the new
2747 * request must wait for it to complete (either CPU or in hw, requests
2748 * on the same ring will be naturally ordered).
2749 *
2750 * - If we are a write request (pending_write_domain is set), the new
2751 * request must wait for outstanding read requests to complete.
Ben Widawsky5816d642012-04-11 11:18:19 -07002752 *
2753 * Returns 0 if successful, else propagates up the lower layer error.
2754 */
Ben Widawsky2911a352012-04-05 14:47:36 -07002755int
2756i915_gem_object_sync(struct drm_i915_gem_object *obj,
Chris Wilson8e637172016-08-02 22:50:26 +01002757 struct drm_i915_gem_request *to)
Ben Widawsky2911a352012-04-05 14:47:36 -07002758{
Chris Wilson8cac6f62016-08-04 07:52:32 +01002759 struct i915_gem_active *active;
2760 unsigned long active_mask;
2761 int idx;
Ben Widawsky2911a352012-04-05 14:47:36 -07002762
Chris Wilson8cac6f62016-08-04 07:52:32 +01002763 lockdep_assert_held(&obj->base.dev->struct_mutex);
2764
Chris Wilson573adb32016-08-04 16:32:39 +01002765 active_mask = i915_gem_object_get_active(obj);
Chris Wilson8cac6f62016-08-04 07:52:32 +01002766 if (!active_mask)
Ben Widawsky2911a352012-04-05 14:47:36 -07002767 return 0;
2768
Chris Wilson8cac6f62016-08-04 07:52:32 +01002769 if (obj->base.pending_write_domain) {
2770 active = obj->last_read;
Chris Wilsonb4716182015-04-27 13:41:17 +01002771 } else {
Chris Wilson8cac6f62016-08-04 07:52:32 +01002772 active_mask = 1;
2773 active = &obj->last_write;
Chris Wilsonb4716182015-04-27 13:41:17 +01002774 }
Chris Wilson8cac6f62016-08-04 07:52:32 +01002775
2776 for_each_active(active_mask, idx) {
2777 struct drm_i915_gem_request *request;
2778 int ret;
2779
2780 request = i915_gem_active_peek(&active[idx],
2781 &obj->base.dev->struct_mutex);
2782 if (!request)
2783 continue;
2784
Chris Wilsonfa545cb2016-08-04 07:52:35 +01002785 ret = __i915_gem_object_sync(to, request);
Chris Wilsonb4716182015-04-27 13:41:17 +01002786 if (ret)
2787 return ret;
2788 }
Ben Widawsky2911a352012-04-05 14:47:36 -07002789
Chris Wilsonb4716182015-04-27 13:41:17 +01002790 return 0;
Ben Widawsky2911a352012-04-05 14:47:36 -07002791}
2792
Chris Wilsonb5ffc9b2011-04-13 22:06:03 +01002793static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
2794{
2795 u32 old_write_domain, old_read_domains;
2796
Chris Wilsonb5ffc9b2011-04-13 22:06:03 +01002797 /* Force a pagefault for domain tracking on next user access */
2798 i915_gem_release_mmap(obj);
2799
Keith Packardb97c3d92011-06-24 21:02:59 -07002800 if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
2801 return;
2802
Chris Wilsonb5ffc9b2011-04-13 22:06:03 +01002803 old_read_domains = obj->base.read_domains;
2804 old_write_domain = obj->base.write_domain;
2805
2806 obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT;
2807 obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT;
2808
2809 trace_i915_gem_object_change_domain(obj,
2810 old_read_domains,
2811 old_write_domain);
2812}
2813
Chris Wilson8ef85612016-04-28 09:56:39 +01002814static void __i915_vma_iounmap(struct i915_vma *vma)
2815{
Chris Wilson20dfbde2016-08-04 16:32:30 +01002816 GEM_BUG_ON(i915_vma_is_pinned(vma));
Chris Wilson8ef85612016-04-28 09:56:39 +01002817
2818 if (vma->iomap == NULL)
2819 return;
2820
2821 io_mapping_unmap(vma->iomap);
2822 vma->iomap = NULL;
2823}
2824
Chris Wilsondf0e9a22016-08-04 07:52:47 +01002825int i915_vma_unbind(struct i915_vma *vma)
Eric Anholt673a3942008-07-30 12:06:12 -07002826{
Ben Widawsky07fe0b12013-07-31 17:00:10 -07002827 struct drm_i915_gem_object *obj = vma->obj;
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002828 unsigned long active;
Chris Wilson43e28f02013-01-08 10:53:09 +00002829 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07002830
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002831 /* First wait upon any activity as retiring the request may
2832 * have side-effects such as unpinning or even unbinding this vma.
2833 */
2834 active = i915_vma_get_active(vma);
Chris Wilsondf0e9a22016-08-04 07:52:47 +01002835 if (active) {
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002836 int idx;
2837
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002838 /* When a closed VMA is retired, it is unbound - eek.
2839 * In order to prevent it from being recursively closed,
2840 * take a pin on the vma so that the second unbind is
2841 * aborted.
2842 */
Chris Wilson20dfbde2016-08-04 16:32:30 +01002843 __i915_vma_pin(vma);
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002844
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002845 for_each_active(active, idx) {
2846 ret = i915_gem_active_retire(&vma->last_read[idx],
2847 &vma->vm->dev->struct_mutex);
2848 if (ret)
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002849 break;
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002850 }
2851
Chris Wilson20dfbde2016-08-04 16:32:30 +01002852 __i915_vma_unpin(vma);
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002853 if (ret)
2854 return ret;
2855
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002856 GEM_BUG_ON(i915_vma_is_active(vma));
2857 }
2858
Chris Wilson20dfbde2016-08-04 16:32:30 +01002859 if (i915_vma_is_pinned(vma))
Chris Wilsonb0decaf2016-08-04 07:52:44 +01002860 return -EBUSY;
2861
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002862 if (!drm_mm_node_allocated(&vma->node))
2863 goto destroy;
Ben Widawsky433544b2013-08-13 18:09:06 -07002864
Chris Wilson15717de2016-08-04 07:52:26 +01002865 GEM_BUG_ON(obj->bind_count == 0);
2866 GEM_BUG_ON(!obj->pages);
Chris Wilsonc4670ad2012-08-20 10:23:27 +01002867
Chris Wilson3272db52016-08-04 16:32:32 +01002868 if (i915_vma_is_ggtt(vma) &&
2869 vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL) {
Daniel Vetter8b1bc9b2014-02-14 14:06:07 +01002870 i915_gem_object_finish_gtt(obj);
Chris Wilsona8198ee2011-04-13 22:04:09 +01002871
Daniel Vetter8b1bc9b2014-02-14 14:06:07 +01002872 /* release the fence reg _after_ flushing */
2873 ret = i915_gem_object_put_fence(obj);
2874 if (ret)
2875 return ret;
Chris Wilson8ef85612016-04-28 09:56:39 +01002876
2877 __i915_vma_iounmap(vma);
Daniel Vetter8b1bc9b2014-02-14 14:06:07 +01002878 }
Daniel Vetter96b47b62009-12-15 17:50:00 +01002879
Chris Wilson50e046b2016-08-04 07:52:46 +01002880 if (likely(!vma->vm->closed)) {
2881 trace_i915_vma_unbind(vma);
2882 vma->vm->unbind_vma(vma);
2883 }
Chris Wilson3272db52016-08-04 16:32:32 +01002884 vma->flags &= ~(I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND);
Ben Widawsky6f65e292013-12-06 14:10:56 -08002885
Chris Wilson50e046b2016-08-04 07:52:46 +01002886 drm_mm_remove_node(&vma->node);
2887 list_move_tail(&vma->vm_link, &vma->vm->unbound_list);
2888
Chris Wilson3272db52016-08-04 16:32:32 +01002889 if (i915_vma_is_ggtt(vma)) {
Tvrtko Ursulinfe14d5f2014-12-10 17:27:58 +00002890 if (vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL) {
2891 obj->map_and_fenceable = false;
2892 } else if (vma->ggtt_view.pages) {
2893 sg_free_table(vma->ggtt_view.pages);
2894 kfree(vma->ggtt_view.pages);
Tvrtko Ursulinfe14d5f2014-12-10 17:27:58 +00002895 }
Chris Wilson016a65a2015-06-11 08:06:08 +01002896 vma->ggtt_view.pages = NULL;
Tvrtko Ursulinfe14d5f2014-12-10 17:27:58 +00002897 }
Eric Anholt673a3942008-07-30 12:06:12 -07002898
Ben Widawsky2f633152013-07-17 12:19:03 -07002899 /* Since the unbound list is global, only move to that list if
Daniel Vetterb93dab62013-08-26 11:23:47 +02002900 * no more VMAs exist. */
Chris Wilson15717de2016-08-04 07:52:26 +01002901 if (--obj->bind_count == 0)
2902 list_move_tail(&obj->global_list,
2903 &to_i915(obj->base.dev)->mm.unbound_list);
Eric Anholt673a3942008-07-30 12:06:12 -07002904
Chris Wilson70903c32013-12-04 09:59:09 +00002905 /* And finally now the object is completely decoupled from this vma,
2906 * we can drop its hold on the backing storage and allow it to be
2907 * reaped by the shrinker.
2908 */
2909 i915_gem_object_unpin_pages(obj);
2910
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002911destroy:
Chris Wilson3272db52016-08-04 16:32:32 +01002912 if (unlikely(i915_vma_is_closed(vma)))
Chris Wilsonb1f788c2016-08-04 07:52:45 +01002913 i915_vma_destroy(vma);
2914
Chris Wilson88241782011-01-07 17:09:48 +00002915 return 0;
Chris Wilson54cf91d2010-11-25 18:00:26 +00002916}
2917
Chris Wilson6e5a5be2016-06-24 14:55:57 +01002918int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv)
Daniel Vetter4df2faf2010-02-19 11:52:00 +01002919{
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00002920 struct intel_engine_cs *engine;
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002921 int ret;
Daniel Vetter4df2faf2010-02-19 11:52:00 +01002922
Chris Wilson91c8a322016-07-05 10:40:23 +01002923 lockdep_assert_held(&dev_priv->drm.struct_mutex);
Chris Wilson6e5a5be2016-06-24 14:55:57 +01002924
Dave Gordonb4ac5af2016-03-24 11:20:38 +00002925 for_each_engine(engine, dev_priv) {
Chris Wilson62e63002016-06-24 14:55:52 +01002926 if (engine->last_context == NULL)
2927 continue;
2928
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00002929 ret = intel_engine_idle(engine);
Chris Wilson1ec14ad2010-12-04 11:30:53 +00002930 if (ret)
2931 return ret;
2932 }
Zou Nan haid1b851f2010-05-21 09:08:57 +08002933
Daniel Vetter8a1a49f2010-02-11 22:29:04 +01002934 return 0;
Daniel Vetter4df2faf2010-02-19 11:52:00 +01002935}
2936
Chris Wilson4144f9b2014-09-11 08:43:48 +01002937static bool i915_gem_valid_gtt_space(struct i915_vma *vma,
Chris Wilson42d6ab42012-07-26 11:49:32 +01002938 unsigned long cache_level)
2939{
Chris Wilson4144f9b2014-09-11 08:43:48 +01002940 struct drm_mm_node *gtt_space = &vma->node;
Chris Wilson42d6ab42012-07-26 11:49:32 +01002941 struct drm_mm_node *other;
2942
Chris Wilson4144f9b2014-09-11 08:43:48 +01002943 /*
2944 * On some machines we have to be careful when putting differing types
2945 * of snoopable memory together to avoid the prefetcher crossing memory
2946 * domains and dying. During vm initialisation, we decide whether or not
2947 * these constraints apply and set the drm_mm.color_adjust
2948 * appropriately.
Chris Wilson42d6ab42012-07-26 11:49:32 +01002949 */
Chris Wilson4144f9b2014-09-11 08:43:48 +01002950 if (vma->vm->mm.color_adjust == NULL)
Chris Wilson42d6ab42012-07-26 11:49:32 +01002951 return true;
2952
Ben Widawskyc6cfb322013-07-05 14:41:06 -07002953 if (!drm_mm_node_allocated(gtt_space))
Chris Wilson42d6ab42012-07-26 11:49:32 +01002954 return true;
2955
2956 if (list_empty(&gtt_space->node_list))
2957 return true;
2958
2959 other = list_entry(gtt_space->node_list.prev, struct drm_mm_node, node_list);
2960 if (other->allocated && !other->hole_follows && other->color != cache_level)
2961 return false;
2962
2963 other = list_entry(gtt_space->node_list.next, struct drm_mm_node, node_list);
2964 if (other->allocated && !gtt_space->hole_follows && other->color != cache_level)
2965 return false;
2966
2967 return true;
2968}
2969
Jesse Barnesde151cf2008-11-12 10:03:55 -08002970/**
Chris Wilson59bfa122016-08-04 16:32:31 +01002971 * i915_vma_insert - finds a slot for the vma in its address space
2972 * @vma: the vma
Chris Wilson91b2db62016-08-04 16:32:23 +01002973 * @size: requested size in bytes (can be larger than the VMA)
Chris Wilson59bfa122016-08-04 16:32:31 +01002974 * @alignment: required alignment
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01002975 * @flags: mask of PIN_* flags to use
Chris Wilson59bfa122016-08-04 16:32:31 +01002976 *
2977 * First we try to allocate some free space that meets the requirements for
2978 * the VMA. Failiing that, if the flags permit, it will evict an old VMA,
2979 * preferrably the oldest idle entry to make room for the new VMA.
2980 *
2981 * Returns:
2982 * 0 on success, negative error code otherwise.
Eric Anholt673a3942008-07-30 12:06:12 -07002983 */
Chris Wilson59bfa122016-08-04 16:32:31 +01002984static int
2985i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
Eric Anholt673a3942008-07-30 12:06:12 -07002986{
Chris Wilson59bfa122016-08-04 16:32:31 +01002987 struct drm_i915_private *dev_priv = to_i915(vma->vm->dev);
2988 struct drm_i915_gem_object *obj = vma->obj;
Chris Wilsonde180032016-08-04 16:32:29 +01002989 u64 start, end;
2990 u64 min_alignment;
Chris Wilson07f73f62009-09-14 16:50:30 +01002991 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07002992
Chris Wilson3272db52016-08-04 16:32:32 +01002993 GEM_BUG_ON(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND));
Chris Wilson59bfa122016-08-04 16:32:31 +01002994 GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02002995
Chris Wilsonde180032016-08-04 16:32:29 +01002996 size = max(size, vma->size);
2997 if (flags & PIN_MAPPABLE)
2998 size = i915_gem_get_ggtt_size(dev_priv, size, obj->tiling_mode);
Joonas Lahtinen91e67112015-05-06 14:33:58 +03002999
Chris Wilsonde180032016-08-04 16:32:29 +01003000 min_alignment =
3001 i915_gem_get_ggtt_alignment(dev_priv, size, obj->tiling_mode,
3002 flags & PIN_MAPPABLE);
3003 if (alignment == 0)
3004 alignment = min_alignment;
3005 if (alignment & (min_alignment - 1)) {
3006 DRM_DEBUG("Invalid object alignment requested %llu, minimum %llu\n",
3007 alignment, min_alignment);
Chris Wilson59bfa122016-08-04 16:32:31 +01003008 return -EINVAL;
Joonas Lahtinen91e67112015-05-06 14:33:58 +03003009 }
Chris Wilsona00b10c2010-09-24 21:15:47 +01003010
Michel Thierry101b5062015-10-01 13:33:57 +01003011 start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0;
Chris Wilsonde180032016-08-04 16:32:29 +01003012
3013 end = vma->vm->total;
Michel Thierry101b5062015-10-01 13:33:57 +01003014 if (flags & PIN_MAPPABLE)
Chris Wilson91b2db62016-08-04 16:32:23 +01003015 end = min_t(u64, end, dev_priv->ggtt.mappable_end);
Michel Thierry101b5062015-10-01 13:33:57 +01003016 if (flags & PIN_ZONE_4G)
Michel Thierry48ea1e32016-01-11 11:39:27 +00003017 end = min_t(u64, end, (1ULL << 32) - PAGE_SIZE);
Michel Thierry101b5062015-10-01 13:33:57 +01003018
Joonas Lahtinen91e67112015-05-06 14:33:58 +03003019 /* If binding the object/GGTT view requires more space than the entire
3020 * aperture has, reject it early before evicting everything in a vain
3021 * attempt to find space.
Chris Wilson654fc602010-05-27 13:18:21 +01003022 */
Joonas Lahtinen91e67112015-05-06 14:33:58 +03003023 if (size > end) {
Chris Wilsonde180032016-08-04 16:32:29 +01003024 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 +01003025 size, obj->base.size,
Daniel Vetter1ec9e262014-02-14 14:01:11 +01003026 flags & PIN_MAPPABLE ? "mappable" : "total",
Chris Wilsond23db882014-05-23 08:48:08 +02003027 end);
Chris Wilson59bfa122016-08-04 16:32:31 +01003028 return -E2BIG;
Chris Wilson654fc602010-05-27 13:18:21 +01003029 }
3030
Chris Wilson37e680a2012-06-07 15:38:42 +01003031 ret = i915_gem_object_get_pages(obj);
Chris Wilson6c085a72012-08-20 11:40:46 +02003032 if (ret)
Chris Wilson59bfa122016-08-04 16:32:31 +01003033 return ret;
Chris Wilson6c085a72012-08-20 11:40:46 +02003034
Chris Wilsonfbdda6f2012-11-20 10:45:16 +00003035 i915_gem_object_pin_pages(obj);
3036
Chris Wilson506a8e82015-12-08 11:55:07 +00003037 if (flags & PIN_OFFSET_FIXED) {
Chris Wilson59bfa122016-08-04 16:32:31 +01003038 u64 offset = flags & PIN_OFFSET_MASK;
Chris Wilsonde180032016-08-04 16:32:29 +01003039 if (offset & (alignment - 1) || offset > end - size) {
Chris Wilson506a8e82015-12-08 11:55:07 +00003040 ret = -EINVAL;
Chris Wilsonde180032016-08-04 16:32:29 +01003041 goto err_unpin;
Chris Wilson506a8e82015-12-08 11:55:07 +00003042 }
Chris Wilsonde180032016-08-04 16:32:29 +01003043
Chris Wilson506a8e82015-12-08 11:55:07 +00003044 vma->node.start = offset;
3045 vma->node.size = size;
3046 vma->node.color = obj->cache_level;
Chris Wilsonde180032016-08-04 16:32:29 +01003047 ret = drm_mm_reserve_node(&vma->vm->mm, &vma->node);
Chris Wilson506a8e82015-12-08 11:55:07 +00003048 if (ret) {
3049 ret = i915_gem_evict_for_vma(vma);
3050 if (ret == 0)
Chris Wilsonde180032016-08-04 16:32:29 +01003051 ret = drm_mm_reserve_node(&vma->vm->mm, &vma->node);
3052 if (ret)
3053 goto err_unpin;
Chris Wilson506a8e82015-12-08 11:55:07 +00003054 }
Michel Thierry101b5062015-10-01 13:33:57 +01003055 } else {
Chris Wilsonde180032016-08-04 16:32:29 +01003056 u32 search_flag, alloc_flag;
3057
Chris Wilson506a8e82015-12-08 11:55:07 +00003058 if (flags & PIN_HIGH) {
3059 search_flag = DRM_MM_SEARCH_BELOW;
3060 alloc_flag = DRM_MM_CREATE_TOP;
3061 } else {
3062 search_flag = DRM_MM_SEARCH_DEFAULT;
3063 alloc_flag = DRM_MM_CREATE_DEFAULT;
3064 }
Michel Thierry101b5062015-10-01 13:33:57 +01003065
Chris Wilson954c4692016-08-04 16:32:26 +01003066 /* We only allocate in PAGE_SIZE/GTT_PAGE_SIZE (4096) chunks,
3067 * so we know that we always have a minimum alignment of 4096.
3068 * The drm_mm range manager is optimised to return results
3069 * with zero alignment, so where possible use the optimal
3070 * path.
3071 */
3072 if (alignment <= 4096)
3073 alignment = 0;
3074
Ben Widawsky0a9ae0d2013-05-25 12:26:35 -07003075search_free:
Chris Wilsonde180032016-08-04 16:32:29 +01003076 ret = drm_mm_insert_node_in_range_generic(&vma->vm->mm,
3077 &vma->node,
Chris Wilson506a8e82015-12-08 11:55:07 +00003078 size, alignment,
3079 obj->cache_level,
3080 start, end,
3081 search_flag,
3082 alloc_flag);
3083 if (ret) {
Chris Wilsonde180032016-08-04 16:32:29 +01003084 ret = i915_gem_evict_something(vma->vm, size, alignment,
Chris Wilson506a8e82015-12-08 11:55:07 +00003085 obj->cache_level,
3086 start, end,
3087 flags);
3088 if (ret == 0)
3089 goto search_free;
Chris Wilson97311292009-09-21 00:22:34 +01003090
Chris Wilsonde180032016-08-04 16:32:29 +01003091 goto err_unpin;
Chris Wilson506a8e82015-12-08 11:55:07 +00003092 }
Chris Wilsondc9dd7a2012-12-07 20:37:07 +00003093 }
Chris Wilson37508582016-08-04 16:32:24 +01003094 GEM_BUG_ON(!i915_gem_valid_gtt_space(vma, obj->cache_level));
Eric Anholt673a3942008-07-30 12:06:12 -07003095
Ben Widawsky35c20a62013-05-31 11:28:48 -07003096 list_move_tail(&obj->global_list, &dev_priv->mm.bound_list);
Chris Wilsonde180032016-08-04 16:32:29 +01003097 list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
Chris Wilson15717de2016-08-04 07:52:26 +01003098 obj->bind_count++;
Chris Wilsonbf1a1092010-08-07 11:01:20 +01003099
Chris Wilson59bfa122016-08-04 16:32:31 +01003100 return 0;
Ben Widawsky2f633152013-07-17 12:19:03 -07003101
Daniel Vetterbc6bc152013-07-22 12:12:38 +02003102err_unpin:
Ben Widawsky2f633152013-07-17 12:19:03 -07003103 i915_gem_object_unpin_pages(obj);
Chris Wilson59bfa122016-08-04 16:32:31 +01003104 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003105}
3106
Chris Wilson000433b2013-08-08 14:41:09 +01003107bool
Chris Wilson2c225692013-08-09 12:26:45 +01003108i915_gem_clflush_object(struct drm_i915_gem_object *obj,
3109 bool force)
Eric Anholt673a3942008-07-30 12:06:12 -07003110{
Eric Anholt673a3942008-07-30 12:06:12 -07003111 /* If we don't have a page list set up, then we're not pinned
3112 * to GPU, and we can ignore the cache flush because it'll happen
3113 * again at bind time.
3114 */
Chris Wilson05394f32010-11-08 19:18:58 +00003115 if (obj->pages == NULL)
Chris Wilson000433b2013-08-08 14:41:09 +01003116 return false;
Eric Anholt673a3942008-07-30 12:06:12 -07003117
Imre Deak769ce462013-02-13 21:56:05 +02003118 /*
3119 * Stolen memory is always coherent with the GPU as it is explicitly
3120 * marked as wc by the system, or the system is cache-coherent.
3121 */
Chris Wilson6a2c4232014-11-04 04:51:40 -08003122 if (obj->stolen || obj->phys_handle)
Chris Wilson000433b2013-08-08 14:41:09 +01003123 return false;
Imre Deak769ce462013-02-13 21:56:05 +02003124
Chris Wilson9c23f7f2011-03-29 16:59:52 -07003125 /* If the GPU is snooping the contents of the CPU cache,
3126 * we do not need to manually clear the CPU cache lines. However,
3127 * the caches are only snooped when the render cache is
3128 * flushed/invalidated. As we always have to emit invalidations
3129 * and flushes when moving into and out of the RENDER domain, correct
3130 * snooping behaviour occurs naturally as the result of our domain
3131 * tracking.
3132 */
Chris Wilson0f719792015-01-13 13:32:52 +00003133 if (!force && cpu_cache_is_coherent(obj->base.dev, obj->cache_level)) {
3134 obj->cache_dirty = true;
Chris Wilson000433b2013-08-08 14:41:09 +01003135 return false;
Chris Wilson0f719792015-01-13 13:32:52 +00003136 }
Chris Wilson9c23f7f2011-03-29 16:59:52 -07003137
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003138 trace_i915_gem_object_clflush(obj);
Chris Wilson9da3da62012-06-01 15:20:22 +01003139 drm_clflush_sg(obj->pages);
Chris Wilson0f719792015-01-13 13:32:52 +00003140 obj->cache_dirty = false;
Chris Wilson000433b2013-08-08 14:41:09 +01003141
3142 return true;
Eric Anholte47c68e2008-11-14 13:35:19 -08003143}
3144
3145/** Flushes the GTT write domain for the object if it's dirty. */
3146static void
Chris Wilson05394f32010-11-08 19:18:58 +00003147i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
Eric Anholte47c68e2008-11-14 13:35:19 -08003148{
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003149 uint32_t old_write_domain;
3150
Chris Wilson05394f32010-11-08 19:18:58 +00003151 if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
Eric Anholte47c68e2008-11-14 13:35:19 -08003152 return;
3153
Chris Wilson63256ec2011-01-04 18:42:07 +00003154 /* No actual flushing is required for the GTT write domain. Writes
Eric Anholte47c68e2008-11-14 13:35:19 -08003155 * to it immediately go to main memory as far as we know, so there's
3156 * no chipset flush. It also doesn't land in render cache.
Chris Wilson63256ec2011-01-04 18:42:07 +00003157 *
3158 * However, we do have to enforce the order so that all writes through
3159 * the GTT land before any writes to the device, such as updates to
3160 * the GATT itself.
Eric Anholte47c68e2008-11-14 13:35:19 -08003161 */
Chris Wilson63256ec2011-01-04 18:42:07 +00003162 wmb();
3163
Chris Wilson05394f32010-11-08 19:18:58 +00003164 old_write_domain = obj->base.write_domain;
3165 obj->base.write_domain = 0;
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003166
Rodrigo Vivide152b62015-07-07 16:28:51 -07003167 intel_fb_obj_flush(obj, false, ORIGIN_GTT);
Daniel Vetterf99d7062014-06-19 16:01:59 +02003168
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003169 trace_i915_gem_object_change_domain(obj,
Chris Wilson05394f32010-11-08 19:18:58 +00003170 obj->base.read_domains,
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003171 old_write_domain);
Eric Anholte47c68e2008-11-14 13:35:19 -08003172}
3173
3174/** Flushes the CPU write domain for the object if it's dirty. */
3175static void
Daniel Vettere62b59e2015-01-21 14:53:48 +01003176i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
Eric Anholte47c68e2008-11-14 13:35:19 -08003177{
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003178 uint32_t old_write_domain;
Eric Anholte47c68e2008-11-14 13:35:19 -08003179
Chris Wilson05394f32010-11-08 19:18:58 +00003180 if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
Eric Anholte47c68e2008-11-14 13:35:19 -08003181 return;
3182
Daniel Vettere62b59e2015-01-21 14:53:48 +01003183 if (i915_gem_clflush_object(obj, obj->pin_display))
Chris Wilsonc0336662016-05-06 15:40:21 +01003184 i915_gem_chipset_flush(to_i915(obj->base.dev));
Chris Wilson000433b2013-08-08 14:41:09 +01003185
Chris Wilson05394f32010-11-08 19:18:58 +00003186 old_write_domain = obj->base.write_domain;
3187 obj->base.write_domain = 0;
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003188
Rodrigo Vivide152b62015-07-07 16:28:51 -07003189 intel_fb_obj_flush(obj, false, ORIGIN_CPU);
Daniel Vetterf99d7062014-06-19 16:01:59 +02003190
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003191 trace_i915_gem_object_change_domain(obj,
Chris Wilson05394f32010-11-08 19:18:58 +00003192 obj->base.read_domains,
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003193 old_write_domain);
Eric Anholte47c68e2008-11-14 13:35:19 -08003194}
3195
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003196/**
3197 * Moves a single object to the GTT read, and possibly write domain.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003198 * @obj: object to act on
3199 * @write: ask for write access or read only
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003200 *
3201 * This function returns when the move is complete, including waiting on
3202 * flushes to occur.
3203 */
Jesse Barnes79e53942008-11-07 14:24:08 -08003204int
Chris Wilson20217462010-11-23 15:26:33 +00003205i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003206{
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003207 uint32_t old_write_domain, old_read_domains;
Chris Wilson43566de2015-01-02 16:29:29 +05303208 struct i915_vma *vma;
Eric Anholte47c68e2008-11-14 13:35:19 -08003209 int ret;
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003210
Chris Wilson0201f1e2012-07-20 12:41:01 +01003211 ret = i915_gem_object_wait_rendering(obj, !write);
Chris Wilson88241782011-01-07 17:09:48 +00003212 if (ret)
3213 return ret;
3214
Chris Wilsonc13d87e2016-07-20 09:21:15 +01003215 if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
3216 return 0;
3217
Chris Wilson43566de2015-01-02 16:29:29 +05303218 /* Flush and acquire obj->pages so that we are coherent through
3219 * direct access in memory with previous cached writes through
3220 * shmemfs and that our cache domain tracking remains valid.
3221 * For example, if the obj->filp was moved to swap without us
3222 * being notified and releasing the pages, we would mistakenly
3223 * continue to assume that the obj remained out of the CPU cached
3224 * domain.
3225 */
3226 ret = i915_gem_object_get_pages(obj);
3227 if (ret)
3228 return ret;
3229
Daniel Vettere62b59e2015-01-21 14:53:48 +01003230 i915_gem_object_flush_cpu_write_domain(obj);
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003231
Chris Wilsond0a57782012-10-09 19:24:37 +01003232 /* Serialise direct access to this object with the barriers for
3233 * coherent writes from the GPU, by effectively invalidating the
3234 * GTT domain upon first access.
3235 */
3236 if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
3237 mb();
3238
Chris Wilson05394f32010-11-08 19:18:58 +00003239 old_write_domain = obj->base.write_domain;
3240 old_read_domains = obj->base.read_domains;
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003241
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003242 /* It should now be out of any other write domains, and we can update
3243 * the domain values for our changes.
3244 */
Chris Wilson05394f32010-11-08 19:18:58 +00003245 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
3246 obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
Eric Anholte47c68e2008-11-14 13:35:19 -08003247 if (write) {
Chris Wilson05394f32010-11-08 19:18:58 +00003248 obj->base.read_domains = I915_GEM_DOMAIN_GTT;
3249 obj->base.write_domain = I915_GEM_DOMAIN_GTT;
3250 obj->dirty = 1;
Eric Anholte47c68e2008-11-14 13:35:19 -08003251 }
3252
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003253 trace_i915_gem_object_change_domain(obj,
3254 old_read_domains,
3255 old_write_domain);
3256
Chris Wilson8325a092012-04-24 15:52:35 +01003257 /* And bump the LRU for this access */
Chris Wilson43566de2015-01-02 16:29:29 +05303258 vma = i915_gem_obj_to_ggtt(obj);
Chris Wilsonb0decaf2016-08-04 07:52:44 +01003259 if (vma &&
3260 drm_mm_node_allocated(&vma->node) &&
3261 !i915_vma_is_active(vma))
3262 list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
Chris Wilson8325a092012-04-24 15:52:35 +01003263
Eric Anholte47c68e2008-11-14 13:35:19 -08003264 return 0;
3265}
3266
Chris Wilsonef55f922015-10-09 14:11:27 +01003267/**
3268 * Changes the cache-level of an object across all VMA.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003269 * @obj: object to act on
3270 * @cache_level: new cache level to set for the object
Chris Wilsonef55f922015-10-09 14:11:27 +01003271 *
3272 * After this function returns, the object will be in the new cache-level
3273 * across all GTT and the contents of the backing storage will be coherent,
3274 * with respect to the new cache-level. In order to keep the backing storage
3275 * coherent for all users, we only allow a single cache level to be set
3276 * globally on the object and prevent it from being changed whilst the
3277 * hardware is reading from the object. That is if the object is currently
3278 * on the scanout it will be set to uncached (or equivalent display
3279 * cache coherency) and all non-MOCS GPU access will also be uncached so
3280 * that all direct access to the scanout remains coherent.
3281 */
Chris Wilsone4ffd172011-04-04 09:44:39 +01003282int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
3283 enum i915_cache_level cache_level)
3284{
Chris Wilsonaa653a62016-08-04 07:52:27 +01003285 struct i915_vma *vma;
Ville Syrjäläed75a552015-08-11 19:47:10 +03003286 int ret = 0;
Chris Wilsone4ffd172011-04-04 09:44:39 +01003287
3288 if (obj->cache_level == cache_level)
Ville Syrjäläed75a552015-08-11 19:47:10 +03003289 goto out;
Chris Wilsone4ffd172011-04-04 09:44:39 +01003290
Chris Wilsonef55f922015-10-09 14:11:27 +01003291 /* Inspect the list of currently bound VMA and unbind any that would
3292 * be invalid given the new cache-level. This is principally to
3293 * catch the issue of the CS prefetch crossing page boundaries and
3294 * reading an invalid PTE on older architectures.
3295 */
Chris Wilsonaa653a62016-08-04 07:52:27 +01003296restart:
3297 list_for_each_entry(vma, &obj->vma_list, obj_link) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003298 if (!drm_mm_node_allocated(&vma->node))
3299 continue;
3300
Chris Wilson20dfbde2016-08-04 16:32:30 +01003301 if (i915_vma_is_pinned(vma)) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003302 DRM_DEBUG("can not change the cache level of pinned objects\n");
3303 return -EBUSY;
3304 }
3305
Chris Wilsonaa653a62016-08-04 07:52:27 +01003306 if (i915_gem_valid_gtt_space(vma, cache_level))
3307 continue;
3308
3309 ret = i915_vma_unbind(vma);
3310 if (ret)
3311 return ret;
3312
3313 /* As unbinding may affect other elements in the
3314 * obj->vma_list (due to side-effects from retiring
3315 * an active vma), play safe and restart the iterator.
3316 */
3317 goto restart;
Chris Wilson42d6ab42012-07-26 11:49:32 +01003318 }
3319
Chris Wilsonef55f922015-10-09 14:11:27 +01003320 /* We can reuse the existing drm_mm nodes but need to change the
3321 * cache-level on the PTE. We could simply unbind them all and
3322 * rebind with the correct cache-level on next use. However since
3323 * we already have a valid slot, dma mapping, pages etc, we may as
3324 * rewrite the PTE in the belief that doing so tramples upon less
3325 * state and so involves less work.
3326 */
Chris Wilson15717de2016-08-04 07:52:26 +01003327 if (obj->bind_count) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003328 /* Before we change the PTE, the GPU must not be accessing it.
3329 * If we wait upon the object, we know that all the bound
3330 * VMA are no longer active.
3331 */
Chris Wilson2e2f3512015-04-27 13:41:14 +01003332 ret = i915_gem_object_wait_rendering(obj, false);
Chris Wilsone4ffd172011-04-04 09:44:39 +01003333 if (ret)
3334 return ret;
3335
Chris Wilsonaa653a62016-08-04 07:52:27 +01003336 if (!HAS_LLC(obj->base.dev) && cache_level != I915_CACHE_NONE) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003337 /* Access to snoopable pages through the GTT is
3338 * incoherent and on some machines causes a hard
3339 * lockup. Relinquish the CPU mmaping to force
3340 * userspace to refault in the pages and we can
3341 * then double check if the GTT mapping is still
3342 * valid for that pointer access.
3343 */
3344 i915_gem_release_mmap(obj);
Chris Wilsone4ffd172011-04-04 09:44:39 +01003345
Chris Wilsonef55f922015-10-09 14:11:27 +01003346 /* As we no longer need a fence for GTT access,
3347 * we can relinquish it now (and so prevent having
3348 * to steal a fence from someone else on the next
3349 * fence request). Note GPU activity would have
3350 * dropped the fence as all snoopable access is
3351 * supposed to be linear.
3352 */
Chris Wilsone4ffd172011-04-04 09:44:39 +01003353 ret = i915_gem_object_put_fence(obj);
3354 if (ret)
3355 return ret;
Chris Wilsonef55f922015-10-09 14:11:27 +01003356 } else {
3357 /* We either have incoherent backing store and
3358 * so no GTT access or the architecture is fully
3359 * coherent. In such cases, existing GTT mmaps
3360 * ignore the cache bit in the PTE and we can
3361 * rewrite it without confusing the GPU or having
3362 * to force userspace to fault back in its mmaps.
3363 */
Chris Wilsone4ffd172011-04-04 09:44:39 +01003364 }
3365
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00003366 list_for_each_entry(vma, &obj->vma_list, obj_link) {
Chris Wilsonef55f922015-10-09 14:11:27 +01003367 if (!drm_mm_node_allocated(&vma->node))
3368 continue;
3369
3370 ret = i915_vma_bind(vma, cache_level, PIN_UPDATE);
3371 if (ret)
3372 return ret;
3373 }
Chris Wilsone4ffd172011-04-04 09:44:39 +01003374 }
3375
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00003376 list_for_each_entry(vma, &obj->vma_list, obj_link)
Chris Wilson2c225692013-08-09 12:26:45 +01003377 vma->node.color = cache_level;
3378 obj->cache_level = cache_level;
3379
Ville Syrjäläed75a552015-08-11 19:47:10 +03003380out:
Chris Wilsonef55f922015-10-09 14:11:27 +01003381 /* Flush the dirty CPU caches to the backing storage so that the
3382 * object is now coherent at its new cache level (with respect
3383 * to the access domain).
3384 */
Ankitprasad Sharmab50a5372016-06-10 14:23:03 +05303385 if (obj->cache_dirty && cpu_write_needs_clflush(obj)) {
Chris Wilson0f719792015-01-13 13:32:52 +00003386 if (i915_gem_clflush_object(obj, true))
Chris Wilsonc0336662016-05-06 15:40:21 +01003387 i915_gem_chipset_flush(to_i915(obj->base.dev));
Chris Wilsone4ffd172011-04-04 09:44:39 +01003388 }
3389
Chris Wilsone4ffd172011-04-04 09:44:39 +01003390 return 0;
3391}
3392
Ben Widawsky199adf42012-09-21 17:01:20 -07003393int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data,
3394 struct drm_file *file)
Chris Wilsone6994ae2012-07-10 10:27:08 +01003395{
Ben Widawsky199adf42012-09-21 17:01:20 -07003396 struct drm_i915_gem_caching *args = data;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003397 struct drm_i915_gem_object *obj;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003398
Chris Wilson03ac0642016-07-20 13:31:51 +01003399 obj = i915_gem_object_lookup(file, args->handle);
3400 if (!obj)
Chris Wilson432be692015-05-07 12:14:55 +01003401 return -ENOENT;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003402
Chris Wilson651d7942013-08-08 14:41:10 +01003403 switch (obj->cache_level) {
3404 case I915_CACHE_LLC:
3405 case I915_CACHE_L3_LLC:
3406 args->caching = I915_CACHING_CACHED;
3407 break;
3408
Chris Wilson4257d3b2013-08-08 14:41:11 +01003409 case I915_CACHE_WT:
3410 args->caching = I915_CACHING_DISPLAY;
3411 break;
3412
Chris Wilson651d7942013-08-08 14:41:10 +01003413 default:
3414 args->caching = I915_CACHING_NONE;
3415 break;
3416 }
Chris Wilsone6994ae2012-07-10 10:27:08 +01003417
Chris Wilson34911fd2016-07-20 13:31:54 +01003418 i915_gem_object_put_unlocked(obj);
Chris Wilson432be692015-05-07 12:14:55 +01003419 return 0;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003420}
3421
Ben Widawsky199adf42012-09-21 17:01:20 -07003422int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
3423 struct drm_file *file)
Chris Wilsone6994ae2012-07-10 10:27:08 +01003424{
Chris Wilsonfac5e232016-07-04 11:34:36 +01003425 struct drm_i915_private *dev_priv = to_i915(dev);
Ben Widawsky199adf42012-09-21 17:01:20 -07003426 struct drm_i915_gem_caching *args = data;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003427 struct drm_i915_gem_object *obj;
3428 enum i915_cache_level level;
3429 int ret;
3430
Ben Widawsky199adf42012-09-21 17:01:20 -07003431 switch (args->caching) {
3432 case I915_CACHING_NONE:
Chris Wilsone6994ae2012-07-10 10:27:08 +01003433 level = I915_CACHE_NONE;
3434 break;
Ben Widawsky199adf42012-09-21 17:01:20 -07003435 case I915_CACHING_CACHED:
Imre Deake5756c12015-08-14 18:43:30 +03003436 /*
3437 * Due to a HW issue on BXT A stepping, GPU stores via a
3438 * snooped mapping may leave stale data in a corresponding CPU
3439 * cacheline, whereas normally such cachelines would get
3440 * invalidated.
3441 */
Tvrtko Ursulinca377802016-03-02 12:10:31 +00003442 if (!HAS_LLC(dev) && !HAS_SNOOP(dev))
Imre Deake5756c12015-08-14 18:43:30 +03003443 return -ENODEV;
3444
Chris Wilsone6994ae2012-07-10 10:27:08 +01003445 level = I915_CACHE_LLC;
3446 break;
Chris Wilson4257d3b2013-08-08 14:41:11 +01003447 case I915_CACHING_DISPLAY:
3448 level = HAS_WT(dev) ? I915_CACHE_WT : I915_CACHE_NONE;
3449 break;
Chris Wilsone6994ae2012-07-10 10:27:08 +01003450 default:
3451 return -EINVAL;
3452 }
3453
Imre Deakfd0fe6a2015-11-04 21:25:32 +02003454 intel_runtime_pm_get(dev_priv);
3455
Ben Widawsky3bc29132012-09-26 16:15:20 -07003456 ret = i915_mutex_lock_interruptible(dev);
3457 if (ret)
Imre Deakfd0fe6a2015-11-04 21:25:32 +02003458 goto rpm_put;
Ben Widawsky3bc29132012-09-26 16:15:20 -07003459
Chris Wilson03ac0642016-07-20 13:31:51 +01003460 obj = i915_gem_object_lookup(file, args->handle);
3461 if (!obj) {
Chris Wilsone6994ae2012-07-10 10:27:08 +01003462 ret = -ENOENT;
3463 goto unlock;
3464 }
3465
3466 ret = i915_gem_object_set_cache_level(obj, level);
3467
Chris Wilsonf8c417c2016-07-20 13:31:53 +01003468 i915_gem_object_put(obj);
Chris Wilsone6994ae2012-07-10 10:27:08 +01003469unlock:
3470 mutex_unlock(&dev->struct_mutex);
Imre Deakfd0fe6a2015-11-04 21:25:32 +02003471rpm_put:
3472 intel_runtime_pm_put(dev_priv);
3473
Chris Wilsone6994ae2012-07-10 10:27:08 +01003474 return ret;
3475}
3476
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003477/*
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003478 * Prepare buffer for display plane (scanout, cursors, etc).
3479 * Can be called from an uninterruptible phase (modesetting) and allows
3480 * any flushes to be pipelined (for pageflips).
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003481 */
3482int
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003483i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
3484 u32 alignment,
Tvrtko Ursuline6617332015-03-23 11:10:33 +00003485 const struct i915_ggtt_view *view)
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003486{
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003487 u32 old_read_domains, old_write_domain;
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003488 int ret;
3489
Chris Wilsoncc98b412013-08-09 12:25:09 +01003490 /* Mark the pin_display early so that we account for the
3491 * display coherency whilst setting up the cache domains.
3492 */
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003493 obj->pin_display++;
Chris Wilsoncc98b412013-08-09 12:25:09 +01003494
Eric Anholta7ef0642011-03-29 16:59:54 -07003495 /* The display engine is not coherent with the LLC cache on gen6. As
3496 * a result, we make sure that the pinning that is about to occur is
3497 * done with uncached PTEs. This is lowest common denominator for all
3498 * chipsets.
3499 *
3500 * However for gen6+, we could do better by using the GFDT bit instead
3501 * of uncaching, which would allow us to flush all the LLC-cached data
3502 * with that bit in the PTE to main memory with just one PIPE_CONTROL.
3503 */
Chris Wilson651d7942013-08-08 14:41:10 +01003504 ret = i915_gem_object_set_cache_level(obj,
3505 HAS_WT(obj->base.dev) ? I915_CACHE_WT : I915_CACHE_NONE);
Eric Anholta7ef0642011-03-29 16:59:54 -07003506 if (ret)
Chris Wilsoncc98b412013-08-09 12:25:09 +01003507 goto err_unpin_display;
Eric Anholta7ef0642011-03-29 16:59:54 -07003508
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003509 /* As the user may map the buffer once pinned in the display plane
3510 * (e.g. libkms for the bootup splash), we have to ensure that we
3511 * always use map_and_fenceable for all scanout buffers.
3512 */
Chris Wilson91b2db62016-08-04 16:32:23 +01003513 ret = i915_gem_object_ggtt_pin(obj, view, 0, alignment,
Tvrtko Ursulin50470bb2015-03-23 11:10:36 +00003514 view->type == I915_GGTT_VIEW_NORMAL ?
3515 PIN_MAPPABLE : 0);
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003516 if (ret)
Chris Wilsoncc98b412013-08-09 12:25:09 +01003517 goto err_unpin_display;
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003518
Daniel Vettere62b59e2015-01-21 14:53:48 +01003519 i915_gem_object_flush_cpu_write_domain(obj);
Chris Wilsonb118c1e2010-05-27 13:18:14 +01003520
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003521 old_write_domain = obj->base.write_domain;
Chris Wilson05394f32010-11-08 19:18:58 +00003522 old_read_domains = obj->base.read_domains;
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003523
3524 /* It should now be out of any other write domains, and we can update
3525 * the domain values for our changes.
3526 */
Chris Wilsone5f1d962012-07-20 12:41:00 +01003527 obj->base.write_domain = 0;
Chris Wilson05394f32010-11-08 19:18:58 +00003528 obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003529
3530 trace_i915_gem_object_change_domain(obj,
3531 old_read_domains,
Chris Wilson2da3b9b2011-04-14 09:41:17 +01003532 old_write_domain);
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003533
3534 return 0;
Chris Wilsoncc98b412013-08-09 12:25:09 +01003535
3536err_unpin_display:
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003537 obj->pin_display--;
Chris Wilsoncc98b412013-08-09 12:25:09 +01003538 return ret;
3539}
3540
3541void
Tvrtko Ursuline6617332015-03-23 11:10:33 +00003542i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj,
3543 const struct i915_ggtt_view *view)
Chris Wilsoncc98b412013-08-09 12:25:09 +01003544{
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003545 if (WARN_ON(obj->pin_display == 0))
3546 return;
3547
Tvrtko Ursuline6617332015-03-23 11:10:33 +00003548 i915_gem_object_ggtt_unpin_view(obj, view);
3549
Tvrtko Ursulin8a0c39b2015-04-13 11:50:09 +01003550 obj->pin_display--;
Zhenyu Wangb9241ea2009-11-25 13:09:39 +08003551}
3552
Eric Anholte47c68e2008-11-14 13:35:19 -08003553/**
3554 * Moves a single object to the CPU read, and possibly write domain.
Tvrtko Ursulin14bb2c12016-06-03 14:02:17 +01003555 * @obj: object to act on
3556 * @write: requesting write or read-only access
Eric Anholte47c68e2008-11-14 13:35:19 -08003557 *
3558 * This function returns when the move is complete, including waiting on
3559 * flushes to occur.
3560 */
Chris Wilsondabdfe02012-03-26 10:10:27 +02003561int
Chris Wilson919926a2010-11-12 13:42:53 +00003562i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
Eric Anholte47c68e2008-11-14 13:35:19 -08003563{
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003564 uint32_t old_write_domain, old_read_domains;
Eric Anholte47c68e2008-11-14 13:35:19 -08003565 int ret;
3566
Chris Wilson0201f1e2012-07-20 12:41:01 +01003567 ret = i915_gem_object_wait_rendering(obj, !write);
Chris Wilson88241782011-01-07 17:09:48 +00003568 if (ret)
3569 return ret;
3570
Chris Wilsonc13d87e2016-07-20 09:21:15 +01003571 if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
3572 return 0;
3573
Eric Anholte47c68e2008-11-14 13:35:19 -08003574 i915_gem_object_flush_gtt_write_domain(obj);
3575
Chris Wilson05394f32010-11-08 19:18:58 +00003576 old_write_domain = obj->base.write_domain;
3577 old_read_domains = obj->base.read_domains;
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003578
Eric Anholte47c68e2008-11-14 13:35:19 -08003579 /* Flush the CPU cache if it's still invalid. */
Chris Wilson05394f32010-11-08 19:18:58 +00003580 if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
Chris Wilson2c225692013-08-09 12:26:45 +01003581 i915_gem_clflush_object(obj, false);
Eric Anholte47c68e2008-11-14 13:35:19 -08003582
Chris Wilson05394f32010-11-08 19:18:58 +00003583 obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
Eric Anholte47c68e2008-11-14 13:35:19 -08003584 }
3585
3586 /* It should now be out of any other write domains, and we can update
3587 * the domain values for our changes.
3588 */
Chris Wilson05394f32010-11-08 19:18:58 +00003589 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) != 0);
Eric Anholte47c68e2008-11-14 13:35:19 -08003590
3591 /* If we're writing through the CPU, then the GPU read domains will
3592 * need to be invalidated at next use.
3593 */
3594 if (write) {
Chris Wilson05394f32010-11-08 19:18:58 +00003595 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
3596 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
Eric Anholte47c68e2008-11-14 13:35:19 -08003597 }
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003598
Chris Wilson1c5d22f2009-08-25 11:15:50 +01003599 trace_i915_gem_object_change_domain(obj,
3600 old_read_domains,
3601 old_write_domain);
3602
Eric Anholt2ef7eea2008-11-10 10:53:25 -08003603 return 0;
3604}
3605
Eric Anholt673a3942008-07-30 12:06:12 -07003606/* Throttle our rendering by waiting until the ring has completed our requests
3607 * emitted over 20 msec ago.
3608 *
Eric Anholtb9624422009-06-03 07:27:35 +00003609 * Note that if we were to use the current jiffies each time around the loop,
3610 * we wouldn't escape the function with any frames outstanding if the time to
3611 * render a frame was over 20ms.
3612 *
Eric Anholt673a3942008-07-30 12:06:12 -07003613 * This should get us reasonable parallelism between CPU and GPU but also
3614 * relatively low latency when blocking on a particular request to finish.
3615 */
3616static int
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003617i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07003618{
Chris Wilsonfac5e232016-07-04 11:34:36 +01003619 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003620 struct drm_i915_file_private *file_priv = file->driver_priv;
Chris Wilsond0bc54f2015-05-21 21:01:48 +01003621 unsigned long recent_enough = jiffies - DRM_I915_THROTTLE_JIFFIES;
John Harrison54fb2412014-11-24 18:49:27 +00003622 struct drm_i915_gem_request *request, *target = NULL;
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003623 int ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003624
Daniel Vetter308887a2012-11-14 17:14:06 +01003625 ret = i915_gem_wait_for_error(&dev_priv->gpu_error);
3626 if (ret)
3627 return ret;
3628
Chris Wilsonf4457ae2016-04-13 17:35:08 +01003629 /* ABI: return -EIO if already wedged */
3630 if (i915_terminally_wedged(&dev_priv->gpu_error))
3631 return -EIO;
Chris Wilsone110e8d2011-01-26 15:39:14 +00003632
Chris Wilson1c255952010-09-26 11:03:27 +01003633 spin_lock(&file_priv->mm.lock);
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003634 list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
Eric Anholtb9624422009-06-03 07:27:35 +00003635 if (time_after_eq(request->emitted_jiffies, recent_enough))
3636 break;
3637
John Harrisonfcfa423c2015-05-29 17:44:12 +01003638 /*
3639 * Note that the request might not have been submitted yet.
3640 * In which case emitted_jiffies will be zero.
3641 */
3642 if (!request->emitted_jiffies)
3643 continue;
3644
John Harrison54fb2412014-11-24 18:49:27 +00003645 target = request;
Eric Anholtb9624422009-06-03 07:27:35 +00003646 }
John Harrisonff865882014-11-24 18:49:28 +00003647 if (target)
Chris Wilsone8a261e2016-07-20 13:31:49 +01003648 i915_gem_request_get(target);
Chris Wilson1c255952010-09-26 11:03:27 +01003649 spin_unlock(&file_priv->mm.lock);
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003650
John Harrison54fb2412014-11-24 18:49:27 +00003651 if (target == NULL)
Chris Wilsonf787a5f2010-09-24 16:02:42 +01003652 return 0;
3653
Chris Wilson776f3232016-08-04 07:52:40 +01003654 ret = i915_wait_request(target, true, NULL, NULL);
Chris Wilsone8a261e2016-07-20 13:31:49 +01003655 i915_gem_request_put(target);
John Harrisonff865882014-11-24 18:49:28 +00003656
Eric Anholt673a3942008-07-30 12:06:12 -07003657 return ret;
3658}
3659
Chris Wilsond23db882014-05-23 08:48:08 +02003660static bool
Chris Wilson91b2db62016-08-04 16:32:23 +01003661i915_vma_misplaced(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
Chris Wilsond23db882014-05-23 08:48:08 +02003662{
3663 struct drm_i915_gem_object *obj = vma->obj;
3664
Chris Wilson59bfa122016-08-04 16:32:31 +01003665 if (!drm_mm_node_allocated(&vma->node))
3666 return false;
3667
Chris Wilson91b2db62016-08-04 16:32:23 +01003668 if (vma->node.size < size)
3669 return true;
3670
3671 if (alignment && vma->node.start & (alignment - 1))
Chris Wilsond23db882014-05-23 08:48:08 +02003672 return true;
3673
3674 if (flags & PIN_MAPPABLE && !obj->map_and_fenceable)
3675 return true;
3676
3677 if (flags & PIN_OFFSET_BIAS &&
3678 vma->node.start < (flags & PIN_OFFSET_MASK))
3679 return true;
3680
Chris Wilson506a8e82015-12-08 11:55:07 +00003681 if (flags & PIN_OFFSET_FIXED &&
3682 vma->node.start != (flags & PIN_OFFSET_MASK))
3683 return true;
3684
Chris Wilsond23db882014-05-23 08:48:08 +02003685 return false;
3686}
3687
Chris Wilsond0710ab2015-11-20 14:16:39 +00003688void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
3689{
3690 struct drm_i915_gem_object *obj = vma->obj;
Chris Wilsona9f14812016-08-04 16:32:28 +01003691 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
Chris Wilsond0710ab2015-11-20 14:16:39 +00003692 bool mappable, fenceable;
3693 u32 fence_size, fence_alignment;
3694
Chris Wilsona9f14812016-08-04 16:32:28 +01003695 fence_size = i915_gem_get_ggtt_size(dev_priv,
Chris Wilsonad1a7d22016-08-04 16:32:27 +01003696 obj->base.size,
3697 obj->tiling_mode);
Chris Wilsona9f14812016-08-04 16:32:28 +01003698 fence_alignment = i915_gem_get_ggtt_alignment(dev_priv,
Chris Wilsonad1a7d22016-08-04 16:32:27 +01003699 obj->base.size,
3700 obj->tiling_mode,
3701 true);
Chris Wilsond0710ab2015-11-20 14:16:39 +00003702
3703 fenceable = (vma->node.size == fence_size &&
3704 (vma->node.start & (fence_alignment - 1)) == 0);
3705
3706 mappable = (vma->node.start + fence_size <=
Chris Wilsona9f14812016-08-04 16:32:28 +01003707 dev_priv->ggtt.mappable_end);
Chris Wilsond0710ab2015-11-20 14:16:39 +00003708
3709 obj->map_and_fenceable = mappable && fenceable;
3710}
3711
Chris Wilson305bc232016-08-04 16:32:33 +01003712int __i915_vma_do_pin(struct i915_vma *vma,
3713 u64 size, u64 alignment, u64 flags)
Eric Anholt673a3942008-07-30 12:06:12 -07003714{
Chris Wilson305bc232016-08-04 16:32:33 +01003715 unsigned int bound = vma->flags;
Eric Anholt673a3942008-07-30 12:06:12 -07003716 int ret;
3717
Chris Wilson59bfa122016-08-04 16:32:31 +01003718 GEM_BUG_ON((flags & (PIN_GLOBAL | PIN_USER)) == 0);
Chris Wilson3272db52016-08-04 16:32:32 +01003719 GEM_BUG_ON((flags & PIN_GLOBAL) && !i915_vma_is_ggtt(vma));
Ben Widawsky6e7186a2014-05-06 22:21:36 -07003720
Chris Wilson305bc232016-08-04 16:32:33 +01003721 if (WARN_ON(bound & I915_VMA_PIN_OVERFLOW)) {
3722 ret = -EBUSY;
3723 goto err;
3724 }
Chris Wilsonc826c442014-10-31 13:53:53 +00003725
Chris Wilsonde895082016-08-04 16:32:34 +01003726 if ((bound & I915_VMA_BIND_MASK) == 0) {
Chris Wilson59bfa122016-08-04 16:32:31 +01003727 ret = i915_vma_insert(vma, size, alignment, flags);
3728 if (ret)
3729 goto err;
Chris Wilsonac0c6b52010-05-27 13:18:18 +01003730 }
3731
Chris Wilson59bfa122016-08-04 16:32:31 +01003732 ret = i915_vma_bind(vma, vma->obj->cache_level, flags);
Chris Wilson3b165252016-08-04 16:32:25 +01003733 if (ret)
Chris Wilson59bfa122016-08-04 16:32:31 +01003734 goto err;
Chris Wilson3b165252016-08-04 16:32:25 +01003735
Chris Wilson3272db52016-08-04 16:32:32 +01003736 if ((bound ^ vma->flags) & I915_VMA_GLOBAL_BIND)
Chris Wilsond0710ab2015-11-20 14:16:39 +00003737 __i915_vma_set_map_and_fenceable(vma);
Chris Wilsonef79e172014-10-31 13:53:52 +00003738
Chris Wilson3b165252016-08-04 16:32:25 +01003739 GEM_BUG_ON(i915_vma_misplaced(vma, size, alignment, flags));
Eric Anholt673a3942008-07-30 12:06:12 -07003740 return 0;
Eric Anholt673a3942008-07-30 12:06:12 -07003741
Chris Wilson59bfa122016-08-04 16:32:31 +01003742err:
3743 __i915_vma_unpin(vma);
3744 return ret;
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003745}
3746
3747int
3748i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
3749 const struct i915_ggtt_view *view,
Chris Wilson91b2db62016-08-04 16:32:23 +01003750 u64 size,
Chris Wilson2ffffd02016-08-04 16:32:22 +01003751 u64 alignment,
3752 u64 flags)
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003753{
Chris Wilson59bfa122016-08-04 16:32:31 +01003754 struct i915_vma *vma;
3755 int ret;
Joonas Lahtinen72e96d62016-03-30 16:57:10 +03003756
Chris Wilsonde895082016-08-04 16:32:34 +01003757 if (!view)
3758 view = &i915_ggtt_view_normal;
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003759
Chris Wilson59bfa122016-08-04 16:32:31 +01003760 vma = i915_gem_obj_lookup_or_create_ggtt_vma(obj, view);
3761 if (IS_ERR(vma))
3762 return PTR_ERR(vma);
3763
3764 if (i915_vma_misplaced(vma, size, alignment, flags)) {
3765 if (flags & PIN_NONBLOCK &&
3766 (i915_vma_is_pinned(vma) || i915_vma_is_active(vma)))
3767 return -ENOSPC;
3768
3769 WARN(i915_vma_is_pinned(vma),
3770 "bo is already pinned in ggtt with incorrect alignment:"
3771 " offset=%08x %08x, req.alignment=%llx, req.map_and_fenceable=%d,"
3772 " obj->map_and_fenceable=%d\n",
3773 upper_32_bits(vma->node.start),
3774 lower_32_bits(vma->node.start),
3775 alignment,
3776 !!(flags & PIN_MAPPABLE),
3777 obj->map_and_fenceable);
3778 ret = i915_vma_unbind(vma);
3779 if (ret)
3780 return ret;
3781 }
3782
3783 return i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02003784}
3785
Eric Anholt673a3942008-07-30 12:06:12 -07003786void
Tvrtko Ursuline6617332015-03-23 11:10:33 +00003787i915_gem_object_ggtt_unpin_view(struct drm_i915_gem_object *obj,
3788 const struct i915_ggtt_view *view)
Eric Anholt673a3942008-07-30 12:06:12 -07003789{
Chris Wilsonde895082016-08-04 16:32:34 +01003790 i915_vma_unpin(i915_gem_obj_to_ggtt_view(obj, view));
Eric Anholt673a3942008-07-30 12:06:12 -07003791}
3792
3793int
Eric Anholt673a3942008-07-30 12:06:12 -07003794i915_gem_busy_ioctl(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00003795 struct drm_file *file)
Eric Anholt673a3942008-07-30 12:06:12 -07003796{
3797 struct drm_i915_gem_busy *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00003798 struct drm_i915_gem_object *obj;
Chris Wilson30dbf0c2010-09-25 10:19:17 +01003799 int ret;
3800
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003801 ret = i915_mutex_lock_interruptible(dev);
3802 if (ret)
3803 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003804
Chris Wilson03ac0642016-07-20 13:31:51 +01003805 obj = i915_gem_object_lookup(file, args->handle);
3806 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003807 ret = -ENOENT;
3808 goto unlock;
Eric Anholt673a3942008-07-30 12:06:12 -07003809 }
Zou Nan haid1b851f2010-05-21 09:08:57 +08003810
Chris Wilson0be555b2010-08-04 15:36:30 +01003811 /* Count all active objects as busy, even if they are currently not used
3812 * by the gpu. Users of this interface expect objects to eventually
Chris Wilson21c310f2016-08-04 07:52:34 +01003813 * become non-busy without any further actions.
Eric Anholtc4de0a52008-12-14 19:05:04 -08003814 */
Chris Wilson426960b2016-01-15 16:51:46 +00003815 args->busy = 0;
Chris Wilson573adb32016-08-04 16:32:39 +01003816 if (i915_gem_object_is_active(obj)) {
Chris Wilson27c01aa2016-08-04 07:52:30 +01003817 struct drm_i915_gem_request *req;
Chris Wilson426960b2016-01-15 16:51:46 +00003818 int i;
3819
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00003820 for (i = 0; i < I915_NUM_ENGINES; i++) {
Chris Wilsond72d9082016-08-04 07:52:31 +01003821 req = i915_gem_active_peek(&obj->last_read[i],
3822 &obj->base.dev->struct_mutex);
Chris Wilson426960b2016-01-15 16:51:46 +00003823 if (req)
Tvrtko Ursulin4a570db2016-03-16 11:00:38 +00003824 args->busy |= 1 << (16 + req->engine->exec_id);
Chris Wilson426960b2016-01-15 16:51:46 +00003825 }
Chris Wilsond72d9082016-08-04 07:52:31 +01003826 req = i915_gem_active_peek(&obj->last_write,
3827 &obj->base.dev->struct_mutex);
Chris Wilson27c01aa2016-08-04 07:52:30 +01003828 if (req)
3829 args->busy |= req->engine->exec_id;
Chris Wilson426960b2016-01-15 16:51:46 +00003830 }
Eric Anholt673a3942008-07-30 12:06:12 -07003831
Chris Wilsonf8c417c2016-07-20 13:31:53 +01003832 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003833unlock:
Eric Anholt673a3942008-07-30 12:06:12 -07003834 mutex_unlock(&dev->struct_mutex);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003835 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07003836}
3837
3838int
3839i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
3840 struct drm_file *file_priv)
3841{
Akshay Joshi0206e352011-08-16 15:34:10 -04003842 return i915_gem_ring_throttle(dev, file_priv);
Eric Anholt673a3942008-07-30 12:06:12 -07003843}
3844
Chris Wilson3ef94da2009-09-14 16:50:29 +01003845int
3846i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
3847 struct drm_file *file_priv)
3848{
Chris Wilsonfac5e232016-07-04 11:34:36 +01003849 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson3ef94da2009-09-14 16:50:29 +01003850 struct drm_i915_gem_madvise *args = data;
Chris Wilson05394f32010-11-08 19:18:58 +00003851 struct drm_i915_gem_object *obj;
Chris Wilson76c1dec2010-09-25 11:22:51 +01003852 int ret;
Chris Wilson3ef94da2009-09-14 16:50:29 +01003853
3854 switch (args->madv) {
3855 case I915_MADV_DONTNEED:
3856 case I915_MADV_WILLNEED:
3857 break;
3858 default:
3859 return -EINVAL;
3860 }
3861
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003862 ret = i915_mutex_lock_interruptible(dev);
3863 if (ret)
3864 return ret;
3865
Chris Wilson03ac0642016-07-20 13:31:51 +01003866 obj = i915_gem_object_lookup(file_priv, args->handle);
3867 if (!obj) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003868 ret = -ENOENT;
3869 goto unlock;
Chris Wilson3ef94da2009-09-14 16:50:29 +01003870 }
Chris Wilson3ef94da2009-09-14 16:50:29 +01003871
Ben Widawskyd7f46fc2013-12-06 14:10:55 -08003872 if (i915_gem_obj_is_pinned(obj)) {
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003873 ret = -EINVAL;
3874 goto out;
Chris Wilson3ef94da2009-09-14 16:50:29 +01003875 }
3876
Daniel Vetter656bfa32014-11-20 09:26:30 +01003877 if (obj->pages &&
3878 obj->tiling_mode != I915_TILING_NONE &&
3879 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
3880 if (obj->madv == I915_MADV_WILLNEED)
3881 i915_gem_object_unpin_pages(obj);
3882 if (args->madv == I915_MADV_WILLNEED)
3883 i915_gem_object_pin_pages(obj);
3884 }
3885
Chris Wilson05394f32010-11-08 19:18:58 +00003886 if (obj->madv != __I915_MADV_PURGED)
3887 obj->madv = args->madv;
Chris Wilson3ef94da2009-09-14 16:50:29 +01003888
Chris Wilson6c085a72012-08-20 11:40:46 +02003889 /* if the object is no longer attached, discard its backing storage */
Daniel Vetterbe6a0372015-03-18 10:46:04 +01003890 if (obj->madv == I915_MADV_DONTNEED && obj->pages == NULL)
Chris Wilson2d7ef392009-09-20 23:13:10 +01003891 i915_gem_object_truncate(obj);
3892
Chris Wilson05394f32010-11-08 19:18:58 +00003893 args->retained = obj->madv != __I915_MADV_PURGED;
Chris Wilsonbb6baf72009-09-22 14:24:13 +01003894
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003895out:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01003896 i915_gem_object_put(obj);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003897unlock:
Chris Wilson3ef94da2009-09-14 16:50:29 +01003898 mutex_unlock(&dev->struct_mutex);
Chris Wilson1d7cfea2010-10-17 09:45:41 +01003899 return ret;
Chris Wilson3ef94da2009-09-14 16:50:29 +01003900}
3901
Chris Wilson37e680a2012-06-07 15:38:42 +01003902void i915_gem_object_init(struct drm_i915_gem_object *obj,
3903 const struct drm_i915_gem_object_ops *ops)
Chris Wilson0327d6b2012-08-11 15:41:06 +01003904{
Chris Wilsonb4716182015-04-27 13:41:17 +01003905 int i;
3906
Ben Widawsky35c20a62013-05-31 11:28:48 -07003907 INIT_LIST_HEAD(&obj->global_list);
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00003908 for (i = 0; i < I915_NUM_ENGINES; i++)
Chris Wilsonfa545cb2016-08-04 07:52:35 +01003909 init_request_active(&obj->last_read[i],
3910 i915_gem_object_retire__read);
3911 init_request_active(&obj->last_write,
3912 i915_gem_object_retire__write);
3913 init_request_active(&obj->last_fence, NULL);
Ben Widawskyb25cb2f2013-08-14 11:38:33 +02003914 INIT_LIST_HEAD(&obj->obj_exec_link);
Ben Widawsky2f633152013-07-17 12:19:03 -07003915 INIT_LIST_HEAD(&obj->vma_list);
Chris Wilson8d9d5742015-04-07 16:20:38 +01003916 INIT_LIST_HEAD(&obj->batch_pool_link);
Chris Wilson0327d6b2012-08-11 15:41:06 +01003917
Chris Wilson37e680a2012-06-07 15:38:42 +01003918 obj->ops = ops;
3919
Chris Wilson0327d6b2012-08-11 15:41:06 +01003920 obj->fence_reg = I915_FENCE_REG_NONE;
3921 obj->madv = I915_MADV_WILLNEED;
Chris Wilson0327d6b2012-08-11 15:41:06 +01003922
Dave Gordonf19ec8c2016-07-04 11:34:37 +01003923 i915_gem_info_add_obj(to_i915(obj->base.dev), obj->base.size);
Chris Wilson0327d6b2012-08-11 15:41:06 +01003924}
3925
Chris Wilson37e680a2012-06-07 15:38:42 +01003926static const struct drm_i915_gem_object_ops i915_gem_object_ops = {
Chris Wilsonde472662016-01-22 18:32:31 +00003927 .flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE,
Chris Wilson37e680a2012-06-07 15:38:42 +01003928 .get_pages = i915_gem_object_get_pages_gtt,
3929 .put_pages = i915_gem_object_put_pages_gtt,
3930};
3931
Dave Gordond37cd8a2016-04-22 19:14:32 +01003932struct drm_i915_gem_object *i915_gem_object_create(struct drm_device *dev,
Chris Wilson05394f32010-11-08 19:18:58 +00003933 size_t size)
Daniel Vetterac52bc52010-04-09 19:05:06 +00003934{
Daniel Vetterc397b902010-04-09 19:05:07 +00003935 struct drm_i915_gem_object *obj;
Hugh Dickins5949eac2011-06-27 16:18:18 -07003936 struct address_space *mapping;
Daniel Vetter1a240d42012-11-29 22:18:51 +01003937 gfp_t mask;
Chris Wilsonfe3db792016-04-25 13:32:13 +01003938 int ret;
Daniel Vetterc397b902010-04-09 19:05:07 +00003939
Chris Wilson42dcedd2012-11-15 11:32:30 +00003940 obj = i915_gem_object_alloc(dev);
Daniel Vetterc397b902010-04-09 19:05:07 +00003941 if (obj == NULL)
Chris Wilsonfe3db792016-04-25 13:32:13 +01003942 return ERR_PTR(-ENOMEM);
Daniel Vetterc397b902010-04-09 19:05:07 +00003943
Chris Wilsonfe3db792016-04-25 13:32:13 +01003944 ret = drm_gem_object_init(dev, &obj->base, size);
3945 if (ret)
3946 goto fail;
Daniel Vetterc397b902010-04-09 19:05:07 +00003947
Chris Wilsonbed1ea92012-05-24 20:48:12 +01003948 mask = GFP_HIGHUSER | __GFP_RECLAIMABLE;
3949 if (IS_CRESTLINE(dev) || IS_BROADWATER(dev)) {
3950 /* 965gm cannot relocate objects above 4GiB. */
3951 mask &= ~__GFP_HIGHMEM;
3952 mask |= __GFP_DMA32;
3953 }
3954
Al Viro496ad9a2013-01-23 17:07:38 -05003955 mapping = file_inode(obj->base.filp)->i_mapping;
Chris Wilsonbed1ea92012-05-24 20:48:12 +01003956 mapping_set_gfp_mask(mapping, mask);
Hugh Dickins5949eac2011-06-27 16:18:18 -07003957
Chris Wilson37e680a2012-06-07 15:38:42 +01003958 i915_gem_object_init(obj, &i915_gem_object_ops);
Chris Wilson73aa8082010-09-30 11:46:12 +01003959
Daniel Vetterc397b902010-04-09 19:05:07 +00003960 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
3961 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
3962
Eugeni Dodonov3d29b842012-01-17 14:43:53 -02003963 if (HAS_LLC(dev)) {
3964 /* On some devices, we can have the GPU use the LLC (the CPU
Eric Anholta1871112011-03-29 16:59:55 -07003965 * cache) for about a 10% performance improvement
3966 * compared to uncached. Graphics requests other than
3967 * display scanout are coherent with the CPU in
3968 * accessing this cache. This means in this mode we
3969 * don't need to clflush on the CPU side, and on the
3970 * GPU side we only need to flush internal caches to
3971 * get data visible to the CPU.
3972 *
3973 * However, we maintain the display planes as UC, and so
3974 * need to rebind when first used as such.
3975 */
3976 obj->cache_level = I915_CACHE_LLC;
3977 } else
3978 obj->cache_level = I915_CACHE_NONE;
3979
Daniel Vetterd861e332013-07-24 23:25:03 +02003980 trace_i915_gem_object_create(obj);
3981
Chris Wilson05394f32010-11-08 19:18:58 +00003982 return obj;
Chris Wilsonfe3db792016-04-25 13:32:13 +01003983
3984fail:
3985 i915_gem_object_free(obj);
3986
3987 return ERR_PTR(ret);
Daniel Vetterac52bc52010-04-09 19:05:06 +00003988}
3989
Chris Wilson340fbd82014-05-22 09:16:52 +01003990static bool discard_backing_storage(struct drm_i915_gem_object *obj)
3991{
3992 /* If we are the last user of the backing storage (be it shmemfs
3993 * pages or stolen etc), we know that the pages are going to be
3994 * immediately released. In this case, we can then skip copying
3995 * back the contents from the GPU.
3996 */
3997
3998 if (obj->madv != I915_MADV_WILLNEED)
3999 return false;
4000
4001 if (obj->base.filp == NULL)
4002 return true;
4003
4004 /* At first glance, this looks racy, but then again so would be
4005 * userspace racing mmap against close. However, the first external
4006 * reference to the filp can only be obtained through the
4007 * i915_gem_mmap_ioctl() which safeguards us against the user
4008 * acquiring such a reference whilst we are in the middle of
4009 * freeing the object.
4010 */
4011 return atomic_long_read(&obj->base.filp->f_count) == 1;
4012}
4013
Chris Wilson1488fc02012-04-24 15:47:31 +01004014void i915_gem_free_object(struct drm_gem_object *gem_obj)
Chris Wilsonbe726152010-07-23 23:18:50 +01004015{
Chris Wilson1488fc02012-04-24 15:47:31 +01004016 struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
Chris Wilson05394f32010-11-08 19:18:58 +00004017 struct drm_device *dev = obj->base.dev;
Chris Wilsonfac5e232016-07-04 11:34:36 +01004018 struct drm_i915_private *dev_priv = to_i915(dev);
Ben Widawsky07fe0b12013-07-31 17:00:10 -07004019 struct i915_vma *vma, *next;
Chris Wilsonbe726152010-07-23 23:18:50 +01004020
Paulo Zanonif65c9162013-11-27 18:20:34 -02004021 intel_runtime_pm_get(dev_priv);
4022
Chris Wilson26e12f82011-03-20 11:20:19 +00004023 trace_i915_gem_object_destroy(obj);
4024
Chris Wilsonb1f788c2016-08-04 07:52:45 +01004025 /* All file-owned VMA should have been released by this point through
4026 * i915_gem_close_object(), or earlier by i915_gem_context_close().
4027 * However, the object may also be bound into the global GTT (e.g.
4028 * older GPUs without per-process support, or for direct access through
4029 * the GTT either for the user or for scanout). Those VMA still need to
4030 * unbound now.
4031 */
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004032 list_for_each_entry_safe(vma, next, &obj->vma_list, obj_link) {
Chris Wilson3272db52016-08-04 16:32:32 +01004033 GEM_BUG_ON(!i915_vma_is_ggtt(vma));
Chris Wilsonb1f788c2016-08-04 07:52:45 +01004034 GEM_BUG_ON(i915_vma_is_active(vma));
Chris Wilson3272db52016-08-04 16:32:32 +01004035 vma->flags &= ~I915_VMA_PIN_MASK;
Chris Wilsonb1f788c2016-08-04 07:52:45 +01004036 i915_vma_close(vma);
Chris Wilson1488fc02012-04-24 15:47:31 +01004037 }
Chris Wilson15717de2016-08-04 07:52:26 +01004038 GEM_BUG_ON(obj->bind_count);
Chris Wilson1488fc02012-04-24 15:47:31 +01004039
Ben Widawsky1d64ae72013-05-31 14:46:20 -07004040 /* Stolen objects don't hold a ref, but do hold pin count. Fix that up
4041 * before progressing. */
4042 if (obj->stolen)
4043 i915_gem_object_unpin_pages(obj);
4044
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004045 WARN_ON(atomic_read(&obj->frontbuffer_bits));
Daniel Vettera071fa02014-06-18 23:28:09 +02004046
Daniel Vetter656bfa32014-11-20 09:26:30 +01004047 if (obj->pages && obj->madv == I915_MADV_WILLNEED &&
4048 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES &&
4049 obj->tiling_mode != I915_TILING_NONE)
4050 i915_gem_object_unpin_pages(obj);
4051
Ben Widawsky401c29f2013-05-31 11:28:47 -07004052 if (WARN_ON(obj->pages_pin_count))
4053 obj->pages_pin_count = 0;
Chris Wilson340fbd82014-05-22 09:16:52 +01004054 if (discard_backing_storage(obj))
Chris Wilson55372522014-03-25 13:23:06 +00004055 obj->madv = I915_MADV_DONTNEED;
Chris Wilson37e680a2012-06-07 15:38:42 +01004056 i915_gem_object_put_pages(obj);
Chris Wilsonbe726152010-07-23 23:18:50 +01004057
Chris Wilson9da3da62012-06-01 15:20:22 +01004058 BUG_ON(obj->pages);
4059
Chris Wilson2f745ad2012-09-04 21:02:58 +01004060 if (obj->base.import_attach)
4061 drm_prime_gem_destroy(&obj->base, NULL);
Chris Wilsonbe726152010-07-23 23:18:50 +01004062
Chris Wilson5cc9ed42014-05-16 14:22:37 +01004063 if (obj->ops->release)
4064 obj->ops->release(obj);
4065
Chris Wilson05394f32010-11-08 19:18:58 +00004066 drm_gem_object_release(&obj->base);
4067 i915_gem_info_remove_obj(dev_priv, obj->base.size);
Chris Wilsonbe726152010-07-23 23:18:50 +01004068
Chris Wilson05394f32010-11-08 19:18:58 +00004069 kfree(obj->bit_17);
Chris Wilson42dcedd2012-11-15 11:32:30 +00004070 i915_gem_object_free(obj);
Paulo Zanonif65c9162013-11-27 18:20:34 -02004071
4072 intel_runtime_pm_put(dev_priv);
Chris Wilsonbe726152010-07-23 23:18:50 +01004073}
4074
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004075struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
4076 struct i915_address_space *vm)
Ben Widawsky2f633152013-07-17 12:19:03 -07004077{
Daniel Vettere656a6c2013-08-14 14:14:04 +02004078 struct i915_vma *vma;
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004079 list_for_each_entry(vma, &obj->vma_list, obj_link) {
Tvrtko Ursulin1b683722015-11-12 11:59:55 +00004080 if (vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL &&
4081 vma->vm == vm)
Daniel Vettere656a6c2013-08-14 14:14:04 +02004082 return vma;
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004083 }
4084 return NULL;
4085}
Daniel Vettere656a6c2013-08-14 14:14:04 +02004086
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004087struct i915_vma *i915_gem_obj_to_ggtt_view(struct drm_i915_gem_object *obj,
4088 const struct i915_ggtt_view *view)
4089{
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004090 struct i915_vma *vma;
4091
Tvrtko Ursulin598b9ec2016-04-21 13:04:44 +01004092 GEM_BUG_ON(!view);
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004093
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004094 list_for_each_entry(vma, &obj->vma_list, obj_link)
Chris Wilson3272db52016-08-04 16:32:32 +01004095 if (i915_vma_is_ggtt(vma) &&
4096 i915_ggtt_view_equal(&vma->ggtt_view, view))
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004097 return vma;
Daniel Vettere656a6c2013-08-14 14:14:04 +02004098 return NULL;
4099}
4100
Chris Wilsone3efda42014-04-09 09:19:41 +01004101static void
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004102i915_gem_stop_engines(struct drm_device *dev)
Chris Wilsone3efda42014-04-09 09:19:41 +01004103{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004104 struct drm_i915_private *dev_priv = to_i915(dev);
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004105 struct intel_engine_cs *engine;
Chris Wilsone3efda42014-04-09 09:19:41 +01004106
Dave Gordonb4ac5af2016-03-24 11:20:38 +00004107 for_each_engine(engine, dev_priv)
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004108 dev_priv->gt.stop_engine(engine);
Chris Wilsone3efda42014-04-09 09:19:41 +01004109}
4110
Jesse Barnes5669fca2009-02-17 15:13:31 -08004111int
Chris Wilson45c5f202013-10-16 11:50:01 +01004112i915_gem_suspend(struct drm_device *dev)
Eric Anholt673a3942008-07-30 12:06:12 -07004113{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004114 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson45c5f202013-10-16 11:50:01 +01004115 int ret = 0;
Eric Anholt673a3942008-07-30 12:06:12 -07004116
Chris Wilson54b4f682016-07-21 21:16:19 +01004117 intel_suspend_gt_powersave(dev_priv);
4118
Chris Wilson45c5f202013-10-16 11:50:01 +01004119 mutex_lock(&dev->struct_mutex);
Chris Wilson5ab57c72016-07-15 14:56:20 +01004120
4121 /* We have to flush all the executing contexts to main memory so
4122 * that they can saved in the hibernation image. To ensure the last
4123 * context image is coherent, we have to switch away from it. That
4124 * leaves the dev_priv->kernel_context still active when
4125 * we actually suspend, and its image in memory may not match the GPU
4126 * state. Fortunately, the kernel_context is disposable and we do
4127 * not rely on its state.
4128 */
4129 ret = i915_gem_switch_to_kernel_context(dev_priv);
4130 if (ret)
4131 goto err;
4132
Chris Wilson6e5a5be2016-06-24 14:55:57 +01004133 ret = i915_gem_wait_for_idle(dev_priv);
Chris Wilsonf7403342013-09-13 23:57:04 +01004134 if (ret)
Chris Wilson45c5f202013-10-16 11:50:01 +01004135 goto err;
Chris Wilsonf7403342013-09-13 23:57:04 +01004136
Chris Wilsonc0336662016-05-06 15:40:21 +01004137 i915_gem_retire_requests(dev_priv);
Eric Anholt673a3942008-07-30 12:06:12 -07004138
Chris Wilson5ab57c72016-07-15 14:56:20 +01004139 /* Note that rather than stopping the engines, all we have to do
4140 * is assert that every RING_HEAD == RING_TAIL (all execution complete)
4141 * and similar for all logical context images (to ensure they are
4142 * all ready for hibernation).
4143 */
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004144 i915_gem_stop_engines(dev);
Chris Wilsonb2e862d2016-04-28 09:56:41 +01004145 i915_gem_context_lost(dev_priv);
Chris Wilson45c5f202013-10-16 11:50:01 +01004146 mutex_unlock(&dev->struct_mutex);
4147
Chris Wilson737b1502015-01-26 18:03:03 +02004148 cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
Chris Wilson67d97da2016-07-04 08:08:31 +01004149 cancel_delayed_work_sync(&dev_priv->gt.retire_work);
4150 flush_delayed_work(&dev_priv->gt.idle_work);
Chris Wilson29105cc2010-01-07 10:39:13 +00004151
Chris Wilsonbdcf1202014-11-25 11:56:33 +00004152 /* Assert that we sucessfully flushed all the work and
4153 * reset the GPU back to its idle, low power state.
4154 */
Chris Wilson67d97da2016-07-04 08:08:31 +01004155 WARN_ON(dev_priv->gt.awake);
Chris Wilsonbdcf1202014-11-25 11:56:33 +00004156
Eric Anholt673a3942008-07-30 12:06:12 -07004157 return 0;
Chris Wilson45c5f202013-10-16 11:50:01 +01004158
4159err:
4160 mutex_unlock(&dev->struct_mutex);
4161 return ret;
Eric Anholt673a3942008-07-30 12:06:12 -07004162}
4163
Chris Wilson5ab57c72016-07-15 14:56:20 +01004164void i915_gem_resume(struct drm_device *dev)
4165{
4166 struct drm_i915_private *dev_priv = to_i915(dev);
4167
4168 mutex_lock(&dev->struct_mutex);
4169 i915_gem_restore_gtt_mappings(dev);
4170
4171 /* As we didn't flush the kernel context before suspend, we cannot
4172 * guarantee that the context image is complete. So let's just reset
4173 * it and start again.
4174 */
4175 if (i915.enable_execlists)
4176 intel_lr_context_reset(dev_priv, dev_priv->kernel_context);
4177
4178 mutex_unlock(&dev->struct_mutex);
4179}
4180
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004181void i915_gem_init_swizzling(struct drm_device *dev)
4182{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004183 struct drm_i915_private *dev_priv = to_i915(dev);
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004184
Daniel Vetter11782b02012-01-31 16:47:55 +01004185 if (INTEL_INFO(dev)->gen < 5 ||
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004186 dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE)
4187 return;
4188
4189 I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
4190 DISP_TILE_SURFACE_SWIZZLING);
4191
Daniel Vetter11782b02012-01-31 16:47:55 +01004192 if (IS_GEN5(dev))
4193 return;
4194
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004195 I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL);
4196 if (IS_GEN6(dev))
Daniel Vetter6b26c862012-04-24 14:04:12 +02004197 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_SNB));
Ben Widawsky8782e262012-12-18 10:31:23 -08004198 else if (IS_GEN7(dev))
Daniel Vetter6b26c862012-04-24 14:04:12 +02004199 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_IVB));
Ben Widawsky31a53362013-11-02 21:07:04 -07004200 else if (IS_GEN8(dev))
4201 I915_WRITE(GAMTARBMODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_BDW));
Ben Widawsky8782e262012-12-18 10:31:23 -08004202 else
4203 BUG();
Daniel Vetterf691e2f2012-02-02 09:58:12 +01004204}
Daniel Vettere21af882012-02-09 20:53:27 +01004205
Ville Syrjälä81e7f202014-08-15 01:21:55 +03004206static void init_unused_ring(struct drm_device *dev, u32 base)
4207{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004208 struct drm_i915_private *dev_priv = to_i915(dev);
Ville Syrjälä81e7f202014-08-15 01:21:55 +03004209
4210 I915_WRITE(RING_CTL(base), 0);
4211 I915_WRITE(RING_HEAD(base), 0);
4212 I915_WRITE(RING_TAIL(base), 0);
4213 I915_WRITE(RING_START(base), 0);
4214}
4215
4216static void init_unused_rings(struct drm_device *dev)
4217{
4218 if (IS_I830(dev)) {
4219 init_unused_ring(dev, PRB1_BASE);
4220 init_unused_ring(dev, SRB0_BASE);
4221 init_unused_ring(dev, SRB1_BASE);
4222 init_unused_ring(dev, SRB2_BASE);
4223 init_unused_ring(dev, SRB3_BASE);
4224 } else if (IS_GEN2(dev)) {
4225 init_unused_ring(dev, SRB0_BASE);
4226 init_unused_ring(dev, SRB1_BASE);
4227 } else if (IS_GEN3(dev)) {
4228 init_unused_ring(dev, PRB1_BASE);
4229 init_unused_ring(dev, PRB2_BASE);
4230 }
4231}
4232
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004233int
4234i915_gem_init_hw(struct drm_device *dev)
4235{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004236 struct drm_i915_private *dev_priv = to_i915(dev);
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004237 struct intel_engine_cs *engine;
Chris Wilsond200cda2016-04-28 09:56:44 +01004238 int ret;
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004239
Chris Wilson5e4f5182015-02-13 14:35:59 +00004240 /* Double layer security blanket, see i915_gem_init() */
4241 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
4242
Mika Kuoppala3accaf72016-04-13 17:26:43 +03004243 if (HAS_EDRAM(dev) && INTEL_GEN(dev_priv) < 9)
Ben Widawsky05e21cc2013-07-04 11:02:04 -07004244 I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf));
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004245
Ville Syrjälä0bf21342013-11-29 14:56:12 +02004246 if (IS_HASWELL(dev))
4247 I915_WRITE(MI_PREDICATE_RESULT_2, IS_HSW_GT3(dev) ?
4248 LOWER_SLICE_ENABLED : LOWER_SLICE_DISABLED);
Rodrigo Vivi94353732013-08-28 16:45:46 -03004249
Ben Widawsky88a2b2a2013-04-05 13:12:43 -07004250 if (HAS_PCH_NOP(dev)) {
Daniel Vetter6ba844b2014-01-22 23:39:30 +01004251 if (IS_IVYBRIDGE(dev)) {
4252 u32 temp = I915_READ(GEN7_MSG_CTL);
4253 temp &= ~(WAIT_FOR_PCH_FLR_ACK | WAIT_FOR_PCH_RESET_ACK);
4254 I915_WRITE(GEN7_MSG_CTL, temp);
4255 } else if (INTEL_INFO(dev)->gen >= 7) {
4256 u32 temp = I915_READ(HSW_NDE_RSTWRN_OPT);
4257 temp &= ~RESET_PCH_HANDSHAKE_ENABLE;
4258 I915_WRITE(HSW_NDE_RSTWRN_OPT, temp);
4259 }
Ben Widawsky88a2b2a2013-04-05 13:12:43 -07004260 }
4261
Ben Widawsky4fc7c972013-02-08 11:49:24 -08004262 i915_gem_init_swizzling(dev);
4263
Daniel Vetterd5abdfd2014-11-20 09:45:19 +01004264 /*
4265 * At least 830 can leave some of the unused rings
4266 * "active" (ie. head != tail) after resume which
4267 * will prevent c3 entry. Makes sure all unused rings
4268 * are totally idle.
4269 */
4270 init_unused_rings(dev);
4271
Dave Gordoned54c1a2016-01-19 19:02:54 +00004272 BUG_ON(!dev_priv->kernel_context);
John Harrison90638cc2015-05-29 17:43:37 +01004273
John Harrison4ad2fd82015-06-18 13:11:20 +01004274 ret = i915_ppgtt_init_hw(dev);
4275 if (ret) {
4276 DRM_ERROR("PPGTT enable HW failed %d\n", ret);
4277 goto out;
4278 }
4279
4280 /* Need to do basic initialisation of all rings first: */
Dave Gordonb4ac5af2016-03-24 11:20:38 +00004281 for_each_engine(engine, dev_priv) {
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004282 ret = engine->init_hw(engine);
Daniel Vetter35a57ff2014-11-20 00:33:07 +01004283 if (ret)
Chris Wilson5e4f5182015-02-13 14:35:59 +00004284 goto out;
Daniel Vetter35a57ff2014-11-20 00:33:07 +01004285 }
Mika Kuoppala99433932013-01-22 14:12:17 +02004286
Peter Antoine0ccdacf2016-04-13 15:03:25 +01004287 intel_mocs_init_l3cc_table(dev);
4288
Alex Dai33a732f2015-08-12 15:43:36 +01004289 /* We can't enable contexts until all firmware is loaded */
Dave Gordone556f7c2016-06-07 09:14:49 +01004290 ret = intel_guc_setup(dev);
4291 if (ret)
4292 goto out;
Alex Dai33a732f2015-08-12 15:43:36 +01004293
Chris Wilson5e4f5182015-02-13 14:35:59 +00004294out:
4295 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
Ben Widawsky2fa48d82013-12-06 14:11:04 -08004296 return ret;
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004297}
4298
Chris Wilson39df9192016-07-20 13:31:57 +01004299bool intel_sanitize_semaphores(struct drm_i915_private *dev_priv, int value)
4300{
4301 if (INTEL_INFO(dev_priv)->gen < 6)
4302 return false;
4303
4304 /* TODO: make semaphores and Execlists play nicely together */
4305 if (i915.enable_execlists)
4306 return false;
4307
4308 if (value >= 0)
4309 return value;
4310
4311#ifdef CONFIG_INTEL_IOMMU
4312 /* Enable semaphores on SNB when IO remapping is off */
4313 if (INTEL_INFO(dev_priv)->gen == 6 && intel_iommu_gfx_mapped)
4314 return false;
4315#endif
4316
4317 return true;
4318}
4319
Chris Wilson1070a422012-04-24 15:47:41 +01004320int i915_gem_init(struct drm_device *dev)
4321{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004322 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson1070a422012-04-24 15:47:41 +01004323 int ret;
4324
Chris Wilson1070a422012-04-24 15:47:41 +01004325 mutex_lock(&dev->struct_mutex);
Jesse Barnesd62b4892013-03-08 10:45:53 -08004326
Oscar Mateoa83014d2014-07-24 17:04:21 +01004327 if (!i915.enable_execlists) {
Chris Wilson7e37f882016-08-02 22:50:21 +01004328 dev_priv->gt.cleanup_engine = intel_engine_cleanup;
4329 dev_priv->gt.stop_engine = intel_engine_stop;
Oscar Mateo454afeb2014-07-24 17:04:22 +01004330 } else {
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004331 dev_priv->gt.cleanup_engine = intel_logical_ring_cleanup;
4332 dev_priv->gt.stop_engine = intel_logical_ring_stop;
Oscar Mateoa83014d2014-07-24 17:04:21 +01004333 }
4334
Chris Wilson5e4f5182015-02-13 14:35:59 +00004335 /* This is just a security blanket to placate dragons.
4336 * On some systems, we very sporadically observe that the first TLBs
4337 * used by the CS may be stale, despite us poking the TLB reset. If
4338 * we hold the forcewake during initialisation these problems
4339 * just magically go away.
4340 */
4341 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
4342
Chris Wilson72778cb2016-05-19 16:17:16 +01004343 i915_gem_init_userptr(dev_priv);
Chris Wilsonf6b9d5ca2016-08-04 07:52:23 +01004344
4345 ret = i915_gem_init_ggtt(dev_priv);
4346 if (ret)
4347 goto out_unlock;
Jesse Barnesd62b4892013-03-08 10:45:53 -08004348
Ben Widawsky2fa48d82013-12-06 14:11:04 -08004349 ret = i915_gem_context_init(dev);
Jani Nikula7bcc3772014-12-05 14:17:42 +02004350 if (ret)
4351 goto out_unlock;
Ben Widawsky2fa48d82013-12-06 14:11:04 -08004352
Tvrtko Ursulin8b3e2d32016-07-13 16:03:37 +01004353 ret = intel_engines_init(dev);
Daniel Vetter35a57ff2014-11-20 00:33:07 +01004354 if (ret)
Jani Nikula7bcc3772014-12-05 14:17:42 +02004355 goto out_unlock;
Daniel Vetter53ca26c2012-04-26 23:28:03 +02004356
4357 ret = i915_gem_init_hw(dev);
Chris Wilson60990322014-04-09 09:19:42 +01004358 if (ret == -EIO) {
Chris Wilson7e21d642016-07-27 09:07:29 +01004359 /* Allow engine initialisation to fail by marking the GPU as
Chris Wilson60990322014-04-09 09:19:42 +01004360 * wedged. But we only want to do this where the GPU is angry,
4361 * for all other failure, such as an allocation failure, bail.
4362 */
4363 DRM_ERROR("Failed to initialize GPU, declaring it wedged\n");
Peter Zijlstra805de8f42015-04-24 01:12:32 +02004364 atomic_or(I915_WEDGED, &dev_priv->gpu_error.reset_counter);
Chris Wilson60990322014-04-09 09:19:42 +01004365 ret = 0;
Chris Wilson1070a422012-04-24 15:47:41 +01004366 }
Jani Nikula7bcc3772014-12-05 14:17:42 +02004367
4368out_unlock:
Chris Wilson5e4f5182015-02-13 14:35:59 +00004369 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
Chris Wilson60990322014-04-09 09:19:42 +01004370 mutex_unlock(&dev->struct_mutex);
Chris Wilson1070a422012-04-24 15:47:41 +01004371
Chris Wilson60990322014-04-09 09:19:42 +01004372 return ret;
Chris Wilson1070a422012-04-24 15:47:41 +01004373}
4374
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004375void
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004376i915_gem_cleanup_engines(struct drm_device *dev)
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004377{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004378 struct drm_i915_private *dev_priv = to_i915(dev);
Tvrtko Ursuline2f80392016-03-16 11:00:36 +00004379 struct intel_engine_cs *engine;
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004380
Dave Gordonb4ac5af2016-03-24 11:20:38 +00004381 for_each_engine(engine, dev_priv)
Tvrtko Ursulin117897f2016-03-16 11:00:40 +00004382 dev_priv->gt.cleanup_engine(engine);
Zou Nan hai8187a2b2010-05-21 09:08:55 +08004383}
4384
Chris Wilson64193402010-10-24 12:38:05 +01004385static void
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00004386init_engine_lists(struct intel_engine_cs *engine)
Chris Wilson64193402010-10-24 12:38:05 +01004387{
Tvrtko Ursulin0bc40be2016-03-16 11:00:37 +00004388 INIT_LIST_HEAD(&engine->request_list);
Chris Wilson64193402010-10-24 12:38:05 +01004389}
4390
Eric Anholt673a3942008-07-30 12:06:12 -07004391void
Imre Deak40ae4e12016-03-16 14:54:03 +02004392i915_gem_load_init_fences(struct drm_i915_private *dev_priv)
4393{
Chris Wilson91c8a322016-07-05 10:40:23 +01004394 struct drm_device *dev = &dev_priv->drm;
Imre Deak40ae4e12016-03-16 14:54:03 +02004395
4396 if (INTEL_INFO(dev_priv)->gen >= 7 && !IS_VALLEYVIEW(dev_priv) &&
4397 !IS_CHERRYVIEW(dev_priv))
4398 dev_priv->num_fence_regs = 32;
4399 else if (INTEL_INFO(dev_priv)->gen >= 4 || IS_I945G(dev_priv) ||
4400 IS_I945GM(dev_priv) || IS_G33(dev_priv))
4401 dev_priv->num_fence_regs = 16;
4402 else
4403 dev_priv->num_fence_regs = 8;
4404
Chris Wilsonc0336662016-05-06 15:40:21 +01004405 if (intel_vgpu_active(dev_priv))
Imre Deak40ae4e12016-03-16 14:54:03 +02004406 dev_priv->num_fence_regs =
4407 I915_READ(vgtif_reg(avail_rs.fence_num));
4408
4409 /* Initialize fence registers to zero */
4410 i915_gem_restore_fences(dev);
4411
4412 i915_gem_detect_bit_6_swizzle(dev);
4413}
4414
4415void
Imre Deakd64aa092016-01-19 15:26:29 +02004416i915_gem_load_init(struct drm_device *dev)
Eric Anholt673a3942008-07-30 12:06:12 -07004417{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004418 struct drm_i915_private *dev_priv = to_i915(dev);
Chris Wilson42dcedd2012-11-15 11:32:30 +00004419 int i;
4420
Chris Wilsonefab6d82015-04-07 16:20:57 +01004421 dev_priv->objects =
Chris Wilson42dcedd2012-11-15 11:32:30 +00004422 kmem_cache_create("i915_gem_object",
4423 sizeof(struct drm_i915_gem_object), 0,
4424 SLAB_HWCACHE_ALIGN,
4425 NULL);
Chris Wilsone20d2ab2015-04-07 16:20:58 +01004426 dev_priv->vmas =
4427 kmem_cache_create("i915_gem_vma",
4428 sizeof(struct i915_vma), 0,
4429 SLAB_HWCACHE_ALIGN,
4430 NULL);
Chris Wilsonefab6d82015-04-07 16:20:57 +01004431 dev_priv->requests =
4432 kmem_cache_create("i915_gem_request",
4433 sizeof(struct drm_i915_gem_request), 0,
4434 SLAB_HWCACHE_ALIGN,
4435 NULL);
Eric Anholt673a3942008-07-30 12:06:12 -07004436
Ben Widawskya33afea2013-09-17 21:12:45 -07004437 INIT_LIST_HEAD(&dev_priv->context_list);
Chris Wilson6c085a72012-08-20 11:40:46 +02004438 INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
4439 INIT_LIST_HEAD(&dev_priv->mm.bound_list);
Eric Anholta09ba7f2009-08-29 12:49:51 -07004440 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
Tvrtko Ursulin666796d2016-03-16 11:00:39 +00004441 for (i = 0; i < I915_NUM_ENGINES; i++)
4442 init_engine_lists(&dev_priv->engine[i]);
Daniel Vetter4b9de732011-10-09 21:52:02 +02004443 for (i = 0; i < I915_MAX_NUM_FENCES; i++)
Daniel Vetter007cc8a2010-04-28 11:02:31 +02004444 INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
Chris Wilson67d97da2016-07-04 08:08:31 +01004445 INIT_DELAYED_WORK(&dev_priv->gt.retire_work,
Eric Anholt673a3942008-07-30 12:06:12 -07004446 i915_gem_retire_work_handler);
Chris Wilson67d97da2016-07-04 08:08:31 +01004447 INIT_DELAYED_WORK(&dev_priv->gt.idle_work,
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004448 i915_gem_idle_work_handler);
Chris Wilson1f15b762016-07-01 17:23:14 +01004449 init_waitqueue_head(&dev_priv->gpu_error.wait_queue);
Daniel Vetter1f83fee2012-11-15 17:17:22 +01004450 init_waitqueue_head(&dev_priv->gpu_error.reset_queue);
Chris Wilson31169712009-09-14 16:50:28 +01004451
Chris Wilson72bfa192010-12-19 11:42:05 +00004452 dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
4453
Chris Wilson19b2dbd2013-06-12 10:15:12 +01004454 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
Eric Anholt10ed13e2011-05-06 13:53:49 -07004455
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05004456 init_waitqueue_head(&dev_priv->pending_flip_queue);
Chris Wilson17250b72010-10-28 12:51:39 +01004457
Chris Wilsonce453d82011-02-21 14:43:56 +00004458 dev_priv->mm.interruptible = true;
4459
Chris Wilsonb5add952016-08-04 16:32:36 +01004460 spin_lock_init(&dev_priv->fb_tracking.lock);
Eric Anholt673a3942008-07-30 12:06:12 -07004461}
Dave Airlie71acb5e2008-12-30 20:31:46 +10004462
Imre Deakd64aa092016-01-19 15:26:29 +02004463void i915_gem_load_cleanup(struct drm_device *dev)
4464{
4465 struct drm_i915_private *dev_priv = to_i915(dev);
4466
4467 kmem_cache_destroy(dev_priv->requests);
4468 kmem_cache_destroy(dev_priv->vmas);
4469 kmem_cache_destroy(dev_priv->objects);
4470}
4471
Chris Wilson461fb992016-05-14 07:26:33 +01004472int i915_gem_freeze_late(struct drm_i915_private *dev_priv)
4473{
4474 struct drm_i915_gem_object *obj;
4475
4476 /* Called just before we write the hibernation image.
4477 *
4478 * We need to update the domain tracking to reflect that the CPU
4479 * will be accessing all the pages to create and restore from the
4480 * hibernation, and so upon restoration those pages will be in the
4481 * CPU domain.
4482 *
4483 * To make sure the hibernation image contains the latest state,
4484 * we update that state just before writing out the image.
4485 */
4486
4487 list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) {
4488 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
4489 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
4490 }
4491
4492 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
4493 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
4494 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
4495 }
4496
4497 return 0;
4498}
4499
Chris Wilsonf787a5f2010-09-24 16:02:42 +01004500void i915_gem_release(struct drm_device *dev, struct drm_file *file)
Eric Anholtb9624422009-06-03 07:27:35 +00004501{
Chris Wilsonf787a5f2010-09-24 16:02:42 +01004502 struct drm_i915_file_private *file_priv = file->driver_priv;
Chris Wilson15f7bbc2016-07-26 12:01:52 +01004503 struct drm_i915_gem_request *request;
Eric Anholtb9624422009-06-03 07:27:35 +00004504
4505 /* Clean up our request list when the client is going away, so that
4506 * later retire_requests won't dereference our soon-to-be-gone
4507 * file_priv.
4508 */
Chris Wilson1c255952010-09-26 11:03:27 +01004509 spin_lock(&file_priv->mm.lock);
Chris Wilson15f7bbc2016-07-26 12:01:52 +01004510 list_for_each_entry(request, &file_priv->mm.request_list, client_list)
Chris Wilsonf787a5f2010-09-24 16:02:42 +01004511 request->file_priv = NULL;
Chris Wilson1c255952010-09-26 11:03:27 +01004512 spin_unlock(&file_priv->mm.lock);
Chris Wilson31169712009-09-14 16:50:28 +01004513
Chris Wilson2e1b8732015-04-27 13:41:22 +01004514 if (!list_empty(&file_priv->rps.link)) {
Chris Wilson8d3afd72015-05-21 21:01:47 +01004515 spin_lock(&to_i915(dev)->rps.client_lock);
Chris Wilson2e1b8732015-04-27 13:41:22 +01004516 list_del(&file_priv->rps.link);
Chris Wilson8d3afd72015-05-21 21:01:47 +01004517 spin_unlock(&to_i915(dev)->rps.client_lock);
Chris Wilson1854d5c2015-04-07 16:20:32 +01004518 }
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004519}
4520
4521int i915_gem_open(struct drm_device *dev, struct drm_file *file)
4522{
4523 struct drm_i915_file_private *file_priv;
Ben Widawskye422b8882013-12-06 14:10:58 -08004524 int ret;
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004525
4526 DRM_DEBUG_DRIVER("\n");
4527
4528 file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
4529 if (!file_priv)
4530 return -ENOMEM;
4531
4532 file->driver_priv = file_priv;
Dave Gordonf19ec8c2016-07-04 11:34:37 +01004533 file_priv->dev_priv = to_i915(dev);
Chris Wilsonab0e7ff2014-02-25 17:11:24 +02004534 file_priv->file = file;
Chris Wilson2e1b8732015-04-27 13:41:22 +01004535 INIT_LIST_HEAD(&file_priv->rps.link);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004536
4537 spin_lock_init(&file_priv->mm.lock);
4538 INIT_LIST_HEAD(&file_priv->mm.request_list);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004539
Chris Wilsonc80ff162016-07-27 09:07:27 +01004540 file_priv->bsd_engine = -1;
Tvrtko Ursulinde1add32016-01-15 15:12:50 +00004541
Ben Widawskye422b8882013-12-06 14:10:58 -08004542 ret = i915_gem_context_open(dev, file);
4543 if (ret)
4544 kfree(file_priv);
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004545
Ben Widawskye422b8882013-12-06 14:10:58 -08004546 return ret;
Chris Wilsonb29c19b2013-09-25 17:34:56 +01004547}
4548
Daniel Vetterb680c372014-09-19 18:27:27 +02004549/**
4550 * i915_gem_track_fb - update frontbuffer tracking
Geliang Tangd9072a32015-09-15 05:58:44 -07004551 * @old: current GEM buffer for the frontbuffer slots
4552 * @new: new GEM buffer for the frontbuffer slots
4553 * @frontbuffer_bits: bitmask of frontbuffer slots
Daniel Vetterb680c372014-09-19 18:27:27 +02004554 *
4555 * This updates the frontbuffer tracking bits @frontbuffer_bits by clearing them
4556 * from @old and setting them in @new. Both @old and @new can be NULL.
4557 */
Daniel Vettera071fa02014-06-18 23:28:09 +02004558void i915_gem_track_fb(struct drm_i915_gem_object *old,
4559 struct drm_i915_gem_object *new,
4560 unsigned frontbuffer_bits)
4561{
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004562 /* Control of individual bits within the mask are guarded by
4563 * the owning plane->mutex, i.e. we can never see concurrent
4564 * manipulation of individual bits. But since the bitfield as a whole
4565 * is updated using RMW, we need to use atomics in order to update
4566 * the bits.
4567 */
4568 BUILD_BUG_ON(INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES >
4569 sizeof(atomic_t) * BITS_PER_BYTE);
4570
Daniel Vettera071fa02014-06-18 23:28:09 +02004571 if (old) {
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004572 WARN_ON(!(atomic_read(&old->frontbuffer_bits) & frontbuffer_bits));
4573 atomic_andnot(frontbuffer_bits, &old->frontbuffer_bits);
Daniel Vettera071fa02014-06-18 23:28:09 +02004574 }
4575
4576 if (new) {
Chris Wilsonfaf5bf02016-08-04 16:32:37 +01004577 WARN_ON(atomic_read(&new->frontbuffer_bits) & frontbuffer_bits);
4578 atomic_or(frontbuffer_bits, &new->frontbuffer_bits);
Daniel Vettera071fa02014-06-18 23:28:09 +02004579 }
4580}
4581
Ben Widawskya70a3142013-07-31 16:59:56 -07004582/* All the new VM stuff */
Michel Thierry088e0df2015-08-07 17:40:17 +01004583u64 i915_gem_obj_offset(struct drm_i915_gem_object *o,
4584 struct i915_address_space *vm)
Ben Widawskya70a3142013-07-31 16:59:56 -07004585{
Chris Wilsonfac5e232016-07-04 11:34:36 +01004586 struct drm_i915_private *dev_priv = to_i915(o->base.dev);
Ben Widawskya70a3142013-07-31 16:59:56 -07004587 struct i915_vma *vma;
4588
Daniel Vetter896ab1a2014-08-06 15:04:51 +02004589 WARN_ON(vm == &dev_priv->mm.aliasing_ppgtt->base);
Ben Widawskya70a3142013-07-31 16:59:56 -07004590
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004591 list_for_each_entry(vma, &o->vma_list, obj_link) {
Chris Wilson3272db52016-08-04 16:32:32 +01004592 if (i915_vma_is_ggtt(vma) &&
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004593 vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
4594 continue;
4595 if (vma->vm == vm)
Ben Widawskya70a3142013-07-31 16:59:56 -07004596 return vma->node.start;
Ben Widawskya70a3142013-07-31 16:59:56 -07004597 }
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004598
Daniel Vetterf25748ea2014-06-17 22:34:38 +02004599 WARN(1, "%s vma for this object not found.\n",
4600 i915_is_ggtt(vm) ? "global" : "ppgtt");
Ben Widawskya70a3142013-07-31 16:59:56 -07004601 return -1;
4602}
4603
Michel Thierry088e0df2015-08-07 17:40:17 +01004604u64 i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
4605 const struct i915_ggtt_view *view)
Ben Widawskya70a3142013-07-31 16:59:56 -07004606{
4607 struct i915_vma *vma;
4608
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004609 list_for_each_entry(vma, &o->vma_list, obj_link)
Chris Wilson3272db52016-08-04 16:32:32 +01004610 if (i915_vma_is_ggtt(vma) &&
4611 i915_ggtt_view_equal(&vma->ggtt_view, view))
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004612 return vma->node.start;
4613
Tvrtko Ursulin5678ad72015-03-17 14:45:29 +00004614 WARN(1, "global vma for this object not found. (view=%u)\n", view->type);
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004615 return -1;
4616}
4617
4618bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
4619 struct i915_address_space *vm)
4620{
4621 struct i915_vma *vma;
4622
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004623 list_for_each_entry(vma, &o->vma_list, obj_link) {
Chris Wilson3272db52016-08-04 16:32:32 +01004624 if (i915_vma_is_ggtt(vma) &&
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004625 vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
4626 continue;
4627 if (vma->vm == vm && drm_mm_node_allocated(&vma->node))
4628 return true;
4629 }
4630
4631 return false;
4632}
4633
4634bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
Joonas Lahtinen9abc4642015-03-27 13:09:22 +02004635 const struct i915_ggtt_view *view)
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004636{
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004637 struct i915_vma *vma;
4638
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004639 list_for_each_entry(vma, &o->vma_list, obj_link)
Chris Wilson3272db52016-08-04 16:32:32 +01004640 if (i915_vma_is_ggtt(vma) &&
Joonas Lahtinen9abc4642015-03-27 13:09:22 +02004641 i915_ggtt_view_equal(&vma->ggtt_view, view) &&
Tvrtko Ursulinfe14d5f2014-12-10 17:27:58 +00004642 drm_mm_node_allocated(&vma->node))
Ben Widawskya70a3142013-07-31 16:59:56 -07004643 return true;
4644
4645 return false;
4646}
4647
Tvrtko Ursulin8da32722016-04-21 13:04:43 +01004648unsigned long i915_gem_obj_ggtt_size(struct drm_i915_gem_object *o)
Ben Widawskya70a3142013-07-31 16:59:56 -07004649{
Ben Widawskya70a3142013-07-31 16:59:56 -07004650 struct i915_vma *vma;
4651
Tvrtko Ursulin8da32722016-04-21 13:04:43 +01004652 GEM_BUG_ON(list_empty(&o->vma_list));
Ben Widawskya70a3142013-07-31 16:59:56 -07004653
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004654 list_for_each_entry(vma, &o->vma_list, obj_link) {
Chris Wilson3272db52016-08-04 16:32:32 +01004655 if (i915_vma_is_ggtt(vma) &&
Tvrtko Ursulin8da32722016-04-21 13:04:43 +01004656 vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL)
Ben Widawskya70a3142013-07-31 16:59:56 -07004657 return vma->node.size;
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004658 }
Tvrtko Ursulin8da32722016-04-21 13:04:43 +01004659
Ben Widawskya70a3142013-07-31 16:59:56 -07004660 return 0;
4661}
4662
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004663bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj)
Ben Widawsky5c2abbe2013-09-24 09:57:57 -07004664{
4665 struct i915_vma *vma;
Chris Wilson1c7f4bc2016-02-26 11:03:19 +00004666 list_for_each_entry(vma, &obj->vma_list, obj_link)
Chris Wilson20dfbde2016-08-04 16:32:30 +01004667 if (i915_vma_is_pinned(vma))
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004668 return true;
Joonas Lahtinena6631ae2015-05-06 14:34:58 +03004669
Joonas Lahtinenec7adb62015-03-16 14:11:13 +02004670 return false;
Ben Widawsky5c2abbe2013-09-24 09:57:57 -07004671}
Dave Gordonea702992015-07-09 19:29:02 +01004672
Dave Gordon033908a2015-12-10 18:51:23 +00004673/* Like i915_gem_object_get_page(), but mark the returned page dirty */
4674struct page *
4675i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, int n)
4676{
4677 struct page *page;
4678
4679 /* Only default objects have per-page dirty tracking */
Chris Wilsonb9bcd142016-06-20 15:05:51 +01004680 if (WARN_ON(!i915_gem_object_has_struct_page(obj)))
Dave Gordon033908a2015-12-10 18:51:23 +00004681 return NULL;
4682
4683 page = i915_gem_object_get_page(obj, n);
4684 set_page_dirty(page);
4685 return page;
4686}
4687
Dave Gordonea702992015-07-09 19:29:02 +01004688/* Allocate a new GEM object and fill it with the supplied data */
4689struct drm_i915_gem_object *
4690i915_gem_object_create_from_data(struct drm_device *dev,
4691 const void *data, size_t size)
4692{
4693 struct drm_i915_gem_object *obj;
4694 struct sg_table *sg;
4695 size_t bytes;
4696 int ret;
4697
Dave Gordond37cd8a2016-04-22 19:14:32 +01004698 obj = i915_gem_object_create(dev, round_up(size, PAGE_SIZE));
Chris Wilsonfe3db792016-04-25 13:32:13 +01004699 if (IS_ERR(obj))
Dave Gordonea702992015-07-09 19:29:02 +01004700 return obj;
4701
4702 ret = i915_gem_object_set_to_cpu_domain(obj, true);
4703 if (ret)
4704 goto fail;
4705
4706 ret = i915_gem_object_get_pages(obj);
4707 if (ret)
4708 goto fail;
4709
4710 i915_gem_object_pin_pages(obj);
4711 sg = obj->pages;
4712 bytes = sg_copy_from_buffer(sg->sgl, sg->nents, (void *)data, size);
Dave Gordon9e7d18c2015-12-10 18:51:24 +00004713 obj->dirty = 1; /* Backing store is now out of date */
Dave Gordonea702992015-07-09 19:29:02 +01004714 i915_gem_object_unpin_pages(obj);
4715
4716 if (WARN_ON(bytes != size)) {
4717 DRM_ERROR("Incomplete copy, wrote %zu of %zu", bytes, size);
4718 ret = -EFAULT;
4719 goto fail;
4720 }
4721
4722 return obj;
4723
4724fail:
Chris Wilsonf8c417c2016-07-20 13:31:53 +01004725 i915_gem_object_put(obj);
Dave Gordonea702992015-07-09 19:29:02 +01004726 return ERR_PTR(ret);
4727}