bfa_hw_ct.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
  4. * Copyright (c) 2014- QLogic Corporation.
  5. * All rights reserved
  6. * www.qlogic.com
  7. *
  8. * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
  9. */
  10. #include "bfad_drv.h"
  11. #include "bfa_modules.h"
  12. #include "bfi_reg.h"
  13. BFA_TRC_FILE(HAL, IOCFC_CT);
  14. /*
  15. * Dummy interrupt handler for handling spurious interrupt during chip-reinit.
  16. */
  17. static void
  18. bfa_hwct_msix_dummy(struct bfa_s *bfa, int vec)
  19. {
  20. }
  21. void
  22. bfa_hwct_reginit(struct bfa_s *bfa)
  23. {
  24. struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs;
  25. void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
  26. int fn = bfa_ioc_pcifn(&bfa->ioc);
  27. if (fn == 0) {
  28. bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS);
  29. bfa_regs->intr_mask = (kva + HOSTFN0_INT_MSK);
  30. } else {
  31. bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS);
  32. bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK);
  33. }
  34. }
  35. void
  36. bfa_hwct2_reginit(struct bfa_s *bfa)
  37. {
  38. struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs;
  39. void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
  40. bfa_regs->intr_status = (kva + CT2_HOSTFN_INT_STATUS);
  41. bfa_regs->intr_mask = (kva + CT2_HOSTFN_INTR_MASK);
  42. }
  43. void
  44. bfa_hwct_reqq_ack(struct bfa_s *bfa, int reqq)
  45. {
  46. u32 r32;
  47. r32 = readl(bfa->iocfc.bfa_regs.cpe_q_ctrl[reqq]);
  48. writel(r32, bfa->iocfc.bfa_regs.cpe_q_ctrl[reqq]);
  49. }
  50. /*
  51. * Actions to respond RME Interrupt for Catapult ASIC:
  52. * - Write 1 to Interrupt Status register (INTx only - done in bfa_intx())
  53. * - Acknowledge by writing to RME Queue Control register
  54. * - Update CI
  55. */
  56. void
  57. bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq, u32 ci)
  58. {
  59. u32 r32;
  60. r32 = readl(bfa->iocfc.bfa_regs.rme_q_ctrl[rspq]);
  61. writel(r32, bfa->iocfc.bfa_regs.rme_q_ctrl[rspq]);
  62. bfa_rspq_ci(bfa, rspq) = ci;
  63. writel(ci, bfa->iocfc.bfa_regs.rme_q_ci[rspq]);
  64. }
  65. /*
  66. * Actions to respond RME Interrupt for Catapult2 ASIC:
  67. * - Write 1 to Interrupt Status register (INTx only - done in bfa_intx())
  68. * - Update CI
  69. */
  70. void
  71. bfa_hwct2_rspq_ack(struct bfa_s *bfa, int rspq, u32 ci)
  72. {
  73. bfa_rspq_ci(bfa, rspq) = ci;
  74. writel(ci, bfa->iocfc.bfa_regs.rme_q_ci[rspq]);
  75. }
  76. void
  77. bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap,
  78. u32 *num_vecs, u32 *max_vec_bit)
  79. {
  80. *msix_vecs_bmap = (1 << BFI_MSIX_CT_MAX) - 1;
  81. *max_vec_bit = (1 << (BFI_MSIX_CT_MAX - 1));
  82. *num_vecs = BFI_MSIX_CT_MAX;
  83. }
  84. /*
  85. * Setup MSI-X vector for catapult
  86. */
  87. void
  88. bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs)
  89. {
  90. WARN_ON((nvecs != 1) && (nvecs != BFI_MSIX_CT_MAX));
  91. bfa_trc(bfa, nvecs);
  92. bfa->msix.nvecs = nvecs;
  93. bfa_hwct_msix_uninstall(bfa);
  94. }
  95. void
  96. bfa_hwct_msix_ctrl_install(struct bfa_s *bfa)
  97. {
  98. if (bfa->msix.nvecs == 0)
  99. return;
  100. if (bfa->msix.nvecs == 1)
  101. bfa->msix.handler[BFI_MSIX_LPU_ERR_CT] = bfa_msix_all;
  102. else
  103. bfa->msix.handler[BFI_MSIX_LPU_ERR_CT] = bfa_msix_lpu_err;
  104. }
  105. void
  106. bfa_hwct_msix_queue_install(struct bfa_s *bfa)
  107. {
  108. int i;
  109. if (bfa->msix.nvecs == 0)
  110. return;
  111. if (bfa->msix.nvecs == 1) {
  112. for (i = BFI_MSIX_CPE_QMIN_CT; i < BFI_MSIX_CT_MAX; i++)
  113. bfa->msix.handler[i] = bfa_msix_all;
  114. return;
  115. }
  116. for (i = BFI_MSIX_CPE_QMIN_CT; i <= BFI_MSIX_CPE_QMAX_CT; i++)
  117. bfa->msix.handler[i] = bfa_msix_reqq;
  118. for (i = BFI_MSIX_RME_QMIN_CT; i <= BFI_MSIX_RME_QMAX_CT; i++)
  119. bfa->msix.handler[i] = bfa_msix_rspq;
  120. }
  121. void
  122. bfa_hwct_msix_uninstall(struct bfa_s *bfa)
  123. {
  124. int i;
  125. for (i = 0; i < BFI_MSIX_CT_MAX; i++)
  126. bfa->msix.handler[i] = bfa_hwct_msix_dummy;
  127. }
  128. /*
  129. * Enable MSI-X vectors
  130. */
  131. void
  132. bfa_hwct_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix)
  133. {
  134. bfa_trc(bfa, 0);
  135. bfa_ioc_isr_mode_set(&bfa->ioc, msix);
  136. }
  137. void
  138. bfa_hwct_msix_get_rme_range(struct bfa_s *bfa, u32 *start, u32 *end)
  139. {
  140. *start = BFI_MSIX_RME_QMIN_CT;
  141. *end = BFI_MSIX_RME_QMAX_CT;
  142. }