1 /*
2  *  intel_mid_dma_regs.h - Intel MID DMA Drivers
3  *
4  *  Copyright (C) 2008-10 Intel Corp
5  *  Author: Vinod Koul <vinod.koul@intel.com>
6  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; version 2 of the License.
11  *
12  *  This program is distributed in the hope that it will be useful, but
13  *  WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License along
18  *  with this program; if not, write to the Free Software Foundation, Inc.,
19  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
20  *
21  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22  *
23  *
24  */
25 #ifndef __INTEL_MID_DMAC_REGS_H__
26 #define __INTEL_MID_DMAC_REGS_H__
27 
28 #include <linux/dmaengine.h>
29 #include <linux/dmapool.h>
30 #include <linux/pci_ids.h>
31 
32 #define INTEL_MID_DMA_DRIVER_VERSION "1.1.0"
33 
34 #define	REG_BIT0		0x00000001
35 #define	REG_BIT8		0x00000100
36 #define INT_MASK_WE		0x8
37 #define CLEAR_DONE		0xFFFFEFFF
38 #define UNMASK_INTR_REG(chan_num) \
39 	((REG_BIT0 << chan_num) | (REG_BIT8 << chan_num))
40 #define MASK_INTR_REG(chan_num) (REG_BIT8 << chan_num)
41 
42 #define ENABLE_CHANNEL(chan_num) \
43 	((REG_BIT0 << chan_num) | (REG_BIT8 << chan_num))
44 
45 #define DISABLE_CHANNEL(chan_num) \
46 	(REG_BIT8 << chan_num)
47 
48 #define DESCS_PER_CHANNEL	16
49 /*DMA Registers*/
50 /*registers associated with channel programming*/
51 #define DMA_REG_SIZE		0x400
52 #define DMA_CH_SIZE		0x58
53 
54 /*CH X REG = (DMA_CH_SIZE)*CH_NO + REG*/
55 #define SAR			0x00 /* Source Address Register*/
56 #define DAR			0x08 /* Destination Address Register*/
57 #define LLP			0x10 /* Linked List Pointer Register*/
58 #define CTL_LOW			0x18 /* Control Register*/
59 #define CTL_HIGH		0x1C /* Control Register*/
60 #define CFG_LOW			0x40 /* Configuration Register Low*/
61 #define CFG_HIGH		0x44 /* Configuration Register high*/
62 
63 #define STATUS_TFR		0x2E8
64 #define STATUS_BLOCK		0x2F0
65 #define STATUS_ERR		0x308
66 
67 #define RAW_TFR			0x2C0
68 #define RAW_BLOCK		0x2C8
69 #define RAW_ERR			0x2E0
70 
71 #define MASK_TFR		0x310
72 #define MASK_BLOCK		0x318
73 #define MASK_SRC_TRAN		0x320
74 #define MASK_DST_TRAN		0x328
75 #define MASK_ERR		0x330
76 
77 #define CLEAR_TFR		0x338
78 #define CLEAR_BLOCK		0x340
79 #define CLEAR_SRC_TRAN		0x348
80 #define CLEAR_DST_TRAN		0x350
81 #define CLEAR_ERR		0x358
82 
83 #define INTR_STATUS		0x360
84 #define DMA_CFG			0x398
85 #define DMA_CHAN_EN		0x3A0
86 
87 /*DMA channel control registers*/
88 union intel_mid_dma_ctl_lo {
89 	struct {
90 		u32	int_en:1;	/*enable or disable interrupts*/
91 					/*should be 0*/
92 		u32	dst_tr_width:3;	/*destination transfer width*/
93 					/*usually 32 bits = 010*/
94 		u32	src_tr_width:3; /*source transfer width*/
95 					/*usually 32 bits = 010*/
96 		u32	dinc:2;		/*destination address inc/dec*/
97 					/*For mem:INC=00, Periphral NoINC=11*/
98 		u32	sinc:2;		/*source address inc or dec, as above*/
99 		u32	dst_msize:3;	/*destination burst transaction length*/
100 					/*always = 16 ie 011*/
101 		u32	src_msize:3;	/*source burst transaction length*/
102 					/*always = 16 ie 011*/
103 		u32	reser1:3;
104 		u32	tt_fc:3;	/*transfer type and flow controller*/
105 					/*M-M = 000
106 					  P-M = 010
107 					  M-P = 001*/
108 		u32	dms:2;		/*destination master select = 0*/
109 		u32	sms:2;		/*source master select = 0*/
110 		u32	llp_dst_en:1;	/*enable/disable destination LLP = 0*/
111 		u32	llp_src_en:1;	/*enable/disable source LLP = 0*/
112 		u32	reser2:3;
113 	} ctlx;
114 	u32	ctl_lo;
115 };
116 
117 union intel_mid_dma_ctl_hi {
118 	struct {
119 		u32	block_ts:12;	/*block transfer size*/
120 		u32	done:1;		/*Done - updated by DMAC*/
121 		u32	reser:19;	/*configured by DMAC*/
122 	} ctlx;
123 	u32	ctl_hi;
124 
125 };
126 
127 /*DMA channel configuration registers*/
128 union intel_mid_dma_cfg_lo {
129 	struct {
130 		u32	reser1:5;
131 		u32	ch_prior:3;	/*channel priority = 0*/
132 		u32	ch_susp:1;	/*channel suspend = 0*/
133 		u32	fifo_empty:1;	/*FIFO empty or not R bit = 0*/
134 		u32	hs_sel_dst:1;	/*select HW/SW destn handshaking*/
135 					/*HW = 0, SW = 1*/
136 		u32	hs_sel_src:1;	/*select HW/SW src handshaking*/
137 		u32	reser2:6;
138 		u32	dst_hs_pol:1;	/*dest HS interface polarity*/
139 		u32	src_hs_pol:1;	/*src HS interface polarity*/
140 		u32	max_abrst:10;	/*max AMBA burst len = 0 (no sw limit*/
141 		u32	reload_src:1;	/*auto reload src addr =1 if src is P*/
142 		u32	reload_dst:1;	/*AR destn addr =1 if dstn is P*/
143 	} cfgx;
144 	u32	cfg_lo;
145 };
146 
147 union intel_mid_dma_cfg_hi {
148 	struct {
149 		u32	fcmode:1;	/*flow control mode = 1*/
150 		u32	fifo_mode:1;	/*FIFO mode select = 1*/
151 		u32	protctl:3;	/*protection control = 0*/
152 		u32	rsvd:2;
153 		u32	src_per:4;	/*src hw HS interface*/
154 		u32	dst_per:4;	/*dstn hw HS interface*/
155 		u32	reser2:17;
156 	} cfgx;
157 	u32	cfg_hi;
158 };
159 
160 
161 /**
162  * struct intel_mid_dma_chan - internal mid representation of a DMA channel
163  * @chan: dma_chan strcture represetation for mid chan
164  * @ch_regs: MMIO register space pointer to channel register
165  * @dma_base: MMIO register space DMA engine base pointer
166  * @ch_id: DMA channel id
167  * @lock: channel spinlock
168  * @completed: DMA cookie
169  * @active_list: current active descriptors
170  * @queue: current queued up descriptors
171  * @free_list: current free descriptors
172  * @slave: dma slave struture
173  * @descs_allocated: total number of decsiptors allocated
174  * @dma: dma device struture pointer
175  * @busy: bool representing if ch is busy (active txn) or not
176  * @in_use: bool representing if ch is in use or not
177  * @raw_tfr: raw trf interrupt received
178  * @raw_block: raw block interrupt received
179  */
180 struct intel_mid_dma_chan {
181 	struct dma_chan		chan;
182 	void __iomem		*ch_regs;
183 	void __iomem		*dma_base;
184 	int			ch_id;
185 	spinlock_t		lock;
186 	dma_cookie_t		completed;
187 	struct list_head	active_list;
188 	struct list_head	queue;
189 	struct list_head	free_list;
190 	unsigned int		descs_allocated;
191 	struct middma_device	*dma;
192 	bool			busy;
193 	bool			in_use;
194 	u32			raw_tfr;
195 	u32			raw_block;
196 	struct intel_mid_dma_slave *mid_slave;
197 };
198 
to_intel_mid_dma_chan(struct dma_chan * chan)199 static inline struct intel_mid_dma_chan *to_intel_mid_dma_chan(
200 						struct dma_chan *chan)
201 {
202 	return container_of(chan, struct intel_mid_dma_chan, chan);
203 }
204 
205 enum intel_mid_dma_state {
206 	RUNNING = 0,
207 	SUSPENDED,
208 };
209 /**
210  * struct middma_device - internal representation of a DMA device
211  * @pdev: PCI device
212  * @dma_base: MMIO register space pointer of DMA
213  * @dma_pool: for allocating DMA descriptors
214  * @common: embedded struct dma_device
215  * @tasklet: dma tasklet for processing interrupts
216  * @ch: per channel data
217  * @pci_id: DMA device PCI ID
218  * @intr_mask: Interrupt mask to be used
219  * @mask_reg: MMIO register for periphral mask
220  * @chan_base: Base ch index (read from driver data)
221  * @max_chan: max number of chs supported (from drv_data)
222  * @block_size: Block size of DMA transfer supported (from drv_data)
223  * @pimr_mask: MMIO register addr for periphral interrupt (from drv_data)
224  * @state: dma PM device state
225  */
226 struct middma_device {
227 	struct pci_dev		*pdev;
228 	void __iomem		*dma_base;
229 	struct pci_pool		*dma_pool;
230 	struct dma_device	common;
231 	struct tasklet_struct   tasklet;
232 	struct intel_mid_dma_chan ch[MAX_CHAN];
233 	unsigned int		pci_id;
234 	unsigned int		intr_mask;
235 	void __iomem		*mask_reg;
236 	int			chan_base;
237 	int			max_chan;
238 	int			block_size;
239 	unsigned int		pimr_mask;
240 	enum intel_mid_dma_state state;
241 };
242 
to_middma_device(struct dma_device * common)243 static inline struct middma_device *to_middma_device(struct dma_device *common)
244 {
245 	return container_of(common, struct middma_device, common);
246 }
247 
248 struct intel_mid_dma_desc {
249 	void __iomem			*block; /*ch ptr*/
250 	struct list_head		desc_node;
251 	struct dma_async_tx_descriptor	txd;
252 	size_t				len;
253 	dma_addr_t			sar;
254 	dma_addr_t			dar;
255 	u32				cfg_hi;
256 	u32				cfg_lo;
257 	u32				ctl_lo;
258 	u32				ctl_hi;
259 	struct pci_pool			*lli_pool;
260 	struct intel_mid_dma_lli	*lli;
261 	dma_addr_t			lli_phys;
262 	unsigned int			lli_length;
263 	unsigned int			current_lli;
264 	dma_addr_t			next;
265 	enum dma_transfer_direction		dirn;
266 	enum dma_status			status;
267 	enum dma_slave_buswidth		width; /*width of DMA txn*/
268 	enum intel_mid_dma_mode		cfg_mode; /*mode configuration*/
269 
270 };
271 
272 struct intel_mid_dma_lli {
273 	dma_addr_t			sar;
274 	dma_addr_t			dar;
275 	dma_addr_t			llp;
276 	u32				ctl_lo;
277 	u32				ctl_hi;
278 } __attribute__ ((packed));
279 
test_ch_en(void __iomem * dma,u32 ch_no)280 static inline int test_ch_en(void __iomem *dma, u32 ch_no)
281 {
282 	u32 en_reg = ioread32(dma + DMA_CHAN_EN);
283 	return (en_reg >> ch_no) & 0x1;
284 }
285 
to_intel_mid_dma_desc(struct dma_async_tx_descriptor * txd)286 static inline struct intel_mid_dma_desc *to_intel_mid_dma_desc
287 		(struct dma_async_tx_descriptor *txd)
288 {
289 	return container_of(txd, struct intel_mid_dma_desc, txd);
290 }
291 
to_intel_mid_dma_slave(struct dma_slave_config * slave)292 static inline struct intel_mid_dma_slave *to_intel_mid_dma_slave
293 		(struct dma_slave_config *slave)
294 {
295 	return container_of(slave, struct intel_mid_dma_slave, dma_slave);
296 }
297 
298 
299 int dma_resume(struct device *dev);
300 
301 #endif /*__INTEL_MID_DMAC_REGS_H__*/
302