hinic_hw_if.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /*
  2. * Huawei HiNIC PCI Express Linux driver
  3. * Copyright(c) 2017 Huawei Technologies Co., Ltd
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. * for more details.
  13. *
  14. */
  15. #ifndef HINIC_HW_IF_H
  16. #define HINIC_HW_IF_H
  17. #include <linux/pci.h>
  18. #include <linux/io.h>
  19. #include <linux/types.h>
  20. #include <asm/byteorder.h>
  21. #define HINIC_DMA_ATTR_ST_SHIFT 0
  22. #define HINIC_DMA_ATTR_AT_SHIFT 8
  23. #define HINIC_DMA_ATTR_PH_SHIFT 10
  24. #define HINIC_DMA_ATTR_NO_SNOOPING_SHIFT 12
  25. #define HINIC_DMA_ATTR_TPH_EN_SHIFT 13
  26. #define HINIC_DMA_ATTR_ST_MASK 0xFF
  27. #define HINIC_DMA_ATTR_AT_MASK 0x3
  28. #define HINIC_DMA_ATTR_PH_MASK 0x3
  29. #define HINIC_DMA_ATTR_NO_SNOOPING_MASK 0x1
  30. #define HINIC_DMA_ATTR_TPH_EN_MASK 0x1
  31. #define HINIC_DMA_ATTR_SET(val, member) \
  32. (((u32)(val) & HINIC_DMA_ATTR_##member##_MASK) << \
  33. HINIC_DMA_ATTR_##member##_SHIFT)
  34. #define HINIC_DMA_ATTR_CLEAR(val, member) \
  35. ((val) & (~(HINIC_DMA_ATTR_##member##_MASK \
  36. << HINIC_DMA_ATTR_##member##_SHIFT)))
  37. #define HINIC_FA0_FUNC_IDX_SHIFT 0
  38. #define HINIC_FA0_PF_IDX_SHIFT 10
  39. #define HINIC_FA0_PCI_INTF_IDX_SHIFT 14
  40. /* reserved members - off 16 */
  41. #define HINIC_FA0_FUNC_TYPE_SHIFT 24
  42. #define HINIC_FA0_FUNC_IDX_MASK 0x3FF
  43. #define HINIC_FA0_PF_IDX_MASK 0xF
  44. #define HINIC_FA0_PCI_INTF_IDX_MASK 0x3
  45. #define HINIC_FA0_FUNC_TYPE_MASK 0x1
  46. #define HINIC_FA0_GET(val, member) \
  47. (((val) >> HINIC_FA0_##member##_SHIFT) & HINIC_FA0_##member##_MASK)
  48. #define HINIC_FA1_AEQS_PER_FUNC_SHIFT 8
  49. /* reserved members - off 10 */
  50. #define HINIC_FA1_CEQS_PER_FUNC_SHIFT 12
  51. /* reserved members - off 15 */
  52. #define HINIC_FA1_IRQS_PER_FUNC_SHIFT 20
  53. #define HINIC_FA1_DMA_ATTR_PER_FUNC_SHIFT 24
  54. /* reserved members - off 27 */
  55. #define HINIC_FA1_INIT_STATUS_SHIFT 30
  56. #define HINIC_FA1_AEQS_PER_FUNC_MASK 0x3
  57. #define HINIC_FA1_CEQS_PER_FUNC_MASK 0x7
  58. #define HINIC_FA1_IRQS_PER_FUNC_MASK 0xF
  59. #define HINIC_FA1_DMA_ATTR_PER_FUNC_MASK 0x7
  60. #define HINIC_FA1_INIT_STATUS_MASK 0x1
  61. #define HINIC_FA1_GET(val, member) \
  62. (((val) >> HINIC_FA1_##member##_SHIFT) & HINIC_FA1_##member##_MASK)
  63. #define HINIC_FA4_OUTBOUND_STATE_SHIFT 0
  64. #define HINIC_FA4_DB_STATE_SHIFT 1
  65. #define HINIC_FA4_OUTBOUND_STATE_MASK 0x1
  66. #define HINIC_FA4_DB_STATE_MASK 0x1
  67. #define HINIC_FA4_GET(val, member) \
  68. (((val) >> HINIC_FA4_##member##_SHIFT) & HINIC_FA4_##member##_MASK)
  69. #define HINIC_FA4_SET(val, member) \
  70. ((((u32)val) & HINIC_FA4_##member##_MASK) << HINIC_FA4_##member##_SHIFT)
  71. #define HINIC_FA4_CLEAR(val, member) \
  72. ((val) & (~(HINIC_FA4_##member##_MASK << HINIC_FA4_##member##_SHIFT)))
  73. #define HINIC_FA5_PF_ACTION_SHIFT 0
  74. #define HINIC_FA5_PF_ACTION_MASK 0xFFFF
  75. #define HINIC_FA5_SET(val, member) \
  76. (((u32)(val) & HINIC_FA5_##member##_MASK) << HINIC_FA5_##member##_SHIFT)
  77. #define HINIC_FA5_CLEAR(val, member) \
  78. ((val) & (~(HINIC_FA5_##member##_MASK << HINIC_FA5_##member##_SHIFT)))
  79. #define HINIC_PPF_ELECTION_IDX_SHIFT 0
  80. #define HINIC_PPF_ELECTION_IDX_MASK 0x1F
  81. #define HINIC_PPF_ELECTION_SET(val, member) \
  82. (((u32)(val) & HINIC_PPF_ELECTION_##member##_MASK) << \
  83. HINIC_PPF_ELECTION_##member##_SHIFT)
  84. #define HINIC_PPF_ELECTION_GET(val, member) \
  85. (((val) >> HINIC_PPF_ELECTION_##member##_SHIFT) & \
  86. HINIC_PPF_ELECTION_##member##_MASK)
  87. #define HINIC_PPF_ELECTION_CLEAR(val, member) \
  88. ((val) & (~(HINIC_PPF_ELECTION_##member##_MASK \
  89. << HINIC_PPF_ELECTION_##member##_SHIFT)))
  90. #define HINIC_MSIX_PENDING_LIMIT_SHIFT 0
  91. #define HINIC_MSIX_COALESC_TIMER_SHIFT 8
  92. #define HINIC_MSIX_LLI_TIMER_SHIFT 16
  93. #define HINIC_MSIX_LLI_CREDIT_SHIFT 24
  94. #define HINIC_MSIX_RESEND_TIMER_SHIFT 29
  95. #define HINIC_MSIX_PENDING_LIMIT_MASK 0xFF
  96. #define HINIC_MSIX_COALESC_TIMER_MASK 0xFF
  97. #define HINIC_MSIX_LLI_TIMER_MASK 0xFF
  98. #define HINIC_MSIX_LLI_CREDIT_MASK 0x1F
  99. #define HINIC_MSIX_RESEND_TIMER_MASK 0x7
  100. #define HINIC_MSIX_ATTR_SET(val, member) \
  101. (((u32)(val) & HINIC_MSIX_##member##_MASK) << \
  102. HINIC_MSIX_##member##_SHIFT)
  103. #define HINIC_MSIX_ATTR_GET(val, member) \
  104. (((val) >> HINIC_MSIX_##member##_SHIFT) & \
  105. HINIC_MSIX_##member##_MASK)
  106. #define HINIC_MSIX_CNT_RESEND_TIMER_SHIFT 29
  107. #define HINIC_MSIX_CNT_RESEND_TIMER_MASK 0x1
  108. #define HINIC_MSIX_CNT_SET(val, member) \
  109. (((u32)(val) & HINIC_MSIX_CNT_##member##_MASK) << \
  110. HINIC_MSIX_CNT_##member##_SHIFT)
  111. #define HINIC_HWIF_NUM_AEQS(hwif) ((hwif)->attr.num_aeqs)
  112. #define HINIC_HWIF_NUM_CEQS(hwif) ((hwif)->attr.num_ceqs)
  113. #define HINIC_HWIF_NUM_IRQS(hwif) ((hwif)->attr.num_irqs)
  114. #define HINIC_HWIF_FUNC_IDX(hwif) ((hwif)->attr.func_idx)
  115. #define HINIC_HWIF_PCI_INTF(hwif) ((hwif)->attr.pci_intf_idx)
  116. #define HINIC_HWIF_PF_IDX(hwif) ((hwif)->attr.pf_idx)
  117. #define HINIC_HWIF_PPF_IDX(hwif) ((hwif)->attr.ppf_idx)
  118. #define HINIC_FUNC_TYPE(hwif) ((hwif)->attr.func_type)
  119. #define HINIC_IS_PF(hwif) (HINIC_FUNC_TYPE(hwif) == HINIC_PF)
  120. #define HINIC_IS_PPF(hwif) (HINIC_FUNC_TYPE(hwif) == HINIC_PPF)
  121. #define HINIC_PCI_CFG_REGS_BAR 0
  122. #define HINIC_PCI_DB_BAR 4
  123. #define HINIC_PCIE_ST_DISABLE 0
  124. #define HINIC_PCIE_AT_DISABLE 0
  125. #define HINIC_PCIE_PH_DISABLE 0
  126. #define HINIC_EQ_MSIX_PENDING_LIMIT_DEFAULT 0 /* Disabled */
  127. #define HINIC_EQ_MSIX_COALESC_TIMER_DEFAULT 0xFF /* max */
  128. #define HINIC_EQ_MSIX_LLI_TIMER_DEFAULT 0 /* Disabled */
  129. #define HINIC_EQ_MSIX_LLI_CREDIT_LIMIT_DEFAULT 0 /* Disabled */
  130. #define HINIC_EQ_MSIX_RESEND_TIMER_DEFAULT 7 /* max */
  131. enum hinic_pcie_nosnoop {
  132. HINIC_PCIE_SNOOP = 0,
  133. HINIC_PCIE_NO_SNOOP = 1,
  134. };
  135. enum hinic_pcie_tph {
  136. HINIC_PCIE_TPH_DISABLE = 0,
  137. HINIC_PCIE_TPH_ENABLE = 1,
  138. };
  139. enum hinic_func_type {
  140. HINIC_PF = 0,
  141. HINIC_PPF = 2,
  142. };
  143. enum hinic_mod_type {
  144. HINIC_MOD_COMM = 0, /* HW communication module */
  145. HINIC_MOD_L2NIC = 1, /* L2NIC module */
  146. HINIC_MOD_CFGM = 7, /* Configuration module */
  147. HINIC_MOD_MAX = 15
  148. };
  149. enum hinic_node_id {
  150. HINIC_NODE_ID_MGMT = 21,
  151. };
  152. enum hinic_pf_action {
  153. HINIC_PF_MGMT_INIT = 0x0,
  154. HINIC_PF_MGMT_ACTIVE = 0x11,
  155. };
  156. enum hinic_outbound_state {
  157. HINIC_OUTBOUND_ENABLE = 0,
  158. HINIC_OUTBOUND_DISABLE = 1,
  159. };
  160. enum hinic_db_state {
  161. HINIC_DB_ENABLE = 0,
  162. HINIC_DB_DISABLE = 1,
  163. };
  164. struct hinic_func_attr {
  165. u16 func_idx;
  166. u8 pf_idx;
  167. u8 pci_intf_idx;
  168. enum hinic_func_type func_type;
  169. u8 ppf_idx;
  170. u16 num_irqs;
  171. u8 num_aeqs;
  172. u8 num_ceqs;
  173. u8 num_dma_attr;
  174. };
  175. struct hinic_hwif {
  176. struct pci_dev *pdev;
  177. void __iomem *cfg_regs_bar;
  178. struct hinic_func_attr attr;
  179. };
  180. static inline u32 hinic_hwif_read_reg(struct hinic_hwif *hwif, u32 reg)
  181. {
  182. return be32_to_cpu(readl(hwif->cfg_regs_bar + reg));
  183. }
  184. static inline void hinic_hwif_write_reg(struct hinic_hwif *hwif, u32 reg,
  185. u32 val)
  186. {
  187. writel(cpu_to_be32(val), hwif->cfg_regs_bar + reg);
  188. }
  189. int hinic_msix_attr_set(struct hinic_hwif *hwif, u16 msix_index,
  190. u8 pending_limit, u8 coalesc_timer,
  191. u8 lli_timer_cfg, u8 lli_credit_limit,
  192. u8 resend_timer);
  193. int hinic_msix_attr_get(struct hinic_hwif *hwif, u16 msix_index,
  194. u8 *pending_limit, u8 *coalesc_timer_cfg,
  195. u8 *lli_timer, u8 *lli_credit_limit,
  196. u8 *resend_timer);
  197. int hinic_msix_attr_cnt_clear(struct hinic_hwif *hwif, u16 msix_index);
  198. void hinic_set_pf_action(struct hinic_hwif *hwif, enum hinic_pf_action action);
  199. enum hinic_outbound_state hinic_outbound_state_get(struct hinic_hwif *hwif);
  200. void hinic_outbound_state_set(struct hinic_hwif *hwif,
  201. enum hinic_outbound_state outbound_state);
  202. enum hinic_db_state hinic_db_state_get(struct hinic_hwif *hwif);
  203. void hinic_db_state_set(struct hinic_hwif *hwif,
  204. enum hinic_db_state db_state);
  205. int hinic_init_hwif(struct hinic_hwif *hwif, struct pci_dev *pdev);
  206. void hinic_free_hwif(struct hinic_hwif *hwif);
  207. #endif