Files
linux-nv-oot/drivers/pci/controller/private-soc/tegra264-pcie-xdma-osi.h
Nagarjuna Kristam 8774bd321b pci: t264: xdma: Fix MSI for local and remote
Use different MSI channels for local and remote use case to avoid
configuring same registers with different info.

Bug 4779415

Change-Id: I13fab912589d47484881cd862fc9eaf0f602e64e
Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-t264/+/3186319
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Tested-by: Bitan Biswas <bbiswas@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
2025-07-24 10:19:08 +00:00

125 lines
4.5 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/* SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. */
#ifndef TEGRA264_PCIE_XDMA_OSI_H
#define TEGRA264_PCIE_XDMA_OSI_H
#undef OSI_BIT
#define OSI_BIT(b) (1U << (b))
/** generates bit mask for 32 bit value */
#undef OSI_GENMASK
#define OSI_GENMASK(h, l) (((~0U) << (l)) & (~0U >> (31U - (h))))
#define XDMA_MSI_CFG_MASK 0x100
#define XDMA_MSI_CFG_MASK_STATUS_MSI BIT(8)
#define XDMA_MSI_CFG_LOCAL_ADDRESS_LO 0x104
#define XDMA_MSI_CFG_LOCAL_ADDRESS_HI 0x108
#define XDMA_MSI_CFG_REMOTE_ADDRESS_LO 0x10c
#define XDMA_MSI_CFG_REMOTE_ADDRESS_HI 0x110
/* Channel specific registers */
#define XDMA_CHANNEL_CTRL 0x2000
#define XDMA_CHANNEL_CTRL_MSI_CHANNEL_NUMBER OSI_GENMASK(11, 9)
#define XDMA_CHANNEL_CTRL_MSI_CHANNEL_SHIFT 9
#define XDMA_CHANNEL_CTRL_DMA_CMD_SOURCE OSI_BIT(2)
#define XDMA_CHANNEL_CTRL_DMA_OPERATION OSI_BIT(1)
#define XDMA_CHANNEL_CTRL_EN OSI_BIT(0)
#define XDMA_CHANNEL_DESCRIPTOR_LIST_POINTER_LOW 0x2020
#define XDMA_CHANNEL_DESCRIPTOR_LIST_POINTER_HIGH 0x2040
#define XDMA_CHANNEL_DESCRIPTOR_LIST_SIZE 0x2060
#define XDMA_CHANNEL_DESCRIPTOR_LIST_SIZE_DESCRIPTOR_COUNT OSI_GENMASK(15, 0)
#define XDMA_CHANNEL_SINGLE_TRANSFER_SOURCE_ADDRESS_LOW 0x2080
#define XDMA_CHANNEL_SINGLE_TRANSFER_SOURCE_ADDRESS_HIGH 0x20a0
#define XDMA_CHANNEL_SINGLE_TRANSFER_DESTINATION_ADDRESS_LOW 0x20c0
#define XDMA_CHANNEL_SINGLE_TRANSFER_DESTINATION_ADDRESS_HIGH 0x2100
#define XDMA_CHANNEL_SINGLE_TRANSFER_SIZE 0x2120
#define XDMA_CHANNEL_TRANSFER_DOORBELL 0x2140
#define XDMA_CHANNEL_TRANSFER_DOORBELL_DOORBELL BIT(0)
#define XDMA_CHANNEL_TRANSFER_DOORBELL_NUM_DESC_ADDED GENMASK(15, 8)
#define XDMA_CHANNEL_TRANSFER_DOORBELL_NUM_DESC_ADDED_SHIFT 8
#define XDMA_CHANNEL_STATUS 0x2160
#define XDMA_CHANNEL_STATUS_LAST_DESC_COMPLETED_ADDRESS_VALID BIT(9)
#define XDMA_CHANNEL_STATUS_LAST_DESC_COMPLETED_ADDRESS_LO 0x2280
#define XDMA_CHANNEL_STATUS_LAST_DESC_COMPLETED_ADDRESS_HI 0x22a0
#define XDMA_CHANNEL_STATUS_LAST_DESC_COMPLETED_INDEX 0x22c0
#define XDMA_CHANNEL_STATUS_LAST_DESC_COMPLETED_INDEX_VALUE GENMASK(15, 0)
#define XDMA_CHANNEL_FUNC_ERROR_STATUS 0x23e0
/* MSI channel registers */
#define XDMA_MSI_CHANNEL_CFG_INTR 0x2420
#define XDMA_MSI_CHANNEL_CFG_INTR_MASK OSI_BIT(0)
#define XDMA_MSI_CHANNEL_CFG_INTR_DESTINATION OSI_BIT(1)
#define XDMA_MSI_CHANNEL_CFG_INTR_ID 0x2440
#define XDMA_MSI_CHANNEL_CFG_INTR_MOD 0x2460
#define XDMA_MSI_CHANNEL_CFG_INTR_MOD_SCALE OSI_GENMASK(12, 10)
#define XDMA_MSI_CHANNEL_CFG_INTR_ID_VALUE OSI_GENMASK(9, 0)
#define XDMA_MSI_CHANNEL_PRIMARY_INTR_STATUS 0x2480
#define XDMA_MSI_CHANNEL_PRIMARY_INTR_STATUS_INTR_START_PROCESSING OSI_BIT(0)
#define XDMA_MSI_CHANNEL_PRIMARY_INTR_STATUS_INTR_END_PROCESSING OSI_BIT(1)
#define XDMA_MSI_CHANNEL_PRIMARY_INTR_STATUS_FUNC_ERR_VALID OSI_GENMASK(15, 8)
#define XDMA_MSI_CHANNEL_PRIMARY_INTR_STATUS_NEW_XFER_VALID OSI_GENMASK(23, 16)
#define XDMA_CHANNEL_DEBUG_REGISTER_4 0x2580
#define XDMA_CHANNEL_DEBUG_REGISTER_4_INTR_ENGINE_MSI_CHAN_ISR_INPROG_FSM GENMASK(3, 2)
#define XDMA_CHANNEL_DEBUG_REGISTER_4_INTR_ENGINE_MSI_CHAN_MSI_DISP_FSM GENMASK(5, 4)
#define XDMA_CHANNEL_DEBUG_REGISTER_4_INTR_ENGINE_MSI_CHAN_INTR_MOD_FSM BIT(6)
#define XDMA_CHANNEL_DEBUG_REGISTER_4_INTR_ENGINE_MSI_CHAN_MSI_DISP_SHADOW_GEN_STATUS_MSI BIT(9)
#define XDMA_CHANNEL_DEBUG_REGISTER_4_INTR_ENGINE_MSI_CHAN_MSI_DISP_SHADOW_FUNC_ERR_DETECTED BIT(8)
struct xdma_attr {
uint32_t wm:1;
};
struct xdma_hw_desc {
volatile union {
struct xdma_attr ctrl_e;
uint32_t attr;
} attr_reg;
uint32_t sar_low;
uint32_t sar_high;
uint32_t dar_low;
uint32_t dar_high;
uint32_t size;
uint32_t resv1;
uint32_t resv2;
};
static inline unsigned int xdma_common_rd(void __iomem *p, unsigned int offset)
{
return readl(p + offset);
}
static inline void xdma_common_wr(void __iomem *p, unsigned int val, unsigned int offset)
{
writel(val, p + offset);
}
static inline void xdma_channel_wr(void __iomem *p, unsigned char c, unsigned int val, u32 offset)
{
writel(val, (0x4 * c) + p + offset);
}
static inline unsigned int xdma_channel_rd(void __iomem *p, unsigned char c, u32 offset)
{
return readl((0x4 * c) + p + offset);
}
void *tegra264_pcie_xdma_initialize(struct tegra_pcie_dma_init_info *info);
tegra_pcie_dma_status_t tegra264_pcie_xdma_set_msi(void *cookie, u64 msi_addr, u32 msi_data);
tegra_pcie_dma_status_t tegra264_pcie_xdma_submit_xfer(void *cookie,
struct tegra_pcie_dma_xfer_info *tx_info);
bool tegra264_pcie_xdma_stop(void *cookie);
void tegra264_pcie_xdma_deinit(void *cookie);
#endif // TEGRA264_PCIE_XDMA_OSI_H