10e5569a0SJean-Sébastien Pédron /* Public domain. */
20e5569a0SJean-Sébastien Pédron
30e5569a0SJean-Sébastien Pédron #ifndef _LINUX_DMA_BUF_MAP_H
40e5569a0SJean-Sébastien Pédron #define _LINUX_DMA_BUF_MAP_H
50e5569a0SJean-Sébastien Pédron
60e5569a0SJean-Sébastien Pédron #include <linux/io.h>
70e5569a0SJean-Sébastien Pédron #include <linux/string.h>
80e5569a0SJean-Sébastien Pédron
90e5569a0SJean-Sébastien Pédron struct dma_buf_map {
100e5569a0SJean-Sébastien Pédron union {
110e5569a0SJean-Sébastien Pédron void *vaddr_iomem;
120e5569a0SJean-Sébastien Pédron void *vaddr;
130e5569a0SJean-Sébastien Pédron };
140e5569a0SJean-Sébastien Pédron bool is_iomem;
150e5569a0SJean-Sébastien Pédron };
160e5569a0SJean-Sébastien Pédron
170e5569a0SJean-Sébastien Pédron static inline void
dma_buf_map_incr(struct dma_buf_map * dbm,size_t n)180e5569a0SJean-Sébastien Pédron dma_buf_map_incr(struct dma_buf_map *dbm, size_t n)
190e5569a0SJean-Sébastien Pédron {
200e5569a0SJean-Sébastien Pédron if (dbm->is_iomem)
210e5569a0SJean-Sébastien Pédron dbm->vaddr_iomem += n;
220e5569a0SJean-Sébastien Pédron else
230e5569a0SJean-Sébastien Pédron dbm->vaddr += n;
240e5569a0SJean-Sébastien Pédron }
250e5569a0SJean-Sébastien Pédron
260e5569a0SJean-Sébastien Pédron static inline void
dma_buf_map_memcpy_to(struct dma_buf_map * dbm,const void * src,size_t len)270e5569a0SJean-Sébastien Pédron dma_buf_map_memcpy_to(struct dma_buf_map *dbm, const void *src, size_t len)
280e5569a0SJean-Sébastien Pédron {
290e5569a0SJean-Sébastien Pédron if (dbm->is_iomem)
300e5569a0SJean-Sébastien Pédron memcpy_toio(dbm->vaddr_iomem, src, len);
310e5569a0SJean-Sébastien Pédron else
320e5569a0SJean-Sébastien Pédron memcpy(dbm->vaddr, src, len);
330e5569a0SJean-Sébastien Pédron }
340e5569a0SJean-Sébastien Pédron
350e5569a0SJean-Sébastien Pédron static inline bool
dma_buf_map_is_null(const struct dma_buf_map * dbm)360e5569a0SJean-Sébastien Pédron dma_buf_map_is_null(const struct dma_buf_map *dbm)
370e5569a0SJean-Sébastien Pédron {
380e5569a0SJean-Sébastien Pédron if (dbm->is_iomem)
390e5569a0SJean-Sébastien Pédron return (dbm->vaddr_iomem == NULL);
400e5569a0SJean-Sébastien Pédron else
410e5569a0SJean-Sébastien Pédron return (dbm->vaddr == NULL);
420e5569a0SJean-Sébastien Pédron }
430e5569a0SJean-Sébastien Pédron
440e5569a0SJean-Sébastien Pédron static inline bool
dma_buf_map_is_set(const struct dma_buf_map * dbm)450e5569a0SJean-Sébastien Pédron dma_buf_map_is_set(const struct dma_buf_map *dbm)
460e5569a0SJean-Sébastien Pédron {
470e5569a0SJean-Sébastien Pédron if (dbm->is_iomem)
480e5569a0SJean-Sébastien Pédron return (dbm->vaddr_iomem != NULL);
490e5569a0SJean-Sébastien Pédron else
500e5569a0SJean-Sébastien Pédron return (dbm->vaddr != NULL);
510e5569a0SJean-Sébastien Pédron }
520e5569a0SJean-Sébastien Pédron
530e5569a0SJean-Sébastien Pédron static inline bool
dma_buf_map_is_equal(const struct dma_buf_map * dbm_a,const struct dma_buf_map * dbm_b)540e5569a0SJean-Sébastien Pédron dma_buf_map_is_equal(
550e5569a0SJean-Sébastien Pédron const struct dma_buf_map *dbm_a, const struct dma_buf_map *dbm_b)
560e5569a0SJean-Sébastien Pédron {
570e5569a0SJean-Sébastien Pédron if (dbm_a->is_iomem != dbm_b->is_iomem)
580e5569a0SJean-Sébastien Pédron return (false);
590e5569a0SJean-Sébastien Pédron
600e5569a0SJean-Sébastien Pédron if (dbm_a->is_iomem)
610e5569a0SJean-Sébastien Pédron return (dbm_a->vaddr_iomem == dbm_b->vaddr_iomem);
620e5569a0SJean-Sébastien Pédron else
630e5569a0SJean-Sébastien Pédron return (dbm_a->vaddr == dbm_b->vaddr);
640e5569a0SJean-Sébastien Pédron }
650e5569a0SJean-Sébastien Pédron
660e5569a0SJean-Sébastien Pédron static inline void
dma_buf_map_clear(struct dma_buf_map * dbm)670e5569a0SJean-Sébastien Pédron dma_buf_map_clear(struct dma_buf_map *dbm)
680e5569a0SJean-Sébastien Pédron {
690e5569a0SJean-Sébastien Pédron if (dbm->is_iomem) {
700e5569a0SJean-Sébastien Pédron dbm->vaddr_iomem = NULL;
710e5569a0SJean-Sébastien Pédron dbm->is_iomem = false;
720e5569a0SJean-Sébastien Pédron } else {
730e5569a0SJean-Sébastien Pédron dbm->vaddr = NULL;
740e5569a0SJean-Sébastien Pédron }
750e5569a0SJean-Sébastien Pédron }
760e5569a0SJean-Sébastien Pédron
770e5569a0SJean-Sébastien Pédron static inline void
dma_buf_map_set_vaddr_iomem(struct dma_buf_map * dbm,void * addr)780e5569a0SJean-Sébastien Pédron dma_buf_map_set_vaddr_iomem(struct dma_buf_map *dbm, void *addr)
790e5569a0SJean-Sébastien Pédron {
800e5569a0SJean-Sébastien Pédron dbm->vaddr_iomem = addr;
810e5569a0SJean-Sébastien Pédron dbm->is_iomem = true;
820e5569a0SJean-Sébastien Pédron }
830e5569a0SJean-Sébastien Pédron
840e5569a0SJean-Sébastien Pédron static inline void
dma_buf_map_set_vaddr(struct dma_buf_map * dbm,void * addr)850e5569a0SJean-Sébastien Pédron dma_buf_map_set_vaddr(struct dma_buf_map *dbm, void *addr)
860e5569a0SJean-Sébastien Pédron {
870e5569a0SJean-Sébastien Pédron dbm->vaddr = addr;
880e5569a0SJean-Sébastien Pédron dbm->is_iomem = false;
890e5569a0SJean-Sébastien Pédron }
900e5569a0SJean-Sébastien Pédron
910e5569a0SJean-Sébastien Pédron #endif
92