1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * APEI Generic Hardware Error Source support 4 * 5 * Generic Hardware Error Source provides a way to report platform 6 * hardware errors (such as that from chipset). It works in so called 7 * "Firmware First" mode, that is, hardware errors are reported to 8 * firmware firstly, then reported to Linux by firmware. This way, 9 * some non-standard hardware error registers or non-standard hardware 10 * link can be checked by firmware to produce more hardware error 11 * information for Linux. 12 * 13 * For more information about Generic Hardware Error Source, please 14 * refer to ACPI Specification version 4.0, section 17.3.2.6 15 * 16 * Copyright 2010,2011 Intel Corp. 17 * Author: Huang Ying <ying.huang@intel.com> 18 */ 19 20 #include <linux/arm_sdei.h> 21 #include <linux/kernel.h> 22 #include <linux/moduleparam.h> 23 #include <linux/init.h> 24 #include <linux/acpi.h> 25 #include <linux/io.h> 26 #include <linux/interrupt.h> 27 #include <linux/timer.h> 28 #include <linux/cper.h> 29 #include <linux/platform_device.h> 30 #include <linux/mutex.h> 31 #include <linux/ratelimit.h> 32 #include <linux/vmalloc.h> 33 #include <linux/irq_work.h> 34 #include <linux/llist.h> 35 #include <linux/genalloc.h> 36 #include <linux/pci.h> 37 #include <linux/pfn.h> 38 #include <linux/aer.h> 39 #include <linux/nmi.h> 40 #include <linux/sched/clock.h> 41 #include <linux/uuid.h> 42 #include <linux/ras.h> 43 44 #include <acpi/actbl1.h> 45 #include <acpi/ghes.h> 46 #include <acpi/apei.h> 47 #include <asm/fixmap.h> 48 #include <asm/tlbflush.h> 49 #include <ras/ras_event.h> 50 51 #include "apei-internal.h" 52 53 #define GHES_PFX "GHES: " 54 55 #define GHES_ESTATUS_MAX_SIZE 65536 56 #define GHES_ESOURCE_PREALLOC_MAX_SIZE 65536 57 58 #define GHES_ESTATUS_POOL_MIN_ALLOC_ORDER 3 59 60 /* This is just an estimation for memory pool allocation */ 61 #define GHES_ESTATUS_CACHE_AVG_SIZE 512 62 63 #define GHES_ESTATUS_CACHES_SIZE 4 64 65 #define GHES_ESTATUS_IN_CACHE_MAX_NSEC 10000000000ULL 66 /* Prevent too many caches are allocated because of RCU */ 67 #define GHES_ESTATUS_CACHE_ALLOCED_MAX (GHES_ESTATUS_CACHES_SIZE * 3 / 2) 68 69 #define GHES_ESTATUS_CACHE_LEN(estatus_len) \ 70 (sizeof(struct ghes_estatus_cache) + (estatus_len)) 71 #define GHES_ESTATUS_FROM_CACHE(estatus_cache) \ 72 ((struct acpi_hest_generic_status *) \ 73 ((struct ghes_estatus_cache *)(estatus_cache) + 1)) 74 75 #define GHES_ESTATUS_NODE_LEN(estatus_len) \ 76 (sizeof(struct ghes_estatus_node) + (estatus_len)) 77 #define GHES_ESTATUS_FROM_NODE(estatus_node) \ 78 ((struct acpi_hest_generic_status *) \ 79 ((struct ghes_estatus_node *)(estatus_node) + 1)) 80 81 /* 82 * NMI-like notifications vary by architecture, before the compiler can prune 83 * unused static functions it needs a value for these enums. 84 */ 85 #ifndef CONFIG_ARM_SDE_INTERFACE 86 #define FIX_APEI_GHES_SDEI_NORMAL __end_of_fixed_addresses 87 #define FIX_APEI_GHES_SDEI_CRITICAL __end_of_fixed_addresses 88 #endif 89 90 static inline bool is_hest_type_generic_v2(struct ghes *ghes) 91 { 92 return ghes->generic->header.type == ACPI_HEST_TYPE_GENERIC_ERROR_V2; 93 } 94 95 /* 96 * This driver isn't really modular, however for the time being, 97 * continuing to use module_param is the easiest way to remain 98 * compatible with existing boot arg use cases. 99 */ 100 bool ghes_disable; 101 module_param_named(disable, ghes_disable, bool, 0); 102 103 /* 104 * All error sources notified with HED (Hardware Error Device) share a 105 * single notifier callback, so they need to be linked and checked one 106 * by one. This holds true for NMI too. 107 * 108 * RCU is used for these lists, so ghes_list_mutex is only used for 109 * list changing, not for traversing. 110 */ 111 static LIST_HEAD(ghes_hed); 112 static DEFINE_MUTEX(ghes_list_mutex); 113 114 /* 115 * Because the memory area used to transfer hardware error information 116 * from BIOS to Linux can be determined only in NMI, IRQ or timer 117 * handler, but general ioremap can not be used in atomic context, so 118 * the fixmap is used instead. 119 * 120 * This spinlock is used to prevent the fixmap entry from being used 121 * simultaneously. 122 */ 123 static DEFINE_SPINLOCK(ghes_notify_lock_irq); 124 125 static struct gen_pool *ghes_estatus_pool; 126 static unsigned long ghes_estatus_pool_size_request; 127 128 static struct ghes_estatus_cache *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE]; 129 static atomic_t ghes_estatus_cache_alloced; 130 131 static int ghes_panic_timeout __read_mostly = 30; 132 133 static void __iomem *ghes_map(u64 pfn, enum fixed_addresses fixmap_idx) 134 { 135 phys_addr_t paddr; 136 pgprot_t prot; 137 138 paddr = PFN_PHYS(pfn); 139 prot = arch_apei_get_mem_attribute(paddr); 140 __set_fixmap(fixmap_idx, paddr, prot); 141 142 return (void __iomem *) __fix_to_virt(fixmap_idx); 143 } 144 145 static void ghes_unmap(void __iomem *vaddr, enum fixed_addresses fixmap_idx) 146 { 147 int _idx = virt_to_fix((unsigned long)vaddr); 148 149 WARN_ON_ONCE(fixmap_idx != _idx); 150 clear_fixmap(fixmap_idx); 151 } 152 153 int ghes_estatus_pool_init(int num_ghes) 154 { 155 unsigned long addr, len; 156 157 ghes_estatus_pool = gen_pool_create(GHES_ESTATUS_POOL_MIN_ALLOC_ORDER, -1); 158 if (!ghes_estatus_pool) 159 return -ENOMEM; 160 161 len = GHES_ESTATUS_CACHE_AVG_SIZE * GHES_ESTATUS_CACHE_ALLOCED_MAX; 162 len += (num_ghes * GHES_ESOURCE_PREALLOC_MAX_SIZE); 163 164 ghes_estatus_pool_size_request = PAGE_ALIGN(len); 165 addr = (unsigned long)vmalloc(PAGE_ALIGN(len)); 166 if (!addr) 167 return -ENOMEM; 168 169 /* 170 * New allocation must be visible in all pgd before it can be found by 171 * an NMI allocating from the pool. 172 */ 173 vmalloc_sync_all(); 174 175 return gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); 176 } 177 178 static int map_gen_v2(struct ghes *ghes) 179 { 180 return apei_map_generic_address(&ghes->generic_v2->read_ack_register); 181 } 182 183 static void unmap_gen_v2(struct ghes *ghes) 184 { 185 apei_unmap_generic_address(&ghes->generic_v2->read_ack_register); 186 } 187 188 static void ghes_ack_error(struct acpi_hest_generic_v2 *gv2) 189 { 190 int rc; 191 u64 val = 0; 192 193 rc = apei_read(&val, &gv2->read_ack_register); 194 if (rc) 195 return; 196 197 val &= gv2->read_ack_preserve << gv2->read_ack_register.bit_offset; 198 val |= gv2->read_ack_write << gv2->read_ack_register.bit_offset; 199 200 apei_write(val, &gv2->read_ack_register); 201 } 202 203 static struct ghes *ghes_new(struct acpi_hest_generic *generic) 204 { 205 struct ghes *ghes; 206 unsigned int error_block_length; 207 int rc; 208 209 ghes = kzalloc(sizeof(*ghes), GFP_KERNEL); 210 if (!ghes) 211 return ERR_PTR(-ENOMEM); 212 213 ghes->generic = generic; 214 if (is_hest_type_generic_v2(ghes)) { 215 rc = map_gen_v2(ghes); 216 if (rc) 217 goto err_free; 218 } 219 220 rc = apei_map_generic_address(&generic->error_status_address); 221 if (rc) 222 goto err_unmap_read_ack_addr; 223 error_block_length = generic->error_block_length; 224 if (error_block_length > GHES_ESTATUS_MAX_SIZE) { 225 pr_warning(FW_WARN GHES_PFX 226 "Error status block length is too long: %u for " 227 "generic hardware error source: %d.\n", 228 error_block_length, generic->header.source_id); 229 error_block_length = GHES_ESTATUS_MAX_SIZE; 230 } 231 ghes->estatus = kmalloc(error_block_length, GFP_KERNEL); 232 if (!ghes->estatus) { 233 rc = -ENOMEM; 234 goto err_unmap_status_addr; 235 } 236 237 return ghes; 238 239 err_unmap_status_addr: 240 apei_unmap_generic_address(&generic->error_status_address); 241 err_unmap_read_ack_addr: 242 if (is_hest_type_generic_v2(ghes)) 243 unmap_gen_v2(ghes); 244 err_free: 245 kfree(ghes); 246 return ERR_PTR(rc); 247 } 248 249 static void ghes_fini(struct ghes *ghes) 250 { 251 kfree(ghes->estatus); 252 apei_unmap_generic_address(&ghes->generic->error_status_address); 253 if (is_hest_type_generic_v2(ghes)) 254 unmap_gen_v2(ghes); 255 } 256 257 static inline int ghes_severity(int severity) 258 { 259 switch (severity) { 260 case CPER_SEV_INFORMATIONAL: 261 return GHES_SEV_NO; 262 case CPER_SEV_CORRECTED: 263 return GHES_SEV_CORRECTED; 264 case CPER_SEV_RECOVERABLE: 265 return GHES_SEV_RECOVERABLE; 266 case CPER_SEV_FATAL: 267 return GHES_SEV_PANIC; 268 default: 269 /* Unknown, go panic */ 270 return GHES_SEV_PANIC; 271 } 272 } 273 274 static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len, 275 int from_phys, 276 enum fixed_addresses fixmap_idx) 277 { 278 void __iomem *vaddr; 279 u64 offset; 280 u32 trunk; 281 282 while (len > 0) { 283 offset = paddr - (paddr & PAGE_MASK); 284 vaddr = ghes_map(PHYS_PFN(paddr), fixmap_idx); 285 trunk = PAGE_SIZE - offset; 286 trunk = min(trunk, len); 287 if (from_phys) 288 memcpy_fromio(buffer, vaddr + offset, trunk); 289 else 290 memcpy_toio(vaddr + offset, buffer, trunk); 291 len -= trunk; 292 paddr += trunk; 293 buffer += trunk; 294 ghes_unmap(vaddr, fixmap_idx); 295 } 296 } 297 298 /* Check the top-level record header has an appropriate size. */ 299 static int __ghes_check_estatus(struct ghes *ghes, 300 struct acpi_hest_generic_status *estatus) 301 { 302 u32 len = cper_estatus_len(estatus); 303 304 if (len < sizeof(*estatus)) { 305 pr_warn_ratelimited(FW_WARN GHES_PFX "Truncated error status block!\n"); 306 return -EIO; 307 } 308 309 if (len > ghes->generic->error_block_length) { 310 pr_warn_ratelimited(FW_WARN GHES_PFX "Invalid error status block length!\n"); 311 return -EIO; 312 } 313 314 if (cper_estatus_check_header(estatus)) { 315 pr_warn_ratelimited(FW_WARN GHES_PFX "Invalid CPER header!\n"); 316 return -EIO; 317 } 318 319 return 0; 320 } 321 322 /* Read the CPER block, returning its address, and header in estatus. */ 323 static int __ghes_peek_estatus(struct ghes *ghes, 324 struct acpi_hest_generic_status *estatus, 325 u64 *buf_paddr, enum fixed_addresses fixmap_idx) 326 { 327 struct acpi_hest_generic *g = ghes->generic; 328 int rc; 329 330 rc = apei_read(buf_paddr, &g->error_status_address); 331 if (rc) { 332 *buf_paddr = 0; 333 pr_warn_ratelimited(FW_WARN GHES_PFX 334 "Failed to read error status block address for hardware error source: %d.\n", 335 g->header.source_id); 336 return -EIO; 337 } 338 if (!*buf_paddr) 339 return -ENOENT; 340 341 ghes_copy_tofrom_phys(estatus, *buf_paddr, sizeof(*estatus), 1, 342 fixmap_idx); 343 if (!estatus->block_status) { 344 *buf_paddr = 0; 345 return -ENOENT; 346 } 347 348 return 0; 349 } 350 351 static int __ghes_read_estatus(struct acpi_hest_generic_status *estatus, 352 u64 buf_paddr, enum fixed_addresses fixmap_idx, 353 size_t buf_len) 354 { 355 ghes_copy_tofrom_phys(estatus, buf_paddr, buf_len, 1, fixmap_idx); 356 if (cper_estatus_check(estatus)) { 357 pr_warn_ratelimited(FW_WARN GHES_PFX 358 "Failed to read error status block!\n"); 359 return -EIO; 360 } 361 362 return 0; 363 } 364 365 static int ghes_read_estatus(struct ghes *ghes, 366 struct acpi_hest_generic_status *estatus, 367 u64 *buf_paddr, enum fixed_addresses fixmap_idx) 368 { 369 int rc; 370 371 rc = __ghes_peek_estatus(ghes, estatus, buf_paddr, fixmap_idx); 372 if (rc) 373 return rc; 374 375 rc = __ghes_check_estatus(ghes, estatus); 376 if (rc) 377 return rc; 378 379 return __ghes_read_estatus(estatus, *buf_paddr, fixmap_idx, 380 cper_estatus_len(estatus)); 381 } 382 383 static void ghes_clear_estatus(struct ghes *ghes, 384 struct acpi_hest_generic_status *estatus, 385 u64 buf_paddr, enum fixed_addresses fixmap_idx) 386 { 387 estatus->block_status = 0; 388 389 if (!buf_paddr) 390 return; 391 392 ghes_copy_tofrom_phys(estatus, buf_paddr, 393 sizeof(estatus->block_status), 0, 394 fixmap_idx); 395 396 /* 397 * GHESv2 type HEST entries introduce support for error acknowledgment, 398 * so only acknowledge the error if this support is present. 399 */ 400 if (is_hest_type_generic_v2(ghes)) 401 ghes_ack_error(ghes->generic_v2); 402 } 403 404 static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int sev) 405 { 406 #ifdef CONFIG_ACPI_APEI_MEMORY_FAILURE 407 unsigned long pfn; 408 int flags = -1; 409 int sec_sev = ghes_severity(gdata->error_severity); 410 struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata); 411 412 if (!(mem_err->validation_bits & CPER_MEM_VALID_PA)) 413 return; 414 415 pfn = mem_err->physical_addr >> PAGE_SHIFT; 416 if (!pfn_valid(pfn)) { 417 pr_warn_ratelimited(FW_WARN GHES_PFX 418 "Invalid address in generic error data: %#llx\n", 419 mem_err->physical_addr); 420 return; 421 } 422 423 /* iff following two events can be handled properly by now */ 424 if (sec_sev == GHES_SEV_CORRECTED && 425 (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED)) 426 flags = MF_SOFT_OFFLINE; 427 if (sev == GHES_SEV_RECOVERABLE && sec_sev == GHES_SEV_RECOVERABLE) 428 flags = 0; 429 430 if (flags != -1) 431 memory_failure_queue(pfn, flags); 432 #endif 433 } 434 435 /* 436 * PCIe AER errors need to be sent to the AER driver for reporting and 437 * recovery. The GHES severities map to the following AER severities and 438 * require the following handling: 439 * 440 * GHES_SEV_CORRECTABLE -> AER_CORRECTABLE 441 * These need to be reported by the AER driver but no recovery is 442 * necessary. 443 * GHES_SEV_RECOVERABLE -> AER_NONFATAL 444 * GHES_SEV_RECOVERABLE && CPER_SEC_RESET -> AER_FATAL 445 * These both need to be reported and recovered from by the AER driver. 446 * GHES_SEV_PANIC does not make it to this handling since the kernel must 447 * panic. 448 */ 449 static void ghes_handle_aer(struct acpi_hest_generic_data *gdata) 450 { 451 #ifdef CONFIG_ACPI_APEI_PCIEAER 452 struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata); 453 454 if (pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID && 455 pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) { 456 unsigned int devfn; 457 int aer_severity; 458 459 devfn = PCI_DEVFN(pcie_err->device_id.device, 460 pcie_err->device_id.function); 461 aer_severity = cper_severity_to_aer(gdata->error_severity); 462 463 /* 464 * If firmware reset the component to contain 465 * the error, we must reinitialize it before 466 * use, so treat it as a fatal AER error. 467 */ 468 if (gdata->flags & CPER_SEC_RESET) 469 aer_severity = AER_FATAL; 470 471 aer_recover_queue(pcie_err->device_id.segment, 472 pcie_err->device_id.bus, 473 devfn, aer_severity, 474 (struct aer_capability_regs *) 475 pcie_err->aer_info); 476 } 477 #endif 478 } 479 480 static void ghes_do_proc(struct ghes *ghes, 481 const struct acpi_hest_generic_status *estatus) 482 { 483 int sev, sec_sev; 484 struct acpi_hest_generic_data *gdata; 485 guid_t *sec_type; 486 guid_t *fru_id = &NULL_UUID_LE; 487 char *fru_text = ""; 488 489 sev = ghes_severity(estatus->error_severity); 490 apei_estatus_for_each_section(estatus, gdata) { 491 sec_type = (guid_t *)gdata->section_type; 492 sec_sev = ghes_severity(gdata->error_severity); 493 if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID) 494 fru_id = (guid_t *)gdata->fru_id; 495 496 if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT) 497 fru_text = gdata->fru_text; 498 499 if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) { 500 struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata); 501 502 ghes_edac_report_mem_error(sev, mem_err); 503 504 arch_apei_report_mem_error(sev, mem_err); 505 ghes_handle_memory_failure(gdata, sev); 506 } 507 else if (guid_equal(sec_type, &CPER_SEC_PCIE)) { 508 ghes_handle_aer(gdata); 509 } 510 else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) { 511 struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata); 512 513 log_arm_hw_error(err); 514 } else { 515 void *err = acpi_hest_get_payload(gdata); 516 517 log_non_standard_event(sec_type, fru_id, fru_text, 518 sec_sev, err, 519 gdata->error_data_length); 520 } 521 } 522 } 523 524 static void __ghes_print_estatus(const char *pfx, 525 const struct acpi_hest_generic *generic, 526 const struct acpi_hest_generic_status *estatus) 527 { 528 static atomic_t seqno; 529 unsigned int curr_seqno; 530 char pfx_seq[64]; 531 532 if (pfx == NULL) { 533 if (ghes_severity(estatus->error_severity) <= 534 GHES_SEV_CORRECTED) 535 pfx = KERN_WARNING; 536 else 537 pfx = KERN_ERR; 538 } 539 curr_seqno = atomic_inc_return(&seqno); 540 snprintf(pfx_seq, sizeof(pfx_seq), "%s{%u}" HW_ERR, pfx, curr_seqno); 541 printk("%s""Hardware error from APEI Generic Hardware Error Source: %d\n", 542 pfx_seq, generic->header.source_id); 543 cper_estatus_print(pfx_seq, estatus); 544 } 545 546 static int ghes_print_estatus(const char *pfx, 547 const struct acpi_hest_generic *generic, 548 const struct acpi_hest_generic_status *estatus) 549 { 550 /* Not more than 2 messages every 5 seconds */ 551 static DEFINE_RATELIMIT_STATE(ratelimit_corrected, 5*HZ, 2); 552 static DEFINE_RATELIMIT_STATE(ratelimit_uncorrected, 5*HZ, 2); 553 struct ratelimit_state *ratelimit; 554 555 if (ghes_severity(estatus->error_severity) <= GHES_SEV_CORRECTED) 556 ratelimit = &ratelimit_corrected; 557 else 558 ratelimit = &ratelimit_uncorrected; 559 if (__ratelimit(ratelimit)) { 560 __ghes_print_estatus(pfx, generic, estatus); 561 return 1; 562 } 563 return 0; 564 } 565 566 /* 567 * GHES error status reporting throttle, to report more kinds of 568 * errors, instead of just most frequently occurred errors. 569 */ 570 static int ghes_estatus_cached(struct acpi_hest_generic_status *estatus) 571 { 572 u32 len; 573 int i, cached = 0; 574 unsigned long long now; 575 struct ghes_estatus_cache *cache; 576 struct acpi_hest_generic_status *cache_estatus; 577 578 len = cper_estatus_len(estatus); 579 rcu_read_lock(); 580 for (i = 0; i < GHES_ESTATUS_CACHES_SIZE; i++) { 581 cache = rcu_dereference(ghes_estatus_caches[i]); 582 if (cache == NULL) 583 continue; 584 if (len != cache->estatus_len) 585 continue; 586 cache_estatus = GHES_ESTATUS_FROM_CACHE(cache); 587 if (memcmp(estatus, cache_estatus, len)) 588 continue; 589 atomic_inc(&cache->count); 590 now = sched_clock(); 591 if (now - cache->time_in < GHES_ESTATUS_IN_CACHE_MAX_NSEC) 592 cached = 1; 593 break; 594 } 595 rcu_read_unlock(); 596 return cached; 597 } 598 599 static struct ghes_estatus_cache *ghes_estatus_cache_alloc( 600 struct acpi_hest_generic *generic, 601 struct acpi_hest_generic_status *estatus) 602 { 603 int alloced; 604 u32 len, cache_len; 605 struct ghes_estatus_cache *cache; 606 struct acpi_hest_generic_status *cache_estatus; 607 608 alloced = atomic_add_return(1, &ghes_estatus_cache_alloced); 609 if (alloced > GHES_ESTATUS_CACHE_ALLOCED_MAX) { 610 atomic_dec(&ghes_estatus_cache_alloced); 611 return NULL; 612 } 613 len = cper_estatus_len(estatus); 614 cache_len = GHES_ESTATUS_CACHE_LEN(len); 615 cache = (void *)gen_pool_alloc(ghes_estatus_pool, cache_len); 616 if (!cache) { 617 atomic_dec(&ghes_estatus_cache_alloced); 618 return NULL; 619 } 620 cache_estatus = GHES_ESTATUS_FROM_CACHE(cache); 621 memcpy(cache_estatus, estatus, len); 622 cache->estatus_len = len; 623 atomic_set(&cache->count, 0); 624 cache->generic = generic; 625 cache->time_in = sched_clock(); 626 return cache; 627 } 628 629 static void ghes_estatus_cache_free(struct ghes_estatus_cache *cache) 630 { 631 u32 len; 632 633 len = cper_estatus_len(GHES_ESTATUS_FROM_CACHE(cache)); 634 len = GHES_ESTATUS_CACHE_LEN(len); 635 gen_pool_free(ghes_estatus_pool, (unsigned long)cache, len); 636 atomic_dec(&ghes_estatus_cache_alloced); 637 } 638 639 static void ghes_estatus_cache_rcu_free(struct rcu_head *head) 640 { 641 struct ghes_estatus_cache *cache; 642 643 cache = container_of(head, struct ghes_estatus_cache, rcu); 644 ghes_estatus_cache_free(cache); 645 } 646 647 static void ghes_estatus_cache_add( 648 struct acpi_hest_generic *generic, 649 struct acpi_hest_generic_status *estatus) 650 { 651 int i, slot = -1, count; 652 unsigned long long now, duration, period, max_period = 0; 653 struct ghes_estatus_cache *cache, *slot_cache = NULL, *new_cache; 654 655 new_cache = ghes_estatus_cache_alloc(generic, estatus); 656 if (new_cache == NULL) 657 return; 658 rcu_read_lock(); 659 now = sched_clock(); 660 for (i = 0; i < GHES_ESTATUS_CACHES_SIZE; i++) { 661 cache = rcu_dereference(ghes_estatus_caches[i]); 662 if (cache == NULL) { 663 slot = i; 664 slot_cache = NULL; 665 break; 666 } 667 duration = now - cache->time_in; 668 if (duration >= GHES_ESTATUS_IN_CACHE_MAX_NSEC) { 669 slot = i; 670 slot_cache = cache; 671 break; 672 } 673 count = atomic_read(&cache->count); 674 period = duration; 675 do_div(period, (count + 1)); 676 if (period > max_period) { 677 max_period = period; 678 slot = i; 679 slot_cache = cache; 680 } 681 } 682 /* new_cache must be put into array after its contents are written */ 683 smp_wmb(); 684 if (slot != -1 && cmpxchg(ghes_estatus_caches + slot, 685 slot_cache, new_cache) == slot_cache) { 686 if (slot_cache) 687 call_rcu(&slot_cache->rcu, ghes_estatus_cache_rcu_free); 688 } else 689 ghes_estatus_cache_free(new_cache); 690 rcu_read_unlock(); 691 } 692 693 static void __ghes_panic(struct ghes *ghes, 694 struct acpi_hest_generic_status *estatus, 695 u64 buf_paddr, enum fixed_addresses fixmap_idx) 696 { 697 __ghes_print_estatus(KERN_EMERG, ghes->generic, estatus); 698 699 ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx); 700 701 /* reboot to log the error! */ 702 if (!panic_timeout) 703 panic_timeout = ghes_panic_timeout; 704 panic("Fatal hardware error!"); 705 } 706 707 static int ghes_proc(struct ghes *ghes) 708 { 709 struct acpi_hest_generic_status *estatus = ghes->estatus; 710 u64 buf_paddr; 711 int rc; 712 713 rc = ghes_read_estatus(ghes, estatus, &buf_paddr, FIX_APEI_GHES_IRQ); 714 if (rc) 715 goto out; 716 717 if (ghes_severity(estatus->error_severity) >= GHES_SEV_PANIC) 718 __ghes_panic(ghes, estatus, buf_paddr, FIX_APEI_GHES_IRQ); 719 720 if (!ghes_estatus_cached(estatus)) { 721 if (ghes_print_estatus(NULL, ghes->generic, estatus)) 722 ghes_estatus_cache_add(ghes->generic, estatus); 723 } 724 ghes_do_proc(ghes, estatus); 725 726 out: 727 ghes_clear_estatus(ghes, estatus, buf_paddr, FIX_APEI_GHES_IRQ); 728 729 return rc; 730 } 731 732 static void ghes_add_timer(struct ghes *ghes) 733 { 734 struct acpi_hest_generic *g = ghes->generic; 735 unsigned long expire; 736 737 if (!g->notify.poll_interval) { 738 pr_warning(FW_WARN GHES_PFX "Poll interval is 0 for generic hardware error source: %d, disabled.\n", 739 g->header.source_id); 740 return; 741 } 742 expire = jiffies + msecs_to_jiffies(g->notify.poll_interval); 743 ghes->timer.expires = round_jiffies_relative(expire); 744 add_timer(&ghes->timer); 745 } 746 747 static void ghes_poll_func(struct timer_list *t) 748 { 749 struct ghes *ghes = from_timer(ghes, t, timer); 750 unsigned long flags; 751 752 spin_lock_irqsave(&ghes_notify_lock_irq, flags); 753 ghes_proc(ghes); 754 spin_unlock_irqrestore(&ghes_notify_lock_irq, flags); 755 if (!(ghes->flags & GHES_EXITING)) 756 ghes_add_timer(ghes); 757 } 758 759 static irqreturn_t ghes_irq_func(int irq, void *data) 760 { 761 struct ghes *ghes = data; 762 unsigned long flags; 763 int rc; 764 765 spin_lock_irqsave(&ghes_notify_lock_irq, flags); 766 rc = ghes_proc(ghes); 767 spin_unlock_irqrestore(&ghes_notify_lock_irq, flags); 768 if (rc) 769 return IRQ_NONE; 770 771 return IRQ_HANDLED; 772 } 773 774 static int ghes_notify_hed(struct notifier_block *this, unsigned long event, 775 void *data) 776 { 777 struct ghes *ghes; 778 unsigned long flags; 779 int ret = NOTIFY_DONE; 780 781 spin_lock_irqsave(&ghes_notify_lock_irq, flags); 782 rcu_read_lock(); 783 list_for_each_entry_rcu(ghes, &ghes_hed, list) { 784 if (!ghes_proc(ghes)) 785 ret = NOTIFY_OK; 786 } 787 rcu_read_unlock(); 788 spin_unlock_irqrestore(&ghes_notify_lock_irq, flags); 789 790 return ret; 791 } 792 793 static struct notifier_block ghes_notifier_hed = { 794 .notifier_call = ghes_notify_hed, 795 }; 796 797 /* 798 * Handlers for CPER records may not be NMI safe. For example, 799 * memory_failure_queue() takes spinlocks and calls schedule_work_on(). 800 * In any NMI-like handler, memory from ghes_estatus_pool is used to save 801 * estatus, and added to the ghes_estatus_llist. irq_work_queue() causes 802 * ghes_proc_in_irq() to run in IRQ context where each estatus in 803 * ghes_estatus_llist is processed. 804 * 805 * Memory from the ghes_estatus_pool is also used with the ghes_estatus_cache 806 * to suppress frequent messages. 807 */ 808 static struct llist_head ghes_estatus_llist; 809 static struct irq_work ghes_proc_irq_work; 810 811 static void ghes_proc_in_irq(struct irq_work *irq_work) 812 { 813 struct llist_node *llnode, *next; 814 struct ghes_estatus_node *estatus_node; 815 struct acpi_hest_generic *generic; 816 struct acpi_hest_generic_status *estatus; 817 u32 len, node_len; 818 819 llnode = llist_del_all(&ghes_estatus_llist); 820 /* 821 * Because the time order of estatus in list is reversed, 822 * revert it back to proper order. 823 */ 824 llnode = llist_reverse_order(llnode); 825 while (llnode) { 826 next = llnode->next; 827 estatus_node = llist_entry(llnode, struct ghes_estatus_node, 828 llnode); 829 estatus = GHES_ESTATUS_FROM_NODE(estatus_node); 830 len = cper_estatus_len(estatus); 831 node_len = GHES_ESTATUS_NODE_LEN(len); 832 ghes_do_proc(estatus_node->ghes, estatus); 833 if (!ghes_estatus_cached(estatus)) { 834 generic = estatus_node->generic; 835 if (ghes_print_estatus(NULL, generic, estatus)) 836 ghes_estatus_cache_add(generic, estatus); 837 } 838 gen_pool_free(ghes_estatus_pool, (unsigned long)estatus_node, 839 node_len); 840 llnode = next; 841 } 842 } 843 844 static void ghes_print_queued_estatus(void) 845 { 846 struct llist_node *llnode; 847 struct ghes_estatus_node *estatus_node; 848 struct acpi_hest_generic *generic; 849 struct acpi_hest_generic_status *estatus; 850 851 llnode = llist_del_all(&ghes_estatus_llist); 852 /* 853 * Because the time order of estatus in list is reversed, 854 * revert it back to proper order. 855 */ 856 llnode = llist_reverse_order(llnode); 857 while (llnode) { 858 estatus_node = llist_entry(llnode, struct ghes_estatus_node, 859 llnode); 860 estatus = GHES_ESTATUS_FROM_NODE(estatus_node); 861 generic = estatus_node->generic; 862 ghes_print_estatus(NULL, generic, estatus); 863 llnode = llnode->next; 864 } 865 } 866 867 static int ghes_in_nmi_queue_one_entry(struct ghes *ghes, 868 enum fixed_addresses fixmap_idx) 869 { 870 struct acpi_hest_generic_status *estatus, tmp_header; 871 struct ghes_estatus_node *estatus_node; 872 u32 len, node_len; 873 u64 buf_paddr; 874 int sev, rc; 875 876 if (!IS_ENABLED(CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG)) 877 return -EOPNOTSUPP; 878 879 rc = __ghes_peek_estatus(ghes, &tmp_header, &buf_paddr, fixmap_idx); 880 if (rc) { 881 ghes_clear_estatus(ghes, &tmp_header, buf_paddr, fixmap_idx); 882 return rc; 883 } 884 885 rc = __ghes_check_estatus(ghes, &tmp_header); 886 if (rc) { 887 ghes_clear_estatus(ghes, &tmp_header, buf_paddr, fixmap_idx); 888 return rc; 889 } 890 891 len = cper_estatus_len(&tmp_header); 892 node_len = GHES_ESTATUS_NODE_LEN(len); 893 estatus_node = (void *)gen_pool_alloc(ghes_estatus_pool, node_len); 894 if (!estatus_node) 895 return -ENOMEM; 896 897 estatus_node->ghes = ghes; 898 estatus_node->generic = ghes->generic; 899 estatus = GHES_ESTATUS_FROM_NODE(estatus_node); 900 901 if (__ghes_read_estatus(estatus, buf_paddr, fixmap_idx, len)) { 902 ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx); 903 rc = -ENOENT; 904 goto no_work; 905 } 906 907 sev = ghes_severity(estatus->error_severity); 908 if (sev >= GHES_SEV_PANIC) { 909 ghes_print_queued_estatus(); 910 __ghes_panic(ghes, estatus, buf_paddr, fixmap_idx); 911 } 912 913 ghes_clear_estatus(ghes, &tmp_header, buf_paddr, fixmap_idx); 914 915 /* This error has been reported before, don't process it again. */ 916 if (ghes_estatus_cached(estatus)) 917 goto no_work; 918 919 llist_add(&estatus_node->llnode, &ghes_estatus_llist); 920 921 return rc; 922 923 no_work: 924 gen_pool_free(ghes_estatus_pool, (unsigned long)estatus_node, 925 node_len); 926 927 return rc; 928 } 929 930 static int ghes_in_nmi_spool_from_list(struct list_head *rcu_list, 931 enum fixed_addresses fixmap_idx) 932 { 933 int ret = -ENOENT; 934 struct ghes *ghes; 935 936 rcu_read_lock(); 937 list_for_each_entry_rcu(ghes, rcu_list, list) { 938 if (!ghes_in_nmi_queue_one_entry(ghes, fixmap_idx)) 939 ret = 0; 940 } 941 rcu_read_unlock(); 942 943 if (IS_ENABLED(CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG) && !ret) 944 irq_work_queue(&ghes_proc_irq_work); 945 946 return ret; 947 } 948 949 #ifdef CONFIG_ACPI_APEI_SEA 950 static LIST_HEAD(ghes_sea); 951 952 /* 953 * Return 0 only if one of the SEA error sources successfully reported an error 954 * record sent from the firmware. 955 */ 956 int ghes_notify_sea(void) 957 { 958 static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sea); 959 int rv; 960 961 raw_spin_lock(&ghes_notify_lock_sea); 962 rv = ghes_in_nmi_spool_from_list(&ghes_sea, FIX_APEI_GHES_SEA); 963 raw_spin_unlock(&ghes_notify_lock_sea); 964 965 return rv; 966 } 967 968 static void ghes_sea_add(struct ghes *ghes) 969 { 970 mutex_lock(&ghes_list_mutex); 971 list_add_rcu(&ghes->list, &ghes_sea); 972 mutex_unlock(&ghes_list_mutex); 973 } 974 975 static void ghes_sea_remove(struct ghes *ghes) 976 { 977 mutex_lock(&ghes_list_mutex); 978 list_del_rcu(&ghes->list); 979 mutex_unlock(&ghes_list_mutex); 980 synchronize_rcu(); 981 } 982 #else /* CONFIG_ACPI_APEI_SEA */ 983 static inline void ghes_sea_add(struct ghes *ghes) { } 984 static inline void ghes_sea_remove(struct ghes *ghes) { } 985 #endif /* CONFIG_ACPI_APEI_SEA */ 986 987 #ifdef CONFIG_HAVE_ACPI_APEI_NMI 988 /* 989 * NMI may be triggered on any CPU, so ghes_in_nmi is used for 990 * having only one concurrent reader. 991 */ 992 static atomic_t ghes_in_nmi = ATOMIC_INIT(0); 993 994 static LIST_HEAD(ghes_nmi); 995 996 static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs) 997 { 998 static DEFINE_RAW_SPINLOCK(ghes_notify_lock_nmi); 999 int ret = NMI_DONE; 1000 1001 if (!atomic_add_unless(&ghes_in_nmi, 1, 1)) 1002 return ret; 1003 1004 raw_spin_lock(&ghes_notify_lock_nmi); 1005 if (!ghes_in_nmi_spool_from_list(&ghes_nmi, FIX_APEI_GHES_NMI)) 1006 ret = NMI_HANDLED; 1007 raw_spin_unlock(&ghes_notify_lock_nmi); 1008 1009 atomic_dec(&ghes_in_nmi); 1010 return ret; 1011 } 1012 1013 static void ghes_nmi_add(struct ghes *ghes) 1014 { 1015 mutex_lock(&ghes_list_mutex); 1016 if (list_empty(&ghes_nmi)) 1017 register_nmi_handler(NMI_LOCAL, ghes_notify_nmi, 0, "ghes"); 1018 list_add_rcu(&ghes->list, &ghes_nmi); 1019 mutex_unlock(&ghes_list_mutex); 1020 } 1021 1022 static void ghes_nmi_remove(struct ghes *ghes) 1023 { 1024 mutex_lock(&ghes_list_mutex); 1025 list_del_rcu(&ghes->list); 1026 if (list_empty(&ghes_nmi)) 1027 unregister_nmi_handler(NMI_LOCAL, "ghes"); 1028 mutex_unlock(&ghes_list_mutex); 1029 /* 1030 * To synchronize with NMI handler, ghes can only be 1031 * freed after NMI handler finishes. 1032 */ 1033 synchronize_rcu(); 1034 } 1035 #else /* CONFIG_HAVE_ACPI_APEI_NMI */ 1036 static inline void ghes_nmi_add(struct ghes *ghes) { } 1037 static inline void ghes_nmi_remove(struct ghes *ghes) { } 1038 #endif /* CONFIG_HAVE_ACPI_APEI_NMI */ 1039 1040 static void ghes_nmi_init_cxt(void) 1041 { 1042 init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq); 1043 } 1044 1045 static int __ghes_sdei_callback(struct ghes *ghes, 1046 enum fixed_addresses fixmap_idx) 1047 { 1048 if (!ghes_in_nmi_queue_one_entry(ghes, fixmap_idx)) { 1049 irq_work_queue(&ghes_proc_irq_work); 1050 1051 return 0; 1052 } 1053 1054 return -ENOENT; 1055 } 1056 1057 static int ghes_sdei_normal_callback(u32 event_num, struct pt_regs *regs, 1058 void *arg) 1059 { 1060 static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sdei_normal); 1061 struct ghes *ghes = arg; 1062 int err; 1063 1064 raw_spin_lock(&ghes_notify_lock_sdei_normal); 1065 err = __ghes_sdei_callback(ghes, FIX_APEI_GHES_SDEI_NORMAL); 1066 raw_spin_unlock(&ghes_notify_lock_sdei_normal); 1067 1068 return err; 1069 } 1070 1071 static int ghes_sdei_critical_callback(u32 event_num, struct pt_regs *regs, 1072 void *arg) 1073 { 1074 static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sdei_critical); 1075 struct ghes *ghes = arg; 1076 int err; 1077 1078 raw_spin_lock(&ghes_notify_lock_sdei_critical); 1079 err = __ghes_sdei_callback(ghes, FIX_APEI_GHES_SDEI_CRITICAL); 1080 raw_spin_unlock(&ghes_notify_lock_sdei_critical); 1081 1082 return err; 1083 } 1084 1085 static int apei_sdei_register_ghes(struct ghes *ghes) 1086 { 1087 if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE)) 1088 return -EOPNOTSUPP; 1089 1090 return sdei_register_ghes(ghes, ghes_sdei_normal_callback, 1091 ghes_sdei_critical_callback); 1092 } 1093 1094 static int apei_sdei_unregister_ghes(struct ghes *ghes) 1095 { 1096 if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE)) 1097 return -EOPNOTSUPP; 1098 1099 return sdei_unregister_ghes(ghes); 1100 } 1101 1102 static int ghes_probe(struct platform_device *ghes_dev) 1103 { 1104 struct acpi_hest_generic *generic; 1105 struct ghes *ghes = NULL; 1106 unsigned long flags; 1107 1108 int rc = -EINVAL; 1109 1110 generic = *(struct acpi_hest_generic **)ghes_dev->dev.platform_data; 1111 if (!generic->enabled) 1112 return -ENODEV; 1113 1114 switch (generic->notify.type) { 1115 case ACPI_HEST_NOTIFY_POLLED: 1116 case ACPI_HEST_NOTIFY_EXTERNAL: 1117 case ACPI_HEST_NOTIFY_SCI: 1118 case ACPI_HEST_NOTIFY_GSIV: 1119 case ACPI_HEST_NOTIFY_GPIO: 1120 break; 1121 1122 case ACPI_HEST_NOTIFY_SEA: 1123 if (!IS_ENABLED(CONFIG_ACPI_APEI_SEA)) { 1124 pr_warn(GHES_PFX "Generic hardware error source: %d notified via SEA is not supported\n", 1125 generic->header.source_id); 1126 rc = -ENOTSUPP; 1127 goto err; 1128 } 1129 break; 1130 case ACPI_HEST_NOTIFY_NMI: 1131 if (!IS_ENABLED(CONFIG_HAVE_ACPI_APEI_NMI)) { 1132 pr_warn(GHES_PFX "Generic hardware error source: %d notified via NMI interrupt is not supported!\n", 1133 generic->header.source_id); 1134 goto err; 1135 } 1136 break; 1137 case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED: 1138 if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE)) { 1139 pr_warn(GHES_PFX "Generic hardware error source: %d notified via SDE Interface is not supported!\n", 1140 generic->header.source_id); 1141 goto err; 1142 } 1143 break; 1144 case ACPI_HEST_NOTIFY_LOCAL: 1145 pr_warning(GHES_PFX "Generic hardware error source: %d notified via local interrupt is not supported!\n", 1146 generic->header.source_id); 1147 goto err; 1148 default: 1149 pr_warning(FW_WARN GHES_PFX "Unknown notification type: %u for generic hardware error source: %d\n", 1150 generic->notify.type, generic->header.source_id); 1151 goto err; 1152 } 1153 1154 rc = -EIO; 1155 if (generic->error_block_length < 1156 sizeof(struct acpi_hest_generic_status)) { 1157 pr_warning(FW_BUG GHES_PFX "Invalid error block length: %u for generic hardware error source: %d\n", 1158 generic->error_block_length, 1159 generic->header.source_id); 1160 goto err; 1161 } 1162 ghes = ghes_new(generic); 1163 if (IS_ERR(ghes)) { 1164 rc = PTR_ERR(ghes); 1165 ghes = NULL; 1166 goto err; 1167 } 1168 1169 switch (generic->notify.type) { 1170 case ACPI_HEST_NOTIFY_POLLED: 1171 timer_setup(&ghes->timer, ghes_poll_func, TIMER_DEFERRABLE); 1172 ghes_add_timer(ghes); 1173 break; 1174 case ACPI_HEST_NOTIFY_EXTERNAL: 1175 /* External interrupt vector is GSI */ 1176 rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq); 1177 if (rc) { 1178 pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n", 1179 generic->header.source_id); 1180 goto err; 1181 } 1182 rc = request_irq(ghes->irq, ghes_irq_func, IRQF_SHARED, 1183 "GHES IRQ", ghes); 1184 if (rc) { 1185 pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n", 1186 generic->header.source_id); 1187 goto err; 1188 } 1189 break; 1190 1191 case ACPI_HEST_NOTIFY_SCI: 1192 case ACPI_HEST_NOTIFY_GSIV: 1193 case ACPI_HEST_NOTIFY_GPIO: 1194 mutex_lock(&ghes_list_mutex); 1195 if (list_empty(&ghes_hed)) 1196 register_acpi_hed_notifier(&ghes_notifier_hed); 1197 list_add_rcu(&ghes->list, &ghes_hed); 1198 mutex_unlock(&ghes_list_mutex); 1199 break; 1200 1201 case ACPI_HEST_NOTIFY_SEA: 1202 ghes_sea_add(ghes); 1203 break; 1204 case ACPI_HEST_NOTIFY_NMI: 1205 ghes_nmi_add(ghes); 1206 break; 1207 case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED: 1208 rc = apei_sdei_register_ghes(ghes); 1209 if (rc) 1210 goto err; 1211 break; 1212 default: 1213 BUG(); 1214 } 1215 1216 platform_set_drvdata(ghes_dev, ghes); 1217 1218 ghes_edac_register(ghes, &ghes_dev->dev); 1219 1220 /* Handle any pending errors right away */ 1221 spin_lock_irqsave(&ghes_notify_lock_irq, flags); 1222 ghes_proc(ghes); 1223 spin_unlock_irqrestore(&ghes_notify_lock_irq, flags); 1224 1225 return 0; 1226 1227 err: 1228 if (ghes) { 1229 ghes_fini(ghes); 1230 kfree(ghes); 1231 } 1232 return rc; 1233 } 1234 1235 static int ghes_remove(struct platform_device *ghes_dev) 1236 { 1237 int rc; 1238 struct ghes *ghes; 1239 struct acpi_hest_generic *generic; 1240 1241 ghes = platform_get_drvdata(ghes_dev); 1242 generic = ghes->generic; 1243 1244 ghes->flags |= GHES_EXITING; 1245 switch (generic->notify.type) { 1246 case ACPI_HEST_NOTIFY_POLLED: 1247 del_timer_sync(&ghes->timer); 1248 break; 1249 case ACPI_HEST_NOTIFY_EXTERNAL: 1250 free_irq(ghes->irq, ghes); 1251 break; 1252 1253 case ACPI_HEST_NOTIFY_SCI: 1254 case ACPI_HEST_NOTIFY_GSIV: 1255 case ACPI_HEST_NOTIFY_GPIO: 1256 mutex_lock(&ghes_list_mutex); 1257 list_del_rcu(&ghes->list); 1258 if (list_empty(&ghes_hed)) 1259 unregister_acpi_hed_notifier(&ghes_notifier_hed); 1260 mutex_unlock(&ghes_list_mutex); 1261 synchronize_rcu(); 1262 break; 1263 1264 case ACPI_HEST_NOTIFY_SEA: 1265 ghes_sea_remove(ghes); 1266 break; 1267 case ACPI_HEST_NOTIFY_NMI: 1268 ghes_nmi_remove(ghes); 1269 break; 1270 case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED: 1271 rc = apei_sdei_unregister_ghes(ghes); 1272 if (rc) 1273 return rc; 1274 break; 1275 default: 1276 BUG(); 1277 break; 1278 } 1279 1280 ghes_fini(ghes); 1281 1282 ghes_edac_unregister(ghes); 1283 1284 kfree(ghes); 1285 1286 platform_set_drvdata(ghes_dev, NULL); 1287 1288 return 0; 1289 } 1290 1291 static struct platform_driver ghes_platform_driver = { 1292 .driver = { 1293 .name = "GHES", 1294 }, 1295 .probe = ghes_probe, 1296 .remove = ghes_remove, 1297 }; 1298 1299 static int __init ghes_init(void) 1300 { 1301 int rc; 1302 1303 if (acpi_disabled) 1304 return -ENODEV; 1305 1306 switch (hest_disable) { 1307 case HEST_NOT_FOUND: 1308 return -ENODEV; 1309 case HEST_DISABLED: 1310 pr_info(GHES_PFX "HEST is not enabled!\n"); 1311 return -EINVAL; 1312 default: 1313 break; 1314 } 1315 1316 if (ghes_disable) { 1317 pr_info(GHES_PFX "GHES is not enabled!\n"); 1318 return -EINVAL; 1319 } 1320 1321 ghes_nmi_init_cxt(); 1322 1323 rc = platform_driver_register(&ghes_platform_driver); 1324 if (rc) 1325 goto err; 1326 1327 rc = apei_osc_setup(); 1328 if (rc == 0 && osc_sb_apei_support_acked) 1329 pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit and WHEA _OSC.\n"); 1330 else if (rc == 0 && !osc_sb_apei_support_acked) 1331 pr_info(GHES_PFX "APEI firmware first mode is enabled by WHEA _OSC.\n"); 1332 else if (rc && osc_sb_apei_support_acked) 1333 pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit.\n"); 1334 else 1335 pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n"); 1336 1337 return 0; 1338 err: 1339 return rc; 1340 } 1341 device_initcall(ghes_init); 1342