hinic_hw_cmdq.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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_CMDQ_H
  16. #define HINIC_CMDQ_H
  17. #include <linux/types.h>
  18. #include <linux/spinlock.h>
  19. #include <linux/completion.h>
  20. #include <linux/pci.h>
  21. #include "hinic_hw_if.h"
  22. #include "hinic_hw_wq.h"
  23. #define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_SHIFT 0
  24. #define HINIC_CMDQ_CTXT_EQ_ID_SHIFT 56
  25. #define HINIC_CMDQ_CTXT_CEQ_ARM_SHIFT 61
  26. #define HINIC_CMDQ_CTXT_CEQ_EN_SHIFT 62
  27. #define HINIC_CMDQ_CTXT_WRAPPED_SHIFT 63
  28. #define HINIC_CMDQ_CTXT_CURR_WQE_PAGE_PFN_MASK 0xFFFFFFFFFFFFF
  29. #define HINIC_CMDQ_CTXT_EQ_ID_MASK 0x1F
  30. #define HINIC_CMDQ_CTXT_CEQ_ARM_MASK 0x1
  31. #define HINIC_CMDQ_CTXT_CEQ_EN_MASK 0x1
  32. #define HINIC_CMDQ_CTXT_WRAPPED_MASK 0x1
  33. #define HINIC_CMDQ_CTXT_PAGE_INFO_SET(val, member) \
  34. (((u64)(val) & HINIC_CMDQ_CTXT_##member##_MASK) \
  35. << HINIC_CMDQ_CTXT_##member##_SHIFT)
  36. #define HINIC_CMDQ_CTXT_PAGE_INFO_CLEAR(val, member) \
  37. ((val) & (~((u64)HINIC_CMDQ_CTXT_##member##_MASK \
  38. << HINIC_CMDQ_CTXT_##member##_SHIFT)))
  39. #define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_SHIFT 0
  40. #define HINIC_CMDQ_CTXT_CI_SHIFT 52
  41. #define HINIC_CMDQ_CTXT_WQ_BLOCK_PFN_MASK 0xFFFFFFFFFFFFF
  42. #define HINIC_CMDQ_CTXT_CI_MASK 0xFFF
  43. #define HINIC_CMDQ_CTXT_BLOCK_INFO_SET(val, member) \
  44. (((u64)(val) & HINIC_CMDQ_CTXT_##member##_MASK) \
  45. << HINIC_CMDQ_CTXT_##member##_SHIFT)
  46. #define HINIC_CMDQ_CTXT_BLOCK_INFO_CLEAR(val, member) \
  47. ((val) & (~((u64)HINIC_CMDQ_CTXT_##member##_MASK \
  48. << HINIC_CMDQ_CTXT_##member##_SHIFT)))
  49. #define HINIC_SAVED_DATA_ARM_SHIFT 31
  50. #define HINIC_SAVED_DATA_ARM_MASK 0x1
  51. #define HINIC_SAVED_DATA_SET(val, member) \
  52. (((u32)(val) & HINIC_SAVED_DATA_##member##_MASK) \
  53. << HINIC_SAVED_DATA_##member##_SHIFT)
  54. #define HINIC_SAVED_DATA_GET(val, member) \
  55. (((val) >> HINIC_SAVED_DATA_##member##_SHIFT) \
  56. & HINIC_SAVED_DATA_##member##_MASK)
  57. #define HINIC_SAVED_DATA_CLEAR(val, member) \
  58. ((val) & (~(HINIC_SAVED_DATA_##member##_MASK \
  59. << HINIC_SAVED_DATA_##member##_SHIFT)))
  60. #define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_SHIFT 0
  61. #define HINIC_CMDQ_DB_INFO_PATH_SHIFT 23
  62. #define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_SHIFT 24
  63. #define HINIC_CMDQ_DB_INFO_DB_TYPE_SHIFT 27
  64. #define HINIC_CMDQ_DB_INFO_HI_PROD_IDX_MASK 0xFF
  65. #define HINIC_CMDQ_DB_INFO_PATH_MASK 0x1
  66. #define HINIC_CMDQ_DB_INFO_CMDQ_TYPE_MASK 0x7
  67. #define HINIC_CMDQ_DB_INFO_DB_TYPE_MASK 0x1F
  68. #define HINIC_CMDQ_DB_INFO_SET(val, member) \
  69. (((u32)(val) & HINIC_CMDQ_DB_INFO_##member##_MASK) \
  70. << HINIC_CMDQ_DB_INFO_##member##_SHIFT)
  71. #define HINIC_CMDQ_BUF_SIZE 2048
  72. #define HINIC_CMDQ_BUF_HW_RSVD 8
  73. #define HINIC_CMDQ_MAX_DATA_SIZE (HINIC_CMDQ_BUF_SIZE - \
  74. HINIC_CMDQ_BUF_HW_RSVD)
  75. enum hinic_cmdq_type {
  76. HINIC_CMDQ_SYNC,
  77. HINIC_MAX_CMDQ_TYPES,
  78. };
  79. enum hinic_set_arm_qtype {
  80. HINIC_SET_ARM_CMDQ,
  81. };
  82. enum hinic_cmd_ack_type {
  83. HINIC_CMD_ACK_TYPE_CMDQ,
  84. };
  85. struct hinic_cmdq_buf {
  86. void *buf;
  87. dma_addr_t dma_addr;
  88. size_t size;
  89. };
  90. struct hinic_cmdq_arm_bit {
  91. u32 q_type;
  92. u32 q_id;
  93. };
  94. struct hinic_cmdq_ctxt_info {
  95. u64 curr_wqe_page_pfn;
  96. u64 wq_block_pfn;
  97. };
  98. struct hinic_cmdq_ctxt {
  99. u8 status;
  100. u8 version;
  101. u8 rsvd0[6];
  102. u16 func_idx;
  103. u8 cmdq_type;
  104. u8 rsvd1[1];
  105. u8 rsvd2[4];
  106. struct hinic_cmdq_ctxt_info ctxt_info;
  107. };
  108. struct hinic_cmdq {
  109. struct hinic_wq *wq;
  110. enum hinic_cmdq_type cmdq_type;
  111. int wrapped;
  112. /* Lock for keeping the doorbell order */
  113. spinlock_t cmdq_lock;
  114. struct completion **done;
  115. int **errcode;
  116. /* doorbell area */
  117. void __iomem *db_base;
  118. };
  119. struct hinic_cmdqs {
  120. struct hinic_hwif *hwif;
  121. struct dma_pool *cmdq_buf_pool;
  122. struct hinic_wq *saved_wqs;
  123. struct hinic_cmdq_pages cmdq_pages;
  124. struct hinic_cmdq cmdq[HINIC_MAX_CMDQ_TYPES];
  125. };
  126. int hinic_alloc_cmdq_buf(struct hinic_cmdqs *cmdqs,
  127. struct hinic_cmdq_buf *cmdq_buf);
  128. void hinic_free_cmdq_buf(struct hinic_cmdqs *cmdqs,
  129. struct hinic_cmdq_buf *cmdq_buf);
  130. int hinic_cmdq_direct_resp(struct hinic_cmdqs *cmdqs,
  131. enum hinic_mod_type mod, u8 cmd,
  132. struct hinic_cmdq_buf *buf_in, u64 *out_param);
  133. int hinic_set_arm_bit(struct hinic_cmdqs *cmdqs,
  134. enum hinic_set_arm_qtype q_type, u32 q_id);
  135. int hinic_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif,
  136. void __iomem **db_area);
  137. void hinic_free_cmdqs(struct hinic_cmdqs *cmdqs);
  138. #endif