summaryrefslogtreecommitdiff
path: root/arch/mips/mach-octeon/include/mach/cvmx-mio-emm-defs.h
blob: 3572a5965ee94119af7be5f366eacb02cef84eeb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2020 Marvell International Ltd.
 */

#ifndef __CVMX_MIO_EMM_DEFS_H__
#define __CVMX_MIO_EMM_DEFS_H__

static inline u64 MIO_EMM_DMA_FIFO_CFG(void)
{
	return 0x160;
}

static inline u64 MIO_EMM_DMA_FIFO_ADR(void)
{
	return 0x170;
}

static inline u64 MIO_EMM_DMA_FIFO_CMD(void)
{
	return 0x178;
}

static inline u64 MIO_EMM_DMA_CFG(void)
{
	return 0x180;
}

static inline u64 MIO_EMM_DMA_ADR(void)
{
	return 0x188;
}

static inline u64 MIO_EMM_DMA_INT(void)
{
	return 0x190;
}

static inline u64 MIO_EMM_CFG(void)
{
	return 0x2000;
}

static inline u64 MIO_EMM_MODEX(u64 a)
{
	return 0x2008 + 8 * a;
}

static inline u64 MIO_EMM_SWITCH(void)
{
	return 0x2048;
}

static inline u64 MIO_EMM_DMA(void)
{
	return 0x2050;
}

static inline u64 MIO_EMM_CMD(void)
{
	return 0x2058;
}

static inline u64 MIO_EMM_RSP_STS(void)
{
	return 0x2060;
}

static inline u64 MIO_EMM_RSP_LO(void)
{
	return 0x2068;
}

static inline u64 MIO_EMM_RSP_HI(void)
{
	return 0x2070;
}

static inline u64 MIO_EMM_INT(void)
{
	return 0x2078;
}

static inline u64 MIO_EMM_WDOG(void)
{
	return 0x2088;
}

static inline u64 MIO_EMM_SAMPLE(void)
{
	return 0x2090;
}

static inline u64 MIO_EMM_STS_MASK(void)
{
	return 0x2098;
}

static inline u64 MIO_EMM_RCA(void)
{
	return 0x20a0;
}

static inline u64 MIO_EMM_BUF_IDX(void)
{
	return 0x20e0;
}

static inline u64 MIO_EMM_BUF_DAT(void)
{
	return 0x20e8;
}

/* Dummy implementation, not documented on MIPS Octeon */
static inline u64 MIO_EMM_DEBUG(void)
{
	return 0x20f8;
}

/**
 * mio_emm_access_wdog
 */
union mio_emm_access_wdog {
	u64 u;
	struct mio_emm_access_wdog_s {
		uint64_t reserved_32_63 : 32;
		uint64_t clk_cnt : 32;
	} s;
};

/**
 * mio_emm_buf_dat
 *
 * MIO_EMM_BUF_DAT = MIO EMMC Data buffer access Register
 *
 */
union mio_emm_buf_dat {
	u64 u;
	struct mio_emm_buf_dat_s {
		uint64_t dat : 64;
	} s;
};

/**
 * mio_emm_buf_idx
 *
 * MIO_EMM_BUF_IDX = MIO EMMC Data buffer address Register
 *
 */
union mio_emm_buf_idx {
	u64 u;
	struct mio_emm_buf_idx_s {
		uint64_t reserved_17_63 : 47;
		uint64_t inc : 1;
		uint64_t reserved_7_15 : 9;
		uint64_t buf_num : 1;
		uint64_t offset : 6;
	} s;
};

/**
 * mio_emm_cfg
 *
 * MIO_EMM_CFG = MIO EMMC Configuration Register
 *
 */
union mio_emm_cfg {
	u64 u;
	struct mio_emm_cfg_s {
		uint64_t reserved_17_63 : 47;
		uint64_t boot_fail : 1;
		uint64_t reserved_4_15 : 12;
		uint64_t bus_ena : 4;
	} s;
};

/**
 * mio_emm_cmd
 *
 * MIO_EMM_CMD = MIO EMMC Command Register
 *
 */
union mio_emm_cmd {
	u64 u;
	struct mio_emm_cmd_s {
		uint64_t reserved_63_63 : 1;
		uint64_t skip_busy : 1;
		uint64_t bus_id : 2;
		uint64_t cmd_val : 1;
		uint64_t reserved_56_58 : 3;
		uint64_t dbuf : 1;
		uint64_t offset : 6;
		uint64_t reserved_43_48 : 6;
		uint64_t ctype_xor : 2;
		uint64_t rtype_xor : 3;
		uint64_t cmd_idx : 6;
		uint64_t arg : 32;
	} s;
};

/**
 * mio_emm_dma
 *
 * MIO_EMM_DMA = MIO EMMC DMA config Register
 *
 */
union mio_emm_dma {
	u64 u;
	struct mio_emm_dma_s {
		uint64_t reserved_63_63 : 1;
		uint64_t skip_busy : 1;
		uint64_t bus_id : 2;
		uint64_t dma_val : 1;
		uint64_t sector : 1;
		uint64_t dat_null : 1;
		uint64_t thres : 6;
		uint64_t rel_wr : 1;
		uint64_t rw : 1;
		uint64_t multi : 1;
		uint64_t block_cnt : 16;
		uint64_t card_addr : 32;
	} s;
};

/**
 * mio_emm_dma_adr
 *
 * This register sets the address for eMMC/SD flash transfers to/from memory. Sixty-four-bit
 * operations must be used to access this register. This register is updated by the DMA
 * hardware and can be reloaded by the values placed in the MIO_EMM_DMA_FIFO_ADR.
 */
union mio_emm_dma_adr {
	u64 u;
	struct mio_emm_dma_adr_s {
		uint64_t reserved_42_63 : 22;
		uint64_t adr : 42;
	} s;
};

/**
 * mio_emm_dma_cfg
 *
 * This register controls the internal DMA engine used with the eMMC/SD flash controller. Sixty-
 * four-bit operations must be used to access this register. This register is updated by the
 * hardware DMA engine and can also be reloaded by writes to the MIO_EMM_DMA_FIFO_CMD register.
 */
union mio_emm_dma_cfg {
	u64 u;
	struct mio_emm_dma_cfg_s {
		uint64_t en : 1;
		uint64_t rw : 1;
		uint64_t clr : 1;
		uint64_t reserved_60_60 : 1;
		uint64_t swap32 : 1;
		uint64_t swap16 : 1;
		uint64_t swap8 : 1;
		uint64_t endian : 1;
		uint64_t size : 20;
		uint64_t reserved_0_35 : 36;
	} s;
};

/**
 * mio_emm_dma_fifo_adr
 *
 * This register specifies the internal address that is loaded into the eMMC internal DMA FIFO.
 * The FIFO is used to queue up operations for the MIO_EMM_DMA_CFG/MIO_EMM_DMA_ADR when the DMA
 * completes successfully.
 */
union mio_emm_dma_fifo_adr {
	u64 u;
	struct mio_emm_dma_fifo_adr_s {
		uint64_t reserved_42_63 : 22;
		uint64_t adr : 39;
		uint64_t reserved_0_2 : 3;
	} s;
};

/**
 * mio_emm_dma_fifo_cfg
 *
 * This register controls DMA FIFO operations.
 *
 */
union mio_emm_dma_fifo_cfg {
	u64 u;
	struct mio_emm_dma_fifo_cfg_s {
		uint64_t reserved_17_63 : 47;
		uint64_t clr : 1;
		uint64_t reserved_13_15 : 3;
		uint64_t int_lvl : 5;
		uint64_t reserved_5_7 : 3;
		uint64_t count : 5;
	} s;
};

/**
 * mio_emm_dma_fifo_cmd
 *
 * This register specifies a command that is loaded into the eMMC internal DMA FIFO.  The FIFO is
 * used to queue up operations for the MIO_EMM_DMA_CFG/MIO_EMM_DMA_ADR when the DMA completes
 * successfully. Writes to this register store both the MIO_EMM_DMA_FIFO_CMD and the
 * MIO_EMM_DMA_FIFO_ADR contents into the FIFO and increment the MIO_EMM_DMA_FIFO_CFG[COUNT]
 * field.
 *
 * Note: This register has a similar format to MIO_EMM_DMA_CFG with the exception
 * that the EN and CLR fields are absent. These are supported in MIO_EMM_DMA_FIFO_CFG.
 */
union mio_emm_dma_fifo_cmd {
	u64 u;
	struct mio_emm_dma_fifo_cmd_s {
		uint64_t reserved_63_63 : 1;
		uint64_t rw : 1;
		uint64_t reserved_61_61 : 1;
		uint64_t intdis : 1;
		uint64_t swap32 : 1;
		uint64_t swap16 : 1;
		uint64_t swap8 : 1;
		uint64_t endian : 1;
		uint64_t size : 20;
		uint64_t reserved_0_35 : 36;
	} s;
};

/**
 * mio_emm_dma_int
 *
 * Sixty-four-bit operations must be used to access this register.
 *
 */
union mio_emm_dma_int {
	u64 u;
	struct mio_emm_dma_int_s {
		uint64_t reserved_2_63 : 62;
		uint64_t fifo : 1;
		uint64_t done : 1;
	} s;
};

/**
 * mio_emm_dma_int_w1s
 */
union mio_emm_dma_int_w1s {
	u64 u;
	struct mio_emm_dma_int_w1s_s {
		uint64_t reserved_2_63 : 62;
		uint64_t fifo : 1;
		uint64_t done : 1;
	} s;
};

/**
 * mio_emm_int
 *
 * MIO_EMM_INT = MIO EMMC Interrupt Register
 *
 */
union mio_emm_int {
	u64 u;
	struct mio_emm_int_s {
		uint64_t reserved_7_63 : 57;
		uint64_t switch_err : 1;
		uint64_t switch_done : 1;
		uint64_t dma_err : 1;
		uint64_t cmd_err : 1;
		uint64_t dma_done : 1;
		uint64_t cmd_done : 1;
		uint64_t buf_done : 1;
	} s;
};

/**
 * mio_emm_int_en
 *
 * MIO_EMM_INT_EN = MIO EMMC Interrupt enable Register
 *
 */
union mio_emm_int_en {
	u64 u;
	struct mio_emm_int_en_s {
		uint64_t reserved_7_63 : 57;
		uint64_t switch_err : 1;
		uint64_t switch_done : 1;
		uint64_t dma_err : 1;
		uint64_t cmd_err : 1;
		uint64_t dma_done : 1;
		uint64_t cmd_done : 1;
		uint64_t buf_done : 1;
	} s;
};

/**
 * mio_emm_int_w1s
 */
union mio_emm_int_w1s {
	u64 u;
	struct mio_emm_int_w1s_s {
		uint64_t reserved_7_63 : 57;
		uint64_t switch_err : 1;
		uint64_t switch_done : 1;
		uint64_t dma_err : 1;
		uint64_t cmd_err : 1;
		uint64_t dma_done : 1;
		uint64_t cmd_done : 1;
		uint64_t buf_done : 1;
	} s;
};

/**
 * mio_emm_mode#
 *
 * MIO_EMM_MODE = MIO EMMC Operating mode Register
 *
 */
union mio_emm_modex {
	u64 u;
	struct mio_emm_modex_s {
		uint64_t reserved_49_63 : 15;
		uint64_t hs_timing : 1;
		uint64_t reserved_43_47 : 5;
		uint64_t bus_width : 3;
		uint64_t reserved_36_39 : 4;
		uint64_t power_class : 4;
		uint64_t clk_hi : 16;
		uint64_t clk_lo : 16;
	} s;
};

/**
 * mio_emm_rca
 */
union mio_emm_rca {
	u64 u;
	struct mio_emm_rca_s {
		uint64_t reserved_16_63 : 48;
		uint64_t card_rca : 16;
	} s;
};

/**
 * mio_emm_rsp_hi
 *
 * MIO_EMM_RSP_HI = MIO EMMC Response data high Register
 *
 */
union mio_emm_rsp_hi {
	u64 u;
	struct mio_emm_rsp_hi_s {
		uint64_t dat : 64;
	} s;
};

/**
 * mio_emm_rsp_lo
 *
 * MIO_EMM_RSP_LO = MIO EMMC Response data low Register
 *
 */
union mio_emm_rsp_lo {
	u64 u;
	struct mio_emm_rsp_lo_s {
		uint64_t dat : 64;
	} s;
};

/**
 * mio_emm_rsp_sts
 *
 * MIO_EMM_RSP_STS = MIO EMMC Response status Register
 *
 */
union mio_emm_rsp_sts {
	u64 u;
	struct mio_emm_rsp_sts_s {
		uint64_t reserved_62_63 : 2;
		uint64_t bus_id : 2;
		uint64_t cmd_val : 1;
		uint64_t switch_val : 1;
		uint64_t dma_val : 1;
		uint64_t dma_pend : 1;
		uint64_t acc_timeout : 1;
		uint64_t reserved_29_54 : 26;
		uint64_t dbuf_err : 1;
		uint64_t reserved_24_27 : 4;
		uint64_t dbuf : 1;
		uint64_t blk_timeout : 1;
		uint64_t blk_crc_err : 1;
		uint64_t rsp_busybit : 1;
		uint64_t stp_timeout : 1;
		uint64_t stp_crc_err : 1;
		uint64_t stp_bad_sts : 1;
		uint64_t stp_val : 1;
		uint64_t rsp_timeout : 1;
		uint64_t rsp_crc_err : 1;
		uint64_t rsp_bad_sts : 1;
		uint64_t rsp_val : 1;
		uint64_t rsp_type : 3;
		uint64_t cmd_type : 2;
		uint64_t cmd_idx : 6;
		uint64_t cmd_done : 1;
	} s;
};

/**
 * mio_emm_sample
 */
union mio_emm_sample {
	u64 u;
	struct mio_emm_sample_s {
		uint64_t reserved_26_63 : 38;
		uint64_t cmd_cnt : 10;
		uint64_t reserved_10_15 : 6;
		uint64_t dat_cnt : 10;
	} s;
};

/**
 * mio_emm_sts_mask
 */
union mio_emm_sts_mask {
	u64 u;
	struct mio_emm_sts_mask_s {
		uint64_t reserved_32_63 : 32;
		uint64_t sts_msk : 32;
	} s;
};

/**
 * mio_emm_switch
 *
 * MIO_EMM_SWITCH = MIO EMMC Operating mode switch Register
 *
 */
union mio_emm_switch {
	u64 u;
	struct mio_emm_switch_s {
		uint64_t reserved_62_63 : 2;
		uint64_t bus_id : 2;
		uint64_t switch_exe : 1;
		uint64_t switch_err0 : 1;
		uint64_t switch_err1 : 1;
		uint64_t switch_err2 : 1;
		uint64_t reserved_49_55 : 7;
		uint64_t hs_timing : 1;
		uint64_t reserved_43_47 : 5;
		uint64_t bus_width : 3;
		uint64_t reserved_36_39 : 4;
		uint64_t power_class : 4;
		uint64_t clk_hi : 16;
		uint64_t clk_lo : 16;
	} s;
};

/**
 * mio_emm_wdog
 *
 * MIO_EMM_WDOG = MIO EMMC Watchdog Register
 *
 */
union mio_emm_wdog {
	u64 u;
	struct mio_emm_wdog_s {
		uint64_t reserved_26_63 : 38;
		uint64_t clk_cnt : 26;
	} s;
};

/*
 * The following structs are only available to enable compilation of the common
 * MMC driver. These registers do not exist on MIPS Octeon.
 */

/**
 * Register (RSL) mio_emm_timing
 *
 * eMMC Timing Register This register determines the number of tap delays
 * the EMM_DAT, EMM_DS, and EMM_CMD lines are transmitted or received in
 * relation to EMM_CLK. These values should only be changed when the eMMC
 * bus is idle.
 */
union mio_emm_timing {
	u64 u;
	struct mio_emm_timing_s {
		u64 data_out_tap                     : 6;
		u64 reserved_6_15                    : 10;
		u64 data_in_tap                      : 6;
		u64 reserved_22_31                   : 10;
		u64 cmd_out_tap                      : 6;
		u64 reserved_38_47                   : 10;
		u64 cmd_in_tap                       : 6;
		u64 reserved_54_63                   : 10;
	} s;
};

/**
 * Register (RSL) mio_emm_debug
 *
 * eMMC Debug Register
 */
union mio_emm_debug {
	u64 u;
	struct mio_emm_debug_s {
		u64 clk_on                           : 1;
		u64 reserved_1_7                     : 7;
		u64 cmd_sm                           : 4;
		u64 data_sm                          : 4;
		u64 dma_sm                           : 4;
		u64 emmc_clk_disable                 : 1;
		u64 rdsync_rst                       : 1;
		u64 reserved_22_63                   : 42;
	} s;
};

#endif