1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * SCSI library functions depending on DMA 4 */ 5 6 #include <linux/blkdev.h> 7 #include <linux/device.h> 8 #include <linux/export.h> 9 #include <linux/kernel.h> 10 11 #include <scsi/scsi.h> 12 #include <scsi/scsi_cmnd.h> 13 #include <scsi/scsi_device.h> 14 #include <scsi/scsi_host.h> 15 16 /** 17 * scsi_dma_map - perform DMA mapping against command's sg lists 18 * @cmd: scsi command 19 * 20 * Returns the number of sg lists actually used, zero if the sg lists 21 * is NULL, or -ENOMEM if the mapping failed. 22 */ 23 int scsi_dma_map(struct scsi_cmnd *cmd) 24 { 25 int nseg = 0; 26 27 if (scsi_sg_count(cmd)) { 28 struct device *dev = cmd->device->host->dma_dev; 29 30 nseg = dma_map_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), 31 cmd->sc_data_direction); 32 if (unlikely(!nseg)) 33 return -ENOMEM; 34 } 35 return nseg; 36 } 37 EXPORT_SYMBOL(scsi_dma_map); 38 39 /** 40 * scsi_dma_unmap - unmap command's sg lists mapped by scsi_dma_map 41 * @cmd: scsi command 42 */ 43 void scsi_dma_unmap(struct scsi_cmnd *cmd) 44 { 45 if (scsi_sg_count(cmd)) { 46 struct device *dev = cmd->device->host->dma_dev; 47 48 dma_unmap_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), 49 cmd->sc_data_direction); 50 } 51 } 52 EXPORT_SYMBOL(scsi_dma_unmap); 53