pci: Port pci-epf-tegra-vnet to support 5.14.0

Most of the code in the file pci-epf-tegra-vnet.c is written
to support the linux kernel version 5.14.x (x != 0), all minor
version above 0.
Make the condition of linux version check such that 5.14.0 is
also part of 5.14.x i.e. (5.14).

Jira HOSTX-5375

Change-Id: Ib3d7ca619497761b8bc77796c9fe0f59c2ab9cf8
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3166767
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3172802
Reviewed-by: Jason Mei <jianjunm@nvidia.com>
Tested-by: Jason Mei <jianjunm@nvidia.com>
This commit is contained in:
Laxman Dewangan
2024-07-02 11:50:13 +00:00
committed by mobile promotions
parent 408ef72fb9
commit 87c78ad125

View File

@@ -15,7 +15,7 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/tegra_vnet.h> #include <linux/tegra_vnet.h>
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
#include <linux/dma-fence.h> #include <linux/dma-fence.h>
#include <linux/host1x-next.h> #include <linux/host1x-next.h>
#include <linux/iommu.h> #include <linux/iommu.h>
@@ -52,7 +52,7 @@ struct bar0_amap {
dma_addr_t phy; dma_addr_t phy;
}; };
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
/* syncpoint handling. */ /* syncpoint handling. */
struct syncpt_t { struct syncpt_t {
u32 id; u32 id;
@@ -88,7 +88,7 @@ struct syncpt_t {
#endif #endif
struct irqsp_data { struct irqsp_data {
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
/* Notification. */ /* Notification. */
struct syncpt_t syncpt; struct syncpt_t syncpt;
#else #else
@@ -140,7 +140,7 @@ struct pci_epf_tvnet {
struct tvnet_counter h2ep_full; struct tvnet_counter h2ep_full;
struct tvnet_counter ep2h_empty; struct tvnet_counter ep2h_empty;
struct tvnet_counter ep2h_full; struct tvnet_counter ep2h_full;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
/* DRV_MODE specific.*/ /* DRV_MODE specific.*/
struct pci_epc *epc; struct pci_epc *epc;
struct platform_device *host1x_pdev; struct platform_device *host1x_pdev;
@@ -966,7 +966,7 @@ static void tvnet_ep_setup_dma(struct pci_epf_tvnet *tvnet)
} }
#endif #endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
/* Returns aperture offset of syncpoint on SHIM_BASE. */ /* Returns aperture offset of syncpoint on SHIM_BASE. */
static inline u64 get_syncpt_shim_offset(u32 id) static inline u64 get_syncpt_shim_offset(u32 id)
{ {
@@ -1048,7 +1048,7 @@ fence_do_work(struct syncpt_t *syncpt)
static void tvnet_ep_ctrl_irqsp_work(struct work_struct *work) static void tvnet_ep_ctrl_irqsp_work(struct work_struct *work)
{ {
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
struct syncpt_t *syncpt = struct syncpt_t *syncpt =
container_of(work, struct syncpt_t, work); container_of(work, struct syncpt_t, work);
@@ -1080,14 +1080,14 @@ static void tvnet_ep_ctrl_irqsp_callback(void *private_data)
if (!tvnet_ivc_full(&tvnet->h2ep_empty) && if (!tvnet_ivc_full(&tvnet->h2ep_empty) &&
(tvnet->os_link_state == OS_LINK_STATE_UP)) (tvnet->os_link_state == OS_LINK_STATE_UP))
tvnet_ep_alloc_empty_buffers(tvnet); tvnet_ep_alloc_empty_buffers(tvnet);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0))
schedule_work(&data_irqsp->reprime_work); schedule_work(&data_irqsp->reprime_work);
#endif #endif
} }
static void tvnet_ep_data_irqsp_work(struct work_struct *work) static void tvnet_ep_data_irqsp_work(struct work_struct *work)
{ {
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
struct syncpt_t *syncpt = struct syncpt_t *syncpt =
container_of(work, struct syncpt_t, work); container_of(work, struct syncpt_t, work);
@@ -1107,7 +1107,7 @@ static void tvnet_ep_data_irqsp_callback(void *private_data)
if (tvnet_ivc_rd_available(&tvnet->h2ep_full)) if (tvnet_ivc_rd_available(&tvnet->h2ep_full))
napi_schedule(&tvnet->napi); napi_schedule(&tvnet->napi);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0))
else else
schedule_work(&data_irqsp->reprime_work); schedule_work(&data_irqsp->reprime_work);
#endif #endif
@@ -1117,7 +1117,7 @@ static int tvnet_ep_poll(struct napi_struct *napi, int budget)
{ {
struct pci_epf_tvnet *tvnet = container_of(napi, struct pci_epf_tvnet, struct pci_epf_tvnet *tvnet = container_of(napi, struct pci_epf_tvnet,
napi); napi);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0))
struct irqsp_data *data_irqsp = tvnet->data_irqsp; struct irqsp_data *data_irqsp = tvnet->data_irqsp;
#endif #endif
int work_done; int work_done;
@@ -1125,7 +1125,7 @@ static int tvnet_ep_poll(struct napi_struct *napi, int budget)
work_done = tvnet_ep_process_h2ep_msg(tvnet); work_done = tvnet_ep_process_h2ep_msg(tvnet);
if (work_done < budget) { if (work_done < budget) {
napi_complete(napi); napi_complete(napi);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0))
schedule_work(&data_irqsp->reprime_work); schedule_work(&data_irqsp->reprime_work);
#endif #endif
} }
@@ -1145,7 +1145,7 @@ static int tvnet_ep_pci_epf_setup_irqsp(struct pci_epf_tvnet *tvnet)
struct irq_md *irq; struct irq_md *irq;
phys_addr_t syncpt_addr; phys_addr_t syncpt_addr;
int ret; int ret;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
struct host1x *host1x = NULL; struct host1x *host1x = NULL;
struct syncpt_t *syncpt = NULL; struct syncpt_t *syncpt = NULL;
@@ -1161,7 +1161,7 @@ static int tvnet_ep_pci_epf_setup_irqsp(struct pci_epf_tvnet *tvnet)
goto fail; goto fail;
} }
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
syncpt = &ctrl_irqsp->syncpt; syncpt = &ctrl_irqsp->syncpt;
syncpt->sp = host1x_syncpt_alloc(host1x, HOST1X_SYNCPT_CLIENT_MANAGED, syncpt->sp = host1x_syncpt_alloc(host1x, HOST1X_SYNCPT_CLIENT_MANAGED,
"pcie-ep-vnet-ctrl"); "pcie-ep-vnet-ctrl");
@@ -1211,7 +1211,7 @@ static int tvnet_ep_pci_epf_setup_irqsp(struct pci_epf_tvnet *tvnet)
goto free_ctrl_sp; goto free_ctrl_sp;
} }
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
syncpt = &data_irqsp->syncpt; syncpt = &data_irqsp->syncpt;
syncpt->sp = host1x_syncpt_alloc(host1x, HOST1X_SYNCPT_CLIENT_MANAGED, syncpt->sp = host1x_syncpt_alloc(host1x, HOST1X_SYNCPT_CLIENT_MANAGED,
"pcie-ep-vnet-data"); "pcie-ep-vnet-data");
@@ -1277,7 +1277,7 @@ static int tvnet_ep_pci_epf_setup_irqsp(struct pci_epf_tvnet *tvnet)
irq->irq_addr = PAGE_SIZE; irq->irq_addr = PAGE_SIZE;
irq->irq_type = IRQ_SIMPLE; irq->irq_type = IRQ_SIMPLE;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
syncpt_addr = get_syncpt_shim_offset(data_irqsp->syncpt.id); syncpt_addr = get_syncpt_shim_offset(data_irqsp->syncpt.id);
data_irqsp->syncpt.phy_addr = syncpt_addr; data_irqsp->syncpt.phy_addr = syncpt_addr;
data_irqsp->syncpt.size = PAGE_SIZE; data_irqsp->syncpt.size = PAGE_SIZE;
@@ -1305,7 +1305,7 @@ static int tvnet_ep_pci_epf_setup_irqsp(struct pci_epf_tvnet *tvnet)
free_ctrl_ivoa: free_ctrl_ivoa:
iommu_unmap(domain, amap->iova, PAGE_SIZE); iommu_unmap(domain, amap->iova, PAGE_SIZE);
free_data_sp: free_data_sp:
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
host1x_syncpt_put(data_irqsp->syncpt.sp); host1x_syncpt_put(data_irqsp->syncpt.sp);
free_ctrl_sp: free_ctrl_sp:
host1x_syncpt_put(ctrl_irqsp->syncpt.sp); host1x_syncpt_put(ctrl_irqsp->syncpt.sp);
@@ -1328,7 +1328,7 @@ static void tvnet_ep_pci_epf_destroy_irqsp(struct pci_epf_tvnet *tvnet)
iommu_unmap(domain, tvnet->bar0_amap[SIMPLE_IRQ].iova + PAGE_SIZE, iommu_unmap(domain, tvnet->bar0_amap[SIMPLE_IRQ].iova + PAGE_SIZE,
PAGE_SIZE); PAGE_SIZE);
iommu_unmap(domain, tvnet->bar0_amap[SIMPLE_IRQ].iova, PAGE_SIZE); iommu_unmap(domain, tvnet->bar0_amap[SIMPLE_IRQ].iova, PAGE_SIZE);
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
host1x_syncpt_put(tvnet->data_irqsp->syncpt.sp); host1x_syncpt_put(tvnet->data_irqsp->syncpt.sp);
host1x_syncpt_put(tvnet->ctrl_irqsp->syncpt.sp); host1x_syncpt_put(tvnet->ctrl_irqsp->syncpt.sp);
#else #else
@@ -1479,7 +1479,7 @@ static void tvnet_ep_free_multi_page_bar0_mem(struct pci_epf *epf,
vfree(amap->virt); vfree(amap->virt);
} }
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
static int tvnet_get_host1x_dev(struct pci_epf *epf) static int tvnet_get_host1x_dev(struct pci_epf *epf)
{ {
struct pci_epc *epc = epf->epc; struct pci_epc *epc = epf->epc;
@@ -1519,7 +1519,7 @@ static int tvnet_ep_pci_epf_core_init(struct pci_epf *epf)
struct pci_epf_bar *epf_bar = &epf->bar[BAR_0]; struct pci_epf_bar *epf_bar = &epf->bar[BAR_0];
int ret; int ret;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
if (atomic_read(&tvnet->core_initialized)) { if (atomic_read(&tvnet->core_initialized)) {
pr_err("Received CORE_INIT callback again\n"); pr_err("Received CORE_INIT callback again\n");
return -EINVAL; return -EINVAL;
@@ -1551,7 +1551,7 @@ static int tvnet_ep_pci_epf_core_init(struct pci_epf *epf)
return ret; return ret;
} }
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
atomic_set(&tvnet->core_initialized, 1); atomic_set(&tvnet->core_initialized, 1);
#endif #endif
@@ -1560,7 +1560,7 @@ static int tvnet_ep_pci_epf_core_init(struct pci_epf *epf)
#endif #endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 15, 0) && \ #if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 15, 0) && \
LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0))
static int tvnet_ep_pci_epf_notifier(struct notifier_block *nb, static int tvnet_ep_pci_epf_notifier(struct notifier_block *nb,
unsigned long val, void *data) unsigned long val, void *data)
{ {
@@ -1599,7 +1599,7 @@ static int tvnet_ep_pci_epf_notifier(struct notifier_block *nb,
return NOTIFY_OK; return NOTIFY_OK;
} }
#else #else
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
static int tvnet_ep_pci_epf_linkup(struct pci_epf *epf) static int tvnet_ep_pci_epf_linkup(struct pci_epf *epf)
#else #else
static void tvnet_ep_pci_epf_linkup(struct pci_epf *epf) static void tvnet_ep_pci_epf_linkup(struct pci_epf *epf)
@@ -1619,7 +1619,7 @@ static void tvnet_ep_pci_epf_linkup(struct pci_epf *epf)
tvnet_ivc_get_rd_cnt(&tvnet->ep2h_full)); tvnet_ivc_get_rd_cnt(&tvnet->ep2h_full));
tvnet->pcie_link_status = true; tvnet->pcie_link_status = true;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
val = readl(tvnet->appl_base + APPL_INTR_EN_L1_8_0); val = readl(tvnet->appl_base + APPL_INTR_EN_L1_8_0);
if (val & APPL_INTR_EN_L1_8_EDMA_INT_EN) if (val & APPL_INTR_EN_L1_8_EDMA_INT_EN)
writel(val & ~APPL_INTR_EN_L1_8_EDMA_INT_EN, writel(val & ~APPL_INTR_EN_L1_8_EDMA_INT_EN,
@@ -1630,7 +1630,7 @@ static void tvnet_ep_pci_epf_linkup(struct pci_epf *epf)
} }
#endif #endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
#if defined(NV_PCI_EPC_EVENT_OPS_STRUCT_HAS_CORE_DEINIT) #if defined(NV_PCI_EPC_EVENT_OPS_STRUCT_HAS_CORE_DEINIT)
static int tvnet_ep_pci_epf_core_deinit(struct pci_epf *epf) static int tvnet_ep_pci_epf_core_deinit(struct pci_epf *epf)
{ {
@@ -1696,7 +1696,7 @@ static int tvnet_ep_pci_epf_bind(struct pci_epf *epf)
struct bar0_amap *amap; struct bar0_amap *amap;
struct tvnet_dma_desc *dma_desc; struct tvnet_dma_desc *dma_desc;
int ret, size, bitmap_size; int ret, size, bitmap_size;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
unsigned long shift; unsigned long shift;
#endif #endif
if (!domain) { if (!domain) {
@@ -1740,7 +1740,7 @@ static int tvnet_ep_pci_epf_bind(struct pci_epf *epf)
if (IS_ERR(tvnet->appl_base)) if (IS_ERR(tvnet->appl_base))
goto fail; goto fail;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
tvnet->iovad = (struct iova_domain *)&domain->iova_cookie->iovad; tvnet->iovad = (struct iova_domain *)&domain->iova_cookie->iovad;
shift = iova_shift(tvnet->iovad); shift = iova_shift(tvnet->iovad);
@@ -2010,7 +2010,7 @@ static int tvnet_ep_pci_epf_bind(struct pci_epf *epf)
0xffffffff); 0xffffffff);
dma_desc[DMA_DESC_COUNT].ctrl_reg.ctrl_e.llp = 1; dma_desc[DMA_DESC_COUNT].ctrl_reg.ctrl_e.llp = 1;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0))
nvhost_interrupt_syncpt_prime(tvnet->ctrl_irqsp->is); nvhost_interrupt_syncpt_prime(tvnet->ctrl_irqsp->is);
nvhost_interrupt_syncpt_prime(tvnet->data_irqsp->is); nvhost_interrupt_syncpt_prime(tvnet->data_irqsp->is);
@@ -2045,7 +2045,7 @@ free_irqsp:
free_bar0_md: free_bar0_md:
tvnet_ep_free_single_page_bar0_mem(epf, META_DATA); tvnet_ep_free_single_page_bar0_mem(epf, META_DATA);
free_iova: free_iova:
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
__free_iova(tvnet->iovad, tvnet->iova); __free_iova(tvnet->iovad, tvnet->iova);
#else #else
iommu_dma_free_iova(cdev, tvnet->bar0_iova, BAR0_SIZE); iommu_dma_free_iova(cdev, tvnet->bar0_iova, BAR0_SIZE);
@@ -2054,7 +2054,7 @@ fail:
return ret; return ret;
} }
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
static void free_fence_resource(struct syncpt_t *syncpt) static void free_fence_resource(struct syncpt_t *syncpt)
{ {
int ret = 0; int ret = 0;
@@ -2087,7 +2087,7 @@ static void tvnet_ep_pci_epf_unbind(struct pci_epf *epf)
#endif #endif
struct pci_epc *epc = epf->epc; struct pci_epc *epc = epf->epc;
struct device *cdev = epc->dev.parent; struct device *cdev = epc->dev.parent;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
struct syncpt_t *syncpt = NULL; struct syncpt_t *syncpt = NULL;
syncpt = &tvnet->ctrl_irqsp->syncpt; syncpt = &tvnet->ctrl_irqsp->syncpt;
@@ -2117,7 +2117,7 @@ static void tvnet_ep_pci_epf_unbind(struct pci_epf *epf)
tvnet_ep_free_multi_page_bar0_mem(epf, EP_MEM); tvnet_ep_free_multi_page_bar0_mem(epf, EP_MEM);
tvnet_ep_pci_epf_destroy_irqsp(tvnet); tvnet_ep_pci_epf_destroy_irqsp(tvnet);
tvnet_ep_free_single_page_bar0_mem(epf, META_DATA); tvnet_ep_free_single_page_bar0_mem(epf, META_DATA);
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
__free_iova(tvnet->iovad, tvnet->iova); __free_iova(tvnet->iovad, tvnet->iova);
tvnet->bar0_iova = 0x0; tvnet->bar0_iova = 0x0;
#else #else
@@ -2125,7 +2125,7 @@ static void tvnet_ep_pci_epf_unbind(struct pci_epf *epf)
#endif #endif
} }
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
static const struct pci_epf_device_id tvnet_ep_epf_tvnet_ids[] = { static const struct pci_epf_device_id tvnet_ep_epf_tvnet_ids[] = {
{ .name = "pci_epf_tvnet", }, { .name = "pci_epf_tvnet", },
{ }, { },
@@ -2149,7 +2149,7 @@ static int tvnet_ep_epf_tvnet_probe(struct pci_epf *epf)
tvnet->fdev = fdev; tvnet->fdev = fdev;
tvnet->epf = epf; tvnet->epf = epf;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 14, 0)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0))
epf->event_ops = &tvnet_event_ops; epf->event_ops = &tvnet_event_ops;
#endif #endif
tvnet->header.vendorid = PCI_VENDOR_ID_NVIDIA; tvnet->header.vendorid = PCI_VENDOR_ID_NVIDIA;