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