Lines Matching refs:ring
106 int (*push_tail)(struct k3_ring *ring, void *elm);
107 int (*push_head)(struct k3_ring *ring, void *elm);
108 int (*pop_tail)(struct k3_ring *ring, void *elm);
109 int (*pop_head)(struct k3_ring *ring, void *elm);
137 * @elm_size: Size of the ring element
175 * @num_rings: number of ring in RA
176 * @rings_inuse: bitfield for ring usage tracking
221 static long k3_ringacc_ring_get_fifo_pos(struct k3_ring *ring)
224 (4 << ring->elm_size);
227 static void *k3_ringacc_get_elm_addr(struct k3_ring *ring, u32 idx)
229 return (ring->ring_mem_virt + idx * (4 << ring->elm_size));
232 static int k3_ringacc_ring_push_mem(struct k3_ring *ring, void *elem);
233 static int k3_ringacc_ring_pop_mem(struct k3_ring *ring, void *elem);
240 static int k3_ringacc_ring_push_io(struct k3_ring *ring, void *elem);
241 static int k3_ringacc_ring_pop_io(struct k3_ring *ring, void *elem);
242 static int k3_ringacc_ring_push_head_io(struct k3_ring *ring, void *elem);
243 static int k3_ringacc_ring_pop_tail_io(struct k3_ring *ring, void *elem);
252 static int k3_ringacc_ring_push_head_proxy(struct k3_ring *ring, void *elem);
253 static int k3_ringacc_ring_push_tail_proxy(struct k3_ring *ring, void *elem);
254 static int k3_ringacc_ring_pop_head_proxy(struct k3_ring *ring, void *elem);
255 static int k3_ringacc_ring_pop_tail_proxy(struct k3_ring *ring, void *elem);
264 static void k3_ringacc_ring_dump(struct k3_ring *ring)
266 struct device *dev = ring->parent->dev;
268 dev_dbg(dev, "dump ring: %d\n", ring->ring_id);
269 dev_dbg(dev, "dump mem virt %p, dma %pad\n", ring->ring_mem_virt,
270 &ring->ring_mem_dma);
272 ring->elm_size, ring->size, ring->mode, ring->proxy_id);
273 dev_dbg(dev, "dump flags %08X\n", ring->flags);
275 dev_dbg(dev, "dump ring_rt_regs: db%08x\n", readl(&ring->rt->db));
276 dev_dbg(dev, "dump occ%08x\n", readl(&ring->rt->occ));
277 dev_dbg(dev, "dump indx%08x\n", readl(&ring->rt->indx));
278 dev_dbg(dev, "dump hwocc%08x\n", readl(&ring->rt->hwocc));
279 dev_dbg(dev, "dump hwindx%08x\n", readl(&ring->rt->hwindx));
281 if (ring->ring_mem_virt)
283 16, 1, ring->ring_mem_virt, 16 * 8, false);
294 /* Request for any general purpose ring */
324 dev_dbg(ringacc->dev, "Giving ring#%d proxy#%d\n", id,
327 dev_dbg(ringacc->dev, "Giving ring#%d\n", id);
366 static void k3_ringacc_ring_reset_sci(struct k3_ring *ring)
368 struct k3_ringacc *ringacc = ring->parent;
375 ring->ring_id,
378 ring->size,
383 dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n",
384 ret, ring->ring_id);
387 void k3_ringacc_ring_reset(struct k3_ring *ring)
389 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
392 memset(&ring->state, 0, sizeof(ring->state));
394 k3_ringacc_ring_reset_sci(ring);
398 static void k3_ringacc_ring_reconfig_qmode_sci(struct k3_ring *ring,
401 struct k3_ringacc *ringacc = ring->parent;
408 ring->ring_id,
417 ret, ring->ring_id);
420 void k3_ringacc_ring_reset_dma(struct k3_ring *ring, u32 occ)
422 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
425 if (!ring->parent->dma_ring_reset_quirk)
429 occ = readl(&ring->rt->occ);
434 dev_dbg(ring->parent->dev, "%s %u occ: %u\n", __func__,
435 ring->ring_id, occ);
436 /* TI-SCI ring reset */
437 k3_ringacc_ring_reset_sci(ring);
440 * Setup the ring in ring/doorbell mode (if not already in this
443 if (ring->mode != K3_RINGACC_RING_MODE_RING)
445 ring, K3_RINGACC_RING_MODE_RING);
448 * This will wrap the internal UDMAP ring state occupancy
464 writel(db_ring_cnt_cur, &ring->rt->db);
468 /* Restore the original ring mode (if not ring mode) */
469 if (ring->mode != K3_RINGACC_RING_MODE_RING)
470 k3_ringacc_ring_reconfig_qmode_sci(ring, ring->mode);
474 /* Reset the ring */
475 k3_ringacc_ring_reset(ring);
479 static void k3_ringacc_ring_free_sci(struct k3_ring *ring)
481 struct k3_ringacc *ringacc = ring->parent;
488 ring->ring_id,
496 dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n",
497 ret, ring->ring_id);
500 int k3_ringacc_ring_free(struct k3_ring *ring)
504 if (!ring)
507 ringacc = ring->parent;
509 dev_dbg(ring->parent->dev, "flags: 0x%08x\n", ring->flags);
511 if (!test_bit(ring->ring_id, ringacc->rings_inuse))
516 if (--ring->use_count)
519 if (!(ring->flags & K3_RING_FLAG_BUSY))
522 k3_ringacc_ring_free_sci(ring);
525 ring->size * (4 << ring->elm_size),
526 ring->ring_mem_virt, ring->ring_mem_dma);
527 ring->flags = 0;
528 ring->ops = NULL;
529 if (ring->proxy_id != K3_RINGACC_PROXY_NOT_USED) {
530 clear_bit(ring->proxy_id, ringacc->proxy_inuse);
531 ring->proxy = NULL;
532 ring->proxy_id = K3_RINGACC_PROXY_NOT_USED;
536 clear_bit(ring->ring_id, ringacc->rings_inuse);
544 u32 k3_ringacc_get_ring_id(struct k3_ring *ring)
546 if (!ring)
549 return ring->ring_id;
553 u32 k3_ringacc_get_tisci_dev_id(struct k3_ring *ring)
555 if (!ring)
558 return ring->parent->tisci_dev_id;
562 int k3_ringacc_get_ring_irq_num(struct k3_ring *ring)
566 if (!ring)
569 irq_num = ti_sci_inta_msi_get_virq(ring->parent->dev, ring->ring_id);
576 static int k3_ringacc_ring_cfg_sci(struct k3_ring *ring)
578 struct k3_ringacc *ringacc = ring->parent;
585 ring_idx = ring->ring_id;
591 lower_32_bits(ring->ring_mem_dma),
592 upper_32_bits(ring->ring_mem_dma),
593 ring->size,
594 ring->mode,
595 ring->elm_size,
598 dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n",
604 int k3_ringacc_ring_cfg(struct k3_ring *ring, struct k3_ring_cfg *cfg)
609 if (!ring || !cfg)
611 ringacc = ring->parent;
616 !test_bit(ring->ring_id, ringacc->rings_inuse))
620 ring->proxy_id == K3_RINGACC_PROXY_NOT_USED &&
624 4 << ring->elm_size);
629 * In case of shared ring only the first user (master user) can
630 * configure the ring. The sequence should be by the client:
631 * ring = k3_ringacc_request_ring(ringacc, ring_id, 0); # master user
632 * k3_ringacc_ring_cfg(ring, cfg); # master configuration
636 if (ring->use_count != 1)
639 ring->size = cfg->size;
640 ring->elm_size = cfg->elm_size;
641 ring->mode = cfg->mode;
642 memset(&ring->state, 0, sizeof(ring->state));
644 if (ring->proxy_id != K3_RINGACC_PROXY_NOT_USED)
645 ring->proxy = ringacc->proxy_target_base +
646 ring->proxy_id * K3_RINGACC_PROXY_TARGET_STEP;
648 switch (ring->mode) {
650 ring->ops = &k3_ring_mode_ring_ops;
653 if (ring->proxy)
654 ring->ops = &k3_ring_mode_proxy_ops;
656 ring->ops = &k3_ring_mode_msg_ops;
659 ring->ops = NULL;
664 ring->ring_mem_virt = dma_alloc_coherent(ringacc->dev,
665 ring->size * (4 << ring->elm_size),
666 &ring->ring_mem_dma, GFP_KERNEL);
667 if (!ring->ring_mem_virt) {
668 dev_err(ringacc->dev, "Failed to alloc ring mem\n");
673 ret = k3_ringacc_ring_cfg_sci(ring);
678 ring->flags |= K3_RING_FLAG_BUSY;
679 ring->flags |= (cfg->flags & K3_RINGACC_RING_SHARED) ?
682 k3_ringacc_ring_dump(ring);
688 ring->size * (4 << ring->elm_size),
689 ring->ring_mem_virt,
690 ring->ring_mem_dma);
692 ring->ops = NULL;
694 ring->proxy = NULL;
699 u32 k3_ringacc_ring_get_size(struct k3_ring *ring)
701 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
704 return ring->size;
708 u32 k3_ringacc_ring_get_free(struct k3_ring *ring)
710 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
713 if (!ring->state.free)
714 ring->state.free = ring->size - readl(&ring->rt->occ);
716 return ring->state.free;
720 u32 k3_ringacc_ring_get_occ(struct k3_ring *ring)
722 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
725 return readl(&ring->rt->occ);
729 u32 k3_ringacc_ring_is_full(struct k3_ring *ring)
731 return !k3_ringacc_ring_get_free(ring);
746 static int k3_ringacc_ring_cfg_proxy(struct k3_ring *ring,
751 val = ring->ring_id;
753 val |= K3_RINGACC_PROXY_ELSIZE(ring->elm_size);
754 writel(val, &ring->proxy->control);
758 static int k3_ringacc_ring_access_proxy(struct k3_ring *ring, void *elem,
763 ptr = (void __iomem *)&ring->proxy->data;
768 k3_ringacc_ring_cfg_proxy(ring, PROXY_ACCESS_MODE_HEAD);
772 k3_ringacc_ring_cfg_proxy(ring, PROXY_ACCESS_MODE_TAIL);
778 ptr += k3_ringacc_ring_get_fifo_pos(ring);
783 dev_dbg(ring->parent->dev,
786 memcpy_fromio(elem, ptr, (4 << ring->elm_size));
787 ring->state.occ--;
791 dev_dbg(ring->parent->dev,
794 memcpy_toio(ptr, elem, (4 << ring->elm_size));
795 ring->state.free--;
801 dev_dbg(ring->parent->dev, "proxy: free%d occ%d\n", ring->state.free,
802 ring->state.occ);
806 static int k3_ringacc_ring_push_head_proxy(struct k3_ring *ring, void *elem)
808 return k3_ringacc_ring_access_proxy(ring, elem,
812 static int k3_ringacc_ring_push_tail_proxy(struct k3_ring *ring, void *elem)
814 return k3_ringacc_ring_access_proxy(ring, elem,
818 static int k3_ringacc_ring_pop_head_proxy(struct k3_ring *ring, void *elem)
820 return k3_ringacc_ring_access_proxy(ring, elem,
824 static int k3_ringacc_ring_pop_tail_proxy(struct k3_ring *ring, void *elem)
826 return k3_ringacc_ring_access_proxy(ring, elem,
830 static int k3_ringacc_ring_access_io(struct k3_ring *ring, void *elem,
838 ptr = (void __iomem *)&ring->fifos->head_data;
842 ptr = (void __iomem *)&ring->fifos->tail_data;
848 ptr += k3_ringacc_ring_get_fifo_pos(ring);
853 dev_dbg(ring->parent->dev,
856 memcpy_fromio(elem, ptr, (4 << ring->elm_size));
857 ring->state.occ--;
861 dev_dbg(ring->parent->dev,
864 memcpy_toio(ptr, elem, (4 << ring->elm_size));
865 ring->state.free--;
871 dev_dbg(ring->parent->dev, "free%d index%d occ%d index%d\n",
872 ring->state.free, ring->state.windex, ring->state.occ,
873 ring->state.rindex);
877 static int k3_ringacc_ring_push_head_io(struct k3_ring *ring, void *elem)
879 return k3_ringacc_ring_access_io(ring, elem,
883 static int k3_ringacc_ring_push_io(struct k3_ring *ring, void *elem)
885 return k3_ringacc_ring_access_io(ring, elem,
889 static int k3_ringacc_ring_pop_io(struct k3_ring *ring, void *elem)
891 return k3_ringacc_ring_access_io(ring, elem,
895 static int k3_ringacc_ring_pop_tail_io(struct k3_ring *ring, void *elem)
897 return k3_ringacc_ring_access_io(ring, elem,
901 static int k3_ringacc_ring_push_mem(struct k3_ring *ring, void *elem)
905 elem_ptr = k3_ringacc_get_elm_addr(ring, ring->state.windex);
907 memcpy(elem_ptr, elem, (4 << ring->elm_size));
909 ring->state.windex = (ring->state.windex + 1) % ring->size;
910 ring->state.free--;
911 writel(1, &ring->rt->db);
913 dev_dbg(ring->parent->dev, "ring_push_mem: free%d index%d\n",
914 ring->state.free, ring->state.windex);
919 static int k3_ringacc_ring_pop_mem(struct k3_ring *ring, void *elem)
923 elem_ptr = k3_ringacc_get_elm_addr(ring, ring->state.rindex);
925 memcpy(elem, elem_ptr, (4 << ring->elm_size));
927 ring->state.rindex = (ring->state.rindex + 1) % ring->size;
928 ring->state.occ--;
929 writel(-1, &ring->rt->db);
931 dev_dbg(ring->parent->dev, "ring_pop_mem: occ%d index%d pos_ptr%p\n",
932 ring->state.occ, ring->state.rindex, elem_ptr);
936 int k3_ringacc_ring_push(struct k3_ring *ring, void *elem)
940 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
943 dev_dbg(ring->parent->dev, "ring_push: free%d index%d\n",
944 ring->state.free, ring->state.windex);
946 if (k3_ringacc_ring_is_full(ring))
949 if (ring->ops && ring->ops->push_tail)
950 ret = ring->ops->push_tail(ring, elem);
956 int k3_ringacc_ring_push_head(struct k3_ring *ring, void *elem)
960 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
963 dev_dbg(ring->parent->dev, "ring_push_head: free%d index%d\n",
964 ring->state.free, ring->state.windex);
966 if (k3_ringacc_ring_is_full(ring))
969 if (ring->ops && ring->ops->push_head)
970 ret = ring->ops->push_head(ring, elem);
976 int k3_ringacc_ring_pop(struct k3_ring *ring, void *elem)
980 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
983 if (!ring->state.occ)
984 ring->state.occ = k3_ringacc_ring_get_occ(ring);
986 dev_dbg(ring->parent->dev, "ring_pop: occ%d index%d\n", ring->state.occ,
987 ring->state.rindex);
989 if (!ring->state.occ)
992 if (ring->ops && ring->ops->pop_head)
993 ret = ring->ops->pop_head(ring, elem);
999 int k3_ringacc_ring_pop_tail(struct k3_ring *ring, void *elem)
1003 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY))
1006 if (!ring->state.occ)
1007 ring->state.occ = k3_ringacc_ring_get_occ(ring);
1009 dev_dbg(ring->parent->dev, "ring_pop_tail: occ%d index%d\n",
1010 ring->state.occ, ring->state.rindex);
1012 if (!ring->state.occ)
1015 if (ring->ops && ring->ops->pop_tail)
1016 ret = ring->ops->pop_tail(ring, elem);
1188 dev_info(dev, "dma-ring-reset-quirk: %s\n",