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