bfa_ioc_ct.c revision 8f4bfadd200477acb6dcf41a45919dd37d01a6db
10a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati/* 2a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. 30a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * All rights reserved 40a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * www.brocade.com 50a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * 60a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Linux driver for Brocade Fibre Channel Host Bus Adapter. 70a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * 80a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * This program is free software; you can redistribute it and/or modify it 90a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * under the terms of the GNU General Public License (GPL) Version 2 as 100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * published by the Free Software Foundation 110a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * 120a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * This program is distributed in the hope that it will be useful, but 130a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * WITHOUT ANY WARRANTY; without even the implied warranty of 140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * General Public License for more details. 160a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 18f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h" 19a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_ioc.h" 20a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfi_ctreg.h" 21a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_defs.h" 220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 230a20de446c76529028cb239bf2a13cb0f05b263aKrishna GudipatiBFA_TRC_FILE(CNA, IOC_CT); 240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 25f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_ct_sync_pos(__ioc) \ 26f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ((uint32_t) (1 << bfa_ioc_pcifn(__ioc))) 27f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define BFA_IOC_SYNC_REQD_SH 16 28f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_ct_get_sync_ackd(__val) (__val & 0x0000ffff) 29f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_ct_clear_sync_ackd(__val) (__val & 0xffff0000) 30f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_ct_get_sync_reqd(__val) (__val >> BFA_IOC_SYNC_REQD_SH) 31f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_ct_sync_reqd_pos(__ioc) \ 32f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati (bfa_ioc_ct_sync_pos(__ioc) << BFA_IOC_SYNC_REQD_SH) 33f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati/* 350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * forward declarations 360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic bfa_boolean_t bfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc); 380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void bfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc); 390a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void bfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc); 400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void bfa_ioc_ct_map_port(struct bfa_ioc_s *ioc); 410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void bfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix); 42f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_notify_fail(struct bfa_ioc_s *ioc); 430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void bfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc); 44f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_sync_join(struct bfa_ioc_s *ioc); 45f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_sync_leave(struct bfa_ioc_s *ioc); 46f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_sync_ack(struct bfa_ioc_s *ioc); 47f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic bfa_boolean_t bfa_ioc_ct_sync_complete(struct bfa_ioc_s *ioc); 480a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 4952f94b6fd0d1ff9d935c52f8a6360834ed871d92Maggiestatic struct bfa_ioc_hwif_s hwif_ct; 500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 515fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 520a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Called from bfa_ioc_attach() to map asic specific calls. 530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid 550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc) 560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 57293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_pll_init = bfa_ioc_ct_pll_init; 58293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_firmware_lock = bfa_ioc_ct_firmware_lock; 59293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_firmware_unlock = bfa_ioc_ct_firmware_unlock; 60293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_reg_init = bfa_ioc_ct_reg_init; 61293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_map_port = bfa_ioc_ct_map_port; 62293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_isr_mode_set = bfa_ioc_ct_isr_mode_set; 63f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati hwif_ct.ioc_notify_fail = bfa_ioc_ct_notify_fail; 64293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang hwif_ct.ioc_ownership_reset = bfa_ioc_ct_ownership_reset; 65f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati hwif_ct.ioc_sync_join = bfa_ioc_ct_sync_join; 66f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati hwif_ct.ioc_sync_leave = bfa_ioc_ct_sync_leave; 67f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati hwif_ct.ioc_sync_ack = bfa_ioc_ct_sync_ack; 68f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati hwif_ct.ioc_sync_complete = bfa_ioc_ct_sync_complete; 690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 70293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang ioc->ioc_hwif = &hwif_ct; 710a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 720a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 740a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Return true if firmware of current driver matches the running firmware. 750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic bfa_boolean_t 770a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc) 780a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 790a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati enum bfi_ioc_state ioc_fwstate; 80d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 usecnt; 810a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati struct bfi_ioc_image_hdr_s fwhdr; 820a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 835fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 840a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Firmware match check is relevant only for CNA. 850a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 860a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (!ioc->cna) 870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 880a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If bios boot (flash based) -- do not increment usage count 910a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 92a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_cb_image_get_size(BFA_IOC_FWIMG_TYPE(ioc)) < 93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOC_FWIMG_MINSZ) 940a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 950a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 960a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); 975344026065f79b102fcc44bc6332f856a111962aJing Huang usecnt = readl(ioc->ioc_regs.ioc_usage_reg); 980a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If usage count is 0, always return TRUE. 1010a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (usecnt == 0) { 1035344026065f79b102fcc44bc6332f856a111962aJing Huang writel(1, ioc->ioc_regs.ioc_usage_reg); 104f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 105f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(0, ioc->ioc_regs.ioc_fail_sync); 1060a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 1070a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 1080a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 1090a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1105344026065f79b102fcc44bc6332f856a111962aJing Huang ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate); 1110a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, ioc_fwstate); 1120a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Use count cannot be non-zero and chip in uninitialized state. 1150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 116d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(ioc_fwstate == BFI_IOC_UNINIT); 1170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1190a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Check if another driver with a different firmware is active 1200a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1210a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_fwver_get(ioc, &fwhdr); 1220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (!bfa_ioc_fwver_cmp(ioc, &fwhdr)) { 123f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 1240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 1250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_FALSE; 1260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 1270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1285fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Same firmware version. Increment the reference count. 1300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati usecnt++; 1325344026065f79b102fcc44bc6332f856a111962aJing Huang writel(usecnt, ioc->ioc_regs.ioc_usage_reg); 133f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 1340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 1350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 1360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 1370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 1390a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc) 1400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 141d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 usecnt; 1420a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1435fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1440a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Firmware lock is relevant only for CNA. 145293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang */ 146293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang if (!ioc->cna) 147293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang return; 148293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang 1495fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If bios boot (flash based) -- do not decrement usage count 1510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_cb_image_get_size(BFA_IOC_FWIMG_TYPE(ioc)) < 153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOC_FWIMG_MINSZ) 1540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return; 1550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1565fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * decrement usage count 1580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); 1605344026065f79b102fcc44bc6332f856a111962aJing Huang usecnt = readl(ioc->ioc_regs.ioc_usage_reg); 161d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(usecnt <= 0); 1620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati usecnt--; 1645344026065f79b102fcc44bc6332f856a111962aJing Huang writel(usecnt, ioc->ioc_regs.ioc_usage_reg); 1650a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 1660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 167f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 1680a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 1690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1710a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Notify other functions on HB failure. 1720a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1730a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 174f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_notify_fail(struct bfa_ioc_s *ioc) 1750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 176816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati if (ioc->cna) { 1775344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__FW_INIT_HALT_P, ioc->ioc_regs.ll_halt); 178f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(__FW_INIT_HALT_P, ioc->ioc_regs.alt_ll_halt); 179816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati /* Wait for halt to take effect */ 1805344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.ll_halt); 181f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati readl(ioc->ioc_regs.alt_ll_halt); 182816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati } else { 1835344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__PSS_ERR_STATUS_SET, ioc->ioc_regs.err_set); 1845344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.err_set); 185816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati } 1860a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 1870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Host to LPU mailbox message addresses 1900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 191d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipatistatic struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } iocreg_fnreg[] = { 1920a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 }, 1930a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 }, 1940a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2 }, 1950a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3 } 1960a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati}; 1970a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1985fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1990a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Host <-> LPU mailbox command/status registers - port 0 2000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 201d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipatistatic struct { u32 hfn, lpu; } iocreg_mbcmd_p0[] = { 2020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN0_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN0_MBOX0_CMD_STAT }, 2030a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN1_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN1_MBOX0_CMD_STAT }, 2040a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN2_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN2_MBOX0_CMD_STAT }, 2050a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN3_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN3_MBOX0_CMD_STAT } 2060a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati}; 2070a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2090a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Host <-> LPU mailbox command/status registers - port 1 2100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 211d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipatistatic struct { u32 hfn, lpu; } iocreg_mbcmd_p1[] = { 2120a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN0_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN0_MBOX0_CMD_STAT }, 2130a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN1_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN1_MBOX0_CMD_STAT }, 2140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN2_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN2_MBOX0_CMD_STAT }, 2150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN3_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN3_MBOX0_CMD_STAT } 2160a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati}; 2170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 2190a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc) 2200a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 2215344026065f79b102fcc44bc6332f856a111962aJing Huang void __iomem *rb; 2220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati int pcifn = bfa_ioc_pcifn(ioc); 2230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati rb = bfa_ioc_bar0(ioc); 2250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; 2270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; 2280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; 2290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (ioc->port_id == 0) { 2310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; 2320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; 233f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC1_STATE_REG; 2340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].hfn; 2350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].lpu; 2360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; 237f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P1; 2380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } else { 2390a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); 2400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); 241f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC0_STATE_REG; 2420a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].hfn; 2430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].lpu; 2440a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; 245f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P0; 2460a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 2470a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2480a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 2490a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * PSS control registers 2500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); 2528b651b4294e67789028982d18779a9ebe75c2b8aKrishna Gudipati ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); 2530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_425_CTL_REG); 2540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_312_CTL_REG); 2550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 2570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * IOC semaphore registers and serialization 2580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); 2600a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG); 2610a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); 2620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT); 263f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.ioc_fail_sync = (rb + BFA_IOC_FAIL_SYNC); 2640a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * sram memory access 2670a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2680a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); 2690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; 270816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati 271816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati /* 272816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati * err set reg : for notification of hb failure in fcmode 273816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati */ 274816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati ioc->ioc_regs.err_set = (rb + ERR_SET_REG); 2750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 2760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2780a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Initialize IOC to port mapping. 2790a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2810a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8) 2820a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 2830a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_map_port(struct bfa_ioc_s *ioc) 2840a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 2855344026065f79b102fcc44bc6332f856a111962aJing Huang void __iomem *rb = ioc->pcidev.pci_bar_kva; 286d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 r32; 2870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * For catapult, base port id on personality register and IOC type 2900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2915344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(rb + FNC_PERS_REG); 2920a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)); 2930a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH; 2940a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2950a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, bfa_ioc_pcifn(ioc)); 2960a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, ioc->port_id); 2970a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 2980a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Set interrupt mode for a function: INTX or MSIX 3010a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 3020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 3030a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) 3040a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 3055344026065f79b102fcc44bc6332f856a111962aJing Huang void __iomem *rb = ioc->pcidev.pci_bar_kva; 306d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 r32, mode; 3070a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3085344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(rb + FNC_PERS_REG); 3090a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, r32); 3100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3110a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) & 3120a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati __F0_INTX_STATUS; 3130a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If already in desired mode, do not change anything 3160a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 3170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (!msix && mode) 3180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return; 3190a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3200a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (msix) 3210a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati mode = __F0_INTX_STATUS_MSIX; 3220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati else 3230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati mode = __F0_INTX_STATUS_INTA; 3240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); 3260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); 3270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, r32); 3280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3295344026065f79b102fcc44bc6332f856a111962aJing Huang writel(r32, rb + FNC_PERS_REG); 3300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 3310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3325fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup hw semaphore and usecnt registers 334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc) 3370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 339a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioc->cna) { 340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); 3415344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, ioc->ioc_regs.ioc_usage_reg); 342f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3440a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3450a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Read the hw sem reg to make sure that it is locked 347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * before we clear it. If it is not locked, writing 1 348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * will lock it instead of clearing it. 3490a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 3505344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.ioc_sem_reg); 351f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3548f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/* 355f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Synchronized IOC failure processing routines 356f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 357f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 358f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_join(struct bfa_ioc_s *ioc) 359f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 360f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 361f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_pos = bfa_ioc_ct_sync_reqd_pos(ioc); 362f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 363f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 | sync_pos), ioc->ioc_regs.ioc_fail_sync); 364f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 365a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 366f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 367f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_leave(struct bfa_ioc_s *ioc) 368f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 369f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 370f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_msk = bfa_ioc_ct_sync_reqd_pos(ioc) | 371f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_ct_sync_pos(ioc); 372f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 373f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 & ~sync_msk), ioc->ioc_regs.ioc_fail_sync); 374f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 375f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 376f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 377f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_ack(struct bfa_ioc_s *ioc) 378f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 379f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 380f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 381f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 | bfa_ioc_ct_sync_pos(ioc)), 382f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.ioc_fail_sync); 383f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 384f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 385f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic bfa_boolean_t 386f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_complete(struct bfa_ioc_s *ioc) 387f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 388f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 389f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_reqd = bfa_ioc_ct_get_sync_reqd(r32); 390f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_ackd = bfa_ioc_ct_get_sync_ackd(r32); 391f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t tmp_ackd; 392f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 393f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (sync_ackd == 0) 394f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati return BFA_TRUE; 395f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 3968f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 397f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * The check below is to see whether any other PCI fn 398f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * has reinitialized the ASIC (reset sync_ackd bits) 399f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * and failed again while this IOC was waiting for hw 400f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * semaphore (in bfa_iocpf_sm_semwait()). 401f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 402f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati tmp_ackd = sync_ackd; 403f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if ((sync_reqd & bfa_ioc_ct_sync_pos(ioc)) && 404f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati !(sync_ackd & bfa_ioc_ct_sync_pos(ioc))) 405f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati sync_ackd |= bfa_ioc_ct_sync_pos(ioc); 406f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 407f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (sync_reqd == sync_ackd) { 408f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(bfa_ioc_ct_clear_sync_ackd(r32), 409f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.ioc_fail_sync); 410f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate); 411f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(BFI_IOC_FAIL, ioc->ioc_regs.alt_ioc_fwstate); 412f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati return BFA_TRUE; 413f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 414f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 4158f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 416f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * If another PCI fn reinitialized and failed again while 417f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * this IOC was waiting for hw sem, the sync_ackd bit for 418f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * this IOC need to be set again to allow reinitialization. 419f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 420f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (tmp_ackd != sync_ackd) 421f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 | sync_ackd), ioc->ioc_regs.ioc_fail_sync); 422f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 423f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati return BFA_FALSE; 424f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati/* 427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Check the firmware state to know if pll_init has been completed already 428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t 4305344026065f79b102fcc44bc6332f856a111962aJing Huangbfa_ioc_ct_pll_init_complete(void __iomem *rb) 431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 4325344026065f79b102fcc44bc6332f856a111962aJing Huang if ((readl(rb + BFA_IOC0_STATE_REG) == BFI_IOC_OP) || 4335344026065f79b102fcc44bc6332f856a111962aJing Huang (readl(rb + BFA_IOC1_STATE_REG) == BFI_IOC_OP)) 434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 4405344026065f79b102fcc44bc6332f856a111962aJing Huangbfa_ioc_ct_pll_init(void __iomem *rb, bfa_boolean_t fcmode) 441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pll_sclk, pll_fclk, r32; 4430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 44478f915f7b095dda76970c8c9568489fa779ef73fKrishna Gudipati pll_sclk = __APP_PLL_312_LRESETN | __APP_PLL_312_ENARST | 44578f915f7b095dda76970c8c9568489fa779ef73fKrishna Gudipati __APP_PLL_312_RSEL200500 | __APP_PLL_312_P0_1(3U) | 4460a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati __APP_PLL_312_JITLMT0_1(3U) | 4470a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati __APP_PLL_312_CNTLMT0_1(1U); 44878f915f7b095dda76970c8c9568489fa779ef73fKrishna Gudipati pll_fclk = __APP_PLL_425_LRESETN | __APP_PLL_425_ENARST | 44978f915f7b095dda76970c8c9568489fa779ef73fKrishna Gudipati __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(3U) | 4500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati __APP_PLL_425_JITLMT0_1(3U) | 4510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati __APP_PLL_425_CNTLMT0_1(1U); 452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (fcmode) { 4535344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + OP_MODE)); 4545344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__APP_EMS_CMLCKSEL | __APP_EMS_REFCKBUFEN2 | 4555344026065f79b102fcc44bc6332f856a111962aJing Huang __APP_EMS_CHANNEL_SEL, (rb + ETH_MAC_SER_REG)); 4560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } else { 4575344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__GLOBAL_FCOE_MODE, (rb + OP_MODE)); 4585344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__APP_EMS_REFCKBUFEN1, (rb + ETH_MAC_SER_REG)); 4590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 4605344026065f79b102fcc44bc6332f856a111962aJing Huang writel(BFI_IOC_UNINIT, (rb + BFA_IOC0_STATE_REG)); 4615344026065f79b102fcc44bc6332f856a111962aJing Huang writel(BFI_IOC_UNINIT, (rb + BFA_IOC1_STATE_REG)); 4625344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_MSK)); 4635344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_MSK)); 4645344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS)); 4655344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS)); 4665344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_MSK)); 4675344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_MSK)); 4685344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pll_sclk | __APP_PLL_312_LOGIC_SOFT_RESET, 4695344026065f79b102fcc44bc6332f856a111962aJing Huang rb + APP_PLL_312_CTL_REG); 4705344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pll_fclk | __APP_PLL_425_LOGIC_SOFT_RESET, 4715344026065f79b102fcc44bc6332f856a111962aJing Huang rb + APP_PLL_425_CTL_REG); 4725344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pll_sclk | __APP_PLL_312_LOGIC_SOFT_RESET | __APP_PLL_312_ENABLE, 4735344026065f79b102fcc44bc6332f856a111962aJing Huang rb + APP_PLL_312_CTL_REG); 4745344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pll_fclk | __APP_PLL_425_LOGIC_SOFT_RESET | __APP_PLL_425_ENABLE, 4755344026065f79b102fcc44bc6332f856a111962aJing Huang rb + APP_PLL_425_CTL_REG); 4765344026065f79b102fcc44bc6332f856a111962aJing Huang readl(rb + HOSTFN0_INT_MSK); 4776a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(2000); 4785344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS)); 4795344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS)); 4805344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pll_sclk | __APP_PLL_312_ENABLE, rb + APP_PLL_312_CTL_REG); 4815344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pll_fclk | __APP_PLL_425_ENABLE, rb + APP_PLL_425_CTL_REG); 482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!fcmode) { 4835344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P0)); 4845344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P1)); 485df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang } 4865344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl((rb + PSS_CTL_REG)); 487df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang r32 &= ~__PSS_LMEM_RESET; 4885344026065f79b102fcc44bc6332f856a111962aJing Huang writel(r32, (rb + PSS_CTL_REG)); 4896a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(1000); 490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!fcmode) { 4915344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + PMM_1T_RESET_REG_P0)); 4925344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + PMM_1T_RESET_REG_P1)); 493df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang } 494df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang 4955344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__EDRAM_BISTR_START, (rb + MBIST_CTL_REG)); 4966a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(1000); 4975344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl((rb + MBIST_STAT_REG)); 4985344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + MBIST_CTL_REG)); 4990a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_STATUS_OK; 5000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 501