ti-edma3.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * Enhanced Direct Memory Access (EDMA3) Controller
  3. *
  4. * (C) Copyright 2014
  5. * Texas Instruments Incorporated, <www.ti.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #ifndef _EDMA3_H_
  10. #define _EDMA3_H_
  11. #include <linux/stddef.h>
  12. #define EDMA3_PARSET_NULL_LINK 0xffff
  13. /*
  14. * All parameter RAM set options
  15. * opt field in edma3_param_set_config structure
  16. */
  17. #define EDMA3_SLOPT_PRIV_LEVEL BIT(31)
  18. #define EDMA3_SLOPT_PRIV_ID(id) ((0xf & (id)) << 24)
  19. #define EDMA3_SLOPT_INTERM_COMP_CHAIN_ENB BIT(23)
  20. #define EDMA3_SLOPT_TRANS_COMP_CHAIN_ENB BIT(22)
  21. #define EDMA3_SLOPT_INTERM_COMP_INT_ENB BIT(21)
  22. #define EDMA3_SLOPT_TRANS_COMP_INT_ENB BIT(20)
  23. #define EDMA3_SLOPT_COMP_CODE(code) ((0x3f & (code)) << 12)
  24. #define EDMA3_SLOPT_FIFO_WIDTH_8 0
  25. #define EDMA3_SLOPT_FIFO_WIDTH_16 (1 << 8)
  26. #define EDMA3_SLOPT_FIFO_WIDTH_32 (2 << 8)
  27. #define EDMA3_SLOPT_FIFO_WIDTH_64 (3 << 8)
  28. #define EDMA3_SLOPT_FIFO_WIDTH_128 (4 << 8)
  29. #define EDMA3_SLOPT_FIFO_WIDTH_256 (5 << 8)
  30. #define EDMA3_SLOPT_FIFO_WIDTH_SET(w) ((w & 0x7) << 8)
  31. #define EDMA3_SLOPT_STATIC BIT(3)
  32. #define EDMA3_SLOPT_AB_SYNC BIT(2)
  33. #define EDMA3_SLOPT_DST_ADDR_CONST_MODE BIT(1)
  34. #define EDMA3_SLOPT_SRC_ADDR_CONST_MODE BIT(0)
  35. enum edma3_address_mode {
  36. INCR = 0,
  37. FIFO = 1
  38. };
  39. enum edma3_fifo_width {
  40. W8BIT = 0,
  41. W16BIT = 1,
  42. W32BIT = 2,
  43. W64BIT = 3,
  44. W128BIT = 4,
  45. W256BIT = 5
  46. };
  47. enum edma3_sync_dimension {
  48. ASYNC = 0,
  49. ABSYNC = 1
  50. };
  51. /* PaRAM slots are laid out like this */
  52. struct edma3_slot_layout {
  53. u32 opt;
  54. u32 src;
  55. u32 a_b_cnt;
  56. u32 dst;
  57. u32 src_dst_bidx;
  58. u32 link_bcntrld;
  59. u32 src_dst_cidx;
  60. u32 ccnt;
  61. } __packed;
  62. /*
  63. * Use this to assign trigger word number of edma3_slot_layout struct.
  64. * trigger_word_name - is the exact name from edma3_slot_layout.
  65. */
  66. #define EDMA3_TWORD(trigger_word_name)\
  67. (offsetof(struct edma3_slot_layout, trigger_word_name) / 4)
  68. struct edma3_slot_config {
  69. u32 opt;
  70. u32 src;
  71. u32 dst;
  72. int bcnt;
  73. int acnt;
  74. int ccnt;
  75. int src_bidx;
  76. int dst_bidx;
  77. int src_cidx;
  78. int dst_cidx;
  79. int bcntrld;
  80. int link;
  81. };
  82. struct edma3_channel_config {
  83. int slot;
  84. int chnum;
  85. int complete_code; /* indicate pending complete interrupt */
  86. int trigger_slot_word; /* only used for qedma */
  87. };
  88. void qedma3_start(u32 base, struct edma3_channel_config *cfg);
  89. void qedma3_stop(u32 base, struct edma3_channel_config *cfg);
  90. void edma3_slot_configure(u32 base, int slot, struct edma3_slot_config *cfg);
  91. int edma3_check_for_transfer(u32 base, struct edma3_channel_config *cfg);
  92. void edma3_write_slot(u32 base, int slot, struct edma3_slot_layout *param);
  93. void edma3_read_slot(u32 base, int slot, struct edma3_slot_layout *param);
  94. void edma3_set_dest(u32 base, int slot, u32 dst, enum edma3_address_mode mode,
  95. enum edma3_fifo_width width);
  96. void edma3_set_dest_index(u32 base, unsigned slot, int bidx, int cidx);
  97. void edma3_set_dest_addr(u32 base, int slot, u32 dst);
  98. void edma3_set_src(u32 base, int slot, u32 src, enum edma3_address_mode mode,
  99. enum edma3_fifo_width width);
  100. void edma3_set_src_index(u32 base, unsigned slot, int bidx, int cidx);
  101. void edma3_set_src_addr(u32 base, int slot, u32 src);
  102. void edma3_set_transfer_params(u32 base, int slot, int acnt,
  103. int bcnt, int ccnt, u16 bcnt_rld,
  104. enum edma3_sync_dimension sync_mode);
  105. void edma3_transfer(unsigned long edma3_base_addr, unsigned int
  106. edma_slot_num, void *dst, void *src, size_t len);
  107. #endif