changeset 112:bfe10def90e3

Wip
author Louis Opter <louis@lse.epita.fr>
date Fri, 19 Jul 2013 19:12:10 -0700
parents b072f682823d
children b22983cb9e3a
files rathaxes_samples_e1000_add_a_dma_abstraction.patch rathaxes_samples_e1000_use_the_dma_abstraction_in_socket.patch
diffstat 2 files changed, 217 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/rathaxes_samples_e1000_add_a_dma_abstraction.patch	Sun Jul 14 23:14:33 2013 -0700
+++ b/rathaxes_samples_e1000_add_a_dma_abstraction.patch	Fri Jul 19 19:12:10 2013 -0700
@@ -9,12 +9,119 @@
 This will be useful to remove Linux specific DMA code from
 e1000::set_up_device which should be only device independent code.
 
-
+diff --git a/rathaxes/samples/e1000/CMakeLists.txt b/rathaxes/samples/e1000/CMakeLists.txt
+--- a/rathaxes/samples/e1000/CMakeLists.txt
++++ b/rathaxes/samples/e1000/CMakeLists.txt
+@@ -5,6 +5,7 @@
+                      log.rti
+                      lkm.rti
+                      device.rti
++                     dma.rti
+                      pci.rti
+                      socket.rti
+                      ethernet.rti
+@@ -12,8 +13,9 @@
+                      BLT
+                      log.blt
+                      lkm.blt
++                     device.blt
++                     dma.blt
+                      pci.blt
+-                     device.blt
+                      socket.blt
+                      e1000.blt
+                      ethernet.blt)
+diff --git a/rathaxes/samples/e1000/dma.blt b/rathaxes/samples/e1000/dma.blt
+new file mode 100644
+--- /dev/null
++++ b/rathaxes/samples/e1000/dma.blt
+@@ -0,0 +1,81 @@
++with DMA, Builtin, LKM, Device
++{
++    template type   AbstractDMAHandle()
++    {
++        chunk   LKM::includes()
++        {
++            #include <linux/dma-mapping.h>
++        }
++
++        decl    data_types()
++        {
++            dma_addr_t  data;
++        }
++
++        map
++        {
++            k_dma_handle: ((dma_addr_t *)${self});
++        }
++    }
++
++    template type   AbstractDMADirection()
++    {
++        decl    data_types()
++        {
++            enum dma_data_direction data;
++        }
++
++        map
++        {
++            k_dma_direction: ((enum dma_data_direction)${self});
++        }
++    }
++
++    template type   DMADirection()
++    {
++        decl    data_types()
++        {
++            RTX_DMA_BIDIRECTIONAL   = DMA_BIDIRECTIONAL,
++            RTX_DMA_TO_DEVICE       = DMA_TO_DEVICE,
++            RTX_DMA_FROM_DEVICE     = DMA_FROM_DEVICE
++        }
++
++        map
++        {
++            /* XXX: we should use ${AbstractDMADirection} here: */
++            dma_direction: ((enum dma_data_direction)${self});
++        }
++    }
++
++    template sequence   map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMADirection dir)
++    {
++        chunk  ::CALL()
++        {
++            dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction});
++        }
++    }
++
++    template sequence   unmap(Device::AbstractDevice dev, AbstractDMAHandle handle, Builtin::number size, DMADirection dir)
++    {
++        chunk  ::CALL()
++        {
++            dma_unmap_single(${dev.k_device}, ${handle.k_dma_handle}, ${size}, ${dir.dma_direction});
++        }
++    }
++
++    template sequence   alloc_coherent(Device::AbstractDevice dev, Builtin::number size, AbstractDMAHandle handle)
++    {
++        chunk  ::CALL()
++        {
++            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)
++    {
++        chunk  ::CALL()
++        {
++            dma_free_coherent(${dev.k_device}, ${size}, ${addr}, ${handle.k_dma_handle});
++        }
++    }
++}
 diff --git a/rathaxes/samples/e1000/dma.rti b/rathaxes/samples/e1000/dma.rti
 new file mode 100644
 --- /dev/null
 +++ b/rathaxes/samples/e1000/dma.rti
-@@ -0,0 +1,34 @@
+@@ -0,0 +1,42 @@
 +interface DMA : Builtin, LKM, Device
 +{
 +    provided type   AbstractDMAHandle
@@ -24,24 +131,32 @@
 +        attribute   Builtin::symbol.scalar  k_dma_handle;
 +    }
 +
-+    provided type   Direction
++    provided type   AbstractDMADirection
 +    {
-+        decl    data_types();
++        decl        data_types();
++        attribute   Builtin::symbol.scalar  k_dma_direction;
 +    }
 +
-+    provided sequence   map(Device::AbstractDevice, Builtin::symbol, Builtin::number, Direction)
++    provided type   DMADirection
 +    {
-+        provided chunk  ::CALL(); /* -> AbstractDMAHandle */
++        decl        data_types();
++        attribute   AbstractDMADirection.scalar dma_direction;
 +    }
 +
-+    provided sequence   unmap(Device::AbstractDevice, AbstractDMAHandle, Builtin::number, Direction)
++    provided sequence   map(Device::AbstractDevice, Builtin::symbol, Builtin::number, DMADirection)
++    {
++        provided chunk  ::CALL(); /* -> DMAHandle */
++    }
++
++    provided sequence   unmap(Device::AbstractDevice, AbstractDMAHandle, Builtin::number, DMADirection)
 +    {
 +        provided chunk  ::CALL();
 +    }
 +
-+    provided sequence   alloc_coherent(Device::AbstractDevice, Builtin::number, Builtin::symbol)
++    provided sequence   alloc_coherent(Device::AbstractDevice, Builtin::number, AbstractDMAHandle)
 +    {
-+        provided chunk  ::CALL(); /* -> AbstractDMAHandle + addr returned via the symbol */
++        /* return the addr and the handle via the AbstractDMAHandle ptr: */
++        provided chunk  ::CALL();
 +    }
 +
 +    provided sequence   free_coherent(Device::AbstractDevice, Builtin::number, Builtin::symbol, AbstractDMAHandle)
--- a/rathaxes_samples_e1000_use_the_dma_abstraction_in_socket.patch	Sun Jul 14 23:14:33 2013 -0700
+++ b/rathaxes_samples_e1000_use_the_dma_abstraction_in_socket.patch	Fri Jul 19 19:12:10 2013 -0700
@@ -1,5 +1,96 @@
 # HG changeset patch
-# Parent df8528e511f471ceaf70e9145e4c6d0f58b0a26a
+# Parent c571aba317b28723d36bf15393be227b41fce242
 Replace Linux specific code in Socket by DMA calls
 
-
+diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt
+--- a/rathaxes/samples/e1000/socket.blt
++++ b/rathaxes/samples/e1000/socket.blt
+@@ -1,4 +1,4 @@
+-with Socket, LKM, Device, Ethernet
++with Socket, LKM, Device, DMA, Ethernet
+ {
+     template type Socket::AbstractSKBuff()
+     {
+@@ -22,15 +22,15 @@
+     {
+         decl  data_types()
+         {
+-            ${Socket::AbstractSKBuff.ref}   skbuff;
+-            dma_addr_t                      dma_handle;
++            ${Socket::AbstractSKBuff.ref}       skbuff;
++            ${DMA::AbstractDMAHandle.scalar}    dma_handle;
+         }
+ 
+         chunk   LKM::prototypes()
+         {
+             static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref});
+-            static int  rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction);
+-            static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction);
++            static int  rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, ${DMA::DMADirection});
++            static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, ${DMA::DMADirection});
+         }
+ 
+         chunk   LKM::code()
+@@ -66,7 +66,7 @@
+ 
+             static int rtx_socket_skbuff_map(${Socket::SKBuff.ref} self,
+                                              struct device *dev,
+-                                             enum dma_data_direction direction)
++                                             ${DMA::DMADirection} direction)
+             {
+                 ${Socket::AbstractSKBuff.ref}   skb = self->skbuff;
+ 
+@@ -77,7 +77,7 @@
+                         dev,
+                         ${local.skb.k_sk_buff},
+                         skb_headlen(${local.skb.k_sk_buff}),
+-                        direction);
++                        ${local.direction.dma_direction});
+                 int err = dma_mapping_error(dev, self->dma_handle);
+                 if (err)
+                 {
+@@ -89,7 +89,7 @@
+ 
+             static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref} self,
+                                                          struct device *dev,
+-                                                         enum dma_data_direction direction)
++                                                         ${DMA::DMADirection} direction)
+             {
+                 ${Socket::AbstractSKBuff.ref}   skb = self->skbuff;
+ 
+@@ -100,7 +100,7 @@
+                     dma_unmap_single(dev,
+                             self->dma_handle,
+                             skb_headlen(${local.skb.k_sk_buff}),
+-                            direction);
++                            ${local.direction.dma_direction});
+                     self->dma_handle = 0;
+                 }
+                 dev_kfree_skb_any(${local.skb.k_sk_buff});
+@@ -126,22 +126,22 @@
+ 
+         method   map_to(Device::AbstractDevice dev)
+         {
+-            rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE);
++            rtx_socket_skbuff_map(${self}, ${dev.k_device}, RTX_DMA_TO_DEVICE);
+         }
+ 
+         method   map_from(Device::AbstractDevice dev)
+         {
+-            rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_FROM_DEVICE);
++            rtx_socket_skbuff_map(${self}, ${dev.k_device}, RTX_DMA_FROM_DEVICE);
+         }
+ 
+         method   unmap_to_and_free(Device::AbstractDevice dev)
+         {
+-            rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, DMA_TO_DEVICE);
++            rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, RTX_DMA_TO_DEVICE);
+         }
+ 
+         method   unmap_from_and_free(Device::AbstractDevice dev)
+         {
+-            rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, DMA_FROM_DEVICE);
++            rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, RTX_DMA_FROM_DEVICE);
+         }
+ 
+         map