Files
linux-nv-oot/drivers/pci/controller/private-soc/tegra-pcie-dma.c
Laxman Dewangan 1e0bef1f51 pci: Implement function of tegra_pcie if proper config is selected
To avoid the duplicate function defintion between the header and
source, use the proper config to protect it.

Bug 4911768

Change-Id: I8d6880833c122eb2eb7194929eb5ea2cb78a9c45
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
2025-07-24 10:19:08 +00:00

150 lines
4.2 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/* SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. */
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/tegra-pcie-dma.h>
#include "tegra234-pcie-edma-osi.h"
#include "tegra264-pcie-xdma-osi.h"
struct tegra_pcie_dma_priv {
/** Store SoC specific private data pointer. */
void *soc_cookie;
nvpcie_dma_soc_t soc;
};
#ifdef CONFIG_PCIE_TEGRA_DMA
tegra_pcie_dma_status_t tegra_pcie_dma_initialize(struct tegra_pcie_dma_init_info *info,
void **cookie)
{
struct tegra_pcie_dma_priv *prv;
prv = kzalloc(sizeof(*prv), GFP_KERNEL);
if (!prv) {
pr_err("Failed to allocate memory for dma_prv\n");
return TEGRA_PCIE_DMA_FAIL_NOMEM;
}
prv->soc = info->soc;
if (info->soc == NVPCIE_DMA_SOC_T234) {
prv->soc_cookie = tegra234_pcie_edma_initialize(info);
if (!prv->soc_cookie) {
kfree(prv);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
*cookie = prv;
return TEGRA_PCIE_DMA_SUCCESS;
} else if (info->soc == NVPCIE_DMA_SOC_T264) {
prv->soc_cookie = tegra264_pcie_xdma_initialize(info);
if (!prv->soc_cookie) {
kfree(prv);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
*cookie = prv;
return TEGRA_PCIE_DMA_SUCCESS;
} else {
pr_err("%s: invalid soc id: %d\n", __func__, info->soc);
kfree(prv);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
}
EXPORT_SYMBOL_GPL(tegra_pcie_dma_initialize);
tegra_pcie_dma_status_t tegra_pcie_dma_set_msi(void *cookie, u64 msi_addr, u32 msi_data)
{
struct tegra_pcie_dma_priv *prv = (struct tegra_pcie_dma_priv *)cookie;
if (!cookie) {
pr_err("%s: cookie is null\n", __func__);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
if (prv->soc == NVPCIE_DMA_SOC_T234) {
/** This is not supported for T234 SoC. */
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
} else if (prv->soc == NVPCIE_DMA_SOC_T264) {
return tegra264_pcie_xdma_set_msi(prv->soc_cookie, msi_addr, msi_data);
} else {
pr_err("%s: invalid soc id: %d\n", __func__, prv->soc);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
}
EXPORT_SYMBOL_GPL(tegra_pcie_dma_set_msi);
tegra_pcie_dma_status_t tegra_pcie_dma_submit_xfer(void *cookie,
struct tegra_pcie_dma_xfer_info *tx_info)
{
struct tegra_pcie_dma_priv *prv = (struct tegra_pcie_dma_priv *)cookie;
if (!cookie) {
pr_err("%s: cookie is null\n", __func__);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
if (prv->soc == NVPCIE_DMA_SOC_T234) {
return tegra234_pcie_edma_submit_xfer(prv->soc_cookie, tx_info);
} else if (prv->soc == NVPCIE_DMA_SOC_T264) {
return tegra264_pcie_xdma_submit_xfer(prv->soc_cookie, tx_info);
} else {
pr_err("%s: invalid soc id: %d\n", __func__, prv->soc);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
}
EXPORT_SYMBOL_GPL(tegra_pcie_dma_submit_xfer);
bool tegra_pcie_dma_stop(void *cookie)
{
struct tegra_pcie_dma_priv *prv = (struct tegra_pcie_dma_priv *)cookie;
if (!cookie) {
pr_err("%s: cookie is null\n", __func__);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
if (prv->soc == NVPCIE_DMA_SOC_T234) {
return tegra234_pcie_edma_stop(prv->soc_cookie);
} else if (prv->soc == NVPCIE_DMA_SOC_T264) {
return tegra264_pcie_xdma_stop(prv->soc_cookie);
} else {
pr_err("%s: invalid soc id: %d\n", __func__, prv->soc);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
}
EXPORT_SYMBOL_GPL(tegra_pcie_dma_stop);
tegra_pcie_dma_status_t tegra_pcie_dma_deinit(void **cookie)
{
struct tegra_pcie_dma_priv *prv;
if (!cookie) {
pr_err("%s: cookie is null\n", __func__);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
prv = (struct tegra_pcie_dma_priv *)(*cookie);
if (!prv) {
pr_err("%s: prv pointer is null\n", __func__);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
*cookie = NULL;
if (prv->soc == NVPCIE_DMA_SOC_T234) {
tegra234_pcie_edma_deinit(prv->soc_cookie);
kfree(prv);
return TEGRA_PCIE_DMA_SUCCESS;
} else if (prv->soc == NVPCIE_DMA_SOC_T264) {
tegra264_pcie_xdma_deinit(prv->soc_cookie);
kfree(prv);
return TEGRA_PCIE_DMA_SUCCESS;
} else {
pr_err("%s: invalid soc id: %d\n", __func__, prv->soc);
return TEGRA_PCIE_DMA_FAIL_INVAL_INPUTS;
}
}
EXPORT_SYMBOL_GPL(tegra_pcie_dma_deinit);
#endif
MODULE_LICENSE("GPL v2");