xref: /linux/block/blk-mq-dma.c (revision 3e9e952bb3139ad1e08f3e1960239c2988ab90c9)
1b0a41585SChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-only
2496a3bc5SChristoph Hellwig /*
3496a3bc5SChristoph Hellwig  * Copyright (C) 2025 Christoph Hellwig
4496a3bc5SChristoph Hellwig  */
5fec9b16dSKeith Busch #include <linux/blk-integrity.h>
6858299dcSChristoph Hellwig #include <linux/blk-mq-dma.h>
7b0a41585SChristoph Hellwig #include "blk.h"
8b0a41585SChristoph Hellwig 
__blk_map_iter_next(struct blk_map_iter * iter)9fec9b16dSKeith Busch static bool __blk_map_iter_next(struct blk_map_iter *iter)
10fec9b16dSKeith Busch {
11fec9b16dSKeith Busch 	if (iter->iter.bi_size)
12fec9b16dSKeith Busch 		return true;
13fec9b16dSKeith Busch 	if (!iter->bio || !iter->bio->bi_next)
14fec9b16dSKeith Busch 		return false;
15fec9b16dSKeith Busch 
16fec9b16dSKeith Busch 	iter->bio = iter->bio->bi_next;
17fec9b16dSKeith Busch 	if (iter->is_integrity) {
18fec9b16dSKeith Busch 		iter->iter = bio_integrity(iter->bio)->bip_iter;
19fec9b16dSKeith Busch 		iter->bvecs = bio_integrity(iter->bio)->bip_vec;
20fec9b16dSKeith Busch 	} else {
21fec9b16dSKeith Busch 		iter->iter = iter->bio->bi_iter;
22fec9b16dSKeith Busch 		iter->bvecs = iter->bio->bi_io_vec;
23fec9b16dSKeith Busch 	}
24fec9b16dSKeith Busch 	return true;
25fec9b16dSKeith Busch }
26fec9b16dSKeith Busch 
blk_map_iter_next(struct request * req,struct blk_map_iter * iter,struct phys_vec * vec)277a6fc163SKeith Busch static bool blk_map_iter_next(struct request *req, struct blk_map_iter *iter,
28b0a41585SChristoph Hellwig 			      struct phys_vec *vec)
29b0a41585SChristoph Hellwig {
30b0a41585SChristoph Hellwig 	unsigned int max_size;
31b0a41585SChristoph Hellwig 	struct bio_vec bv;
32b0a41585SChristoph Hellwig 
33b0a41585SChristoph Hellwig 	if (!iter->iter.bi_size)
34b0a41585SChristoph Hellwig 		return false;
35b0a41585SChristoph Hellwig 
36dae75deaSKeith Busch 	bv = mp_bvec_iter_bvec(iter->bvecs, iter->iter);
37b0a41585SChristoph Hellwig 	vec->paddr = bvec_phys(&bv);
38b0a41585SChristoph Hellwig 	max_size = get_max_segment_size(&req->q->limits, vec->paddr, UINT_MAX);
39b0a41585SChristoph Hellwig 	bv.bv_len = min(bv.bv_len, max_size);
40dae75deaSKeith Busch 	bvec_iter_advance_single(iter->bvecs, &iter->iter, bv.bv_len);
41b0a41585SChristoph Hellwig 
42b0a41585SChristoph Hellwig 	/*
43b0a41585SChristoph Hellwig 	 * If we are entirely done with this bi_io_vec entry, check if the next
44b0a41585SChristoph Hellwig 	 * one could be merged into it.  This typically happens when moving to
45b0a41585SChristoph Hellwig 	 * the next bio, but some callers also don't pack bvecs tight.
46b0a41585SChristoph Hellwig 	 */
47b0a41585SChristoph Hellwig 	while (!iter->iter.bi_size || !iter->iter.bi_bvec_done) {
48b0a41585SChristoph Hellwig 		struct bio_vec next;
49b0a41585SChristoph Hellwig 
50fec9b16dSKeith Busch 		if (!__blk_map_iter_next(iter))
51b0a41585SChristoph Hellwig 			break;
52b0a41585SChristoph Hellwig 
53dae75deaSKeith Busch 		next = mp_bvec_iter_bvec(iter->bvecs, iter->iter);
54b0a41585SChristoph Hellwig 		if (bv.bv_len + next.bv_len > max_size ||
55b0a41585SChristoph Hellwig 		    !biovec_phys_mergeable(req->q, &bv, &next))
56b0a41585SChristoph Hellwig 			break;
57b0a41585SChristoph Hellwig 
58b0a41585SChristoph Hellwig 		bv.bv_len += next.bv_len;
59dae75deaSKeith Busch 		bvec_iter_advance_single(iter->bvecs, &iter->iter, next.bv_len);
60b0a41585SChristoph Hellwig 	}
61b0a41585SChristoph Hellwig 
62b0a41585SChristoph Hellwig 	vec->len = bv.bv_len;
63b0a41585SChristoph Hellwig 	return true;
64b0a41585SChristoph Hellwig }
65b0a41585SChristoph Hellwig 
66858299dcSChristoph Hellwig /*
67858299dcSChristoph Hellwig  * The IOVA-based DMA API wants to be able to coalesce at the minimal IOMMU page
68858299dcSChristoph Hellwig  * size granularity (which is guaranteed to be <= PAGE_SIZE and usually 4k), so
69858299dcSChristoph Hellwig  * we need to ensure our segments are aligned to this as well.
70858299dcSChristoph Hellwig  *
71858299dcSChristoph Hellwig  * Note that there is no point in using the slightly more complicated IOVA based
72858299dcSChristoph Hellwig  * path for single segment mappings.
73858299dcSChristoph Hellwig  */
blk_can_dma_map_iova(struct request * req,struct device * dma_dev)74858299dcSChristoph Hellwig static inline bool blk_can_dma_map_iova(struct request *req,
75858299dcSChristoph Hellwig 		struct device *dma_dev)
76858299dcSChristoph Hellwig {
772f6b2565SKeith Busch 	return !(req_phys_gap_mask(req) & dma_get_merge_boundary(dma_dev));
78858299dcSChristoph Hellwig }
79858299dcSChristoph Hellwig 
blk_dma_map_bus(struct blk_dma_iter * iter,struct phys_vec * vec)80858299dcSChristoph Hellwig static bool blk_dma_map_bus(struct blk_dma_iter *iter, struct phys_vec *vec)
81858299dcSChristoph Hellwig {
82d4504262SLeon Romanovsky 	iter->addr = pci_p2pdma_bus_addr_map(iter->p2pdma.mem, vec->paddr);
83858299dcSChristoph Hellwig 	iter->len = vec->len;
84858299dcSChristoph Hellwig 	return true;
85858299dcSChristoph Hellwig }
86858299dcSChristoph Hellwig 
blk_dma_map_direct(struct request * req,struct device * dma_dev,struct blk_dma_iter * iter,struct phys_vec * vec)87858299dcSChristoph Hellwig static bool blk_dma_map_direct(struct request *req, struct device *dma_dev,
88858299dcSChristoph Hellwig 		struct blk_dma_iter *iter, struct phys_vec *vec)
89858299dcSChristoph Hellwig {
9037f0c7a8SLeon Romanovsky 	unsigned int attrs = 0;
9137f0c7a8SLeon Romanovsky 
9237f0c7a8SLeon Romanovsky 	if (iter->p2pdma.map == PCI_P2PDMA_MAP_THRU_HOST_BRIDGE)
9337f0c7a8SLeon Romanovsky 		attrs |= DMA_ATTR_MMIO;
9437f0c7a8SLeon Romanovsky 
9561d43b17SLeon Romanovsky 	iter->addr = dma_map_phys(dma_dev, vec->paddr, vec->len,
9637f0c7a8SLeon Romanovsky 			rq_dma_dir(req), attrs);
97858299dcSChristoph Hellwig 	if (dma_mapping_error(dma_dev, iter->addr)) {
98858299dcSChristoph Hellwig 		iter->status = BLK_STS_RESOURCE;
99858299dcSChristoph Hellwig 		return false;
100858299dcSChristoph Hellwig 	}
101858299dcSChristoph Hellwig 	iter->len = vec->len;
102858299dcSChristoph Hellwig 	return true;
103858299dcSChristoph Hellwig }
104858299dcSChristoph Hellwig 
blk_rq_dma_map_iova(struct request * req,struct device * dma_dev,struct dma_iova_state * state,struct blk_dma_iter * iter,struct phys_vec * vec)105858299dcSChristoph Hellwig static bool blk_rq_dma_map_iova(struct request *req, struct device *dma_dev,
106858299dcSChristoph Hellwig 		struct dma_iova_state *state, struct blk_dma_iter *iter,
107858299dcSChristoph Hellwig 		struct phys_vec *vec)
108858299dcSChristoph Hellwig {
109858299dcSChristoph Hellwig 	enum dma_data_direction dir = rq_dma_dir(req);
11037f0c7a8SLeon Romanovsky 	unsigned int attrs = 0;
111073b9bf9SLeon Romanovsky 	size_t mapped = 0;
112858299dcSChristoph Hellwig 	int error;
113858299dcSChristoph Hellwig 
114858299dcSChristoph Hellwig 	iter->addr = state->addr;
115858299dcSChristoph Hellwig 	iter->len = dma_iova_size(state);
116858299dcSChristoph Hellwig 
11737f0c7a8SLeon Romanovsky 	if (iter->p2pdma.map == PCI_P2PDMA_MAP_THRU_HOST_BRIDGE)
11837f0c7a8SLeon Romanovsky 		attrs |= DMA_ATTR_MMIO;
11937f0c7a8SLeon Romanovsky 
120858299dcSChristoph Hellwig 	do {
121858299dcSChristoph Hellwig 		error = dma_iova_link(dma_dev, state, vec->paddr, mapped,
12237f0c7a8SLeon Romanovsky 				vec->len, dir, attrs);
123858299dcSChristoph Hellwig 		if (error)
124*81e7223bSChaitanya Kulkarni 			goto out_unlink;
125858299dcSChristoph Hellwig 		mapped += vec->len;
126858299dcSChristoph Hellwig 	} while (blk_map_iter_next(req, &iter->iter, vec));
127858299dcSChristoph Hellwig 
128858299dcSChristoph Hellwig 	error = dma_iova_sync(dma_dev, state, 0, mapped);
129*81e7223bSChaitanya Kulkarni 	if (error)
130*81e7223bSChaitanya Kulkarni 		goto out_unlink;
131858299dcSChristoph Hellwig 
132858299dcSChristoph Hellwig 	return true;
133*81e7223bSChaitanya Kulkarni 
134*81e7223bSChaitanya Kulkarni out_unlink:
135*81e7223bSChaitanya Kulkarni 	dma_iova_destroy(dma_dev, state, mapped, dir, attrs);
136*81e7223bSChaitanya Kulkarni 	iter->status = errno_to_blk_status(error);
137*81e7223bSChaitanya Kulkarni 	return false;
138858299dcSChristoph Hellwig }
139858299dcSChristoph Hellwig 
blk_rq_map_iter_init(struct request * rq,struct blk_map_iter * iter)140dae75deaSKeith Busch static inline void blk_rq_map_iter_init(struct request *rq,
141dae75deaSKeith Busch 					struct blk_map_iter *iter)
142dae75deaSKeith Busch {
143dae75deaSKeith Busch 	struct bio *bio = rq->bio;
144dae75deaSKeith Busch 
145dae75deaSKeith Busch 	if (rq->rq_flags & RQF_SPECIAL_PAYLOAD) {
146dae75deaSKeith Busch 		*iter = (struct blk_map_iter) {
147dae75deaSKeith Busch 			.bvecs = &rq->special_vec,
148dae75deaSKeith Busch 			.iter = {
149dae75deaSKeith Busch 				.bi_size = rq->special_vec.bv_len,
150dae75deaSKeith Busch 			}
151dae75deaSKeith Busch 		};
152dae75deaSKeith Busch 	} else if (bio) {
153dae75deaSKeith Busch 		*iter = (struct blk_map_iter) {
154dae75deaSKeith Busch 			.bio = bio,
155dae75deaSKeith Busch 			.bvecs = bio->bi_io_vec,
156dae75deaSKeith Busch 			.iter = bio->bi_iter,
157dae75deaSKeith Busch 		};
158dae75deaSKeith Busch 	} else {
159dae75deaSKeith Busch 		/* the internal flush request may not have bio attached */
160dae75deaSKeith Busch 		*iter = (struct blk_map_iter) {};
161dae75deaSKeith Busch 	}
162dae75deaSKeith Busch }
163dae75deaSKeith Busch 
blk_dma_map_iter_start(struct request * req,struct device * dma_dev,struct dma_iova_state * state,struct blk_dma_iter * iter,unsigned int total_len)164e2be2ba6SKeith Busch static bool blk_dma_map_iter_start(struct request *req, struct device *dma_dev,
165e2be2ba6SKeith Busch 		struct dma_iova_state *state, struct blk_dma_iter *iter,
166e2be2ba6SKeith Busch 		unsigned int total_len)
167858299dcSChristoph Hellwig {
168858299dcSChristoph Hellwig 	struct phys_vec vec;
169858299dcSChristoph Hellwig 
170858299dcSChristoph Hellwig 	memset(&iter->p2pdma, 0, sizeof(iter->p2pdma));
171858299dcSChristoph Hellwig 	iter->status = BLK_STS_OK;
17237f0c7a8SLeon Romanovsky 	iter->p2pdma.map = PCI_P2PDMA_MAP_NONE;
173858299dcSChristoph Hellwig 
174858299dcSChristoph Hellwig 	/*
175858299dcSChristoph Hellwig 	 * Grab the first segment ASAP because we'll need it to check for P2P
176858299dcSChristoph Hellwig 	 * transfers.
177858299dcSChristoph Hellwig 	 */
178858299dcSChristoph Hellwig 	if (!blk_map_iter_next(req, &iter->iter, &vec))
179858299dcSChristoph Hellwig 		return false;
180858299dcSChristoph Hellwig 
181858299dcSChristoph Hellwig 	switch (pci_p2pdma_state(&iter->p2pdma, dma_dev,
182858299dcSChristoph Hellwig 				 phys_to_page(vec.paddr))) {
183858299dcSChristoph Hellwig 	case PCI_P2PDMA_MAP_BUS_ADDR:
184858299dcSChristoph Hellwig 		return blk_dma_map_bus(iter, &vec);
185858299dcSChristoph Hellwig 	case PCI_P2PDMA_MAP_THRU_HOST_BRIDGE:
186858299dcSChristoph Hellwig 		/*
187858299dcSChristoph Hellwig 		 * P2P transfers through the host bridge are treated the
188858299dcSChristoph Hellwig 		 * same as non-P2P transfers below and during unmap.
189858299dcSChristoph Hellwig 		 */
19070926390SKeith Busch 	case PCI_P2PDMA_MAP_NONE:
191858299dcSChristoph Hellwig 		break;
192858299dcSChristoph Hellwig 	default:
193858299dcSChristoph Hellwig 		iter->status = BLK_STS_INVAL;
194858299dcSChristoph Hellwig 		return false;
195858299dcSChristoph Hellwig 	}
196858299dcSChristoph Hellwig 
197858299dcSChristoph Hellwig 	if (blk_can_dma_map_iova(req, dma_dev) &&
198858299dcSChristoph Hellwig 	    dma_iova_try_alloc(dma_dev, state, vec.paddr, total_len))
199858299dcSChristoph Hellwig 		return blk_rq_dma_map_iova(req, dma_dev, state, iter, &vec);
200a0750faeSKeith Busch 	memset(state, 0, sizeof(*state));
201858299dcSChristoph Hellwig 	return blk_dma_map_direct(req, dma_dev, iter, &vec);
202858299dcSChristoph Hellwig }
203e2be2ba6SKeith Busch 
204e2be2ba6SKeith Busch /**
205e2be2ba6SKeith Busch  * blk_rq_dma_map_iter_start - map the first DMA segment for a request
206e2be2ba6SKeith Busch  * @req:	request to map
207e2be2ba6SKeith Busch  * @dma_dev:	device to map to
208e2be2ba6SKeith Busch  * @state:	DMA IOVA state
209e2be2ba6SKeith Busch  * @iter:	block layer DMA iterator
210e2be2ba6SKeith Busch  *
211e2be2ba6SKeith Busch  * Start DMA mapping @req to @dma_dev.  @state and @iter are provided by the
212e2be2ba6SKeith Busch  * caller and don't need to be initialized.  @state needs to be stored for use
213e2be2ba6SKeith Busch  * at unmap time, @iter is only needed at map time.
214e2be2ba6SKeith Busch  *
215e2be2ba6SKeith Busch  * Returns %false if there is no segment to map, including due to an error, or
216e2be2ba6SKeith Busch  * %true ft it did map a segment.
217e2be2ba6SKeith Busch  *
218e2be2ba6SKeith Busch  * If a segment was mapped, the DMA address for it is returned in @iter.addr and
219e2be2ba6SKeith Busch  * the length in @iter.len.  If no segment was mapped the status code is
220e2be2ba6SKeith Busch  * returned in @iter.status.
221e2be2ba6SKeith Busch  *
222e2be2ba6SKeith Busch  * The caller can call blk_rq_dma_map_coalesce() to check if further segments
223e2be2ba6SKeith Busch  * need to be mapped after this, or go straight to blk_rq_dma_map_iter_next()
224e2be2ba6SKeith Busch  * to try to map the following segments.
225e2be2ba6SKeith Busch  */
blk_rq_dma_map_iter_start(struct request * req,struct device * dma_dev,struct dma_iova_state * state,struct blk_dma_iter * iter)226e2be2ba6SKeith Busch bool blk_rq_dma_map_iter_start(struct request *req, struct device *dma_dev,
227e2be2ba6SKeith Busch 		struct dma_iova_state *state, struct blk_dma_iter *iter)
228e2be2ba6SKeith Busch {
229e2be2ba6SKeith Busch 	blk_rq_map_iter_init(req, &iter->iter);
230e2be2ba6SKeith Busch 	return blk_dma_map_iter_start(req, dma_dev, state, iter,
231e2be2ba6SKeith Busch 				      blk_rq_payload_bytes(req));
232e2be2ba6SKeith Busch }
233858299dcSChristoph Hellwig EXPORT_SYMBOL_GPL(blk_rq_dma_map_iter_start);
234858299dcSChristoph Hellwig 
235858299dcSChristoph Hellwig /**
236858299dcSChristoph Hellwig  * blk_rq_dma_map_iter_next - map the next DMA segment for a request
237858299dcSChristoph Hellwig  * @req:	request to map
238858299dcSChristoph Hellwig  * @dma_dev:	device to map to
239858299dcSChristoph Hellwig  * @iter:	block layer DMA iterator
240858299dcSChristoph Hellwig  *
241858299dcSChristoph Hellwig  * Iterate to the next mapping after a previous call to
242858299dcSChristoph Hellwig  * blk_rq_dma_map_iter_start().  See there for a detailed description of the
243858299dcSChristoph Hellwig  * arguments.
244858299dcSChristoph Hellwig  *
245858299dcSChristoph Hellwig  * Returns %false if there is no segment to map, including due to an error, or
246858299dcSChristoph Hellwig  * %true ft it did map a segment.
247858299dcSChristoph Hellwig  *
248858299dcSChristoph Hellwig  * If a segment was mapped, the DMA address for it is returned in @iter.addr and
249858299dcSChristoph Hellwig  * the length in @iter.len.  If no segment was mapped the status code is
250858299dcSChristoph Hellwig  * returned in @iter.status.
251858299dcSChristoph Hellwig  */
blk_rq_dma_map_iter_next(struct request * req,struct device * dma_dev,struct blk_dma_iter * iter)252858299dcSChristoph Hellwig bool blk_rq_dma_map_iter_next(struct request *req, struct device *dma_dev,
25391e1c1bcSNitesh Shetty 		struct blk_dma_iter *iter)
254858299dcSChristoph Hellwig {
255858299dcSChristoph Hellwig 	struct phys_vec vec;
256858299dcSChristoph Hellwig 
257858299dcSChristoph Hellwig 	if (!blk_map_iter_next(req, &iter->iter, &vec))
258858299dcSChristoph Hellwig 		return false;
259858299dcSChristoph Hellwig 
260858299dcSChristoph Hellwig 	if (iter->p2pdma.map == PCI_P2PDMA_MAP_BUS_ADDR)
261858299dcSChristoph Hellwig 		return blk_dma_map_bus(iter, &vec);
262858299dcSChristoph Hellwig 	return blk_dma_map_direct(req, dma_dev, iter, &vec);
263858299dcSChristoph Hellwig }
264858299dcSChristoph Hellwig EXPORT_SYMBOL_GPL(blk_rq_dma_map_iter_next);
265858299dcSChristoph Hellwig 
266b0a41585SChristoph Hellwig static inline struct scatterlist *
blk_next_sg(struct scatterlist ** sg,struct scatterlist * sglist)267b0a41585SChristoph Hellwig blk_next_sg(struct scatterlist **sg, struct scatterlist *sglist)
268b0a41585SChristoph Hellwig {
269b0a41585SChristoph Hellwig 	if (!*sg)
270b0a41585SChristoph Hellwig 		return sglist;
271b0a41585SChristoph Hellwig 
272b0a41585SChristoph Hellwig 	/*
273b0a41585SChristoph Hellwig 	 * If the driver previously mapped a shorter list, we could see a
274b0a41585SChristoph Hellwig 	 * termination bit prematurely unless it fully inits the sg table
275b0a41585SChristoph Hellwig 	 * on each mapping. We KNOW that there must be more entries here
276b0a41585SChristoph Hellwig 	 * or the driver would be buggy, so force clear the termination bit
277b0a41585SChristoph Hellwig 	 * to avoid doing a full sg_init_table() in drivers for each command.
278b0a41585SChristoph Hellwig 	 */
279b0a41585SChristoph Hellwig 	sg_unmark_end(*sg);
280b0a41585SChristoph Hellwig 	return sg_next(*sg);
281b0a41585SChristoph Hellwig }
282b0a41585SChristoph Hellwig 
283b0a41585SChristoph Hellwig /*
284b0a41585SChristoph Hellwig  * Map a request to scatterlist, return number of sg entries setup. Caller
285b0a41585SChristoph Hellwig  * must make sure sg can hold rq->nr_phys_segments entries.
286b0a41585SChristoph Hellwig  */
__blk_rq_map_sg(struct request * rq,struct scatterlist * sglist,struct scatterlist ** last_sg)287b0a41585SChristoph Hellwig int __blk_rq_map_sg(struct request *rq, struct scatterlist *sglist,
288b0a41585SChristoph Hellwig 		    struct scatterlist **last_sg)
289b0a41585SChristoph Hellwig {
290dae75deaSKeith Busch 	struct blk_map_iter iter;
291b0a41585SChristoph Hellwig 	struct phys_vec vec;
292b0a41585SChristoph Hellwig 	int nsegs = 0;
293b0a41585SChristoph Hellwig 
294dae75deaSKeith Busch 	blk_rq_map_iter_init(rq, &iter);
295b0a41585SChristoph Hellwig 	while (blk_map_iter_next(rq, &iter, &vec)) {
296b0a41585SChristoph Hellwig 		*last_sg = blk_next_sg(last_sg, sglist);
297073b9bf9SLeon Romanovsky 
298073b9bf9SLeon Romanovsky 		WARN_ON_ONCE(overflows_type(vec.len, unsigned int));
299b0a41585SChristoph Hellwig 		sg_set_page(*last_sg, phys_to_page(vec.paddr), vec.len,
300b0a41585SChristoph Hellwig 				offset_in_page(vec.paddr));
301b0a41585SChristoph Hellwig 		nsegs++;
302b0a41585SChristoph Hellwig 	}
303b0a41585SChristoph Hellwig 
304b0a41585SChristoph Hellwig 	if (*last_sg)
305b0a41585SChristoph Hellwig 		sg_mark_end(*last_sg);
306b0a41585SChristoph Hellwig 
307b0a41585SChristoph Hellwig 	/*
308b0a41585SChristoph Hellwig 	 * Something must have been wrong if the figured number of
309b0a41585SChristoph Hellwig 	 * segment is bigger than number of req's physical segments
310b0a41585SChristoph Hellwig 	 */
311b0a41585SChristoph Hellwig 	WARN_ON(nsegs > blk_rq_nr_phys_segments(rq));
312b0a41585SChristoph Hellwig 
313b0a41585SChristoph Hellwig 	return nsegs;
314b0a41585SChristoph Hellwig }
315b0a41585SChristoph Hellwig EXPORT_SYMBOL(__blk_rq_map_sg);
316fec9b16dSKeith Busch 
317fec9b16dSKeith Busch #ifdef CONFIG_BLK_DEV_INTEGRITY
318fec9b16dSKeith Busch /**
319fec9b16dSKeith Busch  * blk_rq_integrity_dma_map_iter_start - map the first integrity DMA segment
320fec9b16dSKeith Busch  * 					 for a request
321fec9b16dSKeith Busch  * @req:	request to map
322fec9b16dSKeith Busch  * @dma_dev:	device to map to
323fec9b16dSKeith Busch  * @state:	DMA IOVA state
324fec9b16dSKeith Busch  * @iter:	block layer DMA iterator
325fec9b16dSKeith Busch  *
326fec9b16dSKeith Busch  * Start DMA mapping @req integrity data to @dma_dev.  @state and @iter are
327fec9b16dSKeith Busch  * provided by the caller and don't need to be initialized.  @state needs to be
328fec9b16dSKeith Busch  * stored for use at unmap time, @iter is only needed at map time.
329fec9b16dSKeith Busch  *
330fec9b16dSKeith Busch  * Returns %false if there is no segment to map, including due to an error, or
331fec9b16dSKeith Busch  * %true if it did map a segment.
332fec9b16dSKeith Busch  *
333fec9b16dSKeith Busch  * If a segment was mapped, the DMA address for it is returned in @iter.addr
334fec9b16dSKeith Busch  * and the length in @iter.len.  If no segment was mapped the status code is
335fec9b16dSKeith Busch  * returned in @iter.status.
336fec9b16dSKeith Busch  *
337fec9b16dSKeith Busch  * The caller can call blk_rq_dma_map_coalesce() to check if further segments
338fec9b16dSKeith Busch  * need to be mapped after this, or go straight to blk_rq_dma_map_iter_next()
339fec9b16dSKeith Busch  * to try to map the following segments.
340fec9b16dSKeith Busch  */
blk_rq_integrity_dma_map_iter_start(struct request * req,struct device * dma_dev,struct dma_iova_state * state,struct blk_dma_iter * iter)341fec9b16dSKeith Busch bool blk_rq_integrity_dma_map_iter_start(struct request *req,
342fec9b16dSKeith Busch 		struct device *dma_dev,  struct dma_iova_state *state,
343fec9b16dSKeith Busch 		struct blk_dma_iter *iter)
344fec9b16dSKeith Busch {
345fec9b16dSKeith Busch 	unsigned len = bio_integrity_bytes(&req->q->limits.integrity,
346fec9b16dSKeith Busch 					   blk_rq_sectors(req));
347fec9b16dSKeith Busch 	struct bio *bio = req->bio;
348fec9b16dSKeith Busch 
349fec9b16dSKeith Busch 	iter->iter = (struct blk_map_iter) {
350fec9b16dSKeith Busch 		.bio = bio,
351fec9b16dSKeith Busch 		.iter = bio_integrity(bio)->bip_iter,
352fec9b16dSKeith Busch 		.bvecs = bio_integrity(bio)->bip_vec,
353fec9b16dSKeith Busch 		.is_integrity = true,
354fec9b16dSKeith Busch 	};
355fec9b16dSKeith Busch 	return blk_dma_map_iter_start(req, dma_dev, state, iter, len);
356fec9b16dSKeith Busch }
357fec9b16dSKeith Busch EXPORT_SYMBOL_GPL(blk_rq_integrity_dma_map_iter_start);
358fec9b16dSKeith Busch 
359fec9b16dSKeith Busch /**
3606d7e3870SKriish Sharma  * blk_rq_integrity_dma_map_iter_next - map the next integrity DMA segment for
361fec9b16dSKeith Busch  * 					 a request
362fec9b16dSKeith Busch  * @req:	request to map
363fec9b16dSKeith Busch  * @dma_dev:	device to map to
364fec9b16dSKeith Busch  * @state:	DMA IOVA state
365fec9b16dSKeith Busch  * @iter:	block layer DMA iterator
366fec9b16dSKeith Busch  *
367fec9b16dSKeith Busch  * Iterate to the next integrity mapping after a previous call to
368fec9b16dSKeith Busch  * blk_rq_integrity_dma_map_iter_start().  See there for a detailed description
369fec9b16dSKeith Busch  * of the arguments.
370fec9b16dSKeith Busch  *
371fec9b16dSKeith Busch  * Returns %false if there is no segment to map, including due to an error, or
372fec9b16dSKeith Busch  * %true if it did map a segment.
373fec9b16dSKeith Busch  *
374fec9b16dSKeith Busch  * If a segment was mapped, the DMA address for it is returned in @iter.addr and
375fec9b16dSKeith Busch  * the length in @iter.len.  If no segment was mapped the status code is
376fec9b16dSKeith Busch  * returned in @iter.status.
377fec9b16dSKeith Busch  */
blk_rq_integrity_dma_map_iter_next(struct request * req,struct device * dma_dev,struct blk_dma_iter * iter)378fec9b16dSKeith Busch bool blk_rq_integrity_dma_map_iter_next(struct request *req,
379fec9b16dSKeith Busch                struct device *dma_dev, struct blk_dma_iter *iter)
380fec9b16dSKeith Busch {
381fec9b16dSKeith Busch 	struct phys_vec vec;
382fec9b16dSKeith Busch 
383fec9b16dSKeith Busch 	if (!blk_map_iter_next(req, &iter->iter, &vec))
384fec9b16dSKeith Busch 		return false;
385fec9b16dSKeith Busch 
386fec9b16dSKeith Busch 	if (iter->p2pdma.map == PCI_P2PDMA_MAP_BUS_ADDR)
387fec9b16dSKeith Busch 		return blk_dma_map_bus(iter, &vec);
388fec9b16dSKeith Busch 	return blk_dma_map_direct(req, dma_dev, iter, &vec);
389fec9b16dSKeith Busch }
390fec9b16dSKeith Busch EXPORT_SYMBOL_GPL(blk_rq_integrity_dma_map_iter_next);
391c16b52a0SKeith Busch 
392c16b52a0SKeith Busch /**
393c16b52a0SKeith Busch  * blk_rq_map_integrity_sg - Map integrity metadata into a scatterlist
394c16b52a0SKeith Busch  * @rq:		request to map
395c16b52a0SKeith Busch  * @sglist:	target scatterlist
396c16b52a0SKeith Busch  *
397c16b52a0SKeith Busch  * Description: Map the integrity vectors in request into a
398c16b52a0SKeith Busch  * scatterlist.  The scatterlist must be big enough to hold all
399c16b52a0SKeith Busch  * elements.  I.e. sized using blk_rq_count_integrity_sg() or
400c16b52a0SKeith Busch  * rq->nr_integrity_segments.
401c16b52a0SKeith Busch  */
blk_rq_map_integrity_sg(struct request * rq,struct scatterlist * sglist)402c16b52a0SKeith Busch int blk_rq_map_integrity_sg(struct request *rq, struct scatterlist *sglist)
403c16b52a0SKeith Busch {
404c16b52a0SKeith Busch 	struct request_queue *q = rq->q;
405c16b52a0SKeith Busch 	struct scatterlist *sg = NULL;
406c16b52a0SKeith Busch 	struct bio *bio = rq->bio;
407c16b52a0SKeith Busch 	unsigned int segments = 0;
408c16b52a0SKeith Busch 	struct phys_vec vec;
409c16b52a0SKeith Busch 
410c16b52a0SKeith Busch 	struct blk_map_iter iter = {
411c16b52a0SKeith Busch 		.bio = bio,
412c16b52a0SKeith Busch 		.iter = bio_integrity(bio)->bip_iter,
413c16b52a0SKeith Busch 		.bvecs = bio_integrity(bio)->bip_vec,
414c16b52a0SKeith Busch 		.is_integrity = true,
415c16b52a0SKeith Busch 	};
416c16b52a0SKeith Busch 
417c16b52a0SKeith Busch 	while (blk_map_iter_next(rq, &iter, &vec)) {
418c16b52a0SKeith Busch 		sg = blk_next_sg(&sg, sglist);
419073b9bf9SLeon Romanovsky 
420073b9bf9SLeon Romanovsky 		WARN_ON_ONCE(overflows_type(vec.len, unsigned int));
421c16b52a0SKeith Busch 		sg_set_page(sg, phys_to_page(vec.paddr), vec.len,
422c16b52a0SKeith Busch 				offset_in_page(vec.paddr));
423c16b52a0SKeith Busch 		segments++;
424c16b52a0SKeith Busch 	}
425c16b52a0SKeith Busch 
426c16b52a0SKeith Busch 	if (sg)
427c16b52a0SKeith Busch 	        sg_mark_end(sg);
428c16b52a0SKeith Busch 
429c16b52a0SKeith Busch 	/*
430c16b52a0SKeith Busch 	 * Something must have been wrong if the figured number of segment
431c16b52a0SKeith Busch 	 * is bigger than number of req's physical integrity segments
432c16b52a0SKeith Busch 	 */
433c16b52a0SKeith Busch 	BUG_ON(segments > rq->nr_integrity_segments);
434c16b52a0SKeith Busch 	BUG_ON(segments > queue_max_integrity_segments(q));
435c16b52a0SKeith Busch 	return segments;
436c16b52a0SKeith Busch }
437c16b52a0SKeith Busch EXPORT_SYMBOL(blk_rq_map_integrity_sg);
438fec9b16dSKeith Busch #endif
439