0001
0002
0003
0004
0005
0006 #ifndef K3_UDMA_GLUE_H_
0007 #define K3_UDMA_GLUE_H_
0008
0009 #include <linux/types.h>
0010 #include <linux/soc/ti/k3-ringacc.h>
0011 #include <linux/dma/ti-cppi5.h>
0012
0013 struct k3_udma_glue_tx_channel_cfg {
0014 struct k3_ring_cfg tx_cfg;
0015 struct k3_ring_cfg txcq_cfg;
0016
0017 bool tx_pause_on_err;
0018 bool tx_filt_einfo;
0019 bool tx_filt_pswords;
0020 bool tx_supr_tdpkt;
0021 u32 swdata_size;
0022 };
0023
0024 struct k3_udma_glue_tx_channel;
0025
0026 struct k3_udma_glue_tx_channel *k3_udma_glue_request_tx_chn(struct device *dev,
0027 const char *name, struct k3_udma_glue_tx_channel_cfg *cfg);
0028
0029 void k3_udma_glue_release_tx_chn(struct k3_udma_glue_tx_channel *tx_chn);
0030 int k3_udma_glue_push_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
0031 struct cppi5_host_desc_t *desc_tx,
0032 dma_addr_t desc_dma);
0033 int k3_udma_glue_pop_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
0034 dma_addr_t *desc_dma);
0035 int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn);
0036 void k3_udma_glue_disable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn);
0037 void k3_udma_glue_tdown_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
0038 bool sync);
0039 void k3_udma_glue_reset_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
0040 void *data, void (*cleanup)(void *data, dma_addr_t desc_dma));
0041 u32 k3_udma_glue_tx_get_hdesc_size(struct k3_udma_glue_tx_channel *tx_chn);
0042 u32 k3_udma_glue_tx_get_txcq_id(struct k3_udma_glue_tx_channel *tx_chn);
0043 int k3_udma_glue_tx_get_irq(struct k3_udma_glue_tx_channel *tx_chn);
0044 struct device *
0045 k3_udma_glue_tx_get_dma_device(struct k3_udma_glue_tx_channel *tx_chn);
0046 void k3_udma_glue_tx_dma_to_cppi5_addr(struct k3_udma_glue_tx_channel *tx_chn,
0047 dma_addr_t *addr);
0048 void k3_udma_glue_tx_cppi5_to_dma_addr(struct k3_udma_glue_tx_channel *tx_chn,
0049 dma_addr_t *addr);
0050
0051 enum {
0052 K3_UDMA_GLUE_SRC_TAG_LO_KEEP = 0,
0053 K3_UDMA_GLUE_SRC_TAG_LO_USE_FLOW_REG = 1,
0054 K3_UDMA_GLUE_SRC_TAG_LO_USE_REMOTE_FLOW_ID = 2,
0055 K3_UDMA_GLUE_SRC_TAG_LO_USE_REMOTE_SRC_TAG = 4,
0056 };
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 struct k3_udma_glue_rx_flow_cfg {
0069 struct k3_ring_cfg rx_cfg;
0070 struct k3_ring_cfg rxfdq_cfg;
0071 int ring_rxq_id;
0072 int ring_rxfdq0_id;
0073 bool rx_error_handling;
0074 int src_tag_lo_sel;
0075 };
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 struct k3_udma_glue_rx_channel_cfg {
0096 u32 swdata_size;
0097 int flow_id_base;
0098 int flow_id_num;
0099 bool flow_id_use_rxchan_id;
0100 bool remote;
0101
0102 struct k3_udma_glue_rx_flow_cfg *def_flow_cfg;
0103 };
0104
0105 struct k3_udma_glue_rx_channel;
0106
0107 struct k3_udma_glue_rx_channel *k3_udma_glue_request_rx_chn(
0108 struct device *dev,
0109 const char *name,
0110 struct k3_udma_glue_rx_channel_cfg *cfg);
0111
0112 void k3_udma_glue_release_rx_chn(struct k3_udma_glue_rx_channel *rx_chn);
0113 int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn);
0114 void k3_udma_glue_disable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn);
0115 void k3_udma_glue_tdown_rx_chn(struct k3_udma_glue_rx_channel *rx_chn,
0116 bool sync);
0117 int k3_udma_glue_push_rx_chn(struct k3_udma_glue_rx_channel *rx_chn,
0118 u32 flow_num, struct cppi5_host_desc_t *desc_tx,
0119 dma_addr_t desc_dma);
0120 int k3_udma_glue_pop_rx_chn(struct k3_udma_glue_rx_channel *rx_chn,
0121 u32 flow_num, dma_addr_t *desc_dma);
0122 int k3_udma_glue_rx_flow_init(struct k3_udma_glue_rx_channel *rx_chn,
0123 u32 flow_idx, struct k3_udma_glue_rx_flow_cfg *flow_cfg);
0124 u32 k3_udma_glue_rx_flow_get_fdq_id(struct k3_udma_glue_rx_channel *rx_chn,
0125 u32 flow_idx);
0126 u32 k3_udma_glue_rx_get_flow_id_base(struct k3_udma_glue_rx_channel *rx_chn);
0127 int k3_udma_glue_rx_get_irq(struct k3_udma_glue_rx_channel *rx_chn,
0128 u32 flow_num);
0129 void k3_udma_glue_rx_put_irq(struct k3_udma_glue_rx_channel *rx_chn,
0130 u32 flow_num);
0131 void k3_udma_glue_reset_rx_chn(struct k3_udma_glue_rx_channel *rx_chn,
0132 u32 flow_num, void *data,
0133 void (*cleanup)(void *data, dma_addr_t desc_dma),
0134 bool skip_fdq);
0135 int k3_udma_glue_rx_flow_enable(struct k3_udma_glue_rx_channel *rx_chn,
0136 u32 flow_idx);
0137 int k3_udma_glue_rx_flow_disable(struct k3_udma_glue_rx_channel *rx_chn,
0138 u32 flow_idx);
0139 struct device *
0140 k3_udma_glue_rx_get_dma_device(struct k3_udma_glue_rx_channel *rx_chn);
0141 void k3_udma_glue_rx_dma_to_cppi5_addr(struct k3_udma_glue_rx_channel *rx_chn,
0142 dma_addr_t *addr);
0143 void k3_udma_glue_rx_cppi5_to_dma_addr(struct k3_udma_glue_rx_channel *rx_chn,
0144 dma_addr_t *addr);
0145
0146 #endif