Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add a callback to set vm mapping flags

This lets each asic set whichever flags it supports.

Signed-off-by: Alex Xie <AlexBin.Xie@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Alex Xie and committed by
Alex Deucher
5463545b 4b98e0c4

+57 -9
+4
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 296 296 uint64_t flags); /* access flags */ 297 297 /* enable/disable PRT support */ 298 298 void (*set_prt)(struct amdgpu_device *adev, bool enable); 299 + /* set pte flags based per asic */ 300 + uint64_t (*get_vm_pte_flags)(struct amdgpu_device *adev, 301 + uint32_t flags); 299 302 }; 300 303 301 304 /* provided by the ih block */ ··· 1685 1682 #define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count))) 1686 1683 #define amdgpu_vm_write_pte(adev, ib, pe, value, count, incr) ((adev)->vm_manager.vm_pte_funcs->write_pte((ib), (pe), (value), (count), (incr))) 1687 1684 #define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags))) 1685 + #define amdgpu_vm_get_pte_flags(adev, flags) (adev)->gart.gart_funcs->get_vm_pte_flags((adev),(flags)) 1688 1686 #define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib))) 1689 1687 #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r)) 1690 1688 #define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
+3 -9
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 569 569 struct ttm_validate_buffer tv; 570 570 struct ww_acquire_ctx ticket; 571 571 struct list_head list; 572 - uint64_t va_flags = 0; 572 + uint64_t va_flags; 573 573 int r = 0; 574 574 575 575 if (!adev->vm_manager.enabled) ··· 631 631 632 632 switch (args->operation) { 633 633 case AMDGPU_VA_OP_MAP: 634 - if (args->flags & AMDGPU_VM_PAGE_READABLE) 635 - va_flags |= AMDGPU_PTE_READABLE; 636 - if (args->flags & AMDGPU_VM_PAGE_WRITEABLE) 637 - va_flags |= AMDGPU_PTE_WRITEABLE; 638 - if (args->flags & AMDGPU_VM_PAGE_EXECUTABLE) 639 - va_flags |= AMDGPU_PTE_EXECUTABLE; 640 - if (args->flags & AMDGPU_VM_PAGE_PRT) 641 - va_flags |= AMDGPU_PTE_PRT; 634 + va_flags = amdgpu_vm_get_pte_flags(adev, args->flags); 635 + 642 636 r = amdgpu_vm_bo_map(adev, bo_va, args->va_address, 643 637 args->offset_in_bo, args->map_size, 644 638 va_flags);
+16
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
··· 379 379 return 0; 380 380 } 381 381 382 + static uint64_t gmc_v6_0_get_vm_pte_flags(struct amdgpu_device *adev, 383 + uint32_t flags) 384 + { 385 + uint64_t pte_flag = 0; 386 + 387 + if (flags & AMDGPU_VM_PAGE_READABLE) 388 + pte_flag |= AMDGPU_PTE_READABLE; 389 + if (flags & AMDGPU_VM_PAGE_WRITEABLE) 390 + pte_flag |= AMDGPU_PTE_WRITEABLE; 391 + if (flags & AMDGPU_VM_PAGE_PRT) 392 + pte_flag |= AMDGPU_PTE_PRT; 393 + 394 + return pte_flag; 395 + } 396 + 382 397 static void gmc_v6_0_set_fault_enable_default(struct amdgpu_device *adev, 383 398 bool value) 384 399 { ··· 1153 1138 .flush_gpu_tlb = gmc_v6_0_gart_flush_gpu_tlb, 1154 1139 .set_pte_pde = gmc_v6_0_gart_set_pte_pde, 1155 1140 .set_prt = gmc_v6_0_set_prt, 1141 + .get_vm_pte_flags = gmc_v6_0_get_vm_pte_flags 1156 1142 }; 1157 1143 1158 1144 static const struct amdgpu_irq_src_funcs gmc_v6_0_irq_funcs = {
+16
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 451 451 return 0; 452 452 } 453 453 454 + static uint64_t gmc_v7_0_get_vm_pte_flags(struct amdgpu_device *adev, 455 + uint32_t flags) 456 + { 457 + uint64_t pte_flag = 0; 458 + 459 + if (flags & AMDGPU_VM_PAGE_READABLE) 460 + pte_flag |= AMDGPU_PTE_READABLE; 461 + if (flags & AMDGPU_VM_PAGE_WRITEABLE) 462 + pte_flag |= AMDGPU_PTE_WRITEABLE; 463 + if (flags & AMDGPU_VM_PAGE_PRT) 464 + pte_flag |= AMDGPU_PTE_PRT; 465 + 466 + return pte_flag; 467 + } 468 + 454 469 /** 455 470 * gmc_v8_0_set_fault_enable_default - update VM fault handling 456 471 * ··· 1338 1323 .flush_gpu_tlb = gmc_v7_0_gart_flush_gpu_tlb, 1339 1324 .set_pte_pde = gmc_v7_0_gart_set_pte_pde, 1340 1325 .set_prt = gmc_v7_0_set_prt, 1326 + .get_vm_pte_flags = gmc_v7_0_get_vm_pte_flags 1341 1327 }; 1342 1328 1343 1329 static const struct amdgpu_irq_src_funcs gmc_v7_0_irq_funcs = {
+18
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
··· 563 563 return 0; 564 564 } 565 565 566 + static uint64_t gmc_v8_0_get_vm_pte_flags(struct amdgpu_device *adev, 567 + uint32_t flags) 568 + { 569 + uint64_t pte_flag = 0; 570 + 571 + if (flags & AMDGPU_VM_PAGE_EXECUTABLE) 572 + pte_flag |= AMDGPU_PTE_EXECUTABLE; 573 + if (flags & AMDGPU_VM_PAGE_READABLE) 574 + pte_flag |= AMDGPU_PTE_READABLE; 575 + if (flags & AMDGPU_VM_PAGE_WRITEABLE) 576 + pte_flag |= AMDGPU_PTE_WRITEABLE; 577 + if (flags & AMDGPU_VM_PAGE_PRT) 578 + pte_flag |= AMDGPU_PTE_PRT; 579 + 580 + return pte_flag; 581 + } 582 + 566 583 /** 567 584 * gmc_v8_0_set_fault_enable_default - update VM fault handling 568 585 * ··· 1579 1562 .flush_gpu_tlb = gmc_v8_0_gart_flush_gpu_tlb, 1580 1563 .set_pte_pde = gmc_v8_0_gart_set_pte_pde, 1581 1564 .set_prt = gmc_v8_0_set_prt, 1565 + .get_vm_pte_flags = gmc_v8_0_get_vm_pte_flags 1582 1566 }; 1583 1567 1584 1568 static const struct amdgpu_irq_src_funcs gmc_v8_0_irq_funcs = {