aboutsummaryrefslogblamecommitdiff
path: root/sys/contrib/alpine-hal/al_hal_serdes_25g_regs.h
blob: 64422f7e931fed5be357f9fe68c7d0af15be9607 (plain) (tree)
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

















































































































































































































































































































































































































































                                                                                
/*******************************************************************************
Copyright (C) 2013 Annapurna Labs Ltd.

This file may be licensed under the terms of the Annapurna Labs Commercial
License Agreement.

Alternatively, this file can be distributed under the terms of the GNU General
Public License V2 or V3 as published by the Free Software Foundation and can be
found at http://www.gnu.org/licenses/gpl-2.0.html

Alternatively, redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following conditions are
met:

    *     Redistributions of source code must retain the above copyright notice,
	  this list of conditions and the following disclaimer.

    *     Redistributions in binary form must reproduce the above copyright
	  notice, this list of conditions and the following disclaimer in
	  the documentation and/or other materials provided with the
	  distribution.

 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*******************************************************************************/

/**
 *  @{
 * @file   al_hal_serdes_c_regs.h
 *
 * @brief ... registers
 *
 */

#ifndef __AL_HAL_serdes_c_REGS_H__
#define __AL_HAL_serdes_c_REGS_H__

#include "al_hal_plat_types.h"

#ifdef __cplusplus
extern "C" {
#endif
/*
* Unit Registers
*/

struct al_serdes_c_gen {
	/* [0x0] SERDES registers Version */
	uint32_t version;
	uint32_t rsrvd_0[3];
	/* [0x10] SERDES register file address */
	uint32_t reg_addr;
	/* [0x14] SERDES register file data */
	uint32_t reg_data;
	/* [0x18] SERDES control */
	uint32_t ctrl;
	/* [0x1c] SERDES cpu mem address */
	uint32_t cpu_prog_addr;
	/* [0x20] SERDES cpu mem data */
	uint32_t cpu_prog_data;
	/* [0x24] SERDES data mem address */
	uint32_t cpu_data_mem_addr;
	/* [0x28] SERDES data mem data */
	uint32_t cpu_data_mem_data;
	/* [0x2c] SERDES control */
	uint32_t rst;
	/* [0x30] SERDES control */
	uint32_t status;
	uint32_t rsrvd[51];
};
struct al_serdes_c_lane {
	uint32_t rsrvd_0[4];
	/* [0x10] Data configuration */
	uint32_t cfg;
	/* [0x14] Lane status */
	uint32_t stat;
	/* [0x18] SERDES control */
	uint32_t reserved;
	uint32_t rsrvd[25];
};

struct al_serdes_c_regs {
	uint32_t rsrvd_0[64];
	struct al_serdes_c_gen gen;                             /* [0x100] */
	struct al_serdes_c_lane lane[2];                        /* [0x200] */
};


/*
* Registers Fields
*/


/**** version register ****/
/*  Revision number (Minor) */
#define SERDES_C_GEN_VERSION_RELEASE_NUM_MINOR_MASK 0x000000FF
#define SERDES_C_GEN_VERSION_RELEASE_NUM_MINOR_SHIFT 0
/*  Revision number (Major) */
#define SERDES_C_GEN_VERSION_RELEASE_NUM_MAJOR_MASK 0x0000FF00
#define SERDES_C_GEN_VERSION_RELEASE_NUM_MAJOR_SHIFT 8
/*  date of release */
#define SERDES_C_GEN_VERSION_DATE_DAY_MASK 0x001F0000
#define SERDES_C_GEN_VERSION_DATE_DAY_SHIFT 16
/*  month of release */
#define SERDES_C_GEN_VERSION_DATA_MONTH_MASK 0x01E00000
#define SERDES_C_GEN_VERSION_DATA_MONTH_SHIFT 21
/*  year of release (starting from 2000) */
#define SERDES_C_GEN_VERSION_DATE_YEAR_MASK 0x3E000000
#define SERDES_C_GEN_VERSION_DATE_YEAR_SHIFT 25
/*  Reserved */
#define SERDES_C_GEN_VERSION_RESERVED_MASK 0xC0000000
#define SERDES_C_GEN_VERSION_RESERVED_SHIFT 30

/**** reg_addr register ****/
/* address value */
#define SERDES_C_GEN_REG_ADDR_VAL_MASK   0x00007FFF
#define SERDES_C_GEN_REG_ADDR_VAL_SHIFT  0

/**** reg_data register ****/
/* data value */
#define SERDES_C_GEN_REG_DATA_VAL_MASK   0x000000FF
#define SERDES_C_GEN_REG_DATA_VAL_SHIFT  0
/* Bit-wise write enable */
#define SERDES_C_GEN_REG_DATA_STRB_MASK  0x0000FF00
#define SERDES_C_GEN_REG_DATA_STRB_SHIFT 8

/**** ctrl register ****/
/*
 * 0x0 – Select reference clock from Bump
 * 0x1 – Select inter-macro reference clock from the left side
 * 0x2 – Same as 0x0
 * 0x3 – Select inter-macro reference clock from the right side
 */
#define SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_MASK 0x00000003
#define SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_SHIFT 0

#define SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_REF \
	(0 << (SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_SHIFT))
#define SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_L2R \
	(1 << (SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_SHIFT))
#define SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_R2L \
	(3 << (SERDES_C_GEN_CTRL_REFCLK_INPUT_SEL_SHIFT))

/*
 * 0x0 – Tied to 0 to save power
 * 0x1 – Select reference clock from Bump
 * 0x2 – Select inter-macro reference clock input from right side
 * 0x3 – Same as 0x2
 */
#define SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_MASK 0x00000030
#define SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_SHIFT 4

#define SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_0 \
	(0 << (SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_SHIFT))
#define SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_REF \
	(1 << (SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_SHIFT))
#define SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_R2L \
	(2 << (SERDES_C_GEN_CTRL_REFCLK_LEFT_SEL_SHIFT))

/*
 * 0x0 – Tied to 0 to save power
 * 0x1 – Select reference clock from Bump
 * 0x2 – Select inter-macro reference clock input from left side
 * 0x3 – Same as 0x2
 */
#define SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_MASK 0x000000C0
#define SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_SHIFT 6

#define SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_0 \
	(0 << (SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_SHIFT))
#define SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_REF \
	(1 << (SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_SHIFT))
#define SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_L2R \
	(2 << (SERDES_C_GEN_CTRL_REFCLK_RIGHT_SEL_SHIFT))

/*
 * Program memory acknowledge -  Only when the access
 * to the program memory is not
 * ready for the microcontroller, it
 * is driven to 0
 */
#define SERDES_C_GEN_CTRL_CPU_MEMPSACK   (1 << 8)
/*
 * Data memory acknowledge -  Only when the access
 * to the program memory is not
 * ready for the microcontroller, it
 * is driven to 0
 */
#define SERDES_C_GEN_CTRL_CPU_MEMACK     (1 << 12)
/*
 * 0 - keep cpu clk as sb clk
 * 1 – cpu_clk is sb_clk divided by 2
 */
#define SERDES_C_GEN_CTRL_CPU_CLK_DIV    (1 << 16)
/*
 * 0x0 – OIF CEI-28G-SR
 * 0x1 – OIF CIE-25G-LR
 * 0x8 – XFI
 * Others – Reserved
 *
 * Note that phy_ctrl_cfg_i[3] is used to signify high-speed/low-speed
 */
#define SERDES_C_GEN_CTRL_PHY_CTRL_CFG_MASK 0x00F00000
#define SERDES_C_GEN_CTRL_PHY_CTRL_CFG_SHIFT 20
/*
 * 0 - Internal 8051 micro- controller is allowed to access the internal APB
 * CSR. Internal APB runs at cpu_clk_i, and the accesses from the external APB
 * in apb_clk_i domain to APB CSR are resynchronized to cpu_clk_i. 1 – Bypass
 * CPU. Internal 8051 micro-controller is blocked from accessing the internal
 * APB CSR. Internal APB runs at apb_clk_i.
 */
#define SERDES_C_GEN_CTRL_CPU_BYPASS     (1 << 24)

/**** cpu_prog_addr register ****/
/*
 * address value 32 bit,
 * The firmware data will be 1 byte with 64K rows
 */
#define SERDES_C_GEN_CPU_PROG_ADDR_VAL_MASK 0x00007FFF
#define SERDES_C_GEN_CPU_PROG_ADDR_VAL_SHIFT 0

/**** cpu_data_mem_addr register ****/
/* address value – 8K byte memory */
#define SERDES_C_GEN_CPU_DATA_MEM_ADDR_VAL_MASK 0x00001FFF
#define SERDES_C_GEN_CPU_DATA_MEM_ADDR_VAL_SHIFT 0

/**** cpu_data_mem_data register ****/
/* data value */
#define SERDES_C_GEN_CPU_DATA_MEM_DATA_VAL_MASK 0x000000FF
#define SERDES_C_GEN_CPU_DATA_MEM_DATA_VAL_SHIFT 0

/**** rst register ****/
/* Power on reset Signal  – active low */
#define SERDES_C_GEN_RST_POR_N           (1 << 0)
/* CMU reset   Active low */
#define SERDES_C_GEN_RST_CM0_RST_N       (1 << 1)
/*
 * 0x0 – Normal / Active
 * 0x1 – Partial power down
 * 0x2 – Near complete power down (only
 * refclk buffers and portions of analog bias
 * active)
 * 0x3 – complete power down (IDDQ mode)
 * Can be asserted when CMU is in normal
 * mode.  These modes provide an increased
 * power savings compared to reset mode.
 * Signal is overridden by por_n_i so has no
 * effect in power on reset state.
 */
#define SERDES_C_GEN_RST_CM0_PD_MASK     0x00000030
#define SERDES_C_GEN_RST_CM0_PD_SHIFT    4
/* Lane0 reset signal  active low */
#define SERDES_C_GEN_RST_LN0_RST_N       (1 << 6)
/* Lane1 reset signal  active low */
#define SERDES_C_GEN_RST_LN1_RST_N       (1 << 7)
/*
 * 0x0 – Normal / Active
 * 0x1 – Partial power down
 * 0x2 – Most blocks powered down (only LOS
 * active)
 * 0x3 – complete power down (IDDQ mode)
 * Can be asserted when Lane is in normal
 * mode.  These modes provide an increased
 * power savings compared to reset mode.
 * Signal is overridden by por_n_i so has no
 * affect in power on reset state
 */
#define SERDES_C_GEN_RST_LN0_PD_MASK     0x00000300
#define SERDES_C_GEN_RST_LN0_PD_SHIFT    8
/*
 * 0x0 – Normal / Active
 * 0x1 – Partial power down
 * 0x2 – Most blocks powered down (only LOS
 * active)
 * 0x3 – complete power down (IDDQ mode)
 * Can be asserted when Lane is in normal
 * mode.  These modes provide an increased
 * power savings compared to reset mode.
 * Signal is overridden by por_n_i so has no
 * affect in power on reset state
 */
#define SERDES_C_GEN_RST_LN1_PD_MASK     0x00000C00
#define SERDES_C_GEN_RST_LN1_PD_SHIFT    10

#define SERDES_C_GEN_RST_CPU_MEM_RESET   (1 << 12)

#define SERDES_C_GEN_RST_CPU_MEM_SHUTDOWN (1 << 13)

#define SERDES_C_GEN_RST_CAPRI_APB_RESET (1 << 14)

/**** status register ****/
/*
 * 0x0 – No error
 * 0x1 – PHY has an internal error
 */
#define SERDES_C_GEN_STATUS_ERR_O        (1 << 0)
/*
 * 0x0 – PHY is not ready to respond to
 * cm0_rst_n_i and cm0_pd_i[1:0]. The
 * signals should not be changed.
 * 0x1 - PHY is ready to respond to
 * cm0_rst_n_i and cm0_pd_i[1:0]
 */
#define SERDES_C_GEN_STATUS_CM0_RST_PD_READY (1 << 1)
/*
 * Indicates CMU PLL has locked to the
 * reference clock and all output clocks are at
 * the correct frequency
 */
#define SERDES_C_GEN_STATUS_CM0_OK_O     (1 << 2)
/*
 * 0x0 – PHY is not ready to respond to
 * ln0_rst_n and ln0_pd[1:0]. The signals
 * should not be changed.
 * 0x1 - PHY is ready to respond to lnX_rst_n_i
 * and lnX_pd_i[1:0]
 */
#define SERDES_C_GEN_STATUS_LN0_RST_PD_READY (1 << 3)
/*
 * 0x0 – PHY is not ready to respond to
 * ln1_rst_n_i and ln1_pd[1:0]. The signals
 * should not be changed.
 * 0x1 - PHY is ready to respond to lnX_rst_n_i
 * and lnX_pd_i[1:0]
 */
#define SERDES_C_GEN_STATUS_LN1_RST_PD_READY (1 << 4)
/*
 * Active low when the CPU performs a wait cycle (internally or externally
 * generated)
 */
#define SERDES_C_GEN_STATUS_CPU_WAITSTATE (1 << 5)

#define SERDES_C_GEN_STATUS_TBUS_MASK    0x000FFF00
#define SERDES_C_GEN_STATUS_TBUS_SHIFT   8

/**** cfg register ****/
/* 1- Swap 32 bit data on RX side */
#define SERDES_C_LANE_CFG_RX_LANE_SWAP   (1 << 0)
/* 1- Swap 32 bit data on TX side */
#define SERDES_C_LANE_CFG_TX_LANE_SWAP   (1 << 1)
/* 1 – invert rx data polarity */
#define SERDES_C_LANE_CFG_LN_CTRL_RXPOLARITY (1 << 2)
/* 1 – invert tx data polarity */
#define SERDES_C_LANE_CFG_TX_LANE_POLARITY (1 << 3)
/*
 * 0x0 –Data on lnX_txdata_o will not be
 * transmitted. Transmitter will be placed into
 * electrical idle.
 * 0x1 – Data on the active bits of
 * lnX_txdata_o will be transmitted
 */
#define SERDES_C_LANE_CFG_LN_CTRL_TX_EN  (1 << 4)
/*
 * Informs the PHY to bypass the output of the
 * analog LOS detector and instead rely upon
 * a protocol LOS mechanism in the SoC/ASIC
 * 0x0 – LOS operates as normal
 * 0x1 – Bypass analog LOS output and
 * instead rely upon protocol-level LOS
 * detection via input lnX_ctrl_los_eii_value
 */
#define SERDES_C_LANE_CFG_LN_CTRL_LOS_EII_EN (1 << 5)
/*
 * If lnX_ctrl_los_eii_en_i = 1 then Informs
 * the PHY that the received signal was lost
 */
#define SERDES_C_LANE_CFG_LN_CTRL_LOS_EII_VALUE (1 << 6)
/* One hot mux */
#define SERDES_C_LANE_CFG_TX_DATA_SRC_SELECT_MASK 0x00000F00
#define SERDES_C_LANE_CFG_TX_DATA_SRC_SELECT_SHIFT 8
/* 0x0 - 20-bit 0x1 – 40-bit */
#define SERDES_C_LANE_CFG_LN_CTRL_DATA_WIDTH (1 << 12)

/**** stat register ****/
/*
 * x0 – lane is not ready to send and receive data
 * 0x1 – lane is ready to send and receive data
 */
#define SERDES_C_LANE_STAT_LNX_STAT_OK   (1 << 0)
/*
 * 0x0 – received data run length has not
 * exceed the programmable run length
 * detector threshold
 * 0x1 – received data run length has
 * exceeded the programmable run length
 * detector threshold
 */
#define SERDES_C_LANE_STAT_LN_STAT_RUNLEN_ERR (1 << 1)
/*
 * 0x0 – data on lnX_rxdata_o are invalid
 * 0x1 – data on the active bits of
 * lnX_rxdata_o are valid
 */
#define SERDES_C_LANE_STAT_LN_STAT_RXVALID (1 << 2)
/*
 * Loss of Signal (LOS) indicator that includes
 * the combined functions of the digitally
 * assisted analog LOS, digital LOS, and
 * protocol LOS override features
 * 0x0 – Signal detected on  lnX_rxp_i /
 * lnX_rxm_i pins
 * 0x1 – No signal detected on lnX_rxp_i /
 * lnX_rxm_i pins
 */
#define SERDES_C_LANE_STAT_LN_STAT_LOS   (1 << 3)

#define SERDES_C_LANE_STAT_LN_STAT_LOS_DEGLITCH (1 << 4)

/**** reserved register ****/

#define SERDES_C_LANE_RESERVED_DEF_0_MASK 0x0000FFFF
#define SERDES_C_LANE_RESERVED_DEF_0_SHIFT 0

#define SERDES_C_LANE_RESERVED_DEF_1_MASK 0xFFFF0000
#define SERDES_C_LANE_RESERVED_DEF_1_SHIFT 16

#ifdef __cplusplus
}
#endif

#endif /* __AL_HAL_serdes_c_REGS_H__ */

/** @} end of ... group */