Implement the dma-* words in the root node using Forth, except for dma-alloc and dma-sync which require C to use the in-built aligned memory allocator and I-cache and D-cache flushing.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- arch/ppc/qemu/init.c | 35 +++++++++++++++++++++++++++++++++++ arch/ppc/qemu/tree.fs | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+)
diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c index 8524750..74a4c6b 100644 --- a/arch/ppc/qemu/init.c +++ b/arch/ppc/qemu/init.c @@ -751,6 +751,35 @@ static void adler32(void) RET(s2 << 16 | s1); }
+/* ( size -- virt ) */ +static void +dma_alloc(void) +{ + ucell size = POP(); + ucell addr; + int ret; + + ret = ofmem_posix_memalign((void *)&addr, size, PAGE_SIZE); + + if (ret) { + PUSH(0); + } else { + PUSH(addr); + } +} + +/* ( virt devaddr size -- ) */ +static void +dma_sync(void) +{ + ucell size = POP(); + POP(); + ucell virt = POP(); + + flush_dcache_range(cell2pointer(virt), cell2pointer(virt + size)); + flush_icache_range(cell2pointer(virt), cell2pointer(virt + size)); +} + void arch_of_init(void) { @@ -768,6 +797,12 @@ arch_of_init(void) openbios_init(); modules_init(); setup_timers(); + + bind_func("ppc-dma-alloc", dma_alloc); + feval("['] ppc-dma-alloc to (dma-alloc)"); + bind_func("ppc-dma-sync", dma_sync); + feval("['] ppc-dma-sync to (dma-sync)"); + #ifdef CONFIG_DRIVER_PCI ob_pci_init(); #endif diff --git a/arch/ppc/qemu/tree.fs b/arch/ppc/qemu/tree.fs index 5b6bbc6..481acd9 100644 --- a/arch/ppc/qemu/tree.fs +++ b/arch/ppc/qemu/tree.fs @@ -7,6 +7,26 @@
include config.fs
+\ --------- +\ DMA words +\ --------- + +: ppc-dma-free ( virt size -- ) + 2drop +; + +: ppc-dma-map-in ( virt size cacheable? -- devaddr ) + 2drop +; + +: ppc-dma-map-out ( virt devaddr size -- ) + (dma-sync) +; + +['] ppc-dma-free to (dma-free) +['] ppc-dma-map-in to (dma-map-in) +['] ppc-dma-map-out to (dma-map-out) + \ ------------------------------------------------------------- \ device-tree \ ------------------------------------------------------------- @@ -18,6 +38,26 @@ include config.fs 1 encode-int " #size-cells" property h# 05f5e100 encode-int " clock-frequency" property
+ : dma-sync + (dma-sync) + ; + + : dma-alloc + (dma-alloc) + ; + + : dma-free + (dma-free) + ; + + : dma-map-in + (dma-map-in) + ; + + : dma-map-out + (dma-map-out) + ; + new-device " cpus" device-name 1 encode-int " #address-cells" property