#ifndef BLK_MQ_DMA_H
#define BLK_MQ_DMA_H
#include <linux/blk-mq.h>
#include <linux/pci-p2pdma.h>
struct blk_map_iter {
struct bvec_iter iter;
struct bio *bio;
struct bio_vec *bvecs;
bool is_integrity;
};
struct blk_dma_iter {
dma_addr_t addr;
u32 len;
struct pci_p2pdma_map_state p2pdma;
blk_status_t status;
struct blk_map_iter iter;
};
bool blk_rq_dma_map_iter_start(struct request *req, struct device *dma_dev,
struct dma_iova_state *state, struct blk_dma_iter *iter);
bool blk_rq_dma_map_iter_next(struct request *req, struct device *dma_dev,
struct blk_dma_iter *iter);
static inline bool blk_rq_dma_map_coalesce(struct dma_iova_state *state)
{
return dma_use_iova(state);
}
static inline bool blk_rq_dma_unmap(struct request *req, struct device *dma_dev,
struct dma_iova_state *state, size_t mapped_len,
enum pci_p2pdma_map_type map)
{
if (map == PCI_P2PDMA_MAP_BUS_ADDR)
return true;
if (dma_use_iova(state)) {
unsigned int attrs = 0;
if (map == PCI_P2PDMA_MAP_THRU_HOST_BRIDGE)
attrs |= DMA_ATTR_MMIO;
dma_iova_destroy(dma_dev, state, mapped_len, rq_dma_dir(req),
attrs);
return true;
}
return !dma_need_unmap(dma_dev);
}
#endif