keystone_nav.h 4.1 KB

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