Lines Matching refs:tx_chn

116 		bool tx_chn)
156 if (tx_chn && !(thread_id & K3_PSIL_DST_THREAD_ID_OFFSET)) {
161 if (!tx_chn && (thread_id & K3_PSIL_DST_THREAD_ID_OFFSET)) {
179 if (tx_chn)
189 static void k3_udma_glue_dump_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
191 struct device *dev = tx_chn->common.dev;
197 tx_chn->udma_tchan_id,
198 tx_chn->common.src_thread,
199 tx_chn->common.dst_thread);
221 static int k3_udma_glue_cfg_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
223 const struct udma_tisci_rm *tisci_rm = tx_chn->common.tisci_rm;
237 req.index = tx_chn->udma_tchan_id;
238 if (tx_chn->tx_pause_on_err)
240 if (tx_chn->tx_filt_einfo)
242 if (tx_chn->tx_filt_pswords)
245 if (tx_chn->tx_supr_tdpkt)
247 req.tx_fetch_size = tx_chn->common.hdesc_size >> 2;
248 req.txcq_qnum = k3_ringacc_get_ring_id(tx_chn->ringtxcq);
249 req.tx_atype = tx_chn->common.atype_asel;
257 struct k3_udma_glue_tx_channel *tx_chn;
260 tx_chn = devm_kzalloc(dev, sizeof(*tx_chn), GFP_KERNEL);
261 if (!tx_chn)
264 tx_chn->common.dev = dev;
265 tx_chn->common.swdata_size = cfg->swdata_size;
266 tx_chn->tx_pause_on_err = cfg->tx_pause_on_err;
267 tx_chn->tx_filt_einfo = cfg->tx_filt_einfo;
268 tx_chn->tx_filt_pswords = cfg->tx_filt_pswords;
269 tx_chn->tx_supr_tdpkt = cfg->tx_supr_tdpkt;
273 &tx_chn->common, true);
277 tx_chn->common.hdesc_size = cppi5_hdesc_calc_size(tx_chn->common.epib,
278 tx_chn->common.psdata_size,
279 tx_chn->common.swdata_size);
281 if (xudma_is_pktdma(tx_chn->common.udmax))
282 tx_chn->udma_tchan_id = tx_chn->common.ep_config->mapped_channel_id;
284 tx_chn->udma_tchan_id = -1;
287 tx_chn->udma_tchanx = xudma_tchan_get(tx_chn->common.udmax,
288 tx_chn->udma_tchan_id);
289 if (IS_ERR(tx_chn->udma_tchanx)) {
290 ret = PTR_ERR(tx_chn->udma_tchanx);
294 tx_chn->udma_tchan_id = xudma_tchan_get_id(tx_chn->udma_tchanx);
296 tx_chn->common.chan_dev.class = &k3_udma_glue_devclass;
297 tx_chn->common.chan_dev.parent = xudma_get_device(tx_chn->common.udmax);
298 dev_set_name(&tx_chn->common.chan_dev, "tchan%d-0x%04x",
299 tx_chn->udma_tchan_id, tx_chn->common.dst_thread);
300 ret = device_register(&tx_chn->common.chan_dev);
303 put_device(&tx_chn->common.chan_dev);
304 tx_chn->common.chan_dev.parent = NULL;
308 if (xudma_is_pktdma(tx_chn->common.udmax)) {
310 tx_chn->common.chan_dev.dma_coherent = true;
311 dma_coerce_mask_and_coherent(&tx_chn->common.chan_dev,
315 atomic_set(&tx_chn->free_pkts, cfg->txcq_cfg.size);
317 if (xudma_is_pktdma(tx_chn->common.udmax))
318 tx_chn->udma_tflow_id = tx_chn->common.ep_config->default_flow_id;
320 tx_chn->udma_tflow_id = tx_chn->udma_tchan_id;
323 ret = k3_ringacc_request_rings_pair(tx_chn->common.ringacc,
324 tx_chn->udma_tflow_id, -1,
325 &tx_chn->ringtx,
326 &tx_chn->ringtxcq);
333 cfg->tx_cfg.dma_dev = k3_udma_glue_tx_get_dma_device(tx_chn);
337 if (xudma_is_pktdma(tx_chn->common.udmax)) {
338 cfg->tx_cfg.asel = tx_chn->common.atype_asel;
339 cfg->txcq_cfg.asel = tx_chn->common.atype_asel;
342 ret = k3_ringacc_ring_cfg(tx_chn->ringtx, &cfg->tx_cfg);
348 ret = k3_ringacc_ring_cfg(tx_chn->ringtxcq, &cfg->txcq_cfg);
355 tx_chn->common.src_thread =
356 xudma_dev_get_psil_base(tx_chn->common.udmax) +
357 tx_chn->udma_tchan_id;
359 ret = k3_udma_glue_cfg_tx_chn(tx_chn);
365 k3_udma_glue_dump_tx_chn(tx_chn);
367 return tx_chn;
370 k3_udma_glue_release_tx_chn(tx_chn);
375 void k3_udma_glue_release_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
377 if (tx_chn->psil_paired) {
378 xudma_navss_psil_unpair(tx_chn->common.udmax,
379 tx_chn->common.src_thread,
380 tx_chn->common.dst_thread);
381 tx_chn->psil_paired = false;
384 if (!IS_ERR_OR_NULL(tx_chn->udma_tchanx))
385 xudma_tchan_put(tx_chn->common.udmax,
386 tx_chn->udma_tchanx);
388 if (tx_chn->ringtxcq)
389 k3_ringacc_ring_free(tx_chn->ringtxcq);
391 if (tx_chn->ringtx)
392 k3_ringacc_ring_free(tx_chn->ringtx);
394 if (tx_chn->common.chan_dev.parent) {
395 device_unregister(&tx_chn->common.chan_dev);
396 tx_chn->common.chan_dev.parent = NULL;
401 int k3_udma_glue_push_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
407 if (!atomic_add_unless(&tx_chn->free_pkts, -1, 0))
410 ringtxcq_id = k3_ringacc_get_ring_id(tx_chn->ringtxcq);
413 return k3_ringacc_ring_push(tx_chn->ringtx, &desc_dma);
417 int k3_udma_glue_pop_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
422 ret = k3_ringacc_ring_pop(tx_chn->ringtxcq, desc_dma);
424 atomic_inc(&tx_chn->free_pkts);
430 int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
434 ret = xudma_navss_psil_pair(tx_chn->common.udmax,
435 tx_chn->common.src_thread,
436 tx_chn->common.dst_thread);
438 dev_err(tx_chn->common.dev, "PSI-L request err %d\n", ret);
442 tx_chn->psil_paired = true;
444 xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
447 xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG,
450 k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn en");
455 void k3_udma_glue_disable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
457 k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn dis1");
459 xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG, 0);
461 xudma_tchanrt_write(tx_chn->udma_tchanx,
463 k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn dis2");
465 if (tx_chn->psil_paired) {
466 xudma_navss_psil_unpair(tx_chn->common.udmax,
467 tx_chn->common.src_thread,
468 tx_chn->common.dst_thread);
469 tx_chn->psil_paired = false;
474 void k3_udma_glue_tdown_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
480 k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn tdown1");
482 xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG,
485 val = xudma_tchanrt_read(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG);
488 val = xudma_tchanrt_read(tx_chn->udma_tchanx,
492 dev_err(tx_chn->common.dev, "TX tdown timeout\n");
498 val = xudma_tchanrt_read(tx_chn->udma_tchanx,
501 dev_err(tx_chn->common.dev, "TX tdown peer not stopped\n");
502 k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn tdown2");
506 void k3_udma_glue_reset_tx_chn(struct k3_udma_glue_tx_channel *tx_chn,
510 struct device *dev = tx_chn->common.dev;
521 occ_tx = k3_ringacc_ring_get_occ(tx_chn->ringtx);
525 ret = k3_ringacc_ring_pop(tx_chn->ringtx, &desc_dma);
535 k3_ringacc_ring_reset(tx_chn->ringtxcq);
536 k3_ringacc_ring_reset_dma(tx_chn->ringtx, occ_tx);
540 u32 k3_udma_glue_tx_get_hdesc_size(struct k3_udma_glue_tx_channel *tx_chn)
542 return tx_chn->common.hdesc_size;
546 u32 k3_udma_glue_tx_get_txcq_id(struct k3_udma_glue_tx_channel *tx_chn)
548 return k3_ringacc_get_ring_id(tx_chn->ringtxcq);
552 int k3_udma_glue_tx_get_irq(struct k3_udma_glue_tx_channel *tx_chn)
554 if (xudma_is_pktdma(tx_chn->common.udmax)) {
555 tx_chn->virq = xudma_pktdma_tflow_get_irq(tx_chn->common.udmax,
556 tx_chn->udma_tflow_id);
558 tx_chn->virq = k3_ringacc_get_ring_irq_num(tx_chn->ringtxcq);
561 if (!tx_chn->virq)
564 return tx_chn->virq;
569 k3_udma_glue_tx_get_dma_device(struct k3_udma_glue_tx_channel *tx_chn)
571 if (xudma_is_pktdma(tx_chn->common.udmax) &&
572 (tx_chn->common.atype_asel == 14 || tx_chn->common.atype_asel == 15))
573 return &tx_chn->common.chan_dev;
575 return xudma_get_device(tx_chn->common.udmax);
579 void k3_udma_glue_tx_dma_to_cppi5_addr(struct k3_udma_glue_tx_channel *tx_chn,
582 if (!xudma_is_pktdma(tx_chn->common.udmax) ||
583 !tx_chn->common.atype_asel)
586 *addr |= (u64)tx_chn->common.atype_asel << K3_ADDRESS_ASEL_SHIFT;
590 void k3_udma_glue_tx_cppi5_to_dma_addr(struct k3_udma_glue_tx_channel *tx_chn,
593 if (!xudma_is_pktdma(tx_chn->common.udmax) ||
594 !tx_chn->common.atype_asel)