Lines Matching full:ringacc

14 #include <linux/soc/ti/k3-ringacc.h>
166 int (*init)(struct platform_device *pdev, struct k3_ringacc *ringacc);
187 * @ops: SoC specific ringacc operation
193 u32 num_rings; /* number of rings in Ringacc module */
286 struct k3_ring *k3_ringacc_request_ring(struct k3_ringacc *ringacc, in k3_ringacc_request_ring() argument
291 mutex_lock(&ringacc->req_lock); in k3_ringacc_request_ring()
296 &ringacc->rm_gp_range->desc[0]; in k3_ringacc_request_ring()
300 id = find_next_zero_bit(ringacc->rings_inuse, size, in k3_ringacc_request_ring()
308 if (test_bit(id, ringacc->rings_inuse) && in k3_ringacc_request_ring()
309 !(ringacc->rings[id].flags & K3_RING_FLAG_SHARED)) in k3_ringacc_request_ring()
311 else if (ringacc->rings[id].flags & K3_RING_FLAG_SHARED) in k3_ringacc_request_ring()
315 proxy_id = find_next_zero_bit(ringacc->proxy_inuse, in k3_ringacc_request_ring()
316 ringacc->num_proxies, 0); in k3_ringacc_request_ring()
317 if (proxy_id == ringacc->num_proxies) in k3_ringacc_request_ring()
322 set_bit(proxy_id, ringacc->proxy_inuse); in k3_ringacc_request_ring()
323 ringacc->rings[id].proxy_id = proxy_id; in k3_ringacc_request_ring()
324 dev_dbg(ringacc->dev, "Giving ring#%d proxy#%d\n", id, in k3_ringacc_request_ring()
327 dev_dbg(ringacc->dev, "Giving ring#%d\n", id); in k3_ringacc_request_ring()
330 set_bit(id, ringacc->rings_inuse); in k3_ringacc_request_ring()
332 ringacc->rings[id].use_count++; in k3_ringacc_request_ring()
333 mutex_unlock(&ringacc->req_lock); in k3_ringacc_request_ring()
334 return &ringacc->rings[id]; in k3_ringacc_request_ring()
337 mutex_unlock(&ringacc->req_lock); in k3_ringacc_request_ring()
342 int k3_ringacc_request_rings_pair(struct k3_ringacc *ringacc, in k3_ringacc_request_rings_pair() argument
352 *fwd_ring = k3_ringacc_request_ring(ringacc, fwd_id, 0); in k3_ringacc_request_rings_pair()
356 *compl_ring = k3_ringacc_request_ring(ringacc, compl_id, 0); in k3_ringacc_request_rings_pair()
368 struct k3_ringacc *ringacc = ring->parent; in k3_ringacc_ring_reset_sci() local
371 ret = ringacc->tisci_ring_ops->config( in k3_ringacc_ring_reset_sci()
372 ringacc->tisci, in k3_ringacc_ring_reset_sci()
374 ringacc->tisci_dev_id, in k3_ringacc_ring_reset_sci()
383 dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n", in k3_ringacc_ring_reset_sci()
401 struct k3_ringacc *ringacc = ring->parent; in k3_ringacc_ring_reconfig_qmode_sci() local
404 ret = ringacc->tisci_ring_ops->config( in k3_ringacc_ring_reconfig_qmode_sci()
405 ringacc->tisci, in k3_ringacc_ring_reconfig_qmode_sci()
407 ringacc->tisci_dev_id, in k3_ringacc_ring_reconfig_qmode_sci()
416 dev_err(ringacc->dev, "TISCI reconf qmode fail (%d) ring_idx %d\n", in k3_ringacc_ring_reconfig_qmode_sci()
481 struct k3_ringacc *ringacc = ring->parent; in k3_ringacc_ring_free_sci() local
484 ret = ringacc->tisci_ring_ops->config( in k3_ringacc_ring_free_sci()
485 ringacc->tisci, in k3_ringacc_ring_free_sci()
487 ringacc->tisci_dev_id, in k3_ringacc_ring_free_sci()
496 dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n", in k3_ringacc_ring_free_sci()
502 struct k3_ringacc *ringacc; in k3_ringacc_ring_free() local
507 ringacc = ring->parent; in k3_ringacc_ring_free()
511 if (!test_bit(ring->ring_id, ringacc->rings_inuse)) in k3_ringacc_ring_free()
514 mutex_lock(&ringacc->req_lock); in k3_ringacc_ring_free()
524 dma_free_coherent(ringacc->dev, in k3_ringacc_ring_free()
530 clear_bit(ring->proxy_id, ringacc->proxy_inuse); in k3_ringacc_ring_free()
536 clear_bit(ring->ring_id, ringacc->rings_inuse); in k3_ringacc_ring_free()
539 mutex_unlock(&ringacc->req_lock); in k3_ringacc_ring_free()
578 struct k3_ringacc *ringacc = ring->parent; in k3_ringacc_ring_cfg_sci() local
582 if (!ringacc->tisci) in k3_ringacc_ring_cfg_sci()
586 ret = ringacc->tisci_ring_ops->config( in k3_ringacc_ring_cfg_sci()
587 ringacc->tisci, in k3_ringacc_ring_cfg_sci()
589 ringacc->tisci_dev_id, in k3_ringacc_ring_cfg_sci()
598 dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n", in k3_ringacc_ring_cfg_sci()
606 struct k3_ringacc *ringacc; in k3_ringacc_ring_cfg() local
611 ringacc = ring->parent; in k3_ringacc_ring_cfg()
616 !test_bit(ring->ring_id, ringacc->rings_inuse)) in k3_ringacc_ring_cfg()
622 dev_err(ringacc->dev, in k3_ringacc_ring_cfg()
631 * ring = k3_ringacc_request_ring(ringacc, ring_id, 0); # master user in k3_ringacc_ring_cfg()
633 * k3_ringacc_request_ring(ringacc, ring_id, K3_RING_FLAG_SHARED); in k3_ringacc_ring_cfg()
634 * k3_ringacc_request_ring(ringacc, ring_id, K3_RING_FLAG_SHARED); in k3_ringacc_ring_cfg()
645 ring->proxy = ringacc->proxy_target_base + in k3_ringacc_ring_cfg()
664 ring->ring_mem_virt = dma_alloc_coherent(ringacc->dev, in k3_ringacc_ring_cfg()
668 dev_err(ringacc->dev, "Failed to alloc ring mem\n"); in k3_ringacc_ring_cfg()
687 dma_free_coherent(ringacc->dev, in k3_ringacc_ring_cfg()
1026 struct k3_ringacc *ringacc = ERR_PTR(-EPROBE_DEFER); in of_k3_ringacc_get_by_phandle() local
1036 ringacc = entry; in of_k3_ringacc_get_by_phandle()
1042 return ringacc; in of_k3_ringacc_get_by_phandle()
1046 static int k3_ringacc_probe_dt(struct k3_ringacc *ringacc) in k3_ringacc_probe_dt() argument
1048 struct device_node *node = ringacc->dev->of_node; in k3_ringacc_probe_dt()
1049 struct device *dev = ringacc->dev; in k3_ringacc_probe_dt()
1058 ret = of_property_read_u32(node, "ti,num-rings", &ringacc->num_rings); in k3_ringacc_probe_dt()
1064 ringacc->tisci = ti_sci_get_by_phandle(node, "ti,sci"); in k3_ringacc_probe_dt()
1065 if (IS_ERR(ringacc->tisci)) { in k3_ringacc_probe_dt()
1066 ret = PTR_ERR(ringacc->tisci); in k3_ringacc_probe_dt()
1069 ringacc->tisci = NULL; in k3_ringacc_probe_dt()
1074 &ringacc->tisci_dev_id); in k3_ringacc_probe_dt()
1080 pdev->id = ringacc->tisci_dev_id; in k3_ringacc_probe_dt()
1082 ringacc->rm_gp_range = devm_ti_sci_get_of_resource(ringacc->tisci, dev, in k3_ringacc_probe_dt()
1083 ringacc->tisci_dev_id, in k3_ringacc_probe_dt()
1085 if (IS_ERR(ringacc->rm_gp_range)) { in k3_ringacc_probe_dt()
1087 return PTR_ERR(ringacc->rm_gp_range); in k3_ringacc_probe_dt()
1090 return ti_sci_inta_msi_domain_alloc_irqs(ringacc->dev, in k3_ringacc_probe_dt()
1091 ringacc->rm_gp_range); in k3_ringacc_probe_dt()
1107 struct k3_ringacc *ringacc) in k3_ringacc_init() argument
1122 ret = k3_ringacc_probe_dt(ringacc); in k3_ringacc_init()
1130 ringacc->dma_ring_reset_quirk = soc_data->dma_ring_reset_quirk; in k3_ringacc_init()
1144 ringacc->proxy_gcfg = devm_ioremap_resource(dev, res); in k3_ringacc_init()
1145 if (IS_ERR(ringacc->proxy_gcfg)) in k3_ringacc_init()
1146 return PTR_ERR(ringacc->proxy_gcfg); in k3_ringacc_init()
1150 ringacc->proxy_target_base = devm_ioremap_resource(dev, res); in k3_ringacc_init()
1151 if (IS_ERR(ringacc->proxy_target_base)) in k3_ringacc_init()
1152 return PTR_ERR(ringacc->proxy_target_base); in k3_ringacc_init()
1154 ringacc->num_proxies = readl(&ringacc->proxy_gcfg->config) & in k3_ringacc_init()
1157 ringacc->rings = devm_kzalloc(dev, in k3_ringacc_init()
1158 sizeof(*ringacc->rings) * in k3_ringacc_init()
1159 ringacc->num_rings, in k3_ringacc_init()
1161 ringacc->rings_inuse = devm_kcalloc(dev, in k3_ringacc_init()
1162 BITS_TO_LONGS(ringacc->num_rings), in k3_ringacc_init()
1164 ringacc->proxy_inuse = devm_kcalloc(dev, in k3_ringacc_init()
1165 BITS_TO_LONGS(ringacc->num_proxies), in k3_ringacc_init()
1168 if (!ringacc->rings || !ringacc->rings_inuse || !ringacc->proxy_inuse) in k3_ringacc_init()
1171 for (i = 0; i < ringacc->num_rings; i++) { in k3_ringacc_init()
1172 ringacc->rings[i].rt = base_rt + in k3_ringacc_init()
1174 ringacc->rings[i].fifos = base_fifo + in k3_ringacc_init()
1176 ringacc->rings[i].parent = ringacc; in k3_ringacc_init()
1177 ringacc->rings[i].ring_id = i; in k3_ringacc_init()
1178 ringacc->rings[i].proxy_id = K3_RINGACC_PROXY_NOT_USED; in k3_ringacc_init()
1181 ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops; in k3_ringacc_init()
1184 ringacc->num_rings, in k3_ringacc_init()
1185 ringacc->rm_gp_range->desc[0].start, in k3_ringacc_init()
1186 ringacc->rm_gp_range->desc[0].num, in k3_ringacc_init()
1187 ringacc->tisci_dev_id); in k3_ringacc_init()
1189 ringacc->dma_ring_reset_quirk ? "enabled" : "disabled"); in k3_ringacc_init()
1191 readl(&ringacc->proxy_gcfg->revision), ringacc->num_proxies); in k3_ringacc_init()
1208 { .compatible = "ti,am654-navss-ringacc", .data = &k3_ringacc_data, },
1217 struct k3_ringacc *ringacc; in k3_ringacc_probe() local
1225 ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL); in k3_ringacc_probe()
1226 if (!ringacc) in k3_ringacc_probe()
1229 ringacc->dev = dev; in k3_ringacc_probe()
1230 mutex_init(&ringacc->req_lock); in k3_ringacc_probe()
1231 ringacc->ops = &match_data->ops; in k3_ringacc_probe()
1233 ret = ringacc->ops->init(pdev, ringacc); in k3_ringacc_probe()
1237 dev_set_drvdata(dev, ringacc); in k3_ringacc_probe()
1240 list_add_tail(&ringacc->list, &k3_ringacc_list); in k3_ringacc_probe()
1249 .name = "k3-ringacc",