diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2012-05-04 01:15:12 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-05-24 02:56:21 -0400 |
commit | fdf53241c1845a4a1d8bd2df65f574b281649957 (patch) | |
tree | d9cf8102465af24257edb99bc778b3142cd5bb83 /drivers/gpu/drm/nouveau | |
parent | 5490e5dfb9e9d654b0ed06c2989a73402496adf6 (diff) |
drm/nva3/ttm: use copy engine for async buffer moves
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 771ce371c4ba..fc463ef92d42 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
@@ -562,6 +562,44 @@ nvc0_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo, | |||
562 | } | 562 | } |
563 | 563 | ||
564 | static int | 564 | static int |
565 | nva3_bo_move_copy(struct nouveau_channel *chan, struct ttm_buffer_object *bo, | ||
566 | struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) | ||
567 | { | ||
568 | struct nouveau_mem *node = old_mem->mm_node; | ||
569 | u64 src_offset = node->vma[0].offset; | ||
570 | u64 dst_offset = node->vma[1].offset; | ||
571 | u32 page_count = new_mem->num_pages; | ||
572 | int ret; | ||
573 | |||
574 | page_count = new_mem->num_pages; | ||
575 | while (page_count) { | ||
576 | int line_count = (page_count > 8191) ? 8191 : page_count; | ||
577 | |||
578 | ret = RING_SPACE(chan, 11); | ||
579 | if (ret) | ||
580 | return ret; | ||
581 | |||
582 | BEGIN_NV04(chan, NvSubCopy, 0x030c, 8); | ||
583 | OUT_RING (chan, upper_32_bits(src_offset)); | ||
584 | OUT_RING (chan, lower_32_bits(src_offset)); | ||
585 | OUT_RING (chan, upper_32_bits(dst_offset)); | ||
586 | OUT_RING (chan, lower_32_bits(dst_offset)); | ||
587 | OUT_RING (chan, PAGE_SIZE); | ||
588 | OUT_RING (chan, PAGE_SIZE); | ||
589 | OUT_RING (chan, PAGE_SIZE); | ||
590 | OUT_RING (chan, line_count); | ||
591 | BEGIN_NV04(chan, NvSubCopy, 0x0300, 1); | ||
592 | OUT_RING (chan, 0x00000110); | ||
593 | |||
594 | page_count -= line_count; | ||
595 | src_offset += (PAGE_SIZE * line_count); | ||
596 | dst_offset += (PAGE_SIZE * line_count); | ||
597 | } | ||
598 | |||
599 | return 0; | ||
600 | } | ||
601 | |||
602 | static int | ||
565 | nv98_bo_move_exec(struct nouveau_channel *chan, struct ttm_buffer_object *bo, | 603 | nv98_bo_move_exec(struct nouveau_channel *chan, struct ttm_buffer_object *bo, |
566 | struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) | 604 | struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) |
567 | { | 605 | { |
@@ -856,8 +894,9 @@ nouveau_bo_move_init(struct nouveau_channel *chan) | |||
856 | int (*init)(struct nouveau_channel *, u32 handle); | 894 | int (*init)(struct nouveau_channel *, u32 handle); |
857 | } _methods[] = { | 895 | } _methods[] = { |
858 | { "COPY", 0xa0b5, nve0_bo_move_copy, nvc0_bo_move_init }, | 896 | { "COPY", 0xa0b5, nve0_bo_move_copy, nvc0_bo_move_init }, |
859 | { "M2MF", 0x9039, nvc0_bo_move_m2mf, nvc0_bo_move_init }, | 897 | { "COPY", 0x85b5, nva3_bo_move_copy, nv50_bo_move_init }, |
860 | { "CRYPT", 0x74c1, nv84_bo_move_exec, nv50_bo_move_init }, | 898 | { "CRYPT", 0x74c1, nv84_bo_move_exec, nv50_bo_move_init }, |
899 | { "M2MF", 0x9039, nvc0_bo_move_m2mf, nvc0_bo_move_init }, | ||
861 | { "M2MF", 0x5039, nv50_bo_move_m2mf, nv50_bo_move_init }, | 900 | { "M2MF", 0x5039, nv50_bo_move_m2mf, nv50_bo_move_init }, |
862 | { "M2MF", 0x0039, nv04_bo_move_m2mf, nv04_bo_move_init }, | 901 | { "M2MF", 0x0039, nv04_bo_move_m2mf, nv04_bo_move_init }, |
863 | {}, | 902 | {}, |