Files
linux-nv-oot/drivers/misc/nvscic2c-pcie/pci-client.h
Deepak Badgaiyan d1f2b6a051 nvscic2c: Add Thor support
Configure BAR and MSI for Thor.

Add checks for chip id for chip specific code
between Orin and Thor.

Separate Stream ID's are assigned to upstream and downstream
struct device in Rootport client driver.
While accessing Rootport local memory upstream Stream ID should be used.
While accessing memories over BAR downstream Stream ID should be used.

Jira NVIPC-2877
Jira NVIPC-2484

Change-Id: I67df4b78e57b6de36f9bfaf966978f7ee875d596
Signed-off-by: Deepak Badgaiyan <dbadgaiyan@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3226748
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: Vipin Kumar <vipink@nvidia.com>
Reviewed-by: Janardhan Reddy AnnapuReddy <jreddya@nvidia.com>
Reviewed-by: Sivagamy Govindasamy <sivagamyg@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
2025-07-24 10:19:11 +00:00

154 lines
4.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* SPDX-FileCopyrightText: Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES.
* All rights reserved.
*/
#ifndef __PCI_CLIENT_H__
#define __PCI_CLIENT_H__
#include <nvidia/conftest.h>
#include <uapi/misc/nvscic2c-pcie-ioctl.h>
#include "common.h"
#include "module.h"
/* forward declaration.*/
struct vm_area_struct;
struct dma_buf;
struct dma_buf_attachment;
/*
* PCI client initialization parameters. The fields must remain persistent
* till deinitialization (exit).
*/
struct pci_client_params {
struct dma_buff_t *self_mem;
struct pci_aper_t *peer_mem;
/*
* @DRV_MODE_EPC: &pci_dev->dev
* @DRV_MODE_EPF: epf->epc->dev.parent.
*/
struct device *dev;
/*
* For RootPort separate stream ID's are configured for
* upstream and downstream access.
* Hence while using dma_buf API's use device attached with
* upstream in RootPort.
*/
struct device *cdev;
};
/* Initialize PCI client either for @DRV_MODE_EPF or @DRV_MODE_EPC. */
int
pci_client_init(struct pci_client_params *params, void **pci_client_h);
/* Teardown of PCI client. */
void
pci_client_deinit(void **pci_client_h);
/* reserve iova using the iova-manager.*/
int
pci_client_alloc_iova(void *pci_client_h, size_t size, u64 *address,
size_t *offset, void **block_h);
/* free the reserved iova.*/
int
pci_client_free_iova(void *pci_client_h, void **block_h);
int
pci_client_map_addr(void *pci_client_h, u64 to_iova, phys_addr_t paddr,
size_t size, int prot);
size_t
pci_client_unmap_addr(void *pci_client_h, u64 from_iova, size_t size);
/* get the pci aperture for a given offset.*/
int
pci_client_get_peer_aper(void *pci_client_h, size_t offsetof, size_t size,
phys_addr_t *phys_addr);
/* attach dma-buf to pci device.*/
struct dma_buf_attachment *
pci_client_dmabuf_attach(void *pci_client_h, struct dma_buf *dmabuff);
/* detach dma-buf to pci device.*/
void
pci_client_dmabuf_detach(void *pci_client_h, struct dma_buf *dmabuff,
struct dma_buf_attachment *attach);
/*
* Users/Units can register for PCI link events as received by
* @DRV_MODE_EPF or @DRV_MODE_EPC module sbstraction.
*/
int
pci_client_register_for_link_event(void *pci_client_h,
struct callback_ops *ops, u32 id);
/* Unregister for PCI link events. - teardown only. */
int
pci_client_unregister_for_link_event(void *pci_client_h, u32 id);
/*
* Update the PCI link status as received in @DRV_MODE_EPF or @DRV_MODE_EPC
* module abstraction. Propagate the link status to registered users.
*/
int
pci_client_change_link_status(void *pci_client_h,
enum nvscic2c_pcie_link status);
/* Update PCIe error offset with error. */
int
pci_client_set_link_aer_error(void *pci_client_h, u32 err);
/* Helper function to mmap the PCI link status memory to user-space.*/
int
pci_client_mmap_link_mem(void *pci_client_h, struct vm_area_struct *vma);
/* Helper function to mmap eDMA error memory to user-space.*/
int
pci_client_mmap_edma_err_mem(void *pci_client_h,
u32 ep_id, struct vm_area_struct *vma);
/* Update eDMA xfer error code.*/
int
pci_client_set_edma_error(void *pci_client_h, u32 ep_id, u32 err);
/* Query PCI link status. */
enum nvscic2c_pcie_link
pci_client_query_link_status(void *pci_client_h);
/*
* Helper functions to set and set driver context from pci_client_h
*/
/* Save driver context of DRV_MODE_EPF or DRV_MODE_EPC */
int
pci_client_save_driver_ctx(void *pci_client_h, struct driver_ctx_t *drv_ctx);
/* Getter driver context of DRV_MODE_EPF or DRV_MODE_EPC */
struct driver_ctx_t *
pci_client_get_driver_ctx(void *pci_client_h);
/*getter drv mode */
enum drv_mode_t
pci_client_get_drv_mode(void *pci_client_h);
/* save peer cpu sent by boottrap msg */
int
pci_client_save_peer_cpu(void *pci_client_h, enum peer_cpu_t peer_cpu);
/* Getter the soc/arch of rp */
enum peer_cpu_t
pci_client_get_peer_cpu(void *pci_client_h);
/* Get allocated edma rx desc iova */
dma_addr_t
pci_client_get_edma_rx_desc_iova(void *pci_client_h);
/* pci client raise irq to rp */
int
#if defined(PCI_EPC_IRQ_TYPE_ENUM_PRESENT) /* Dropped from Linux 6.8 */
pci_client_raise_irq(void *pci_client_h, enum pci_epc_irq_type type, u16 num);
#else
pci_client_raise_irq(void *pci_client_h, int type, u16 num);
#endif
#endif // __PCI_CLIENT_H__