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