diff rathaxes_samples_e1000_add_a_dma_abstraction.patch @ 115:5a663f8f0e54

WIP, fix another small bug in rathaxes sequence calls
author Louis Opter <louis@lse.epita.fr>
date Mon, 22 Jul 2013 13:52:00 -0700
parents bfe10def90e3
children f3c7e9b0c5cf
line wrap: on
line diff
--- a/rathaxes_samples_e1000_add_a_dma_abstraction.patch	Mon Jul 22 00:35:20 2013 -0700
+++ b/rathaxes_samples_e1000_add_a_dma_abstraction.patch	Mon Jul 22 13:52:00 2013 -0700
@@ -1,5 +1,5 @@
 # HG changeset patch
-# Parent 0f12e80e810de1a9927db1f25dbea49acd73ae3c
+# Parent af7a1f8589d632497e2f2574570f5153cae59b91
 e1000: start a DMA allocation/mapping abstraction
 
 It currently matches a lot the Linux DMA API but it should be usable by
@@ -35,10 +35,10 @@
 new file mode 100644
 --- /dev/null
 +++ b/rathaxes/samples/e1000/dma.blt
-@@ -0,0 +1,81 @@
+@@ -0,0 +1,89 @@
 +with DMA, Builtin, LKM, Device
 +{
-+    template type   AbstractDMAHandle()
++    template type   DMA::AbstractDMAHandle()
 +    {
 +        chunk   LKM::includes()
 +        {
@@ -52,11 +52,11 @@
 +
 +        map
 +        {
-+            k_dma_handle: ((dma_addr_t *)${self});
++            k_dma_handle: ((dma_addr_t)${self});
 +        }
 +    }
 +
-+    template type   AbstractDMADirection()
++    template type   DMA::AbstractDMADirection()
 +    {
 +        decl    data_types()
 +        {
@@ -69,7 +69,7 @@
 +        }
 +    }
 +
-+    template type   DMADirection()
++    template type   DMA::DMADirection()
 +    {
 +        decl    data_types()
 +        {
@@ -80,20 +80,20 @@
 +
 +        map
 +        {
-+            /* XXX: we should use ${AbstractDMADirection} here: */
++            /* XXX: we should use ${DMA::AbstractDMADirection} here: */
 +            dma_direction: ((enum dma_data_direction)${self});
 +        }
 +    }
 +
-+    template sequence   map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMADirection dir)
++    template sequence   map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMA::DMADirection dir)
 +    {
 +        chunk  ::CALL()
 +        {
-+            dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction});
++            ((${DMA::DMA::AbstractDMAHandle})dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction}));
 +        }
 +    }
 +
-+    template sequence   unmap(Device::AbstractDevice dev, AbstractDMAHandle handle, Builtin::number size, DMADirection dir)
++    template sequence   unmap(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle, Builtin::number size, DMA::DMADirection dir)
 +    {
 +        chunk  ::CALL()
 +        {
@@ -101,15 +101,23 @@
 +        }
 +    }
 +
-+    template sequence   alloc_coherent(Device::AbstractDevice dev, Builtin::number size, AbstractDMAHandle handle)
++    template sequence   mapping_error(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle)
++    {
++        chunk ::CALL()
++        {
++            dma_mapping_error(${dev.k_device}, ${handle.k_dma_handle});
++        }
++    }
++
++    template sequence   alloc_coherent(Device::AbstractDevice dev, Builtin::number size, DMA::AbstractDMAHandle handle)
 +    {
 +        chunk  ::CALL()
 +        {
-+            dma_alloc_coherent(${dev.k_device}, ${size}, ${handle.k_dma_handle}, GFP_KERNEL);
++            dma_alloc_coherent(${dev.k_device}, ${size}, &${handle.k_dma_handle}, GFP_KERNEL);
 +        }
 +    }
 +
-+    template sequence   free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, AbstractDMAHandle handle)
++    template sequence   free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, DMA::AbstractDMAHandle handle)
 +    {
 +        chunk  ::CALL()
 +        {
@@ -121,7 +129,7 @@
 new file mode 100644
 --- /dev/null
 +++ b/rathaxes/samples/e1000/dma.rti
-@@ -0,0 +1,42 @@
+@@ -0,0 +1,48 @@
 +interface DMA : Builtin, LKM, Device
 +{
 +    provided type   AbstractDMAHandle
@@ -153,6 +161,12 @@
 +        provided chunk  ::CALL();
 +    }
 +
++    /* XXX: Until we have a real error handling mechanism: */
++    provided sequence   mapping_error(Device::AbstractDevice, AbstractDMAHandle)
++    {
++        provided chunk  ::CALL(); /* -> != 0 if the mapping failed */
++    }
++
 +    provided sequence   alloc_coherent(Device::AbstractDevice, Builtin::number, AbstractDMAHandle)
 +    {
 +        /* return the addr and the handle via the AbstractDMAHandle ptr: */