| /* |
| * Copyright (c) 2017 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef _DMA_CAVS_H_ |
| #define _DMA_CAVS_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define DW_CTLL_INT_EN (1 << 0) |
| #define DW_CTLL_DST_WIDTH(x) (x << 1) |
| #define DW_CTLL_SRC_WIDTH(x) (x << 4) |
| #define DW_CTLL_DST_INC (0 << 8) |
| #define DW_CTLL_DST_FIX (1 << 8) |
| #define DW_CTLL_SRC_INC (0 << 10) |
| #define DW_CTLL_SRC_FIX (1 << 10) |
| #define DW_CTLL_DST_MSIZE(x) (x << 11) |
| #define DW_CTLL_SRC_MSIZE(x) (x << 14) |
| #define DW_CTLL_FC(x) (x << 20) |
| #define DW_CTLL_FC_M2M (0 << 20) |
| #define DW_CTLL_FC_M2P (1 << 20) |
| #define DW_CTLL_FC_P2M (2 << 20) |
| #define DW_CTLL_FC_P2P (3 << 20) |
| #define DW_CTLL_LLP_D_EN (1 << 27) |
| #define DW_CTLL_LLP_S_EN (1 << 28) |
| |
| /* DMA descriptor used by HW version 2 */ |
| struct dw_lli2 { |
| u32_t sar; |
| u32_t dar; |
| u32_t llp; |
| u32_t ctrl_lo; |
| u32_t ctrl_hi; |
| u32_t sstat; |
| u32_t dstat; |
| } __packed; |
| |
| /* data for each DMA channel */ |
| struct dma_chan_data { |
| u32_t direction; |
| struct dw_lli2 *lli; |
| u32_t cfg_lo; |
| u32_t cfg_hi; |
| void (*dma_blkcallback)(struct device *dev, u32_t channel, |
| int error_code); |
| void (*dma_tfrcallback)(struct device *dev, u32_t channel, |
| int error_code); |
| }; |
| |
| #define DW_MAX_CHAN 8 |
| #define DW_CH_SIZE 0x58 |
| #define BYT_CHAN_OFFSET(chan) (DW_CH_SIZE * chan) |
| |
| #define DW_SAR(chan) \ |
| (0x0000 + BYT_CHAN_OFFSET(chan)) |
| #define DW_DAR(chan) \ |
| (0x0008 + BYT_CHAN_OFFSET(chan)) |
| #define DW_LLP(chan) \ |
| (0x0010 + BYT_CHAN_OFFSET(chan)) |
| #define DW_CTRL_LOW(chan) \ |
| (0x0018 + BYT_CHAN_OFFSET(chan)) |
| #define DW_CTRL_HIGH(chan) \ |
| (0x001C + BYT_CHAN_OFFSET(chan)) |
| #define DW_CFG_LOW(chan) \ |
| (0x0040 + BYT_CHAN_OFFSET(chan)) |
| #define DW_CFG_HIGH(chan) \ |
| (0x0044 + BYT_CHAN_OFFSET(chan)) |
| |
| /* registers */ |
| #define DW_RAW_TFR 0x02C0 |
| #define DW_RAW_BLOCK 0x02C8 |
| #define DW_RAW_SRC_TRAN 0x02D0 |
| #define DW_RAW_DST_TRAN 0x02D8 |
| #define DW_RAW_ERR 0x02E0 |
| #define DW_STATUS_TFR 0x02E8 |
| #define DW_STATUS_BLOCK 0x02F0 |
| #define DW_STATUS_SRC_TRAN 0x02F8 |
| #define DW_STATUS_DST_TRAN 0x0300 |
| #define DW_STATUS_ERR 0x0308 |
| #define DW_MASK_TFR 0x0310 |
| #define DW_MASK_BLOCK 0x0318 |
| #define DW_MASK_SRC_TRAN 0x0320 |
| #define DW_MASK_DST_TRAN 0x0328 |
| #define DW_MASK_ERR 0x0330 |
| #define DW_CLEAR_TFR 0x0338 |
| #define DW_CLEAR_BLOCK 0x0340 |
| #define DW_CLEAR_SRC_TRAN 0x0348 |
| #define DW_CLEAR_DST_TRAN 0x0350 |
| #define DW_CLEAR_ERR 0x0358 |
| #define DW_INTR_STATUS 0x0360 |
| #define DW_DMA_CFG 0x0398 |
| #define DW_DMA_CHAN_EN 0x03A0 |
| |
| /* channel bits */ |
| #define INT_MASK(chan) (0x100 << chan) |
| #define INT_UNMASK(chan) (0x101 << chan) |
| #define INT_MASK_ALL 0xFF00 |
| #define INT_UNMASK_ALL 0xFFFF |
| #define CHAN_ENABLE(chan) (0x101 << chan) |
| #define CHAN_DISABLE(chan) (0x100 << chan) |
| |
| /* TODO: add FIFO sizes */ |
| struct chan_arbit_data { |
| u16_t class; |
| u16_t weight; |
| }; |
| |
| struct dw_drv_plat_data { |
| struct chan_arbit_data chan[DW_MAX_CHAN]; |
| }; |
| |
| /* Device run time data */ |
| struct dw_dma_dev_data { |
| struct dw_drv_plat_data *channel_data; |
| struct dma_chan_data chan[DW_MAX_CHAN]; |
| }; |
| |
| /* Device constant configuration parameters */ |
| struct dw_dma_dev_cfg { |
| u32_t base; |
| void (*irq_config)(void); |
| u32_t irq_id; |
| }; |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _DMA_CAVS_H_ */ |