tegrakernel/kernel/nvidia/drivers/platform/tegra/tegra_l1ss.h

195 lines
5.2 KiB
C

/*
* Copyright (c) 2021, NVIDIA CORPORATION, All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef _LINUX_TEGRA_SAFETY_TEGRA_L1SS_H
#define _LINUX_TEGRA_SAFETY_TEGRA_L1SS_H
#include <linux/cdev.h>
#include <linux/tegra-safety-ivc.h>
#include <linux/tegra_l1ss_ioctl.h>
#include <linux/tegra_nv_guard_group_id.h>
#include <linux/tegra_nv_guard_service_id.h>
#include <linux/platform/tegra/l1ss_datatypes.h>
#include "tegra_l1ss_cmd_resp_exec_config.h"
#define PDEBUG(fmt, args...) printk(KERN_DEBUG "L1SS : " fmt, ## args)
#define TEGRA_SAFETY_L1SS_MAJOR_VERSION 4
#define TEGRA_SAFETY_L1SS_MINOR_VERSION 0
#define TEGRA_SAFETY_L1SS_PATCH_VERSION 0
struct l1ss_req_node {
struct l1ss_req_node *next;
nv_guard_request_t *req;
};
typedef int (*cmd_resp_ex_callout)(const cmdresp_frame_ex_t *cmd_resp,
struct l1ss_data *ldata);
typedef struct {
/* CmdID corresponding to CallOut Function */
uint8_t cmd;
/* Cmd Callout Function Pointer */
cmd_resp_ex_callout cmd_call_back;
/* Response Callout Function Pointer */
cmd_resp_ex_callout resp_call_back;
/* Timeout for Response Monitoring */
uint32_t timeout;
} cmd_resp_look_up_ex;
struct l1ss_data {
struct workqueue_struct *wq;
struct work_struct work;
spinlock_t slock;
struct l1ss_req_node *head;
struct cdev cdev;
int dev_major;
struct class *l1ss_class;
dev_t dev;
struct tegra_safety_ivc *safety_ivc;
struct {
wait_queue_head_t notify_waitq;
atomic_t notify_registered;
} cmd;
cmd_resp_look_up_ex (*cmd_resp_lookup_table)
[CMDRESPL1_MAX_CMD_IN_CLASS];
};
int l1ss_init(struct tegra_safety_ivc *safety_ivc);
int l1ss_exit(struct tegra_safety_ivc *safety_ivc);
int tegra_safety_handle_cmd(cmdresp_frame_ex_t *cmd_resp,
struct l1ss_data *ldata);
void
cmd_resp_update_header(
cmdresp_header_t *pHeader,
uint8_t Class,
uint8_t Cmd,
uint32_t DestId,
bool IsResp);
/*
* Helper functions to update/fetch data from CmdResp Header
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_get_dest_class_id".
*
* Reason:
* False Positive
*/
inline void l_get_dest_class_id(const cmdresp_header_t *pHeader, uint8_t *ClassId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_dest_class_id".
*
* Reason:
* False Positive
*/
inline void l_set_dest_class_id(cmdresp_header_t *const pHeader, uint8_t ClassId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_get_cmd_id".
*
* Reason:
* False Positive
*/
inline void l_get_cmd_id(const cmdresp_header_t *pHeader, uint8_t *CmdId);
/* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_cmd_id".
*
* Reason:
* False Positive
*/
inline void l_set_cmd_id(cmdresp_header_t *const pHeader, uint8_t CmdId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_get_dest_id".
*
* Reason:
* False Positive
*/
inline void l_get_dest_id(const cmdresp_header_t *pHeader, uint8_t *CmdDestId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_dest_id".
*
* Reason:
* False Positive
*/
inline void l_set_dest_id(cmdresp_header_t *const pHeader, uint8_t DestId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_get_src_id".
*
* Reason:
* False Positive
*/
inline void l_get_src_id(const cmdresp_header_t *pHeader, uint8_t *CmdSrcId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_src_id".
*
* Reason:
* False Positive
*/
inline void l_set_src_id(cmdresp_header_t *const pHeader, uint8_t CmdSrcId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_is_resp_flag_set".
*
* Reason:
* False Positive
*/
inline bool l_is_resp_flag_set(const cmdresp_header_t Header);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_resp_flag".
*
* Reason:
* False Positive
*/
inline void l_set_resp_flag(cmdresp_header_t *const pHeader);
/* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_cmd_msg_id".
*
* Reason:
* False Positive
*/
inline void l_set_cmd_msg_id(cmdresp_header_t *const pHeader, uint16_t CmdMsgId);
/*
* Deviated MISRA Rule 5.9 (Advisory)
* Declaring an internal linkage function with identifier "l_set_src_class_id".
*
* Reason:
* False Positive
*/
inline void l_set_src_class_id(cmdresp_header_t *const pHeader, uint8_t ClassId);
nv_guard_3lss_layer_t cmd_resp_get_current_layer_id(void);
void l1ss_get_class_cmd_resp_from_header(cmdresp_header_t *cmdresp_h,
uint8_t *class, uint8_t *cmd, bool *is_resp);
#endif