SerDes: EPL error reporting on irq

Add EPL reporting support in interrupt handling

JIRA TDS-17145

Change-Id: I3f7257ecbbc66880c65327cfdde52d2de5a3042a
Signed-off-by: Hitesh Khode <hkhode@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3322971
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: Prafull Suryawanshi <prafulls@nvidia.com>
Reviewed-by: Ishwarya Balaji Gururajan <igururajan@nvidia.com>
This commit is contained in:
Hitesh Khode
2025-03-20 11:45:02 +05:30
committed by Jon Hunter
parent 9e6481e659
commit c90336041c

View File

@@ -1,9 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
/* /*
* NVDISP SERDES driver for Display Serializers and DeSerializers * NVDISP SERDES driver for Display Serializers and DeSerializers
* *
* Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved.
*/ */
#include <nvidia/conftest.h> #include <nvidia/conftest.h>
@@ -24,6 +24,16 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/version.h> #include <linux/version.h>
#ifdef CONFIG_TEGRA_EPL
#include <linux/tegra-epl.h>
#endif
/**
* @brief EPL reporter ID for NVDISP SERDES.
* This ID is used when reporting errors to FSI via EPL.
*/
#define NVDISP_SERDES_EPL_REPORTER_ID 0x8103
/** /**
* @brief I2C opcode data structure sizes. * @brief I2C opcode data structure sizes.
* DO NOT MODIFY!! * DO NOT MODIFY!!
@@ -505,6 +515,24 @@ static int read_opcode_props(struct i2c_client *client,
return 0; return 0;
} }
static void nvdisp_serdes_epl_report_error(uint32_t error_code)
{
#ifdef CONFIG_TEGRA_EPL
struct epl_error_report_frame error_report;
u64 time;
asm volatile("mrs %0, cntvct_el0" : "=r" (time));
error_report.error_code = error_code;
error_report.error_attribute = 0x0;
error_report.reporter_id = NVDISP_SERDES_EPL_REPORTER_ID;
error_report.timestamp = (u32) time;
epl_report_error(error_report);
#endif
return;
}
static irqreturn_t nvdisp_serdes_irq_handler(int irq, void *dev_id) static irqreturn_t nvdisp_serdes_irq_handler(int irq, void *dev_id)
{ {
struct nvdisp_serdes_priv *priv = dev_id; struct nvdisp_serdes_priv *priv = dev_id;
@@ -530,6 +558,7 @@ static irqreturn_t nvdisp_serdes_irq_handler(int irq, void *dev_id)
} }
} }
nvdisp_serdes_epl_report_error(0x0);
done: done:
return IRQ_HANDLED; return IRQ_HANDLED;
} }