Commit 227fab90 authored by Krishna Gudipati's avatar Krishna Gudipati Committed by James Bottomley

[SCSI] bfa: Flash Controller PLL initialization fixes

- Made changes to check the flash controller status before IOC initialization.
- Made changes to poll on the FLASH_STS_REG bit to check if the flash controller
  initialization is completed during the PLL init.
Signed-off-by: default avatarVijaya Mohan Guvva <vmohan@brocade.com>
Signed-off-by: default avatarKrishna Gudipati <kgudipat@brocade.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 7ac83b1f
...@@ -744,25 +744,6 @@ bfa_ioc_ct2_mem_init(void __iomem *rb) ...@@ -744,25 +744,6 @@ bfa_ioc_ct2_mem_init(void __iomem *rb)
void void
bfa_ioc_ct2_mac_reset(void __iomem *rb) bfa_ioc_ct2_mac_reset(void __iomem *rb)
{ {
u32 r32;
bfa_ioc_ct2_sclk_init(rb);
bfa_ioc_ct2_lclk_init(rb);
/*
* release soft reset on s_clk & l_clk
*/
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET,
(rb + CT2_APP_PLL_SCLK_CTL_REG));
/*
* release soft reset on s_clk & l_clk
*/
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET,
(rb + CT2_APP_PLL_LCLK_CTL_REG));
/* put port0, port1 MAC & AHB in reset */ /* put port0, port1 MAC & AHB in reset */
writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET), writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET),
rb + CT2_CSI_MAC_CONTROL_REG(0)); rb + CT2_CSI_MAC_CONTROL_REG(0));
...@@ -770,8 +751,21 @@ bfa_ioc_ct2_mac_reset(void __iomem *rb) ...@@ -770,8 +751,21 @@ bfa_ioc_ct2_mac_reset(void __iomem *rb)
rb + CT2_CSI_MAC_CONTROL_REG(1)); rb + CT2_CSI_MAC_CONTROL_REG(1));
} }
static void
bfa_ioc_ct2_enable_flash(void __iomem *rb)
{
u32 r32;
r32 = readl((rb + PSS_GPIO_OUT_REG));
writel(r32 & ~1, (rb + PSS_GPIO_OUT_REG));
r32 = readl((rb + PSS_GPIO_OE_REG));
writel(r32 | 1, (rb + PSS_GPIO_OE_REG));
}
#define CT2_NFC_MAX_DELAY 1000 #define CT2_NFC_MAX_DELAY 1000
#define CT2_NFC_VER_VALID 0x143 #define CT2_NFC_PAUSE_MAX_DELAY 4000
#define CT2_NFC_VER_VALID 0x147
#define CT2_NFC_STATE_RUNNING 0x20000001
#define BFA_IOC_PLL_POLL 1000000 #define BFA_IOC_PLL_POLL 1000000
static bfa_boolean_t static bfa_boolean_t
...@@ -786,6 +780,20 @@ bfa_ioc_ct2_nfc_halted(void __iomem *rb) ...@@ -786,6 +780,20 @@ bfa_ioc_ct2_nfc_halted(void __iomem *rb)
return BFA_FALSE; return BFA_FALSE;
} }
static void
bfa_ioc_ct2_nfc_halt(void __iomem *rb)
{
int i;
writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_SET_REG);
for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
if (bfa_ioc_ct2_nfc_halted(rb))
break;
udelay(1000);
}
WARN_ON(!bfa_ioc_ct2_nfc_halted(rb));
}
static void static void
bfa_ioc_ct2_nfc_resume(void __iomem *rb) bfa_ioc_ct2_nfc_resume(void __iomem *rb)
{ {
...@@ -802,105 +810,142 @@ bfa_ioc_ct2_nfc_resume(void __iomem *rb) ...@@ -802,105 +810,142 @@ bfa_ioc_ct2_nfc_resume(void __iomem *rb)
WARN_ON(1); WARN_ON(1);
} }
bfa_status_t static void
bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode) bfa_ioc_ct2_clk_reset(void __iomem *rb)
{ {
u32 wgn, r32, nfc_ver, i; u32 r32;
wgn = readl(rb + CT2_WGN_STATUS); bfa_ioc_ct2_sclk_init(rb);
nfc_ver = readl(rb + CT2_RSC_GPR15_REG); bfa_ioc_ct2_lclk_init(rb);
if ((wgn == (__A2T_AHB_LOAD | __WGN_READY)) && /*
(nfc_ver >= CT2_NFC_VER_VALID)) { * release soft reset on s_clk & l_clk
if (bfa_ioc_ct2_nfc_halted(rb)) */
bfa_ioc_ct2_nfc_resume(rb); r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET,
(rb + CT2_APP_PLL_SCLK_CTL_REG));
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET,
(rb + CT2_APP_PLL_LCLK_CTL_REG));
}
static void
bfa_ioc_ct2_nfc_clk_reset(void __iomem *rb)
{
u32 r32, i;
r32 = readl((rb + PSS_CTL_REG));
r32 |= (__PSS_LPU0_RESET | __PSS_LPU1_RESET);
writel(r32, (rb + PSS_CTL_REG));
writel(__RESET_AND_START_SCLK_LCLK_PLLS, writel(__RESET_AND_START_SCLK_LCLK_PLLS, rb + CT2_CSI_FW_CTL_SET_REG);
rb + CT2_CSI_FW_CTL_SET_REG);
for (i = 0; i < BFA_IOC_PLL_POLL; i++) { for (i = 0; i < BFA_IOC_PLL_POLL; i++) {
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); r32 = readl(rb + CT2_NFC_FLASH_STS_REG);
if (r32 & __RESET_AND_START_SCLK_LCLK_PLLS)
if ((r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS))
break; break;
} }
WARN_ON(!(r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS));
WARN_ON(!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS));
for (i = 0; i < BFA_IOC_PLL_POLL; i++) { for (i = 0; i < BFA_IOC_PLL_POLL; i++) {
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); r32 = readl(rb + CT2_NFC_FLASH_STS_REG);
if (!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS))
if (!(r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS))
break; break;
} }
WARN_ON((r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS));
WARN_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS);
udelay(1000);
r32 = readl(rb + CT2_CSI_FW_CTL_REG); r32 = readl(rb + CT2_CSI_FW_CTL_REG);
WARN_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS); WARN_ON((r32 & __RESET_AND_START_SCLK_LCLK_PLLS));
} else { }
writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_SET_REG);
for (i = 0; i < CT2_NFC_MAX_DELAY; i++) { static void
r32 = readl(rb + CT2_NFC_CSR_SET_REG); bfa_ioc_ct2_wait_till_nfc_running(void __iomem *rb)
if (r32 & __NFC_CONTROLLER_HALTED) {
break; u32 r32;
int i;
if (bfa_ioc_ct2_nfc_halted(rb))
bfa_ioc_ct2_nfc_resume(rb);
for (i = 0; i < CT2_NFC_PAUSE_MAX_DELAY; i++) {
r32 = readl(rb + CT2_NFC_STS_REG);
if (r32 == CT2_NFC_STATE_RUNNING)
return;
udelay(1000); udelay(1000);
} }
bfa_ioc_ct2_mac_reset(rb); r32 = readl(rb + CT2_NFC_STS_REG);
bfa_ioc_ct2_sclk_init(rb); WARN_ON(!(r32 == CT2_NFC_STATE_RUNNING));
bfa_ioc_ct2_lclk_init(rb); }
/* bfa_status_t
* release soft reset on s_clk & l_clk bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode)
*/ {
r32 = readl(rb + CT2_APP_PLL_SCLK_CTL_REG); u32 wgn, r32, nfc_ver;
writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET,
(rb + CT2_APP_PLL_SCLK_CTL_REG));
/* wgn = readl(rb + CT2_WGN_STATUS);
* release soft reset on s_clk & l_clk
*/
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG);
writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET,
(rb + CT2_APP_PLL_LCLK_CTL_REG));
}
if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) {
/* /*
* Announce flash device presence, if flash was corrupted. * If flash is corrupted, enable flash explicitly
*/ */
if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) { bfa_ioc_ct2_clk_reset(rb);
r32 = readl(rb + PSS_GPIO_OUT_REG); bfa_ioc_ct2_enable_flash(rb);
writel(r32 & ~1, (rb + PSS_GPIO_OUT_REG));
r32 = readl(rb + PSS_GPIO_OE_REG); bfa_ioc_ct2_mac_reset(rb);
writel(r32 | 1, (rb + PSS_GPIO_OE_REG));
bfa_ioc_ct2_clk_reset(rb);
bfa_ioc_ct2_enable_flash(rb);
} else {
nfc_ver = readl(rb + CT2_RSC_GPR15_REG);
if ((nfc_ver >= CT2_NFC_VER_VALID) &&
(wgn == (__A2T_AHB_LOAD | __WGN_READY))) {
bfa_ioc_ct2_wait_till_nfc_running(rb);
bfa_ioc_ct2_nfc_clk_reset(rb);
} else {
bfa_ioc_ct2_nfc_halt(rb);
bfa_ioc_ct2_clk_reset(rb);
bfa_ioc_ct2_mac_reset(rb);
bfa_ioc_ct2_clk_reset(rb);
}
} }
/* /*
* Mask the interrupts and clear any * Mask the interrupts and clear any
* pending interrupts. * pending interrupts left by BIOS/EFI
*/ */
writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK)); writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK));
writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK)); writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK));
/* For first time initialization, no need to clear interrupts */ /* For first time initialization, no need to clear interrupts */
r32 = readl(rb + HOST_SEM5_REG); r32 = readl(rb + HOST_SEM5_REG);
if (r32 & 0x1) { if (r32 & 0x1) {
r32 = readl(rb + CT2_LPU0_HOSTFN_CMD_STAT); r32 = readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
if (r32 == 1) { if (r32 == 1) {
writel(1, rb + CT2_LPU0_HOSTFN_CMD_STAT); writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT));
readl((rb + CT2_LPU0_HOSTFN_CMD_STAT)); readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
} }
r32 = readl(rb + CT2_LPU1_HOSTFN_CMD_STAT); r32 = readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
if (r32 == 1) { if (r32 == 1) {
writel(1, rb + CT2_LPU1_HOSTFN_CMD_STAT); writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT));
readl(rb + CT2_LPU1_HOSTFN_CMD_STAT); readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
} }
} }
bfa_ioc_ct2_mem_init(rb); bfa_ioc_ct2_mem_init(rb);
writel(BFI_IOC_UNINIT, rb + CT2_BFA_IOC0_STATE_REG); writel(BFI_IOC_UNINIT, (rb + CT2_BFA_IOC0_STATE_REG));
writel(BFI_IOC_UNINIT, rb + CT2_BFA_IOC1_STATE_REG); writel(BFI_IOC_UNINIT, (rb + CT2_BFA_IOC1_STATE_REG));
return BFA_STATUS_OK; return BFA_STATUS_OK;
} }
...@@ -338,6 +338,7 @@ enum { ...@@ -338,6 +338,7 @@ enum {
#define __A2T_AHB_LOAD 0x00000800 #define __A2T_AHB_LOAD 0x00000800
#define __WGN_READY 0x00000400 #define __WGN_READY 0x00000400
#define __GLBL_PF_VF_CFG_RDY 0x00000200 #define __GLBL_PF_VF_CFG_RDY 0x00000200
#define CT2_NFC_STS_REG 0x00027410
#define CT2_NFC_CSR_CLR_REG 0x00027420 #define CT2_NFC_CSR_CLR_REG 0x00027420
#define CT2_NFC_CSR_SET_REG 0x00027424 #define CT2_NFC_CSR_SET_REG 0x00027424
#define __HALT_NFC_CONTROLLER 0x00000002 #define __HALT_NFC_CONTROLLER 0x00000002
...@@ -355,6 +356,8 @@ enum { ...@@ -355,6 +356,8 @@ enum {
(CT2_CSI_MAC0_CONTROL_REG + \ (CT2_CSI_MAC0_CONTROL_REG + \
(__n) * (CT2_CSI_MAC1_CONTROL_REG - CT2_CSI_MAC0_CONTROL_REG)) (__n) * (CT2_CSI_MAC1_CONTROL_REG - CT2_CSI_MAC0_CONTROL_REG))
#define CT2_NFC_FLASH_STS_REG 0x00014834
#define __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS 0x00000020
/* /*
* Name semaphore registers based on usage * Name semaphore registers based on usage
*/ */
......
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