NVIDIA: SAUCE: dma: adma: Fix channel offset for virt

BugLink: https://bugs.launchpad.net/bugs/2072591

Fix channel offset for virtualization case where ADMA channel
pages could be assigned to individual guest OSes.

http://nvbugs/4122636

Signed-off-by: Niranjan Dighe <ndighe@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Uday Gupta <udayg@nvidia.com>
Tested-by: Aditya Bavanari <abavanari@nvidia.com>
Reviewed-by: Mohan Kumar D <mkumard@nvidia.com>
Tested-by: Uday Gupta <udayg@nvidia.com>
Tested-by: Kartik Rajput <kkartik@nvidia.com>
Reviewed-by: Kartik Rajput <kkartik@nvidia.com>
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Acked-by: Jacob Martin <jacob.martin@canonical.com>
Acked-by: Noah Wager <noah.wager@canonical.com>
Signed-off-by: Noah Wager <noah.wager@canonical.com>
This commit is contained in:
Niranjan Dighe
2023-05-24 06:47:32 +00:00
committed by Noah Wager
parent 953360cf47
commit 012753be48
+10 -3
View File
@@ -2,7 +2,7 @@
/*
* ADMA driver for Nvidia's Tegra210 ADMA controller.
*
* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved.
*/
#include <linux/clk.h>
@@ -156,6 +156,12 @@ struct tegra_adma {
struct clk *ahub_clk;
unsigned int nr_channels;
unsigned long *dma_chan_mask;
/* Used in virtualization case where individual
* channel page could be assigned to indivudual
* guest OS. Offset is used to skip channel pages
* not assigned to current guest OS
*/
unsigned int chan_page_offset;
unsigned long rx_requests_reserved;
unsigned long tx_requests_reserved;
@@ -225,8 +231,8 @@ static int tegra_adma_init(struct tegra_adma *tdma)
int ret;
/* Clear any interrupts */
tdma_write(tdma, tdma->cdata->ch_base_offset + tdma->cdata->global_int_clear, 0x1);
tdma_write(tdma, tdma->cdata->ch_base_offset + tdma->chan_page_offset
+ tdma->cdata->global_int_clear, 0x1);
if (tdma->cdata->is_virtualized) {
tdma->global_cmd = 1;
return 0;
@@ -915,6 +921,7 @@ static int tegra_adma_probe(struct platform_device *pdev)
if (page_base)
chan_page_offset = (unsigned int) (page_base->start -
global_base->start - cdata->ch_base_offset);
tdma->chan_page_offset = chan_page_offset;
tdma->dma_chan_mask = devm_kzalloc(&pdev->dev,
BITS_TO_LONGS(tdma->nr_channels) * sizeof(unsigned long),