Skip to content

Commit 6c762d1

Browse files
author
Ben Skeggs
committed
drm/nouveau/dmem: extend copy function to allow direct use of physical addresses
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
1 parent f180bf1 commit 6c762d1

File tree

1 file changed

+50
-6
lines changed

1 file changed

+50
-6
lines changed

drivers/gpu/drm/nouveau/nouveau_dmem.c

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,15 @@
4646

4747
struct nouveau_migrate;
4848

49+
enum nouveau_aper {
50+
NOUVEAU_APER_VIRT,
51+
NOUVEAU_APER_VRAM,
52+
NOUVEAU_APER_HOST,
53+
};
54+
4955
typedef int (*nouveau_migrate_copy_t)(struct nouveau_drm *drm, u64 npages,
50-
u64 dst_addr, u64 src_addr);
56+
enum nouveau_aper, u64 dst_addr,
57+
enum nouveau_aper, u64 src_addr);
5158

5259
struct nouveau_dmem_chunk {
5360
struct list_head list;
@@ -267,7 +274,8 @@ nouveau_dmem_fault_alloc_and_copy(struct vm_area_struct *vma,
267274
src_addr = page_to_pfn(spage) - chunk->pfn_first;
268275
src_addr = (src_addr << PAGE_SHIFT) + chunk->vma.addr;
269276

270-
ret = copy(drm, 1, dst_addr, src_addr);
277+
ret = copy(drm, 1, NOUVEAU_APER_VIRT, dst_addr,
278+
NOUVEAU_APER_VIRT, src_addr);
271279
if (ret) {
272280
dst_pfns[i] = MIGRATE_PFN_ERROR;
273281
__free_page(dpage);
@@ -588,15 +596,49 @@ nouveau_dmem_fini(struct nouveau_drm *drm)
588596

589597
static int
590598
nvc0b5_migrate_copy(struct nouveau_drm *drm, u64 npages,
591-
u64 dst_addr, u64 src_addr)
599+
enum nouveau_aper dst_aper, u64 dst_addr,
600+
enum nouveau_aper src_aper, u64 src_addr)
592601
{
593602
struct nouveau_channel *chan = drm->dmem->migrate.chan;
603+
u32 launch_dma = (1 << 9) /* MULTI_LINE_ENABLE. */ |
604+
(1 << 8) /* DST_MEMORY_LAYOUT_PITCH. */ |
605+
(1 << 7) /* SRC_MEMORY_LAYOUT_PITCH. */ |
606+
(1 << 2) /* FLUSH_ENABLE_TRUE. */ |
607+
(2 << 0) /* DATA_TRANSFER_TYPE_NON_PIPELINED. */;
594608
int ret;
595609

596-
ret = RING_SPACE(chan, 10);
610+
ret = RING_SPACE(chan, 13);
597611
if (ret)
598612
return ret;
599613

614+
if (src_aper != NOUVEAU_APER_VIRT) {
615+
switch (src_aper) {
616+
case NOUVEAU_APER_VRAM:
617+
BEGIN_IMC0(chan, NvSubCopy, 0x0260, 0);
618+
break;
619+
case NOUVEAU_APER_HOST:
620+
BEGIN_IMC0(chan, NvSubCopy, 0x0260, 1);
621+
break;
622+
default:
623+
return -EINVAL;
624+
}
625+
launch_dma |= 0x00001000; /* SRC_TYPE_PHYSICAL. */
626+
}
627+
628+
if (dst_aper != NOUVEAU_APER_VIRT) {
629+
switch (dst_aper) {
630+
case NOUVEAU_APER_VRAM:
631+
BEGIN_IMC0(chan, NvSubCopy, 0x0264, 0);
632+
break;
633+
case NOUVEAU_APER_HOST:
634+
BEGIN_IMC0(chan, NvSubCopy, 0x0264, 1);
635+
break;
636+
default:
637+
return -EINVAL;
638+
}
639+
launch_dma |= 0x00002000; /* DST_TYPE_PHYSICAL. */
640+
}
641+
600642
BEGIN_NVC0(chan, NvSubCopy, 0x0400, 8);
601643
OUT_RING (chan, upper_32_bits(src_addr));
602644
OUT_RING (chan, lower_32_bits(src_addr));
@@ -606,7 +648,8 @@ nvc0b5_migrate_copy(struct nouveau_drm *drm, u64 npages,
606648
OUT_RING (chan, PAGE_SIZE);
607649
OUT_RING (chan, PAGE_SIZE);
608650
OUT_RING (chan, npages);
609-
BEGIN_IMC0(chan, NvSubCopy, 0x0300, 0x0386);
651+
BEGIN_NVC0(chan, NvSubCopy, 0x0300, 1);
652+
OUT_RING (chan, launch_dma);
610653
return 0;
611654
}
612655

@@ -761,7 +804,8 @@ nouveau_dmem_migrate_alloc_and_copy(struct vm_area_struct *vma,
761804
src_addr = migrate->hmem.vma.addr + (c << PAGE_SHIFT);
762805
c++;
763806

764-
ret = copy(drm, 1, dst_addr, src_addr);
807+
ret = copy(drm, 1, NOUVEAU_APER_VIRT, dst_addr,
808+
NOUVEAU_APER_VIRT, src_addr);
765809
if (ret) {
766810
nouveau_dmem_page_free_locked(drm, dpage);
767811
dst_pfns[i] = 0;

0 commit comments

Comments
 (0)