From 8b5b328a1f012135c69f7ae975580c0496b6c7ce Mon Sep 17 00:00:00 2001 From: plutooo Date: Sun, 15 Apr 2018 20:22:03 +0200 Subject: [PATCH] Added Dma --- nx/include/switch.h | 5 +++- .../switch/nvidia/cmds/{vn.h => common.h} | 0 nx/include/switch/nvidia/cmds/dma.h | 13 ++++++++ nx/include/switch/nvidia/cmds/dma_copy.h | 1 + nx/source/nvidia/cmds/dma_copy.c | 30 +++++++++++++++++++ nx/source/nvidia/cmds/dma_memset.c | 0 6 files changed, 48 insertions(+), 1 deletion(-) rename nx/include/switch/nvidia/cmds/{vn.h => common.h} (100%) create mode 100644 nx/include/switch/nvidia/cmds/dma.h create mode 100644 nx/include/switch/nvidia/cmds/dma_copy.h create mode 100644 nx/source/nvidia/cmds/dma_copy.c create mode 100644 nx/source/nvidia/cmds/dma_memset.c diff --git a/nx/include/switch.h b/nx/include/switch.h index 3a965f26..760fd212 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -63,19 +63,22 @@ extern "C" { #include "switch/nvidia/info.h" #include "switch/nvidia/fence.h" #include "switch/nvidia/rect.h" + #include "switch/nvidia/gpu/cmd_list.h" #include "switch/nvidia/gpu/gpfifo.h" #include "switch/nvidia/gpu/zcull_ctx.h" #include "switch/nvidia/gpu/3d_ctx.h" #include "switch/nvidia/gpu/error_notifier.h" #include "switch/nvidia/gpu/gpu.h" -#include "switch/nvidia/cmds/vn.h" + #include "switch/nvidia/cmds/common.h" #include "switch/nvidia/cmds/3d.h" #include "switch/nvidia/cmds/3d_init.h" #include "switch/nvidia/cmds/3d_rendertarget.h" #include "switch/nvidia/cmds/3d_viewport.h" #include "switch/nvidia/cmds/3d_clear.h" +#include "switch/nvidia/cmds/dma.h" +#include "switch/nvidia/cmds/dma_copy.h" #include "switch/runtime/env.h" #include "switch/runtime/nxlink.h" diff --git a/nx/include/switch/nvidia/cmds/vn.h b/nx/include/switch/nvidia/cmds/common.h similarity index 100% rename from nx/include/switch/nvidia/cmds/vn.h rename to nx/include/switch/nvidia/cmds/common.h diff --git a/nx/include/switch/nvidia/cmds/dma.h b/nx/include/switch/nvidia/cmds/dma.h new file mode 100644 index 00000000..ec1fec45 --- /dev/null +++ b/nx/include/switch/nvidia/cmds/dma.h @@ -0,0 +1,13 @@ +enum { + NvRegDma_Launch = 0xC0, + NvRegDma_SourceAddr = 0x100, + NvRegDma_DestinationAddr = 0x102, + NvRegDma_SourcePitch = 0x104, + NvRegDma_DestinationPitch = 0x105, + NvRegDma_Count = 0x106, + /* + 0x1C0 MemsetValue? 1 uint + 0x1C2 MemsetControl? 1 bitfield Seen: 0x34444 + 0x1C4 MemsetLength? 1 uint In units of 4 bytes. + */ +}; diff --git a/nx/include/switch/nvidia/cmds/dma_copy.h b/nx/include/switch/nvidia/cmds/dma_copy.h new file mode 100644 index 00000000..09e7c08b --- /dev/null +++ b/nx/include/switch/nvidia/cmds/dma_copy.h @@ -0,0 +1 @@ +void vnDmaCopy(Vn* vn, iova_t dst, iova_t src, size_t num); diff --git a/nx/source/nvidia/cmds/dma_copy.c b/nx/source/nvidia/cmds/dma_copy.c new file mode 100644 index 00000000..0260fd90 --- /dev/null +++ b/nx/source/nvidia/cmds/dma_copy.c @@ -0,0 +1,30 @@ +#include +#include + +#define DMA_MAXCOPY 0x3FFFFF + +void vnDmaCopy(Vn* vn, iova_t dst, iova_t src, size_t num) { + while (num) { + size_t part = num; + + if (part >= DMA_MAXCOPY) + part = DMA_MAXCOPY; + + vnAddCmd( + vn, + NvIncr( + 4, NvRegDma_SourceAddr, + src>>32, src, + dst>>32, dst, + 1, 1, + part + ), + NvImm( + 4, NvRegDma_Launch, + 0x186 + ) + ); + + num -= part; + } +} diff --git a/nx/source/nvidia/cmds/dma_memset.c b/nx/source/nvidia/cmds/dma_memset.c new file mode 100644 index 00000000..e69de29b