keystone_nav.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * Multicore Navigator definitions
  3. *
  4. * (C) Copyright 2012-2014
  5. * Texas Instruments Incorporated, <www.ti.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #ifndef _KEYSTONE_NAV_H_
  10. #define _KEYSTONE_NAV_H_
  11. #include <asm/arch/hardware.h>
  12. #include <asm/io.h>
  13. #define QM_OK 0
  14. #define QM_ERR -1
  15. #define QM_DESC_TYPE_HOST 0
  16. #define QM_DESC_PSINFO_IN_DESCR 0
  17. #define QM_DESC_DEFAULT_DESCINFO (QM_DESC_TYPE_HOST << 30) | \
  18. (QM_DESC_PSINFO_IN_DESCR << 22)
  19. /* Packet Info */
  20. #define QM_DESC_PINFO_EPIB 1
  21. #define QM_DESC_PINFO_RETURN_OWN 1
  22. #define QM_DESC_DEFAULT_PINFO (QM_DESC_PINFO_EPIB << 31) | \
  23. (QM_DESC_PINFO_RETURN_OWN << 15)
  24. struct qm_cfg_reg {
  25. u32 revision;
  26. u32 __pad1;
  27. u32 divert;
  28. u32 link_ram_base0;
  29. u32 link_ram_size0;
  30. u32 link_ram_base1;
  31. u32 link_ram_size1;
  32. u32 link_ram_base2;
  33. u32 starvation[0];
  34. };
  35. struct descr_mem_setup_reg {
  36. u32 base_addr;
  37. u32 start_idx;
  38. u32 desc_reg_size;
  39. u32 _res0;
  40. };
  41. struct qm_reg_queue {
  42. u32 entry_count;
  43. u32 byte_count;
  44. u32 packet_size;
  45. u32 ptr_size_thresh;
  46. };
  47. struct qm_config {
  48. /* QM module addresses */
  49. u32 stat_cfg; /* status and config */
  50. struct qm_reg_queue *queue; /* management region */
  51. u32 mngr_vbusm; /* management region (VBUSM) */
  52. u32 i_lram; /* internal linking RAM */
  53. struct qm_reg_queue *proxy;
  54. u32 status_ram;
  55. struct qm_cfg_reg *mngr_cfg;
  56. /* Queue manager config region */
  57. u32 intd_cfg; /* QMSS INTD config region */
  58. struct descr_mem_setup_reg *desc_mem;
  59. /* descritor memory setup region*/
  60. u32 region_num;
  61. u32 pdsp_cmd; /* PDSP1 command interface */
  62. u32 pdsp_ctl; /* PDSP1 control registers */
  63. u32 pdsp_iram;
  64. /* QM configuration parameters */
  65. u32 qpool_num; /* */
  66. };
  67. struct qm_host_desc {
  68. u32 desc_info;
  69. u32 tag_info;
  70. u32 packet_info;
  71. u32 buff_len;
  72. u32 buff_ptr;
  73. u32 next_bdptr;
  74. u32 orig_buff_len;
  75. u32 orig_buff_ptr;
  76. u32 timestamp;
  77. u32 swinfo[3];
  78. u32 ps_data[20];
  79. };
  80. #define HDESC_NUM 256
  81. int qm_init(void);
  82. void qm_close(void);
  83. void qm_push(struct qm_host_desc *hd, u32 qnum);
  84. struct qm_host_desc *qm_pop(u32 qnum);
  85. void qm_buff_push(struct qm_host_desc *hd, u32 qnum,
  86. void *buff_ptr, u32 buff_len);
  87. struct qm_host_desc *qm_pop_from_free_pool(void);
  88. void queue_close(u32 qnum);
  89. /*
  90. * DMA API
  91. */
  92. #define CPDMA_REG_VAL_MAKE_RX_FLOW_A(einfo, psinfo, rxerr, desc, \
  93. psloc, sopoff, qmgr, qnum) \
  94. (((einfo & 1) << 30) | \
  95. ((psinfo & 1) << 29) | \
  96. ((rxerr & 1) << 28) | \
  97. ((desc & 3) << 26) | \
  98. ((psloc & 1) << 25) | \
  99. ((sopoff & 0x1ff) << 16) | \
  100. ((qmgr & 3) << 12) | \
  101. ((qnum & 0xfff) << 0))
  102. #define CPDMA_REG_VAL_MAKE_RX_FLOW_D(fd0qm, fd0qnum, fd1qm, fd1qnum) \
  103. (((fd0qm & 3) << 28) | \
  104. ((fd0qnum & 0xfff) << 16) | \
  105. ((fd1qm & 3) << 12) | \
  106. ((fd1qnum & 0xfff) << 0))
  107. #define CPDMA_CHAN_A_ENABLE ((u32)1 << 31)
  108. #define CPDMA_CHAN_A_TDOWN (1 << 30)
  109. #define TDOWN_TIMEOUT_COUNT 100
  110. struct global_ctl_regs {
  111. u32 revision;
  112. u32 perf_control;
  113. u32 emulation_control;
  114. u32 priority_control;
  115. u32 qm_base_addr[4];
  116. };
  117. struct tx_chan_regs {
  118. u32 cfg_a;
  119. u32 cfg_b;
  120. u32 res[6];
  121. };
  122. struct rx_chan_regs {
  123. u32 cfg_a;
  124. u32 res[7];
  125. };
  126. struct rx_flow_regs {
  127. u32 control;
  128. u32 tags;
  129. u32 tag_sel;
  130. u32 fdq_sel[2];
  131. u32 thresh[3];
  132. };
  133. struct pktdma_cfg {
  134. struct global_ctl_regs *global;
  135. struct tx_chan_regs *tx_ch;
  136. u32 tx_ch_num;
  137. struct rx_chan_regs *rx_ch;
  138. u32 rx_ch_num;
  139. u32 *tx_sched;
  140. struct rx_flow_regs *rx_flows;
  141. u32 rx_flow_num;
  142. u32 rx_free_q;
  143. u32 rx_rcv_q;
  144. u32 tx_snd_q;
  145. u32 rx_flow; /* flow that is used for RX */
  146. };
  147. extern struct pktdma_cfg netcp_pktdma;
  148. /*
  149. * packet dma user allocates memory for rx buffers
  150. * and describe it in the following structure
  151. */
  152. struct rx_buff_desc {
  153. u8 *buff_ptr;
  154. u32 num_buffs;
  155. u32 buff_len;
  156. u32 rx_flow;
  157. };
  158. int ksnav_close(struct pktdma_cfg *pktdma);
  159. int ksnav_init(struct pktdma_cfg *pktdma, struct rx_buff_desc *rx_buffers);
  160. int ksnav_send(struct pktdma_cfg *pktdma, u32 *pkt, int num_bytes, u32 swinfo2);
  161. void *ksnav_recv(struct pktdma_cfg *pktdma, u32 **pkt, int *num_bytes);
  162. void ksnav_release_rxhd(struct pktdma_cfg *pktdma, void *hd);
  163. #endif /* _KEYSTONE_NAV_H_ */