aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-05-27 14:10:28 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-06-02 10:25:15 -0400
commit3d7938faf3d7a792c11fcd11abbffdb18dfd6ee2 (patch)
treebb9b6afb2e461c9d7de76f7b3409eeea18679bbb
parentf3982ac141379d7fca32fe94c20527cd347678b3 (diff)
drm/radeon: optimize CIK VM handling v2
Fill VM page tables from the GART page table if applicable. v2: fix copy&paste error Signed-off-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index f7e46cf682af..3c2407bad1f0 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -741,7 +741,26 @@ void cik_sdma_vm_set_page(struct radeon_device *rdev,
741 741
742 trace_radeon_vm_set_page(pe, addr, count, incr, flags); 742 trace_radeon_vm_set_page(pe, addr, count, incr, flags);
743 743
744 if (flags & R600_PTE_SYSTEM) { 744 if (flags == R600_PTE_GART) {
745 uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8;
746 while (count) {
747 unsigned bytes = count * 8;
748 if (bytes > 0x1FFFF8)
749 bytes = 0x1FFFF8;
750
751 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
752 ib->ptr[ib->length_dw++] = bytes;
753 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
754 ib->ptr[ib->length_dw++] = src & 0xffffffff;
755 ib->ptr[ib->length_dw++] = upper_32_bits(src);
756 ib->ptr[ib->length_dw++] = pe & 0xffffffff;
757 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
758
759 pe += bytes;
760 src += bytes;
761 count -= bytes / 8;
762 }
763 } else if (flags & R600_PTE_SYSTEM) {
745 while (count) { 764 while (count) {
746 ndw = count * 2; 765 ndw = count * 2;
747 if (ndw > 0xFFFFE) 766 if (ndw > 0xFFFFE)