Commit 550a06df authored by Alex Evraev's avatar Alex Evraev Committed by Manish Pandey
Browse files

drivers: marvell: comphy: add rx training on 10G port



This patch forces rx training on 10G ports
as part of comphy_smc call from Linux.
Signed-off-by: default avatarAlex Evraev <alexev@marvell.com>
Change-Id: Iebe6ea7c8b21cbdce5c466c8a69b92e9d7c8a8ca
Reviewed-on: https://sj1git1.cavium.com/c/IP/SW/boot/atf/+/30763

Tested-by: default avatarsa_ip-sw-jenkins <sa_ip-sw-jenkins@marvell.com>
Reviewed-by: default avatarStefan Chulski <stefanc@marvell.com>
Reviewed-by: default avatarNadav Haklai <nadavh@marvell.com>
parent b5a06637
...@@ -61,6 +61,11 @@ ...@@ -61,6 +61,11 @@
SAR_RST_PCIE1_CLOCK_CONFIG_CP1_OFFSET) SAR_RST_PCIE1_CLOCK_CONFIG_CP1_OFFSET)
#define SAR_STATUS_0_REG 200 #define SAR_STATUS_0_REG 200
#define DFX_FROM_COMPHY_ADDR(x) ((x & ~0xffffff) + DFX_BASE) #define DFX_FROM_COMPHY_ADDR(x) ((x & ~0xffffff) + DFX_BASE)
/* Common Phy training */
#define COMPHY_TRX_TRAIN_COMPHY_OFFS 0x1000
#define COMPHY_TRX_TRAIN_RX_TRAIN_ENABLE 0x1
#define COMPHY_TRX_RELATIVE_ADDR(comphy_index) (comphy_train_base + \
(comphy_index) * COMPHY_TRX_TRAIN_COMPHY_OFFS)
/* The same Units Soft Reset Config register are accessed in all PCIe ports /* The same Units Soft Reset Config register are accessed in all PCIe ports
* initialization, so a spin lock is defined in case when more than 1 CPUs * initialization, so a spin lock is defined in case when more than 1 CPUs
...@@ -829,7 +834,8 @@ static int mvebu_cp110_comphy_sgmii_power_on(uint64_t comphy_base, ...@@ -829,7 +834,8 @@ static int mvebu_cp110_comphy_sgmii_power_on(uint64_t comphy_base,
static int mvebu_cp110_comphy_xfi_power_on(uint64_t comphy_base, static int mvebu_cp110_comphy_xfi_power_on(uint64_t comphy_base,
uint8_t comphy_index, uint8_t comphy_index,
uint32_t comphy_mode) uint32_t comphy_mode,
uint64_t comphy_train_base)
{ {
uintptr_t hpipe_addr, sd_ip_addr, comphy_addr, addr; uintptr_t hpipe_addr, sd_ip_addr, comphy_addr, addr;
uint32_t mask, data, speed = COMPHY_GET_SPEED(comphy_mode); uint32_t mask, data, speed = COMPHY_GET_SPEED(comphy_mode);
...@@ -837,7 +843,6 @@ static int mvebu_cp110_comphy_xfi_power_on(uint64_t comphy_base, ...@@ -837,7 +843,6 @@ static int mvebu_cp110_comphy_xfi_power_on(uint64_t comphy_base,
uint8_t ap_nr, cp_nr; uint8_t ap_nr, cp_nr;
debug_enter(); debug_enter();
mvebu_cp110_get_ap_and_cp_nr(&ap_nr, &cp_nr, comphy_base); mvebu_cp110_get_ap_and_cp_nr(&ap_nr, &cp_nr, comphy_base);
if (rx_trainng_done[ap_nr][cp_nr][comphy_index]) { if (rx_trainng_done[ap_nr][cp_nr][comphy_index]) {
...@@ -1234,6 +1239,14 @@ static int mvebu_cp110_comphy_xfi_power_on(uint64_t comphy_base, ...@@ -1234,6 +1239,14 @@ static int mvebu_cp110_comphy_xfi_power_on(uint64_t comphy_base,
data |= 0x1 << SD_EXTERNAL_CONFIG1_RF_RESET_IN_OFFSET; data |= 0x1 << SD_EXTERNAL_CONFIG1_RF_RESET_IN_OFFSET;
reg_set(sd_ip_addr + SD_EXTERNAL_CONFIG1_REG, data, mask); reg_set(sd_ip_addr + SD_EXTERNAL_CONFIG1_REG, data, mask);
/* Force rx training on 10G port */
data = mmio_read_32(COMPHY_TRX_RELATIVE_ADDR(comphy_index));
data |= COMPHY_TRX_TRAIN_RX_TRAIN_ENABLE;
mmio_write_32(COMPHY_TRX_RELATIVE_ADDR(comphy_index), data);
mdelay(200);
data &= ~COMPHY_TRX_TRAIN_RX_TRAIN_ENABLE;
mmio_write_32(COMPHY_TRX_RELATIVE_ADDR(comphy_index), data);
debug_exit(); debug_exit();
return ret; return ret;
...@@ -2348,8 +2361,10 @@ int mvebu_cp110_comphy_digital_reset(uint64_t comphy_base, ...@@ -2348,8 +2361,10 @@ int mvebu_cp110_comphy_digital_reset(uint64_t comphy_base,
return 0; return 0;
} }
int mvebu_cp110_comphy_power_on(uint64_t comphy_base, uint8_t comphy_index, int mvebu_cp110_comphy_power_on(uint64_t comphy_base,
uint64_t comphy_mode) uint8_t comphy_index,
uint64_t comphy_mode,
uint64_t comphy_train_base)
{ {
int mode = COMPHY_GET_MODE(comphy_mode); int mode = COMPHY_GET_MODE(comphy_mode);
int err = 0; int err = 0;
...@@ -2373,7 +2388,8 @@ int mvebu_cp110_comphy_power_on(uint64_t comphy_base, uint8_t comphy_index, ...@@ -2373,7 +2388,8 @@ int mvebu_cp110_comphy_power_on(uint64_t comphy_base, uint8_t comphy_index,
case (COMPHY_SFI_MODE): case (COMPHY_SFI_MODE):
err = mvebu_cp110_comphy_xfi_power_on(comphy_base, err = mvebu_cp110_comphy_xfi_power_on(comphy_base,
comphy_index, comphy_index,
comphy_mode); comphy_mode,
comphy_train_base);
break; break;
case (COMPHY_PCIE_MODE): case (COMPHY_PCIE_MODE):
err = mvebu_cp110_comphy_pcie_power_on(comphy_base, err = mvebu_cp110_comphy_pcie_power_on(comphy_base,
......
...@@ -89,8 +89,9 @@ int mvebu_cp110_comphy_is_pll_locked(uint64_t comphy_base, ...@@ -89,8 +89,9 @@ int mvebu_cp110_comphy_is_pll_locked(uint64_t comphy_base,
uint8_t comphy_index); uint8_t comphy_index);
int mvebu_cp110_comphy_power_off(uint64_t comphy_base, int mvebu_cp110_comphy_power_off(uint64_t comphy_base,
uint8_t comphy_index, uint64_t comphy_mode); uint8_t comphy_index, uint64_t comphy_mode);
int mvebu_cp110_comphy_power_on(uint64_t comphy_base, int mvebu_cp110_comphy_power_on(uint64_t comphy_base, uint8_t comphy_index,
uint8_t comphy_index, uint64_t comphy_mode); uint64_t comphy_mode,
uint64_t comphy_train_base);
int mvebu_cp110_comphy_xfi_rx_training(uint64_t comphy_base, int mvebu_cp110_comphy_xfi_rx_training(uint64_t comphy_base,
uint8_t comphy_index); uint8_t comphy_index);
int mvebu_cp110_comphy_digital_reset(uint64_t comphy_base, uint8_t comphy_index, int mvebu_cp110_comphy_digital_reset(uint64_t comphy_base, uint8_t comphy_index,
......
...@@ -50,6 +50,9 @@ ...@@ -50,6 +50,9 @@
#define MVEBU_COMPHY_OFFSET 0x441000 #define MVEBU_COMPHY_OFFSET 0x441000
#define MVEBU_CP_BASE_MASK (~0xffffff) #define MVEBU_CP_BASE_MASK (~0xffffff)
/* Common PHY register */
#define COMPHY_TRX_TRAIN_CTRL_REG_0_OFFS 0x120a2c
/* This macro is used to identify COMPHY related calls from SMC function ID */ /* This macro is used to identify COMPHY related calls from SMC function ID */
#define is_comphy_fid(fid) \ #define is_comphy_fid(fid) \
((fid) >= MV_SIP_COMPHY_POWER_ON && (fid) <= MV_SIP_COMPHY_DIG_RESET) ((fid) >= MV_SIP_COMPHY_POWER_ON && (fid) <= MV_SIP_COMPHY_DIG_RESET)
...@@ -76,7 +79,7 @@ uintptr_t mrvl_sip_smc_handler(uint32_t smc_fid, ...@@ -76,7 +79,7 @@ uintptr_t mrvl_sip_smc_handler(uint32_t smc_fid,
void *handle, void *handle,
u_register_t flags) u_register_t flags)
{ {
u_register_t ret, read; u_register_t ret, read, x5 = x1;
uint32_t w2[2] = {0, 0}; uint32_t w2[2] = {0, 0};
int i; int i;
...@@ -91,6 +94,7 @@ uintptr_t mrvl_sip_smc_handler(uint32_t smc_fid, ...@@ -91,6 +94,7 @@ uintptr_t mrvl_sip_smc_handler(uint32_t smc_fid,
SMC_RET1(handle, SMC_UNK); SMC_RET1(handle, SMC_UNK);
} }
x5 = x1 + COMPHY_TRX_TRAIN_CTRL_REG_0_OFFS;
x1 += MVEBU_COMPHY_OFFSET; x1 += MVEBU_COMPHY_OFFSET;
if (x2 >= MAX_LANE_NR) { if (x2 >= MAX_LANE_NR) {
...@@ -105,7 +109,7 @@ uintptr_t mrvl_sip_smc_handler(uint32_t smc_fid, ...@@ -105,7 +109,7 @@ uintptr_t mrvl_sip_smc_handler(uint32_t smc_fid,
/* Comphy related FID's */ /* Comphy related FID's */
case MV_SIP_COMPHY_POWER_ON: case MV_SIP_COMPHY_POWER_ON:
/* x1: comphy_base, x2: comphy_index, x3: comphy_mode */ /* x1: comphy_base, x2: comphy_index, x3: comphy_mode */
ret = mvebu_cp110_comphy_power_on(x1, x2, x3); ret = mvebu_cp110_comphy_power_on(x1, x2, x3, x5);
SMC_RET1(handle, ret); SMC_RET1(handle, ret);
case MV_SIP_COMPHY_POWER_OFF: case MV_SIP_COMPHY_POWER_OFF:
/* x1: comphy_base, x2: comphy_index */ /* x1: comphy_base, x2: comphy_index */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment