Files
linux-nv-oot/drivers/misc/nvscic2c-pcie/module.h
Janardhan Reddy cfaad9cd6d nvscic2c-pcie: Add Buffer limts per endpoint
Address security ARR: DOS60-REQ-7169 in streaming mode.
Add per endpoint streaming mode buffer limits.

Bug 4883175
JIRA NVIPC-2453

Change-Id: I31edb2bacf4a8af560e7e6da7d378da874d105bd
Signed-off-by: Janardhan Reddy <jreddya@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3196300
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
2025-07-24 10:19:07 +00:00

172 lines
4.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* SPDX-FileCopyrightText: Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES.
* All rights reserved.
*/
/*
* Internal to nvscic2c-pcie module. This file is not supposed to be included
* by any other external modules.
*/
#ifndef __MODULE_H__
#define __MODULE_H__
#include <linux/completion.h>
#include <linux/device.h>
#include <linux/types.h>
#include <linux/pci-epc.h>
#include <linux/pci-epf.h>
#include "common.h"
/* forward declaration.*/
struct device_node;
struct platform_device;
#define NUM_EDMA_DESC (4096)
/*
* Parameters for the nvscic2c-pcie module and it's endpoints.
*
* These are read-only for the rest of the nvscic2c-pcie module.
*/
struct driver_param_t {
/* This is (nvscic2c-pcie) device tree node as found in device tree.*/
struct device_node *of_node;
/* driver mode as parsed from compatible string in device-tree.*/
enum drv_mode_t drv_mode;
/* nvscic2c-pcie device tree node.*/
struct platform_device *pdev;
/* host1x device node and pdev via phandle.*/
struct device_node *host1x_np;
struct platform_device *host1x_pdev;
/* device node of pcie controller via phandle.*/
struct device_node *edma_np;
/* pci endpoint device id.*/
u32 pci_dev_id;
/* bar window size. - applicable only for epf.*/
u32 bar_win_size;
/* node information, Board+SoC Id.*/
struct node_info_t local_node;
struct node_info_t peer_node;
/*
* Properties that each endpoint shall be configured with.
* These properties are populated from device tree node.
*/
u8 nr_endpoint;
struct endpoint_prop_t {
/* Endpoint ID as populated from device tree node. */
u8 id;
/*
* Human readable name of the endpoint - char dev node shall be
* instanced using this name.
*/
char name[NAME_MAX];
/* Frames and per frame size.*/
u8 nframes;
u32 frame_sz;
/* Streaming mode per endpoint PCIe aperture mapping limit */
uint64_t aperture_limit;
} endpoint_props[MAX_ENDPOINTS];
};
/* nvscic2c-pcie epf specific context. */
struct epf_context_t {
bool notifier_registered;
struct pci_epf_header header;
struct pci_epf *epf;
void *drv_ctx;
struct work_struct initialization_work;
struct work_struct deinitialization_work;
atomic_t core_initialized;
atomic_t epf_initialized;
atomic_t shutdown_msg_received;
wait_queue_head_t core_initialized_waitq;
};
/* nvscic2c-pcie epc specific context. */
struct epc_context_t {
struct completion epf_ready_cmpl;
struct completion epf_shutdown_cmpl;
atomic_t aer_received;
};
/*
* nvscic2c-pcie module context.
* Contains all the information for all
* - Configuration parameters per device-tree.
*/
struct driver_ctx_t {
/* driver mode as parsed from compatible string in device-tree.*/
enum drv_mode_t drv_mode;
u8 chip_id;
char *drv_name;
struct device *dev;
/* the configuration for module and it's endpoints.*/
struct driver_param_t drv_param;
/*
* Visible region to peer SoC for PCIe writes. In nvscic2c-pcie
* use-cases, it is backed by physical memory allocated for
* comm-channel, endpoints and stream-objs(mem and sync), etc.
*
* Peer's write lands here to be read by local/self.
*/
struct dma_buff_t self_mem;
/*
* Point to peer's visible region for data-writes. This is a PCIe
* aperture which allows local/self to write into peer's memory.
*/
struct pci_aper_t peer_mem;
/* pci-client abstraction handle.*/
void *pci_client_h;
/* comm-channel abstraction. */
void *comm_channel_h;
/* vmap abstraction, this can be moved within endpoints.*/
void *vmap_h;
/* tegra-pcie-edma module handle.*/
void *edma_h;
/* endpoint absraction handle.*/
void *endpoints_h;
/* DRV_MODE specific.*/
struct epf_context_t *epf_ctx;
struct epc_context_t *epc_ctx;
/* peer cpu */
enum peer_cpu_t peer_cpu;
/* IOVA alloc abstraction.*/
struct iova_alloc_domain_t *ivd_h;
};
/*
* Look-up device tree node for the compatible string. Check for the
* pci-dev-id within the compatible node, if more than one such node found also
* return error.
*/
int
dt_parse(u32 pci_dev_id, enum drv_mode_t drv_mode,
struct driver_param_t *drv_param);
/* Release any memory allocated during dt_parse().*/
int
dt_release(struct driver_param_t *drv_param);
#endif //__MODULE_H__