本文整理汇总了C++中sg_dma_address函数的典型用法代码示例。如果您正苦于以下问题:C++ sg_dma_address函数的具体用法?C++ sg_dma_address怎么用?C++ sg_dma_address使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sg_dma_address函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: kmalloc
struct sg_table *nvhost_nvmap_pin(struct mem_mgr *mgr,
struct mem_handle *handle)
{
int err = 0;
dma_addr_t ret = 0;
struct sg_table *sgt = kmalloc(sizeof(*sgt) + sizeof(*sgt->sgl),
GFP_KERNEL);
if (!sgt)
return ERR_PTR(-ENOMEM);
err = __sg_alloc_table(sgt, 1, 1, (gfp_t)(sgt+1), sg_kmalloc);
if (err)
return ERR_PTR(err);
ret = nvmap_pin((struct nvmap_client *)mgr,
(struct nvmap_handle_ref *)handle);
if (IS_ERR_VALUE(ret)) {
kfree(sgt);
return ERR_PTR(ret);
}
sg_dma_address(sgt->sgl) = ret;
return sgt;
}
开发者ID:Ntemis,项目名称:LG_X3_P880_v20a,代码行数:24,代码来源:nvmap.c
示例2: omap2_mcspi_tx_dma
static void omap2_mcspi_tx_dma(struct spi_device *spi,
struct spi_transfer *xfer,
struct dma_slave_config cfg)
{
struct omap2_mcspi *mcspi;
struct omap2_mcspi_dma *mcspi_dma;
unsigned int count;
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
count = xfer->len;
if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
struct scatterlist sg;
dmaengine_slave_config(mcspi_dma->dma_tx, &cfg);
sg_init_table(&sg, 1);
sg_dma_address(&sg) = xfer->tx_dma;
sg_dma_len(&sg) = xfer->len;
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, &sg, 1,
DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
if (tx) {
tx->callback = omap2_mcspi_tx_callback;
tx->callback_param = spi;
dmaengine_submit(tx);
} else {
/* FIXME: fall back to PIO? */
}
}
dma_async_issue_pending(mcspi_dma->dma_tx);
omap2_mcspi_set_dma_req(spi, 0, 1);
}
开发者ID:marceleng,项目名称:linux,代码行数:36,代码来源:spi-omap2-mcspi.c
示例3: ispmmu_vmap
dma_addr_t ispmmu_vmap(const struct scatterlist *sglist,
int sglen)
{
int err;
void *da;
struct sg_table *sgt;
unsigned int i;
struct scatterlist *sg, *src = (struct scatterlist *)sglist;
/*
* convert isp sglist to iommu sgt
* FIXME: should be fixed in the upper layer?
*/
sgt = kmalloc(sizeof(*sgt), GFP_KERNEL);
if (!sgt)
return -ENOMEM;
err = sg_alloc_table(sgt, sglen, GFP_KERNEL);
if (err)
goto err_sg_alloc;
for_each_sg(sgt->sgl, sg, sgt->nents, i)
sg_set_buf(sg, phys_to_virt(sg_dma_address(src + i)),
sg_dma_len(src + i));
da = (void *)iommu_vmap(isp_iommu, 0, sgt, IOMMU_FLAG);
if (IS_ERR(da))
goto err_vmap;
return (dma_addr_t)da;
err_vmap:
sg_free_table(sgt);
err_sg_alloc:
kfree(sgt);
return -ENOMEM;
}
开发者ID:macroliu,项目名称:I8320Kernel,代码行数:36,代码来源:ispmmu.c
示例4: pvscsi_map_buffers
/*
* Map all data buffers for a command into PCI space and
* setup the scatter/gather list if needed.
*/
static void pvscsi_map_buffers(struct pvscsi_adapter *adapter,
struct pvscsi_ctx *ctx, struct scsi_cmnd *cmd,
struct PVSCSIRingReqDesc *e)
{
unsigned count;
unsigned bufflen = scsi_bufflen(cmd);
struct scatterlist *sg;
e->dataLen = bufflen;
e->dataAddr = 0;
if (bufflen == 0)
return;
sg = scsi_sglist(cmd);
count = scsi_sg_count(cmd);
if (count != 0) {
int segs = scsi_dma_map(cmd);
if (segs > 1) {
pvscsi_create_sg(ctx, sg, segs);
e->flags |= PVSCSI_FLAG_CMD_WITH_SG_LIST;
ctx->sglPA = pci_map_single(adapter->dev, ctx->sgl,
SGL_SIZE, PCI_DMA_TODEVICE);
e->dataAddr = ctx->sglPA;
} else
e->dataAddr = sg_dma_address(sg);
} else {
/*
* In case there is no S/G list, scsi_sglist points
* directly to the buffer.
*/
ctx->dataPA = pci_map_single(adapter->dev, sg, bufflen,
cmd->sc_data_direction);
e->dataAddr = ctx->dataPA;
}
}
开发者ID:19Dan01,项目名称:linux,代码行数:40,代码来源:vmw_pvscsi.c
示例5: rppc_buffer_lookup
/**
* rppc_buffer_lookup - convert a buffer pointer to a remote processor pointer
* @rpc: rpc instance
* @uva: buffer pointer that needs to be translated
* @buva: base pointer of the allocated buffer
* @fd: dma-buf file descriptor of the allocated buffer
*
* This function is used for converting a pointer value in the function
* arguments to its appropriate remote processor device address value.
* The @uva and @buva are used for identifying the offset of the function
* argument pointer in an original allocation. This supports the cases where
* an offset pointer (eg: alignment, packed buffers etc) needs to be passed
* as the argument rather than the actual allocated pointer.
*
* The remote processor device address is done by retrieving the base physical
* address of the buffer by importing the buffer and converting it to the
* remote processor device address using a remoteproc api, with adjustments
* to the offset.
*
* The offset is specifically adjusted for OMAP TILER to account for the stride
* and mapping onto the remote processor.
*
* Return: remote processor device address, 0 on failure (implies invalid
* arguments)
*/
dev_addr_t rppc_buffer_lookup(struct rppc_instance *rpc, virt_addr_t uva,
virt_addr_t buva, int fd)
{
phys_addr_t lpa = 0;
dev_addr_t rda = 0;
long uoff = uva - buva;
struct device *dev = rpc->dev;
struct rppc_dma_buf *buf;
dev_dbg(dev, "buva = %p uva = %p offset = %ld [0x%016lx] fd = %d\n",
(void *)buva, (void *)uva, uoff, (ulong)uoff, fd);
if (uoff < 0) {
dev_err(dev, "invalid pointer values for uva = %p from buva = %p\n",
(void *)uva, (void *)buva);
return rda;
}
buf = rppc_find_dmabuf(rpc, fd);
if (IS_ERR_OR_NULL(buf)) {
buf = rppc_alloc_dmabuf(rpc, fd, true);
if (IS_ERR(buf))
goto out;
}
lpa = buf->pa;
WARN_ON(lpa != sg_dma_address(buf->sgt->sgl));
uoff = rppc_recalc_off(lpa, uoff);
lpa += uoff;
rda = rppc_local_to_remote_da(rpc, lpa);
out:
dev_dbg(dev, "host uva %p == host pa %pa => remote da %p (fd %d)\n",
(void *)uva, &lpa, (void *)rda, fd);
return rda;
}
开发者ID:zhengsjgoembed,项目名称:335x-b4,代码行数:61,代码来源:rpmsg_rpc_dmabuf.c
示例6: srp_indirect_data
static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd,
struct srp_indirect_buf *id,
enum dma_data_direction dir, srp_rdma_t rdma_io,
int dma_map, int ext_desc)
{
struct iu_entry *iue = NULL;
struct srp_direct_buf *md = NULL;
struct scatterlist dummy, *sg = NULL;
dma_addr_t token = 0;
int err = 0;
int nmd, nsg = 0, len;
if (dma_map || ext_desc) {
iue = (struct iu_entry *) sc->SCp.ptr;
sg = scsi_sglist(sc);
dprintk("%p %u %u %d %d\n",
iue, scsi_bufflen(sc), id->len,
cmd->data_in_desc_cnt, cmd->data_out_desc_cnt);
}
nmd = id->table_desc.len / sizeof(struct srp_direct_buf);
if ((dir == DMA_FROM_DEVICE && nmd == cmd->data_in_desc_cnt) ||
(dir == DMA_TO_DEVICE && nmd == cmd->data_out_desc_cnt)) {
md = &id->desc_list[0];
goto rdma;
}
if (ext_desc && dma_map) {
md = dma_alloc_coherent(iue->target->dev, id->table_desc.len,
&token, GFP_KERNEL);
if (!md) {
eprintk("Can't get dma memory %u\n", id->table_desc.len);
return -ENOMEM;
}
sg_init_one(&dummy, md, id->table_desc.len);
sg_dma_address(&dummy) = token;
sg_dma_len(&dummy) = id->table_desc.len;
err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE,
id->table_desc.len);
if (err) {
eprintk("Error copying indirect table %d\n", err);
goto free_mem;
}
} else {
eprintk("This command uses external indirect buffer\n");
return -EINVAL;
}
rdma:
if (dma_map) {
nsg = dma_map_sg(iue->target->dev, sg, scsi_sg_count(sc),
DMA_BIDIRECTIONAL);
if (!nsg) {
eprintk("fail to map %p %d\n", iue, scsi_sg_count(sc));
err = -EIO;
goto free_mem;
}
len = min(scsi_bufflen(sc), id->len);
} else
len = id->len;
err = rdma_io(sc, sg, nsg, md, nmd, dir, len);
if (dma_map)
dma_unmap_sg(iue->target->dev, sg, nsg, DMA_BIDIRECTIONAL);
free_mem:
if (token && dma_map)
dma_free_coherent(iue->target->dev, id->table_desc.len, md, token);
return err;
}
开发者ID:KroMignon,项目名称:linux-emcraft,代码行数:75,代码来源:libsrp.c
示例7: saa7146_pgtable_build
static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *buf)
{
struct pci_dev *pci = dev->pci;
struct scatterlist *list = buf->vb.dma.sglist;
int length = buf->vb.dma.sglen;
struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
DEB_EE(("dev:%p, buf:%p, sg_len:%d\n",dev,buf,length));
if( 0 != IS_PLANAR(sfmt->trans)) {
struct saa7146_pgtable *pt1 = &buf->pt[0];
struct saa7146_pgtable *pt2 = &buf->pt[1];
struct saa7146_pgtable *pt3 = &buf->pt[2];
u32 *ptr1, *ptr2, *ptr3;
u32 fill;
int size = buf->fmt->width*buf->fmt->height;
int i,p,m1,m2,m3,o1,o2;
switch( sfmt->depth ) {
case 12: {
/* create some offsets inside the page table */
m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1;
m2 = ((size+(size/4)+PAGE_SIZE)/PAGE_SIZE)-1;
m3 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1;
o1 = size%PAGE_SIZE;
o2 = (size+(size/4))%PAGE_SIZE;
DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
break;
}
case 16: {
/* create some offsets inside the page table */
m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1;
m2 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1;
m3 = ((2*size+PAGE_SIZE)/PAGE_SIZE)-1;
o1 = size%PAGE_SIZE;
o2 = (size+(size/2))%PAGE_SIZE;
DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
break;
}
default: {
return -1;
}
}
ptr1 = pt1->cpu;
ptr2 = pt2->cpu;
ptr3 = pt3->cpu;
/* walk all pages, copy all page addresses to ptr1 */
for (i = 0; i < length; i++, list++) {
for (p = 0; p * 4096 < list->length; p++, ptr1++) {
*ptr1 = cpu_to_le32(sg_dma_address(list) - list->offset);
}
}
/*
ptr1 = pt1->cpu;
for(j=0;j<40;j++) {
printk("ptr1 %d: 0x%08x\n",j,ptr1[j]);
}
*/
/* if we have a user buffer, the first page may not be
aligned to a page boundary. */
pt1->offset = buf->vb.dma.sglist->offset;
pt2->offset = pt1->offset+o1;
pt3->offset = pt1->offset+o2;
/* create video-dma2 page table */
ptr1 = pt1->cpu;
for(i = m1; i <= m2 ; i++, ptr2++) {
*ptr2 = ptr1[i];
}
fill = *(ptr2-1);
for(;i<1024;i++,ptr2++) {
*ptr2 = fill;
}
/* create video-dma3 page table */
ptr1 = pt1->cpu;
for(i = m2; i <= m3; i++,ptr3++) {
*ptr3 = ptr1[i];
}
fill = *(ptr3-1);
for(;i<1024;i++,ptr3++) {
*ptr3 = fill;
}
/* finally: finish up video-dma1 page table */
ptr1 = pt1->cpu+m1;
fill = pt1->cpu[m1];
for(i=m1;i<1024;i++,ptr1++) {
*ptr1 = fill;
}
/*
ptr1 = pt1->cpu;
ptr2 = pt2->cpu;
ptr3 = pt3->cpu;
for(j=0;j<40;j++) {
printk("ptr1 %d: 0x%08x\n",j,ptr1[j]);
}
for(j=0;j<40;j++) {
//.........这里部分代码省略.........
开发者ID:BackupTheBerlios,项目名称:tew632-brp-svn,代码行数:101,代码来源:saa7146_video.c
示例8: msmsdcc_config_dma
static int msmsdcc_config_dma(struct msmsdcc_host *host, struct mmc_data *data)
{
struct msmsdcc_nc_dmadata *nc;
dmov_box *box;
uint32_t rows;
uint32_t crci;
unsigned int n;
int i, rc;
struct scatterlist *sg = data->sg;
rc = validate_dma(host, data);
if (rc)
return rc;
host->dma.sg = data->sg;
host->dma.num_ents = data->sg_len;
nc = host->dma.nc;
if (host->pdev_id == 1)
crci = MSMSDCC_CRCI_SDC1;
else if (host->pdev_id == 2)
crci = MSMSDCC_CRCI_SDC2;
else if (host->pdev_id == 3)
crci = MSMSDCC_CRCI_SDC3;
else if (host->pdev_id == 4)
crci = MSMSDCC_CRCI_SDC4;
else {
host->dma.sg = NULL;
host->dma.num_ents = 0;
return -ENOENT;
}
if (data->flags & MMC_DATA_READ)
host->dma.dir = DMA_FROM_DEVICE;
else
host->dma.dir = DMA_TO_DEVICE;
/* host->curr.user_pages = (data->flags & MMC_DATA_USERPAGE); */
host->curr.user_pages = 0;
n = dma_map_sg(mmc_dev(host->mmc), host->dma.sg,
host->dma.num_ents, host->dma.dir);
if (n != host->dma.num_ents) {
printk(KERN_ERR "%s: Unable to map in all sg elements\n",
mmc_hostname(host->mmc));
host->dma.sg = NULL;
host->dma.num_ents = 0;
return -ENOMEM;
}
box = &nc->cmd[0];
for (i = 0; i < host->dma.num_ents; i++) {
box->cmd = CMD_MODE_BOX;
if (i == (host->dma.num_ents - 1))
box->cmd |= CMD_LC;
rows = (sg_dma_len(sg) % MCI_FIFOSIZE) ?
(sg_dma_len(sg) / MCI_FIFOSIZE) + 1 :
(sg_dma_len(sg) / MCI_FIFOSIZE) ;
if (data->flags & MMC_DATA_READ) {
box->src_row_addr = msmsdcc_fifo_addr(host);
box->dst_row_addr = sg_dma_address(sg);
box->src_dst_len = (MCI_FIFOSIZE << 16) |
(MCI_FIFOSIZE);
box->row_offset = MCI_FIFOSIZE;
box->num_rows = rows * ((1 << 16) + 1);
box->cmd |= CMD_SRC_CRCI(crci);
} else {
box->src_row_addr = sg_dma_address(sg);
box->dst_row_addr = msmsdcc_fifo_addr(host);
box->src_dst_len = (MCI_FIFOSIZE << 16) |
(MCI_FIFOSIZE);
box->row_offset = (MCI_FIFOSIZE << 16);
box->num_rows = rows * ((1 << 16) + 1);
box->cmd |= CMD_DST_CRCI(crci);
}
box++;
sg++;
}
/* location of command block must be 64 bit aligned */
BUG_ON(host->dma.cmd_busaddr & 0x07);
nc->cmdptr = (host->dma.cmd_busaddr >> 3) | CMD_PTR_LP;
host->dma.hdr.cmdptr = DMOV_CMD_PTR_LIST |
DMOV_CMD_ADDR(host->dma.cmdptr_busaddr);
host->dma.hdr.complete_func = msmsdcc_dma_complete_func;
return 0;
}
开发者ID:3ig,项目名称:Xperia-2011-Official-Kernel-Sources,代码行数:97,代码来源:msm_sdcc.c
示例9: usb_sg_init
/**
* usb_sg_init - initializes scatterlist-based bulk/interrupt I/O request
* @io: request block being initialized. until usb_sg_wait() returns,
* treat this as a pointer to an opaque block of memory,
* @dev: the usb device that will send or receive the data
* @pipe: endpoint "pipe" used to transfer the data
* @period: polling rate for interrupt endpoints, in frames or
* (for high speed endpoints) microframes; ignored for bulk
* @sg: scatterlist entries
* @nents: how many entries in the scatterlist
* @length: how many bytes to send from the scatterlist, or zero to
* send every byte identified in the list.
* @mem_flags: SLAB_* flags affecting memory allocations in this call
*
* Returns zero for success, else a negative errno value. This initializes a
* scatter/gather request, allocating resources such as I/O mappings and urb
* memory (except maybe memory used by USB controller drivers).
*
* The request must be issued using usb_sg_wait(), which waits for the I/O to
* complete (or to be canceled) and then cleans up all resources allocated by
* usb_sg_init().
*
* The request may be canceled with usb_sg_cancel(), either before or after
* usb_sg_wait() is called.
*/
int usb_sg_init (
struct usb_sg_request *io,
struct usb_device *dev,
unsigned pipe,
unsigned period,
struct scatterlist *sg,
int nents,
size_t length,
int mem_flags
)
{
int i;
int urb_flags;
int dma;
if (!io || !dev || !sg
|| usb_pipecontrol (pipe)
|| usb_pipeisoc (pipe)
|| nents <= 0)
return -EINVAL;
spin_lock_init (&io->lock);
io->dev = dev;
io->pipe = pipe;
io->sg = sg;
io->nents = nents;
/* not all host controllers use DMA (like the mainstream pci ones);
* they can use PIO (sl811) or be software over another transport.
*/
dma = (dev->dev.dma_mask != 0);
if (dma)
io->entries = usb_buffer_map_sg (dev, pipe, sg, nents);
else
io->entries = nents;
/* initialize all the urbs we'll use */
if (io->entries <= 0)
return io->entries;
io->count = 0;
io->urbs = kmalloc (io->entries * sizeof *io->urbs, mem_flags);
if (!io->urbs)
goto nomem;
urb_flags = URB_ASYNC_UNLINK | URB_NO_TRANSFER_DMA_MAP
| URB_NO_INTERRUPT;
if (usb_pipein (pipe))
urb_flags |= URB_SHORT_NOT_OK;
for (i = 0; i < io->entries; i++, io->count = i) {
unsigned len;
io->urbs [i] = usb_alloc_urb (0, mem_flags);
if (!io->urbs [i]) {
io->entries = i;
goto nomem;
}
io->urbs [i]->dev = NULL;
io->urbs [i]->pipe = pipe;
io->urbs [i]->interval = period;
io->urbs [i]->transfer_flags = urb_flags;
io->urbs [i]->complete = sg_complete;
io->urbs [i]->context = io;
io->urbs [i]->status = -EINPROGRESS;
io->urbs [i]->actual_length = 0;
if (dma) {
/* hc may use _only_ transfer_dma */
io->urbs [i]->transfer_dma = sg_dma_address (sg + i);
len = sg_dma_len (sg + i);
} else {
/* hc may use _only_ transfer_buffer */
//.........这里部分代码省略.........
开发者ID:earthGavinLee,项目名称:hg556a_source,代码行数:101,代码来源:message.c
示例10: DRM_DEBUG_PRIME
struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
struct dma_buf *dma_buf)
{
struct dma_buf_attachment *attach;
struct sg_table *sgt;
struct scatterlist *sgl;
struct exynos_drm_gem_obj *exynos_gem_obj;
struct exynos_drm_gem_buf *buffer;
struct page *page;
int ret;
DRM_DEBUG_PRIME("%s\n", __FILE__);
/* is this one of own objects? */
if (dma_buf->ops == &exynos_dmabuf_ops) {
struct drm_gem_object *obj;
exynos_gem_obj = dma_buf->priv;
obj = &exynos_gem_obj->base;
/* is it from our device? */
if (obj->dev == drm_dev) {
/*
* Importing dmabuf exported from out own gem increases
* refcount on gem itself instead of f_count of dmabuf.
*/
drm_gem_object_reference(obj);
dma_buf_put(dma_buf);
return obj;
}
}
attach = dma_buf_attach(dma_buf, drm_dev->dev);
if (IS_ERR(attach))
return ERR_PTR(-EINVAL);
sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
if (IS_ERR_OR_NULL(sgt)) {
ret = PTR_ERR(sgt);
goto err_buf_detach;
}
buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
if (!buffer) {
DRM_ERROR("failed to allocate exynos_drm_gem_buf.\n");
ret = -ENOMEM;
goto err_unmap_attach;
}
buffer->pages = kzalloc(sizeof(*page) * sgt->nents, GFP_KERNEL);
if (!buffer->pages) {
DRM_ERROR("failed to allocate pages.\n");
ret = -ENOMEM;
goto err_free_buffer;
}
exynos_gem_obj = exynos_drm_gem_init(drm_dev, dma_buf->size);
if (!exynos_gem_obj) {
ret = -ENOMEM;
goto err_free_pages;
}
sgl = sgt->sgl;
if (sgt->nents == 1) {
buffer->dma_addr = sg_dma_address(sgt->sgl);
buffer->size = sg_dma_len(sgt->sgl);
/* always physically continuous memory if sgt->nents is 1. */
exynos_gem_obj->flags |= EXYNOS_BO_CONTIG;
} else {
unsigned int i = 0;
buffer->dma_addr = sg_dma_address(sgl);
while (i < sgt->nents) {
buffer->pages[i] = sg_page(sgl);
buffer->size += sg_dma_len(sgl);
sgl = sg_next(sgl);
i++;
}
exynos_gem_obj->flags |= EXYNOS_BO_NONCONTIG;
}
exynos_gem_obj->buffer = buffer;
buffer->sgt = sgt;
exynos_gem_obj->base.import_attach = attach;
DRM_DEBUG_PRIME("dma_addr = 0x%x, size = 0x%lx\n", buffer->dma_addr,
buffer->size);
return &exynos_gem_obj->base;
err_free_pages:
kfree(buffer->pages);
buffer->pages = NULL;
err_free_buffer:
kfree(buffer);
buffer = NULL;
//.........这里部分代码省略.........
开发者ID:robcore,项目名称:linux-hexagon,代码行数:101,代码来源:exynos_drm_dmabuf.c
示例11: sdxc_init_idma_des
/*********************************************************************
* Method :
* Description:
* Parameters :
*
* Returns :
* Note :
*********************************************************************/
static void sdxc_init_idma_des(struct awsmc_host* smc_host, struct mmc_data* data)
{
struct smc_idma_des* pdes = smc_host->pdes;
u32 des_idx = 0;
u32 buff_frag_num = 0;
u32 remain;
u32 i, j;
/* ³õʼ»¯IDMA Descriptor */
#if SDXC_DES_MODE == 0 //chain mode
for (i=0; i<data->sg_len; i++)
{
buff_frag_num = data->sg[i].length >> SDXC_DES_NUM_SHIFT; //SDXC_DES_NUM_SHIFT == 13, num = len/8192 = len>>13
remain = data->sg[i].length & (SDXC_DES_BUFFER_MAX_LEN-1);
if (remain)
{
buff_frag_num ++;
}
else
{
remain = SDXC_DES_BUFFER_MAX_LEN;
}
eLIBs_CleanFlushDCacheRegion(sg_virt(&data->sg[i]), data->sg[i].length);
for (j=0; j < buff_frag_num; j++, des_idx++)
{
memset((void*)&pdes[des_idx], 0, sizeof(struct smc_idma_des));
pdes[des_idx].des_chain = 1;
pdes[des_idx].own = 1;
pdes[des_idx].dic = 1;
if (buff_frag_num > 1 && j != buff_frag_num-1)
{
pdes[des_idx].data_buf1_sz = 0x1fff & SDXC_DES_BUFFER_MAX_LEN;
}
else
{
pdes[des_idx].data_buf1_sz = remain;
}
pdes[des_idx].buf_addr_ptr1 = sg_dma_address(&data->sg[i]) + j * SDXC_DES_BUFFER_MAX_LEN;
if (i==0 && j==0)
{
pdes[des_idx].first_des = 1;
}
if ((i == data->sg_len-1) && (j == buff_frag_num-1))
{
pdes[des_idx].dic = 0;
pdes[des_idx].last_des = 1;
pdes[des_idx].end_of_ring = 1;
pdes[des_idx].buf_addr_ptr2 = 0;
}
else
{
pdes[des_idx].buf_addr_ptr2 = __pa(&pdes[des_idx+1]);
}
// awsmc_info("sg %d, frag %d, remain %d, des[%d](%08x): [0] = %08x, [1] = %08x, [2] = %08x, [3] = %08x\n", i, j, remain,
// des_idx, (u32)&pdes[des_idx],
// (u32)((u32*)&pdes[des_idx])[0], (u32)((u32*)&pdes[des_idx])[1],
// (u32)((u32*)&pdes[des_idx])[2], (u32)((u32*)&pdes[des_idx])[3]);
}
}
#else //fix length skip mode
#endif
eLIBs_CleanFlushDCacheRegion(pdes, sizeof(struct smc_idma_des) * (des_idx+1));
return;
}
开发者ID:godark,项目名称:A10-Linux-2.6.36,代码行数:80,代码来源:sdxc.c
示例12: buffer_mgr_build_mlli
static int buffer_mgr_build_mlli(struct device *dev,
struct sg_data_array *sg_data,
struct mlli_params *mlli_params)
{
struct scatterlist *cur_sg_entry;
uint32_t *cur_mlli_entry;
uint32_t data_len;
uint32_t curr_nents = 0;
uint32_t i;
DX_LOG_DEBUG("sg_params: sg_data->num_of_sg = 0x%08X \n",
(uint32_t)sg_data->num_of_sg);
/* Allocate memory from the pointed pool */
mlli_params->mlli_virt_addr =
dma_pool_alloc(mlli_params->curr_pool, GFP_KERNEL,
&mlli_params->mlli_dma_addr);
if (unlikely(mlli_params->mlli_virt_addr == NULL)) {
DX_LOG_ERR("mlli table dma_pool_alloc() failed\n");
return -ENOMEM;
}
cur_mlli_entry = (unsigned int *)mlli_params->mlli_virt_addr;
/* go over all SG and link it to one MLLI table */
for(i = 0; i < sg_data->num_of_sg;i++) {
data_len = sg_data->sg_data_len_array[i];
for (cur_sg_entry = sg_data->sg_array[i];
(cur_sg_entry != NULL) && (data_len !=0);
cur_sg_entry = sg_next(cur_sg_entry) , cur_mlli_entry+=2) {
uint32_t entry_len =
((data_len > sg_dma_len(cur_sg_entry))) ?
sg_dma_len(cur_sg_entry) : data_len;
data_len -= entry_len;
cur_mlli_entry[SEP_LLI_ADDR_WORD_OFFSET] =
sg_dma_address(cur_sg_entry);
cur_mlli_entry[SEP_LLI_SIZE_WORD_OFFSET] =
entry_len;
DX_LOG_DEBUG("entry[%d] : mlli addr = 0x%08lX "
"mlli_len =0x%08lX\n",
curr_nents,
(unsigned long)cur_mlli_entry[SEP_LLI_ADDR_WORD_OFFSET],
(unsigned long)cur_mlli_entry[SEP_LLI_SIZE_WORD_OFFSET]);
curr_nents++;
} /* for */
/* set last bit in the current table*/
SEP_LLI_SET(&mlli_params->mlli_virt_addr[
SEP_LLI_ENTRY_BYTE_SIZE*(curr_nents-1)],
LAST, sg_data->is_last[i]);
} /* for */
mlli_params->mlli_len =
curr_nents * SEP_LLI_ENTRY_BYTE_SIZE;
SEP_LLI_SET(&mlli_params->mlli_virt_addr[
SEP_LLI_ENTRY_BYTE_SIZE*(curr_nents-1)],
LAST, 1);
DX_LOG_DEBUG("MLLI params: virt addr = 0x%08lX "
"dma_address=0x%08lX, mlli_len =0x%08X\n",
(unsigned long)mlli_params->mlli_virt_addr,
(unsigned long)mlli_params->mlli_dma_addr,
(unsigned)mlli_params->mlli_len);
return 0;
}
开发者ID:HuaweiHonor4C,项目名称:kernel_hi6210sft_mm,代码行数:64,代码来源:dx_buffer_mgr.c
示例13: asd_map_scatterlist
static inline int asd_map_scatterlist(struct sas_task *task,
struct sg_el *sg_arr,
gfp_t gfp_flags)
{
struct asd_ascb *ascb = task->lldd_task;
struct asd_ha_struct *asd_ha = ascb->ha;
struct scatterlist *sc;
int num_sg, res;
if (task->data_dir == PCI_DMA_NONE)
return 0;
if (task->num_scatter == 0) {
void *p = task->scatter;
dma_addr_t dma = pci_map_single(asd_ha->pcidev, p,
task->total_xfer_len,
task->data_dir);
sg_arr[0].bus_addr = cpu_to_le64((u64)dma);
sg_arr[0].size = cpu_to_le32(task->total_xfer_len);
sg_arr[0].flags |= ASD_SG_EL_LIST_EOL;
return 0;
}
num_sg = pci_map_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
task->data_dir);
if (num_sg == 0)
return -ENOMEM;
if (num_sg > 3) {
int i;
ascb->sg_arr = asd_alloc_coherent(asd_ha,
num_sg*sizeof(struct sg_el),
gfp_flags);
if (!ascb->sg_arr) {
res = -ENOMEM;
goto err_unmap;
}
for (sc = task->scatter, i = 0; i < num_sg; i++, sc++) {
struct sg_el *sg =
&((struct sg_el *)ascb->sg_arr->vaddr)[i];
sg->bus_addr = cpu_to_le64((u64)sg_dma_address(sc));
sg->size = cpu_to_le32((u32)sg_dma_len(sc));
if (i == num_sg-1)
sg->flags |= ASD_SG_EL_LIST_EOL;
}
for (sc = task->scatter, i = 0; i < 2; i++, sc++) {
sg_arr[i].bus_addr =
cpu_to_le64((u64)sg_dma_address(sc));
sg_arr[i].size = cpu_to_le32((u32)sg_dma_len(sc));
}
sg_arr[1].next_sg_offs = 2 * sizeof(*sg_arr);
sg_arr[1].flags |= ASD_SG_EL_LIST_EOS;
memset(&sg_arr[2], 0, sizeof(*sg_arr));
sg_arr[2].bus_addr=cpu_to_le64((u64)ascb->sg_arr->dma_handle);
} else {
int i;
for (sc = task->scatter, i = 0; i < num_sg; i++, sc++) {
sg_arr[i].bus_addr =
cpu_to_le64((u64)sg_dma_address(sc));
sg_arr[i].size = cpu_to_le32((u32)sg_dma_len(sc));
}
sg_arr[i-1].flags |= ASD_SG_EL_LIST_EOL;
}
return 0;
err_unmap:
pci_unmap_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
task->data_dir);
return res;
}
开发者ID:3sOx,项目名称:asuswrt-merlin,代码行数:73,代码来源:aic94xx_task.c
示例14: ox800_aeslrw_gencrypt
/**
* Generic LRW-AES en/decryption
* @param encrypt non-zero to encrypt, zero to decrypt
* @param in Source of data
* @param out Location to place en/decrypted data
* @param nents Number of entries in scatter list, in and out must have the same
* number of entries
* @param iv 8 byte array containing the I-Value
* @return error code or 0 for success
*/
static int ox800_aeslrw_gencrypt( u8 encrypt,
struct scatterlist* in,
struct scatterlist* out,
unsigned int nents,
u8 iv[])
{
oxnas_dma_channel_t* dma_in;
oxnas_dma_channel_t* dma_out;
struct scatterlist* out_;
char same_buffer;
int status = 0;
/* get dma resources (non blocking) */
dma_in = oxnas_dma_request(0);
dma_out = oxnas_dma_request(0);
VPRINTK("dma in %d out %d \n",
dma_in->channel_number_,
dma_out->channel_number_);
if ((dma_in) && (dma_out)) {
u32 reg;
// shouldn't be busy or full
reg = readl( OX800DPE_STATUS );
if (! (reg & OX800DPE_STAT_IDLE) )
printk("not idle after abort toggle");
if (reg & OX800DPE_STAT_TX_NOTEMPTY)
printk("tx fifo not empty after abort toggle");
if (! (reg & OX800DPE_STAT_RX_SPACE) )
printk("rx not empty after abort toggle");
/* check to see if the destination buffer is the same as the source */
same_buffer = (sg_phys(in) == sg_phys(out));
/* map transfers */
if (same_buffer) {
dma_map_sg(NULL, in, nents, DMA_BIDIRECTIONAL);
out_ = in;
} else {
/* map transfers */
dma_map_sg(NULL, in, nents, DMA_TO_DEVICE);
dma_map_sg(NULL, out, nents, DMA_FROM_DEVICE);
out_ = out;
}
#ifdef CIPHER_USE_SG_DMA
/* setup DMA transfers */
oxnas_dma_device_set_sg(
dma_in,
OXNAS_DMA_TO_DEVICE,
in,
nents,
&oxnas_dpe_rx_dma_settings,
OXNAS_DMA_MODE_INC);
oxnas_dma_device_set_sg(
dma_out,
OXNAS_DMA_FROM_DEVICE,
out_,
nents,
&oxnas_dpe_tx_dma_settings,
OXNAS_DMA_MODE_INC);
#else
oxnas_dma_device_set(
dma_in,
OXNAS_DMA_TO_DEVICE,
(unsigned char* )sg_dma_address(in),
sg_dma_len(in),
&oxnas_dpe_rx_dma_settings,
OXNAS_DMA_MODE_INC,
1 /*paused */ );
oxnas_dma_device_set(
dma_out,
OXNAS_DMA_FROM_DEVICE,
(unsigned char* )sg_dma_address(out_),
sg_dma_len(out_),
&oxnas_dpe_tx_dma_settings,
OXNAS_DMA_MODE_INC,
1 /*paused */ );
#endif
/* set dma callbacks */
oxnas_dma_set_callback(
dma_in,
OXNAS_DMA_CALLBACK_ARG_NUL,
OXNAS_DMA_CALLBACK_ARG_NUL);
oxnas_dma_set_callback(
//.........这里部分代码省略.........
开发者ID:aircross,项目名称:ray,代码行数:101,代码来源:cipher.c
示例15: hi_mci_setup_data
static int hi_mci_setup_data(struct himci_host *host, struct mmc_data *data)
{
unsigned int sg_phyaddr, sg_length;
unsigned int i, ret = 0;
unsigned int data_size;
unsigned int max_des, des_cnt;
struct himci_des *des;
himci_trace(2, "begin");
himci_assert(host);
himci_assert(data);
host->data = data;
if (data->flags & MMC_DATA_READ)
host->dma_dir = DMA_FROM_DEVICE;
else
host->dma_dir = DMA_TO_DEVICE;
host->dma_sg = data->sg;
host->dma_sg_num = dma_map_sg(mmc_dev(host->mmc),
data->sg, data->sg_len, host->dma_dir);
himci_assert(host->dma_sg_num);
himci_trace(2, "host->dma_sg_num is %d\n", host->dma_sg_num);
data_size = data->blksz * data->blocks;
if (data_size > (DMA_BUFFER * MAX_DMA_DES)) {
himci_error("mci request data_size is too big!\n");
ret = -1;
goto out;
}
himci_trace(2, "host->dma_paddr is 0x%08X,host->dma_vaddr is 0x%08X\n",
(unsigned int)host->dma_paddr,
(unsigned int)host->dma_vaddr);
max_des = (PAGE_SIZE/sizeof(struct himci_des));
des = (struct himci_des *)host->dma_vaddr;
des_cnt = 0;
for (i = 0; i < host->dma_sg_num; i++) {
sg_length = sg_dma_len(&data->sg[i]);
sg_phyaddr = sg_dma_address(&data->sg[i]);
himci_trace(2, "sg[%d] sg_length is 0x%08X, "
"sg_phyaddr is 0x%08X\n",
i, (unsigned int)sg_length,
(unsigned int)sg_phyaddr);
while (sg_length) {
des[des_cnt].idmac_des_ctrl = DMA_DES_OWN
| DMA_DES_NEXT_DES;
des[des_cnt].idmac_des_buf_addr = sg_phyaddr;
/* idmac_des_next_addr is paddr for dma */
des[des_cnt].idmac_des_next_addr = host->dma_paddr
+ (des_cnt + 1) * sizeof(struct himci_des);
if (sg_length >= 0x1F00) {
des[des_cnt].idmac_des_buf_size = 0x1F00;
sg_length -= 0x1F00;
sg_phyaddr += 0x1F00;
} else {
/* FIXME:data alignment */
des[des_cnt].idmac_des_buf_size = sg_length;
sg_length = 0;
}
himci_trace(2, "des[%d] vaddr is 0x%08X", i,
(unsigned int)&des[i]);
himci_trace(2, "des[%d].idmac_des_ctrl is 0x%08X",
i, (unsigned int)des[i].idmac_des_ctrl);
himci_trace(2, "des[%d].idmac_des_buf_size is 0x%08X",
i, (unsigned int)des[i].idmac_des_buf_size);
himci_trace(2, "des[%d].idmac_des_buf_addr 0x%08X",
i, (unsigned int)des[i].idmac_des_buf_addr);
himci_trace(2, "des[%d].idmac_des_next_addr is 0x%08X",
i, (unsigned int)des[i].idmac_des_next_addr);
des_cnt++;
}
himci_assert(des_cnt < max_des);
}
des[0].idmac_des_ctrl |= DMA_DES_FIRST_DES;
des[des_cnt - 1].idmac_des_ctrl |= DMA_DES_LAST_DES;
des[des_cnt - 1].idmac_des_next_addr = 0;
out:
return ret;
}
开发者ID:119-org,项目名称:hi3518-osdrv,代码行数:86,代码来源:himci.c
示例16: bfa_ioim_send_ioreq
/**
* Send I/O request to firmware.
*/
static bfa_boolean_t
bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim)
{
struct bfa_itnim_s *itnim = ioim->itnim;
struct bfi_ioim_req_s *m;
static struct fcp_cmnd_s cmnd_z0 = { 0 };
struct bfi_sge_s *sge;
u32 pgdlen = 0;
u64 addr;
struct scatterlist *sg;
struct scsi_cmnd *cmnd = (struct scsi_cmnd *) ioim->dio;
/**
* check for room in queue to send request now
*/
m = bfa_reqq_next(ioim->bfa, ioim->reqq);
if (!m) {
bfa_reqq_wait(ioim->bfa, ioim->reqq,
&ioim->iosp->reqq_wait);
return BFA_FALSE;
}
/**
* build i/o request message next
*/
m->io_tag = bfa_os_htons(ioim->iotag);
m->rport_hdl = ioim->itnim->rport->fw_handle;
m->io_timeout = bfa_cb_ioim_get_timeout(ioim->dio);
/**
* build inline IO SG element here
*/
sge = &m->sges[0];
if (ioim->nsges) {
sg = (struct scatterlist *)scsi_sglist(cmnd);
addr = bfa_os_sgaddr(sg_dma_address(sg));
sge->sga = *(union bfi_addr_u *) &addr;
pgdlen = sg_dma_len(sg);
sge->sg_len = pgdlen;
sge->flags = (ioim->nsges > BFI_SGE_INLINE) ?
BFI_SGE_DATA_CPL : BFI_SGE_DATA_LAST;
bfa_sge_to_be(sge);
sge++;
}
if (ioim->nsges > BFI_SGE_INLINE) {
sge->sga = ioim->sgpg->sgpg_pa;
} else {
sge->sga.a32.addr_lo = 0;
sge->sga.a32.addr_hi = 0;
}
sge->sg_len = pgdlen;
sge->flags = BFI_SGE_PGDLEN;
bfa_sge_to_be(sge);
/**
* set up I/O command parameters
*/
bfa_os_assign(m->cmnd, cmnd_z0);
m->cmnd.lun = bfa_cb_ioim_get_lun(ioim->dio);
m->cmnd.iodir = bfa_cb_ioim_get_iodir(ioim->dio);
bfa_os_assign(m->cmnd.cdb,
*(struct scsi_cdb_s *)bfa_cb_ioim_get_cdb(ioim->dio));
m->cmnd.fcp_dl = bfa_os_htonl(bfa_cb_ioim_get_size(ioim->dio));
/**
* set up I/O message header
*/
switch (m->cmnd.iodir) {
case FCP_IODIR_READ:
bfi_h2i_set(m->mh, BFI_MC_IOIM_READ, 0, bfa_lpuid(ioim->bfa));
bfa_stats(itnim, input_reqs);
break;
case FCP_IODIR_WRITE:
bfi_h2i_set(m->mh, BFI_MC_IOIM_WRITE, 0, bfa_lpuid(ioim->bfa));
bfa_stats(itnim, output_reqs);
break;
case FCP_IODIR_RW:
bfa_stats(itnim, input_reqs);
bfa_stats(itnim, output_reqs);
default:
bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_lpuid(ioim->bfa));
}
if (itnim->seq_rec ||
(bfa_cb_ioim_get_size(ioim->dio) & (sizeof(u32) - 1)))
bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_lpuid(ioim->bfa));
#ifdef IOIM_ADVANCED
m->cmnd.crn = bfa_cb_ioim_get_crn(ioim->dio);
m->cmnd.priority = bfa_cb_ioim_get_priority(ioim->dio);
m->cmnd.taskattr = bfa_cb_ioim_get_taskattr(ioim->dio);
/**
* Handle large CDB (>16 bytes).
*/
m->cmnd.addl_cdb_len = (bfa_cb_ioim_get_cdblen(ioim->dio) -
FCP_CMND_CDB_LEN) / sizeof(u32);
//.........这里部分代码省略.........
开发者ID:3sOx,项目名称:asuswrt-merlin,代码行数:101,代码来源:bfa_ioim.c
示例17: map_ablkcipher_request
int map_ablkcipher_request(struct device *dev, struct ablkcipher_request *req)
{
struct ablkcipher_req_ctx *areq_ctx = ablkcipher_request_ctx(req);
unsigned int iv_size = crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(req));
struct mlli_params *mlli_params = &areq_ctx->mlli_params;
struct sg_data_array sg_data;
struct buff_mgr_handle *buff_mgr = crypto_drvdata->buff_mgr_handle;
int dummy = 0;
int rc = 0;
areq_ctx->sec_dir = 0;
areq_ctx->dma_buf_type = DX_DMA_BUF_DLLI;
mlli_params->curr_pool = NULL;
sg_data.num_of_sg = 0;
/* Map IV buffer */
if (likely(iv_size != 0) ) {
dump_byte_array("iv", (uint8_t *)req->info, iv_size);
areq_ctx->gen_ctx.iv_dma_addr =
dma_map_single(dev, (void *)req->info,
iv_size, DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(dev,
areq_ctx->gen_ctx.iv_dma_addr))) {
DX_LOG_ERR("Mapping iv %u B at va=0x%08lX "
"for DMA failed\n",iv_size,
(unsigned long)req->info);
return -ENOMEM;
}
DX_LOG_DEBUG("Mapped iv %u B at va=0x%08lX to dma=0x%08lX\n",
iv_size, (unsigned long)req->info,
(unsigned long)areq_ctx->gen_ctx.iv_dma_addr);
} else {
areq_ctx->gen_ctx.iv_dma_addr = 0;
}
/* Map the src sg */
if ( sg_is_last(req->src) &&
(sg_page(req->src) == NULL) &&
sg_dma_address(req->src)) {
/* The source is secure no mapping is needed */
areq_ctx->sec_dir = DX_SRC_DMA_IS_SECURE;
areq_ctx->in_nents = 1;
} else {
if ( unlikely( dx_map_sg( dev,req->src, req->nbytes,
DMA_BIDIRECTIONAL,
&areq_ctx->in_nents,
LLI_MAX_NUM_OF_DATA_ENTRIES,
&dummy))){
rc = -ENOMEM;
goto fail_unmap_iv;
}
if ( areq_ctx->in_nents > 1 ) {
areq_ctx->dma_buf_type = DX_DMA_BUF_MLLI;
}
}
if ( unlikely(req->src == req->dst)) {
if ( areq_ctx->sec_dir == DX_SRC_DMA_IS_SECURE ) {
DX_LOG_ERR("Secure key inplace operation "
"is not supported \n");
/* both sides are secure */
rc = -ENOMEM;
goto fail_unmap_din;
}
/* Handle inplace operation */
if ( unlikely(areq_ctx->dma_buf_type == DX_DMA_BUF_MLLI) ) {
areq_ctx->out_nents = 0;
buffer_mgr_set_sg_entry(&sg_data,
areq_ctx->in_nents,
req->src,
req->nbytes,
true);
}
} else {
if ( sg_is_last(req->dst) &&
(sg_page(req->dst) == NULL) &&
sg_dma_address(req->dst)) {
if ( areq_ctx->sec_dir == DX_SRC_DMA_IS_SECURE ) {
DX_LOG_ERR("Secure key in both sides is"
"not supported \n");
/* both sides are secure */
rc = -ENOMEM;
goto fail_unmap_din;
}
/* The dest is secure no mapping is needed */
areq_ctx->sec_dir = DX_DST_DMA_IS_SECURE;
areq_ctx->out_nents = 1;
} else {
/* Map the dst sg */
if ( unlikely( dx_map_sg(dev,req->dst, req->nbytes,
DMA_BIDIRECTIONAL,
&areq_ctx->out_nents,
LLI_MAX_NUM_OF_DATA_ENTRIES,
&dummy))){
rc = -ENOMEM;
goto fail_unmap_din;
}
if ( areq_ctx->out_nents > 1 ) {
//.........这里部分代码省略.........
开发者ID:HuaweiHonor4C,项目名称:kernel_hi6210sft_mm,代码行数:101,代码来源:dx_buffer_mgr.c
示例18: sdhci_bcm2708_dma_complete_irq
static void sdhci_bcm2708_dma_complete_irq(struct sdhci_host *host,
u32 dma_cs)
{
struct sdhci_bcm2708_priv *host_priv = SDHCI_HOST_PRIV(host);
struct mmc_data *data;
struct scatterlist *sg;
int sg_len;
int sg_ix;
int sg_todo;
// unsigned long flags;
BUG_ON(NULL == host);
// spin_lock_irqsave(&host->lock, flags);
data = host->data;
#ifdef CHECK_DMA_USE
if (host_priv->dmas_pending <= 0)
DBG("on completion no DMA in progress - "
"now %
|
请发表评论