2 * Copyright(c) 2015, 2016 Intel Corporation.
4 * This file is provided under a dual BSD/GPLv2 license. When using or
5 * redistributing this file, you may do so under either license.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
20 * Redistribution and use in source and binary forms, with or without
21 * modification, are permitted provided that the following conditions
24 * - Redistributions of source code must retain the above copyright
25 * notice, this list of conditions and the following disclaimer.
26 * - Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in
28 * the documentation and/or other materials provided with the
30 * - Neither the name of Intel Corporation nor the names of its
31 * contributors may be used to endorse or promote products derived
32 * from this software without specific prior written permission.
34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
38 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
40 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 #include <linux/types.h>
48 #include <linux/scatterlist.h>
52 #define BAD_DMA_ADDRESS ((u64)0)
55 * The following functions implement driver specific replacements
56 * for the ib_dma_*() functions.
58 * These functions return kernel virtual addresses instead of
59 * device bus addresses since the driver uses the CPU to copy
60 * data instead of using hardware DMA.
63 static int hfi1_mapping_error(struct ib_device
*dev
, u64 dma_addr
)
65 return dma_addr
== BAD_DMA_ADDRESS
;
68 static u64
hfi1_dma_map_single(struct ib_device
*dev
, void *cpu_addr
,
69 size_t size
, enum dma_data_direction direction
)
71 if (WARN_ON(!valid_dma_direction(direction
)))
72 return BAD_DMA_ADDRESS
;
77 static void hfi1_dma_unmap_single(struct ib_device
*dev
, u64 addr
, size_t size
,
78 enum dma_data_direction direction
)
80 /* This is a stub, nothing to be done here */
83 static u64
hfi1_dma_map_page(struct ib_device
*dev
, struct page
*page
,
84 unsigned long offset
, size_t size
,
85 enum dma_data_direction direction
)
89 if (WARN_ON(!valid_dma_direction(direction
)))
90 return BAD_DMA_ADDRESS
;
92 if (offset
+ size
> PAGE_SIZE
)
93 return BAD_DMA_ADDRESS
;
95 addr
= (u64
)page_address(page
);
102 static void hfi1_dma_unmap_page(struct ib_device
*dev
, u64 addr
, size_t size
,
103 enum dma_data_direction direction
)
105 /* This is a stub, nothing to be done here */
108 static int hfi1_map_sg(struct ib_device
*dev
, struct scatterlist
*sgl
,
109 int nents
, enum dma_data_direction direction
)
111 struct scatterlist
*sg
;
116 if (WARN_ON(!valid_dma_direction(direction
)))
117 return BAD_DMA_ADDRESS
;
119 for_each_sg(sgl
, sg
, nents
, i
) {
120 addr
= (u64
)page_address(sg_page(sg
));
125 sg
->dma_address
= addr
+ sg
->offset
;
126 #ifdef CONFIG_NEED_SG_DMA_LENGTH
127 sg
->dma_length
= sg
->length
;
133 static void hfi1_unmap_sg(struct ib_device
*dev
,
134 struct scatterlist
*sg
, int nents
,
135 enum dma_data_direction direction
)
137 /* This is a stub, nothing to be done here */
140 static void hfi1_sync_single_for_cpu(struct ib_device
*dev
, u64 addr
,
141 size_t size
, enum dma_data_direction dir
)
145 static void hfi1_sync_single_for_device(struct ib_device
*dev
, u64 addr
,
147 enum dma_data_direction dir
)
151 static void *hfi1_dma_alloc_coherent(struct ib_device
*dev
, size_t size
,
152 u64
*dma_handle
, gfp_t flag
)
157 p
= alloc_pages(flag
, get_order(size
));
159 addr
= page_address(p
);
161 *dma_handle
= (u64
)addr
;
165 static void hfi1_dma_free_coherent(struct ib_device
*dev
, size_t size
,
166 void *cpu_addr
, u64 dma_handle
)
168 free_pages((unsigned long)cpu_addr
, get_order(size
));
171 struct ib_dma_mapping_ops hfi1_dma_mapping_ops
= {
172 .mapping_error
= hfi1_mapping_error
,
173 .map_single
= hfi1_dma_map_single
,
174 .unmap_single
= hfi1_dma_unmap_single
,
175 .map_page
= hfi1_dma_map_page
,
176 .unmap_page
= hfi1_dma_unmap_page
,
177 .map_sg
= hfi1_map_sg
,
178 .unmap_sg
= hfi1_unmap_sg
,
179 .sync_single_for_cpu
= hfi1_sync_single_for_cpu
,
180 .sync_single_for_device
= hfi1_sync_single_for_device
,
181 .alloc_coherent
= hfi1_dma_alloc_coherent
,
182 .free_coherent
= hfi1_dma_free_coherent