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