# HG changeset patch # User Louis Opter # Date 1374286330 25200 # Node ID bfe10def90e3f6622271748eb90a51eafc37f748 # Parent b072f682823debe9fd6fc5fe6c4dc2c5bc488a09 Wip diff -r b072f682823d -r bfe10def90e3 rathaxes_samples_e1000_add_a_dma_abstraction.patch --- 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 ++ } ++ ++ 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) diff -r b072f682823d -r bfe10def90e3 rathaxes_samples_e1000_use_the_dma_abstraction_in_socket.patch --- 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