diff options
author | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-08-19 15:33:36 +0800 |
---|---|---|
committer | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-08-25 09:03:05 +0800 |
commit | cb5e1bc7b56a54682765f8a8fac0e69a77231ca2 (patch) | |
tree | 81a2bf95e0b7e55068f7e5c068e642ff94a78127 | |
parent | fa48527470572391b7e8aa53960d91cfde5dc80e (diff) | |
download | ras-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.c | 38 |
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 |