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" 20111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#include "bfi_reg.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); 39f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_notify_fail(struct bfa_ioc_s *ioc); 400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void bfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc); 4145d7f0cc58183062adea0a1de3d8cba768134138Jing Huangstatic bfa_boolean_t bfa_ioc_ct_sync_start(struct bfa_ioc_s *ioc); 42f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_sync_join(struct bfa_ioc_s *ioc); 43f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_sync_leave(struct bfa_ioc_s *ioc); 44f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void bfa_ioc_ct_sync_ack(struct bfa_ioc_s *ioc); 45f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic bfa_boolean_t bfa_ioc_ct_sync_complete(struct bfa_ioc_s *ioc); 460a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 4752f94b6fd0d1ff9d935c52f8a6360834ed871d92Maggiestatic struct bfa_ioc_hwif_s hwif_ct; 48111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic struct bfa_ioc_hwif_s hwif_ct2; 490a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 505fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Return true if firmware of current driver matches the running firmware. 520a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic bfa_boolean_t 540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc) 550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati enum bfi_ioc_state ioc_fwstate; 57d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 usecnt; 580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati struct bfi_ioc_image_hdr_s fwhdr; 590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 610a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If bios boot (flash based) -- do not increment usage count 620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 63111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)) < 64a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOC_FWIMG_MINSZ) 650a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 670a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); 685344026065f79b102fcc44bc6332f856a111962aJing Huang usecnt = readl(ioc->ioc_regs.ioc_usage_reg); 690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 710a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If usage count is 0, always return TRUE. 720a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 730a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (usecnt == 0) { 745344026065f79b102fcc44bc6332f856a111962aJing Huang writel(1, ioc->ioc_regs.ioc_usage_reg); 755a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_usage_sem_reg); 76f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 77f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(0, ioc->ioc_regs.ioc_fail_sync); 780a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 790a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 810a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 825344026065f79b102fcc44bc6332f856a111962aJing Huang ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate); 830a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, ioc_fwstate); 840a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 855fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 860a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Use count cannot be non-zero and chip in uninitialized state. 870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 88d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(ioc_fwstate == BFI_IOC_UNINIT); 890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 910a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Check if another driver with a different firmware is active 920a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 930a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_fwver_get(ioc, &fwhdr); 940a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (!bfa_ioc_fwver_cmp(ioc, &fwhdr)) { 955a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_usage_sem_reg); 96f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 970a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 980a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_FALSE; 990a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 1000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1015fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Same firmware version. Increment the reference count. 1030a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1040a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati usecnt++; 1055344026065f79b102fcc44bc6332f856a111962aJing Huang writel(usecnt, ioc->ioc_regs.ioc_usage_reg); 1065a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_usage_sem_reg); 107f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 1080a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 1090a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 1100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 1110a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1120a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 1130a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc) 1140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 115d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 usecnt; 1160a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If bios boot (flash based) -- do not decrement usage count 1190a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 120111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)) < 121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOC_FWIMG_MINSZ) 1220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return; 1230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1245fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * decrement usage count 1260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); 1285344026065f79b102fcc44bc6332f856a111962aJing Huang usecnt = readl(ioc->ioc_regs.ioc_usage_reg); 129d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(usecnt <= 0); 1300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati usecnt--; 1325344026065f79b102fcc44bc6332f856a111962aJing Huang writel(usecnt, ioc->ioc_regs.ioc_usage_reg); 1330a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, usecnt); 1340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1355a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_usage_sem_reg); 136f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 1370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 1380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1395fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Notify other functions on HB failure. 1410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 1420a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 143f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_notify_fail(struct bfa_ioc_s *ioc) 1440a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 145111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (bfa_ioc_is_cna(ioc)) { 1465344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__FW_INIT_HALT_P, ioc->ioc_regs.ll_halt); 147f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(__FW_INIT_HALT_P, ioc->ioc_regs.alt_ll_halt); 148816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati /* Wait for halt to take effect */ 1495344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.ll_halt); 150f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati readl(ioc->ioc_regs.alt_ll_halt); 151816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati } else { 152111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(~0U, ioc->ioc_regs.err_set); 1535344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.err_set); 154816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati } 1550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 1560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1575fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Host to LPU mailbox message addresses 1590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 160111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } ct_fnreg[] = { 1610a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 }, 1620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 }, 1630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2 }, 1640a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati { HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3 } 1650a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati}; 1660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1675fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1680a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Host <-> LPU mailbox command/status registers - port 0 1690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 170111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic struct { u32 hfn, lpu; } ct_p0reg[] = { 171111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN0_LPU0_CMD_STAT, LPU0_HOSTFN0_CMD_STAT }, 172111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN1_LPU0_CMD_STAT, LPU0_HOSTFN1_CMD_STAT }, 173111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN2_LPU0_CMD_STAT, LPU0_HOSTFN2_CMD_STAT }, 174111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN3_LPU0_CMD_STAT, LPU0_HOSTFN3_CMD_STAT } 1750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati}; 1760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1780a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Host <-> LPU mailbox command/status registers - port 1 1790a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 180111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic struct { u32 hfn, lpu; } ct_p1reg[] = { 181111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN0_LPU1_CMD_STAT, LPU1_HOSTFN0_CMD_STAT }, 182111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN1_LPU1_CMD_STAT, LPU1_HOSTFN1_CMD_STAT }, 183111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN2_LPU1_CMD_STAT, LPU1_HOSTFN2_CMD_STAT }, 184111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { HOSTFN3_LPU1_CMD_STAT, LPU1_HOSTFN3_CMD_STAT } 185111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati}; 186111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 1878b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatistatic struct { uint32_t hfn_mbox, lpu_mbox, hfn_pgn, hfn, lpu, lpu_read; } 1888b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati ct2_reg[] = { 189111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { CT2_HOSTFN_LPU0_MBOX0, CT2_LPU0_HOSTFN_MBOX0, CT2_HOSTFN_PAGE_NUM, 1908b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati CT2_HOSTFN_LPU0_CMD_STAT, CT2_LPU0_HOSTFN_CMD_STAT, 1918b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati CT2_HOSTFN_LPU0_READ_STAT}, 192111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati { CT2_HOSTFN_LPU1_MBOX0, CT2_LPU1_HOSTFN_MBOX0, CT2_HOSTFN_PAGE_NUM, 1938b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati CT2_HOSTFN_LPU1_CMD_STAT, CT2_LPU1_HOSTFN_CMD_STAT, 1948b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati CT2_HOSTFN_LPU1_READ_STAT}, 1950a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati}; 1960a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1970a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 1980a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc) 1990a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 2005344026065f79b102fcc44bc6332f856a111962aJing Huang void __iomem *rb; 2010a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati int pcifn = bfa_ioc_pcifn(ioc); 2020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2030a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati rb = bfa_ioc_bar0(ioc); 2040a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 205111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.hfn_mbox = rb + ct_fnreg[pcifn].hfn_mbox; 206111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.lpu_mbox = rb + ct_fnreg[pcifn].lpu_mbox; 207111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.host_page_num_fn = rb + ct_fnreg[pcifn].hfn_pgn; 2080a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2090a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (ioc->port_id == 0) { 2100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; 2110a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; 212f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC1_STATE_REG; 213111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.hfn_mbox_cmd = rb + ct_p0reg[pcifn].hfn; 214111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.lpu_mbox_cmd = rb + ct_p0reg[pcifn].lpu; 2150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; 216f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P1; 2170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } else { 2180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); 2190a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); 220f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC0_STATE_REG; 221111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.hfn_mbox_cmd = rb + ct_p1reg[pcifn].hfn; 222111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.lpu_mbox_cmd = rb + ct_p1reg[pcifn].lpu; 2230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; 224f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P0; 2250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 2260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 2280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * PSS control registers 2290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); 2318b651b4294e67789028982d18779a9ebe75c2b8aKrishna Gudipati ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); 232111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_LCLK_CTL_REG); 233111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_SCLK_CTL_REG); 2340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 2360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * IOC semaphore registers and serialization 2370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); 2390a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG); 2400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); 2410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT); 242f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.ioc_fail_sync = (rb + BFA_IOC_FAIL_SYNC); 2430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2450a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * sram memory access 2460a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2470a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); 2480a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; 249816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati 250816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati /* 251816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati * err set reg : for notification of hb failure in fcmode 252816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati */ 253816e49b8ed209e5e08d4c43359635cbca17e7196Krishna Gudipati ioc->ioc_regs.err_set = (rb + ERR_SET_REG); 2540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 2550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 256111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void 257111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_ct2_reg_init(struct bfa_ioc_s *ioc) 258111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 259111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati void __iomem *rb; 260111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati int port = bfa_ioc_portid(ioc); 261111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 262111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati rb = bfa_ioc_bar0(ioc); 263111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 264111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.hfn_mbox = rb + ct2_reg[port].hfn_mbox; 265111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.lpu_mbox = rb + ct2_reg[port].lpu_mbox; 266111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.host_page_num_fn = rb + ct2_reg[port].hfn_pgn; 267111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.hfn_mbox_cmd = rb + ct2_reg[port].hfn; 268111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.lpu_mbox_cmd = rb + ct2_reg[port].lpu; 2698b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati ioc->ioc_regs.lpu_read_stat = rb + ct2_reg[port].lpu_read; 270111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 271111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (port == 0) { 272111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.heartbeat = rb + CT2_BFA_IOC0_HBEAT_REG; 273111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ioc_fwstate = rb + CT2_BFA_IOC0_STATE_REG; 274111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.alt_ioc_fwstate = rb + CT2_BFA_IOC1_STATE_REG; 275111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; 276111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P1; 277111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati } else { 278111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.heartbeat = (rb + CT2_BFA_IOC1_HBEAT_REG); 279111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ioc_fwstate = (rb + CT2_BFA_IOC1_STATE_REG); 280111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.alt_ioc_fwstate = rb + CT2_BFA_IOC0_STATE_REG; 281111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; 282111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P0; 283111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati } 284111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 285111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 286111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * PSS control registers 287111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 288111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); 289111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); 290111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + CT2_APP_PLL_LCLK_CTL_REG); 291111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + CT2_APP_PLL_SCLK_CTL_REG); 292111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 293111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 294111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * IOC semaphore registers and serialization 295111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 296111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ioc_sem_reg = (rb + CT2_HOST_SEM0_REG); 297111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ioc_usage_sem_reg = (rb + CT2_HOST_SEM1_REG); 298111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.ioc_init_sem_reg = (rb + CT2_HOST_SEM2_REG); 299775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati ioc->ioc_regs.ioc_usage_reg = (rb + CT2_BFA_FW_USE_COUNT); 300775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati ioc->ioc_regs.ioc_fail_sync = (rb + CT2_BFA_IOC_FAIL_SYNC); 301111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 302111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 303111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * sram memory access 304111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 305111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); 306111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; 307111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 308111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 309111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * err set reg : for notification of hb failure in fcmode 310111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 311111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_regs.err_set = (rb + ERR_SET_REG); 312111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 313111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 3145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Initialize IOC to port mapping. 3160a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 3170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8) 3190a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 3200a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_map_port(struct bfa_ioc_s *ioc) 3210a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 3225344026065f79b102fcc44bc6332f856a111962aJing Huang void __iomem *rb = ioc->pcidev.pci_bar_kva; 323d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 r32; 3240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3255fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * For catapult, base port id on personality register and IOC type 3270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 3285344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(rb + FNC_PERS_REG); 3290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)); 3300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH; 3310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, bfa_ioc_pcifn(ioc)); 3330a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, ioc->port_id); 3340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 3350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 336111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void 337111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_ct2_map_port(struct bfa_ioc_s *ioc) 338111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 3395a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati void __iomem *rb = ioc->pcidev.pci_bar_kva; 3405a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati u32 r32; 3415a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 3425a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati r32 = readl(rb + CT2_HOSTFN_PERSONALITY0); 3435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->port_id = ((r32 & __FC_LL_PORT_MAP__MK) >> __FC_LL_PORT_MAP__SH); 344111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 345111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_trc(ioc, bfa_ioc_pcifn(ioc)); 346111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_trc(ioc, ioc->port_id); 347111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 348111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 3495fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Set interrupt mode for a function: INTX or MSIX 3510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 3520a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatistatic void 3530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) 3540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 3555344026065f79b102fcc44bc6332f856a111962aJing Huang void __iomem *rb = ioc->pcidev.pci_bar_kva; 356d1c61f8ef582055569de76a86fa1984f9b6698cfKrishna Gudipati u32 r32, mode; 3570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3585344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(rb + FNC_PERS_REG); 3590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, r32); 3600a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3610a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) & 3620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati __F0_INTX_STATUS; 3630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3650a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * If already in desired mode, do not change anything 3660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 367111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if ((!msix && mode) || (msix && !mode)) 3680a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return; 3690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3700a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (msix) 3710a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati mode = __F0_INTX_STATUS_MSIX; 3720a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati else 3730a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati mode = __F0_INTX_STATUS_INTA; 3740a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); 3760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); 3770a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_trc(ioc, r32); 3780a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3795344026065f79b102fcc44bc6332f856a111962aJing Huang writel(r32, rb + FNC_PERS_REG); 3800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 3810a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 3828b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatibfa_boolean_t 3838b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatibfa_ioc_ct2_lpu_read_stat(struct bfa_ioc_s *ioc) 3848b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati{ 3858b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati u32 r32; 3868b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati 3878b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati r32 = readl(ioc->ioc_regs.lpu_read_stat); 3888b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati if (r32) { 3898b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati writel(1, ioc->ioc_regs.lpu_read_stat); 3908b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati return BFA_TRUE; 3918b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati } 3928b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati 3938b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati return BFA_FALSE; 3948b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati} 3958b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati 3965fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup hw semaphore and usecnt registers 398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc) 4010a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati{ 402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 403111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (bfa_ioc_is_cna(ioc)) { 404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); 4055344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, ioc->ioc_regs.ioc_usage_reg); 4065a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_usage_sem_reg); 407f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_usage_sem_reg); 408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 4090a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 4100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Read the hw sem reg to make sure that it is locked 412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * before we clear it. If it is not locked, writing 1 413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * will lock it instead of clearing it. 4140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 4155344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.ioc_sem_reg); 416f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 41945d7f0cc58183062adea0a1de3d8cba768134138Jing Huangstatic bfa_boolean_t 42045d7f0cc58183062adea0a1de3d8cba768134138Jing Huangbfa_ioc_ct_sync_start(struct bfa_ioc_s *ioc) 42145d7f0cc58183062adea0a1de3d8cba768134138Jing Huang{ 42245d7f0cc58183062adea0a1de3d8cba768134138Jing Huang uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 42345d7f0cc58183062adea0a1de3d8cba768134138Jing Huang uint32_t sync_reqd = bfa_ioc_ct_get_sync_reqd(r32); 42445d7f0cc58183062adea0a1de3d8cba768134138Jing Huang 42545d7f0cc58183062adea0a1de3d8cba768134138Jing Huang /* 42645d7f0cc58183062adea0a1de3d8cba768134138Jing Huang * Driver load time. If the sync required bit for this PCI fn 42745d7f0cc58183062adea0a1de3d8cba768134138Jing Huang * is set, it is due to an unclean exit by the driver for this 42845d7f0cc58183062adea0a1de3d8cba768134138Jing Huang * PCI fn in the previous incarnation. Whoever comes here first 42945d7f0cc58183062adea0a1de3d8cba768134138Jing Huang * should clean it up, no matter which PCI fn. 43045d7f0cc58183062adea0a1de3d8cba768134138Jing Huang */ 43145d7f0cc58183062adea0a1de3d8cba768134138Jing Huang 43245d7f0cc58183062adea0a1de3d8cba768134138Jing Huang if (sync_reqd & bfa_ioc_ct_sync_pos(ioc)) { 43345d7f0cc58183062adea0a1de3d8cba768134138Jing Huang writel(0, ioc->ioc_regs.ioc_fail_sync); 43445d7f0cc58183062adea0a1de3d8cba768134138Jing Huang writel(1, ioc->ioc_regs.ioc_usage_reg); 43545d7f0cc58183062adea0a1de3d8cba768134138Jing Huang writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate); 43645d7f0cc58183062adea0a1de3d8cba768134138Jing Huang writel(BFI_IOC_UNINIT, ioc->ioc_regs.alt_ioc_fwstate); 43745d7f0cc58183062adea0a1de3d8cba768134138Jing Huang return BFA_TRUE; 43845d7f0cc58183062adea0a1de3d8cba768134138Jing Huang } 43945d7f0cc58183062adea0a1de3d8cba768134138Jing Huang 44045d7f0cc58183062adea0a1de3d8cba768134138Jing Huang return bfa_ioc_ct_sync_complete(ioc); 44145d7f0cc58183062adea0a1de3d8cba768134138Jing Huang} 44245d7f0cc58183062adea0a1de3d8cba768134138Jing Huang 4438f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/* 444f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Synchronized IOC failure processing routines 445f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 446f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 447f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_join(struct bfa_ioc_s *ioc) 448f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 449f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 450f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_pos = bfa_ioc_ct_sync_reqd_pos(ioc); 451f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 452f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 | sync_pos), ioc->ioc_regs.ioc_fail_sync); 453f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 455f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 456f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_leave(struct bfa_ioc_s *ioc) 457f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 458f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 459f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_msk = bfa_ioc_ct_sync_reqd_pos(ioc) | 460f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_ct_sync_pos(ioc); 461f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 462f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 & ~sync_msk), ioc->ioc_regs.ioc_fail_sync); 463f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 464f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 465f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 466f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_ack(struct bfa_ioc_s *ioc) 467f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 468f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 469f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 470f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 | bfa_ioc_ct_sync_pos(ioc)), 471f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.ioc_fail_sync); 472f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 473f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 474f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic bfa_boolean_t 475f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_ct_sync_complete(struct bfa_ioc_s *ioc) 476f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 477f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t r32 = readl(ioc->ioc_regs.ioc_fail_sync); 478f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_reqd = bfa_ioc_ct_get_sync_reqd(r32); 479f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t sync_ackd = bfa_ioc_ct_get_sync_ackd(r32); 480f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati uint32_t tmp_ackd; 481f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 482f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (sync_ackd == 0) 483f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati return BFA_TRUE; 484f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 4858f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 486f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * The check below is to see whether any other PCI fn 487f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * has reinitialized the ASIC (reset sync_ackd bits) 488f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * and failed again while this IOC was waiting for hw 489f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * semaphore (in bfa_iocpf_sm_semwait()). 490f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 491f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati tmp_ackd = sync_ackd; 492f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if ((sync_reqd & bfa_ioc_ct_sync_pos(ioc)) && 493f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati !(sync_ackd & bfa_ioc_ct_sync_pos(ioc))) 494f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati sync_ackd |= bfa_ioc_ct_sync_pos(ioc); 495f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 496f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (sync_reqd == sync_ackd) { 497f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(bfa_ioc_ct_clear_sync_ackd(r32), 498f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ioc->ioc_regs.ioc_fail_sync); 499f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate); 500f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(BFI_IOC_FAIL, ioc->ioc_regs.alt_ioc_fwstate); 501f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati return BFA_TRUE; 502f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 503f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 5048f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 505f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * If another PCI fn reinitialized and failed again while 506f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * this IOC was waiting for hw sem, the sync_ackd bit for 507f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * this IOC need to be set again to allow reinitialization. 508f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 509f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (tmp_ackd != sync_ackd) 510f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel((r32 | sync_ackd), ioc->ioc_regs.ioc_fail_sync); 511f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 512f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati return BFA_FALSE; 513f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 514a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 515111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati/** 516111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * Called from bfa_ioc_attach() to map asic specific calls. 517111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 518111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void 519111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_set_ctx_hwif(struct bfa_ioc_s *ioc, struct bfa_ioc_hwif_s *hwif) 520111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 521111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_firmware_lock = bfa_ioc_ct_firmware_lock; 522111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_firmware_unlock = bfa_ioc_ct_firmware_unlock; 523111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_notify_fail = bfa_ioc_ct_notify_fail; 524111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_ownership_reset = bfa_ioc_ct_ownership_reset; 525111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_sync_start = bfa_ioc_ct_sync_start; 526111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_sync_join = bfa_ioc_ct_sync_join; 527111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_sync_leave = bfa_ioc_ct_sync_leave; 528111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_sync_ack = bfa_ioc_ct_sync_ack; 529111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif->ioc_sync_complete = bfa_ioc_ct_sync_complete; 530111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 531111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 532111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati/** 533111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * Called from bfa_ioc_attach() to map asic specific calls. 534111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 535111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipativoid 536111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc) 537111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 538111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_ioc_set_ctx_hwif(ioc, &hwif_ct); 539111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 540111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct.ioc_pll_init = bfa_ioc_ct_pll_init; 541111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct.ioc_reg_init = bfa_ioc_ct_reg_init; 542111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct.ioc_map_port = bfa_ioc_ct_map_port; 543111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct.ioc_isr_mode_set = bfa_ioc_ct_isr_mode_set; 544111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_hwif = &hwif_ct; 545111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 546111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 547111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati/** 548111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * Called from bfa_ioc_attach() to map asic specific calls. 549111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 550111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipativoid 551111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_set_ct2_hwif(struct bfa_ioc_s *ioc) 552111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 553111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_ioc_set_ctx_hwif(ioc, &hwif_ct2); 554111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 555111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct2.ioc_pll_init = bfa_ioc_ct2_pll_init; 556111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct2.ioc_reg_init = bfa_ioc_ct2_reg_init; 557111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct2.ioc_map_port = bfa_ioc_ct2_map_port; 5588b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati hwif_ct2.ioc_lpu_read_stat = bfa_ioc_ct2_lpu_read_stat; 559111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati hwif_ct2.ioc_isr_mode_set = NULL; 560111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->ioc_hwif = &hwif_ct2; 561111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 562111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati/* 5643fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati * Workaround for MSI-X resource allocation for catapult-2 with no asic block 565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 5663fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati#define HOSTFN_MSIX_DEFAULT 64 56710a07379247078448c076690657a076076bf89aaKrishna Gudipati#define HOSTFN_MSIX_VT_INDEX_MBOX_ERR 0x30138 568111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#define HOSTFN_MSIX_VT_OFST_NUMVT 0x3013c 569111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#define __MSIX_VT_NUMVT__MK 0x003ff800 570111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#define __MSIX_VT_NUMVT__SH 11 571111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#define __MSIX_VT_NUMVT_(_v) ((_v) << __MSIX_VT_NUMVT__SH) 57210a07379247078448c076690657a076076bf89aaKrishna Gudipati#define __MSIX_VT_OFST_ 0x000007ff 573111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipativoid 574111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_ct2_poweron(struct bfa_ioc_s *ioc) 575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 576111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati void __iomem *rb = ioc->pcidev.pci_bar_kva; 577111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati u32 r32; 578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 579111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl(rb + HOSTFN_MSIX_VT_OFST_NUMVT); 58010a07379247078448c076690657a076076bf89aaKrishna Gudipati if (r32 & __MSIX_VT_NUMVT__MK) { 58110a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32 & __MSIX_VT_OFST_, 58210a07379247078448c076690657a076076bf89aaKrishna Gudipati rb + HOSTFN_MSIX_VT_INDEX_MBOX_ERR); 583111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati return; 58410a07379247078448c076690657a076076bf89aaKrishna Gudipati } 585111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 586111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(__MSIX_VT_NUMVT_(HOSTFN_MSIX_DEFAULT - 1) | 587111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati HOSTFN_MSIX_DEFAULT * bfa_ioc_pcifn(ioc), 588111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati rb + HOSTFN_MSIX_VT_OFST_NUMVT); 58910a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(HOSTFN_MSIX_DEFAULT * bfa_ioc_pcifn(ioc), 59010a07379247078448c076690657a076076bf89aaKrishna Gudipati rb + HOSTFN_MSIX_VT_INDEX_MBOX_ERR); 591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 594111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode mode) 595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pll_sclk, pll_fclk, r32; 597111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_boolean_t fcmode = (mode == BFI_ASIC_MODE_FC); 598111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 599111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati pll_sclk = __APP_PLL_SCLK_LRESETN | __APP_PLL_SCLK_ENARST | 600111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_SCLK_RSEL200500 | __APP_PLL_SCLK_P0_1(3U) | 601111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_SCLK_JITLMT0_1(3U) | 602111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_SCLK_CNTLMT0_1(1U); 603111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati pll_fclk = __APP_PLL_LCLK_LRESETN | __APP_PLL_LCLK_ENARST | 604111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_LCLK_RSEL200500 | __APP_PLL_LCLK_P0_1(3U) | 605111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_LCLK_JITLMT0_1(3U) | 606111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_LCLK_CNTLMT0_1(1U); 6070a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (fcmode) { 6095344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + OP_MODE)); 6105344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__APP_EMS_CMLCKSEL | __APP_EMS_REFCKBUFEN2 | 6115344026065f79b102fcc44bc6332f856a111962aJing Huang __APP_EMS_CHANNEL_SEL, (rb + ETH_MAC_SER_REG)); 6120a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } else { 6135344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__GLOBAL_FCOE_MODE, (rb + OP_MODE)); 6145344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__APP_EMS_REFCKBUFEN1, (rb + ETH_MAC_SER_REG)); 6150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 6165344026065f79b102fcc44bc6332f856a111962aJing Huang writel(BFI_IOC_UNINIT, (rb + BFA_IOC0_STATE_REG)); 6175344026065f79b102fcc44bc6332f856a111962aJing Huang writel(BFI_IOC_UNINIT, (rb + BFA_IOC1_STATE_REG)); 6185344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_MSK)); 6195344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_MSK)); 6205344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS)); 6215344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS)); 6225344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_MSK)); 6235344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_MSK)); 624111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(pll_sclk | __APP_PLL_SCLK_LOGIC_SOFT_RESET, 625111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati rb + APP_PLL_SCLK_CTL_REG); 626111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(pll_fclk | __APP_PLL_LCLK_LOGIC_SOFT_RESET, 627111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati rb + APP_PLL_LCLK_CTL_REG); 628111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(pll_sclk | __APP_PLL_SCLK_LOGIC_SOFT_RESET | 629111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_SCLK_ENABLE, rb + APP_PLL_SCLK_CTL_REG); 630111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(pll_fclk | __APP_PLL_LCLK_LOGIC_SOFT_RESET | 631111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_LCLK_ENABLE, rb + APP_PLL_LCLK_CTL_REG); 6325344026065f79b102fcc44bc6332f856a111962aJing Huang readl(rb + HOSTFN0_INT_MSK); 6336a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(2000); 6345344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS)); 6355344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS)); 636111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(pll_sclk | __APP_PLL_SCLK_ENABLE, rb + APP_PLL_SCLK_CTL_REG); 637111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(pll_fclk | __APP_PLL_LCLK_ENABLE, rb + APP_PLL_LCLK_CTL_REG); 638111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!fcmode) { 6405344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P0)); 6415344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P1)); 642df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang } 6435344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl((rb + PSS_CTL_REG)); 644df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang r32 &= ~__PSS_LMEM_RESET; 6455344026065f79b102fcc44bc6332f856a111962aJing Huang writel(r32, (rb + PSS_CTL_REG)); 6466a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(1000); 647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!fcmode) { 6485344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + PMM_1T_RESET_REG_P0)); 6495344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + PMM_1T_RESET_REG_P1)); 650df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang } 651df2a52a6c8c4995e0bec0b739ddb2f51664837ddJing Huang 6525344026065f79b102fcc44bc6332f856a111962aJing Huang writel(__EDRAM_BISTR_START, (rb + MBIST_CTL_REG)); 6536a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(1000); 6545344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl((rb + MBIST_STAT_REG)); 6555344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, (rb + MBIST_CTL_REG)); 6560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_STATUS_OK; 6570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati} 658111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 659111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void 66010a07379247078448c076690657a076076bf89aaKrishna Gudipatibfa_ioc_ct2_sclk_init(void __iomem *rb) 661111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 662111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati u32 r32; 663111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 664111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 665111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * put s_clk PLL and PLL FSM in reset 666111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 667111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG)); 668111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 &= ~(__APP_PLL_SCLK_ENABLE | __APP_PLL_SCLK_LRESETN); 669111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 |= (__APP_PLL_SCLK_ENARST | __APP_PLL_SCLK_BYPASS | 670111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_SCLK_LOGIC_SOFT_RESET); 671111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(r32, (rb + CT2_APP_PLL_SCLK_CTL_REG)); 672111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 673111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 67410a07379247078448c076690657a076076bf89aaKrishna Gudipati * Ignore mode and program for the max clock (which is FC16) 67510a07379247078448c076690657a076076bf89aaKrishna Gudipati * Firmware/NFC will do the PLL init appropiately 676111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 677111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG)); 678111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 &= ~(__APP_PLL_SCLK_REFCLK_SEL | __APP_PLL_SCLK_CLK_DIV2); 67910a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32, (rb + CT2_APP_PLL_SCLK_CTL_REG)); 680111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 681111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 682775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati * while doing PLL init dont clock gate ethernet subsystem 683111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 684775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati r32 = readl((rb + CT2_CHIP_MISC_PRG)); 685775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati writel(r32 | __ETH_CLK_ENABLE_PORT0, (rb + CT2_CHIP_MISC_PRG)); 686111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 687775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati r32 = readl((rb + CT2_PCIE_MISC_REG)); 688775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati writel(r32 | __ETH_CLK_ENABLE_PORT1, (rb + CT2_PCIE_MISC_REG)); 689111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 690111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 691111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * set sclk value 692111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 693111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG)); 694111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 &= (__P_SCLK_PLL_LOCK | __APP_PLL_SCLK_REFCLK_SEL | 695111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_SCLK_CLK_DIV2); 696111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(r32 | 0x1061731b, (rb + CT2_APP_PLL_SCLK_CTL_REG)); 697111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 698111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 699111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * poll for s_clk lock or delay 1ms 700111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 701111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati udelay(1000); 702111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 703111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 704111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void 70510a07379247078448c076690657a076076bf89aaKrishna Gudipatibfa_ioc_ct2_lclk_init(void __iomem *rb) 706111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 707111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati u32 r32; 708111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 709111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 710111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * put l_clk PLL and PLL FSM in reset 711111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 712111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG)); 713111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 &= ~(__APP_PLL_LCLK_ENABLE | __APP_PLL_LCLK_LRESETN); 714111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 |= (__APP_PLL_LCLK_ENARST | __APP_PLL_LCLK_BYPASS | 715111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati __APP_PLL_LCLK_LOGIC_SOFT_RESET); 716111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(r32, (rb + CT2_APP_PLL_LCLK_CTL_REG)); 717111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 718111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 71910a07379247078448c076690657a076076bf89aaKrishna Gudipati * set LPU speed (set for FC16 which will work for other modes) 720111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 721111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_CHIP_MISC_PRG)); 72210a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32, (rb + CT2_CHIP_MISC_PRG)); 723111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 724111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 72510a07379247078448c076690657a076076bf89aaKrishna Gudipati * set LPU half speed (set for FC16 which will work for other modes) 726111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 727111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG)); 72810a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32, (rb + CT2_APP_PLL_LCLK_CTL_REG)); 729111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 730111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 73110a07379247078448c076690657a076076bf89aaKrishna Gudipati * set lclk for mode (set for FC16) 732111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 733111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG)); 734111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 &= (__P_LCLK_PLL_LOCK | __APP_LPUCLK_HALFSPEED); 73510a07379247078448c076690657a076076bf89aaKrishna Gudipati r32 |= 0x20c1731b; 736111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(r32, (rb + CT2_APP_PLL_LCLK_CTL_REG)); 737111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 738111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 739111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * poll for s_clk lock or delay 1ms 740111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 741111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati udelay(1000); 742111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 743111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 744111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void 74510a07379247078448c076690657a076076bf89aaKrishna Gudipatibfa_ioc_ct2_mem_init(void __iomem *rb) 746111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 747111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati u32 r32; 748111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 749111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl((rb + PSS_CTL_REG)); 750111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 &= ~__PSS_LMEM_RESET; 751111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(r32, (rb + PSS_CTL_REG)); 752111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati udelay(1000); 753111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 754111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(__EDRAM_BISTR_START, (rb + CT2_MBIST_CTL_REG)); 755111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati udelay(1000); 756111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(0, (rb + CT2_MBIST_CTL_REG)); 757111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 758111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 75910a07379247078448c076690657a076076bf89aaKrishna Gudipativoid 76010a07379247078448c076690657a076076bf89aaKrishna Gudipatibfa_ioc_ct2_mac_reset(void __iomem *rb) 76110a07379247078448c076690657a076076bf89aaKrishna Gudipati{ 76210a07379247078448c076690657a076076bf89aaKrishna Gudipati u32 r32; 76310a07379247078448c076690657a076076bf89aaKrishna Gudipati 76410a07379247078448c076690657a076076bf89aaKrishna Gudipati bfa_ioc_ct2_sclk_init(rb); 76510a07379247078448c076690657a076076bf89aaKrishna Gudipati bfa_ioc_ct2_lclk_init(rb); 76610a07379247078448c076690657a076076bf89aaKrishna Gudipati 76710a07379247078448c076690657a076076bf89aaKrishna Gudipati /* 76810a07379247078448c076690657a076076bf89aaKrishna Gudipati * release soft reset on s_clk & l_clk 76910a07379247078448c076690657a076076bf89aaKrishna Gudipati */ 77010a07379247078448c076690657a076076bf89aaKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG)); 77110a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET, 77210a07379247078448c076690657a076076bf89aaKrishna Gudipati (rb + CT2_APP_PLL_SCLK_CTL_REG)); 77310a07379247078448c076690657a076076bf89aaKrishna Gudipati 77410a07379247078448c076690657a076076bf89aaKrishna Gudipati /* 77510a07379247078448c076690657a076076bf89aaKrishna Gudipati * release soft reset on s_clk & l_clk 77610a07379247078448c076690657a076076bf89aaKrishna Gudipati */ 77710a07379247078448c076690657a076076bf89aaKrishna Gudipati r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG)); 77810a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET, 77910a07379247078448c076690657a076076bf89aaKrishna Gudipati (rb + CT2_APP_PLL_LCLK_CTL_REG)); 78010a07379247078448c076690657a076076bf89aaKrishna Gudipati 78110a07379247078448c076690657a076076bf89aaKrishna Gudipati /* put port0, port1 MAC & AHB in reset */ 78210a07379247078448c076690657a076076bf89aaKrishna Gudipati writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET), 78310a07379247078448c076690657a076076bf89aaKrishna Gudipati rb + CT2_CSI_MAC_CONTROL_REG(0)); 78410a07379247078448c076690657a076076bf89aaKrishna Gudipati writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET), 78510a07379247078448c076690657a076076bf89aaKrishna Gudipati rb + CT2_CSI_MAC_CONTROL_REG(1)); 78610a07379247078448c076690657a076076bf89aaKrishna Gudipati} 78710a07379247078448c076690657a076076bf89aaKrishna Gudipati 78810a07379247078448c076690657a076076bf89aaKrishna Gudipati#define CT2_NFC_MAX_DELAY 1000 789a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati#define CT2_NFC_VER_VALID 0x143 790a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati#define BFA_IOC_PLL_POLL 1000000 791a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 792a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipatistatic bfa_boolean_t 793a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipatibfa_ioc_ct2_nfc_halted(void __iomem *rb) 794a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati{ 795a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati u32 r32; 796a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 797a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_NFC_CSR_SET_REG); 798a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (r32 & __NFC_CONTROLLER_HALTED) 799a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati return BFA_TRUE; 800a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 801a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati return BFA_FALSE; 802a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati} 803a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 804a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipatistatic void 805a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipatibfa_ioc_ct2_nfc_resume(void __iomem *rb) 806a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati{ 807a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati u32 r32; 808a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati int i; 809a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 810a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_CLR_REG); 811a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati for (i = 0; i < CT2_NFC_MAX_DELAY; i++) { 812a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_NFC_CSR_SET_REG); 813a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (!(r32 & __NFC_CONTROLLER_HALTED)) 814a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati return; 815a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati udelay(1000); 816a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } 817a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati WARN_ON(1); 818a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati} 819a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 820111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_status_t 821111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode) 822111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{ 823a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati u32 wgn, r32, nfc_ver, i; 8248b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati 82510a07379247078448c076690657a076076bf89aaKrishna Gudipati wgn = readl(rb + CT2_WGN_STATUS); 826a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati nfc_ver = readl(rb + CT2_RSC_GPR15_REG); 827a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 828a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if ((wgn == (__A2T_AHB_LOAD | __WGN_READY)) && 829a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati (nfc_ver >= CT2_NFC_VER_VALID)) { 830a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (bfa_ioc_ct2_nfc_halted(rb)) 831a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati bfa_ioc_ct2_nfc_resume(rb); 832a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 833a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(__RESET_AND_START_SCLK_LCLK_PLLS, 834a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati rb + CT2_CSI_FW_CTL_SET_REG); 835a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 836a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati for (i = 0; i < BFA_IOC_PLL_POLL; i++) { 837a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); 838a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (r32 & __RESET_AND_START_SCLK_LCLK_PLLS) 839a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati break; 840a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } 841a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 842a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati WARN_ON(!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS)); 843a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 844a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati for (i = 0; i < BFA_IOC_PLL_POLL; i++) { 845a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); 846a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS)) 847a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati break; 848a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } 849a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 850a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati WARN_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS); 851a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati udelay(1000); 852a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 853a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_CSI_FW_CTL_REG); 854a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati WARN_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS); 855a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } else { 85610a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_SET_REG); 85710a07379247078448c076690657a076076bf89aaKrishna Gudipati for (i = 0; i < CT2_NFC_MAX_DELAY; i++) { 85810a07379247078448c076690657a076076bf89aaKrishna Gudipati r32 = readl(rb + CT2_NFC_CSR_SET_REG); 85910a07379247078448c076690657a076076bf89aaKrishna Gudipati if (r32 & __NFC_CONTROLLER_HALTED) 86010a07379247078448c076690657a076076bf89aaKrishna Gudipati break; 86110a07379247078448c076690657a076076bf89aaKrishna Gudipati udelay(1000); 86210a07379247078448c076690657a076076bf89aaKrishna Gudipati } 8638b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati 864a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati bfa_ioc_ct2_mac_reset(rb); 865a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati bfa_ioc_ct2_sclk_init(rb); 866a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati bfa_ioc_ct2_lclk_init(rb); 867a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 868a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati /* 869a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati * release soft reset on s_clk & l_clk 870a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati */ 871a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_APP_PLL_SCLK_CTL_REG); 872a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET, 873a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati (rb + CT2_APP_PLL_SCLK_CTL_REG)); 874a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 875a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati /* 876a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati * release soft reset on s_clk & l_clk 877a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati */ 878a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); 879a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET, 880a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati (rb + CT2_APP_PLL_LCLK_CTL_REG)); 88110a07379247078448c076690657a076076bf89aaKrishna Gudipati } 882111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 883775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati /* 8848b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati * Announce flash device presence, if flash was corrupted. 885775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati */ 88610a07379247078448c076690657a076076bf89aaKrishna Gudipati if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) { 887a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + PSS_GPIO_OUT_REG); 88810a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32 & ~1, (rb + PSS_GPIO_OUT_REG)); 889a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + PSS_GPIO_OE_REG); 89010a07379247078448c076690657a076076bf89aaKrishna Gudipati writel(r32 | 1, (rb + PSS_GPIO_OE_REG)); 8918b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati } 892775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 893a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati /* 894a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati * Mask the interrupts and clear any 895a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati * pending interrupts. 896a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati */ 897a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK)); 898a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK)); 899a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 900a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati /* For first time initialization, no need to clear interrupts */ 901a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + HOST_SEM5_REG); 902a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (r32 & 0x1) { 903a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_LPU0_HOSTFN_CMD_STAT); 904a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (r32 == 1) { 905a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(1, rb + CT2_LPU0_HOSTFN_CMD_STAT); 906a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati readl((rb + CT2_LPU0_HOSTFN_CMD_STAT)); 907a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } 908a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati r32 = readl(rb + CT2_LPU1_HOSTFN_CMD_STAT); 909a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati if (r32 == 1) { 910a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(1, rb + CT2_LPU1_HOSTFN_CMD_STAT); 911a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati readl(rb + CT2_LPU1_HOSTFN_CMD_STAT); 912a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } 913a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati } 914a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 91510a07379247078448c076690657a076076bf89aaKrishna Gudipati bfa_ioc_ct2_mem_init(rb); 91610a07379247078448c076690657a076076bf89aaKrishna Gudipati 917a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(BFI_IOC_UNINIT, rb + CT2_BFA_IOC0_STATE_REG); 918a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati writel(BFI_IOC_UNINIT, rb + CT2_BFA_IOC1_STATE_REG); 919a6b963db0de3c9aa22db2f872e38c2a12edf09a7Krishna Gudipati 920111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati return BFA_STATUS_OK; 921111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati} 922