openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

commit 18c0f039b03efec68676219ce455cb951828e6b4
parent 87605c7e8d1cddf8947555c63e1537a32a56fd7e
Author: Broadcom SDK Release <sdk.releases@broadcom.com>
Date:   Sun, 10 Feb 2019 18:04:22 -0800

SDK-168646: Implementation of "hotswap_manager” configuration sequence for ho...

Devices: 56980_A0
Module: Warmboot

Implementation of "hotswap_manager” configuration sequence for hot swap
recovery.

Diffstat:
Msdk-6.5.16/src/soc/esw/drv.c | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 59 insertions(+), 8 deletions(-)

diff --git a/sdk-6.5.16/src/soc/esw/drv.c b/sdk-6.5.16/src/soc/esw/drv.c @@ -8806,6 +8806,9 @@ soc_pcie_host_intf_init(int unit) SOC_IF_ERROR_RETURN( WRITE_PAXB_0_PAXB_HOTSWAP_CTRLr(unit, rval)); } + /* Disable iProc reset on PCie link down event */ + SOC_IF_ERROR_RETURN + (WRITE_PAXB_0_RESET_ENABLE_IN_PCIE_LINK_DOWNr(unit, 0x0)); } #endif } @@ -8820,14 +8823,16 @@ soc_pci_hotswap_recover(int unit) int rv = SOC_E_NONE; #ifdef BCM_CMICX_SUPPORT - int hot_swap_usec = 10; + int hot_swap_usec = 100; uint32 hot_swap_cause = 0; uint32 rval = 0; + uint32 int_en; + if (soc_feature(unit, soc_feature_cmicx) && (soc_cm_get_bus_type(unit) & SOC_PCI_DEV_TYPE)) { - /* Suggested default time out is 10 usec for FSM_STATE to be DUMMYRESP or IDLE */ + /* Suggested default time out is 100 usec for FSM_STATE to be DUMMYRESP or IDLE */ hot_swap_usec = soc_property_get(unit, spn_PCIE_HOT_SWAP_TIMEOUT_USEC, - 10); + 100); LOG_INFO(BSL_LS_SOC_COMMON, (BSL_META_U(unit, "HOT_SWAP_TIMEOUT_USEC = %d\n"), hot_swap_usec)); @@ -8842,9 +8847,22 @@ soc_pci_hotswap_recover(int unit) SOC_IF_ERROR_RETURN(READ_PAXB_0_PAXB_HOTSWAP_STATr(unit, &rval)); hot_swap_cause = soc_reg_field_get(unit, PAXB_0_PAXB_HOTSWAP_STATr, rval, HOTSWAP_CAUSEf); + fsm_state = soc_reg_field_get(unit, PAXB_0_PAXB_HOTSWAP_STATr, + rval, FSM_STATEf); + + /* Hot Swap status before Recovery */ + LOG_INFO(BSL_LS_SOC_COMMON, (BSL_META_U(unit, + "Hot Swap status before Recovery = 0x%x\n"), + rval)); if (hot_swap_cause != 0) { - /* Poll for the HotSwap FSM_STATE to be DUMMYRESP or IDLE */ + /* Clear and Disable PAXB interrupts */ + SOC_IF_ERROR_RETURN(READ_PAXB_0_PAXB_INTR_STATUSr(unit, &rval)); + SOC_IF_ERROR_RETURN(WRITE_PAXB_0_PAXB_INTR_STATUSr(unit, rval)); + SOC_IF_ERROR_RETURN(READ_PAXB_0_PAXB_INTR_ENr(unit, &int_en)); + SOC_IF_ERROR_RETURN(WRITE_PAXB_0_PAXB_INTR_ENr(unit, 0)); + + /* Poll for the HotSwap FSM_STATE to be DUMMYRESP or IDLE */ stime = sal_time_usecs(); while (!soc_timeout_check(&to)) { SOC_IF_ERROR_RETURN(READ_PAXB_0_PAXB_HOTSWAP_STATr(unit, &rval)); @@ -8886,6 +8904,8 @@ soc_pci_hotswap_recover(int unit) WRITE_PAXB_0_PAXB_HOTSWAP_CTRLr(unit, rval)); } + SDK_CONFIG_MEMORY_BARRIER; + /* Wait for PAXB_RDY bit to get set in HOTSWAP_STAT register to ensure that PCIE * subsystem is ready to accept new requests */ @@ -8898,14 +8918,43 @@ soc_pci_hotswap_recover(int unit) ready = soc_reg_field_get(unit, PAXB_0_PAXB_HOTSWAP_STATr, rval, PAXB_RDYf); if (ready) { - break; + LOG_INFO(BSL_LS_SOC_COMMON, (BSL_META_U(unit, + "PAXB Ready to accept new requests.\n"))); + /* Reset PAXB_RDY and HOTSWAP_CAUSE bit */ + rval = 0; + soc_reg_field_set(unit, PAXB_0_PAXB_HOTSWAP_STATr, + &rval, PAXB_RDYf, 0x01); + soc_reg_field_set(unit, PAXB_0_PAXB_HOTSWAP_STATr, + &rval, HOTSWAP_CAUSEf, 0x07); + SOC_IF_ERROR_RETURN( + WRITE_PAXB_0_PAXB_HOTSWAP_STATr(unit, rval)); + break; } } etime = sal_time_usecs(); + /* Hot Swap status after Recovery */ + SOC_IF_ERROR_RETURN(READ_PAXB_0_PAXB_HOTSWAP_STATr(unit, &rval)); + LOG_INFO(BSL_LS_SOC_COMMON, (BSL_META_U(unit, + "Hot Swap status after Recovery = 0x%x\n"), + rval)); + /* Clear and Restore PAXB interrupts */ + SOC_IF_ERROR_RETURN(READ_PAXB_0_PAXB_INTR_STATUSr(unit, &rval)); + SOC_IF_ERROR_RETURN(WRITE_PAXB_0_PAXB_INTR_STATUSr(unit, rval)); + SOC_IF_ERROR_RETURN(WRITE_PAXB_0_PAXB_INTR_ENr(unit, int_en)); + /* Check if time out has happened */ if (SAL_USECS_SUB(etime, stime) > hot_swap_usec) { LOG_ERROR(BSL_LS_SOC_COMMON, (BSL_META_U(unit, "Hot Swap Wait Time Out for READY\n"))); + /* Debug information */ + SOC_IF_ERROR_RETURN + (READ_CMICX_M0_IDM_IDM_RESET_STATUSr(unit, &rval)); + LOG_INFO(BSL_LS_SOC_COMMON, (BSL_META_U(unit, + "CMICX_M0_IDM_IDM_RESET_STATUSr=0x%x \r\n"), rval)); + SOC_IF_ERROR_RETURN + (READ_AXI_PCIE_S0_IDM_IDM_RESET_STATUSr(unit, &rval)); + LOG_INFO(BSL_LS_SOC_COMMON, (BSL_META_U(unit, + "AXI_PCIE_S0_IDM_IDM_RESET_STATUSr=0x%x \r\n"), rval)); rv = SOC_E_TIMEOUT; SOC_IF_ERROR_RETURN(rv); } else { @@ -9017,6 +9066,11 @@ soc_do_init(int unit, int reset) */ sal_dpc_cancel_and_disable(INT_TO_PTR(unit)); + /* Initialize PCI Host interface */ +#if defined(BCM_CMICM_SUPPORT) || defined(BCM_CMICX_SUPPORT) + SOC_IF_ERROR_RETURN(soc_pcie_host_intf_init(unit)); +#endif + /* Check for PCI hot swap and recover */ SOC_IF_ERROR_RETURN(soc_pci_hotswap_recover(unit)); @@ -9502,9 +9556,6 @@ soc_do_init(int unit, int reset) if (reset && !SOC_WARM_BOOT(unit) && !SOC_IS_RCPU_ONLY(unit)) { SOC_IF_ERROR_RETURN(soc_reset(unit)); -#if defined(BCM_CMICM_SUPPORT) || defined(BCM_CMICX_SUPPORT) - SOC_IF_ERROR_RETURN(soc_pcie_host_intf_init(unit)); -#endif } #ifdef BCM_WARM_BOOT_SUPPORT