Lines Matching refs:ringacc
15 #include <linux/soc/ti/k3-ringacc.h>
183 int (*init)(struct platform_device *pdev, struct k3_ringacc *ringacc);
204 * @ops: SoC specific ringacc operation
332 struct k3_ring *k3_ringacc_request_ring(struct k3_ringacc *ringacc,
337 mutex_lock(&ringacc->req_lock);
339 if (!try_module_get(ringacc->dev->driver->owner))
345 &ringacc->rm_gp_range->desc[0];
349 id = find_next_zero_bit(ringacc->rings_inuse, size,
357 if (test_bit(id, ringacc->rings_inuse) &&
358 !(ringacc->rings[id].flags & K3_RING_FLAG_SHARED))
360 else if (ringacc->rings[id].flags & K3_RING_FLAG_SHARED)
364 proxy_id = find_first_zero_bit(ringacc->proxy_inuse,
365 ringacc->num_proxies);
366 if (proxy_id == ringacc->num_proxies)
371 set_bit(proxy_id, ringacc->proxy_inuse);
372 ringacc->rings[id].proxy_id = proxy_id;
373 dev_dbg(ringacc->dev, "Giving ring#%d proxy#%d\n", id,
376 dev_dbg(ringacc->dev, "Giving ring#%d\n", id);
379 set_bit(id, ringacc->rings_inuse);
381 ringacc->rings[id].use_count++;
382 mutex_unlock(&ringacc->req_lock);
383 return &ringacc->rings[id];
386 module_put(ringacc->dev->driver->owner);
389 mutex_unlock(&ringacc->req_lock);
394 static int k3_dmaring_request_dual_ring(struct k3_ringacc *ringacc, int fwd_id,
407 mutex_lock(&ringacc->req_lock);
409 if (!try_module_get(ringacc->dev->driver->owner)) {
414 if (test_bit(fwd_id, ringacc->rings_inuse)) {
419 *fwd_ring = &ringacc->rings[fwd_id];
420 *compl_ring = &ringacc->rings[fwd_id + ringacc->num_rings];
421 set_bit(fwd_id, ringacc->rings_inuse);
422 ringacc->rings[fwd_id].use_count++;
423 dev_dbg(ringacc->dev, "Giving ring#%d\n", fwd_id);
425 mutex_unlock(&ringacc->req_lock);
429 module_put(ringacc->dev->driver->owner);
431 mutex_unlock(&ringacc->req_lock);
435 int k3_ringacc_request_rings_pair(struct k3_ringacc *ringacc,
445 if (ringacc->dma_rings)
446 return k3_dmaring_request_dual_ring(ringacc, fwd_id,
449 *fwd_ring = k3_ringacc_request_ring(ringacc, fwd_id, 0);
453 *compl_ring = k3_ringacc_request_ring(ringacc, compl_id, 0);
466 struct k3_ringacc *ringacc = ring->parent;
469 ring_cfg.nav_id = ringacc->tisci_dev_id;
474 ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
476 dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n",
495 struct k3_ringacc *ringacc = ring->parent;
498 ring_cfg.nav_id = ringacc->tisci_dev_id;
503 ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
505 dev_err(ringacc->dev, "TISCI reconf qmode fail (%d) ring_idx %d\n",
571 struct k3_ringacc *ringacc = ring->parent;
574 ring_cfg.nav_id = ringacc->tisci_dev_id;
578 ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
580 dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n",
586 struct k3_ringacc *ringacc;
591 ringacc = ring->parent;
597 if (ringacc->dma_rings && (ring->flags & K3_RING_FLAG_REVERSE))
602 if (!test_bit(ring->ring_id, ringacc->rings_inuse))
605 mutex_lock(&ringacc->req_lock);
624 clear_bit(ring->proxy_id, ringacc->proxy_inuse);
630 clear_bit(ring->ring_id, ringacc->rings_inuse);
632 module_put(ringacc->dev->driver->owner);
635 mutex_unlock(&ringacc->req_lock);
675 struct k3_ringacc *ringacc = ring->parent;
678 if (!ringacc->tisci)
681 ring_cfg.nav_id = ringacc->tisci_dev_id;
691 ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg);
693 dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n",
701 struct k3_ringacc *ringacc;
710 ringacc = ring->parent;
716 if (ringacc->dma_rings && (ring->flags & K3_RING_FLAG_REVERSE))
719 if (!test_bit(ring->ring_id, ringacc->rings_inuse))
728 dev_warn(ringacc->dev, "dma_dev is not provided for ring%d\n",
730 ring->dma_dev = ringacc->dev;
741 dev_err(ringacc->dev, "Failed to alloc ring mem\n");
755 reverse_ring = &ringacc->rings[ring->ring_id + ringacc->num_rings];
785 struct k3_ringacc *ringacc;
791 ringacc = ring->parent;
793 if (ringacc->dma_rings)
799 !test_bit(ring->ring_id, ringacc->rings_inuse))
805 dev_err(ringacc->dev,
814 * ring = k3_ringacc_request_ring(ringacc, ring_id, 0); # master user
816 * k3_ringacc_request_ring(ringacc, ring_id, K3_RING_FLAG_SHARED);
817 * k3_ringacc_request_ring(ringacc, ring_id, K3_RING_FLAG_SHARED);
828 ring->proxy = ringacc->proxy_target_base +
836 ring->dma_dev = ringacc->dev;
839 ring->dma_dev = ringacc->dev;
855 dev_err(ringacc->dev, "Failed to alloc ring mem\n");
1285 struct k3_ringacc *ringacc = ERR_PTR(-EPROBE_DEFER);
1295 ringacc = entry;
1301 return ringacc;
1305 static int k3_ringacc_probe_dt(struct k3_ringacc *ringacc)
1307 struct device_node *node = ringacc->dev->of_node;
1308 struct device *dev = ringacc->dev;
1317 ret = of_property_read_u32(node, "ti,num-rings", &ringacc->num_rings);
1323 ringacc->tisci = ti_sci_get_by_phandle(node, "ti,sci");
1324 if (IS_ERR(ringacc->tisci)) {
1325 ret = PTR_ERR(ringacc->tisci);
1328 ringacc->tisci = NULL;
1333 &ringacc->tisci_dev_id);
1339 pdev->id = ringacc->tisci_dev_id;
1341 ringacc->rm_gp_range = devm_ti_sci_get_of_resource(ringacc->tisci, dev,
1342 ringacc->tisci_dev_id,
1344 if (IS_ERR(ringacc->rm_gp_range)) {
1346 return PTR_ERR(ringacc->rm_gp_range);
1349 return ti_sci_inta_msi_domain_alloc_irqs(ringacc->dev,
1350 ringacc->rm_gp_range);
1366 struct k3_ringacc *ringacc)
1378 ret = k3_ringacc_probe_dt(ringacc);
1386 ringacc->dma_ring_reset_quirk = soc_data->dma_ring_reset_quirk;
1397 ringacc->proxy_gcfg = devm_platform_ioremap_resource_byname(pdev, "proxy_gcfg");
1398 if (IS_ERR(ringacc->proxy_gcfg))
1399 return PTR_ERR(ringacc->proxy_gcfg);
1401 ringacc->proxy_target_base = devm_platform_ioremap_resource_byname(pdev,
1403 if (IS_ERR(ringacc->proxy_target_base))
1404 return PTR_ERR(ringacc->proxy_target_base);
1406 ringacc->num_proxies = readl(&ringacc->proxy_gcfg->config) &
1409 ringacc->rings = devm_kzalloc(dev,
1410 sizeof(*ringacc->rings) *
1411 ringacc->num_rings,
1413 ringacc->rings_inuse = devm_bitmap_zalloc(dev, ringacc->num_rings,
1415 ringacc->proxy_inuse = devm_bitmap_zalloc(dev, ringacc->num_proxies,
1418 if (!ringacc->rings || !ringacc->rings_inuse || !ringacc->proxy_inuse)
1421 for (i = 0; i < ringacc->num_rings; i++) {
1422 ringacc->rings[i].rt = base_rt +
1424 ringacc->rings[i].fifos = base_fifo +
1426 ringacc->rings[i].parent = ringacc;
1427 ringacc->rings[i].ring_id = i;
1428 ringacc->rings[i].proxy_id = K3_RINGACC_PROXY_NOT_USED;
1431 ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
1434 ringacc->num_rings,
1435 ringacc->rm_gp_range->desc[0].start,
1436 ringacc->rm_gp_range->desc[0].num,
1437 ringacc->tisci_dev_id);
1439 ringacc->dma_ring_reset_quirk ? "enabled" : "disabled");
1441 readl(&ringacc->proxy_gcfg->revision), ringacc->num_proxies);
1458 { .compatible = "ti,am654-navss-ringacc", .data = &k3_ringacc_data, },
1467 struct k3_ringacc *ringacc;
1471 ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL);
1472 if (!ringacc)
1475 ringacc->dev = dev;
1476 ringacc->dma_rings = true;
1477 ringacc->num_rings = data->num_rings;
1478 ringacc->tisci = data->tisci;
1479 ringacc->tisci_dev_id = data->tisci_dev_id;
1481 mutex_init(&ringacc->req_lock);
1487 ringacc->rings = devm_kzalloc(dev,
1488 sizeof(*ringacc->rings) *
1489 ringacc->num_rings * 2,
1491 ringacc->rings_inuse = devm_bitmap_zalloc(dev, ringacc->num_rings,
1494 if (!ringacc->rings || !ringacc->rings_inuse)
1497 for (i = 0; i < ringacc->num_rings; i++) {
1498 struct k3_ring *ring = &ringacc->rings[i];
1501 ring->parent = ringacc;
1505 ring = &ringacc->rings[ringacc->num_rings + i];
1508 ring->parent = ringacc;
1514 ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
1516 dev_info(dev, "Number of rings: %u\n", ringacc->num_rings);
1518 return ringacc;
1526 struct k3_ringacc *ringacc;
1533 ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL);
1534 if (!ringacc)
1537 ringacc->dev = dev;
1538 mutex_init(&ringacc->req_lock);
1539 ringacc->ops = &match_data->ops;
1541 ret = ringacc->ops->init(pdev, ringacc);
1545 dev_set_drvdata(dev, ringacc);
1548 list_add_tail(&ringacc->list, &k3_ringacc_list);
1556 struct k3_ringacc *ringacc = dev_get_drvdata(&pdev->dev);
1559 list_del(&ringacc->list);
1568 .name = "k3-ringacc",