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