Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mbcs.h
Go to the documentation of this file.
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License. See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (c) 2005 Silicon Graphics, Inc. All rights reserved.
7  */
8 
9 #ifndef __MBCS_H__
10 #define __MBCS_H__
11 
12 /*
13  * General macros
14  */
15 #define MB (1024*1024)
16 #define MB2 (2*MB)
17 #define MB4 (4*MB)
18 #define MB6 (6*MB)
19 
20 /*
21  * Offsets and masks
22  */
23 #define MBCS_CM_ID 0x0000 /* Identification */
24 #define MBCS_CM_STATUS 0x0008 /* Status */
25 #define MBCS_CM_ERROR_DETAIL1 0x0010 /* Error Detail1 */
26 #define MBCS_CM_ERROR_DETAIL2 0x0018 /* Error Detail2 */
27 #define MBCS_CM_CONTROL 0x0020 /* Control */
28 #define MBCS_CM_REQ_TOUT 0x0028 /* Request Time-out */
29 #define MBCS_CM_ERR_INT_DEST 0x0038 /* Error Interrupt Destination */
30 #define MBCS_CM_TARG_FL 0x0050 /* Target Flush */
31 #define MBCS_CM_ERR_STAT 0x0060 /* Error Status */
32 #define MBCS_CM_CLR_ERR_STAT 0x0068 /* Clear Error Status */
33 #define MBCS_CM_ERR_INT_EN 0x0070 /* Error Interrupt Enable */
34 #define MBCS_RD_DMA_SYS_ADDR 0x0100 /* Read DMA System Address */
35 #define MBCS_RD_DMA_LOC_ADDR 0x0108 /* Read DMA Local Address */
36 #define MBCS_RD_DMA_CTRL 0x0110 /* Read DMA Control */
37 #define MBCS_RD_DMA_AMO_DEST 0x0118 /* Read DMA AMO Destination */
38 #define MBCS_RD_DMA_INT_DEST 0x0120 /* Read DMA Interrupt Destination */
39 #define MBCS_RD_DMA_AUX_STAT 0x0130 /* Read DMA Auxiliary Status */
40 #define MBCS_WR_DMA_SYS_ADDR 0x0200 /* Write DMA System Address */
41 #define MBCS_WR_DMA_LOC_ADDR 0x0208 /* Write DMA Local Address */
42 #define MBCS_WR_DMA_CTRL 0x0210 /* Write DMA Control */
43 #define MBCS_WR_DMA_AMO_DEST 0x0218 /* Write DMA AMO Destination */
44 #define MBCS_WR_DMA_INT_DEST 0x0220 /* Write DMA Interrupt Destination */
45 #define MBCS_WR_DMA_AUX_STAT 0x0230 /* Write DMA Auxiliary Status */
46 #define MBCS_ALG_AMO_DEST 0x0300 /* Algorithm AMO Destination */
47 #define MBCS_ALG_INT_DEST 0x0308 /* Algorithm Interrupt Destination */
48 #define MBCS_ALG_OFFSETS 0x0310
49 #define MBCS_ALG_STEP 0x0318 /* Algorithm Step */
50 
51 #define MBCS_GSCR_START 0x0000000
52 #define MBCS_DEBUG_START 0x0100000
53 #define MBCS_RAM0_START 0x0200000
54 #define MBCS_RAM1_START 0x0400000
55 #define MBCS_RAM2_START 0x0600000
56 
57 #define MBCS_CM_CONTROL_REQ_TOUT_MASK 0x0000000000ffffffUL
58 //#define PIO_BASE_ADDR_BASE_OFFSET_MASK 0x00fffffffff00000UL
59 
60 #define MBCS_SRAM_SIZE (1024*1024)
61 #define MBCS_CACHELINE_SIZE 128
62 
63 /*
64  * MMR get's and put's
65  */
66 #define MBCS_MMR_ADDR(mmr_base, offset)((uint64_t *)(mmr_base + offset))
67 #define MBCS_MMR_SET(mmr_base, offset, value) { \
68  uint64_t *mbcs_mmr_set_u64p, readback; \
69  mbcs_mmr_set_u64p = (uint64_t *)(mmr_base + offset); \
70  *mbcs_mmr_set_u64p = value; \
71  readback = *mbcs_mmr_set_u64p; \
72 }
73 #define MBCS_MMR_GET(mmr_base, offset) *(uint64_t *)(mmr_base + offset)
74 #define MBCS_MMR_ZERO(mmr_base, offset) MBCS_MMR_SET(mmr_base, offset, 0)
75 
76 /*
77  * MBCS mmr structures
78  */
79 union cm_id {
81  struct {
83  mfg_id:11, // 11:1
84  part_num:16, // 27:12
85  bitstream_rev:8, // 35:28
86  :28; // 63:36
87  };
88 };
89 
90 union cm_status {
92  struct {
94  pending_writes:8, // 15:8
95  ice_rsp_credits:8, // 23:16
96  ice_req_credits:8, // 31:24
97  cm_req_credits:8, // 39:32
98  :1, // 40
99  rd_dma_in_progress:1, // 41
100  rd_dma_done:1, // 42
101  :1, // 43
102  wr_dma_in_progress:1, // 44
103  wr_dma_done:1, // 45
104  alg_waiting:1, // 46
105  alg_pipe_running:1, // 47
106  alg_done:1, // 48
107  :3, // 51:49
108  pending_int_reqs:8, // 59:52
109  :3, // 62:60
110  alg_half_speed_sel:1; // 63
111  };
112 };
113 
116  struct {
118  source_id:2, // 5:4
119  data_size:2, // 7:6
120  tnum:8, // 15:8
121  byte_enable:8, // 23:16
122  gfx_cred:8, // 31:24
123  read_type:2, // 33:32
124  pio_or_memory:1, // 34
125  head_cw_error:1, // 35
126  :12, // 47:36
127  head_error_bit:1, // 48
128  data_error_bit:1, // 49
129  :13, // 62:50
130  valid:1; // 63
131  };
132 };
133 
136  struct {
137  uint64_t address:56, // 55:0
138  :8; // 63:56
139  };
140 };
141 
142 union cm_control {
144  struct {
145  uint64_t cm_id:2, // 1:0
146  :2, // 3:2
147  max_trans:5, // 8:4
148  :3, // 11:9
149  address_mode:1, // 12
150  :7, // 19:13
151  credit_limit:8, // 27:20
152  :5, // 32:28
153  rearm_stat_regs:1, // 33
154  prescalar_byp:1, // 34
155  force_gap_war:1, // 35
156  rd_dma_go:1, // 36
157  wr_dma_go:1, // 37
158  alg_go:1, // 38
159  rd_dma_clr:1, // 39
160  wr_dma_clr:1, // 40
161  alg_clr:1, // 41
162  :2, // 43:42
163  alg_wait_step:1, // 44
164  alg_done_amo_en:1, // 45
165  alg_done_int_en:1, // 46
166  :1, // 47
167  alg_sram0_locked:1, // 48
168  alg_sram1_locked:1, // 49
169  alg_sram2_locked:1, // 50
170  alg_done_clr:1, // 51
171  :12; // 63:52
172  };
173 };
174 
177  struct {
178  uint64_t time_out:24, // 23:0
179  :40; // 63:24
180  };
181 };
182 
183 union intr_dest {
185  struct {
186  uint64_t address:56, // 55:0
187  int_vector:8; // 63:56
188  };
189 };
190 
193  struct {
195  ecc_mbe:1, // 1
196  unsupported_req:1, // 2
197  unexpected_rsp:1, // 3
198  bad_length:1, // 4
199  bad_datavalid:1, // 5
200  buffer_overflow:1, // 6
201  request_timeout:1, // 7
202  :8, // 15:8
203  head_inv_data_size:1, // 16
204  rsp_pactype_inv:1, // 17
205  head_sb_err:1, // 18
206  missing_head:1, // 19
207  head_inv_rd_type:1, // 20
208  head_cmd_err_bit:1, // 21
209  req_addr_align_inv:1, // 22
210  pio_req_addr_inv:1, // 23
211  req_range_dsize_inv:1, // 24
212  early_term:1, // 25
213  early_tail:1, // 26
214  missing_tail:1, // 27
215  data_flit_sb_err:1, // 28
216  cm2hcm_req_cred_of:1, // 29
217  cm2hcm_rsp_cred_of:1, // 30
218  rx_bad_didn:1, // 31
219  rd_dma_err_rsp:1, // 32
220  rd_dma_tnum_tout:1, // 33
221  rd_dma_multi_tnum_tou:1, // 34
222  wr_dma_err_rsp:1, // 35
223  wr_dma_tnum_tout:1, // 36
224  wr_dma_multi_tnum_tou:1, // 37
225  alg_data_overflow:1, // 38
226  alg_data_underflow:1, // 39
227  ram0_access_conflict:1, // 40
228  ram1_access_conflict:1, // 41
229  ram2_access_conflict:1, // 42
230  ram0_perr:1, // 43
231  ram1_perr:1, // 44
232  ram2_perr:1, // 45
233  int_gen_rsp_err:1, // 46
234  int_gen_tnum_tout:1, // 47
235  rd_dma_prog_err:1, // 48
236  wr_dma_prog_err:1, // 49
237  :14; // 63:50
238  };
239 };
240 
243  struct {
245  clr_ecc_mbe:1, // 1
246  clr_unsupported_req:1, // 2
247  clr_unexpected_rsp:1, // 3
248  clr_bad_length:1, // 4
249  clr_bad_datavalid:1, // 5
250  clr_buffer_overflow:1, // 6
251  clr_request_timeout:1, // 7
252  :8, // 15:8
253  clr_head_inv_data_siz:1, // 16
254  clr_rsp_pactype_inv:1, // 17
255  clr_head_sb_err:1, // 18
256  clr_missing_head:1, // 19
257  clr_head_inv_rd_type:1, // 20
258  clr_head_cmd_err_bit:1, // 21
259  clr_req_addr_align_in:1, // 22
260  clr_pio_req_addr_inv:1, // 23
261  clr_req_range_dsize_i:1, // 24
262  clr_early_term:1, // 25
263  clr_early_tail:1, // 26
264  clr_missing_tail:1, // 27
265  clr_data_flit_sb_err:1, // 28
266  clr_cm2hcm_req_cred_o:1, // 29
267  clr_cm2hcm_rsp_cred_o:1, // 30
268  clr_rx_bad_didn:1, // 31
269  clr_rd_dma_err_rsp:1, // 32
270  clr_rd_dma_tnum_tout:1, // 33
271  clr_rd_dma_multi_tnum:1, // 34
272  clr_wr_dma_err_rsp:1, // 35
273  clr_wr_dma_tnum_tout:1, // 36
274  clr_wr_dma_multi_tnum:1, // 37
275  clr_alg_data_overflow:1, // 38
276  clr_alg_data_underflo:1, // 39
277  clr_ram0_access_confl:1, // 40
278  clr_ram1_access_confl:1, // 41
279  clr_ram2_access_confl:1, // 42
280  clr_ram0_perr:1, // 43
281  clr_ram1_perr:1, // 44
282  clr_ram2_perr:1, // 45
283  clr_int_gen_rsp_err:1, // 46
284  clr_int_gen_tnum_tout:1, // 47
285  clr_rd_dma_prog_err:1, // 48
286  clr_wr_dma_prog_err:1, // 49
287  :14; // 63:50
288  };
289 };
290 
293  struct {
295  int_en_ecc_mbe:1, // 1
296  int_en_unsupported_re:1, // 2
297  int_en_unexpected_rsp:1, // 3
298  int_en_bad_length:1, // 4
299  int_en_bad_datavalid:1, // 5
300  int_en_buffer_overflo:1, // 6
301  int_en_request_timeou:1, // 7
302  :8, // 15:8
303  int_en_head_inv_data_:1, // 16
304  int_en_rsp_pactype_in:1, // 17
305  int_en_head_sb_err:1, // 18
306  int_en_missing_head:1, // 19
307  int_en_head_inv_rd_ty:1, // 20
308  int_en_head_cmd_err_b:1, // 21
309  int_en_req_addr_align:1, // 22
310  int_en_pio_req_addr_i:1, // 23
311  int_en_req_range_dsiz:1, // 24
312  int_en_early_term:1, // 25
313  int_en_early_tail:1, // 26
314  int_en_missing_tail:1, // 27
315  int_en_data_flit_sb_e:1, // 28
316  int_en_cm2hcm_req_cre:1, // 29
317  int_en_cm2hcm_rsp_cre:1, // 30
318  int_en_rx_bad_didn:1, // 31
319  int_en_rd_dma_err_rsp:1, // 32
320  int_en_rd_dma_tnum_to:1, // 33
321  int_en_rd_dma_multi_t:1, // 34
322  int_en_wr_dma_err_rsp:1, // 35
323  int_en_wr_dma_tnum_to:1, // 36
324  int_en_wr_dma_multi_t:1, // 37
325  int_en_alg_data_overf:1, // 38
326  int_en_alg_data_under:1, // 39
327  int_en_ram0_access_co:1, // 40
328  int_en_ram1_access_co:1, // 41
329  int_en_ram2_access_co:1, // 42
330  int_en_ram0_perr:1, // 43
331  int_en_ram1_perr:1, // 44
332  int_en_ram2_perr:1, // 45
333  int_en_int_gen_rsp_er:1, // 46
334  int_en_int_gen_tnum_t:1, // 47
335  int_en_rd_dma_prog_er:1, // 48
336  int_en_wr_dma_prog_er:1, // 49
337  :14; // 63:50
338  };
339 };
340 
341 struct cm_mmr {
342  union cm_id id;
356 };
357 
360  struct {
361  uint64_t dma_sys_addr:56, // 55:0
362  :8; // 63:56
363  };
364 };
365 
368  struct {
369  uint64_t dma_ram_addr:21, // 20:0
370  dma_ram_sel:2, // 22:21
371  :41; // 63:23
372  };
373 };
374 
375 union dma_control {
377  struct {
379  :18, // 33:16
380  done_amo_en:1, // 34
381  done_int_en:1, // 35
382  :1, // 36
383  pio_mem_n:1, // 37
384  :26; // 63:38
385  };
386 };
387 
390  struct {
392  dma_amo_mod_type:3, // 58:56
393  :5; // 63:59
394  };
395 };
396 
399  struct {
401  :5, // 21:17
402  lrsp_buff_empty:1, // 22
403  :17, // 39:23
404  pending_reqs_left:6, // 45:40
405  :18; // 63:46
406  };
407 };
408 
409 struct rdma_mmr {
416 };
417 
420  struct {
422  :4, // 20:17
423  lreq_buff_empty:1, // 21
424  :18, // 39:22
425  pending_reqs_left:6, // 45:40
426  :18; // 63:46
427  };
428 };
429 
430 struct wdma_mmr {
437 };
438 
439 union algo_step {
441  struct {
442  uint64_t alg_step_cnt:16, // 15:0
443  :48; // 63:16
444  };
445 };
446 
447 struct algo_mmr {
450  union {
452  struct {
454  reserved0:1, // 7
455  sram1_offset:7, // 14:8
456  reserved1:1, // 15
457  sram2_offset:7, // 22:16
458  reserved2:14; // 63:23
459  };
460  } sram_offset;
462 };
463 
464 struct mbcs_mmr {
465  struct cm_mmr cm;
467  struct rdma_mmr rdDma;
469  struct wdma_mmr wrDma;
471  struct algo_mmr algo;
473 };
474 
475 /*
476  * defines
477  */
478 #define DEVICE_NAME "mbcs"
479 #define MBCS_PART_NUM 0xfff0
480 #define MBCS_PART_NUM_ALG0 0xf001
481 #define MBCS_MFG_NUM 0x1
482 
483 struct algoblock {
489 };
490 
491 struct getdma {
502 };
503 
504 struct putdma {
515 };
516 
517 struct mbcs_soft {
518  struct list_head list;
519  struct cx_dev *cxdev;
520  int major;
521  int nasid;
522  void *mmr_base;
529  struct getdma getdma;
530  struct putdma putdma;
531  struct algoblock algo;
532  uint64_t gscr_addr; // pio addr
533  uint64_t ram0_addr; // pio addr
534  uint64_t ram1_addr; // pio addr
535  uint64_t ram2_addr; // pio addr
536  uint64_t debug_addr; // pio addr
542  struct mutex algolock;
543 };
544 
545 static int mbcs_open(struct inode *ip, struct file *fp);
546 static ssize_t mbcs_sram_read(struct file *fp, char __user *buf, size_t len,
547  loff_t * off);
548 static ssize_t mbcs_sram_write(struct file *fp, const char __user *buf, size_t len,
549  loff_t * off);
550 static loff_t mbcs_sram_llseek(struct file *filp, loff_t off, int whence);
551 static int mbcs_gscr_mmap(struct file *fp, struct vm_area_struct *vma);
552 
553 #endif // __MBCS_H__