diff options
author | Christian König <deathsimple@vodafone.de> | 2012-08-11 05:54:05 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-09-20 13:10:39 -0400 |
commit | 089a786e2cf5d07d495b3cb1ac0b959c6dd10d49 (patch) | |
tree | a60b26f96dae4c3c52accb4e9ae7826d1fc5b701 /drivers/gpu/drm/radeon | |
parent | ddf03f5cdd98c6ea486f3007a5542241634c9093 (diff) |
drm/radeon: Move looping over the PTEs into chip code
Makes it easier to move it into the rings.
Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 24 |
5 files changed, 34 insertions, 34 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index de378d685803..8bec8113d3a1 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1503,9 +1503,7 @@ void cayman_vm_fini(struct radeon_device *rdev) | |||
1503 | #define R600_PTE_READABLE (1 << 5) | 1503 | #define R600_PTE_READABLE (1 << 5) |
1504 | #define R600_PTE_WRITEABLE (1 << 6) | 1504 | #define R600_PTE_WRITEABLE (1 << 6) |
1505 | 1505 | ||
1506 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, | 1506 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags) |
1507 | struct radeon_vm *vm, | ||
1508 | uint32_t flags) | ||
1509 | { | 1507 | { |
1510 | uint32_t r600_flags = 0; | 1508 | uint32_t r600_flags = 0; |
1511 | 1509 | ||
@@ -1520,13 +1518,23 @@ uint32_t cayman_vm_page_flags(struct radeon_device *rdev, | |||
1520 | } | 1518 | } |
1521 | 1519 | ||
1522 | void cayman_vm_set_page(struct radeon_device *rdev, struct radeon_vm *vm, | 1520 | void cayman_vm_set_page(struct radeon_device *rdev, struct radeon_vm *vm, |
1523 | unsigned pfn, uint64_t addr, uint32_t flags) | 1521 | unsigned pfn, struct ttm_mem_reg *mem, |
1522 | unsigned npages, uint32_t flags) | ||
1524 | { | 1523 | { |
1525 | void __iomem *ptr = (void *)vm->pt; | 1524 | void __iomem *ptr = (void *)vm->pt; |
1525 | uint64_t addr; | ||
1526 | int i; | ||
1527 | |||
1528 | addr = flags = cayman_vm_page_flags(rdev, flags); | ||
1526 | 1529 | ||
1527 | addr = addr & 0xFFFFFFFFFFFFF000ULL; | 1530 | for (i = 0; i < npages; ++i, ++pfn) { |
1528 | addr |= flags; | 1531 | if (mem) { |
1529 | writeq(addr, ptr + (pfn * 8)); | 1532 | addr = radeon_vm_get_addr(rdev, mem, i); |
1533 | addr = addr & 0xFFFFFFFFFFFFF000ULL; | ||
1534 | addr |= flags; | ||
1535 | } | ||
1536 | writeq(addr, ptr + (pfn * 8)); | ||
1537 | } | ||
1530 | } | 1538 | } |
1531 | 1539 | ||
1532 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib) | 1540 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index d6cd1f57fece..ae7409a0f62b 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -1135,11 +1135,9 @@ struct radeon_asic { | |||
1135 | struct { | 1135 | struct { |
1136 | int (*init)(struct radeon_device *rdev); | 1136 | int (*init)(struct radeon_device *rdev); |
1137 | void (*fini)(struct radeon_device *rdev); | 1137 | void (*fini)(struct radeon_device *rdev); |
1138 | uint32_t (*page_flags)(struct radeon_device *rdev, | ||
1139 | struct radeon_vm *vm, | ||
1140 | uint32_t flags); | ||
1141 | void (*set_page)(struct radeon_device *rdev, struct radeon_vm *vm, | 1138 | void (*set_page)(struct radeon_device *rdev, struct radeon_vm *vm, |
1142 | unsigned pfn, uint64_t addr, uint32_t flags); | 1139 | unsigned pfn, struct ttm_mem_reg *mem, |
1140 | unsigned npages, uint32_t flags); | ||
1143 | } vm; | 1141 | } vm; |
1144 | /* ring specific callbacks */ | 1142 | /* ring specific callbacks */ |
1145 | struct { | 1143 | struct { |
@@ -1751,8 +1749,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); | |||
1751 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) | 1749 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) |
1752 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) | 1750 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) |
1753 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) | 1751 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) |
1754 | #define radeon_asic_vm_page_flags(rdev, v, flags) (rdev)->asic->vm.page_flags((rdev), (v), (flags)) | 1752 | #define radeon_asic_vm_set_page(rdev, v, pfn, mem, npages, flags) (rdev)->asic->vm.set_page((rdev), (v), (pfn), (mem), (npages), (flags)) |
1755 | #define radeon_asic_vm_set_page(rdev, v, pfn, addr, flags) (rdev)->asic->vm.set_page((rdev), (v), (pfn), (addr), (flags)) | ||
1756 | #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) | 1753 | #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) |
1757 | #define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)].ring_test((rdev), (cp)) | 1754 | #define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)].ring_test((rdev), (cp)) |
1758 | #define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)].ib_test((rdev), (cp)) | 1755 | #define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)].ib_test((rdev), (cp)) |
@@ -1837,6 +1834,9 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev, | |||
1837 | void radeon_vm_fence(struct radeon_device *rdev, | 1834 | void radeon_vm_fence(struct radeon_device *rdev, |
1838 | struct radeon_vm *vm, | 1835 | struct radeon_vm *vm, |
1839 | struct radeon_fence *fence); | 1836 | struct radeon_fence *fence); |
1837 | u64 radeon_vm_get_addr(struct radeon_device *rdev, | ||
1838 | struct ttm_mem_reg *mem, | ||
1839 | unsigned pfn); | ||
1840 | int radeon_vm_bo_update_pte(struct radeon_device *rdev, | 1840 | int radeon_vm_bo_update_pte(struct radeon_device *rdev, |
1841 | struct radeon_vm *vm, | 1841 | struct radeon_vm *vm, |
1842 | struct radeon_bo *bo, | 1842 | struct radeon_bo *bo, |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 98c586ac1999..6e4e67edf60f 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -1375,7 +1375,6 @@ static struct radeon_asic cayman_asic = { | |||
1375 | .vm = { | 1375 | .vm = { |
1376 | .init = &cayman_vm_init, | 1376 | .init = &cayman_vm_init, |
1377 | .fini = &cayman_vm_fini, | 1377 | .fini = &cayman_vm_fini, |
1378 | .page_flags = &cayman_vm_page_flags, | ||
1379 | .set_page = &cayman_vm_set_page, | 1378 | .set_page = &cayman_vm_set_page, |
1380 | }, | 1379 | }, |
1381 | .ring = { | 1380 | .ring = { |
@@ -1479,7 +1478,6 @@ static struct radeon_asic trinity_asic = { | |||
1479 | .vm = { | 1478 | .vm = { |
1480 | .init = &cayman_vm_init, | 1479 | .init = &cayman_vm_init, |
1481 | .fini = &cayman_vm_fini, | 1480 | .fini = &cayman_vm_fini, |
1482 | .page_flags = &cayman_vm_page_flags, | ||
1483 | .set_page = &cayman_vm_set_page, | 1481 | .set_page = &cayman_vm_set_page, |
1484 | }, | 1482 | }, |
1485 | .ring = { | 1483 | .ring = { |
@@ -1583,7 +1581,6 @@ static struct radeon_asic si_asic = { | |||
1583 | .vm = { | 1581 | .vm = { |
1584 | .init = &si_vm_init, | 1582 | .init = &si_vm_init, |
1585 | .fini = &si_vm_fini, | 1583 | .fini = &si_vm_fini, |
1586 | .page_flags = &cayman_vm_page_flags, | ||
1587 | .set_page = &cayman_vm_set_page, | 1584 | .set_page = &cayman_vm_set_page, |
1588 | }, | 1585 | }, |
1589 | .ring = { | 1586 | .ring = { |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 25e8d000dac9..2b3dd3173022 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -442,11 +442,10 @@ int cayman_vm_init(struct radeon_device *rdev); | |||
442 | void cayman_vm_fini(struct radeon_device *rdev); | 442 | void cayman_vm_fini(struct radeon_device *rdev); |
443 | void cayman_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm); | 443 | void cayman_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm); |
444 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib); | 444 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib); |
445 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, | 445 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); |
446 | struct radeon_vm *vm, | ||
447 | uint32_t flags); | ||
448 | void cayman_vm_set_page(struct radeon_device *rdev, struct radeon_vm *vm, | 446 | void cayman_vm_set_page(struct radeon_device *rdev, struct radeon_vm *vm, |
449 | unsigned pfn, uint64_t addr, uint32_t flags); | 447 | unsigned pfn, struct ttm_mem_reg *mem, |
448 | unsigned npages, uint32_t flags); | ||
450 | int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 449 | int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); |
451 | 450 | ||
452 | /* DCE6 - SI */ | 451 | /* DCE6 - SI */ |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index da1b2dbe4550..0f9a40f84d7a 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -450,7 +450,7 @@ int radeon_vm_manager_init(struct radeon_device *rdev) | |||
450 | r = radeon_asic_vm_init(rdev); | 450 | r = radeon_asic_vm_init(rdev); |
451 | if (r) | 451 | if (r) |
452 | return r; | 452 | return r; |
453 | 453 | ||
454 | rdev->vm_manager.enabled = true; | 454 | rdev->vm_manager.enabled = true; |
455 | 455 | ||
456 | r = radeon_sa_bo_manager_start(rdev, &rdev->vm_manager.sa_manager); | 456 | r = radeon_sa_bo_manager_start(rdev, &rdev->vm_manager.sa_manager); |
@@ -773,9 +773,9 @@ int radeon_vm_bo_add(struct radeon_device *rdev, | |||
773 | * to (cayman+). | 773 | * to (cayman+). |
774 | * Returns the physical address of the page. | 774 | * Returns the physical address of the page. |
775 | */ | 775 | */ |
776 | static u64 radeon_vm_get_addr(struct radeon_device *rdev, | 776 | u64 radeon_vm_get_addr(struct radeon_device *rdev, |
777 | struct ttm_mem_reg *mem, | 777 | struct ttm_mem_reg *mem, |
778 | unsigned pfn) | 778 | unsigned pfn) |
779 | { | 779 | { |
780 | u64 addr = 0; | 780 | u64 addr = 0; |
781 | 781 | ||
@@ -819,9 +819,8 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev, | |||
819 | struct ttm_mem_reg *mem) | 819 | struct ttm_mem_reg *mem) |
820 | { | 820 | { |
821 | struct radeon_bo_va *bo_va; | 821 | struct radeon_bo_va *bo_va; |
822 | unsigned ngpu_pages, i; | 822 | unsigned ngpu_pages; |
823 | uint64_t addr = 0, pfn; | 823 | uint64_t pfn; |
824 | uint32_t flags; | ||
825 | 824 | ||
826 | /* nothing to do if vm isn't bound */ | 825 | /* nothing to do if vm isn't bound */ |
827 | if (vm->sa_bo == NULL) | 826 | if (vm->sa_bo == NULL) |
@@ -848,14 +847,11 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev, | |||
848 | bo_va->flags |= RADEON_VM_PAGE_SYSTEM; | 847 | bo_va->flags |= RADEON_VM_PAGE_SYSTEM; |
849 | } | 848 | } |
850 | } | 849 | } |
851 | pfn = bo_va->soffset / RADEON_GPU_PAGE_SIZE; | 850 | if (!bo_va->valid) { |
852 | flags = radeon_asic_vm_page_flags(rdev, bo_va->vm, bo_va->flags); | 851 | mem = NULL; |
853 | for (i = 0, addr = 0; i < ngpu_pages; i++) { | ||
854 | if (mem && bo_va->valid) { | ||
855 | addr = radeon_vm_get_addr(rdev, mem, i); | ||
856 | } | ||
857 | radeon_asic_vm_set_page(rdev, bo_va->vm, i + pfn, addr, flags); | ||
858 | } | 852 | } |
853 | pfn = bo_va->soffset / RADEON_GPU_PAGE_SIZE; | ||
854 | radeon_asic_vm_set_page(rdev, bo_va->vm, pfn, mem, ngpu_pages, bo_va->flags); | ||
859 | radeon_fence_unref(&vm->last_flush); | 855 | radeon_fence_unref(&vm->last_flush); |
860 | return 0; | 856 | return 0; |
861 | } | 857 | } |