1a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn/* 2a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * OpenRISC Linux 3a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * 4a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * Linux architectural port borrowing liberally from similar works of 5a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * others. All original copyrights apply as per the original source 6a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * declaration. 7a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * 8a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * OpenRISC implementation: 9a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 10a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * 11a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * This program is free software; you can redistribute it and/or modify 12a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * it under the terms of the GNU General Public License as published by 13a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * the Free Software Foundation; either version 2 of the License, or 14a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * (at your option) any later version. 15a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn */ 16a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 17a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#ifndef __ASM_OPENRISC_DMA_MAPPING_H 18a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#define __ASM_OPENRISC_DMA_MAPPING_H 19a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 20a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn/* 21395cf9691d72173d8cdaa613c5f0255f993af94bPaul Bolle * See Documentation/DMA-API-HOWTO.txt and 22a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * Documentation/DMA-API.txt for documentation. 23a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * 24a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * This file is written with the intention of eventually moving over 25a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn * to largely using asm-generic/dma-mapping-common.h in its place. 26a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn */ 27a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 28a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#include <linux/dma-debug.h> 29a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#include <asm-generic/dma-coherent.h> 30a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#include <linux/kmemcheck.h> 31a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 32a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#define DMA_ERROR_CODE (~(dma_addr_t)0x0) 33a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 34a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 35a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) 36a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) 37a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 38a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnvoid *or1k_dma_alloc_coherent(struct device *dev, size_t size, 39a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t *dma_handle, gfp_t flag); 40a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnvoid or1k_dma_free_coherent(struct device *dev, size_t size, void *vaddr, 41a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t dma_handle); 42a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonndma_addr_t or1k_map_page(struct device *dev, struct page *page, 43a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn unsigned long offset, size_t size, 44a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir, 45a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn struct dma_attrs *attrs); 46a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnvoid or1k_unmap_page(struct device *dev, dma_addr_t dma_handle, 47a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn size_t size, enum dma_data_direction dir, 48a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn struct dma_attrs *attrs); 49707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnint or1k_map_sg(struct device *dev, struct scatterlist *sg, 50707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn int nents, enum dma_data_direction dir, 51707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn struct dma_attrs *attrs); 52707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnvoid or1k_unmap_sg(struct device *dev, struct scatterlist *sg, 53707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn int nents, enum dma_data_direction dir, 54707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn struct dma_attrs *attrs); 55a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnvoid or1k_sync_single_for_cpu(struct device *dev, 56a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t dma_handle, size_t size, 57a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir); 58a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnvoid or1k_sync_single_for_device(struct device *dev, 59a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t dma_handle, size_t size, 60a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir); 61a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 62a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline void *dma_alloc_coherent(struct device *dev, size_t size, 63a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t *dma_handle, gfp_t flag) 64a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 65a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn void *memory; 66a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 67a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn memory = or1k_dma_alloc_coherent(dev, size, dma_handle, flag); 68a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 69a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn debug_dma_alloc_coherent(dev, size, *dma_handle, memory); 70a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn return memory; 71a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 72a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 73a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline void dma_free_coherent(struct device *dev, size_t size, 74a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn void *cpu_addr, dma_addr_t dma_handle) 75a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 76a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); 77a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn or1k_dma_free_coherent(dev, size, cpu_addr, dma_handle); 78a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 79a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 80a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline dma_addr_t dma_map_single(struct device *dev, void *ptr, 81a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn size_t size, 82a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir) 83a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 84a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t addr; 85a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 86a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn kmemcheck_mark_initialized(ptr, size); 87a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn BUG_ON(!valid_dma_direction(dir)); 88a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn addr = or1k_map_page(dev, virt_to_page(ptr), 89a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn (unsigned long)ptr & ~PAGE_MASK, size, 90a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dir, NULL); 91a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn debug_dma_map_page(dev, virt_to_page(ptr), 92a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn (unsigned long)ptr & ~PAGE_MASK, size, 93a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dir, addr, true); 94a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn return addr; 95a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 96a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 97a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline void dma_unmap_single(struct device *dev, dma_addr_t addr, 98a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn size_t size, 99a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir) 100a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 101a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn BUG_ON(!valid_dma_direction(dir)); 102a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn or1k_unmap_page(dev, addr, size, dir, NULL); 103a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn debug_dma_unmap_page(dev, addr, size, dir, true); 104a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 105a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 106707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnstatic inline int dma_map_sg(struct device *dev, struct scatterlist *sg, 107707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn int nents, enum dma_data_direction dir) 108707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn{ 109707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn int i, ents; 110707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn struct scatterlist *s; 111707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 112707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn for_each_sg(sg, s, nents, i) 113707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn kmemcheck_mark_initialized(sg_virt(s), s->length); 114707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn BUG_ON(!valid_dma_direction(dir)); 115707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn ents = or1k_map_sg(dev, sg, nents, dir, NULL); 116707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn debug_dma_map_sg(dev, sg, nents, ents, dir); 117707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 118707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn return ents; 119707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn} 120707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 121707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnstatic inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, 122707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn int nents, enum dma_data_direction dir) 123707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn{ 124707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn BUG_ON(!valid_dma_direction(dir)); 125707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn debug_dma_unmap_sg(dev, sg, nents, dir); 126707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn or1k_unmap_sg(dev, sg, nents, dir, NULL); 127707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn} 128707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 129707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnstatic inline dma_addr_t dma_map_page(struct device *dev, struct page *page, 130707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn size_t offset, size_t size, 131707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn enum dma_data_direction dir) 132707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn{ 133707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn dma_addr_t addr; 134707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 135707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn kmemcheck_mark_initialized(page_address(page) + offset, size); 136707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn BUG_ON(!valid_dma_direction(dir)); 137707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn addr = or1k_map_page(dev, page, offset, size, dir, NULL); 138707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn debug_dma_map_page(dev, page, offset, size, dir, addr, false); 139707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 140707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn return addr; 141707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn} 142707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 143707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnstatic inline void dma_unmap_page(struct device *dev, dma_addr_t addr, 144707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn size_t size, enum dma_data_direction dir) 145707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn{ 146707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn BUG_ON(!valid_dma_direction(dir)); 147707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn or1k_unmap_page(dev, addr, size, dir, NULL); 148707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn debug_dma_unmap_page(dev, addr, size, dir, true); 149707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn} 150707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 151a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, 152a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn size_t size, 153a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir) 154a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 155a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn BUG_ON(!valid_dma_direction(dir)); 156a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn or1k_sync_single_for_cpu(dev, addr, size, dir); 157a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn debug_dma_sync_single_for_cpu(dev, addr, size, dir); 158a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 159a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 160a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline void dma_sync_single_for_device(struct device *dev, 161a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn dma_addr_t addr, size_t size, 162a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn enum dma_data_direction dir) 163a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 164a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn BUG_ON(!valid_dma_direction(dir)); 165a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn or1k_sync_single_for_device(dev, addr, size, dir); 166a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn debug_dma_sync_single_for_device(dev, addr, size, dir); 167a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 168a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 169a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline int dma_supported(struct device *dev, u64 dma_mask) 170a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 171a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn /* Support 32 bit DMA mask exclusively */ 172707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn return dma_mask == DMA_BIT_MASK(32); 173707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn} 174707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn 175707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonnstatic inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) 176707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn{ 177707b38a00bd2e7cac60afc75abe826e68ca83cfbJonas Bonn return 0; 178a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 179a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 180a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonnstatic inline int dma_set_mask(struct device *dev, u64 dma_mask) 181a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn{ 182a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn if (!dev->dma_mask || !dma_supported(dev, dma_mask)) 183a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn return -EIO; 184a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 185a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn *dev->dma_mask = dma_mask; 186a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn 187a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn return 0; 188a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn} 189a39af6f7b806f2a52962254ea8dc635b4c240810Jonas Bonn#endif /* __ASM_OPENRISC_DMA_MAPPING_H */ 190