aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuai Xue <xueshuai@linux.alibaba.com>2022-08-19 15:33:36 +0800
committerShuai Xue <xueshuai@linux.alibaba.com>2022-08-25 09:03:05 +0800
commitcb5e1bc7b56a54682765f8a8fac0e69a77231ca2 (patch)
tree81a2bf95e0b7e55068f7e5c068e642ff94a78127
parentfa48527470572391b7e8aa53960d91cfde5dc80e (diff)
downloadras-tools-cb5e1bc7b56a54682765f8a8fac0e69a77231ca2.tar.gz
einj_mem_uc: check advanced RAS support by vendor id
The vendor interface of EINJ provides vendor_id, device_id, rev_id, etc. Check advanced RAS support by vendor id. Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
-rw-r--r--einj_mem_uc.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/einj_mem_uc.c b/einj_mem_uc.c
index efcbf71..fbe0257 100644
--- a/einj_mem_uc.c
+++ b/einj_mem_uc.c
@@ -48,6 +48,19 @@ static int *apicmap;
#define EINJ_FLAGS "/sys/kernel/debug/apei/einj/flags"
#define EINJ_NOTRIGGER "/sys/kernel/debug/apei/einj/notrigger"
#define EINJ_DOIT "/sys/kernel/debug/apei/einj/error_inject"
+#define EINJ_VENDOR "/sys/kernel/debug/apei/einj/vendor"
+
+/*
+ * Vendor extensions for platform specific operations
+ */
+struct vendor_error_type_extension {
+ int32_t length;
+ int32_t pcie_sbdf;
+ int16_t vendor_id;
+ int16_t device_id;
+ int8_t rev_id;
+ int8_t reserved[3];
+};
static int check_errortype_available(char *file, unsigned long long val)
{
@@ -193,10 +206,35 @@ static void check_configuration(void)
}
}
#elif __aarch64__
+
+static int is_advanced_ras(void)
+{
+ FILE *fp = fopen(EINJ_VENDOR, "r");
+ struct vendor_error_type_extension v;
+ int8_t domain, bus, dev, func;
+ int ret;
+
+ ret = fscanf(fp, "%x:%x:%x.%x vendor_id=%x device_id=%x rev_id=%x\n",
+ &domain, &bus, &dev, &func,
+ &v.vendor_id, &v.device_id, &v.rev_id);
+
+ if (ret != 7)
+ exit(1);
+
+ switch (v.vendor_id) {
+ case 0x1ded:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
static void check_configuration(void)
{
if (!is_privileged() || !is_einj_support())
exit(1);
+ if (!is_advanced_ras())
+ exit(1);
}
#endif