efa_com.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
  2. /*
  3. * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
  4. */
  5. #ifndef _EFA_COM_H_
  6. #define _EFA_COM_H_
  7. #include <linux/delay.h>
  8. #include <linux/device.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/semaphore.h>
  11. #include <linux/sched.h>
  12. #include <rdma/ib_verbs.h>
  13. #include "efa_common_defs.h"
  14. #include "efa_admin_defs.h"
  15. #include "efa_admin_cmds_defs.h"
  16. #include "efa_regs_defs.h"
  17. #define EFA_MAX_HANDLERS 256
  18. struct efa_com_admin_cq {
  19. struct efa_admin_acq_entry *entries;
  20. dma_addr_t dma_addr;
  21. spinlock_t lock; /* Protects ACQ */
  22. u16 cc; /* consumer counter */
  23. u8 phase;
  24. };
  25. struct efa_com_admin_sq {
  26. struct efa_admin_aq_entry *entries;
  27. dma_addr_t dma_addr;
  28. spinlock_t lock; /* Protects ASQ */
  29. u32 __iomem *db_addr;
  30. u16 cc; /* consumer counter */
  31. u16 pc; /* producer counter */
  32. u8 phase;
  33. };
  34. /* Don't use anything other than atomic64 */
  35. struct efa_com_stats_admin {
  36. atomic64_t submitted_cmd;
  37. atomic64_t completed_cmd;
  38. atomic64_t cmd_err;
  39. atomic64_t no_completion;
  40. };
  41. enum {
  42. EFA_AQ_STATE_RUNNING_BIT = 0,
  43. EFA_AQ_STATE_POLLING_BIT = 1,
  44. };
  45. struct efa_com_admin_queue {
  46. void *dmadev;
  47. void *efa_dev;
  48. struct efa_comp_ctx *comp_ctx;
  49. u32 completion_timeout; /* usecs */
  50. u16 poll_interval; /* msecs */
  51. u16 depth;
  52. struct efa_com_admin_cq cq;
  53. struct efa_com_admin_sq sq;
  54. u16 msix_vector_idx;
  55. unsigned long state;
  56. /* Count the number of available admin commands */
  57. struct semaphore avail_cmds;
  58. struct efa_com_stats_admin stats;
  59. spinlock_t comp_ctx_lock; /* Protects completion context pool */
  60. u32 *comp_ctx_pool;
  61. u16 comp_ctx_pool_next;
  62. };
  63. struct efa_aenq_handlers;
  64. struct efa_com_eq;
  65. typedef void (*efa_eqe_handler)(struct efa_com_eq *eeq,
  66. struct efa_admin_eqe *eqe);
  67. struct efa_com_aenq {
  68. struct efa_admin_aenq_entry *entries;
  69. struct efa_aenq_handlers *aenq_handlers;
  70. dma_addr_t dma_addr;
  71. u32 cc; /* consumer counter */
  72. u16 msix_vector_idx;
  73. u16 depth;
  74. u8 phase;
  75. };
  76. struct efa_com_mmio_read {
  77. struct efa_admin_mmio_req_read_less_resp *read_resp;
  78. dma_addr_t read_resp_dma_addr;
  79. u16 seq_num;
  80. u16 mmio_read_timeout; /* usecs */
  81. /* serializes mmio reads */
  82. spinlock_t lock;
  83. };
  84. struct efa_com_dev {
  85. struct efa_com_admin_queue aq;
  86. struct efa_com_aenq aenq;
  87. u8 __iomem *reg_bar;
  88. void *dmadev;
  89. void *efa_dev;
  90. u32 supported_features;
  91. u32 dma_addr_bits;
  92. struct efa_com_mmio_read mmio_read;
  93. };
  94. struct efa_com_eq {
  95. struct efa_com_dev *edev;
  96. struct efa_admin_eqe *eqes;
  97. dma_addr_t dma_addr;
  98. u32 cc; /* Consumer counter */
  99. u16 eqn;
  100. u16 depth;
  101. u8 phase;
  102. efa_eqe_handler cb;
  103. };
  104. struct efa_com_create_eq_params {
  105. dma_addr_t dma_addr;
  106. u32 event_bitmask;
  107. u16 depth;
  108. u8 entry_size_in_bytes;
  109. u8 msix_vec;
  110. };
  111. struct efa_com_create_eq_result {
  112. u16 eqn;
  113. };
  114. struct efa_com_destroy_eq_params {
  115. u16 eqn;
  116. };
  117. typedef void (*efa_aenq_handler)(void *data,
  118. struct efa_admin_aenq_entry *aenq_e);
  119. /* Holds aenq handlers. Indexed by AENQ event group */
  120. struct efa_aenq_handlers {
  121. efa_aenq_handler handlers[EFA_MAX_HANDLERS];
  122. efa_aenq_handler unimplemented_handler;
  123. };
  124. void efa_com_set_dma_addr(dma_addr_t addr, u32 *addr_high, u32 *addr_low);
  125. int efa_com_admin_init(struct efa_com_dev *edev,
  126. struct efa_aenq_handlers *aenq_handlers);
  127. void efa_com_admin_destroy(struct efa_com_dev *edev);
  128. int efa_com_eq_init(struct efa_com_dev *edev, struct efa_com_eq *eeq,
  129. efa_eqe_handler cb, u16 depth, u8 msix_vec);
  130. void efa_com_eq_destroy(struct efa_com_dev *edev, struct efa_com_eq *eeq);
  131. int efa_com_dev_reset(struct efa_com_dev *edev,
  132. enum efa_regs_reset_reason_types reset_reason);
  133. void efa_com_set_admin_polling_mode(struct efa_com_dev *edev, bool polling);
  134. void efa_com_admin_q_comp_intr_handler(struct efa_com_dev *edev);
  135. int efa_com_mmio_reg_read_init(struct efa_com_dev *edev);
  136. void efa_com_mmio_reg_read_destroy(struct efa_com_dev *edev);
  137. int efa_com_validate_version(struct efa_com_dev *edev);
  138. int efa_com_get_dma_width(struct efa_com_dev *edev);
  139. int efa_com_cmd_exec(struct efa_com_admin_queue *aq,
  140. struct efa_admin_aq_entry *cmd,
  141. size_t cmd_size,
  142. struct efa_admin_acq_entry *comp,
  143. size_t comp_size);
  144. void efa_com_aenq_intr_handler(struct efa_com_dev *edev, void *data);
  145. void efa_com_eq_comp_intr_handler(struct efa_com_dev *edev,
  146. struct efa_com_eq *eeq);
  147. #endif /* _EFA_COM_H_ */