136
136
ipe_dma_t *ctx = (ipe_dma_t*)vctx;
138
pcilib_kmem_handle_t *desc = NULL;
139
pcilib_kmem_handle_t *pages = NULL;
138
141
#ifndef IPEDMA_TLP_SIZE
139
142
const pcilib_pcie_link_info_t *link_info;
140
143
#endif /* ! IPEDMA_TLP_SIZE */
166
170
link_info = pcilib_get_pcie_link_info(vctx->pcilib);
168
172
tlp_size = 1<<link_info->payload;
173
# ifdef IPEDMA_MAX_TLP_SIZE
169
174
if (tlp_size > IPEDMA_MAX_TLP_SIZE)
170
175
tlp_size = IPEDMA_MAX_TLP_SIZE;
176
# endif /* IPEDMA_MAX_TLP_SIZE */
171
177
} else tlp_size = 128;
172
178
#endif /* IPEDMA_TLP_SIZE */
193
199
ctx->ring_size = IPEDMA_DMA_PAGES;
201
if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "dma_region_low", &value)) {
203
if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "dma_region_low", &value))
204
dma_region |= ((uintptr_t)value)<<32;
195
207
if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "ipedma_flags", &value))
196
208
ctx->dma_flags = value;
208
220
#endif /* IPEDMA_CONFIGURE_DMA_MASK */
210
222
kflags = PCILIB_KMEM_FLAG_REUSE|PCILIB_KMEM_FLAG_EXCLUSIVE|PCILIB_KMEM_FLAG_HARDWARE|(ctx->preserve?PCILIB_KMEM_FLAG_PERSISTENT:0);
211
pcilib_kmem_handle_t *desc = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_CONSISTENT, 1, IPEDMA_DESCRIPTOR_SIZE, IPEDMA_DESCRIPTOR_ALIGNMENT, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_RING, 0x00), kflags);
212
pcilib_kmem_handle_t *pages = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_DMA_C2S_PAGE, ctx->ring_size, ctx->page_size, 0, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, 0x00), kflags);
224
desc = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_CONSISTENT, 1, IPEDMA_DESCRIPTOR_SIZE, IPEDMA_DESCRIPTOR_ALIGNMENT, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_RING, 0x00), kflags);
226
pages = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_REGION_C2S, ctx->ring_size, ctx->page_size, dma_region, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, 0x00), kflags);
228
pages = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_DMA_C2S_PAGE, ctx->ring_size, ctx->page_size, 0, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, 0x00), kflags);
214
230
if (!desc||!pages) {
215
231
if (pages) pcilib_free_kernel_memory(ctx->dmactx.pcilib, pages, KMEM_FLAG_REUSE);
216
232
if (desc) pcilib_free_kernel_memory(ctx->dmactx.pcilib, desc, KMEM_FLAG_REUSE);
217
printf("%lu\n", IPEDMA_DESCRIPTOR_SIZE);
218
233
pcilib_error("Can't allocate required kernel memory for IPEDMA engine (%lu pages of %lu bytes + %lu byte descriptor)", ctx->ring_size, ctx->page_size, (unsigned long)IPEDMA_DESCRIPTOR_SIZE);
219
234
return PCILIB_ERROR_MEMORY;
227
242
pcilib_free_kernel_memory(ctx->dmactx.pcilib, pages, KMEM_FLAG_REUSE);
228
243
pcilib_free_kernel_memory(ctx->dmactx.pcilib, desc, KMEM_FLAG_REUSE);
230
if ((flags&PCILIB_DMA_FLAG_STOP) == 0) {
245
if (((flags&PCILIB_DMA_FLAG_STOP) == 0)||(dma_region)) {
231
246
pcilib_error("Inconsistent DMA buffers are found (buffers are only partially re-used). This is very wrong, please stop DMA engine and correct configuration...");
232
247
return PCILIB_ERROR_INVALID_STATE;