Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-pnx4008/include/mach/dma.h
10820 views
1
/*
2
* arch/arm/mach-pnx4008/include/mach/dma.h
3
*
4
* PNX4008 DMA header file
5
*
6
* Author: Vitaly Wool
7
* Copyright: MontaVista Software Inc. (c) 2005
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License version 2 as
11
* published by the Free Software Foundation.
12
*/
13
14
#ifndef __ASM_ARCH_DMA_H
15
#define __ASM_ARCH_DMA_H
16
17
#include "platform.h"
18
19
#define MAX_DMA_CHANNELS 8
20
21
#define DMAC_BASE IO_ADDRESS(PNX4008_DMA_CONFIG_BASE)
22
#define DMAC_INT_STAT (DMAC_BASE + 0x0000)
23
#define DMAC_INT_TC_STAT (DMAC_BASE + 0x0004)
24
#define DMAC_INT_TC_CLEAR (DMAC_BASE + 0x0008)
25
#define DMAC_INT_ERR_STAT (DMAC_BASE + 0x000c)
26
#define DMAC_INT_ERR_CLEAR (DMAC_BASE + 0x0010)
27
#define DMAC_SOFT_SREQ (DMAC_BASE + 0x0024)
28
#define DMAC_CONFIG (DMAC_BASE + 0x0030)
29
#define DMAC_Cx_SRC_ADDR(c) (DMAC_BASE + 0x0100 + (c) * 0x20)
30
#define DMAC_Cx_DEST_ADDR(c) (DMAC_BASE + 0x0104 + (c) * 0x20)
31
#define DMAC_Cx_LLI(c) (DMAC_BASE + 0x0108 + (c) * 0x20)
32
#define DMAC_Cx_CONTROL(c) (DMAC_BASE + 0x010c + (c) * 0x20)
33
#define DMAC_Cx_CONFIG(c) (DMAC_BASE + 0x0110 + (c) * 0x20)
34
35
enum {
36
WIDTH_BYTE = 0,
37
WIDTH_HWORD,
38
WIDTH_WORD
39
};
40
41
enum {
42
FC_MEM2MEM_DMA,
43
FC_MEM2PER_DMA,
44
FC_PER2MEM_DMA,
45
FC_PER2PER_DMA,
46
FC_PER2PER_DPER,
47
FC_MEM2PER_PER,
48
FC_PER2MEM_PER,
49
FC_PER2PER_SPER
50
};
51
52
enum {
53
DMA_INT_UNKNOWN = 0,
54
DMA_ERR_INT = 1,
55
DMA_TC_INT = 2,
56
};
57
58
enum {
59
DMA_BUFFER_ALLOCATED = 1,
60
DMA_HAS_LL = 2,
61
};
62
63
enum {
64
PER_CAM_DMA_1 = 0,
65
PER_NDF_FLASH = 1,
66
PER_MBX_SLAVE_FIFO = 2,
67
PER_SPI2_REC_XMIT = 3,
68
PER_MS_SD_RX_XMIT = 4,
69
PER_HS_UART_1_XMIT = 5,
70
PER_HS_UART_1_RX = 6,
71
PER_HS_UART_2_XMIT = 7,
72
PER_HS_UART_2_RX = 8,
73
PER_HS_UART_7_XMIT = 9,
74
PER_HS_UART_7_RX = 10,
75
PER_SPI1_REC_XMIT = 11,
76
PER_MLC_NDF_SREC = 12,
77
PER_CAM_DMA_2 = 13,
78
PER_PRNG_INFIFO = 14,
79
PER_PRNG_OUTFIFO = 15,
80
};
81
82
struct pnx4008_dma_ch_ctrl {
83
int tc_mask;
84
int cacheable;
85
int bufferable;
86
int priv_mode;
87
int di;
88
int si;
89
int dest_ahb1;
90
int src_ahb1;
91
int dwidth;
92
int swidth;
93
int dbsize;
94
int sbsize;
95
int tr_size;
96
};
97
98
struct pnx4008_dma_ch_config {
99
int halt;
100
int active;
101
int lock;
102
int itc;
103
int ie;
104
int flow_cntrl;
105
int dest_per;
106
int src_per;
107
};
108
109
struct pnx4008_dma_ll {
110
unsigned long src_addr;
111
unsigned long dest_addr;
112
u32 next_dma;
113
unsigned long ch_ctrl;
114
struct pnx4008_dma_ll *next;
115
int flags;
116
void *alloc_data;
117
int (*free) (void *);
118
};
119
120
struct pnx4008_dma_config {
121
int is_ll;
122
unsigned long src_addr;
123
unsigned long dest_addr;
124
unsigned long ch_ctrl;
125
unsigned long ch_cfg;
126
struct pnx4008_dma_ll *ll;
127
u32 ll_dma;
128
int flags;
129
void *alloc_data;
130
int (*free) (void *);
131
};
132
133
extern struct pnx4008_dma_ll *pnx4008_alloc_ll_entry(dma_addr_t *);
134
extern void pnx4008_free_ll_entry(struct pnx4008_dma_ll *, dma_addr_t);
135
extern void pnx4008_free_ll(u32 ll_dma, struct pnx4008_dma_ll *);
136
137
extern int pnx4008_request_channel(char *, int,
138
void (*)(int, int, void *),
139
void *);
140
extern void pnx4008_free_channel(int);
141
extern int pnx4008_config_dma(int, int, int);
142
extern int pnx4008_dma_pack_control(const struct pnx4008_dma_ch_ctrl *,
143
unsigned long *);
144
extern int pnx4008_dma_parse_control(unsigned long,
145
struct pnx4008_dma_ch_ctrl *);
146
extern int pnx4008_dma_pack_config(const struct pnx4008_dma_ch_config *,
147
unsigned long *);
148
extern int pnx4008_dma_parse_config(unsigned long,
149
struct pnx4008_dma_ch_config *);
150
extern int pnx4008_config_channel(int, struct pnx4008_dma_config *);
151
extern int pnx4008_channel_get_config(int, struct pnx4008_dma_config *);
152
extern int pnx4008_dma_ch_enable(int);
153
extern int pnx4008_dma_ch_disable(int);
154
extern int pnx4008_dma_ch_enabled(int);
155
extern void pnx4008_dma_split_head_entry(struct pnx4008_dma_config *,
156
struct pnx4008_dma_ch_ctrl *);
157
extern void pnx4008_dma_split_ll_entry(struct pnx4008_dma_ll *,
158
struct pnx4008_dma_ch_ctrl *);
159
160
#endif /* _ASM_ARCH_DMA_H */
161
162