nvdla: kmd: support HSI corrected error injection

Jira DLA-6136
Jira DLA-6595

Change-Id: I4ca1b5f1e07566638951bc1d0c64613195779aa2
Signed-off-by: Arvind M <am@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2856422
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com>
Reviewed-by: Amit Sharma (SW-TEGRA) <amisharma@nvidia.com>
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com>
Reviewed-by: Ken Adams <kadams@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
Arvind M
2023-02-10 11:22:56 +00:00
committed by Laxman Dewangan
parent 42486b184d
commit 5720a7534d
4 changed files with 68 additions and 30 deletions

View File

@@ -58,17 +58,23 @@ int nvdla_error_inj_handler(unsigned int instance_id,
struct platform_device *pdev = nvdla_dev->pdev;
struct nvhost_device_data *pdata = platform_get_drvdata(pdev);
unsigned int device_instance_id;
unsigned int device_reporter_id;
unsigned int device_error_code;
unsigned int device_ue_reporter_id;
unsigned int device_ce_reporter_id;
unsigned int device_ue_error_code;
unsigned int device_ce_error_code;
if (pdata->class == NV_DLA0_CLASS_ID) {
device_instance_id = 0U;
device_reporter_id = NVDLA0_HSM_REPORTER_ID;
device_error_code = NVDLA0_HSM_ERROR_CODE;
device_ue_reporter_id = NVDLA0_UE_HSM_REPORTER_ID;
device_ce_reporter_id = NVDLA0_CE_HSM_REPORTER_ID;
device_ue_error_code = NVDLA0_UE_HSM_ERROR_CODE;
device_ce_error_code = NVDLA0_CE_HSM_ERROR_CODE;
} else {
device_instance_id = 1U;
device_reporter_id = NVDLA1_HSM_REPORTER_ID;
device_error_code = NVDLA1_HSM_ERROR_CODE;
device_ue_reporter_id = NVDLA1_UE_HSM_REPORTER_ID;
device_ce_reporter_id = NVDLA1_CE_HSM_REPORTER_ID;
device_ue_error_code = NVDLA1_UE_HSM_ERROR_CODE;
device_ce_error_code = NVDLA1_CE_HSM_ERROR_CODE;
}
if (device_instance_id != instance_id) {
@@ -77,20 +83,6 @@ int nvdla_error_inj_handler(unsigned int instance_id,
goto fail;
}
if (device_reporter_id != frame.reporter_id) {
nvdla_dbg_err(pdev, "Invalid reporter ID: %u",
frame.reporter_id);
err = -EINVAL;
goto fail;
}
if (device_error_code != frame.error_code) {
nvdla_dbg_err(pdev, "Invalid error code: %u",
frame.error_code);
err = -EINVAL;
goto fail;
}
err = nvhost_module_busy(pdev);
if (err < 0) {
nvdla_dbg_err(pdev, "failed to power on\n");
@@ -98,8 +90,21 @@ int nvdla_error_inj_handler(unsigned int instance_id,
goto fail;
}
host1x_writel(pdev, flcn_safety_erb_r(),
flcn_safety_erb_data_uncorrected_err_v());
if ((frame.reporter_id == device_ue_reporter_id) &&
(frame.error_code == device_ue_error_code)) {
/* Inject uncorrected error. */
host1x_writel(pdev, flcn_safety_erb_r(),
flcn_safety_erb_data_uncorrected_err_v());
} else if ((frame.reporter_id == device_ce_reporter_id) &&
(frame.error_code == device_ce_error_code)) {
/* Inject corrected error. */
host1x_writel(pdev, flcn_safety_erb_r(),
flcn_safety_erb_data_corrected_err_v());
} else {
nvdla_dbg_err(pdev, "Invalid Reported ID: %x, Error Code: %x",
frame.reporter_id, frame.error_code);
err = -EINVAL;
}
nvhost_module_idle(pdev);

View File

@@ -33,11 +33,23 @@
#if (IS_ENABLED(CONFIG_TEGRA_HSIERRRPTINJ))
#include <linux/tegra-hsierrrptinj.h>
#define NVDLA0_HSM_REPORTER_ID 0xE085U
#define NVDLA1_HSM_REPORTER_ID 0xE086U
/*
* HSM Reporter IDs.
*/
#define NVDLA0_CE_HSM_REPORTER_ID 0xE01EU
#define NVDLA1_CE_HSM_REPORTER_ID 0xE01FU
#define NVDLA0_HSM_ERROR_CODE 0x290BU
#define NVDLA1_HSM_ERROR_CODE 0x290CU
#define NVDLA0_UE_HSM_REPORTER_ID 0xE085U
#define NVDLA1_UE_HSM_REPORTER_ID 0xE086U
/*
* HSM Error Codes.
*/
#define NVDLA0_CE_HSM_ERROR_CODE 0x2DF6U
#define NVDLA1_CE_HSM_ERROR_CODE 0x2DF7U
#define NVDLA0_UE_HSM_ERROR_CODE 0x290BU
#define NVDLA1_UE_HSM_ERROR_CODE 0x290CU
#endif /* CONFIG_TEGRA_HSIERRRPTINJ */

View File

@@ -1098,16 +1098,32 @@ static ssize_t debug_dla_err_inj_write(struct file *file,
if (pdata->class == NV_DLA0_CLASS_ID) {
instance_id = 0U;
frame.error_code = NVDLA0_HSM_ERROR_CODE;
frame.error_attribute = 0U;
frame.timestamp = 0U;
frame.reporter_id = NVDLA0_HSM_REPORTER_ID;
if (write_value == 1) {
frame.reporter_id = NVDLA0_UE_HSM_REPORTER_ID;
frame.error_code = NVDLA0_UE_HSM_ERROR_CODE;
} else if (write_value == 2) {
frame.reporter_id = NVDLA0_CE_HSM_REPORTER_ID;
frame.error_code = NVDLA0_CE_HSM_ERROR_CODE;
} else {
nvdla_dbg_err(pdev, "Write value out of range: [0,2]");
goto fail;
}
} else {
instance_id = 1U;
frame.error_code = NVDLA1_HSM_ERROR_CODE;
frame.error_attribute = 0U;
frame.timestamp = 0U;
frame.reporter_id = NVDLA1_HSM_REPORTER_ID;
if (write_value == 1) {
frame.reporter_id = NVDLA1_UE_HSM_REPORTER_ID;
frame.error_code = NVDLA1_UE_HSM_ERROR_CODE;
} else if (write_value == 2) {
frame.reporter_id = NVDLA1_CE_HSM_REPORTER_ID;
frame.error_code = NVDLA1_CE_HSM_ERROR_CODE;
} else {
nvdla_dbg_err(pdev, "Write value out of range: [0,2]");
goto fail;
}
}
err = nvdla_error_inj_handler(instance_id, frame,

View File

@@ -303,6 +303,11 @@ static inline u32 flcn_safety_erb_r(void)
return 0x000012ec;
}
static inline u32 flcn_safety_erb_data_corrected_err_v(void)
{
return 0xeafe0c00;
}
static inline u32 flcn_safety_erb_data_uncorrected_err_v(void)
{
return 0xeafe1cff;