void bfa_isr_enable(struct bfa_s *bfa) { u32 intr_unmask; int pci_func = bfa_ioc_pcifn(&bfa->ioc); bfa_trc(bfa, pci_func); bfa_msix_install(bfa); intr_unmask = (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | __HFN_INT_LL_HALT); if (pci_func == 0) intr_unmask |= (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | __HFN_INT_CPE_Q2 | __HFN_INT_CPE_Q3 | __HFN_INT_RME_Q0 | __HFN_INT_RME_Q1 | __HFN_INT_RME_Q2 | __HFN_INT_RME_Q3 | __HFN_INT_MBOX_LPU0); else intr_unmask |= (__HFN_INT_CPE_Q4 | __HFN_INT_CPE_Q5 | __HFN_INT_CPE_Q6 | __HFN_INT_CPE_Q7 | __HFN_INT_RME_Q4 | __HFN_INT_RME_Q5 | __HFN_INT_RME_Q6 | __HFN_INT_RME_Q7 | __HFN_INT_MBOX_LPU1); writel(intr_unmask, bfa->iocfc.bfa_regs.intr_status); writel(~intr_unmask, bfa->iocfc.bfa_regs.intr_mask); bfa->iocfc.intr_mask = ~intr_unmask; bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0); }
static void bfa_ioc_cb_map_port(struct bfa_ioc_s *ioc) { ioc->port_id = bfa_ioc_pcifn(ioc); bfa_trc(ioc, ioc->port_id); }
void bfa_hwct_reginit(struct bfa_s *bfa) { struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs; void __iomem *kva = bfa_ioc_bar0(&bfa->ioc); int i, q, fn = bfa_ioc_pcifn(&bfa->ioc); if (fn == 0) { bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS); bfa_regs->intr_mask = (kva + HOSTFN0_INT_MSK); } else { bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS); bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK); } for (i = 0; i < BFI_IOC_MAX_CQS; i++) { /* * CPE registers */ q = CPE_Q_NUM(fn, i); bfa_regs->cpe_q_pi[i] = (kva + CPE_PI_PTR_Q(q << 5)); bfa_regs->cpe_q_ci[i] = (kva + CPE_CI_PTR_Q(q << 5)); bfa_regs->cpe_q_depth[i] = (kva + CPE_DEPTH_Q(q << 5)); bfa_regs->cpe_q_ctrl[i] = (kva + CPE_QCTRL_Q(q << 5)); /* * RME registers */ q = CPE_Q_NUM(fn, i); bfa_regs->rme_q_pi[i] = (kva + RME_PI_PTR_Q(q << 5)); bfa_regs->rme_q_ci[i] = (kva + RME_CI_PTR_Q(q << 5)); bfa_regs->rme_q_depth[i] = (kva + RME_DEPTH_Q(q << 5)); bfa_regs->rme_q_ctrl[i] = (kva + RME_QCTRL_Q(q << 5)); } }
void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap, u32 *num_vecs, u32 *max_vec_bit) { #define __HFN_NUMINTS 13 if (bfa_ioc_pcifn(&bfa->ioc) == 0) { *msix_vecs_bmap = (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | __HFN_INT_CPE_Q2 | __HFN_INT_CPE_Q3 | __HFN_INT_RME_Q0 | __HFN_INT_RME_Q1 | __HFN_INT_RME_Q2 | __HFN_INT_RME_Q3 | __HFN_INT_MBOX_LPU0); *max_vec_bit = __HFN_INT_MBOX_LPU0; } else { *msix_vecs_bmap = (__HFN_INT_CPE_Q4 | __HFN_INT_CPE_Q5 | __HFN_INT_CPE_Q6 | __HFN_INT_CPE_Q7 | __HFN_INT_RME_Q4 | __HFN_INT_RME_Q5 | __HFN_INT_RME_Q6 | __HFN_INT_RME_Q7 | __HFN_INT_MBOX_LPU1); *max_vec_bit = __HFN_INT_MBOX_LPU1; } *msix_vecs_bmap |= (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS); *num_vecs = __HFN_NUMINTS; }
void bfa_hwcb_reginit(struct bfa_s *bfa) { struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs; bfa_os_addr_t kva = bfa_ioc_bar0(&bfa->ioc); int i, q, fn = bfa_ioc_pcifn(&bfa->ioc); if (fn == 0) { bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS); bfa_regs->intr_mask = (kva + HOSTFN0_INT_MSK); } else { bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS); bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK); } for (i = 0; i < BFI_IOC_MAX_CQS; i++) { /* * CPE registers */ q = CPE_Q_NUM(fn, i); bfa_regs->cpe_q_pi[i] = (kva + CPE_Q_PI(q)); bfa_regs->cpe_q_ci[i] = (kva + CPE_Q_CI(q)); bfa_regs->cpe_q_depth[i] = (kva + CPE_Q_DEPTH(q)); /* * RME registers */ q = CPE_Q_NUM(fn, i); bfa_regs->rme_q_pi[i] = (kva + RME_Q_PI(q)); bfa_regs->rme_q_ci[i] = (kva + RME_Q_CI(q)); bfa_regs->rme_q_depth[i] = (kva + RME_Q_DEPTH(q)); } }
static void bfa_hwct_msix_lpu_err_set(struct bfa_s *bfa, bfa_boolean_t msix, int vec) { int fn = bfa_ioc_pcifn(&bfa->ioc); void __iomem *kva = bfa_ioc_bar0(&bfa->ioc); if (msix) writel(vec, kva + __ct_msix_err_vec_reg[fn]); else writel(0, kva + __ct_msix_err_vec_reg[fn]); }
static void bfa_hwct_msix_lpu_err_set(struct bfa_s *bfa, bfa_boolean_t msix, int vec) { int fn = bfa_ioc_pcifn(&bfa->ioc); bfa_os_addr_t kva = bfa_ioc_bar0(&bfa->ioc); if (msix) bfa_reg_write(kva + __ct_msix_err_vec_reg[fn], vec); else bfa_reg_write(kva + __ct_msix_err_vec_reg[fn], 0); }
/* * Actions to respond RME Interrupt for Crossbow ASIC: * - Write 1 to Interrupt Status register * INTX - done in bfa_intx() * MSIX - done in bfa_hwcb_rspq_ack_msix() * - Update CI (only if new CI) */ static void bfa_hwcb_rspq_ack_msix(struct bfa_s *bfa, int rspq, u32 ci) { writel(__HFN_INT_RME_Q0 << RME_Q_NUM(bfa_ioc_pcifn(&bfa->ioc), rspq), bfa->iocfc.bfa_regs.intr_status); if (bfa_rspq_ci(bfa, rspq) == ci) return; bfa_rspq_ci(bfa, rspq) = ci; writel(ci, bfa->iocfc.bfa_regs.rme_q_ci[rspq]); mmiowb(); }
void bfa_hwct_reginit(struct bfa_s *bfa) { struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs; void __iomem *kva = bfa_ioc_bar0(&bfa->ioc); int fn = bfa_ioc_pcifn(&bfa->ioc); if (fn == 0) { bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS); bfa_regs->intr_mask = (kva + HOSTFN0_INT_MSK); } else { bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS); bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK); } }
static void bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc) { void __iomem *rb; int pcifn = bfa_ioc_pcifn(ioc); rb = bfa_ioc_bar0(ioc); ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; if (ioc->port_id == 0) { ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC1_STATE_REG; } else { ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); ioc->ioc_regs.alt_ioc_fwstate = (rb + BFA_IOC0_STATE_REG); } ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd[pcifn].hfn; ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd[pcifn].lpu; ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_LCLK_CTL_REG); ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_SCLK_CTL_REG); ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CB; ioc->ioc_regs.err_set = (rb + ERR_SET_REG); }
static void bfa_hwcb_rspq_ack_msix(struct bfa_s *bfa, int rspq) { bfa_reg_write(bfa->iocfc.bfa_regs.intr_status, __HFN_INT_RME_Q0 << RME_Q_NUM(bfa_ioc_pcifn(&bfa->ioc), rspq)); }
static void bfa_hwcb_reqq_ack_msix(struct bfa_s *bfa, int reqq) { writel(__HFN_INT_CPE_Q0 << CPE_Q_NUM(bfa_ioc_pcifn(&bfa->ioc), reqq), bfa->iocfc.bfa_regs.intr_status); }