request_manager.h 2.6 KB

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