xref: /rk3399_ARM-atf/drivers/marvell/comphy/phy-comphy-common.h (revision c3cf06f1a3a9b9ee8ac7a0ae505f95c45f7dca84)
142a29337SGrzegorz Jaszczyk /*
242a29337SGrzegorz Jaszczyk  * Copyright (C) 2018 Marvell International Ltd.
342a29337SGrzegorz Jaszczyk  *
442a29337SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
542a29337SGrzegorz Jaszczyk  * https://spdx.org/licenses
642a29337SGrzegorz Jaszczyk  */
742a29337SGrzegorz Jaszczyk 
842a29337SGrzegorz Jaszczyk /* Marvell CP110 ana A3700 common */
942a29337SGrzegorz Jaszczyk 
10*c3cf06f1SAntonio Nino Diaz #ifndef PHY_COMPHY_COMMON_H
11*c3cf06f1SAntonio Nino Diaz #define PHY_COMPHY_COMMON_H
1242a29337SGrzegorz Jaszczyk 
1342a29337SGrzegorz Jaszczyk /* #define DEBUG_COMPHY */
1442a29337SGrzegorz Jaszczyk #ifdef DEBUG_COMPHY
1542a29337SGrzegorz Jaszczyk #define debug(format...) printf(format)
1642a29337SGrzegorz Jaszczyk #else
1742a29337SGrzegorz Jaszczyk #define debug(format, arg...)
1842a29337SGrzegorz Jaszczyk #endif
1942a29337SGrzegorz Jaszczyk 
2042a29337SGrzegorz Jaszczyk /* A lane is described by 4 fields:
2142a29337SGrzegorz Jaszczyk  *      - bit 1~0 represent comphy polarity invert
2242a29337SGrzegorz Jaszczyk  *      - bit 7~2 represent comphy speed
2342a29337SGrzegorz Jaszczyk  *      - bit 11~8 represent unit index
2442a29337SGrzegorz Jaszczyk  *      - bit 16~12 represent mode
2542a29337SGrzegorz Jaszczyk  *      - bit 17 represent comphy indication of clock source
2642a29337SGrzegorz Jaszczyk  *      - bit 19-18 represents pcie width (in case of pcie comphy config.)
2742a29337SGrzegorz Jaszczyk  *      - bit 31~20 reserved
2842a29337SGrzegorz Jaszczyk  */
2942a29337SGrzegorz Jaszczyk 
3042a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_OFFSET	0
3142a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_LEN	2
3242a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_MASK	COMPHY_MASK(COMPHY_INVERT_OFFSET, \
3342a29337SGrzegorz Jaszczyk 						COMPHY_INVERT_LEN)
3442a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_OFFSET	(COMPHY_INVERT_OFFSET + COMPHY_INVERT_LEN)
3542a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_LEN	6
3642a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_MASK	COMPHY_MASK(COMPHY_SPEED_OFFSET, \
3742a29337SGrzegorz Jaszczyk 						COMPHY_SPEED_LEN)
3842a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_OFFSET	(COMPHY_SPEED_OFFSET + COMPHY_SPEED_LEN)
3942a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_LEN	4
4042a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_MASK	COMPHY_MASK(COMPHY_UNIT_ID_OFFSET, \
4142a29337SGrzegorz Jaszczyk 						COMPHY_UNIT_ID_LEN)
4242a29337SGrzegorz Jaszczyk #define COMPHY_MODE_OFFSET	(COMPHY_UNIT_ID_OFFSET + COMPHY_UNIT_ID_LEN)
4342a29337SGrzegorz Jaszczyk #define COMPHY_MODE_LEN		5
4442a29337SGrzegorz Jaszczyk #define COMPHY_MODE_MASK	COMPHY_MASK(COMPHY_MODE_OFFSET, COMPHY_MODE_LEN)
4542a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_OFFSET	(COMPHY_MODE_OFFSET + COMPHY_MODE_LEN)
4642a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_LEN	1
4742a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_MASK	COMPHY_MASK(COMPHY_CLK_SRC_OFFSET, \
4842a29337SGrzegorz Jaszczyk 						COMPHY_CLK_SRC_LEN)
4942a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_OFFSET	(COMPHY_CLK_SRC_OFFSET + COMPHY_CLK_SRC_LEN)
5042a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_LEN	3
5142a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_MASK	COMPHY_MASK(COMPHY_PCI_WIDTH_OFFSET, \
5242a29337SGrzegorz Jaszczyk 						COMPHY_PCI_WIDTH_LEN)
5342a29337SGrzegorz Jaszczyk 
5442a29337SGrzegorz Jaszczyk #define COMPHY_MASK(offset, len)	(((1 << (len)) - 1) << (offset))
5542a29337SGrzegorz Jaszczyk 
5642a29337SGrzegorz Jaszczyk /* Macro which extracts mode from lane description */
5742a29337SGrzegorz Jaszczyk #define COMPHY_GET_MODE(x)		(((x) & COMPHY_MODE_MASK) >> \
5842a29337SGrzegorz Jaszczyk 						COMPHY_MODE_OFFSET)
5942a29337SGrzegorz Jaszczyk /* Macro which extracts unit index from lane description */
6042a29337SGrzegorz Jaszczyk #define COMPHY_GET_ID(x)		(((x) & COMPHY_UNIT_ID_MASK) >> \
6142a29337SGrzegorz Jaszczyk 						COMPHY_UNIT_ID_OFFSET)
6242a29337SGrzegorz Jaszczyk /* Macro which extracts speed from lane description */
6342a29337SGrzegorz Jaszczyk #define COMPHY_GET_SPEED(x)		(((x) & COMPHY_SPEED_MASK) >> \
6442a29337SGrzegorz Jaszczyk 						COMPHY_SPEED_OFFSET)
6542a29337SGrzegorz Jaszczyk /* Macro which extracts clock source indication from lane description */
6642a29337SGrzegorz Jaszczyk #define COMPHY_GET_CLK_SRC(x)		(((x) & COMPHY_CLK_SRC_MASK) >> \
6742a29337SGrzegorz Jaszczyk 						COMPHY_CLK_SRC_OFFSET)
6842a29337SGrzegorz Jaszczyk /* Macro which extracts pcie width indication from lane description */
6942a29337SGrzegorz Jaszczyk #define COMPHY_GET_PCIE_WIDTH(x)	(((x) & COMPHY_PCI_WIDTH_MASK) >> \
7042a29337SGrzegorz Jaszczyk 						COMPHY_PCI_WIDTH_OFFSET)
7142a29337SGrzegorz Jaszczyk 
7242a29337SGrzegorz Jaszczyk /* Macro which extracts the polarity invert from lane description */
7342a29337SGrzegorz Jaszczyk #define COMPHY_GET_POLARITY_INVERT(x)	(((x) & COMPHY_INVERT_MASK) >> \
7442a29337SGrzegorz Jaszczyk 						COMPHY_INVERT_OFFSET)
7542a29337SGrzegorz Jaszczyk 
7642a29337SGrzegorz Jaszczyk 
7742a29337SGrzegorz Jaszczyk #define COMPHY_SATA_MODE	0x1
7842a29337SGrzegorz Jaszczyk #define COMPHY_SGMII_MODE	0x2	/* SGMII 1G */
7942a29337SGrzegorz Jaszczyk #define COMPHY_HS_SGMII_MODE	0x3	/* SGMII 2.5G */
8042a29337SGrzegorz Jaszczyk #define COMPHY_USB3H_MODE	0x4
8142a29337SGrzegorz Jaszczyk #define COMPHY_USB3D_MODE	0x5
8242a29337SGrzegorz Jaszczyk #define COMPHY_PCIE_MODE	0x6
8342a29337SGrzegorz Jaszczyk #define COMPHY_RXAUI_MODE	0x7
8442a29337SGrzegorz Jaszczyk #define COMPHY_XFI_MODE		0x8
8542a29337SGrzegorz Jaszczyk #define COMPHY_SFI_MODE		0x9
8642a29337SGrzegorz Jaszczyk #define COMPHY_USB3_MODE	0xa
8742a29337SGrzegorz Jaszczyk #define COMPHY_AP_MODE		0xb
8842a29337SGrzegorz Jaszczyk 
8942a29337SGrzegorz Jaszczyk #define	COMPHY_UNUSED		0xFFFFFFFF
9042a29337SGrzegorz Jaszczyk 
9142a29337SGrzegorz Jaszczyk /* Polarity invert macro */
9242a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_NO_INVERT	0
9342a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_TXD_INVERT	1
9442a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_RXD_INVERT	2
9542a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_ALL_INVERT	(COMPHY_POLARITY_TXD_INVERT | \
9642a29337SGrzegorz Jaszczyk 					 COMPHY_POLARITY_RXD_INVERT)
9742a29337SGrzegorz Jaszczyk 
9842a29337SGrzegorz Jaszczyk enum reg_width_type {
9942a29337SGrzegorz Jaszczyk 	REG_16BIT = 0,
10042a29337SGrzegorz Jaszczyk 	REG_32BIT,
10142a29337SGrzegorz Jaszczyk };
10242a29337SGrzegorz Jaszczyk 
10342a29337SGrzegorz Jaszczyk enum {
10442a29337SGrzegorz Jaszczyk 	COMPHY_LANE0 = 0,
10542a29337SGrzegorz Jaszczyk 	COMPHY_LANE1,
10642a29337SGrzegorz Jaszczyk 	COMPHY_LANE2,
10742a29337SGrzegorz Jaszczyk 	COMPHY_LANE3,
10842a29337SGrzegorz Jaszczyk 	COMPHY_LANE4,
10942a29337SGrzegorz Jaszczyk 	COMPHY_LANE5,
11042a29337SGrzegorz Jaszczyk 	COMPHY_LANE_MAX,
11142a29337SGrzegorz Jaszczyk };
11242a29337SGrzegorz Jaszczyk 
11342a29337SGrzegorz Jaszczyk static inline uint32_t polling_with_timeout(uintptr_t addr, uint32_t val,
11442a29337SGrzegorz Jaszczyk 					    uint32_t mask,
11542a29337SGrzegorz Jaszczyk 					    uint32_t usec_timeout,
11642a29337SGrzegorz Jaszczyk 					    enum reg_width_type type)
11742a29337SGrzegorz Jaszczyk {
11842a29337SGrzegorz Jaszczyk 	uint32_t data;
11942a29337SGrzegorz Jaszczyk 
12042a29337SGrzegorz Jaszczyk 	do {
12142a29337SGrzegorz Jaszczyk 		udelay(1);
12242a29337SGrzegorz Jaszczyk 		if (type == REG_16BIT)
12342a29337SGrzegorz Jaszczyk 			data = mmio_read_16(addr) & mask;
12442a29337SGrzegorz Jaszczyk 		else
12542a29337SGrzegorz Jaszczyk 			data = mmio_read_32(addr) & mask;
12642a29337SGrzegorz Jaszczyk 	} while (data != val  && --usec_timeout > 0);
12742a29337SGrzegorz Jaszczyk 
12842a29337SGrzegorz Jaszczyk 	if (usec_timeout == 0)
12942a29337SGrzegorz Jaszczyk 		return data;
13042a29337SGrzegorz Jaszczyk 
13142a29337SGrzegorz Jaszczyk 	return 0;
13242a29337SGrzegorz Jaszczyk }
13342a29337SGrzegorz Jaszczyk 
13442a29337SGrzegorz Jaszczyk static inline void reg_set(uintptr_t addr, uint32_t data, uint32_t mask)
13542a29337SGrzegorz Jaszczyk {
13642a29337SGrzegorz Jaszczyk 	debug("<atf>: WR to addr = 0x%lx, data = 0x%x (mask = 0x%x) - ",
13742a29337SGrzegorz Jaszczyk 	      addr, data, mask);
13842a29337SGrzegorz Jaszczyk 	debug("old value = 0x%x ==> ", mmio_read_32(addr));
13942a29337SGrzegorz Jaszczyk 	mmio_clrsetbits_32(addr, mask, data);
14042a29337SGrzegorz Jaszczyk 
14142a29337SGrzegorz Jaszczyk 	debug("new val 0x%x\n", mmio_read_32(addr));
14242a29337SGrzegorz Jaszczyk }
14342a29337SGrzegorz Jaszczyk 
14442a29337SGrzegorz Jaszczyk static inline void __unused reg_set16(uintptr_t addr, uint16_t data,
14542a29337SGrzegorz Jaszczyk 				      uint16_t mask)
14642a29337SGrzegorz Jaszczyk {
14742a29337SGrzegorz Jaszczyk 
14842a29337SGrzegorz Jaszczyk 	debug("<atf>: WR to addr = 0x%lx, data = 0x%x (mask = 0x%x) - ",
14942a29337SGrzegorz Jaszczyk 	      addr, data, mask);
15042a29337SGrzegorz Jaszczyk 	debug("old value = 0x%x ==> ", mmio_read_16(addr));
15142a29337SGrzegorz Jaszczyk 	mmio_clrsetbits_16(addr, mask, data);
15242a29337SGrzegorz Jaszczyk 
15342a29337SGrzegorz Jaszczyk 	debug("new val 0x%x\n", mmio_read_16(addr));
15442a29337SGrzegorz Jaszczyk }
15542a29337SGrzegorz Jaszczyk 
156*c3cf06f1SAntonio Nino Diaz #endif /* PHY_COMPHY_COMMON_H */
157