xref: /rk3399_ARM-atf/drivers/marvell/comphy/phy-comphy-common.h (revision 42a293379e808f2300519db937c6dc9a7685a4b2)
1*42a29337SGrzegorz Jaszczyk /*
2*42a29337SGrzegorz Jaszczyk  * Copyright (C) 2018 Marvell International Ltd.
3*42a29337SGrzegorz Jaszczyk  *
4*42a29337SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
5*42a29337SGrzegorz Jaszczyk  * https://spdx.org/licenses
6*42a29337SGrzegorz Jaszczyk  */
7*42a29337SGrzegorz Jaszczyk 
8*42a29337SGrzegorz Jaszczyk /* Marvell CP110 ana A3700 common */
9*42a29337SGrzegorz Jaszczyk 
10*42a29337SGrzegorz Jaszczyk #ifndef _PHY_COMPHY_COMMON_H
11*42a29337SGrzegorz Jaszczyk #define _PHY_COMPHY_COMMON_H
12*42a29337SGrzegorz Jaszczyk 
13*42a29337SGrzegorz Jaszczyk /* #define DEBUG_COMPHY */
14*42a29337SGrzegorz Jaszczyk #ifdef DEBUG_COMPHY
15*42a29337SGrzegorz Jaszczyk #define debug(format...) printf(format)
16*42a29337SGrzegorz Jaszczyk #else
17*42a29337SGrzegorz Jaszczyk #define debug(format, arg...)
18*42a29337SGrzegorz Jaszczyk #endif
19*42a29337SGrzegorz Jaszczyk 
20*42a29337SGrzegorz Jaszczyk /* A lane is described by 4 fields:
21*42a29337SGrzegorz Jaszczyk  *      - bit 1~0 represent comphy polarity invert
22*42a29337SGrzegorz Jaszczyk  *      - bit 7~2 represent comphy speed
23*42a29337SGrzegorz Jaszczyk  *      - bit 11~8 represent unit index
24*42a29337SGrzegorz Jaszczyk  *      - bit 16~12 represent mode
25*42a29337SGrzegorz Jaszczyk  *      - bit 17 represent comphy indication of clock source
26*42a29337SGrzegorz Jaszczyk  *      - bit 19-18 represents pcie width (in case of pcie comphy config.)
27*42a29337SGrzegorz Jaszczyk  *      - bit 31~20 reserved
28*42a29337SGrzegorz Jaszczyk  */
29*42a29337SGrzegorz Jaszczyk 
30*42a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_OFFSET	0
31*42a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_LEN	2
32*42a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_MASK	COMPHY_MASK(COMPHY_INVERT_OFFSET, \
33*42a29337SGrzegorz Jaszczyk 						COMPHY_INVERT_LEN)
34*42a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_OFFSET	(COMPHY_INVERT_OFFSET + COMPHY_INVERT_LEN)
35*42a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_LEN	6
36*42a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_MASK	COMPHY_MASK(COMPHY_SPEED_OFFSET, \
37*42a29337SGrzegorz Jaszczyk 						COMPHY_SPEED_LEN)
38*42a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_OFFSET	(COMPHY_SPEED_OFFSET + COMPHY_SPEED_LEN)
39*42a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_LEN	4
40*42a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_MASK	COMPHY_MASK(COMPHY_UNIT_ID_OFFSET, \
41*42a29337SGrzegorz Jaszczyk 						COMPHY_UNIT_ID_LEN)
42*42a29337SGrzegorz Jaszczyk #define COMPHY_MODE_OFFSET	(COMPHY_UNIT_ID_OFFSET + COMPHY_UNIT_ID_LEN)
43*42a29337SGrzegorz Jaszczyk #define COMPHY_MODE_LEN		5
44*42a29337SGrzegorz Jaszczyk #define COMPHY_MODE_MASK	COMPHY_MASK(COMPHY_MODE_OFFSET, COMPHY_MODE_LEN)
45*42a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_OFFSET	(COMPHY_MODE_OFFSET + COMPHY_MODE_LEN)
46*42a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_LEN	1
47*42a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_MASK	COMPHY_MASK(COMPHY_CLK_SRC_OFFSET, \
48*42a29337SGrzegorz Jaszczyk 						COMPHY_CLK_SRC_LEN)
49*42a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_OFFSET	(COMPHY_CLK_SRC_OFFSET + COMPHY_CLK_SRC_LEN)
50*42a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_LEN	3
51*42a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_MASK	COMPHY_MASK(COMPHY_PCI_WIDTH_OFFSET, \
52*42a29337SGrzegorz Jaszczyk 						COMPHY_PCI_WIDTH_LEN)
53*42a29337SGrzegorz Jaszczyk 
54*42a29337SGrzegorz Jaszczyk #define COMPHY_MASK(offset, len)	(((1 << (len)) - 1) << (offset))
55*42a29337SGrzegorz Jaszczyk 
56*42a29337SGrzegorz Jaszczyk /* Macro which extracts mode from lane description */
57*42a29337SGrzegorz Jaszczyk #define COMPHY_GET_MODE(x)		(((x) & COMPHY_MODE_MASK) >> \
58*42a29337SGrzegorz Jaszczyk 						COMPHY_MODE_OFFSET)
59*42a29337SGrzegorz Jaszczyk /* Macro which extracts unit index from lane description */
60*42a29337SGrzegorz Jaszczyk #define COMPHY_GET_ID(x)		(((x) & COMPHY_UNIT_ID_MASK) >> \
61*42a29337SGrzegorz Jaszczyk 						COMPHY_UNIT_ID_OFFSET)
62*42a29337SGrzegorz Jaszczyk /* Macro which extracts speed from lane description */
63*42a29337SGrzegorz Jaszczyk #define COMPHY_GET_SPEED(x)		(((x) & COMPHY_SPEED_MASK) >> \
64*42a29337SGrzegorz Jaszczyk 						COMPHY_SPEED_OFFSET)
65*42a29337SGrzegorz Jaszczyk /* Macro which extracts clock source indication from lane description */
66*42a29337SGrzegorz Jaszczyk #define COMPHY_GET_CLK_SRC(x)		(((x) & COMPHY_CLK_SRC_MASK) >> \
67*42a29337SGrzegorz Jaszczyk 						COMPHY_CLK_SRC_OFFSET)
68*42a29337SGrzegorz Jaszczyk /* Macro which extracts pcie width indication from lane description */
69*42a29337SGrzegorz Jaszczyk #define COMPHY_GET_PCIE_WIDTH(x)	(((x) & COMPHY_PCI_WIDTH_MASK) >> \
70*42a29337SGrzegorz Jaszczyk 						COMPHY_PCI_WIDTH_OFFSET)
71*42a29337SGrzegorz Jaszczyk 
72*42a29337SGrzegorz Jaszczyk /* Macro which extracts the polarity invert from lane description */
73*42a29337SGrzegorz Jaszczyk #define COMPHY_GET_POLARITY_INVERT(x)	(((x) & COMPHY_INVERT_MASK) >> \
74*42a29337SGrzegorz Jaszczyk 						COMPHY_INVERT_OFFSET)
75*42a29337SGrzegorz Jaszczyk 
76*42a29337SGrzegorz Jaszczyk 
77*42a29337SGrzegorz Jaszczyk #define COMPHY_SATA_MODE	0x1
78*42a29337SGrzegorz Jaszczyk #define COMPHY_SGMII_MODE	0x2	/* SGMII 1G */
79*42a29337SGrzegorz Jaszczyk #define COMPHY_HS_SGMII_MODE	0x3	/* SGMII 2.5G */
80*42a29337SGrzegorz Jaszczyk #define COMPHY_USB3H_MODE	0x4
81*42a29337SGrzegorz Jaszczyk #define COMPHY_USB3D_MODE	0x5
82*42a29337SGrzegorz Jaszczyk #define COMPHY_PCIE_MODE	0x6
83*42a29337SGrzegorz Jaszczyk #define COMPHY_RXAUI_MODE	0x7
84*42a29337SGrzegorz Jaszczyk #define COMPHY_XFI_MODE		0x8
85*42a29337SGrzegorz Jaszczyk #define COMPHY_SFI_MODE		0x9
86*42a29337SGrzegorz Jaszczyk #define COMPHY_USB3_MODE	0xa
87*42a29337SGrzegorz Jaszczyk #define COMPHY_AP_MODE		0xb
88*42a29337SGrzegorz Jaszczyk 
89*42a29337SGrzegorz Jaszczyk #define	COMPHY_UNUSED		0xFFFFFFFF
90*42a29337SGrzegorz Jaszczyk 
91*42a29337SGrzegorz Jaszczyk /* Polarity invert macro */
92*42a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_NO_INVERT	0
93*42a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_TXD_INVERT	1
94*42a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_RXD_INVERT	2
95*42a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_ALL_INVERT	(COMPHY_POLARITY_TXD_INVERT | \
96*42a29337SGrzegorz Jaszczyk 					 COMPHY_POLARITY_RXD_INVERT)
97*42a29337SGrzegorz Jaszczyk 
98*42a29337SGrzegorz Jaszczyk enum reg_width_type {
99*42a29337SGrzegorz Jaszczyk 	REG_16BIT = 0,
100*42a29337SGrzegorz Jaszczyk 	REG_32BIT,
101*42a29337SGrzegorz Jaszczyk };
102*42a29337SGrzegorz Jaszczyk 
103*42a29337SGrzegorz Jaszczyk enum {
104*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE0 = 0,
105*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE1,
106*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE2,
107*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE3,
108*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE4,
109*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE5,
110*42a29337SGrzegorz Jaszczyk 	COMPHY_LANE_MAX,
111*42a29337SGrzegorz Jaszczyk };
112*42a29337SGrzegorz Jaszczyk 
113*42a29337SGrzegorz Jaszczyk static inline uint32_t polling_with_timeout(uintptr_t addr, uint32_t val,
114*42a29337SGrzegorz Jaszczyk 					    uint32_t mask,
115*42a29337SGrzegorz Jaszczyk 					    uint32_t usec_timeout,
116*42a29337SGrzegorz Jaszczyk 					    enum reg_width_type type)
117*42a29337SGrzegorz Jaszczyk {
118*42a29337SGrzegorz Jaszczyk 	uint32_t data;
119*42a29337SGrzegorz Jaszczyk 
120*42a29337SGrzegorz Jaszczyk 	do {
121*42a29337SGrzegorz Jaszczyk 		udelay(1);
122*42a29337SGrzegorz Jaszczyk 		if (type == REG_16BIT)
123*42a29337SGrzegorz Jaszczyk 			data = mmio_read_16(addr) & mask;
124*42a29337SGrzegorz Jaszczyk 		else
125*42a29337SGrzegorz Jaszczyk 			data = mmio_read_32(addr) & mask;
126*42a29337SGrzegorz Jaszczyk 	} while (data != val  && --usec_timeout > 0);
127*42a29337SGrzegorz Jaszczyk 
128*42a29337SGrzegorz Jaszczyk 	if (usec_timeout == 0)
129*42a29337SGrzegorz Jaszczyk 		return data;
130*42a29337SGrzegorz Jaszczyk 
131*42a29337SGrzegorz Jaszczyk 	return 0;
132*42a29337SGrzegorz Jaszczyk }
133*42a29337SGrzegorz Jaszczyk 
134*42a29337SGrzegorz Jaszczyk static inline void reg_set(uintptr_t addr, uint32_t data, uint32_t mask)
135*42a29337SGrzegorz Jaszczyk {
136*42a29337SGrzegorz Jaszczyk 	debug("<atf>: WR to addr = 0x%lx, data = 0x%x (mask = 0x%x) - ",
137*42a29337SGrzegorz Jaszczyk 	      addr, data, mask);
138*42a29337SGrzegorz Jaszczyk 	debug("old value = 0x%x ==> ", mmio_read_32(addr));
139*42a29337SGrzegorz Jaszczyk 	mmio_clrsetbits_32(addr, mask, data);
140*42a29337SGrzegorz Jaszczyk 
141*42a29337SGrzegorz Jaszczyk 	debug("new val 0x%x\n", mmio_read_32(addr));
142*42a29337SGrzegorz Jaszczyk }
143*42a29337SGrzegorz Jaszczyk 
144*42a29337SGrzegorz Jaszczyk static inline void __unused reg_set16(uintptr_t addr, uint16_t data,
145*42a29337SGrzegorz Jaszczyk 				      uint16_t mask)
146*42a29337SGrzegorz Jaszczyk {
147*42a29337SGrzegorz Jaszczyk 
148*42a29337SGrzegorz Jaszczyk 	debug("<atf>: WR to addr = 0x%lx, data = 0x%x (mask = 0x%x) - ",
149*42a29337SGrzegorz Jaszczyk 	      addr, data, mask);
150*42a29337SGrzegorz Jaszczyk 	debug("old value = 0x%x ==> ", mmio_read_16(addr));
151*42a29337SGrzegorz Jaszczyk 	mmio_clrsetbits_16(addr, mask, data);
152*42a29337SGrzegorz Jaszczyk 
153*42a29337SGrzegorz Jaszczyk 	debug("new val 0x%x\n", mmio_read_16(addr));
154*42a29337SGrzegorz Jaszczyk }
155*42a29337SGrzegorz Jaszczyk 
156*42a29337SGrzegorz Jaszczyk #endif /* _PHY_COMPHY_COMMON_H */
157