request_manager.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2016 Cavium, Inc.
  4. */
  5. #ifndef __REQUEST_MANAGER_H
  6. #define __REQUEST_MANAGER_H
  7. #include "cpt_common.h"
  8. #define TIME_IN_RESET_COUNT 5
  9. #define COMPLETION_CODE_SIZE 8
  10. #define COMPLETION_CODE_INIT 0
  11. #define PENDING_THOLD 100
  12. #define MAX_SG_IN_CNT 12
  13. #define MAX_SG_OUT_CNT 13
  14. #define SG_LIST_HDR_SIZE 8
  15. #define MAX_BUF_CNT 16
  16. union ctrl_info {
  17. u32 flags;
  18. struct {
  19. #if defined(__BIG_ENDIAN_BITFIELD)
  20. u32 reserved0:26;
  21. u32 grp:3; /* Group bits */
  22. u32 dma_mode:2; /* DMA mode */
  23. u32 se_req:1;/* To SE core */
  24. #else
  25. u32 se_req:1; /* To SE core */
  26. u32 dma_mode:2; /* DMA mode */
  27. u32 grp:3; /* Group bits */
  28. u32 reserved0:26;
  29. #endif
  30. } s;
  31. };
  32. union opcode_info {
  33. u16 flags;
  34. struct {
  35. u8 major;
  36. u8 minor;
  37. } s;
  38. };
  39. struct cptvf_request {
  40. union opcode_info opcode;
  41. u16 param1;
  42. u16 param2;
  43. u16 dlen;
  44. };
  45. struct buf_ptr {
  46. u8 *vptr;
  47. dma_addr_t dma_addr;
  48. u16 size;
  49. };
  50. struct cpt_request_info {
  51. u8 incnt; /* Number of input buffers */
  52. u8 outcnt; /* Number of output buffers */
  53. u16 rlen; /* Output length */
  54. union ctrl_info ctrl; /* User control information */
  55. struct cptvf_request req; /* Request Information (Core specific) */
  56. bool may_sleep;
  57. struct buf_ptr in[MAX_BUF_CNT];
  58. struct buf_ptr out[MAX_BUF_CNT];
  59. void (*callback)(int, void *); /* Kernel ASYNC request callabck */
  60. void *callback_arg; /* Kernel ASYNC request callabck arg */
  61. };
  62. struct sglist_component {
  63. union {
  64. u64 len;
  65. struct {
  66. __be16 len0;
  67. __be16 len1;
  68. __be16 len2;
  69. __be16 len3;
  70. } s;
  71. } u;
  72. __be64 ptr0;
  73. __be64 ptr1;
  74. __be64 ptr2;
  75. __be64 ptr3;
  76. };
  77. struct cpt_info_buffer {
  78. struct cpt_vf *cptvf;
  79. unsigned long time_in;
  80. u8 extra_time;
  81. struct cpt_request_info *req;
  82. dma_addr_t dptr_baddr;
  83. u32 dlen;
  84. dma_addr_t rptr_baddr;
  85. dma_addr_t comp_baddr;
  86. u8 *in_buffer;
  87. u8 *out_buffer;
  88. u8 *gather_components;
  89. u8 *scatter_components;
  90. struct pending_entry *pentry;
  91. volatile u64 *completion_addr;
  92. volatile u64 *alternate_caddr;
  93. };
  94. /*
  95. * CPT_INST_S software command definitions
  96. * Words EI (0-3)
  97. */
  98. union vq_cmd_word0 {
  99. u64 u64;
  100. struct {
  101. __be16 opcode;
  102. __be16 param1;
  103. __be16 param2;
  104. __be16 dlen;
  105. } s;
  106. };
  107. union vq_cmd_word3 {
  108. u64 u64;
  109. struct {
  110. #if defined(__BIG_ENDIAN_BITFIELD)
  111. u64 grp:3;
  112. u64 cptr:61;
  113. #else
  114. u64 cptr:61;
  115. u64 grp:3;
  116. #endif
  117. } s;
  118. };
  119. struct cpt_vq_command {
  120. union vq_cmd_word0 cmd;
  121. u64 dptr;
  122. u64 rptr;
  123. union vq_cmd_word3 cptr;
  124. };
  125. void vq_post_process(struct cpt_vf *cptvf, u32 qno);
  126. int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req);
  127. #endif /* __REQUEST_MANAGER_H */