/* pasemi_dma_alloc_ring - Allocate descriptor ring for a channel *@chan:Channelforwhichtoallocate *@ring_size:Ringsizein64-bit(8-byte)words * *Allocateadescriptorringforachannel.Returns0onsuccess,errno *onfailure.Thepassedinstructpasemi_dmachanisupdatedwiththe *virtualandDMAaddressesofthering.
*/ int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)
{
BUG_ON(chan->ring_virt);
if (chan->chan_type == RXCHAN) {
reg = PAS_DMA_RXCHAN_CCMDSTA(chan->chno);
pasemi_write_dma_reg(reg, PAS_DMA_RXCHAN_CCMDSTA_ST); for (retries = 0; retries < MAX_RETRIES; retries++) {
sta = pasemi_read_dma_reg(reg); if (!(sta & PAS_DMA_RXCHAN_CCMDSTA_ACT)) {
pasemi_write_dma_reg(reg, 0); return1;
}
cond_resched();
}
} else {
reg = PAS_DMA_TXCHAN_TCMDSTA(chan->chno);
pasemi_write_dma_reg(reg, PAS_DMA_TXCHAN_TCMDSTA_ST); for (retries = 0; retries < MAX_RETRIES; retries++) {
sta = pasemi_read_dma_reg(reg); if (!(sta & PAS_DMA_TXCHAN_TCMDSTA_ACT)) {
pasemi_write_dma_reg(reg, 0); return1;
}
cond_resched();
}
}
return0;
}
EXPORT_SYMBOL(pasemi_dma_stop_chan);
/* pasemi_dma_alloc_buf - Allocate a buffer to use for DMA *@chan:Channeltoallocatefor *@size:Sizeofbufferinbytes *@handle:DMAhandle * *AllocateabuffertobeusedbytheDMAengineforread/write, *similartodma_alloc_coherent(). * *Returnsthevirtualaddressofthebuffer,orNULLincaseoffailure.
*/ void *pasemi_dma_alloc_buf(struct pasemi_dmachan *chan, int size,
dma_addr_t *handle)
{ return dma_alloc_coherent(&dma_pdev->dev, size, handle, GFP_KERNEL);
}
EXPORT_SYMBOL(pasemi_dma_alloc_buf);
/* pasemi_dma_free_buf - Free a buffer used for DMA *@chan:Channelthebufferwasallocatedfor *@size:Sizeofbufferinbytes *@handle:DMAhandle * *Freesapreviouslyallocatedbuffer.
*/ void pasemi_dma_free_buf(struct pasemi_dmachan *chan, int size,
dma_addr_t *handle)
{
dma_free_coherent(&dma_pdev->dev, size, handle, GFP_KERNEL);
}
EXPORT_SYMBOL(pasemi_dma_free_buf);
/* pasemi_dma_alloc_flag - Allocate a flag (event) for channel synchronization * *Allocatesaflagforusewithchannelsynchronization(eventdescriptors). *Returnsallocatedflag(0-63),<0onerror.
*/ int pasemi_dma_alloc_flag(void)
{ int bit;
retry:
bit = find_first_bit(flags_free, MAX_FLAGS); if (bit >= MAX_FLAGS) return -ENOSPC; if (!test_and_clear_bit(bit, flags_free)) goto retry;
/* pasemi_dma_set_flag - Sets a flag (event) to 1 *@flag:Flagnumbertosetactive * *Setstheflagprovidedto1.
*/ void pasemi_dma_set_flag(int flag)
{
BUG_ON(flag >= MAX_FLAGS); if (flag < 32)
pasemi_write_dma_reg(PAS_DMA_TXF_SFLG0, 1 << flag); else
pasemi_write_dma_reg(PAS_DMA_TXF_SFLG1, 1 << flag);
}
EXPORT_SYMBOL(pasemi_dma_set_flag);
/* pasemi_dma_clear_flag - Sets a flag (event) to 0 *@flag:Flagnumbertosetinactive * *Setstheflagprovidedto0.
*/ void pasemi_dma_clear_flag(int flag)
{
BUG_ON(flag >= MAX_FLAGS); if (flag < 32)
pasemi_write_dma_reg(PAS_DMA_TXF_CFLG0, 1 << flag); else
pasemi_write_dma_reg(PAS_DMA_TXF_CFLG1, 1 << flag);
}
EXPORT_SYMBOL(pasemi_dma_clear_flag);
/* pasemi_dma_alloc_fun - Allocate a function engine * *Allocatesafunctionenginetouseforcrypto/checksumoffload *Returnsallocatedengine(0-8),<0onerror.
*/ int pasemi_dma_alloc_fun(void)
{ int bit;
retry:
bit = find_first_bit(fun_free, MAX_FLAGS); if (bit >= MAX_FLAGS) return -ENOSPC; if (!test_and_clear_bit(bit, fun_free)) goto retry;
dn = pci_device_to_OF_node(p); if (!dn) goto fallback;
ret = of_iomap(dn, index); if (!ret) goto fallback;
return ret;
fallback: /* This is hardcoded and ugly, but we have some firmware versions *thatdon'tprovidetheregisterspaceinthedevicetree.Luckily *theyareatwell-knownlocationssowecanjustdothemathhere.
*/ return ioremap(0xe0000000 + (p->devfn << 12), 0x2000);
}
/* pasemi_dma_init - Initialize the PA Semi DMA library * *ThisfunctioninitializestheDMAlibrary.Itmustbecalledbefore *anyotherfunctioninthelibrary. * *Returns0onsuccess,errnoonfailure.
*/ int pasemi_dma_init(void)
{ static DEFINE_SPINLOCK(init_lock); struct pci_dev *iob_pdev; struct pci_dev *pdev; struct resource res; struct device_node *dn; int i, intf, err = 0; unsignedlong timeout;
u32 tmp;
if (!machine_is(pasemi)) return -ENODEV;
spin_lock(&init_lock);
/* Make sure we haven't already initialized */ if (dma_pdev) goto out;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
(vorverarbeitet am 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.