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 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 26*55df84f9SIgal Liberman * - bit 20~18 represents pcie width (in case of pcie comphy config.) 27*55df84f9SIgal Liberman * - bit 21 represents the source of the request (Linux/Bootloader), 28*55df84f9SIgal Liberman * (reguired only for PCIe!) 29*55df84f9SIgal 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) 55*55df84f9SIgal Liberman #define COMPHY_PCI_CALLER_OFFSET \ 56*55df84f9SIgal Liberman (COMPHY_PCI_WIDTH_OFFSET + COMPHY_PCI_WIDTH_LEN) 57*55df84f9SIgal Liberman #define COMPHY_PCI_CALLER_LEN 1 58*55df84f9SIgal Liberman #define COMPHY_PCI_CALLER_MASK COMPHY_MASK(COMPHY_PCI_CALLER_OFFSET, \ 59*55df84f9SIgal 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 79*55df84f9SIgal Liberman /* Macro which extracts the caller for pcie power on from lane description */ 80*55df84f9SIgal Liberman #define COMPHY_GET_CALLER(x) (((x) & COMPHY_PCI_CALLER_MASK) >> \ 81*55df84f9SIgal Liberman COMPHY_PCI_CALLER_OFFSET) 82*55df84f9SIgal 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 */ 9042a29337SGrzegorz Jaszczyk #define COMPHY_HS_SGMII_MODE 0x3 /* SGMII 2.5G */ 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 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 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)); 15042a29337SGrzegorz Jaszczyk mmio_clrsetbits_32(addr, mask, data); 15142a29337SGrzegorz Jaszczyk 15242a29337SGrzegorz Jaszczyk debug("new val 0x%x\n", mmio_read_32(addr)); 15342a29337SGrzegorz Jaszczyk } 15442a29337SGrzegorz Jaszczyk 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)); 16242a29337SGrzegorz Jaszczyk mmio_clrsetbits_16(addr, mask, data); 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