diff options
| -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 | {}, |
