1828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#ifndef _ASM_S390_DMA_MAPPING_H 2828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#define _ASM_S390_DMA_MAPPING_H 3828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 4828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/kernel.h> 5828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/types.h> 6828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/mm.h> 7828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/scatterlist.h> 8828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/dma-attrs.h> 9828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/dma-debug.h> 10828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <linux/io.h> 11828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 12828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#define DMA_ERROR_CODE (~(dma_addr_t) 0x0) 13828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 14828b35f60eb0148f994bb13e328df94578b07142Jan Glauberextern struct dma_map_ops s390_dma_ops; 15828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 16828b35f60eb0148f994bb13e328df94578b07142Jan Glauberstatic inline struct dma_map_ops *get_dma_ops(struct device *dev) 17828b35f60eb0148f994bb13e328df94578b07142Jan Glauber{ 18828b35f60eb0148f994bb13e328df94578b07142Jan Glauber return &s390_dma_ops; 19828b35f60eb0148f994bb13e328df94578b07142Jan Glauber} 20828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 21828b35f60eb0148f994bb13e328df94578b07142Jan Glauberextern int dma_set_mask(struct device *dev, u64 mask); 22e978948db125cc3b90cc324c68e7787f0ac7be4aHeiko Carstens 23e978948db125cc3b90cc324c68e7787f0ac7be4aHeiko Carstensstatic inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size, 24e978948db125cc3b90cc324c68e7787f0ac7be4aHeiko Carstens enum dma_data_direction direction) 25e978948db125cc3b90cc324c68e7787f0ac7be4aHeiko Carstens{ 26e978948db125cc3b90cc324c68e7787f0ac7be4aHeiko Carstens} 27828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 28828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) 29828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) 30828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 31828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#include <asm-generic/dma-mapping-common.h> 32828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 33828b35f60eb0148f994bb13e328df94578b07142Jan Glauberstatic inline int dma_supported(struct device *dev, u64 mask) 34828b35f60eb0148f994bb13e328df94578b07142Jan Glauber{ 35828b35f60eb0148f994bb13e328df94578b07142Jan Glauber struct dma_map_ops *dma_ops = get_dma_ops(dev); 36828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 37828b35f60eb0148f994bb13e328df94578b07142Jan Glauber if (dma_ops->dma_supported == NULL) 38828b35f60eb0148f994bb13e328df94578b07142Jan Glauber return 1; 39828b35f60eb0148f994bb13e328df94578b07142Jan Glauber return dma_ops->dma_supported(dev, mask); 40828b35f60eb0148f994bb13e328df94578b07142Jan Glauber} 41828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 42828b35f60eb0148f994bb13e328df94578b07142Jan Glauberstatic inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) 43828b35f60eb0148f994bb13e328df94578b07142Jan Glauber{ 44828b35f60eb0148f994bb13e328df94578b07142Jan Glauber if (!dev->dma_mask) 45828b35f60eb0148f994bb13e328df94578b07142Jan Glauber return 0; 46828b35f60eb0148f994bb13e328df94578b07142Jan Glauber return addr + size - 1 <= *dev->dma_mask; 47828b35f60eb0148f994bb13e328df94578b07142Jan Glauber} 48828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 49828b35f60eb0148f994bb13e328df94578b07142Jan Glauberstatic inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) 50828b35f60eb0148f994bb13e328df94578b07142Jan Glauber{ 51828b35f60eb0148f994bb13e328df94578b07142Jan Glauber struct dma_map_ops *dma_ops = get_dma_ops(dev); 52828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 534026099a3118a1e038c48f3f85203a674938025bSebastian Ott debug_dma_mapping_error(dev, dma_addr); 54828b35f60eb0148f994bb13e328df94578b07142Jan Glauber if (dma_ops->mapping_error) 55828b35f60eb0148f994bb13e328df94578b07142Jan Glauber return dma_ops->mapping_error(dev, dma_addr); 56a9a5250cc650b54623827386247b85ba2aeeecc7Sebastian Ott return dma_addr == DMA_ERROR_CODE; 57828b35f60eb0148f994bb13e328df94578b07142Jan Glauber} 58828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 5990114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding#define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL) 6090114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding 6190114d65feea716eeae0ab51e92c95b140b2e6fcThierry Redingstatic inline void *dma_alloc_attrs(struct device *dev, size_t size, 6290114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding dma_addr_t *dma_handle, gfp_t flags, 6390114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding struct dma_attrs *attrs) 64828b35f60eb0148f994bb13e328df94578b07142Jan Glauber{ 65828b35f60eb0148f994bb13e328df94578b07142Jan Glauber struct dma_map_ops *ops = get_dma_ops(dev); 6690114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding void *cpu_addr; 6790114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding 6890114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding BUG_ON(!ops); 69828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 7090114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding cpu_addr = ops->alloc(dev, size, dma_handle, flags, attrs); 7190114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr); 7290114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding 7390114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding return cpu_addr; 74828b35f60eb0148f994bb13e328df94578b07142Jan Glauber} 75828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 7690114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding#define dma_free_coherent(d, s, c, h) dma_free_attrs(d, s, c, h, NULL) 7790114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding 7890114d65feea716eeae0ab51e92c95b140b2e6fcThierry Redingstatic inline void dma_free_attrs(struct device *dev, size_t size, 7990114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding void *cpu_addr, dma_addr_t dma_handle, 8090114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding struct dma_attrs *attrs) 81828b35f60eb0148f994bb13e328df94578b07142Jan Glauber{ 8290114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding struct dma_map_ops *ops = get_dma_ops(dev); 8390114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding 8490114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding BUG_ON(!ops); 85828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 86828b35f60eb0148f994bb13e328df94578b07142Jan Glauber debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); 8790114d65feea716eeae0ab51e92c95b140b2e6fcThierry Reding ops->free(dev, size, cpu_addr, dma_handle, attrs); 88828b35f60eb0148f994bb13e328df94578b07142Jan Glauber} 89828b35f60eb0148f994bb13e328df94578b07142Jan Glauber 90828b35f60eb0148f994bb13e328df94578b07142Jan Glauber#endif /* _ASM_S390_DMA_MAPPING_H */ 91