diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-10-22 12:19:01 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-12-10 17:21:41 -0500 |
commit | 3b6b59b610f0c0f351e68ec3eff9ab51ef75fb1a (patch) | |
tree | 46cd9b78aa994668f7075fbe57a0b2431b7338dd /drivers/gpu/drm/radeon | |
parent | 2d6cc7296d4ee128ab0fa3b715f0afde511f49c2 (diff) |
drm/radeon: add dma engine support for vm pt updates on ni (v5)
Async DMA has a special packet for contiguous pt updates
which saves overhead.
v2: leave the CP method enabled for now as doing the updates
in the DMA rings is not working properly yet.
v3: update for 2 level pts
v4: rebase
v5: drop pte/pde packet. doesn't seem to work on NI.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index b81aca44fd4..39e8be1d1e8 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1795,30 +1795,57 @@ void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, | |||
1795 | { | 1795 | { |
1796 | struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; | 1796 | struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; |
1797 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); | 1797 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); |
1798 | 1798 | uint64_t value; | |
1799 | while (count) { | 1799 | unsigned ndw; |
1800 | unsigned ndw = 1 + count * 2; | 1800 | |
1801 | if (ndw > 0x3FFF) | 1801 | if (rdev->asic->vm.pt_ring_index == RADEON_RING_TYPE_GFX_INDEX) { |
1802 | ndw = 0x3FFF; | 1802 | while (count) { |
1803 | 1803 | ndw = 1 + count * 2; | |
1804 | radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, ndw)); | 1804 | if (ndw > 0x3FFF) |
1805 | radeon_ring_write(ring, pe); | 1805 | ndw = 0x3FFF; |
1806 | radeon_ring_write(ring, upper_32_bits(pe) & 0xff); | 1806 | |
1807 | for (; ndw > 1; ndw -= 2, --count, pe += 8) { | 1807 | radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, ndw)); |
1808 | uint64_t value = 0; | 1808 | radeon_ring_write(ring, pe); |
1809 | if (flags & RADEON_VM_PAGE_SYSTEM) { | 1809 | radeon_ring_write(ring, upper_32_bits(pe) & 0xff); |
1810 | value = radeon_vm_map_gart(rdev, addr); | 1810 | for (; ndw > 1; ndw -= 2, --count, pe += 8) { |
1811 | value &= 0xFFFFFFFFFFFFF000ULL; | 1811 | if (flags & RADEON_VM_PAGE_SYSTEM) { |
1812 | value = radeon_vm_map_gart(rdev, addr); | ||
1813 | value &= 0xFFFFFFFFFFFFF000ULL; | ||
1814 | } else if (flags & RADEON_VM_PAGE_VALID) { | ||
1815 | value = addr; | ||
1816 | } else { | ||
1817 | value = 0; | ||
1818 | } | ||
1812 | addr += incr; | 1819 | addr += incr; |
1813 | 1820 | value |= r600_flags; | |
1814 | } else if (flags & RADEON_VM_PAGE_VALID) { | 1821 | radeon_ring_write(ring, value); |
1815 | value = addr; | 1822 | radeon_ring_write(ring, upper_32_bits(value)); |
1823 | } | ||
1824 | } | ||
1825 | } else { | ||
1826 | while (count) { | ||
1827 | ndw = count * 2; | ||
1828 | if (ndw > 0xFFFFE) | ||
1829 | ndw = 0xFFFFE; | ||
1830 | |||
1831 | /* for non-physically contiguous pages (system) */ | ||
1832 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw)); | ||
1833 | radeon_ring_write(ring, pe); | ||
1834 | radeon_ring_write(ring, upper_32_bits(pe) & 0xff); | ||
1835 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { | ||
1836 | if (flags & RADEON_VM_PAGE_SYSTEM) { | ||
1837 | value = radeon_vm_map_gart(rdev, addr); | ||
1838 | value &= 0xFFFFFFFFFFFFF000ULL; | ||
1839 | } else if (flags & RADEON_VM_PAGE_VALID) { | ||
1840 | value = addr; | ||
1841 | } else { | ||
1842 | value = 0; | ||
1843 | } | ||
1816 | addr += incr; | 1844 | addr += incr; |
1845 | value |= r600_flags; | ||
1846 | radeon_ring_write(ring, value); | ||
1847 | radeon_ring_write(ring, upper_32_bits(value)); | ||
1817 | } | 1848 | } |
1818 | |||
1819 | value |= r600_flags; | ||
1820 | radeon_ring_write(ring, value); | ||
1821 | radeon_ring_write(ring, upper_32_bits(value)); | ||
1822 | } | 1849 | } |
1823 | } | 1850 | } |
1824 | } | 1851 | } |