hinic_hw_api_cmd.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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_API_CMD_H
  16. #define HINIC_HW_API_CMD_H
  17. #include <linux/types.h>
  18. #include <linux/semaphore.h>
  19. #include "hinic_hw_if.h"
  20. #define HINIC_API_CMD_PI_IDX_SHIFT 0
  21. #define HINIC_API_CMD_PI_IDX_MASK 0xFFFFFF
  22. #define HINIC_API_CMD_PI_SET(val, member) \
  23. (((u32)(val) & HINIC_API_CMD_PI_##member##_MASK) << \
  24. HINIC_API_CMD_PI_##member##_SHIFT)
  25. #define HINIC_API_CMD_PI_CLEAR(val, member) \
  26. ((val) & (~(HINIC_API_CMD_PI_##member##_MASK \
  27. << HINIC_API_CMD_PI_##member##_SHIFT)))
  28. #define HINIC_API_CMD_CHAIN_REQ_RESTART_SHIFT 1
  29. #define HINIC_API_CMD_CHAIN_REQ_RESTART_MASK 0x1
  30. #define HINIC_API_CMD_CHAIN_REQ_SET(val, member) \
  31. (((u32)(val) & HINIC_API_CMD_CHAIN_REQ_##member##_MASK) << \
  32. HINIC_API_CMD_CHAIN_REQ_##member##_SHIFT)
  33. #define HINIC_API_CMD_CHAIN_REQ_GET(val, member) \
  34. (((val) >> HINIC_API_CMD_CHAIN_REQ_##member##_SHIFT) & \
  35. HINIC_API_CMD_CHAIN_REQ_##member##_MASK)
  36. #define HINIC_API_CMD_CHAIN_REQ_CLEAR(val, member) \
  37. ((val) & (~(HINIC_API_CMD_CHAIN_REQ_##member##_MASK \
  38. << HINIC_API_CMD_CHAIN_REQ_##member##_SHIFT)))
  39. #define HINIC_API_CMD_CHAIN_CTRL_RESTART_WB_STAT_SHIFT 1
  40. #define HINIC_API_CMD_CHAIN_CTRL_XOR_ERR_SHIFT 2
  41. #define HINIC_API_CMD_CHAIN_CTRL_AEQE_EN_SHIFT 4
  42. #define HINIC_API_CMD_CHAIN_CTRL_AEQ_ID_SHIFT 8
  43. #define HINIC_API_CMD_CHAIN_CTRL_XOR_CHK_EN_SHIFT 28
  44. #define HINIC_API_CMD_CHAIN_CTRL_CELL_SIZE_SHIFT 30
  45. #define HINIC_API_CMD_CHAIN_CTRL_RESTART_WB_STAT_MASK 0x1
  46. #define HINIC_API_CMD_CHAIN_CTRL_XOR_ERR_MASK 0x1
  47. #define HINIC_API_CMD_CHAIN_CTRL_AEQE_EN_MASK 0x1
  48. #define HINIC_API_CMD_CHAIN_CTRL_AEQ_ID_MASK 0x3
  49. #define HINIC_API_CMD_CHAIN_CTRL_XOR_CHK_EN_MASK 0x3
  50. #define HINIC_API_CMD_CHAIN_CTRL_CELL_SIZE_MASK 0x3
  51. #define HINIC_API_CMD_CHAIN_CTRL_SET(val, member) \
  52. (((u32)(val) & HINIC_API_CMD_CHAIN_CTRL_##member##_MASK) << \
  53. HINIC_API_CMD_CHAIN_CTRL_##member##_SHIFT)
  54. #define HINIC_API_CMD_CHAIN_CTRL_CLEAR(val, member) \
  55. ((val) & (~(HINIC_API_CMD_CHAIN_CTRL_##member##_MASK \
  56. << HINIC_API_CMD_CHAIN_CTRL_##member##_SHIFT)))
  57. #define HINIC_API_CMD_CELL_CTRL_DATA_SZ_SHIFT 0
  58. #define HINIC_API_CMD_CELL_CTRL_RD_DMA_ATTR_SHIFT 16
  59. #define HINIC_API_CMD_CELL_CTRL_WR_DMA_ATTR_SHIFT 24
  60. #define HINIC_API_CMD_CELL_CTRL_XOR_CHKSUM_SHIFT 56
  61. #define HINIC_API_CMD_CELL_CTRL_DATA_SZ_MASK 0x3F
  62. #define HINIC_API_CMD_CELL_CTRL_RD_DMA_ATTR_MASK 0x3F
  63. #define HINIC_API_CMD_CELL_CTRL_WR_DMA_ATTR_MASK 0x3F
  64. #define HINIC_API_CMD_CELL_CTRL_XOR_CHKSUM_MASK 0xFF
  65. #define HINIC_API_CMD_CELL_CTRL_SET(val, member) \
  66. ((((u64)val) & HINIC_API_CMD_CELL_CTRL_##member##_MASK) << \
  67. HINIC_API_CMD_CELL_CTRL_##member##_SHIFT)
  68. #define HINIC_API_CMD_DESC_API_TYPE_SHIFT 0
  69. #define HINIC_API_CMD_DESC_RD_WR_SHIFT 1
  70. #define HINIC_API_CMD_DESC_MGMT_BYPASS_SHIFT 2
  71. #define HINIC_API_CMD_DESC_DEST_SHIFT 32
  72. #define HINIC_API_CMD_DESC_SIZE_SHIFT 40
  73. #define HINIC_API_CMD_DESC_XOR_CHKSUM_SHIFT 56
  74. #define HINIC_API_CMD_DESC_API_TYPE_MASK 0x1
  75. #define HINIC_API_CMD_DESC_RD_WR_MASK 0x1
  76. #define HINIC_API_CMD_DESC_MGMT_BYPASS_MASK 0x1
  77. #define HINIC_API_CMD_DESC_DEST_MASK 0x1F
  78. #define HINIC_API_CMD_DESC_SIZE_MASK 0x7FF
  79. #define HINIC_API_CMD_DESC_XOR_CHKSUM_MASK 0xFF
  80. #define HINIC_API_CMD_DESC_SET(val, member) \
  81. ((((u64)val) & HINIC_API_CMD_DESC_##member##_MASK) << \
  82. HINIC_API_CMD_DESC_##member##_SHIFT)
  83. #define HINIC_API_CMD_STATUS_HEADER_CHAIN_ID_SHIFT 16
  84. #define HINIC_API_CMD_STATUS_HEADER_CHAIN_ID_MASK 0xFF
  85. #define HINIC_API_CMD_STATUS_HEADER_GET(val, member) \
  86. (((val) >> HINIC_API_CMD_STATUS_HEADER_##member##_SHIFT) & \
  87. HINIC_API_CMD_STATUS_HEADER_##member##_MASK)
  88. #define HINIC_API_CMD_STATUS_CONS_IDX_SHIFT 0
  89. #define HINIC_API_CMD_STATUS_CHKSUM_ERR_SHIFT 28
  90. #define HINIC_API_CMD_STATUS_CONS_IDX_MASK 0xFFFFFF
  91. #define HINIC_API_CMD_STATUS_CHKSUM_ERR_MASK 0x3
  92. #define HINIC_API_CMD_STATUS_GET(val, member) \
  93. (((val) >> HINIC_API_CMD_STATUS_##member##_SHIFT) & \
  94. HINIC_API_CMD_STATUS_##member##_MASK)
  95. enum hinic_api_cmd_chain_type {
  96. HINIC_API_CMD_WRITE_TO_MGMT_CPU = 2,
  97. HINIC_API_CMD_MAX,
  98. };
  99. struct hinic_api_cmd_chain_attr {
  100. struct hinic_hwif *hwif;
  101. enum hinic_api_cmd_chain_type chain_type;
  102. u32 num_cells;
  103. u16 cell_size;
  104. };
  105. struct hinic_api_cmd_status {
  106. u64 header;
  107. u32 status;
  108. u32 rsvd0;
  109. u32 rsvd1;
  110. u32 rsvd2;
  111. u64 rsvd3;
  112. };
  113. /* HW struct */
  114. struct hinic_api_cmd_cell {
  115. u64 ctrl;
  116. /* address is 64 bit in HW struct */
  117. u64 next_cell_paddr;
  118. u64 desc;
  119. /* HW struct */
  120. union {
  121. struct {
  122. u64 hw_cmd_paddr;
  123. } write;
  124. struct {
  125. u64 hw_wb_resp_paddr;
  126. u64 hw_cmd_paddr;
  127. } read;
  128. };
  129. };
  130. struct hinic_api_cmd_cell_ctxt {
  131. dma_addr_t cell_paddr;
  132. struct hinic_api_cmd_cell *cell_vaddr;
  133. dma_addr_t api_cmd_paddr;
  134. u8 *api_cmd_vaddr;
  135. };
  136. struct hinic_api_cmd_chain {
  137. struct hinic_hwif *hwif;
  138. enum hinic_api_cmd_chain_type chain_type;
  139. u32 num_cells;
  140. u16 cell_size;
  141. /* HW members in 24 bit format */
  142. u32 prod_idx;
  143. u32 cons_idx;
  144. struct semaphore sem;
  145. struct hinic_api_cmd_cell_ctxt *cell_ctxt;
  146. dma_addr_t wb_status_paddr;
  147. struct hinic_api_cmd_status *wb_status;
  148. dma_addr_t head_cell_paddr;
  149. struct hinic_api_cmd_cell *head_node;
  150. struct hinic_api_cmd_cell *curr_node;
  151. };
  152. int hinic_api_cmd_write(struct hinic_api_cmd_chain *chain,
  153. enum hinic_node_id dest, u8 *cmd, u16 size);
  154. int hinic_api_cmd_init(struct hinic_api_cmd_chain **chain,
  155. struct hinic_hwif *hwif);
  156. void hinic_api_cmd_free(struct hinic_api_cmd_chain **chain);
  157. #endif