]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dmaengine: ti: k3-udma: Enable second resource range for BCDMA and PKTDMA
authorSiddharth Vadapalli <s-vadapalli@ti.com>
Wed, 5 Feb 2025 12:18:01 +0000 (17:48 +0530)
committerVinod Koul <vkoul@kernel.org>
Mon, 10 Mar 2025 20:55:19 +0000 (02:25 +0530)
The SoC DMA resources for UDMA, BCDMA and PKTDMA can be described via a
combination of up to two resource ranges. The first resource range handles
the default partitioning wherein all resources belonging to that range are
allocated to a single entity and form a continuous range. For use-cases
where the resources are shared across multiple entities and require to be
described via discontinuous ranges, a second resource range is required.

Currently, udma_setup_resources() supports handling resources that belong
to the second range. Extend bcdma_setup_resources() and
pktdma_setup_resources() to support the same.

Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Link: https://lore.kernel.org/r/20250205121805.316792-1-s-vadapalli@ti.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ti/k3-udma.c

index 7ed1956b464290f7f6d8cfc607adf4cda85c54bd..b223a7aacb0cf155de3120c195d128e5dae6888d 100644 (file)
@@ -4886,6 +4886,12 @@ static int bcdma_setup_resources(struct udma_dev *ud)
                                irq_res.desc[i].start = rm_res->desc[i].start +
                                                        oes->bcdma_bchan_ring;
                                irq_res.desc[i].num = rm_res->desc[i].num;
+
+                               if (rm_res->desc[i].num_sec) {
+                                       irq_res.desc[i].start_sec = rm_res->desc[i].start_sec +
+                                                                       oes->bcdma_bchan_ring;
+                                       irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
+                               }
                        }
                }
        } else {
@@ -4909,6 +4915,15 @@ static int bcdma_setup_resources(struct udma_dev *ud)
                                irq_res.desc[i + 1].start = rm_res->desc[j].start +
                                                        oes->bcdma_tchan_ring;
                                irq_res.desc[i + 1].num = rm_res->desc[j].num;
+
+                               if (rm_res->desc[j].num_sec) {
+                                       irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
+                                                                       oes->bcdma_tchan_data;
+                                       irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
+                                       irq_res.desc[i + 1].start_sec = rm_res->desc[j].start_sec +
+                                                                       oes->bcdma_tchan_ring;
+                                       irq_res.desc[i + 1].num_sec = rm_res->desc[j].num_sec;
+                               }
                        }
                }
        }
@@ -4929,6 +4944,15 @@ static int bcdma_setup_resources(struct udma_dev *ud)
                                irq_res.desc[i + 1].start = rm_res->desc[j].start +
                                                        oes->bcdma_rchan_ring;
                                irq_res.desc[i + 1].num = rm_res->desc[j].num;
+
+                               if (rm_res->desc[j].num_sec) {
+                                       irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
+                                                                       oes->bcdma_rchan_data;
+                                       irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
+                                       irq_res.desc[i + 1].start_sec = rm_res->desc[j].start_sec +
+                                                                       oes->bcdma_rchan_ring;
+                                       irq_res.desc[i + 1].num_sec = rm_res->desc[j].num_sec;
+                               }
                        }
                }
        }
@@ -5063,6 +5087,12 @@ static int pktdma_setup_resources(struct udma_dev *ud)
                        irq_res.desc[i].start = rm_res->desc[i].start +
                                                oes->pktdma_tchan_flow;
                        irq_res.desc[i].num = rm_res->desc[i].num;
+
+                       if (rm_res->desc[i].num_sec) {
+                               irq_res.desc[i].start_sec = rm_res->desc[i].start_sec +
+                                                               oes->pktdma_tchan_flow;
+                               irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
+                       }
                }
        }
        rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
@@ -5074,6 +5104,12 @@ static int pktdma_setup_resources(struct udma_dev *ud)
                        irq_res.desc[i].start = rm_res->desc[j].start +
                                                oes->pktdma_rchan_flow;
                        irq_res.desc[i].num = rm_res->desc[j].num;
+
+                       if (rm_res->desc[j].num_sec) {
+                               irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
+                                                               oes->pktdma_rchan_flow;
+                               irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
+                       }
                }
        }
        ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);