Lines Matching refs:ch
55 static inline void mic_dma_hw_ring_inc_head(struct mic_dma_chan *ch) in mic_dma_hw_ring_inc_head() argument
57 ch->head = mic_dma_hw_ring_inc(ch->head); in mic_dma_hw_ring_inc_head()
89 static void mic_dma_cleanup(struct mic_dma_chan *ch) in mic_dma_cleanup() argument
95 spin_lock(&ch->cleanup_lock); in mic_dma_cleanup()
96 tail = mic_dma_read_cmp_cnt(ch); in mic_dma_cleanup()
103 for (last_tail = ch->last_tail; tail != last_tail;) { in mic_dma_cleanup()
104 tx = &ch->tx_array[last_tail]; in mic_dma_cleanup()
114 ch->last_tail = last_tail; in mic_dma_cleanup()
115 spin_unlock(&ch->cleanup_lock); in mic_dma_cleanup()
130 static int mic_dma_avail_desc_ring_space(struct mic_dma_chan *ch, int required) in mic_dma_avail_desc_ring_space() argument
132 struct device *dev = mic_dma_ch_to_device(ch); in mic_dma_avail_desc_ring_space()
135 count = mic_dma_ring_count(ch->head, ch->last_tail); in mic_dma_avail_desc_ring_space()
137 mic_dma_cleanup(ch); in mic_dma_avail_desc_ring_space()
138 count = mic_dma_ring_count(ch->head, ch->last_tail); in mic_dma_avail_desc_ring_space()
152 static int mic_dma_prog_memcpy_desc(struct mic_dma_chan *ch, dma_addr_t src, in mic_dma_prog_memcpy_desc() argument
156 size_t max_xfer_size = to_mic_dma_dev(ch)->max_xfer_size; in mic_dma_prog_memcpy_desc()
164 ret = mic_dma_avail_desc_ring_space(ch, num_desc); in mic_dma_prog_memcpy_desc()
169 mic_dma_memcpy_desc(&ch->desc_ring[ch->head], in mic_dma_prog_memcpy_desc()
171 mic_dma_hw_ring_inc_head(ch); in mic_dma_prog_memcpy_desc()
180 static void mic_dma_prog_intr(struct mic_dma_chan *ch) in mic_dma_prog_intr() argument
182 mic_dma_prep_status_desc(&ch->desc_ring[ch->head], 0, in mic_dma_prog_intr()
183 ch->status_dest_micpa, false); in mic_dma_prog_intr()
184 mic_dma_hw_ring_inc_head(ch); in mic_dma_prog_intr()
185 mic_dma_prep_status_desc(&ch->desc_ring[ch->head], 0, in mic_dma_prog_intr()
186 ch->status_dest_micpa, true); in mic_dma_prog_intr()
187 mic_dma_hw_ring_inc_head(ch); in mic_dma_prog_intr()
191 static int mic_dma_do_dma(struct mic_dma_chan *ch, int flags, dma_addr_t src, in mic_dma_do_dma() argument
194 if (len && -ENOMEM == mic_dma_prog_memcpy_desc(ch, src, dst, len)) { in mic_dma_do_dma()
198 int ret = mic_dma_avail_desc_ring_space(ch, 3); in mic_dma_do_dma()
206 mic_dma_prep_status_desc(&ch->desc_ring[ch->head], 0, in mic_dma_do_dma()
207 ch->status_dest_micpa, false); in mic_dma_do_dma()
208 mic_dma_hw_ring_inc_head(ch); in mic_dma_do_dma()
212 mic_dma_prog_intr(ch); in mic_dma_do_dma()
217 static inline void mic_dma_issue_pending(struct dma_chan *ch) in mic_dma_issue_pending() argument
219 struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch); in mic_dma_issue_pending()
242 static inline void mic_dma_update_pending(struct mic_dma_chan *ch) in mic_dma_update_pending() argument
244 if (mic_dma_ring_count(ch->issued, ch->submitted) in mic_dma_update_pending()
246 mic_dma_issue_pending(&ch->api_ch); in mic_dma_update_pending()
269 allocate_tx(struct mic_dma_chan *ch) in allocate_tx() argument
271 u32 idx = mic_dma_hw_ring_dec(ch->head); in allocate_tx()
272 struct dma_async_tx_descriptor *tx = &ch->tx_array[idx]; in allocate_tx()
274 dma_async_tx_descriptor_init(tx, &ch->api_ch); in allocate_tx()
281 mic_dma_prep_status_lock(struct dma_chan *ch, dma_addr_t dst, u64 src_val, in mic_dma_prep_status_lock() argument
284 struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch); in mic_dma_prep_status_lock()
312 mic_dma_prep_memcpy_lock(struct dma_chan *ch, dma_addr_t dma_dest, in mic_dma_prep_memcpy_lock() argument
315 struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch); in mic_dma_prep_memcpy_lock()
332 mic_dma_prep_interrupt_lock(struct dma_chan *ch, unsigned long flags) in mic_dma_prep_interrupt_lock() argument
334 struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch); in mic_dma_prep_interrupt_lock()
347 mic_dma_tx_status(struct dma_chan *ch, dma_cookie_t cookie, in mic_dma_tx_status() argument
350 struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch); in mic_dma_tx_status()
352 if (DMA_COMPLETE != dma_cookie_status(ch, cookie, txstate)) in mic_dma_tx_status()
355 return dma_cookie_status(ch, cookie, txstate); in mic_dma_tx_status()
366 struct mic_dma_chan *ch = ((struct mic_dma_chan *)data); in mic_dma_intr_handler() local
368 mic_dma_ack_interrupt(ch); in mic_dma_intr_handler()
372 static int mic_dma_alloc_desc_ring(struct mic_dma_chan *ch) in mic_dma_alloc_desc_ring() argument
374 u64 desc_ring_size = MIC_DMA_DESC_RX_SIZE * sizeof(*ch->desc_ring); in mic_dma_alloc_desc_ring()
375 struct device *dev = &to_mbus_device(ch)->dev; in mic_dma_alloc_desc_ring()
378 ch->desc_ring = kzalloc(desc_ring_size, GFP_KERNEL); in mic_dma_alloc_desc_ring()
380 if (!ch->desc_ring) in mic_dma_alloc_desc_ring()
383 ch->desc_ring_micpa = dma_map_single(dev, ch->desc_ring, in mic_dma_alloc_desc_ring()
385 if (dma_mapping_error(dev, ch->desc_ring_micpa)) in mic_dma_alloc_desc_ring()
388 ch->tx_array = vzalloc(array_size(MIC_DMA_DESC_RX_SIZE, in mic_dma_alloc_desc_ring()
389 sizeof(*ch->tx_array))); in mic_dma_alloc_desc_ring()
390 if (!ch->tx_array) in mic_dma_alloc_desc_ring()
394 dma_unmap_single(dev, ch->desc_ring_micpa, desc_ring_size, in mic_dma_alloc_desc_ring()
397 kfree(ch->desc_ring); in mic_dma_alloc_desc_ring()
401 static void mic_dma_free_desc_ring(struct mic_dma_chan *ch) in mic_dma_free_desc_ring() argument
403 u64 desc_ring_size = MIC_DMA_DESC_RX_SIZE * sizeof(*ch->desc_ring); in mic_dma_free_desc_ring()
405 vfree(ch->tx_array); in mic_dma_free_desc_ring()
407 dma_unmap_single(&to_mbus_device(ch)->dev, ch->desc_ring_micpa, in mic_dma_free_desc_ring()
409 kfree(ch->desc_ring); in mic_dma_free_desc_ring()
410 ch->desc_ring = NULL; in mic_dma_free_desc_ring()
413 static void mic_dma_free_status_dest(struct mic_dma_chan *ch) in mic_dma_free_status_dest() argument
415 dma_unmap_single(&to_mbus_device(ch)->dev, ch->status_dest_micpa, in mic_dma_free_status_dest()
417 kfree(ch->status_dest); in mic_dma_free_status_dest()
420 static int mic_dma_alloc_status_dest(struct mic_dma_chan *ch) in mic_dma_alloc_status_dest() argument
422 struct device *dev = &to_mbus_device(ch)->dev; in mic_dma_alloc_status_dest()
424 ch->status_dest = kzalloc(L1_CACHE_BYTES, GFP_KERNEL); in mic_dma_alloc_status_dest()
425 if (!ch->status_dest) in mic_dma_alloc_status_dest()
427 ch->status_dest_micpa = dma_map_single(dev, ch->status_dest, in mic_dma_alloc_status_dest()
429 if (dma_mapping_error(dev, ch->status_dest_micpa)) { in mic_dma_alloc_status_dest()
430 kfree(ch->status_dest); in mic_dma_alloc_status_dest()
431 ch->status_dest = NULL; in mic_dma_alloc_status_dest()
437 static int mic_dma_check_chan(struct mic_dma_chan *ch) in mic_dma_check_chan() argument
439 if (mic_dma_read_reg(ch, MIC_DMA_REG_DCHERR) || in mic_dma_check_chan()
440 mic_dma_read_reg(ch, MIC_DMA_REG_DSTAT) & MIC_DMA_CHAN_QUIESCE) { in mic_dma_check_chan()
441 mic_dma_disable_chan(ch); in mic_dma_check_chan()
442 mic_dma_chan_mask_intr(ch); in mic_dma_check_chan()
443 dev_err(mic_dma_ch_to_device(ch), in mic_dma_check_chan()
445 __func__, __LINE__, ch->ch_num); in mic_dma_check_chan()
451 static int mic_dma_chan_setup(struct mic_dma_chan *ch) in mic_dma_chan_setup() argument
453 if (MIC_DMA_CHAN_MIC == ch->owner) in mic_dma_chan_setup()
454 mic_dma_chan_set_owner(ch); in mic_dma_chan_setup()
455 mic_dma_disable_chan(ch); in mic_dma_chan_setup()
456 mic_dma_chan_mask_intr(ch); in mic_dma_chan_setup()
457 mic_dma_write_reg(ch, MIC_DMA_REG_DCHERRMSK, 0); in mic_dma_chan_setup()
458 mic_dma_chan_set_desc_ring(ch); in mic_dma_chan_setup()
459 ch->last_tail = mic_dma_read_reg(ch, MIC_DMA_REG_DTPR); in mic_dma_chan_setup()
460 ch->head = ch->last_tail; in mic_dma_chan_setup()
461 ch->issued = 0; in mic_dma_chan_setup()
462 mic_dma_chan_unmask_intr(ch); in mic_dma_chan_setup()
463 mic_dma_enable_chan(ch); in mic_dma_chan_setup()
464 return mic_dma_check_chan(ch); in mic_dma_chan_setup()
467 static void mic_dma_chan_destroy(struct mic_dma_chan *ch) in mic_dma_chan_destroy() argument
469 mic_dma_disable_chan(ch); in mic_dma_chan_destroy()
470 mic_dma_chan_mask_intr(ch); in mic_dma_chan_destroy()
473 static int mic_dma_setup_irq(struct mic_dma_chan *ch) in mic_dma_setup_irq() argument
475 ch->cookie = in mic_dma_setup_irq()
476 to_mbus_hw_ops(ch)->request_threaded_irq(to_mbus_device(ch), in mic_dma_setup_irq()
478 "mic dma_channel", ch, ch->ch_num); in mic_dma_setup_irq()
479 return PTR_ERR_OR_ZERO(ch->cookie); in mic_dma_setup_irq()
482 static inline void mic_dma_free_irq(struct mic_dma_chan *ch) in mic_dma_free_irq() argument
484 to_mbus_hw_ops(ch)->free_irq(to_mbus_device(ch), ch->cookie, ch); in mic_dma_free_irq()
487 static int mic_dma_chan_init(struct mic_dma_chan *ch) in mic_dma_chan_init() argument
489 int ret = mic_dma_alloc_desc_ring(ch); in mic_dma_chan_init()
493 ret = mic_dma_alloc_status_dest(ch); in mic_dma_chan_init()
496 ret = mic_dma_chan_setup(ch); in mic_dma_chan_init()
501 mic_dma_free_status_dest(ch); in mic_dma_chan_init()
503 mic_dma_free_desc_ring(ch); in mic_dma_chan_init()
508 static int mic_dma_drain_chan(struct mic_dma_chan *ch) in mic_dma_drain_chan() argument
514 tx = mic_dma_prep_memcpy_lock(&ch->api_ch, 0, 0, 0, DMA_PREP_FENCE); in mic_dma_drain_chan()
524 err = dma_sync_wait(&ch->api_ch, cookie); in mic_dma_drain_chan()
526 dev_err(mic_dma_ch_to_device(ch), "%s %d TO chan 0x%x\n", in mic_dma_drain_chan()
527 __func__, __LINE__, ch->ch_num); in mic_dma_drain_chan()
531 mic_dma_cleanup(ch); in mic_dma_drain_chan()
535 static inline void mic_dma_chan_uninit(struct mic_dma_chan *ch) in mic_dma_chan_uninit() argument
537 mic_dma_chan_destroy(ch); in mic_dma_chan_uninit()
538 mic_dma_cleanup(ch); in mic_dma_chan_uninit()
539 mic_dma_free_status_dest(ch); in mic_dma_chan_uninit()
540 mic_dma_free_desc_ring(ch); in mic_dma_chan_uninit()
547 struct mic_dma_chan *ch; in mic_dma_init() local
551 ch = &mic_dma_dev->mic_ch[i]; in mic_dma_init()
552 ch->ch_num = i; in mic_dma_init()
553 ch->owner = owner; in mic_dma_init()
554 spin_lock_init(&ch->cleanup_lock); in mic_dma_init()
555 spin_lock_init(&ch->prep_lock); in mic_dma_init()
556 spin_lock_init(&ch->issue_lock); in mic_dma_init()
557 ret = mic_dma_setup_irq(ch); in mic_dma_init()
564 mic_dma_free_irq(ch); in mic_dma_init()
571 struct mic_dma_chan *ch; in mic_dma_uninit() local
574 ch = &mic_dma_dev->mic_ch[i]; in mic_dma_uninit()
575 mic_dma_free_irq(ch); in mic_dma_uninit()
579 static int mic_dma_alloc_chan_resources(struct dma_chan *ch) in mic_dma_alloc_chan_resources() argument
581 int ret = mic_dma_chan_init(to_mic_dma_chan(ch)); in mic_dma_alloc_chan_resources()
587 static void mic_dma_free_chan_resources(struct dma_chan *ch) in mic_dma_free_chan_resources() argument
589 struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch); in mic_dma_free_chan_resources()
683 struct mic_dma_chan *ch; in mic_dma_reg_seq_show() local
693 ch = &mic_dma_dev->mic_ch[i]; in mic_dma_reg_seq_show()
694 chan_num = ch->ch_num; in mic_dma_reg_seq_show()
697 mic_dma_read_reg(ch, MIC_DMA_REG_DCAR), in mic_dma_reg_seq_show()
698 mic_dma_read_reg(ch, MIC_DMA_REG_DTPR), in mic_dma_reg_seq_show()
699 mic_dma_read_reg(ch, MIC_DMA_REG_DHPR), in mic_dma_reg_seq_show()
700 mic_dma_read_reg(ch, MIC_DMA_REG_DRAR_HI)); in mic_dma_reg_seq_show()
702 mic_dma_read_reg(ch, MIC_DMA_REG_DRAR_LO), in mic_dma_reg_seq_show()
703 mic_dma_read_reg(ch, MIC_DMA_REG_DCHERR), in mic_dma_reg_seq_show()
704 mic_dma_read_reg(ch, MIC_DMA_REG_DCHERRMSK), in mic_dma_reg_seq_show()
705 mic_dma_read_reg(ch, MIC_DMA_REG_DSTAT)); in mic_dma_reg_seq_show()