Files
Advaya Andhare 883ddf60ca NVVSE: protect shared resources through mutex
Concurrent access of shared variable causing the issue intermittently.
Conditions to wait/handle shared variable updated.
Added mutex locks to protect shared resources.

bug 4155882
Bug 4159212
jira ESSS-707

Change-Id: I3b50e39abf2dfec2ef33b813c7227fcd0634222a
Signed-off-by: Advaya Andhare <aandhare@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2928908
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: Manish Bhardwaj <mbhardwaj@nvidia.com>
Reviewed-by: Leo Chiu <lchiu@nvidia.com>
Reviewed-by: Vipin Kumar <vipink@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
2023-07-12 04:42:12 -07:00

171 lines
4.6 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
*/
#ifndef __TEGRA_HV_VSE_H
#define __TEGRA_HV_VSE_H
#define KEYSLOT_SIZE_BYTES 16
#define KEYSLOT_OFFSET_BYTES 8
struct tegra_vse_soc_info {
bool cmac_hw_padding_supported;
bool gcm_decrypt_supported;
};
/* GCM Operation Supported Flag */
enum tegra_gcm_dec_supported {
GCM_DEC_OP_NOT_SUPPORTED,
GCM_DEC_OP_SUPPORTED,
};
enum ivc_irq_state {
NO_INTERRUPT = 0U,
FIRST_REQ_INTERRUPT = 1U,
INTERMEDIATE_REQ_INTERRUPT = 2u,
};
struct crypto_dev_to_ivc_map {
uint32_t ivc_id;
uint32_t se_engine;
uint32_t node_id;
uint32_t priority;
uint32_t max_buffer_size;
uint32_t channel_grp_id;
enum tegra_gcm_dec_supported gcm_dec_supported;
uint32_t gcm_dec_buffer_size;
struct tegra_hv_ivc_cookie *ivck;
struct completion tegra_vse_complete;
struct task_struct *tegra_vse_task;
bool vse_thread_start;
struct mutex se_ivc_lock;
/*Wait for interrupt
* 0: No need to wait for interrupt
* 1: First request, wait for interrupt
* 2: awaiting actual message, wait for interrupt
*/
enum ivc_irq_state wait_interrupt;
struct mutex irq_state_lock;
};
struct tegra_virtual_se_dev {
struct device *dev;
/* Engine id */
unsigned int engine_id;
/* Engine suspend state */
atomic_t se_suspended;
struct tegra_vse_soc_info *chipdata;
#if defined(CONFIG_HW_RANDOM)
/* Integration with hwrng framework */
struct hwrng *hwrng;
#endif /* CONFIG_HW_RANDOM */
struct platform_device *host1x_pdev;
struct crypto_dev_to_ivc_map *crypto_to_ivc_map;
};
/* Security Engine random number generator context */
struct tegra_virtual_se_rng_context {
/* Security Engine device */
struct tegra_virtual_se_dev *se_dev;
/* RNG buffer pointer */
u32 *rng_buf;
/* RNG buffer dma address */
dma_addr_t rng_buf_adr;
/*Crypto dev instance*/
uint32_t node_id;
};
/* Security Engine AES context */
struct tegra_virtual_se_aes_context {
/* Security Engine device */
struct tegra_virtual_se_dev *se_dev;
struct skcipher_request *req;
/* Security Engine key slot */
u8 aes_keyslot[KEYSLOT_SIZE_BYTES];
/* key length in bytes */
u32 keylen;
/* AES operation mode */
u32 op_mode;
/* Is key slot */
bool is_key_slot_allocated;
/* size of GCM tag*/
u32 authsize;
/*Crypto dev instance*/
uint32_t node_id;
/* Flag to indicate user nonce*/
uint8_t user_nonce;
/* Flag to indicate first request*/
uint8_t b_is_first;
};
/* Security Engine/TSEC AES CMAC context */
struct tegra_virtual_se_aes_cmac_context {
unsigned int digest_size;
u8 *hash_result; /* Intermediate hash result */
dma_addr_t hash_result_addr; /* Intermediate hash result dma addr */
bool is_first; /* Represents first block */
bool req_context_initialized; /* Mark initialization status */
u8 aes_keyslot[KEYSLOT_SIZE_BYTES];
/* key length in bits */
u32 keylen;
bool is_key_slot_allocated;
/*Crypto dev instance*/
uint32_t node_id;
};
/* Security Engine AES GMAC context */
struct tegra_virtual_se_aes_gmac_context {
/* size of GCM tag*/
u32 authsize;
/* Mark initialization status */
bool req_context_initialized;
u8 aes_keyslot[KEYSLOT_SIZE_BYTES];
/* key length in bits */
u32 keylen;
bool is_key_slot_allocated;
/*Crypto dev instance*/
uint32_t node_id;
};
/* Security Engine SHA context */
struct tegra_virtual_se_sha_context {
/* Security Engine device */
struct tegra_virtual_se_dev *se_dev;
/* SHA operation mode */
u32 op_mode;
unsigned int digest_size;
u8 mode;
/*Crypto dev instance*/
uint32_t node_id;
};
/* Security Engine request context */
struct tegra_virtual_se_req_context {
/* Security Engine device */
struct tegra_virtual_se_dev *se_dev;
unsigned int digest_size;
unsigned int intermediate_digest_size;
u8 mode; /* SHA operation mode */
u8 *sha_buf; /* Buffer to store residual data */
dma_addr_t sha_buf_addr; /* DMA address to residual data */
u8 *hash_result; /* Intermediate hash result */
dma_addr_t hash_result_addr; /* Intermediate hash result dma addr */
u64 total_count; /* Total bytes in all the requests */
u32 residual_bytes; /* Residual byte count */
u32 blk_size; /* SHA block size */
bool is_first; /* Represents first block */
bool req_context_initialized; /* Mark initialization status */
bool force_align; /* Enforce buffer alignment */
/*Crypto dev instance*/
uint32_t node_id;
};
/* API to get ivc db from hv_vse driver */
struct crypto_dev_to_ivc_map *tegra_hv_vse_get_db(void);
/* API to get tsec keyload status from vse driver */
int tegra_hv_vse_safety_tsec_get_keyload_status(uint32_t node_id, uint32_t *err_code);
#endif /*__TEGRA_HV_VSE_H*/