From 012753be48fde816d7ca2df0b18d7b6c26a9b011 Mon Sep 17 00:00:00 2001 From: Niranjan Dighe Date: Wed, 24 May 2023 06:47:32 +0000 Subject: [PATCH] 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 Reviewed-by: Laxman Dewangan Reviewed-by: Uday Gupta Tested-by: Aditya Bavanari Reviewed-by: Mohan Kumar D Tested-by: Uday Gupta Tested-by: Kartik Rajput Reviewed-by: Kartik Rajput Signed-off-by: Laxman Dewangan Acked-by: Jacob Martin Acked-by: Noah Wager Signed-off-by: Noah Wager --- drivers/dma/tegra210-adma.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c index 7b98719fda06..b22808736444 100644 --- a/drivers/dma/tegra210-adma.c +++ b/drivers/dma/tegra210-adma.c @@ -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 @@ -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),