mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 17:25:35 +03:00
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>
172 lines
4.2 KiB
C
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__
|