xref: /linux/drivers/acpi/apei/ghes.c (revision 82c298100a2db7e4241e0fee73d94dc5ee573837)
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 __ghes_check_estatus(ghes, estatus);
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