1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2024 Intel Corporation 4 */ 5 6 #include <linux/pci-p2pdma.h> 7 8 #include <drm/drm_drv.h> 9 #include <drm/drm_managed.h> 10 #include <drm/drm_pagemap.h> 11 #include <drm/drm_pagemap_util.h> 12 13 #include "xe_bo.h" 14 #include "xe_exec_queue_types.h" 15 #include "xe_gt_stats.h" 16 #include "xe_migrate.h" 17 #include "xe_module.h" 18 #include "xe_pm.h" 19 #include "xe_pt.h" 20 #include "xe_svm.h" 21 #include "xe_tile.h" 22 #include "xe_tlb_inval.h" 23 #include "xe_ttm_vram_mgr.h" 24 #include "xe_vm.h" 25 #include "xe_vm_types.h" 26 #include "xe_vram_types.h" 27 28 /* Identifies subclasses of struct drm_pagemap_peer */ 29 #define XE_PEER_PAGEMAP ((void *)0ul) 30 #define XE_PEER_VM ((void *)1ul) 31 32 /** 33 * DOC: drm_pagemap reference-counting in xe: 34 * 35 * In addition to the drm_pagemap internal reference counting by its zone 36 * device data, the xe driver holds the following long-time references: 37 * 38 * - struct xe_pagemap: 39 * The xe_pagemap struct derives from struct drm_pagemap and uses its 40 * reference count. 41 * - SVM-enabled VMs: 42 * SVM-enabled VMs look up and keeps a reference to all xe_pagemaps on 43 * the same device. 44 * - VMAs: 45 * vmas keep a reference on the drm_pagemap indicated by a gpu_madvise() 46 * call. 47 * 48 * In addition, all drm_pagemap or xe_pagemap pointers where lifetime cannot 49 * be guaranteed by a vma reference under the vm lock should keep a reference. 50 * That includes the range->pages.dpagemap pointer. 51 */ 52 53 static int xe_svm_get_pagemaps(struct xe_vm *vm); 54 55 void *xe_svm_private_page_owner(struct xe_vm *vm, bool force_smem) 56 { 57 return force_smem ? NULL : vm->svm.peer.owner; 58 } 59 60 static bool xe_svm_range_in_vram(struct xe_svm_range *range) 61 { 62 /* 63 * Advisory only check whether the range is currently backed by VRAM 64 * memory. 65 */ 66 67 struct drm_gpusvm_pages_flags flags = { 68 /* Pairs with WRITE_ONCE in drm_gpusvm.c */ 69 .__flags = READ_ONCE(range->base.pages.flags.__flags), 70 }; 71 72 return flags.has_devmem_pages; 73 } 74 75 static bool xe_svm_range_has_vram_binding(struct xe_svm_range *range) 76 { 77 /* Not reliable without notifier lock */ 78 return xe_svm_range_in_vram(range) && range->tile_present; 79 } 80 81 static struct xe_vm *gpusvm_to_vm(struct drm_gpusvm *gpusvm) 82 { 83 return container_of(gpusvm, struct xe_vm, svm.gpusvm); 84 } 85 86 static struct xe_vm *range_to_vm(struct drm_gpusvm_range *r) 87 { 88 return gpusvm_to_vm(r->gpusvm); 89 } 90 91 #define range_debug(r__, operation__) \ 92 vm_dbg(&range_to_vm(&(r__)->base)->xe->drm, \ 93 "%s: asid=%u, gpusvm=%p, vram=%d,%d, seqno=%lu, " \ 94 "start=0x%014lx, end=0x%014lx, size=%lu", \ 95 (operation__), range_to_vm(&(r__)->base)->usm.asid, \ 96 (r__)->base.gpusvm, \ 97 xe_svm_range_in_vram((r__)) ? 1 : 0, \ 98 xe_svm_range_has_vram_binding((r__)) ? 1 : 0, \ 99 (r__)->base.pages.notifier_seq, \ 100 xe_svm_range_start((r__)), xe_svm_range_end((r__)), \ 101 xe_svm_range_size((r__))) 102 103 void xe_svm_range_debug(struct xe_svm_range *range, const char *operation) 104 { 105 range_debug(range, operation); 106 } 107 108 static struct drm_gpusvm_range * 109 xe_svm_range_alloc(struct drm_gpusvm *gpusvm) 110 { 111 struct xe_svm_range *range; 112 113 range = kzalloc_obj(*range); 114 if (!range) 115 return NULL; 116 117 INIT_LIST_HEAD(&range->garbage_collector_link); 118 xe_vm_get(gpusvm_to_vm(gpusvm)); 119 120 return &range->base; 121 } 122 123 static void xe_svm_range_free(struct drm_gpusvm_range *range) 124 { 125 xe_vm_put(range_to_vm(range)); 126 kfree(range); 127 } 128 129 static void 130 xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range, 131 const struct mmu_notifier_range *mmu_range) 132 { 133 struct xe_device *xe = vm->xe; 134 135 range_debug(range, "GARBAGE COLLECTOR ADD"); 136 137 drm_gpusvm_range_set_unmapped(&range->base, mmu_range); 138 139 spin_lock(&vm->svm.garbage_collector.lock); 140 if (list_empty(&range->garbage_collector_link)) 141 list_add_tail(&range->garbage_collector_link, 142 &vm->svm.garbage_collector.range_list); 143 spin_unlock(&vm->svm.garbage_collector.lock); 144 145 queue_work(xe->usm.pf_wq, &vm->svm.garbage_collector.work); 146 } 147 148 static void xe_svm_tlb_inval_count_stats_incr(struct xe_gt *gt) 149 { 150 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_COUNT, 1); 151 } 152 153 static u8 154 xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct drm_gpusvm_range *r, 155 const struct mmu_notifier_range *mmu_range, 156 u64 *adj_start, u64 *adj_end) 157 { 158 struct xe_svm_range *range = to_xe_range(r); 159 struct xe_device *xe = vm->xe; 160 struct xe_tile *tile; 161 u8 tile_mask = 0; 162 u8 id; 163 164 xe_svm_assert_in_notifier(vm); 165 166 range_debug(range, "NOTIFIER"); 167 168 /* Skip if already unmapped or if no binding exist */ 169 if (range->base.pages.flags.unmapped || !range->tile_present) 170 return 0; 171 172 range_debug(range, "NOTIFIER - EXECUTE"); 173 174 /* Adjust invalidation to range boundaries */ 175 *adj_start = min(xe_svm_range_start(range), mmu_range->start); 176 *adj_end = max(xe_svm_range_end(range), mmu_range->end); 177 178 /* 179 * XXX: Ideally would zap PTEs in one shot in xe_svm_invalidate but the 180 * invalidation code can't correctly cope with sparse ranges or 181 * invalidations spanning multiple ranges. 182 */ 183 for_each_tile(tile, xe, id) 184 if (xe_pt_zap_ptes_range(tile, vm, range)) { 185 /* 186 * WRITE_ONCE pairs with READ_ONCE in 187 * xe_vm_has_valid_gpu_mapping() 188 */ 189 WRITE_ONCE(range->tile_invalidated, 190 range->tile_invalidated | BIT(id)); 191 192 if (!(tile_mask & BIT(id))) { 193 xe_svm_tlb_inval_count_stats_incr(tile->primary_gt); 194 if (tile->media_gt) 195 xe_svm_tlb_inval_count_stats_incr(tile->media_gt); 196 tile_mask |= BIT(id); 197 } 198 } 199 200 return tile_mask; 201 } 202 203 static void 204 xe_svm_range_notifier_event_end(struct xe_vm *vm, struct drm_gpusvm_range *r, 205 const struct mmu_notifier_range *mmu_range) 206 { 207 struct drm_gpusvm_ctx ctx = { .in_notifier = true, }; 208 209 xe_svm_assert_in_notifier(vm); 210 211 drm_gpusvm_range_unmap_pages(&vm->svm.gpusvm, r, &ctx); 212 if (!xe_vm_is_closed(vm) && mmu_range->event == MMU_NOTIFY_UNMAP) 213 xe_svm_garbage_collector_add_range(vm, to_xe_range(r), 214 mmu_range); 215 } 216 217 static void xe_svm_tlb_inval_us_stats_incr(struct xe_gt *gt, ktime_t start) 218 { 219 s64 us_delta = xe_gt_stats_ktime_us_delta(start); 220 221 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_TLB_INVAL_US, us_delta); 222 } 223 224 static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, 225 struct drm_gpusvm_notifier *notifier, 226 const struct mmu_notifier_range *mmu_range) 227 { 228 struct xe_vm *vm = gpusvm_to_vm(gpusvm); 229 struct xe_tlb_inval_batch batch; 230 struct xe_device *xe = vm->xe; 231 struct drm_gpusvm_range *r, *first; 232 struct xe_tile *tile; 233 ktime_t start = xe_gt_stats_ktime_get(); 234 u64 adj_start = mmu_range->start, adj_end = mmu_range->end; 235 u8 tile_mask = 0, id; 236 long err; 237 238 xe_svm_assert_in_notifier(vm); 239 240 vm_dbg(&gpusvm_to_vm(gpusvm)->xe->drm, 241 "INVALIDATE: asid=%u, gpusvm=%p, seqno=%lu, start=0x%016lx, end=0x%016lx, event=%d", 242 vm->usm.asid, gpusvm, notifier->notifier.invalidate_seq, 243 mmu_range->start, mmu_range->end, mmu_range->event); 244 245 /* Adjust invalidation to notifier boundaries */ 246 adj_start = max(drm_gpusvm_notifier_start(notifier), adj_start); 247 adj_end = min(drm_gpusvm_notifier_end(notifier), adj_end); 248 249 first = drm_gpusvm_range_find(notifier, adj_start, adj_end); 250 if (!first) 251 return; 252 253 /* 254 * PTs may be getting destroyed so not safe to touch these but PT should 255 * be invalidated at this point in time. Regardless we still need to 256 * ensure any dma mappings are unmapped in the here. 257 */ 258 if (xe_vm_is_closed(vm)) 259 goto range_notifier_event_end; 260 261 /* 262 * XXX: Less than ideal to always wait on VM's resv slots if an 263 * invalidation is not required. Could walk range list twice to figure 264 * out if an invalidations is need, but also not ideal. 265 */ 266 err = dma_resv_wait_timeout(xe_vm_resv(vm), 267 DMA_RESV_USAGE_BOOKKEEP, 268 false, MAX_SCHEDULE_TIMEOUT); 269 XE_WARN_ON(err <= 0); 270 271 r = first; 272 drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) 273 tile_mask |= xe_svm_range_notifier_event_begin(vm, r, mmu_range, 274 &adj_start, 275 &adj_end); 276 if (!tile_mask) 277 goto range_notifier_event_end; 278 279 xe_device_wmb(xe); 280 281 err = xe_tlb_inval_range_tilemask_submit(xe, vm->usm.asid, adj_start, adj_end, 282 tile_mask, &batch); 283 if (!WARN_ON_ONCE(err)) 284 xe_tlb_inval_batch_wait(&batch); 285 286 range_notifier_event_end: 287 r = first; 288 drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) 289 xe_svm_range_notifier_event_end(vm, r, mmu_range); 290 for_each_tile(tile, xe, id) { 291 if (tile_mask & BIT(id)) { 292 xe_svm_tlb_inval_us_stats_incr(tile->primary_gt, start); 293 if (tile->media_gt) 294 xe_svm_tlb_inval_us_stats_incr(tile->media_gt, start); 295 } 296 } 297 } 298 299 static int __xe_svm_garbage_collector(struct xe_vm *vm, 300 struct xe_svm_range *range) 301 { 302 struct dma_fence *fence; 303 304 range_debug(range, "GARBAGE COLLECTOR"); 305 306 xe_vm_lock(vm, false); 307 fence = xe_vm_range_unbind(vm, range); 308 xe_vm_unlock(vm); 309 if (IS_ERR(fence)) 310 return PTR_ERR(fence); 311 dma_fence_put(fence); 312 313 drm_gpusvm_range_remove(&vm->svm.gpusvm, &range->base); 314 315 return 0; 316 } 317 318 static void xe_vma_set_default_attributes(struct xe_vma *vma) 319 { 320 struct xe_vma_mem_attr default_attr = { 321 .preferred_loc.devmem_fd = DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE, 322 .preferred_loc.migration_policy = DRM_XE_MIGRATE_ALL_PAGES, 323 .pat_index = vma->attr.default_pat_index, 324 .atomic_access = DRM_XE_ATOMIC_UNDEFINED, 325 }; 326 327 xe_vma_mem_attr_copy(&vma->attr, &default_attr); 328 } 329 330 static int xe_svm_range_set_default_attr(struct xe_vm *vm, u64 start, u64 end) 331 { 332 struct xe_vma *vma; 333 bool has_default_attr; 334 int err; 335 336 vma = xe_vm_find_vma_by_addr(vm, start); 337 if (!vma) 338 return -EINVAL; 339 340 if (!(vma->gpuva.flags & XE_VMA_MADV_AUTORESET)) { 341 drm_dbg(&vm->xe->drm, "Skipping madvise reset for vma.\n"); 342 return 0; 343 } 344 345 vm_dbg(&vm->xe->drm, "Existing VMA start=0x%016llx, vma_end=0x%016llx", 346 xe_vma_start(vma), xe_vma_end(vma)); 347 348 has_default_attr = xe_vma_has_default_mem_attrs(vma); 349 350 if (has_default_attr) { 351 start = xe_vma_start(vma); 352 end = xe_vma_end(vma); 353 } else if (xe_vma_start(vma) == start && xe_vma_end(vma) == end) { 354 xe_vma_set_default_attributes(vma); 355 } 356 357 xe_vm_find_cpu_addr_mirror_vma_range(vm, &start, &end); 358 359 if (xe_vma_start(vma) == start && xe_vma_end(vma) == end && has_default_attr) 360 return 0; 361 362 vm_dbg(&vm->xe->drm, "New VMA start=0x%016llx, vma_end=0x%016llx", start, end); 363 364 err = xe_vm_alloc_cpu_addr_mirror_vma(vm, start, end - start); 365 if (err) { 366 drm_warn(&vm->xe->drm, "New VMA MAP failed: %pe\n", ERR_PTR(err)); 367 xe_vm_kill(vm, true); 368 return err; 369 } 370 371 /* 372 * On call from xe_svm_handle_pagefault original VMA might be changed 373 * signal this to lookup for VMA again. 374 */ 375 return -EAGAIN; 376 } 377 378 static int xe_svm_garbage_collector(struct xe_vm *vm) 379 { 380 struct xe_svm_range *range; 381 u64 range_start; 382 u64 range_end; 383 int err, ret = 0; 384 385 lockdep_assert_held_write(&vm->lock); 386 387 if (xe_vm_is_closed_or_banned(vm)) 388 return -ENOENT; 389 390 for (;;) { 391 spin_lock(&vm->svm.garbage_collector.lock); 392 range = list_first_entry_or_null(&vm->svm.garbage_collector.range_list, 393 typeof(*range), 394 garbage_collector_link); 395 if (!range) 396 break; 397 398 range_start = xe_svm_range_start(range); 399 range_end = xe_svm_range_end(range); 400 401 list_del(&range->garbage_collector_link); 402 spin_unlock(&vm->svm.garbage_collector.lock); 403 404 err = __xe_svm_garbage_collector(vm, range); 405 if (err) { 406 drm_warn(&vm->xe->drm, 407 "Garbage collection failed: %pe\n", 408 ERR_PTR(err)); 409 xe_vm_kill(vm, true); 410 return err; 411 } 412 413 err = xe_svm_range_set_default_attr(vm, range_start, range_end); 414 if (err) { 415 if (err == -EAGAIN) 416 ret = -EAGAIN; 417 else 418 return err; 419 } 420 } 421 spin_unlock(&vm->svm.garbage_collector.lock); 422 423 return ret; 424 } 425 426 static void xe_svm_garbage_collector_work_func(struct work_struct *w) 427 { 428 struct xe_vm *vm = container_of(w, struct xe_vm, 429 svm.garbage_collector.work); 430 431 down_write(&vm->lock); 432 xe_svm_garbage_collector(vm); 433 up_write(&vm->lock); 434 } 435 436 #if IS_ENABLED(CONFIG_DRM_XE_PAGEMAP) 437 438 static struct xe_vram_region *xe_pagemap_to_vr(struct xe_pagemap *xpagemap) 439 { 440 return xpagemap->vr; 441 } 442 443 static struct xe_pagemap *xe_page_to_pagemap(struct page *page) 444 { 445 return container_of(page_pgmap(page), struct xe_pagemap, pagemap); 446 } 447 448 static struct xe_vram_region *xe_page_to_vr(struct page *page) 449 { 450 return xe_pagemap_to_vr(xe_page_to_pagemap(page)); 451 } 452 453 static u64 xe_page_to_dpa(struct page *page) 454 { 455 struct xe_pagemap *xpagemap = xe_page_to_pagemap(page); 456 struct xe_vram_region *vr = xe_pagemap_to_vr(xpagemap); 457 u64 hpa_base = xpagemap->hpa_base; 458 u64 pfn = page_to_pfn(page); 459 u64 offset; 460 u64 dpa; 461 462 xe_assert(vr->xe, is_device_private_page(page)); 463 xe_assert(vr->xe, (pfn << PAGE_SHIFT) >= hpa_base); 464 465 offset = (pfn << PAGE_SHIFT) - hpa_base; 466 dpa = vr->dpa_base + offset; 467 468 return dpa; 469 } 470 471 static u64 xe_page_to_pcie(struct page *page) 472 { 473 struct xe_pagemap *xpagemap = xe_page_to_pagemap(page); 474 struct xe_vram_region *vr = xe_pagemap_to_vr(xpagemap); 475 476 return xe_page_to_dpa(page) - vr->dpa_base + vr->io_start; 477 } 478 479 enum xe_svm_copy_dir { 480 XE_SVM_COPY_TO_VRAM, 481 XE_SVM_COPY_TO_SRAM, 482 }; 483 484 static void xe_svm_copy_kb_stats_incr(struct xe_gt *gt, 485 const enum xe_svm_copy_dir dir, 486 int kb) 487 { 488 if (dir == XE_SVM_COPY_TO_VRAM) 489 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_KB, kb); 490 else 491 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_KB, kb); 492 } 493 494 static void xe_svm_copy_us_stats_incr(struct xe_gt *gt, 495 const enum xe_svm_copy_dir dir, 496 unsigned long npages, 497 ktime_t start) 498 { 499 s64 us_delta = xe_gt_stats_ktime_us_delta(start); 500 501 if (dir == XE_SVM_COPY_TO_VRAM) { 502 switch (npages) { 503 case 1: 504 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_DEVICE_COPY_US, 505 us_delta); 506 break; 507 case 16: 508 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_DEVICE_COPY_US, 509 us_delta); 510 break; 511 case 512: 512 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_DEVICE_COPY_US, 513 us_delta); 514 break; 515 } 516 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_DEVICE_COPY_US, 517 us_delta); 518 } else { 519 switch (npages) { 520 case 1: 521 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_CPU_COPY_US, 522 us_delta); 523 break; 524 case 16: 525 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_CPU_COPY_US, 526 us_delta); 527 break; 528 case 512: 529 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_CPU_COPY_US, 530 us_delta); 531 break; 532 } 533 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_CPU_COPY_US, 534 us_delta); 535 } 536 } 537 538 static int xe_svm_copy(struct page **pages, 539 struct drm_pagemap_addr *pagemap_addr, 540 unsigned long npages, const enum xe_svm_copy_dir dir, 541 struct dma_fence *pre_migrate_fence) 542 { 543 struct xe_vram_region *vr = NULL; 544 struct xe_gt *gt = NULL; 545 struct xe_device *xe; 546 struct dma_fence *fence = NULL; 547 unsigned long i; 548 #define XE_VRAM_ADDR_INVALID ~0x0ull 549 u64 vram_addr = XE_VRAM_ADDR_INVALID; 550 int err = 0, pos = 0; 551 bool sram = dir == XE_SVM_COPY_TO_SRAM; 552 ktime_t start = xe_gt_stats_ktime_get(); 553 554 /* 555 * This flow is complex: it locates physically contiguous device pages, 556 * derives the starting physical address, and performs a single GPU copy 557 * to for every 8M chunk in a DMA address array. Both device pages and 558 * DMA addresses may be sparsely populated. If either is NULL, a copy is 559 * triggered based on the current search state. The last GPU copy is 560 * waited on to ensure all copies are complete. 561 */ 562 563 for (i = 0; i < npages; ++i) { 564 struct page *spage = pages[i]; 565 struct dma_fence *__fence; 566 u64 __vram_addr; 567 bool match = false, chunk, last; 568 569 #define XE_MIGRATE_CHUNK_SIZE SZ_8M 570 chunk = (i - pos) == (XE_MIGRATE_CHUNK_SIZE / PAGE_SIZE); 571 last = (i + 1) == npages; 572 573 /* No CPU page and no device pages queue'd to copy */ 574 if (!pagemap_addr[i].addr && vram_addr == XE_VRAM_ADDR_INVALID) 575 continue; 576 577 if (!vr && spage) { 578 vr = xe_page_to_vr(spage); 579 gt = xe_migrate_exec_queue(vr->migrate)->gt; 580 xe = vr->xe; 581 } 582 XE_WARN_ON(spage && xe_page_to_vr(spage) != vr); 583 584 /* 585 * CPU page and device page valid, capture physical address on 586 * first device page, check if physical contiguous on subsequent 587 * device pages. 588 */ 589 if (pagemap_addr[i].addr && spage) { 590 __vram_addr = xe_page_to_dpa(spage); 591 if (vram_addr == XE_VRAM_ADDR_INVALID) { 592 vram_addr = __vram_addr; 593 pos = i; 594 } 595 596 match = vram_addr + PAGE_SIZE * (i - pos) == __vram_addr; 597 /* Expected with contiguous memory */ 598 xe_assert(vr->xe, match); 599 600 if (pagemap_addr[i].order) { 601 i += NR_PAGES(pagemap_addr[i].order) - 1; 602 chunk = (i - pos) == (XE_MIGRATE_CHUNK_SIZE / PAGE_SIZE); 603 last = (i + 1) == npages; 604 } 605 } 606 607 /* 608 * Mismatched physical address, 8M copy chunk, or last page - 609 * trigger a copy. 610 */ 611 if (!match || chunk || last) { 612 /* 613 * Extra page for first copy if last page and matching 614 * physical address. 615 */ 616 int incr = (match && last) ? 1 : 0; 617 618 if (vram_addr != XE_VRAM_ADDR_INVALID) { 619 xe_svm_copy_kb_stats_incr(gt, dir, 620 (i - pos + incr) * 621 (PAGE_SIZE / SZ_1K)); 622 if (sram) { 623 vm_dbg(&xe->drm, 624 "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", 625 vram_addr, 626 (u64)pagemap_addr[pos].addr, i - pos + incr); 627 __fence = xe_migrate_from_vram(vr->migrate, 628 i - pos + incr, 629 vram_addr, 630 &pagemap_addr[pos], 631 pre_migrate_fence); 632 } else { 633 vm_dbg(&xe->drm, 634 "COPY TO VRAM - 0x%016llx -> 0x%016llx, NPAGES=%ld", 635 (u64)pagemap_addr[pos].addr, vram_addr, 636 i - pos + incr); 637 __fence = xe_migrate_to_vram(vr->migrate, 638 i - pos + incr, 639 &pagemap_addr[pos], 640 vram_addr, 641 pre_migrate_fence); 642 } 643 if (IS_ERR(__fence)) { 644 err = PTR_ERR(__fence); 645 goto err_out; 646 } 647 pre_migrate_fence = NULL; 648 dma_fence_put(fence); 649 fence = __fence; 650 } 651 652 /* Setup physical address of next device page */ 653 if (pagemap_addr[i].addr && spage) { 654 vram_addr = __vram_addr; 655 pos = i; 656 } else { 657 vram_addr = XE_VRAM_ADDR_INVALID; 658 } 659 660 /* Extra mismatched device page, copy it */ 661 if (!match && last && vram_addr != XE_VRAM_ADDR_INVALID) { 662 xe_svm_copy_kb_stats_incr(gt, dir, 663 (PAGE_SIZE / SZ_1K)); 664 if (sram) { 665 vm_dbg(&xe->drm, 666 "COPY TO SRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", 667 vram_addr, (u64)pagemap_addr[pos].addr, 1); 668 __fence = xe_migrate_from_vram(vr->migrate, 1, 669 vram_addr, 670 &pagemap_addr[pos], 671 pre_migrate_fence); 672 } else { 673 vm_dbg(&xe->drm, 674 "COPY TO VRAM - 0x%016llx -> 0x%016llx, NPAGES=%d", 675 (u64)pagemap_addr[pos].addr, vram_addr, 1); 676 __fence = xe_migrate_to_vram(vr->migrate, 1, 677 &pagemap_addr[pos], 678 vram_addr, 679 pre_migrate_fence); 680 } 681 if (IS_ERR(__fence)) { 682 err = PTR_ERR(__fence); 683 goto err_out; 684 } 685 pre_migrate_fence = NULL; 686 dma_fence_put(fence); 687 fence = __fence; 688 } 689 } 690 } 691 692 err_out: 693 /* Wait for all copies to complete */ 694 if (fence) { 695 dma_fence_wait(fence, false); 696 dma_fence_put(fence); 697 } 698 if (pre_migrate_fence) 699 dma_fence_wait(pre_migrate_fence, false); 700 701 /* 702 * XXX: We can't derive the GT here (or anywhere in this functions, but 703 * compute always uses the primary GT so accumulate stats on the likely 704 * GT of the fault. 705 */ 706 if (gt) 707 xe_svm_copy_us_stats_incr(gt, dir, npages, start); 708 709 return err; 710 #undef XE_MIGRATE_CHUNK_SIZE 711 #undef XE_VRAM_ADDR_INVALID 712 } 713 714 static int xe_svm_copy_to_devmem(struct page **pages, 715 struct drm_pagemap_addr *pagemap_addr, 716 unsigned long npages, 717 struct dma_fence *pre_migrate_fence) 718 { 719 return xe_svm_copy(pages, pagemap_addr, npages, XE_SVM_COPY_TO_VRAM, 720 pre_migrate_fence); 721 } 722 723 static int xe_svm_copy_to_ram(struct page **pages, 724 struct drm_pagemap_addr *pagemap_addr, 725 unsigned long npages, 726 struct dma_fence *pre_migrate_fence) 727 { 728 return xe_svm_copy(pages, pagemap_addr, npages, XE_SVM_COPY_TO_SRAM, 729 pre_migrate_fence); 730 } 731 732 static struct xe_bo *to_xe_bo(struct drm_pagemap_devmem *devmem_allocation) 733 { 734 return container_of(devmem_allocation, struct xe_bo, devmem_allocation); 735 } 736 737 static void xe_svm_devmem_release(struct drm_pagemap_devmem *devmem_allocation) 738 { 739 struct xe_bo *bo = to_xe_bo(devmem_allocation); 740 struct xe_device *xe = xe_bo_device(bo); 741 742 dma_fence_put(devmem_allocation->pre_migrate_fence); 743 xe_bo_put_async(bo); 744 xe_pm_runtime_put(xe); 745 } 746 747 static u64 block_offset_to_pfn(struct drm_pagemap *dpagemap, u64 offset) 748 { 749 struct xe_pagemap *xpagemap = container_of(dpagemap, typeof(*xpagemap), dpagemap); 750 751 return PHYS_PFN(offset + xpagemap->hpa_base); 752 } 753 754 static struct gpu_buddy *vram_to_buddy(struct xe_vram_region *vram) 755 { 756 return &vram->ttm.mm; 757 } 758 759 static int xe_svm_populate_devmem_pfn(struct drm_pagemap_devmem *devmem_allocation, 760 unsigned long npages, unsigned long *pfn) 761 { 762 struct xe_bo *bo = to_xe_bo(devmem_allocation); 763 struct ttm_resource *res = bo->ttm.resource; 764 struct list_head *blocks = &to_xe_ttm_vram_mgr_resource(res)->blocks; 765 struct gpu_buddy_block *block; 766 int j = 0; 767 768 list_for_each_entry(block, blocks, link) { 769 struct xe_vram_region *vr = block->private; 770 struct gpu_buddy *buddy = vram_to_buddy(vr); 771 u64 block_pfn = block_offset_to_pfn(devmem_allocation->dpagemap, 772 gpu_buddy_block_offset(block)); 773 int i; 774 775 for (i = 0; i < gpu_buddy_block_size(buddy, block) >> PAGE_SHIFT; ++i) 776 pfn[j++] = block_pfn + i; 777 } 778 779 return 0; 780 } 781 782 static const struct drm_pagemap_devmem_ops dpagemap_devmem_ops = { 783 .devmem_release = xe_svm_devmem_release, 784 .populate_devmem_pfn = xe_svm_populate_devmem_pfn, 785 .copy_to_devmem = xe_svm_copy_to_devmem, 786 .copy_to_ram = xe_svm_copy_to_ram, 787 }; 788 789 #else 790 static int xe_svm_get_pagemaps(struct xe_vm *vm) 791 { 792 return 0; 793 } 794 #endif 795 796 static const struct drm_gpusvm_ops gpusvm_ops = { 797 .range_alloc = xe_svm_range_alloc, 798 .range_free = xe_svm_range_free, 799 .invalidate = xe_svm_invalidate, 800 }; 801 802 static const unsigned long fault_chunk_sizes[] = { 803 SZ_2M, 804 SZ_64K, 805 SZ_4K, 806 }; 807 808 static void xe_pagemap_put(struct xe_pagemap *xpagemap) 809 { 810 drm_pagemap_put(&xpagemap->dpagemap); 811 } 812 813 static void xe_svm_put_pagemaps(struct xe_vm *vm) 814 { 815 struct xe_device *xe = vm->xe; 816 struct xe_tile *tile; 817 int id; 818 819 for_each_tile(tile, xe, id) { 820 struct xe_pagemap *xpagemap = vm->svm.pagemaps[id]; 821 822 if (xpagemap) 823 xe_pagemap_put(xpagemap); 824 vm->svm.pagemaps[id] = NULL; 825 } 826 } 827 828 static struct device *xe_peer_to_dev(struct drm_pagemap_peer *peer) 829 { 830 if (peer->private == XE_PEER_PAGEMAP) 831 return container_of(peer, struct xe_pagemap, peer)->dpagemap.drm->dev; 832 833 return container_of(peer, struct xe_vm, svm.peer)->xe->drm.dev; 834 } 835 836 static bool xe_has_interconnect(struct drm_pagemap_peer *peer1, 837 struct drm_pagemap_peer *peer2) 838 { 839 struct device *dev1 = xe_peer_to_dev(peer1); 840 struct device *dev2 = xe_peer_to_dev(peer2); 841 842 if (dev1 == dev2) 843 return true; 844 845 return pci_p2pdma_distance(to_pci_dev(dev1), dev2, true) >= 0; 846 } 847 848 static DRM_PAGEMAP_OWNER_LIST_DEFINE(xe_owner_list); 849 850 /** 851 * xe_svm_init() - SVM initialize 852 * @vm: The VM. 853 * 854 * Initialize SVM state which is embedded within the VM. 855 * 856 * Return: 0 on success, negative error code on error. 857 */ 858 int xe_svm_init(struct xe_vm *vm) 859 { 860 int err; 861 862 if (vm->flags & XE_VM_FLAG_FAULT_MODE) { 863 spin_lock_init(&vm->svm.garbage_collector.lock); 864 INIT_LIST_HEAD(&vm->svm.garbage_collector.range_list); 865 INIT_WORK(&vm->svm.garbage_collector.work, 866 xe_svm_garbage_collector_work_func); 867 868 vm->svm.peer.private = XE_PEER_VM; 869 err = drm_pagemap_acquire_owner(&vm->svm.peer, &xe_owner_list, 870 xe_has_interconnect); 871 if (err) 872 return err; 873 874 err = xe_svm_get_pagemaps(vm); 875 if (err) { 876 drm_pagemap_release_owner(&vm->svm.peer); 877 return err; 878 } 879 880 err = drm_gpusvm_init(&vm->svm.gpusvm, "Xe SVM", &vm->xe->drm, 881 current->mm, 0, vm->size, 882 xe_modparam.svm_notifier_size * SZ_1M, 883 &gpusvm_ops, fault_chunk_sizes, 884 ARRAY_SIZE(fault_chunk_sizes)); 885 drm_gpusvm_driver_set_lock(&vm->svm.gpusvm, &vm->lock); 886 887 if (err) { 888 xe_svm_put_pagemaps(vm); 889 drm_pagemap_release_owner(&vm->svm.peer); 890 return err; 891 } 892 } else { 893 err = drm_gpusvm_init(&vm->svm.gpusvm, "Xe SVM (simple)", 894 &vm->xe->drm, NULL, 0, 0, 0, NULL, 895 NULL, 0); 896 } 897 898 return err; 899 } 900 901 /** 902 * xe_svm_close() - SVM close 903 * @vm: The VM. 904 * 905 * Close SVM state (i.e., stop and flush all SVM actions). 906 */ 907 void xe_svm_close(struct xe_vm *vm) 908 { 909 xe_assert(vm->xe, xe_vm_is_closed(vm)); 910 flush_work(&vm->svm.garbage_collector.work); 911 xe_svm_put_pagemaps(vm); 912 drm_pagemap_release_owner(&vm->svm.peer); 913 } 914 915 /** 916 * xe_svm_fini() - SVM finalize 917 * @vm: The VM. 918 * 919 * Finalize SVM state which is embedded within the VM. 920 */ 921 void xe_svm_fini(struct xe_vm *vm) 922 { 923 xe_assert(vm->xe, xe_vm_is_closed(vm)); 924 925 drm_gpusvm_fini(&vm->svm.gpusvm); 926 } 927 928 static bool xe_svm_range_has_pagemap_locked(const struct xe_svm_range *range, 929 const struct drm_pagemap *dpagemap) 930 { 931 return range->base.pages.dpagemap == dpagemap; 932 } 933 934 static bool xe_svm_range_has_pagemap(struct xe_svm_range *range, 935 const struct drm_pagemap *dpagemap) 936 { 937 struct xe_vm *vm = range_to_vm(&range->base); 938 bool ret; 939 940 xe_svm_notifier_lock(vm); 941 ret = xe_svm_range_has_pagemap_locked(range, dpagemap); 942 xe_svm_notifier_unlock(vm); 943 944 return ret; 945 } 946 947 static bool xe_svm_range_is_valid(struct xe_svm_range *range, 948 struct xe_tile *tile, 949 bool devmem_only, 950 const struct drm_pagemap *dpagemap) 951 952 { 953 return (xe_vm_has_valid_gpu_mapping(tile, range->tile_present, 954 range->tile_invalidated) && 955 (!devmem_only || xe_svm_range_has_pagemap(range, dpagemap))); 956 } 957 958 /** xe_svm_range_migrate_to_smem() - Move range pages from VRAM to SMEM 959 * @vm: xe_vm pointer 960 * @range: Pointer to the SVM range structure 961 * 962 * The xe_svm_range_migrate_to_smem() checks range has pages in VRAM 963 * and migrates them to SMEM 964 */ 965 void xe_svm_range_migrate_to_smem(struct xe_vm *vm, struct xe_svm_range *range) 966 { 967 if (xe_svm_range_in_vram(range)) 968 drm_gpusvm_range_evict(&vm->svm.gpusvm, &range->base); 969 } 970 971 /** 972 * xe_svm_range_validate() - Check if the SVM range is valid 973 * @vm: xe_vm pointer 974 * @range: Pointer to the SVM range structure 975 * @tile_mask: Mask representing the tiles to be checked 976 * @dpagemap: if !%NULL, the range is expected to be present 977 * in device memory identified by this parameter. 978 * 979 * The xe_svm_range_validate() function checks if a range is 980 * valid and located in the desired memory region. 981 * 982 * Return: true if the range is valid, false otherwise 983 */ 984 bool xe_svm_range_validate(struct xe_vm *vm, 985 struct xe_svm_range *range, 986 u8 tile_mask, const struct drm_pagemap *dpagemap) 987 { 988 bool ret; 989 990 xe_svm_notifier_lock(vm); 991 992 ret = (range->tile_present & ~range->tile_invalidated & tile_mask) == tile_mask; 993 if (dpagemap) 994 ret = ret && xe_svm_range_has_pagemap_locked(range, dpagemap); 995 else 996 ret = ret && !range->base.pages.dpagemap; 997 998 xe_svm_notifier_unlock(vm); 999 1000 return ret; 1001 } 1002 1003 /** 1004 * xe_svm_find_vma_start - Find start of CPU VMA 1005 * @vm: xe_vm pointer 1006 * @start: start address 1007 * @end: end address 1008 * @vma: Pointer to struct xe_vma 1009 * 1010 * 1011 * This function searches for a cpu vma, within the specified 1012 * range [start, end] in the given VM. It adjusts the range based on the 1013 * xe_vma start and end addresses. If no cpu VMA is found, it returns ULONG_MAX. 1014 * 1015 * Return: The starting address of the VMA within the range, 1016 * or ULONG_MAX if no VMA is found 1017 */ 1018 u64 xe_svm_find_vma_start(struct xe_vm *vm, u64 start, u64 end, struct xe_vma *vma) 1019 { 1020 return drm_gpusvm_find_vma_start(&vm->svm.gpusvm, 1021 max(start, xe_vma_start(vma)), 1022 min(end, xe_vma_end(vma))); 1023 } 1024 1025 #if IS_ENABLED(CONFIG_DRM_XE_PAGEMAP) 1026 static int xe_drm_pagemap_populate_mm(struct drm_pagemap *dpagemap, 1027 unsigned long start, unsigned long end, 1028 struct mm_struct *mm, 1029 unsigned long timeslice_ms) 1030 { 1031 struct xe_pagemap *xpagemap = container_of(dpagemap, typeof(*xpagemap), dpagemap); 1032 struct drm_pagemap_migrate_details mdetails = { 1033 .timeslice_ms = timeslice_ms, 1034 .source_peer_migrates = 1, 1035 }; 1036 struct xe_vram_region *vr = xe_pagemap_to_vr(xpagemap); 1037 struct dma_fence *pre_migrate_fence = NULL; 1038 struct xe_device *xe = vr->xe; 1039 struct device *dev = xe->drm.dev; 1040 struct gpu_buddy_block *block; 1041 struct xe_validation_ctx vctx; 1042 struct list_head *blocks; 1043 struct drm_exec exec; 1044 struct xe_bo *bo; 1045 int err = 0, idx; 1046 1047 if (!drm_dev_enter(&xe->drm, &idx)) 1048 return -ENODEV; 1049 1050 xe_pm_runtime_get(xe); 1051 1052 xe_validation_guard(&vctx, &xe->val, &exec, (struct xe_val_flags) {}, err) { 1053 bo = xe_bo_create_locked(xe, NULL, NULL, end - start, 1054 ttm_bo_type_device, 1055 (IS_DGFX(xe) ? XE_BO_FLAG_VRAM(vr) : XE_BO_FLAG_SYSTEM) | 1056 XE_BO_FLAG_CPU_ADDR_MIRROR, &exec); 1057 drm_exec_retry_on_contention(&exec); 1058 if (IS_ERR(bo)) { 1059 err = PTR_ERR(bo); 1060 xe_validation_retry_on_oom(&vctx, &err); 1061 break; 1062 } 1063 1064 /* Ensure that any clearing or async eviction will complete before migration. */ 1065 if (!dma_resv_test_signaled(bo->ttm.base.resv, DMA_RESV_USAGE_KERNEL)) { 1066 err = dma_resv_get_singleton(bo->ttm.base.resv, DMA_RESV_USAGE_KERNEL, 1067 &pre_migrate_fence); 1068 if (err) 1069 dma_resv_wait_timeout(bo->ttm.base.resv, DMA_RESV_USAGE_KERNEL, 1070 false, MAX_SCHEDULE_TIMEOUT); 1071 else if (pre_migrate_fence) 1072 dma_fence_enable_sw_signaling(pre_migrate_fence); 1073 } 1074 1075 drm_pagemap_devmem_init(&bo->devmem_allocation, dev, mm, 1076 &dpagemap_devmem_ops, dpagemap, end - start, 1077 pre_migrate_fence); 1078 1079 blocks = &to_xe_ttm_vram_mgr_resource(bo->ttm.resource)->blocks; 1080 list_for_each_entry(block, blocks, link) 1081 block->private = vr; 1082 1083 xe_bo_get(bo); 1084 1085 /* Ensure the device has a pm ref while there are device pages active. */ 1086 xe_pm_runtime_get_noresume(xe); 1087 /* Consumes the devmem allocation ref. */ 1088 err = drm_pagemap_migrate_to_devmem(&bo->devmem_allocation, mm, 1089 start, end, &mdetails); 1090 xe_bo_unlock(bo); 1091 xe_bo_put(bo); 1092 } 1093 xe_pm_runtime_put(xe); 1094 drm_dev_exit(idx); 1095 1096 return err; 1097 } 1098 #endif 1099 1100 static bool supports_4K_migration(struct xe_device *xe) 1101 { 1102 if (xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) 1103 return false; 1104 1105 return true; 1106 } 1107 1108 /** 1109 * xe_svm_range_needs_migrate_to_vram() - SVM range needs migrate to VRAM or not 1110 * @range: SVM range for which migration needs to be decided 1111 * @vma: vma which has range 1112 * @dpagemap: The preferred struct drm_pagemap to migrate to. 1113 * 1114 * Return: True for range needing migration and migration is supported else false 1115 */ 1116 bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vma *vma, 1117 const struct drm_pagemap *dpagemap) 1118 { 1119 struct xe_vm *vm = range_to_vm(&range->base); 1120 u64 range_size = xe_svm_range_size(range); 1121 1122 if (!range->base.pages.flags.migrate_devmem || !dpagemap) 1123 return false; 1124 1125 xe_assert(vm->xe, IS_DGFX(vm->xe)); 1126 1127 if (xe_svm_range_has_pagemap(range, dpagemap)) { 1128 drm_dbg(&vm->xe->drm, "Range is already in VRAM\n"); 1129 return false; 1130 } 1131 1132 if (range_size < SZ_64K && !supports_4K_migration(vm->xe)) { 1133 drm_dbg(&vm->xe->drm, "Platform doesn't support SZ_4K range migration\n"); 1134 return false; 1135 } 1136 1137 return true; 1138 } 1139 1140 #define DECL_SVM_RANGE_COUNT_STATS(elem, stat) \ 1141 static void xe_svm_range_##elem##_count_stats_incr(struct xe_gt *gt, \ 1142 struct xe_svm_range *range) \ 1143 { \ 1144 switch (xe_svm_range_size(range)) { \ 1145 case SZ_4K: \ 1146 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_##stat##_COUNT, 1); \ 1147 break; \ 1148 case SZ_64K: \ 1149 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_##stat##_COUNT, 1); \ 1150 break; \ 1151 case SZ_2M: \ 1152 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_##stat##_COUNT, 1); \ 1153 break; \ 1154 } \ 1155 } \ 1156 1157 DECL_SVM_RANGE_COUNT_STATS(fault, PAGEFAULT) 1158 DECL_SVM_RANGE_COUNT_STATS(valid_fault, VALID_PAGEFAULT) 1159 DECL_SVM_RANGE_COUNT_STATS(migrate, MIGRATE) 1160 1161 #define DECL_SVM_RANGE_US_STATS(elem, stat) \ 1162 static void xe_svm_range_##elem##_us_stats_incr(struct xe_gt *gt, \ 1163 struct xe_svm_range *range, \ 1164 ktime_t start) \ 1165 { \ 1166 s64 us_delta = xe_gt_stats_ktime_us_delta(start); \ 1167 \ 1168 switch (xe_svm_range_size(range)) { \ 1169 case SZ_4K: \ 1170 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_4K_##stat##_US, \ 1171 us_delta); \ 1172 break; \ 1173 case SZ_64K: \ 1174 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_64K_##stat##_US, \ 1175 us_delta); \ 1176 break; \ 1177 case SZ_2M: \ 1178 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_2M_##stat##_US, \ 1179 us_delta); \ 1180 break; \ 1181 } \ 1182 } \ 1183 1184 DECL_SVM_RANGE_US_STATS(migrate, MIGRATE) 1185 DECL_SVM_RANGE_US_STATS(get_pages, GET_PAGES) 1186 DECL_SVM_RANGE_US_STATS(bind, BIND) 1187 DECL_SVM_RANGE_US_STATS(fault, PAGEFAULT) 1188 1189 static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, 1190 struct xe_gt *gt, u64 fault_addr, 1191 bool need_vram) 1192 { 1193 int devmem_possible = IS_DGFX(vm->xe) && 1194 IS_ENABLED(CONFIG_DRM_XE_PAGEMAP); 1195 struct drm_gpusvm_ctx ctx = { 1196 .read_only = xe_vma_read_only(vma), 1197 .devmem_possible = devmem_possible, 1198 .check_pages_threshold = devmem_possible ? SZ_64K : 0, 1199 .devmem_only = need_vram && devmem_possible, 1200 .timeslice_ms = need_vram && devmem_possible ? 1201 vm->xe->atomic_svm_timeslice_ms : 0, 1202 }; 1203 struct xe_validation_ctx vctx; 1204 struct drm_exec exec; 1205 struct xe_svm_range *range; 1206 struct dma_fence *fence; 1207 struct drm_pagemap *dpagemap; 1208 struct xe_tile *tile = gt_to_tile(gt); 1209 int migrate_try_count = ctx.devmem_only ? 3 : 1; 1210 ktime_t start = xe_gt_stats_ktime_get(), bind_start, get_pages_start; 1211 int err; 1212 1213 lockdep_assert_held_write(&vm->lock); 1214 xe_assert(vm->xe, xe_vma_is_cpu_addr_mirror(vma)); 1215 1216 xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, 1); 1217 1218 retry: 1219 /* Always process UNMAPs first so view SVM ranges is current */ 1220 err = xe_svm_garbage_collector(vm); 1221 if (err) 1222 return err; 1223 1224 dpagemap = ctx.devmem_only ? xe_tile_local_pagemap(tile) : 1225 xe_vma_resolve_pagemap(vma, tile); 1226 ctx.device_private_page_owner = xe_svm_private_page_owner(vm, !dpagemap); 1227 range = xe_svm_range_find_or_insert(vm, fault_addr, vma, &ctx); 1228 1229 if (IS_ERR(range)) 1230 return PTR_ERR(range); 1231 1232 xe_svm_range_fault_count_stats_incr(gt, range); 1233 1234 if (ctx.devmem_only && !range->base.pages.flags.migrate_devmem) { 1235 err = -EACCES; 1236 goto out; 1237 } 1238 1239 if (xe_svm_range_is_valid(range, tile, ctx.devmem_only, dpagemap)) { 1240 xe_svm_range_valid_fault_count_stats_incr(gt, range); 1241 range_debug(range, "PAGE FAULT - VALID"); 1242 goto out; 1243 } 1244 1245 range_debug(range, "PAGE FAULT"); 1246 1247 if (--migrate_try_count >= 0 && 1248 xe_svm_range_needs_migrate_to_vram(range, vma, dpagemap)) { 1249 ktime_t migrate_start = xe_gt_stats_ktime_get(); 1250 1251 xe_svm_range_migrate_count_stats_incr(gt, range); 1252 err = xe_svm_alloc_vram(range, &ctx, dpagemap); 1253 xe_svm_range_migrate_us_stats_incr(gt, range, migrate_start); 1254 ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ 1255 if (err) { 1256 if (migrate_try_count || !ctx.devmem_only) { 1257 drm_dbg(&vm->xe->drm, 1258 "VRAM allocation failed, falling back to retrying fault, asid=%u, errno=%pe\n", 1259 vm->usm.asid, ERR_PTR(err)); 1260 1261 /* 1262 * In the devmem-only case, mixed mappings may 1263 * be found. The get_pages function will fix 1264 * these up to a single location, allowing the 1265 * page fault handler to make forward progress. 1266 */ 1267 if (ctx.devmem_only) 1268 goto get_pages; 1269 else 1270 goto retry; 1271 } else { 1272 drm_err(&vm->xe->drm, 1273 "VRAM allocation failed, retry count exceeded, asid=%u, errno=%pe\n", 1274 vm->usm.asid, ERR_PTR(err)); 1275 return err; 1276 } 1277 } 1278 } 1279 1280 get_pages: 1281 get_pages_start = xe_gt_stats_ktime_get(); 1282 1283 range_debug(range, "GET PAGES"); 1284 err = xe_svm_range_get_pages(vm, range, &ctx); 1285 /* Corner where CPU mappings have changed */ 1286 if (err == -EOPNOTSUPP || err == -EFAULT || err == -EPERM) { 1287 ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ 1288 if (migrate_try_count > 0 || !ctx.devmem_only) { 1289 drm_dbg(&vm->xe->drm, 1290 "Get pages failed, falling back to retrying, asid=%u, gpusvm=%p, errno=%pe\n", 1291 vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err)); 1292 range_debug(range, "PAGE FAULT - RETRY PAGES"); 1293 goto retry; 1294 } else { 1295 drm_err(&vm->xe->drm, 1296 "Get pages failed, retry count exceeded, asid=%u, gpusvm=%p, errno=%pe\n", 1297 vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err)); 1298 } 1299 } 1300 if (err) { 1301 range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT"); 1302 goto out; 1303 } else if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)) { 1304 drm_dbg(&vm->xe->drm, "After page collect data location is %sin \"%s\".\n", 1305 xe_svm_range_has_pagemap(range, dpagemap) ? "" : "NOT ", 1306 dpagemap ? dpagemap->drm->unique : "System."); 1307 } 1308 1309 xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start); 1310 range_debug(range, "PAGE FAULT - BIND"); 1311 1312 bind_start = xe_gt_stats_ktime_get(); 1313 xe_validation_guard(&vctx, &vm->xe->val, &exec, (struct xe_val_flags) {}, err) { 1314 err = xe_vm_drm_exec_lock(vm, &exec); 1315 drm_exec_retry_on_contention(&exec); 1316 1317 xe_vm_set_validation_exec(vm, &exec); 1318 fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id)); 1319 xe_vm_set_validation_exec(vm, NULL); 1320 if (IS_ERR(fence)) { 1321 drm_exec_retry_on_contention(&exec); 1322 err = PTR_ERR(fence); 1323 xe_validation_retry_on_oom(&vctx, &err); 1324 xe_svm_range_bind_us_stats_incr(gt, range, bind_start); 1325 break; 1326 } 1327 } 1328 if (err) 1329 goto err_out; 1330 1331 dma_fence_wait(fence, false); 1332 dma_fence_put(fence); 1333 xe_svm_range_bind_us_stats_incr(gt, range, bind_start); 1334 1335 out: 1336 xe_svm_range_fault_us_stats_incr(gt, range, start); 1337 return 0; 1338 1339 err_out: 1340 if (err == -EAGAIN) { 1341 ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */ 1342 range_debug(range, "PAGE FAULT - RETRY BIND"); 1343 goto retry; 1344 } 1345 1346 return err; 1347 } 1348 1349 /** 1350 * xe_svm_handle_pagefault() - SVM handle page fault 1351 * @vm: The VM. 1352 * @vma: The CPU address mirror VMA. 1353 * @gt: The gt upon the fault occurred. 1354 * @fault_addr: The GPU fault address. 1355 * @atomic: The fault atomic access bit. 1356 * 1357 * Create GPU bindings for a SVM page fault. Optionally migrate to device 1358 * memory. 1359 * 1360 * Return: 0 on success, negative error code on error. 1361 */ 1362 int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma, 1363 struct xe_gt *gt, u64 fault_addr, 1364 bool atomic) 1365 { 1366 int need_vram, ret; 1367 retry: 1368 need_vram = xe_vma_need_vram_for_atomic(vm->xe, vma, atomic); 1369 if (need_vram < 0) 1370 return need_vram; 1371 1372 ret = __xe_svm_handle_pagefault(vm, vma, gt, fault_addr, 1373 need_vram ? true : false); 1374 if (ret == -EAGAIN) { 1375 /* 1376 * Retry once on -EAGAIN to re-lookup the VMA, as the original VMA 1377 * may have been split by xe_svm_range_set_default_attr. 1378 */ 1379 vma = xe_vm_find_vma_by_addr(vm, fault_addr); 1380 if (!vma) 1381 return -EINVAL; 1382 1383 goto retry; 1384 } 1385 return ret; 1386 } 1387 1388 /** 1389 * xe_svm_has_mapping() - SVM has mappings 1390 * @vm: The VM. 1391 * @start: Start address. 1392 * @end: End address. 1393 * 1394 * Check if an address range has SVM mappings. 1395 * 1396 * Return: True if address range has a SVM mapping, False otherwise 1397 */ 1398 bool xe_svm_has_mapping(struct xe_vm *vm, u64 start, u64 end) 1399 { 1400 return drm_gpusvm_has_mapping(&vm->svm.gpusvm, start, end); 1401 } 1402 1403 /** 1404 * xe_svm_unmap_address_range - UNMAP SVM mappings and ranges 1405 * @vm: The VM 1406 * @start: start addr 1407 * @end: end addr 1408 * 1409 * This function UNMAPS svm ranges if start or end address are inside them. 1410 */ 1411 void xe_svm_unmap_address_range(struct xe_vm *vm, u64 start, u64 end) 1412 { 1413 struct drm_gpusvm_notifier *notifier, *next; 1414 1415 lockdep_assert_held_write(&vm->lock); 1416 1417 drm_gpusvm_for_each_notifier_safe(notifier, next, &vm->svm.gpusvm, start, end) { 1418 struct drm_gpusvm_range *range, *__next; 1419 1420 drm_gpusvm_for_each_range_safe(range, __next, notifier, start, end) { 1421 if (start > drm_gpusvm_range_start(range) || 1422 end < drm_gpusvm_range_end(range)) { 1423 if (IS_DGFX(vm->xe) && xe_svm_range_in_vram(to_xe_range(range))) 1424 drm_gpusvm_range_evict(&vm->svm.gpusvm, range); 1425 drm_gpusvm_range_get(range); 1426 __xe_svm_garbage_collector(vm, to_xe_range(range)); 1427 if (!list_empty(&to_xe_range(range)->garbage_collector_link)) { 1428 spin_lock(&vm->svm.garbage_collector.lock); 1429 list_del(&to_xe_range(range)->garbage_collector_link); 1430 spin_unlock(&vm->svm.garbage_collector.lock); 1431 } 1432 drm_gpusvm_range_put(range); 1433 } 1434 } 1435 } 1436 } 1437 1438 /** 1439 * xe_svm_bo_evict() - SVM evict BO to system memory 1440 * @bo: BO to evict 1441 * 1442 * SVM evict BO to system memory. GPU SVM layer ensures all device pages 1443 * are evicted before returning. 1444 * 1445 * Return: 0 on success standard error code otherwise 1446 */ 1447 int xe_svm_bo_evict(struct xe_bo *bo) 1448 { 1449 return drm_pagemap_evict_to_ram(&bo->devmem_allocation); 1450 } 1451 1452 /** 1453 * xe_svm_range_find_or_insert- Find or insert GPU SVM range 1454 * @vm: xe_vm pointer 1455 * @addr: address for which range needs to be found/inserted 1456 * @vma: Pointer to struct xe_vma which mirrors CPU 1457 * @ctx: GPU SVM context 1458 * 1459 * This function finds or inserts a newly allocated a SVM range based on the 1460 * address. 1461 * 1462 * Return: Pointer to the SVM range on success, ERR_PTR() on failure. 1463 */ 1464 struct xe_svm_range *xe_svm_range_find_or_insert(struct xe_vm *vm, u64 addr, 1465 struct xe_vma *vma, struct drm_gpusvm_ctx *ctx) 1466 { 1467 struct drm_gpusvm_range *r; 1468 1469 r = drm_gpusvm_range_find_or_insert(&vm->svm.gpusvm, max(addr, xe_vma_start(vma)), 1470 xe_vma_start(vma), xe_vma_end(vma), ctx); 1471 if (IS_ERR(r)) 1472 return ERR_CAST(r); 1473 1474 return to_xe_range(r); 1475 } 1476 1477 /** 1478 * xe_svm_range_get_pages() - Get pages for a SVM range 1479 * @vm: Pointer to the struct xe_vm 1480 * @range: Pointer to the xe SVM range structure 1481 * @ctx: GPU SVM context 1482 * 1483 * This function gets pages for a SVM range and ensures they are mapped for 1484 * DMA access. In case of failure with -EOPNOTSUPP, it evicts the range. 1485 * 1486 * Return: 0 on success, negative error code on failure. 1487 */ 1488 int xe_svm_range_get_pages(struct xe_vm *vm, struct xe_svm_range *range, 1489 struct drm_gpusvm_ctx *ctx) 1490 { 1491 int err = 0; 1492 1493 err = drm_gpusvm_range_get_pages(&vm->svm.gpusvm, &range->base, ctx); 1494 if (err == -EOPNOTSUPP) { 1495 range_debug(range, "PAGE FAULT - EVICT PAGES"); 1496 drm_gpusvm_range_evict(&vm->svm.gpusvm, &range->base); 1497 } 1498 1499 return err; 1500 } 1501 1502 /** 1503 * xe_svm_ranges_zap_ptes_in_range - clear ptes of svm ranges in input range 1504 * @vm: Pointer to the xe_vm structure 1505 * @start: Start of the input range 1506 * @end: End of the input range 1507 * 1508 * This function removes the page table entries (PTEs) associated 1509 * with the svm ranges within the given input start and end 1510 * 1511 * Return: tile_mask for which gt's need to be tlb invalidated. 1512 */ 1513 u8 xe_svm_ranges_zap_ptes_in_range(struct xe_vm *vm, u64 start, u64 end) 1514 { 1515 struct drm_gpusvm_notifier *notifier; 1516 struct xe_svm_range *range; 1517 u64 adj_start, adj_end; 1518 struct xe_tile *tile; 1519 u8 tile_mask = 0; 1520 u8 id; 1521 1522 lockdep_assert(lockdep_is_held_type(&vm->svm.gpusvm.notifier_lock, 1) && 1523 lockdep_is_held_type(&vm->lock, 0)); 1524 1525 drm_gpusvm_for_each_notifier(notifier, &vm->svm.gpusvm, start, end) { 1526 struct drm_gpusvm_range *r = NULL; 1527 1528 adj_start = max(start, drm_gpusvm_notifier_start(notifier)); 1529 adj_end = min(end, drm_gpusvm_notifier_end(notifier)); 1530 drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end) { 1531 range = to_xe_range(r); 1532 for_each_tile(tile, vm->xe, id) { 1533 if (xe_pt_zap_ptes_range(tile, vm, range)) { 1534 tile_mask |= BIT(id); 1535 /* 1536 * WRITE_ONCE pairs with READ_ONCE in 1537 * xe_vm_has_valid_gpu_mapping(). 1538 * Must not fail after setting 1539 * tile_invalidated and before 1540 * TLB invalidation. 1541 */ 1542 WRITE_ONCE(range->tile_invalidated, 1543 range->tile_invalidated | BIT(id)); 1544 } 1545 } 1546 } 1547 } 1548 1549 return tile_mask; 1550 } 1551 1552 #if IS_ENABLED(CONFIG_DRM_XE_PAGEMAP) 1553 1554 /** 1555 * xe_vma_resolve_pagemap - Resolve the appropriate DRM pagemap for a VMA 1556 * @vma: Pointer to the xe_vma structure containing memory attributes 1557 * @tile: Pointer to the xe_tile structure used as fallback for VRAM mapping 1558 * 1559 * This function determines the correct DRM pagemap to use for a given VMA. 1560 * It first checks if a valid devmem_fd is provided in the VMA's preferred 1561 * location. If the devmem_fd is negative, it returns NULL, indicating no 1562 * pagemap is available and smem to be used as preferred location. 1563 * If the devmem_fd is equal to the default faulting 1564 * GT identifier, it returns the VRAM pagemap associated with the tile. 1565 * 1566 * Future support for multi-device configurations may use drm_pagemap_from_fd() 1567 * to resolve pagemaps from arbitrary file descriptors. 1568 * 1569 * Return: A pointer to the resolved drm_pagemap, or NULL if none is applicable. 1570 */ 1571 struct drm_pagemap *xe_vma_resolve_pagemap(struct xe_vma *vma, struct xe_tile *tile) 1572 { 1573 struct drm_pagemap *dpagemap = vma->attr.preferred_loc.dpagemap; 1574 s32 fd; 1575 1576 if (dpagemap) 1577 return dpagemap; 1578 1579 fd = (s32)vma->attr.preferred_loc.devmem_fd; 1580 1581 if (fd == DRM_XE_PREFERRED_LOC_DEFAULT_SYSTEM) 1582 return NULL; 1583 1584 if (fd == DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE) 1585 return IS_DGFX(tile_to_xe(tile)) ? xe_tile_local_pagemap(tile) : NULL; 1586 1587 return NULL; 1588 } 1589 1590 /** 1591 * xe_svm_alloc_vram()- Allocate device memory pages for range, 1592 * migrating existing data. 1593 * @range: SVM range 1594 * @ctx: DRM GPU SVM context 1595 * @dpagemap: The struct drm_pagemap representing the memory to allocate. 1596 * 1597 * Return: 0 on success, error code on failure. 1598 */ 1599 int xe_svm_alloc_vram(struct xe_svm_range *range, const struct drm_gpusvm_ctx *ctx, 1600 struct drm_pagemap *dpagemap) 1601 { 1602 static DECLARE_RWSEM(driver_migrate_lock); 1603 struct xe_vm *vm = range_to_vm(&range->base); 1604 enum drm_gpusvm_scan_result migration_state; 1605 struct xe_device *xe = vm->xe; 1606 int err, retries = 1; 1607 bool write_locked = false; 1608 1609 xe_assert(range_to_vm(&range->base)->xe, range->base.pages.flags.migrate_devmem); 1610 range_debug(range, "ALLOCATE VRAM"); 1611 1612 migration_state = drm_gpusvm_scan_mm(&range->base, 1613 xe_svm_private_page_owner(vm, false), 1614 dpagemap->pagemap); 1615 1616 if (migration_state == DRM_GPUSVM_SCAN_EQUAL) { 1617 if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)) 1618 drm_dbg(dpagemap->drm, "Already migrated!\n"); 1619 return 0; 1620 } 1621 1622 if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)) 1623 drm_dbg(&xe->drm, "Request migration to device memory on \"%s\".\n", 1624 dpagemap->drm->unique); 1625 1626 err = down_read_interruptible(&driver_migrate_lock); 1627 if (err) 1628 return err; 1629 do { 1630 err = drm_pagemap_populate_mm(dpagemap, xe_svm_range_start(range), 1631 xe_svm_range_end(range), 1632 range->base.gpusvm->mm, 1633 ctx->timeslice_ms); 1634 1635 if (err == -EBUSY && retries) { 1636 if (!write_locked) { 1637 int lock_err; 1638 1639 up_read(&driver_migrate_lock); 1640 lock_err = down_write_killable(&driver_migrate_lock); 1641 if (lock_err) 1642 return lock_err; 1643 write_locked = true; 1644 } 1645 drm_gpusvm_range_evict(range->base.gpusvm, &range->base); 1646 } 1647 } while (err == -EBUSY && retries--); 1648 if (write_locked) 1649 up_write(&driver_migrate_lock); 1650 else 1651 up_read(&driver_migrate_lock); 1652 1653 return err; 1654 } 1655 1656 static struct drm_pagemap_addr 1657 xe_drm_pagemap_device_map(struct drm_pagemap *dpagemap, 1658 struct device *dev, 1659 struct page *page, 1660 unsigned int order, 1661 enum dma_data_direction dir) 1662 { 1663 struct device *pgmap_dev = dpagemap->drm->dev; 1664 enum drm_interconnect_protocol prot; 1665 dma_addr_t addr; 1666 1667 if (pgmap_dev == dev) { 1668 addr = xe_page_to_dpa(page); 1669 prot = XE_INTERCONNECT_VRAM; 1670 } else { 1671 addr = dma_map_resource(dev, 1672 xe_page_to_pcie(page), 1673 PAGE_SIZE << order, dir, 1674 DMA_ATTR_SKIP_CPU_SYNC); 1675 prot = XE_INTERCONNECT_P2P; 1676 } 1677 1678 return drm_pagemap_addr_encode(addr, prot, order, dir); 1679 } 1680 1681 static void xe_drm_pagemap_device_unmap(struct drm_pagemap *dpagemap, 1682 struct device *dev, 1683 const struct drm_pagemap_addr *addr) 1684 { 1685 if (addr->proto != XE_INTERCONNECT_P2P) 1686 return; 1687 1688 dma_unmap_resource(dev, addr->addr, PAGE_SIZE << addr->order, 1689 addr->dir, DMA_ATTR_SKIP_CPU_SYNC); 1690 } 1691 1692 static void xe_pagemap_destroy_work(struct work_struct *work) 1693 { 1694 struct xe_pagemap *xpagemap = container_of(work, typeof(*xpagemap), destroy_work); 1695 struct dev_pagemap *pagemap = &xpagemap->pagemap; 1696 struct drm_device *drm = xpagemap->dpagemap.drm; 1697 int idx; 1698 1699 /* 1700 * Only unmap / release if devm_ release hasn't run yet. 1701 * Otherwise the devm_ callbacks have already released, or 1702 * will do shortly. 1703 */ 1704 if (drm_dev_enter(drm, &idx)) { 1705 devm_memunmap_pages(drm->dev, pagemap); 1706 devm_release_mem_region(drm->dev, pagemap->range.start, 1707 pagemap->range.end - pagemap->range.start + 1); 1708 drm_dev_exit(idx); 1709 } 1710 1711 drm_pagemap_release_owner(&xpagemap->peer); 1712 kfree(xpagemap); 1713 } 1714 1715 static void xe_pagemap_destroy(struct drm_pagemap *dpagemap, bool from_atomic_or_reclaim) 1716 { 1717 struct xe_pagemap *xpagemap = container_of(dpagemap, typeof(*xpagemap), dpagemap); 1718 struct xe_device *xe = to_xe_device(dpagemap->drm); 1719 1720 if (from_atomic_or_reclaim) 1721 queue_work(xe->destroy_wq, &xpagemap->destroy_work); 1722 else 1723 xe_pagemap_destroy_work(&xpagemap->destroy_work); 1724 } 1725 1726 static const struct drm_pagemap_ops xe_drm_pagemap_ops = { 1727 .device_map = xe_drm_pagemap_device_map, 1728 .device_unmap = xe_drm_pagemap_device_unmap, 1729 .populate_mm = xe_drm_pagemap_populate_mm, 1730 .destroy = xe_pagemap_destroy, 1731 }; 1732 1733 /** 1734 * xe_pagemap_create() - Create a struct xe_pagemap object 1735 * @xe: The xe device. 1736 * @vr: Back-pointer to the struct xe_vram_region. 1737 * 1738 * Allocate and initialize a struct xe_pagemap. On successful 1739 * return, drm_pagemap_put() on the embedded struct drm_pagemap 1740 * should be used to unreference. 1741 * 1742 * Return: Pointer to a struct xe_pagemap if successful. Error pointer 1743 * on failure. 1744 */ 1745 static struct xe_pagemap *xe_pagemap_create(struct xe_device *xe, struct xe_vram_region *vr) 1746 { 1747 struct device *dev = xe->drm.dev; 1748 struct xe_pagemap *xpagemap; 1749 struct dev_pagemap *pagemap; 1750 struct drm_pagemap *dpagemap; 1751 struct resource *res; 1752 void *addr; 1753 int err; 1754 1755 xpagemap = kzalloc_obj(*xpagemap); 1756 if (!xpagemap) 1757 return ERR_PTR(-ENOMEM); 1758 1759 pagemap = &xpagemap->pagemap; 1760 dpagemap = &xpagemap->dpagemap; 1761 INIT_WORK(&xpagemap->destroy_work, xe_pagemap_destroy_work); 1762 xpagemap->vr = vr; 1763 xpagemap->peer.private = XE_PEER_PAGEMAP; 1764 1765 err = drm_pagemap_init(dpagemap, pagemap, &xe->drm, &xe_drm_pagemap_ops); 1766 if (err) 1767 goto out_no_dpagemap; 1768 1769 res = devm_request_free_mem_region(dev, &iomem_resource, 1770 vr->usable_size); 1771 if (IS_ERR(res)) { 1772 err = PTR_ERR(res); 1773 goto out_err; 1774 } 1775 1776 err = drm_pagemap_acquire_owner(&xpagemap->peer, &xe_owner_list, 1777 xe_has_interconnect); 1778 if (err) 1779 goto out_no_owner; 1780 1781 pagemap->type = MEMORY_DEVICE_PRIVATE; 1782 pagemap->range.start = res->start; 1783 pagemap->range.end = res->end; 1784 pagemap->nr_range = 1; 1785 pagemap->owner = xpagemap->peer.owner; 1786 pagemap->ops = drm_pagemap_pagemap_ops_get(); 1787 addr = devm_memremap_pages(dev, pagemap); 1788 if (IS_ERR(addr)) { 1789 err = PTR_ERR(addr); 1790 goto out_no_pages; 1791 } 1792 xpagemap->hpa_base = res->start; 1793 return xpagemap; 1794 1795 out_no_pages: 1796 drm_pagemap_release_owner(&xpagemap->peer); 1797 out_no_owner: 1798 devm_release_mem_region(dev, res->start, res->end - res->start + 1); 1799 out_err: 1800 drm_pagemap_put(dpagemap); 1801 return ERR_PTR(err); 1802 1803 out_no_dpagemap: 1804 kfree(xpagemap); 1805 return ERR_PTR(err); 1806 } 1807 1808 /** 1809 * xe_pagemap_find_or_create() - Find or create a struct xe_pagemap 1810 * @xe: The xe device. 1811 * @cache: The struct xe_pagemap_cache. 1812 * @vr: The VRAM region. 1813 * 1814 * Check if there is an already used xe_pagemap for this tile, and in that case, 1815 * return it. 1816 * If not, check if there is a cached xe_pagemap for this tile, and in that case, 1817 * cancel its destruction, re-initialize it and return it. 1818 * Finally if there is no cached or already used pagemap, create one and 1819 * register it in the tile's pagemap cache. 1820 * 1821 * Note that this function is typically called from within an IOCTL, and waits are 1822 * therefore carried out interruptible if possible. 1823 * 1824 * Return: A pointer to a struct xe_pagemap if successful, Error pointer on failure. 1825 */ 1826 static struct xe_pagemap * 1827 xe_pagemap_find_or_create(struct xe_device *xe, struct drm_pagemap_cache *cache, 1828 struct xe_vram_region *vr) 1829 { 1830 struct drm_pagemap *dpagemap; 1831 struct xe_pagemap *xpagemap; 1832 int err; 1833 1834 err = drm_pagemap_cache_lock_lookup(cache); 1835 if (err) 1836 return ERR_PTR(err); 1837 1838 dpagemap = drm_pagemap_get_from_cache(cache); 1839 if (IS_ERR(dpagemap)) { 1840 xpagemap = ERR_CAST(dpagemap); 1841 } else if (!dpagemap) { 1842 xpagemap = xe_pagemap_create(xe, vr); 1843 if (IS_ERR(xpagemap)) 1844 goto out_unlock; 1845 drm_pagemap_cache_set_pagemap(cache, &xpagemap->dpagemap); 1846 } else { 1847 xpagemap = container_of(dpagemap, typeof(*xpagemap), dpagemap); 1848 } 1849 1850 out_unlock: 1851 drm_pagemap_cache_unlock_lookup(cache); 1852 return xpagemap; 1853 } 1854 1855 static int xe_svm_get_pagemaps(struct xe_vm *vm) 1856 { 1857 struct xe_device *xe = vm->xe; 1858 struct xe_pagemap *xpagemap; 1859 struct xe_tile *tile; 1860 int id; 1861 1862 for_each_tile(tile, xe, id) { 1863 struct xe_vram_region *vr; 1864 1865 if (!((BIT(id) << 1) & xe->info.mem_region_mask)) 1866 continue; 1867 1868 vr = xe_tile_to_vr(tile); 1869 xpagemap = xe_pagemap_find_or_create(xe, vr->dpagemap_cache, vr); 1870 if (IS_ERR(xpagemap)) 1871 break; 1872 vm->svm.pagemaps[id] = xpagemap; 1873 } 1874 1875 if (IS_ERR(xpagemap)) { 1876 xe_svm_put_pagemaps(vm); 1877 return PTR_ERR(xpagemap); 1878 } 1879 1880 return 0; 1881 } 1882 1883 /** 1884 * xe_pagemap_shrinker_create() - Create a drm_pagemap shrinker 1885 * @xe: The xe device 1886 * 1887 * Create a drm_pagemap shrinker and register with the xe device. 1888 * 1889 * Return: %0 on success, negative error code on failure. 1890 */ 1891 int xe_pagemap_shrinker_create(struct xe_device *xe) 1892 { 1893 xe->usm.dpagemap_shrinker = drm_pagemap_shrinker_create_devm(&xe->drm); 1894 return PTR_ERR_OR_ZERO(xe->usm.dpagemap_shrinker); 1895 } 1896 1897 /** 1898 * xe_pagemap_cache_create() - Create a drm_pagemap cache 1899 * @tile: The tile to register the cache with 1900 * 1901 * Create a drm_pagemap cache and register with the tile. 1902 * 1903 * Return: %0 on success, negative error code on failure. 1904 */ 1905 int xe_pagemap_cache_create(struct xe_tile *tile) 1906 { 1907 struct xe_device *xe = tile_to_xe(tile); 1908 1909 if (IS_DGFX(xe)) { 1910 struct drm_pagemap_cache *cache = 1911 drm_pagemap_cache_create_devm(xe->usm.dpagemap_shrinker); 1912 1913 if (IS_ERR(cache)) 1914 return PTR_ERR(cache); 1915 1916 tile->mem.vram->dpagemap_cache = cache; 1917 } 1918 1919 return 0; 1920 } 1921 1922 static struct drm_pagemap *xe_devmem_open(struct xe_device *xe, u32 region_instance) 1923 { 1924 u32 tile_id = region_instance - 1; 1925 struct xe_pagemap *xpagemap; 1926 struct xe_vram_region *vr; 1927 1928 if (tile_id >= xe->info.tile_count) 1929 return ERR_PTR(-ENOENT); 1930 1931 if (!((BIT(tile_id) << 1) & xe->info.mem_region_mask)) 1932 return ERR_PTR(-ENOENT); 1933 1934 vr = xe_tile_to_vr(&xe->tiles[tile_id]); 1935 1936 /* Returns a reference-counted embedded struct drm_pagemap */ 1937 xpagemap = xe_pagemap_find_or_create(xe, vr->dpagemap_cache, vr); 1938 if (IS_ERR(xpagemap)) 1939 return ERR_CAST(xpagemap); 1940 1941 return &xpagemap->dpagemap; 1942 } 1943 1944 /** 1945 * xe_drm_pagemap_from_fd() - Return a drm_pagemap pointer from a 1946 * (file_descriptor, region_instance) pair. 1947 * @fd: An fd opened against an xe device. 1948 * @region_instance: The region instance representing the device memory 1949 * on the opened xe device. 1950 * 1951 * Opens a struct drm_pagemap pointer on the 1952 * indicated device and region_instance. 1953 * 1954 * Return: A reference-counted struct drm_pagemap pointer on success, 1955 * negative error pointer on failure. 1956 */ 1957 struct drm_pagemap *xe_drm_pagemap_from_fd(int fd, u32 region_instance) 1958 { 1959 struct drm_pagemap *dpagemap; 1960 struct file *file; 1961 struct drm_file *fpriv; 1962 struct drm_device *drm; 1963 int idx; 1964 1965 if (fd <= 0) 1966 return ERR_PTR(-EINVAL); 1967 1968 file = fget(fd); 1969 if (!file) 1970 return ERR_PTR(-ENOENT); 1971 1972 if (!xe_is_xe_file(file)) { 1973 dpagemap = ERR_PTR(-ENOENT); 1974 goto out; 1975 } 1976 1977 fpriv = file->private_data; 1978 drm = fpriv->minor->dev; 1979 if (!drm_dev_enter(drm, &idx)) { 1980 dpagemap = ERR_PTR(-ENODEV); 1981 goto out; 1982 } 1983 1984 dpagemap = xe_devmem_open(to_xe_device(drm), region_instance); 1985 drm_dev_exit(idx); 1986 out: 1987 fput(file); 1988 return dpagemap; 1989 } 1990 1991 #else 1992 1993 int xe_pagemap_shrinker_create(struct xe_device *xe) 1994 { 1995 return 0; 1996 } 1997 1998 int xe_pagemap_cache_create(struct xe_tile *tile) 1999 { 2000 return 0; 2001 } 2002 2003 int xe_svm_alloc_vram(struct xe_svm_range *range, 2004 const struct drm_gpusvm_ctx *ctx, 2005 struct drm_pagemap *dpagemap) 2006 { 2007 return -EOPNOTSUPP; 2008 } 2009 2010 struct drm_pagemap *xe_vma_resolve_pagemap(struct xe_vma *vma, struct xe_tile *tile) 2011 { 2012 return NULL; 2013 } 2014 2015 struct drm_pagemap *xe_drm_pagemap_from_fd(int fd, u32 region_instance) 2016 { 2017 return ERR_PTR(-ENOENT); 2018 } 2019 2020 #endif 2021 2022 /** 2023 * xe_svm_flush() - SVM flush 2024 * @vm: The VM. 2025 * 2026 * Flush all SVM actions. 2027 */ 2028 void xe_svm_flush(struct xe_vm *vm) 2029 { 2030 if (xe_vm_in_fault_mode(vm)) 2031 flush_work(&vm->svm.garbage_collector.work); 2032 } 2033