1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright © 2014-2016 Intel Corporation
4 */
5
6 #include <drm/drm_cache.h>
7 #include <drm/drm_panic.h>
8 #include <linux/vmalloc.h>
9
10 #include "display/intel_fb.h"
11 #include "display/intel_display_types.h"
12 #include "gt/intel_gt.h"
13 #include "gt/intel_tlb.h"
14
15 #include "i915_drv.h"
16 #include "i915_gem_object.h"
17 #include "i915_scatterlist.h"
18 #include "i915_gem_lmem.h"
19 #include "i915_gem_mman.h"
20
__i915_gem_object_set_pages(struct drm_i915_gem_object * obj,struct sg_table * pages)21 void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
22 struct sg_table *pages)
23 {
24 struct drm_i915_private *i915 = to_i915(obj->base.dev);
25 unsigned long supported = RUNTIME_INFO(i915)->page_sizes;
26 bool shrinkable;
27 int i;
28
29 assert_object_held_shared(obj);
30
31 if (i915_gem_object_is_volatile(obj))
32 obj->mm.madv = I915_MADV_DONTNEED;
33
34 /* Make the pages coherent with the GPU (flushing any swapin). */
35 if (obj->cache_dirty) {
36 WARN_ON_ONCE(IS_DGFX(i915));
37 obj->write_domain = 0;
38 if (i915_gem_object_has_struct_page(obj))
39 drm_clflush_sg(pages);
40 obj->cache_dirty = false;
41 }
42
43 obj->mm.get_page.sg_pos = pages->sgl;
44 obj->mm.get_page.sg_idx = 0;
45 obj->mm.get_dma_page.sg_pos = pages->sgl;
46 obj->mm.get_dma_page.sg_idx = 0;
47
48 obj->mm.pages = pages;
49
50 obj->mm.page_sizes.phys = i915_sg_dma_sizes(pages->sgl);
51 GEM_BUG_ON(!obj->mm.page_sizes.phys);
52
53 /*
54 * Calculate the supported page-sizes which fit into the given
55 * sg_page_sizes. This will give us the page-sizes which we may be able
56 * to use opportunistically when later inserting into the GTT. For
57 * example if phys=2G, then in theory we should be able to use 1G, 2M,
58 * 64K or 4K pages, although in practice this will depend on a number of
59 * other factors.
60 */
61 obj->mm.page_sizes.sg = 0;
62 for_each_set_bit(i, &supported, ilog2(I915_GTT_MAX_PAGE_SIZE) + 1) {
63 if (obj->mm.page_sizes.phys & ~0u << i)
64 obj->mm.page_sizes.sg |= BIT(i);
65 }
66 GEM_BUG_ON(!HAS_PAGE_SIZES(i915, obj->mm.page_sizes.sg));
67
68 shrinkable = i915_gem_object_is_shrinkable(obj);
69
70 if (i915_gem_object_is_tiled(obj) &&
71 i915->gem_quirks & GEM_QUIRK_PIN_SWIZZLED_PAGES) {
72 GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
73 i915_gem_object_set_tiling_quirk(obj);
74 GEM_BUG_ON(!list_empty(&obj->mm.link));
75 atomic_inc(&obj->mm.shrink_pin);
76 shrinkable = false;
77 }
78
79 if (shrinkable && !i915_gem_object_has_self_managed_shrink_list(obj)) {
80 struct list_head *list;
81 unsigned long flags;
82
83 assert_object_held(obj);
84 spin_lock_irqsave(&i915->mm.obj_lock, flags);
85
86 i915->mm.shrink_count++;
87 i915->mm.shrink_memory += obj->base.size;
88
89 if (obj->mm.madv != I915_MADV_WILLNEED)
90 list = &i915->mm.purge_list;
91 else
92 list = &i915->mm.shrink_list;
93 list_add_tail(&obj->mm.link, list);
94
95 atomic_set(&obj->mm.shrink_pin, 0);
96 spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
97 }
98 }
99
____i915_gem_object_get_pages(struct drm_i915_gem_object * obj)100 int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
101 {
102 struct drm_i915_private *i915 = to_i915(obj->base.dev);
103 int err;
104
105 assert_object_held_shared(obj);
106
107 if (unlikely(obj->mm.madv != I915_MADV_WILLNEED)) {
108 drm_dbg(&i915->drm,
109 "Attempting to obtain a purgeable object\n");
110 return -EFAULT;
111 }
112
113 err = obj->ops->get_pages(obj);
114 GEM_BUG_ON(!err && !i915_gem_object_has_pages(obj));
115
116 return err;
117 }
118
119 /* Ensure that the associated pages are gathered from the backing storage
120 * and pinned into our object. i915_gem_object_pin_pages() may be called
121 * multiple times before they are released by a single call to
122 * i915_gem_object_unpin_pages() - once the pages are no longer referenced
123 * either as a result of memory pressure (reaping pages under the shrinker)
124 * or as the object is itself released.
125 */
__i915_gem_object_get_pages(struct drm_i915_gem_object * obj)126 int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
127 {
128 int err;
129
130 assert_object_held(obj);
131
132 assert_object_held_shared(obj);
133
134 if (unlikely(!i915_gem_object_has_pages(obj))) {
135 GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
136
137 err = ____i915_gem_object_get_pages(obj);
138 if (err)
139 return err;
140
141 smp_mb__before_atomic();
142 }
143 atomic_inc(&obj->mm.pages_pin_count);
144
145 return 0;
146 }
147
i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object * obj)148 int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj)
149 {
150 struct i915_gem_ww_ctx ww;
151 int err;
152
153 i915_gem_ww_ctx_init(&ww, true);
154 retry:
155 err = i915_gem_object_lock(obj, &ww);
156 if (!err)
157 err = i915_gem_object_pin_pages(obj);
158
159 if (err == -EDEADLK) {
160 err = i915_gem_ww_ctx_backoff(&ww);
161 if (!err)
162 goto retry;
163 }
164 i915_gem_ww_ctx_fini(&ww);
165 return err;
166 }
167
168 /* Immediately discard the backing storage */
i915_gem_object_truncate(struct drm_i915_gem_object * obj)169 int i915_gem_object_truncate(struct drm_i915_gem_object *obj)
170 {
171 if (obj->ops->truncate)
172 return obj->ops->truncate(obj);
173
174 return 0;
175 }
176
__i915_gem_object_reset_page_iter(struct drm_i915_gem_object * obj)177 static void __i915_gem_object_reset_page_iter(struct drm_i915_gem_object *obj)
178 {
179 struct radix_tree_iter iter;
180 void __rcu **slot;
181
182 rcu_read_lock();
183 radix_tree_for_each_slot(slot, &obj->mm.get_page.radix, &iter, 0)
184 radix_tree_delete(&obj->mm.get_page.radix, iter.index);
185 radix_tree_for_each_slot(slot, &obj->mm.get_dma_page.radix, &iter, 0)
186 radix_tree_delete(&obj->mm.get_dma_page.radix, iter.index);
187 rcu_read_unlock();
188 }
189
unmap_object(struct drm_i915_gem_object * obj,void * ptr)190 static void unmap_object(struct drm_i915_gem_object *obj, void *ptr)
191 {
192 if (is_vmalloc_addr(ptr))
193 vunmap(ptr);
194 }
195
flush_tlb_invalidate(struct drm_i915_gem_object * obj)196 static void flush_tlb_invalidate(struct drm_i915_gem_object *obj)
197 {
198 struct drm_i915_private *i915 = to_i915(obj->base.dev);
199 struct intel_gt *gt;
200 int id;
201
202 for_each_gt(gt, i915, id) {
203 if (!obj->mm.tlb[id])
204 continue;
205
206 intel_gt_invalidate_tlb_full(gt, obj->mm.tlb[id]);
207 obj->mm.tlb[id] = 0;
208 }
209 }
210
211 struct sg_table *
__i915_gem_object_unset_pages(struct drm_i915_gem_object * obj)212 __i915_gem_object_unset_pages(struct drm_i915_gem_object *obj)
213 {
214 struct sg_table *pages;
215
216 assert_object_held_shared(obj);
217
218 pages = fetch_and_zero(&obj->mm.pages);
219 if (IS_ERR_OR_NULL(pages))
220 return pages;
221
222 if (i915_gem_object_is_volatile(obj))
223 obj->mm.madv = I915_MADV_WILLNEED;
224
225 if (!i915_gem_object_has_self_managed_shrink_list(obj))
226 i915_gem_object_make_unshrinkable(obj);
227
228 if (obj->mm.mapping) {
229 unmap_object(obj, page_mask_bits(obj->mm.mapping));
230 obj->mm.mapping = NULL;
231 }
232
233 __i915_gem_object_reset_page_iter(obj);
234 obj->mm.page_sizes.phys = obj->mm.page_sizes.sg = 0;
235
236 flush_tlb_invalidate(obj);
237
238 return pages;
239 }
240
__i915_gem_object_put_pages(struct drm_i915_gem_object * obj)241 int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
242 {
243 struct sg_table *pages;
244
245 if (i915_gem_object_has_pinned_pages(obj))
246 return -EBUSY;
247
248 /* May be called by shrinker from within get_pages() (on another bo) */
249 assert_object_held_shared(obj);
250
251 i915_gem_object_release_mmap_offset(obj);
252
253 /*
254 * ->put_pages might need to allocate memory for the bit17 swizzle
255 * array, hence protect them from being reaped by removing them from gtt
256 * lists early.
257 */
258 pages = __i915_gem_object_unset_pages(obj);
259
260 /*
261 * XXX Temporary hijinx to avoid updating all backends to handle
262 * NULL pages. In the future, when we have more asynchronous
263 * get_pages backends we should be better able to handle the
264 * cancellation of the async task in a more uniform manner.
265 */
266 if (!IS_ERR_OR_NULL(pages))
267 obj->ops->put_pages(obj, pages);
268
269 return 0;
270 }
271
272 /* The 'mapping' part of i915_gem_object_pin_map() below */
i915_gem_object_map_page(struct drm_i915_gem_object * obj,enum i915_map_type type)273 static void *i915_gem_object_map_page(struct drm_i915_gem_object *obj,
274 enum i915_map_type type)
275 {
276 unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
277 struct page *stack[32], **pages = stack, *page;
278 struct sgt_iter iter;
279 pgprot_t pgprot;
280 void *vaddr;
281
282 switch (type) {
283 default:
284 MISSING_CASE(type);
285 fallthrough; /* to use PAGE_KERNEL anyway */
286 case I915_MAP_WB:
287 /*
288 * On 32b, highmem using a finite set of indirect PTE (i.e.
289 * vmap) to provide virtual mappings of the high pages.
290 * As these are finite, map_new_virtual() must wait for some
291 * other kmap() to finish when it runs out. If we map a large
292 * number of objects, there is no method for it to tell us
293 * to release the mappings, and we deadlock.
294 *
295 * However, if we make an explicit vmap of the page, that
296 * uses a larger vmalloc arena, and also has the ability
297 * to tell us to release unwanted mappings. Most importantly,
298 * it will fail and propagate an error instead of waiting
299 * forever.
300 *
301 * So if the page is beyond the 32b boundary, make an explicit
302 * vmap.
303 */
304 if (n_pages == 1 && !PageHighMem(sg_page(obj->mm.pages->sgl)))
305 return page_address(sg_page(obj->mm.pages->sgl));
306 pgprot = PAGE_KERNEL;
307 break;
308 case I915_MAP_WC:
309 pgprot = pgprot_writecombine(PAGE_KERNEL_IO);
310 break;
311 }
312
313 if (n_pages > ARRAY_SIZE(stack)) {
314 /* Too big for stack -- allocate temporary array instead */
315 pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL);
316 if (!pages)
317 return ERR_PTR(-ENOMEM);
318 }
319
320 i = 0;
321 for_each_sgt_page(page, iter, obj->mm.pages)
322 pages[i++] = page;
323 vaddr = vmap(pages, n_pages, 0, pgprot);
324 if (pages != stack)
325 kvfree(pages);
326
327 return vaddr ?: ERR_PTR(-ENOMEM);
328 }
329
i915_gem_object_map_pfn(struct drm_i915_gem_object * obj,enum i915_map_type type)330 static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
331 enum i915_map_type type)
332 {
333 resource_size_t iomap = obj->mm.region->iomap.base -
334 obj->mm.region->region.start;
335 unsigned long n_pfn = obj->base.size >> PAGE_SHIFT;
336 unsigned long stack[32], *pfns = stack, i;
337 struct sgt_iter iter;
338 dma_addr_t addr;
339 void *vaddr;
340
341 GEM_BUG_ON(type != I915_MAP_WC);
342
343 if (n_pfn > ARRAY_SIZE(stack)) {
344 /* Too big for stack -- allocate temporary array instead */
345 pfns = kvmalloc_array(n_pfn, sizeof(*pfns), GFP_KERNEL);
346 if (!pfns)
347 return ERR_PTR(-ENOMEM);
348 }
349
350 i = 0;
351 for_each_sgt_daddr(addr, iter, obj->mm.pages)
352 pfns[i++] = (iomap + addr) >> PAGE_SHIFT;
353 vaddr = vmap_pfn(pfns, n_pfn, pgprot_writecombine(PAGE_KERNEL_IO));
354 if (pfns != stack)
355 kvfree(pfns);
356
357 return vaddr ?: ERR_PTR(-ENOMEM);
358 }
359
360 struct i915_panic_data {
361 struct page **pages;
362 int page;
363 void *vaddr;
364 };
365
366 struct i915_framebuffer {
367 struct intel_framebuffer base;
368 struct i915_panic_data panic;
369 };
370
to_i915_panic_data(struct intel_framebuffer * fb)371 static inline struct i915_panic_data *to_i915_panic_data(struct intel_framebuffer *fb)
372 {
373 return &container_of_const(fb, struct i915_framebuffer, base)->panic;
374 }
375
i915_panic_kunmap(struct i915_panic_data * panic)376 static void i915_panic_kunmap(struct i915_panic_data *panic)
377 {
378 if (panic->vaddr) {
379 drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
380 kunmap_local(panic->vaddr);
381 panic->vaddr = NULL;
382 }
383 }
384
i915_gem_object_panic_pages(struct drm_i915_gem_object * obj)385 static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj)
386 {
387 unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
388 struct page *page;
389 struct page **pages;
390 struct sgt_iter iter;
391
392 /* For a 3840x2160 32 bits Framebuffer, this should require ~64K */
393 pages = kmalloc_array(n_pages, sizeof(*pages), GFP_ATOMIC);
394 if (!pages)
395 return NULL;
396
397 i = 0;
398 for_each_sgt_page(page, iter, obj->mm.pages)
399 pages[i++] = page;
400 return pages;
401 }
402
i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer * sb,unsigned int x,unsigned int y,u32 color)403 static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
404 unsigned int y, u32 color)
405 {
406 struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
407 unsigned int offset = fb->panic_tiling(sb->width, x, y);
408
409 iosys_map_wr(&sb->map[0], offset, u32, color);
410 }
411
412 /*
413 * The scanout buffer pages are not mapped, so for each pixel,
414 * use kmap_local_page_try_from_panic() to map the page, and write the pixel.
415 * Try to keep the map from the previous pixel, to avoid too much map/unmap.
416 */
i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer * sb,unsigned int x,unsigned int y,u32 color)417 static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
418 unsigned int y, u32 color)
419 {
420 unsigned int new_page;
421 unsigned int offset;
422 struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
423 struct i915_panic_data *panic = to_i915_panic_data(fb);
424
425 if (fb->panic_tiling)
426 offset = fb->panic_tiling(sb->width, x, y);
427 else
428 offset = y * sb->pitch[0] + x * sb->format->cpp[0];
429
430 new_page = offset >> PAGE_SHIFT;
431 offset = offset % PAGE_SIZE;
432 if (new_page != panic->page) {
433 i915_panic_kunmap(panic);
434 panic->page = new_page;
435 panic->vaddr =
436 kmap_local_page_try_from_panic(panic->pages[panic->page]);
437 }
438 if (panic->vaddr) {
439 u32 *pix = panic->vaddr + offset;
440 *pix = color;
441 }
442 }
443
i915_gem_object_alloc_framebuffer(void)444 struct intel_framebuffer *i915_gem_object_alloc_framebuffer(void)
445 {
446 struct i915_framebuffer *i915_fb;
447
448 i915_fb = kzalloc(sizeof(*i915_fb), GFP_KERNEL);
449 if (i915_fb)
450 return &i915_fb->base;
451 return NULL;
452 }
453
454 /*
455 * Setup the gem framebuffer for drm_panic access.
456 * Use current vaddr if it exists, or setup a list of pages.
457 * pfn is not supported yet.
458 */
i915_gem_object_panic_setup(struct drm_scanout_buffer * sb)459 int i915_gem_object_panic_setup(struct drm_scanout_buffer *sb)
460 {
461 enum i915_map_type has_type;
462 struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
463 struct i915_panic_data *panic = to_i915_panic_data(fb);
464 struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
465 void *ptr;
466
467 ptr = page_unpack_bits(obj->mm.mapping, &has_type);
468 if (ptr) {
469 if (i915_gem_object_has_iomem(obj))
470 iosys_map_set_vaddr_iomem(&sb->map[0], (void __iomem *)ptr);
471 else
472 iosys_map_set_vaddr(&sb->map[0], ptr);
473
474 if (fb->panic_tiling)
475 sb->set_pixel = i915_gem_object_panic_map_set_pixel;
476 return 0;
477 }
478 if (i915_gem_object_has_struct_page(obj)) {
479 panic->pages = i915_gem_object_panic_pages(obj);
480 if (!panic->pages)
481 return -ENOMEM;
482 panic->page = -1;
483 sb->set_pixel = i915_gem_object_panic_page_set_pixel;
484 return 0;
485 }
486 return -EOPNOTSUPP;
487 }
488
i915_gem_object_panic_finish(struct intel_framebuffer * fb)489 void i915_gem_object_panic_finish(struct intel_framebuffer *fb)
490 {
491 struct i915_panic_data *panic = to_i915_panic_data(fb);
492
493 i915_panic_kunmap(panic);
494 panic->page = -1;
495 kfree(panic->pages);
496 panic->pages = NULL;
497 }
498
499 /* get, pin, and map the pages of the object into kernel space */
i915_gem_object_pin_map(struct drm_i915_gem_object * obj,enum i915_map_type type)500 void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
501 enum i915_map_type type)
502 {
503 enum i915_map_type has_type;
504 bool pinned;
505 void *ptr;
506 int err;
507
508 if (!i915_gem_object_has_struct_page(obj) &&
509 !i915_gem_object_has_iomem(obj))
510 return ERR_PTR(-ENXIO);
511
512 if (WARN_ON_ONCE(obj->flags & I915_BO_ALLOC_GPU_ONLY))
513 return ERR_PTR(-EINVAL);
514
515 assert_object_held(obj);
516
517 pinned = !(type & I915_MAP_OVERRIDE);
518 type &= ~I915_MAP_OVERRIDE;
519
520 if (!atomic_inc_not_zero(&obj->mm.pages_pin_count)) {
521 if (unlikely(!i915_gem_object_has_pages(obj))) {
522 GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
523
524 err = ____i915_gem_object_get_pages(obj);
525 if (err)
526 return ERR_PTR(err);
527
528 smp_mb__before_atomic();
529 }
530 atomic_inc(&obj->mm.pages_pin_count);
531 pinned = false;
532 }
533 GEM_BUG_ON(!i915_gem_object_has_pages(obj));
534
535 /*
536 * For discrete our CPU mappings needs to be consistent in order to
537 * function correctly on !x86. When mapping things through TTM, we use
538 * the same rules to determine the caching type.
539 *
540 * The caching rules, starting from DG1:
541 *
542 * - If the object can be placed in device local-memory, then the
543 * pages should be allocated and mapped as write-combined only.
544 *
545 * - Everything else is always allocated and mapped as write-back,
546 * with the guarantee that everything is also coherent with the
547 * GPU.
548 *
549 * Internal users of lmem are already expected to get this right, so no
550 * fudging needed there.
551 */
552 if (i915_gem_object_placement_possible(obj, INTEL_MEMORY_LOCAL)) {
553 if (type != I915_MAP_WC && !obj->mm.n_placements) {
554 ptr = ERR_PTR(-ENODEV);
555 goto err_unpin;
556 }
557
558 type = I915_MAP_WC;
559 } else if (IS_DGFX(to_i915(obj->base.dev))) {
560 type = I915_MAP_WB;
561 }
562
563 ptr = page_unpack_bits(obj->mm.mapping, &has_type);
564 if (ptr && has_type != type) {
565 if (pinned) {
566 ptr = ERR_PTR(-EBUSY);
567 goto err_unpin;
568 }
569
570 unmap_object(obj, ptr);
571
572 ptr = obj->mm.mapping = NULL;
573 }
574
575 if (!ptr) {
576 err = i915_gem_object_wait_moving_fence(obj, true);
577 if (err) {
578 ptr = ERR_PTR(err);
579 goto err_unpin;
580 }
581
582 if (GEM_WARN_ON(type == I915_MAP_WC && !pat_enabled()))
583 ptr = ERR_PTR(-ENODEV);
584 else if (i915_gem_object_has_struct_page(obj))
585 ptr = i915_gem_object_map_page(obj, type);
586 else
587 ptr = i915_gem_object_map_pfn(obj, type);
588 if (IS_ERR(ptr))
589 goto err_unpin;
590
591 obj->mm.mapping = page_pack_bits(ptr, type);
592 }
593
594 return ptr;
595
596 err_unpin:
597 atomic_dec(&obj->mm.pages_pin_count);
598 return ptr;
599 }
600
i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object * obj,enum i915_map_type type)601 void *i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
602 enum i915_map_type type)
603 {
604 void *ret;
605
606 i915_gem_object_lock(obj, NULL);
607 ret = i915_gem_object_pin_map(obj, type);
608 i915_gem_object_unlock(obj);
609
610 return ret;
611 }
612
__i915_gem_object_flush_map(struct drm_i915_gem_object * obj,unsigned long offset,unsigned long size)613 void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
614 unsigned long offset,
615 unsigned long size)
616 {
617 enum i915_map_type has_type;
618 void *ptr;
619
620 GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
621 GEM_BUG_ON(range_overflows_t(typeof(obj->base.size),
622 offset, size, obj->base.size));
623
624 wmb(); /* let all previous writes be visible to coherent partners */
625 obj->mm.dirty = true;
626
627 if (obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE)
628 return;
629
630 ptr = page_unpack_bits(obj->mm.mapping, &has_type);
631 if (has_type == I915_MAP_WC)
632 return;
633
634 drm_clflush_virt_range(ptr + offset, size);
635 if (size == obj->base.size) {
636 obj->write_domain &= ~I915_GEM_DOMAIN_CPU;
637 obj->cache_dirty = false;
638 }
639 }
640
__i915_gem_object_release_map(struct drm_i915_gem_object * obj)641 void __i915_gem_object_release_map(struct drm_i915_gem_object *obj)
642 {
643 GEM_BUG_ON(!obj->mm.mapping);
644
645 /*
646 * We allow removing the mapping from underneath pinned pages!
647 *
648 * Furthermore, since this is an unsafe operation reserved only
649 * for construction time manipulation, we ignore locking prudence.
650 */
651 unmap_object(obj, page_mask_bits(fetch_and_zero(&obj->mm.mapping)));
652
653 i915_gem_object_unpin_map(obj);
654 }
655
656 struct scatterlist *
__i915_gem_object_page_iter_get_sg(struct drm_i915_gem_object * obj,struct i915_gem_object_page_iter * iter,pgoff_t n,unsigned int * offset)657 __i915_gem_object_page_iter_get_sg(struct drm_i915_gem_object *obj,
658 struct i915_gem_object_page_iter *iter,
659 pgoff_t n,
660 unsigned int *offset)
661
662 {
663 const bool dma = iter == &obj->mm.get_dma_page ||
664 iter == &obj->ttm.get_io_page;
665 unsigned int idx, count;
666 struct scatterlist *sg;
667
668 might_sleep();
669 GEM_BUG_ON(n >= obj->base.size >> PAGE_SHIFT);
670 if (!i915_gem_object_has_pinned_pages(obj))
671 assert_object_held(obj);
672
673 /* As we iterate forward through the sg, we record each entry in a
674 * radixtree for quick repeated (backwards) lookups. If we have seen
675 * this index previously, we will have an entry for it.
676 *
677 * Initial lookup is O(N), but this is amortized to O(1) for
678 * sequential page access (where each new request is consecutive
679 * to the previous one). Repeated lookups are O(lg(obj->base.size)),
680 * i.e. O(1) with a large constant!
681 */
682 if (n < READ_ONCE(iter->sg_idx))
683 goto lookup;
684
685 mutex_lock(&iter->lock);
686
687 /* We prefer to reuse the last sg so that repeated lookup of this
688 * (or the subsequent) sg are fast - comparing against the last
689 * sg is faster than going through the radixtree.
690 */
691
692 sg = iter->sg_pos;
693 idx = iter->sg_idx;
694 count = dma ? __sg_dma_page_count(sg) : __sg_page_count(sg);
695
696 while (idx + count <= n) {
697 void *entry;
698 unsigned long i;
699 int ret;
700
701 /* If we cannot allocate and insert this entry, or the
702 * individual pages from this range, cancel updating the
703 * sg_idx so that on this lookup we are forced to linearly
704 * scan onwards, but on future lookups we will try the
705 * insertion again (in which case we need to be careful of
706 * the error return reporting that we have already inserted
707 * this index).
708 */
709 ret = radix_tree_insert(&iter->radix, idx, sg);
710 if (ret && ret != -EEXIST)
711 goto scan;
712
713 entry = xa_mk_value(idx);
714 for (i = 1; i < count; i++) {
715 ret = radix_tree_insert(&iter->radix, idx + i, entry);
716 if (ret && ret != -EEXIST)
717 goto scan;
718 }
719
720 idx += count;
721 sg = ____sg_next(sg);
722 count = dma ? __sg_dma_page_count(sg) : __sg_page_count(sg);
723 }
724
725 scan:
726 iter->sg_pos = sg;
727 iter->sg_idx = idx;
728
729 mutex_unlock(&iter->lock);
730
731 if (unlikely(n < idx)) /* insertion completed by another thread */
732 goto lookup;
733
734 /* In case we failed to insert the entry into the radixtree, we need
735 * to look beyond the current sg.
736 */
737 while (idx + count <= n) {
738 idx += count;
739 sg = ____sg_next(sg);
740 count = dma ? __sg_dma_page_count(sg) : __sg_page_count(sg);
741 }
742
743 *offset = n - idx;
744 return sg;
745
746 lookup:
747 rcu_read_lock();
748
749 sg = radix_tree_lookup(&iter->radix, n);
750 GEM_BUG_ON(!sg);
751
752 /* If this index is in the middle of multi-page sg entry,
753 * the radix tree will contain a value entry that points
754 * to the start of that range. We will return the pointer to
755 * the base page and the offset of this page within the
756 * sg entry's range.
757 */
758 *offset = 0;
759 if (unlikely(xa_is_value(sg))) {
760 unsigned long base = xa_to_value(sg);
761
762 sg = radix_tree_lookup(&iter->radix, base);
763 GEM_BUG_ON(!sg);
764
765 *offset = n - base;
766 }
767
768 rcu_read_unlock();
769
770 return sg;
771 }
772
773 struct page *
__i915_gem_object_get_page(struct drm_i915_gem_object * obj,pgoff_t n)774 __i915_gem_object_get_page(struct drm_i915_gem_object *obj, pgoff_t n)
775 {
776 struct scatterlist *sg;
777 unsigned int offset;
778
779 GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
780
781 sg = i915_gem_object_get_sg(obj, n, &offset);
782 return nth_page(sg_page(sg), offset);
783 }
784
785 /* Like i915_gem_object_get_page(), but mark the returned page dirty */
786 struct page *
__i915_gem_object_get_dirty_page(struct drm_i915_gem_object * obj,pgoff_t n)787 __i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, pgoff_t n)
788 {
789 struct page *page;
790
791 page = i915_gem_object_get_page(obj, n);
792 if (!obj->mm.dirty)
793 set_page_dirty(page);
794
795 return page;
796 }
797
798 dma_addr_t
__i915_gem_object_get_dma_address_len(struct drm_i915_gem_object * obj,pgoff_t n,unsigned int * len)799 __i915_gem_object_get_dma_address_len(struct drm_i915_gem_object *obj,
800 pgoff_t n, unsigned int *len)
801 {
802 struct scatterlist *sg;
803 unsigned int offset;
804
805 sg = i915_gem_object_get_sg_dma(obj, n, &offset);
806
807 if (len)
808 *len = sg_dma_len(sg) - (offset << PAGE_SHIFT);
809
810 return sg_dma_address(sg) + (offset << PAGE_SHIFT);
811 }
812
813 dma_addr_t
__i915_gem_object_get_dma_address(struct drm_i915_gem_object * obj,pgoff_t n)814 __i915_gem_object_get_dma_address(struct drm_i915_gem_object *obj, pgoff_t n)
815 {
816 return i915_gem_object_get_dma_address_len(obj, n, NULL);
817 }
818