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