/alps/pcitool

To get this branch, use:
bzr branch http://darksoft.org/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to dma/ipe.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-11-20 05:04:08 UTC
  • Revision ID: csa@suren.me-20151120050408-jrzier07533vly8f
Support large DMA pages in IPEDMA

Show diffs side-by-side

added added

removed removed

Lines of Context:
142
142
 
143
143
    if (ctx->pages) return 0;
144
144
 
 
145
#ifdef IPEDMA_TLP_SIZE  
 
146
        tlp_size = IPEDMA_TLP_SIZE;
 
147
#else /* IPEDMA_TLP_SIZE */
 
148
        link_info = pcilib_get_pcie_link_info(vctx->pcilib);
 
149
        if (link_info) {
 
150
            tlp_size = 1<<link_info->payload;
 
151
            if (tlp_size > IPEDMA_MAX_TLP_SIZE)
 
152
                tlp_size = IPEDMA_MAX_TLP_SIZE;
 
153
        } else tlp_size = 128;
 
154
#endif /* IPEDMA_TLP_SIZE */
 
155
 
145
156
    if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "dma_timeout", &value))
146
157
        ctx->dma_timeout = value;
147
158
    else 
148
159
        ctx->dma_timeout = IPEDMA_DMA_TIMEOUT;
149
160
 
150
 
    if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "dma_page_size", &value))
151
 
        ctx->dma_page_size = value;
152
 
    else
153
 
        ctx->dma_page_size = IPEDMA_PAGE_SIZE;
 
161
    if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "dma_page_size", &value)) {
 
162
        if (value % IPEDMA_PAGE_SIZE) {
 
163
            pcilib_error("Invalid DMA page size (%lu) is configured", value);
 
164
            return PCILIB_ERROR_INVALID_ARGUMENT;
 
165
        }
 
166
        //if ((value)&&((value / (tlp_size * IPEDMA_CORES)) > ...seems no limit...)) { ... fail ... }
 
167
 
 
168
        ctx->page_size = value;
 
169
    } else
 
170
        ctx->page_size = IPEDMA_PAGE_SIZE;
154
171
 
155
172
    if (!pcilib_read_register(ctx->dmactx.pcilib, "dmaconf", "dma_pages", &value))
156
173
        ctx->dma_pages = value;
174
191
 
175
192
    kflags = PCILIB_KMEM_FLAG_REUSE|PCILIB_KMEM_FLAG_EXCLUSIVE|PCILIB_KMEM_FLAG_HARDWARE|(ctx->preserve?PCILIB_KMEM_FLAG_PERSISTENT:0);
176
193
    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);
177
 
    pcilib_kmem_handle_t *pages = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_DMA_C2S_PAGE, IPEDMA_DMA_PAGES, 0, 0, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, 0x00), kflags);
 
194
    pcilib_kmem_handle_t *pages = pcilib_alloc_kernel_memory(ctx->dmactx.pcilib, PCILIB_KMEM_TYPE_DMA_C2S_PAGE, IPEDMA_DMA_PAGES, ctx->page_size, 0, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, 0x00), kflags);
178
195
 
179
196
    if (!desc||!pages) {
180
197
        if (pages) pcilib_free_kernel_memory(ctx->dmactx.pcilib, pages, 0);
212
229
        last_written_addr_ptr = desc_va + 2 * sizeof(uint32_t);
213
230
    }
214
231
 
 
232
        // get page size if default size was used
 
233
    if (!ctx->page_size) {
 
234
        ctx->page_size = pcilib_kmem_get_block_size(ctx->dmactx.pcilib, pages, 0);
 
235
    }
 
236
 
215
237
    if (preserve) {
216
238
        ctx->reused = 1;
217
239
        ctx->preserve = 1;
249
271
        if (ctx->mode64) address64 = 0x8000 | (0<<24);
250
272
        else address64 = 0;
251
273
 
252
 
#ifdef IPEDMA_TLP_SIZE  
253
 
        tlp_size = IPEDMA_TLP_SIZE;
254
 
#else /* IPEDMA_TLP_SIZE */
255
 
        link_info = pcilib_get_pcie_link_info(vctx->pcilib);
256
 
        if (link_info) {
257
 
            tlp_size = 1<<link_info->payload;
258
 
            if (tlp_size > IPEDMA_MAX_TLP_SIZE)
259
 
                tlp_size = IPEDMA_MAX_TLP_SIZE;
260
 
        } else tlp_size = 128;
261
 
#endif /* IPEDMA_TLP_SIZE */
262
274
        WR(IPEDMA_REG_TLP_SIZE,  address64 | (tlp_size>>2));
263
 
        WR(IPEDMA_REG_TLP_COUNT, IPEDMA_PAGE_SIZE / (tlp_size * IPEDMA_CORES));
 
275
        WR(IPEDMA_REG_TLP_COUNT, ctx->page_size / (tlp_size * IPEDMA_CORES));
264
276
 
265
277
            // Setting progress register threshold
266
278
        WR(IPEDMA_REG_UPDATE_THRESHOLD, IPEDMA_DMA_PROGRESS_THRESHOLD);
325
337
 
326
338
    ctx->desc = desc;
327
339
    ctx->pages = pages;
328
 
    ctx->page_size = pcilib_kmem_get_block_size(ctx->dmactx.pcilib, pages, 0);
 
340
 
329
341
    ctx->ring_size = IPEDMA_DMA_PAGES;
330
342
 
331
343
    return 0;