diff options
| -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 b81aca44fd41..39e8be1d1e89 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 | } |
