30
30
if (!ctx->dma_ctx) return NULL;
32
return ctx->model_info.dma;
36
36
pcilib_dma_engine_t pcilib_find_dma_by_addr(pcilib_t *ctx, pcilib_dma_direction_t direction, pcilib_dma_engine_addr_t dma) {
37
37
pcilib_dma_engine_t i;
39
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
39
const pcilib_dma_description_t *dma_info = pcilib_get_dma_description(ctx);
41
41
pcilib_error("DMA Engine is not configured in the current model");
42
42
return PCILIB_ERROR_NOTSUPPORTED;
45
for (i = 0; info->engines[i].addr_bits; i++) {
46
if ((info->engines[i].addr == dma)&&((info->engines[i].direction&direction)==direction)) break;
45
for (i = 0; dma_info->engines[i].addr_bits; i++) {
46
if ((dma_info->engines[i].addr == dma)&&((dma_info->engines[i].direction&direction)==direction)) break;
49
if (info->engines[i].addr_bits) return i;
49
if (dma_info->engines[i].addr_bits) return i;
50
50
return PCILIB_DMA_ENGINE_INVALID;
77
77
dma_ctx = model_info->api->init_dma(ctx->event_ctx);
78
} else if ((model_info->dma)&&(model_info->dma->api)&&(model_info->dma->api->init)) {
79
const pcilib_dma_description_t *dma = model_info->dma;
78
} else if ((ctx->dma.api)&&(ctx->dma.api->init)) {
81
79
err = pcilib_init_register_banks(ctx);
83
81
pcilib_error("Error (%i) while initializing register banks", err);
87
dma_ctx = dma->api->init(ctx, (dma->model?dma->model:ctx->model), dma->args);
85
dma_ctx = ctx->dma.api->init(ctx, (ctx->dma.model?ctx->dma.model:ctx->model), ctx->dma.args);
99
97
int pcilib_start_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags) {
100
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
98
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
102
100
pcilib_error("DMA is not supported by the device");
103
101
return PCILIB_ERROR_NOTSUPPORTED;
106
if (!ctx->model_info.dma->api) {
107
105
pcilib_error("DMA Engine is not configured in the current model");
108
106
return PCILIB_ERROR_NOTAVAILABLE;
111
if (!ctx->model_info.dma->api->start_dma) {
109
if (!info->api->start_dma) {
115
return ctx->model_info.dma->api->start_dma(ctx->dma_ctx, dma, flags);
113
return info->api->start_dma(ctx->dma_ctx, dma, flags);
118
116
int pcilib_stop_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags) {
119
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
117
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
122
120
pcilib_error("DMA is not supported by the device");
123
121
return PCILIB_ERROR_NOTSUPPORTED;
126
if (!ctx->model_info.dma->api) {
127
125
pcilib_error("DMA Engine is not configured in the current model");
128
126
return PCILIB_ERROR_NOTAVAILABLE;
131
if (!ctx->model_info.dma->api->stop_dma) {
129
if (!info->api->stop_dma) {
135
return ctx->model_info.dma->api->stop_dma(ctx->dma_ctx, dma, flags);
133
return info->api->stop_dma(ctx->dma_ctx, dma, flags);
138
136
int pcilib_enable_irq(pcilib_t *ctx, pcilib_irq_type_t irq_type, pcilib_dma_flags_t flags) {
139
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
141
if ((!info)||(!ctx->model_info.dma->api)||(!ctx->model_info.dma->api->enable_irq)) return 0;
143
return ctx->model_info.dma->api->enable_irq(ctx->dma_ctx, irq_type, flags);
137
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
139
if ((!info)||(!info->api)||(!info->api->enable_irq)) return 0;
141
return info->api->enable_irq(ctx->dma_ctx, irq_type, flags);
146
144
int pcilib_disable_irq(pcilib_t *ctx, pcilib_dma_flags_t flags) {
147
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
149
if ((!info)||(!ctx->model_info.dma->api)||(!ctx->model_info.dma->api->disable_irq)) return 0;
151
return ctx->model_info.dma->api->disable_irq(ctx->dma_ctx, flags);
145
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
147
if ((!info)||(!info->api)||(!info->api->disable_irq)) return 0;
149
return info->api->disable_irq(ctx->dma_ctx, flags);
154
152
int pcilib_acknowledge_irq(pcilib_t *ctx, pcilib_irq_type_t irq_type, pcilib_irq_source_t irq_source) {
155
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
157
if ((!info)||(!ctx->model_info.dma->api)||(!ctx->model_info.dma->api->acknowledge_irq)) return 0;
159
return ctx->model_info.dma->api->acknowledge_irq(ctx->dma_ctx, irq_type, irq_source);
153
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
155
if ((!info)||(!info->api)||(!info->api->acknowledge_irq)) return 0;
157
return info->api->acknowledge_irq(ctx->dma_ctx, irq_type, irq_source);
205
203
int pcilib_stream_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, pcilib_dma_callback_t cb, void *cbattr) {
206
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
204
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
208
206
pcilib_error("DMA is not supported by the device");
209
207
return PCILIB_ERROR_NOTSUPPORTED;
212
if (!ctx->model_info.dma->api) {
213
211
pcilib_error("DMA Engine is not configured in the current model");
214
212
return PCILIB_ERROR_NOTAVAILABLE;
217
if (!ctx->model_info.dma->api->stream) {
215
if (!info->api->stream) {
218
216
pcilib_error("The DMA read is not supported by configured DMA engine");
219
217
return PCILIB_ERROR_NOTSUPPORTED;
230
228
return PCILIB_ERROR_NOTSUPPORTED;
233
return ctx->model_info.dma->api->stream(ctx->dma_ctx, dma, addr, size, flags, timeout, cb, cbattr);
231
return info->api->stream(ctx->dma_ctx, dma, addr, size, flags, timeout, cb, cbattr);
236
234
int pcilib_read_dma_custom(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *read_bytes) {
282
280
int pcilib_push_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *written) {
283
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
281
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
285
283
pcilib_error("DMA is not supported by the device");
286
284
return PCILIB_ERROR_NOTSUPPORTED;
289
if (!ctx->model_info.dma->api) {
290
288
pcilib_error("DMA Engine is not configured in the current model");
291
289
return PCILIB_ERROR_NOTAVAILABLE;
294
if (!ctx->model_info.dma->api->push) {
292
if (!info->api->push) {
295
293
pcilib_error("The DMA write is not supported by configured DMA engine");
296
294
return PCILIB_ERROR_NOTSUPPORTED;
307
305
return PCILIB_ERROR_NOTSUPPORTED;
310
return ctx->model_info.dma->api->push(ctx->dma_ctx, dma, addr, size, flags, timeout, buf, written);
308
return info->api->push(ctx->dma_ctx, dma, addr, size, flags, timeout, buf, written);
318
316
double pcilib_benchmark_dma(pcilib_t *ctx, pcilib_dma_engine_addr_t dma, uintptr_t addr, size_t size, size_t iterations, pcilib_dma_direction_t direction) {
319
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
317
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
321
319
pcilib_error("DMA is not supported by the device");
325
if (!ctx->model_info.dma->api) {
326
324
pcilib_error("DMA Engine is not configured in the current model");
330
if (!ctx->model_info.dma->api->benchmark) {
328
if (!info->api->benchmark) {
331
329
pcilib_error("The DMA benchmark is not supported by configured DMA engine");
335
return ctx->model_info.dma->api->benchmark(ctx->dma_ctx, dma, addr, size, iterations, direction);
333
return info->api->benchmark(ctx->dma_ctx, dma, addr, size, iterations, direction);
338
336
int pcilib_get_dma_status(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers) {
339
const pcilib_dma_description_t *info = pcilib_get_dma_info(ctx);
337
const pcilib_dma_description_t *info = pcilib_get_dma_description(ctx);
341
339
pcilib_error("DMA is not supported by the device");
345
if (!ctx->model_info.dma->api) {
346
344
pcilib_error("DMA Engine is not configured in the current model");
350
if (!ctx->model_info.dma->api->status) {
348
if (!info->api->status) {
351
349
memset(status, 0, sizeof(pcilib_dma_engine_status_t));