142a29337SGrzegorz Jaszczyk /*
2*95c26d64SMarek Behún * Copyright (C) 2018-2021 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
10c3cf06f1SAntonio Nino Diaz #ifndef PHY_COMPHY_COMMON_H
11c3cf06f1SAntonio 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
2655df84f9SIgal Liberman * - bit 20~18 represents pcie width (in case of pcie comphy config.)
2755df84f9SIgal Liberman * - bit 21 represents the source of the request (Linux/Bootloader),
2855df84f9SIgal Liberman * (reguired only for PCIe!)
2955df84f9SIgal Liberman * - bit 31~22 reserved
3042a29337SGrzegorz Jaszczyk */
3142a29337SGrzegorz Jaszczyk
3242a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_OFFSET 0
3342a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_LEN 2
3442a29337SGrzegorz Jaszczyk #define COMPHY_INVERT_MASK COMPHY_MASK(COMPHY_INVERT_OFFSET, \
3542a29337SGrzegorz Jaszczyk COMPHY_INVERT_LEN)
3642a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_OFFSET (COMPHY_INVERT_OFFSET + COMPHY_INVERT_LEN)
3742a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_LEN 6
3842a29337SGrzegorz Jaszczyk #define COMPHY_SPEED_MASK COMPHY_MASK(COMPHY_SPEED_OFFSET, \
3942a29337SGrzegorz Jaszczyk COMPHY_SPEED_LEN)
4042a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_OFFSET (COMPHY_SPEED_OFFSET + COMPHY_SPEED_LEN)
4142a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_LEN 4
4242a29337SGrzegorz Jaszczyk #define COMPHY_UNIT_ID_MASK COMPHY_MASK(COMPHY_UNIT_ID_OFFSET, \
4342a29337SGrzegorz Jaszczyk COMPHY_UNIT_ID_LEN)
4442a29337SGrzegorz Jaszczyk #define COMPHY_MODE_OFFSET (COMPHY_UNIT_ID_OFFSET + COMPHY_UNIT_ID_LEN)
4542a29337SGrzegorz Jaszczyk #define COMPHY_MODE_LEN 5
4642a29337SGrzegorz Jaszczyk #define COMPHY_MODE_MASK COMPHY_MASK(COMPHY_MODE_OFFSET, COMPHY_MODE_LEN)
4742a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_OFFSET (COMPHY_MODE_OFFSET + COMPHY_MODE_LEN)
4842a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_LEN 1
4942a29337SGrzegorz Jaszczyk #define COMPHY_CLK_SRC_MASK COMPHY_MASK(COMPHY_CLK_SRC_OFFSET, \
5042a29337SGrzegorz Jaszczyk COMPHY_CLK_SRC_LEN)
5142a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_OFFSET (COMPHY_CLK_SRC_OFFSET + COMPHY_CLK_SRC_LEN)
5242a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_LEN 3
5342a29337SGrzegorz Jaszczyk #define COMPHY_PCI_WIDTH_MASK COMPHY_MASK(COMPHY_PCI_WIDTH_OFFSET, \
5442a29337SGrzegorz Jaszczyk COMPHY_PCI_WIDTH_LEN)
5555df84f9SIgal Liberman #define COMPHY_PCI_CALLER_OFFSET \
5655df84f9SIgal Liberman (COMPHY_PCI_WIDTH_OFFSET + COMPHY_PCI_WIDTH_LEN)
5755df84f9SIgal Liberman #define COMPHY_PCI_CALLER_LEN 1
5855df84f9SIgal Liberman #define COMPHY_PCI_CALLER_MASK COMPHY_MASK(COMPHY_PCI_CALLER_OFFSET, \
5955df84f9SIgal Liberman COMPHY_PCI_CALLER_LEN)
6042a29337SGrzegorz Jaszczyk
6142a29337SGrzegorz Jaszczyk #define COMPHY_MASK(offset, len) (((1 << (len)) - 1) << (offset))
6242a29337SGrzegorz Jaszczyk
6342a29337SGrzegorz Jaszczyk /* Macro which extracts mode from lane description */
6442a29337SGrzegorz Jaszczyk #define COMPHY_GET_MODE(x) (((x) & COMPHY_MODE_MASK) >> \
6542a29337SGrzegorz Jaszczyk COMPHY_MODE_OFFSET)
6642a29337SGrzegorz Jaszczyk /* Macro which extracts unit index from lane description */
6742a29337SGrzegorz Jaszczyk #define COMPHY_GET_ID(x) (((x) & COMPHY_UNIT_ID_MASK) >> \
6842a29337SGrzegorz Jaszczyk COMPHY_UNIT_ID_OFFSET)
6942a29337SGrzegorz Jaszczyk /* Macro which extracts speed from lane description */
7042a29337SGrzegorz Jaszczyk #define COMPHY_GET_SPEED(x) (((x) & COMPHY_SPEED_MASK) >> \
7142a29337SGrzegorz Jaszczyk COMPHY_SPEED_OFFSET)
7242a29337SGrzegorz Jaszczyk /* Macro which extracts clock source indication from lane description */
7342a29337SGrzegorz Jaszczyk #define COMPHY_GET_CLK_SRC(x) (((x) & COMPHY_CLK_SRC_MASK) >> \
7442a29337SGrzegorz Jaszczyk COMPHY_CLK_SRC_OFFSET)
7542a29337SGrzegorz Jaszczyk /* Macro which extracts pcie width indication from lane description */
7642a29337SGrzegorz Jaszczyk #define COMPHY_GET_PCIE_WIDTH(x) (((x) & COMPHY_PCI_WIDTH_MASK) >> \
7742a29337SGrzegorz Jaszczyk COMPHY_PCI_WIDTH_OFFSET)
7842a29337SGrzegorz Jaszczyk
7955df84f9SIgal Liberman /* Macro which extracts the caller for pcie power on from lane description */
8055df84f9SIgal Liberman #define COMPHY_GET_CALLER(x) (((x) & COMPHY_PCI_CALLER_MASK) >> \
8155df84f9SIgal Liberman COMPHY_PCI_CALLER_OFFSET)
8255df84f9SIgal Liberman
8342a29337SGrzegorz Jaszczyk /* Macro which extracts the polarity invert from lane description */
8442a29337SGrzegorz Jaszczyk #define COMPHY_GET_POLARITY_INVERT(x) (((x) & COMPHY_INVERT_MASK) >> \
8542a29337SGrzegorz Jaszczyk COMPHY_INVERT_OFFSET)
8642a29337SGrzegorz Jaszczyk
8742a29337SGrzegorz Jaszczyk
8842a29337SGrzegorz Jaszczyk #define COMPHY_SATA_MODE 0x1
8942a29337SGrzegorz Jaszczyk #define COMPHY_SGMII_MODE 0x2 /* SGMII 1G */
90a669983cSPali Rohár #define COMPHY_2500BASEX_MODE 0x3 /* 2500Base-X */
9142a29337SGrzegorz Jaszczyk #define COMPHY_USB3H_MODE 0x4
9242a29337SGrzegorz Jaszczyk #define COMPHY_USB3D_MODE 0x5
9342a29337SGrzegorz Jaszczyk #define COMPHY_PCIE_MODE 0x6
9442a29337SGrzegorz Jaszczyk #define COMPHY_RXAUI_MODE 0x7
9542a29337SGrzegorz Jaszczyk #define COMPHY_XFI_MODE 0x8
9642a29337SGrzegorz Jaszczyk #define COMPHY_SFI_MODE 0x9
9742a29337SGrzegorz Jaszczyk #define COMPHY_USB3_MODE 0xa
9842a29337SGrzegorz Jaszczyk #define COMPHY_AP_MODE 0xb
9942a29337SGrzegorz Jaszczyk
10042a29337SGrzegorz Jaszczyk #define COMPHY_UNUSED 0xFFFFFFFF
10142a29337SGrzegorz Jaszczyk
10242a29337SGrzegorz Jaszczyk /* Polarity invert macro */
10342a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_NO_INVERT 0
10442a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_TXD_INVERT 1
10542a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_RXD_INVERT 2
10642a29337SGrzegorz Jaszczyk #define COMPHY_POLARITY_ALL_INVERT (COMPHY_POLARITY_TXD_INVERT | \
10742a29337SGrzegorz Jaszczyk COMPHY_POLARITY_RXD_INVERT)
10842a29337SGrzegorz Jaszczyk
10942a29337SGrzegorz Jaszczyk enum reg_width_type {
11042a29337SGrzegorz Jaszczyk REG_16BIT = 0,
11142a29337SGrzegorz Jaszczyk REG_32BIT,
11242a29337SGrzegorz Jaszczyk };
11342a29337SGrzegorz Jaszczyk
11442a29337SGrzegorz Jaszczyk enum {
11542a29337SGrzegorz Jaszczyk COMPHY_LANE0 = 0,
11642a29337SGrzegorz Jaszczyk COMPHY_LANE1,
11742a29337SGrzegorz Jaszczyk COMPHY_LANE2,
11842a29337SGrzegorz Jaszczyk COMPHY_LANE3,
11942a29337SGrzegorz Jaszczyk COMPHY_LANE4,
12042a29337SGrzegorz Jaszczyk COMPHY_LANE5,
12142a29337SGrzegorz Jaszczyk COMPHY_LANE_MAX,
12242a29337SGrzegorz Jaszczyk };
12342a29337SGrzegorz Jaszczyk
polling_with_timeout(uintptr_t addr,uint32_t val,uint32_t mask,uint32_t usec_timeout,enum reg_width_type type)12442a29337SGrzegorz Jaszczyk static inline uint32_t polling_with_timeout(uintptr_t addr, uint32_t val,
12542a29337SGrzegorz Jaszczyk uint32_t mask,
12642a29337SGrzegorz Jaszczyk uint32_t usec_timeout,
12742a29337SGrzegorz Jaszczyk enum reg_width_type type)
12842a29337SGrzegorz Jaszczyk {
12942a29337SGrzegorz Jaszczyk uint32_t data;
13042a29337SGrzegorz Jaszczyk
13142a29337SGrzegorz Jaszczyk do {
13242a29337SGrzegorz Jaszczyk udelay(1);
13342a29337SGrzegorz Jaszczyk if (type == REG_16BIT)
13442a29337SGrzegorz Jaszczyk data = mmio_read_16(addr) & mask;
13542a29337SGrzegorz Jaszczyk else
13642a29337SGrzegorz Jaszczyk data = mmio_read_32(addr) & mask;
13742a29337SGrzegorz Jaszczyk } while (data != val && --usec_timeout > 0);
13842a29337SGrzegorz Jaszczyk
13942a29337SGrzegorz Jaszczyk if (usec_timeout == 0)
14042a29337SGrzegorz Jaszczyk return data;
14142a29337SGrzegorz Jaszczyk
14242a29337SGrzegorz Jaszczyk return 0;
14342a29337SGrzegorz Jaszczyk }
14442a29337SGrzegorz Jaszczyk
reg_set(uintptr_t addr,uint32_t data,uint32_t mask)14542a29337SGrzegorz Jaszczyk static inline void reg_set(uintptr_t addr, uint32_t data, uint32_t mask)
14642a29337SGrzegorz Jaszczyk {
14742a29337SGrzegorz Jaszczyk debug("<atf>: WR to addr = 0x%lx, data = 0x%x (mask = 0x%x) - ",
14842a29337SGrzegorz Jaszczyk addr, data, mask);
14942a29337SGrzegorz Jaszczyk debug("old value = 0x%x ==> ", mmio_read_32(addr));
150*95c26d64SMarek Behún mmio_clrsetbits_32(addr, mask, data & mask);
15142a29337SGrzegorz Jaszczyk
15242a29337SGrzegorz Jaszczyk debug("new val 0x%x\n", mmio_read_32(addr));
15342a29337SGrzegorz Jaszczyk }
15442a29337SGrzegorz Jaszczyk
reg_set16(uintptr_t addr,uint16_t data,uint16_t mask)15542a29337SGrzegorz Jaszczyk static inline void __unused reg_set16(uintptr_t addr, uint16_t data,
15642a29337SGrzegorz Jaszczyk uint16_t mask)
15742a29337SGrzegorz Jaszczyk {
15842a29337SGrzegorz Jaszczyk
15942a29337SGrzegorz Jaszczyk debug("<atf>: WR to addr = 0x%lx, data = 0x%x (mask = 0x%x) - ",
16042a29337SGrzegorz Jaszczyk addr, data, mask);
16142a29337SGrzegorz Jaszczyk debug("old value = 0x%x ==> ", mmio_read_16(addr));
162*95c26d64SMarek Behún mmio_clrsetbits_16(addr, mask, data & mask);
16342a29337SGrzegorz Jaszczyk
16442a29337SGrzegorz Jaszczyk debug("new val 0x%x\n", mmio_read_16(addr));
16542a29337SGrzegorz Jaszczyk }
16642a29337SGrzegorz Jaszczyk
167c3cf06f1SAntonio Nino Diaz #endif /* PHY_COMPHY_COMMON_H */
168