13
#include "nwl_private.h"
14
#include "nwl_defines.h"
16
int dma_nwl_init_irq(nwl_dma_t *ctx, uint32_t val) {
17
if (val&(DMA_INT_ENABLE|DMA_USER_INT_ENABLE)) {
18
if (val&DMA_INT_ENABLE) ctx->irq_preserve |= PCILIB_DMA_IRQ;
19
if (val&DMA_USER_INT_ENABLE) ctx->irq_preserve |= PCILIB_EVENT_IRQ;
26
int dma_nwl_free_irq(nwl_dma_t *ctx) {
27
if (ctx->irq_started) {
28
dma_nwl_disable_irq((pcilib_dma_context_t*)ctx, 0);
29
if (ctx->irq_preserve) dma_nwl_enable_irq((pcilib_dma_context_t*)ctx, ctx->irq_preserve, 0);
36
int dma_nwl_enable_irq(pcilib_dma_context_t *vctx, pcilib_irq_type_t type, pcilib_dma_flags_t flags) {
38
nwl_dma_t *ctx = (nwl_dma_t*)vctx;
40
if (flags&PCILIB_DMA_FLAG_PERSISTENT) ctx->irq_preserve |= type;
42
if ((ctx->irq_enabled&type) == type) return 0;
44
type |= ctx->irq_enabled;
46
nwl_read_register(val, ctx, ctx->base_addr, REG_DMA_CTRL_STATUS);
47
if (!ctx->irq_started) dma_nwl_init_irq(ctx, val);
49
val &= ~(DMA_INT_ENABLE|DMA_USER_INT_ENABLE);
50
nwl_write_register(val, ctx, ctx->base_addr, REG_DMA_CTRL_STATUS);
52
pcilib_clear_irq(ctx->pcilib, NWL_DMA_IRQ_SOURCE);
54
if (type & PCILIB_DMA_IRQ) val |= DMA_INT_ENABLE;
55
if (type & PCILIB_EVENT_IRQ) val |= DMA_USER_INT_ENABLE;
56
nwl_write_register(val, ctx, ctx->base_addr, REG_DMA_CTRL_STATUS);
58
ctx->irq_enabled = type;
64
int dma_nwl_disable_irq(pcilib_dma_context_t *vctx, pcilib_dma_flags_t flags) {
66
nwl_dma_t *ctx = (nwl_dma_t*)vctx;
70
nwl_read_register(val, ctx, ctx->base_addr, REG_DMA_CTRL_STATUS);
71
if (!ctx->irq_started) dma_nwl_init_irq(ctx, val);
72
val &= ~(DMA_INT_ENABLE|DMA_USER_INT_ENABLE);
73
nwl_write_register(val, ctx, ctx->base_addr, REG_DMA_CTRL_STATUS);
75
if (flags&PCILIB_DMA_FLAG_PERSISTENT) ctx->irq_preserve = 0;
81
int dma_nwl_enable_engine_irq(nwl_dma_t *ctx, pcilib_dma_engine_t dma) {
84
dma_nwl_enable_irq((pcilib_dma_context_t*)ctx, PCILIB_DMA_IRQ, 0);
86
nwl_read_register(val, ctx, ctx->engines[dma].base_addr, REG_DMA_ENG_CTRL_STATUS);
87
val |= (DMA_ENG_INT_ENABLE);
88
nwl_write_register(val, ctx, ctx->engines[dma].base_addr, REG_DMA_ENG_CTRL_STATUS);
93
int dma_nwl_disable_engine_irq(nwl_dma_t *ctx, pcilib_dma_engine_t dma) {
96
nwl_read_register(val, ctx, ctx->engines[dma].base_addr, REG_DMA_ENG_CTRL_STATUS);
97
val &= ~(DMA_ENG_INT_ENABLE);
98
nwl_write_register(val, ctx, ctx->engines[dma].base_addr, REG_DMA_ENG_CTRL_STATUS);
103
int dma_nwl_acknowledge_irq(pcilib_dma_context_t *vctx, pcilib_irq_type_t irq_type, pcilib_irq_source_t irq_source) {
106
nwl_dma_t *ctx = (nwl_dma_t*)vctx;
107
pcilib_nwl_engine_description_t *info = ctx->engines + irq_source;
109
if (irq_type != PCILIB_DMA_IRQ) return PCILIB_ERROR_NOTSUPPORTED;
110
if (irq_source >= ctx->n_engines) return PCILIB_ERROR_NOTAVAILABLE;
112
nwl_read_register(val, ctx, info->base_addr, REG_DMA_ENG_CTRL_STATUS);
113
if (val & DMA_ENG_INT_ACTIVE_MASK) {
114
val |= DMA_ENG_ALLINT_MASK;
115
nwl_write_register(val, ctx, info->base_addr, REG_DMA_ENG_CTRL_STATUS);