xref: /openbmc/linux/drivers/acpi/apei/ghes.c (revision 360823a09426347ea8f232b0b0b5156d0aed0302)
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 #include <linux/task_work.h>
44 
45 #include <acpi/actbl1.h>
46 #include <acpi/ghes.h>
47 #include <acpi/apei.h>
48 #include <asm/fixmap.h>
49 #include <asm/tlbflush.h>
50 #include <ras/ras_event.h>
51 
52 #include "apei-internal.h"
53 
54 #define GHES_PFX	"GHES: "
55 
56 #define GHES_ESTATUS_MAX_SIZE		65536
57 #define GHES_ESOURCE_PREALLOC_MAX_SIZE	65536
58 
59 #define GHES_ESTATUS_POOL_MIN_ALLOC_ORDER 3
60 
61 /* This is just an estimation for memory pool allocation */
62 #define GHES_ESTATUS_CACHE_AVG_SIZE	512
63 
64 #define GHES_ESTATUS_CACHES_SIZE	4
65 
66 #define GHES_ESTATUS_IN_CACHE_MAX_NSEC	10000000000ULL
67 /* Prevent too many caches are allocated because of RCU */
68 #define GHES_ESTATUS_CACHE_ALLOCED_MAX	(GHES_ESTATUS_CACHES_SIZE * 3 / 2)
69 
70 #define GHES_ESTATUS_CACHE_LEN(estatus_len)			\
71 	(sizeof(struct ghes_estatus_cache) + (estatus_len))
72 #define GHES_ESTATUS_FROM_CACHE(estatus_cache)			\
73 	((struct acpi_hest_generic_status *)				\
74 	 ((struct ghes_estatus_cache *)(estatus_cache) + 1))
75 
76 #define GHES_ESTATUS_NODE_LEN(estatus_len)			\
77 	(sizeof(struct ghes_estatus_node) + (estatus_len))
78 #define GHES_ESTATUS_FROM_NODE(estatus_node)			\
79 	((struct acpi_hest_generic_status *)				\
80 	 ((struct ghes_estatus_node *)(estatus_node) + 1))
81 
82 #define GHES_VENDOR_ENTRY_LEN(gdata_len)                               \
83 	(sizeof(struct ghes_vendor_record_entry) + (gdata_len))
84 #define GHES_GDATA_FROM_VENDOR_ENTRY(vendor_entry)                     \
85 	((struct acpi_hest_generic_data *)                              \
86 	((struct ghes_vendor_record_entry *)(vendor_entry) + 1))
87 
88 /*
89  *  NMI-like notifications vary by architecture, before the compiler can prune
90  *  unused static functions it needs a value for these enums.
91  */
92 #ifndef CONFIG_ARM_SDE_INTERFACE
93 #define FIX_APEI_GHES_SDEI_NORMAL	__end_of_fixed_addresses
94 #define FIX_APEI_GHES_SDEI_CRITICAL	__end_of_fixed_addresses
95 #endif
96 
97 static ATOMIC_NOTIFIER_HEAD(ghes_report_chain);
98 
is_hest_type_generic_v2(struct ghes * ghes)99 static inline bool is_hest_type_generic_v2(struct ghes *ghes)
100 {
101 	return ghes->generic->header.type == ACPI_HEST_TYPE_GENERIC_ERROR_V2;
102 }
103 
104 /*
105  * A platform may describe one error source for the handling of synchronous
106  * errors (e.g. MCE or SEA), or for handling asynchronous errors (e.g. SCI
107  * or External Interrupt). On x86, the HEST notifications are always
108  * asynchronous, so only SEA on ARM is delivered as a synchronous
109  * notification.
110  */
is_hest_sync_notify(struct ghes * ghes)111 static inline bool is_hest_sync_notify(struct ghes *ghes)
112 {
113 	u8 notify_type = ghes->generic->notify.type;
114 
115 	return notify_type == ACPI_HEST_NOTIFY_SEA;
116 }
117 
118 /*
119  * This driver isn't really modular, however for the time being,
120  * continuing to use module_param is the easiest way to remain
121  * compatible with existing boot arg use cases.
122  */
123 bool ghes_disable;
124 module_param_named(disable, ghes_disable, bool, 0);
125 
126 /*
127  * "ghes.edac_force_enable" forcibly enables ghes_edac and skips the platform
128  * check.
129  */
130 static bool ghes_edac_force_enable;
131 module_param_named(edac_force_enable, ghes_edac_force_enable, bool, 0);
132 
133 /*
134  * All error sources notified with HED (Hardware Error Device) share a
135  * single notifier callback, so they need to be linked and checked one
136  * by one. This holds true for NMI too.
137  *
138  * RCU is used for these lists, so ghes_list_mutex is only used for
139  * list changing, not for traversing.
140  */
141 static LIST_HEAD(ghes_hed);
142 static DEFINE_MUTEX(ghes_list_mutex);
143 
144 /*
145  * A list of GHES devices which are given to the corresponding EDAC driver
146  * ghes_edac for further use.
147  */
148 static LIST_HEAD(ghes_devs);
149 static DEFINE_MUTEX(ghes_devs_mutex);
150 
151 /*
152  * Because the memory area used to transfer hardware error information
153  * from BIOS to Linux can be determined only in NMI, IRQ or timer
154  * handler, but general ioremap can not be used in atomic context, so
155  * the fixmap is used instead.
156  *
157  * This spinlock is used to prevent the fixmap entry from being used
158  * simultaneously.
159  */
160 static DEFINE_SPINLOCK(ghes_notify_lock_irq);
161 
162 struct ghes_vendor_record_entry {
163 	struct work_struct work;
164 	int error_severity;
165 	char vendor_record[];
166 };
167 
168 static struct gen_pool *ghes_estatus_pool;
169 
170 static struct ghes_estatus_cache __rcu *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE];
171 static atomic_t ghes_estatus_cache_alloced;
172 
ghes_map(u64 pfn,enum fixed_addresses fixmap_idx)173 static void __iomem *ghes_map(u64 pfn, enum fixed_addresses fixmap_idx)
174 {
175 	phys_addr_t paddr;
176 	pgprot_t prot;
177 
178 	paddr = PFN_PHYS(pfn);
179 	prot = arch_apei_get_mem_attribute(paddr);
180 	__set_fixmap(fixmap_idx, paddr, prot);
181 
182 	return (void __iomem *) __fix_to_virt(fixmap_idx);
183 }
184 
ghes_unmap(void __iomem * vaddr,enum fixed_addresses fixmap_idx)185 static void ghes_unmap(void __iomem *vaddr, enum fixed_addresses fixmap_idx)
186 {
187 	int _idx = virt_to_fix((unsigned long)vaddr);
188 
189 	WARN_ON_ONCE(fixmap_idx != _idx);
190 	clear_fixmap(fixmap_idx);
191 }
192 
ghes_estatus_pool_init(unsigned int num_ghes)193 int ghes_estatus_pool_init(unsigned int num_ghes)
194 {
195 	unsigned long addr, len;
196 	int rc;
197 
198 	ghes_estatus_pool = gen_pool_create(GHES_ESTATUS_POOL_MIN_ALLOC_ORDER, -1);
199 	if (!ghes_estatus_pool)
200 		return -ENOMEM;
201 
202 	len = GHES_ESTATUS_CACHE_AVG_SIZE * GHES_ESTATUS_CACHE_ALLOCED_MAX;
203 	len += (num_ghes * GHES_ESOURCE_PREALLOC_MAX_SIZE);
204 
205 	addr = (unsigned long)vmalloc(PAGE_ALIGN(len));
206 	if (!addr)
207 		goto err_pool_alloc;
208 
209 	rc = gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1);
210 	if (rc)
211 		goto err_pool_add;
212 
213 	return 0;
214 
215 err_pool_add:
216 	vfree((void *)addr);
217 
218 err_pool_alloc:
219 	gen_pool_destroy(ghes_estatus_pool);
220 
221 	return -ENOMEM;
222 }
223 
224 /**
225  * ghes_estatus_pool_region_free - free previously allocated memory
226  *				   from the ghes_estatus_pool.
227  * @addr: address of memory to free.
228  * @size: size of memory to free.
229  *
230  * Returns none.
231  */
ghes_estatus_pool_region_free(unsigned long addr,u32 size)232 void ghes_estatus_pool_region_free(unsigned long addr, u32 size)
233 {
234 	gen_pool_free(ghes_estatus_pool, addr, size);
235 }
236 EXPORT_SYMBOL_GPL(ghes_estatus_pool_region_free);
237 
map_gen_v2(struct ghes * ghes)238 static int map_gen_v2(struct ghes *ghes)
239 {
240 	return apei_map_generic_address(&ghes->generic_v2->read_ack_register);
241 }
242 
unmap_gen_v2(struct ghes * ghes)243 static void unmap_gen_v2(struct ghes *ghes)
244 {
245 	apei_unmap_generic_address(&ghes->generic_v2->read_ack_register);
246 }
247 
ghes_ack_error(struct acpi_hest_generic_v2 * gv2)248 static void ghes_ack_error(struct acpi_hest_generic_v2 *gv2)
249 {
250 	int rc;
251 	u64 val = 0;
252 
253 	rc = apei_read(&val, &gv2->read_ack_register);
254 	if (rc)
255 		return;
256 
257 	val &= gv2->read_ack_preserve << gv2->read_ack_register.bit_offset;
258 	val |= gv2->read_ack_write    << gv2->read_ack_register.bit_offset;
259 
260 	apei_write(val, &gv2->read_ack_register);
261 }
262 
ghes_new(struct acpi_hest_generic * generic)263 static struct ghes *ghes_new(struct acpi_hest_generic *generic)
264 {
265 	struct ghes *ghes;
266 	unsigned int error_block_length;
267 	int rc;
268 
269 	ghes = kzalloc(sizeof(*ghes), GFP_KERNEL);
270 	if (!ghes)
271 		return ERR_PTR(-ENOMEM);
272 
273 	ghes->generic = generic;
274 	if (is_hest_type_generic_v2(ghes)) {
275 		rc = map_gen_v2(ghes);
276 		if (rc)
277 			goto err_free;
278 	}
279 
280 	rc = apei_map_generic_address(&generic->error_status_address);
281 	if (rc)
282 		goto err_unmap_read_ack_addr;
283 	error_block_length = generic->error_block_length;
284 	if (error_block_length > GHES_ESTATUS_MAX_SIZE) {
285 		pr_warn(FW_WARN GHES_PFX
286 			"Error status block length is too long: %u for "
287 			"generic hardware error source: %d.\n",
288 			error_block_length, generic->header.source_id);
289 		error_block_length = GHES_ESTATUS_MAX_SIZE;
290 	}
291 	ghes->estatus = kmalloc(error_block_length, GFP_KERNEL);
292 	if (!ghes->estatus) {
293 		rc = -ENOMEM;
294 		goto err_unmap_status_addr;
295 	}
296 
297 	return ghes;
298 
299 err_unmap_status_addr:
300 	apei_unmap_generic_address(&generic->error_status_address);
301 err_unmap_read_ack_addr:
302 	if (is_hest_type_generic_v2(ghes))
303 		unmap_gen_v2(ghes);
304 err_free:
305 	kfree(ghes);
306 	return ERR_PTR(rc);
307 }
308 
ghes_fini(struct ghes * ghes)309 static void ghes_fini(struct ghes *ghes)
310 {
311 	kfree(ghes->estatus);
312 	apei_unmap_generic_address(&ghes->generic->error_status_address);
313 	if (is_hest_type_generic_v2(ghes))
314 		unmap_gen_v2(ghes);
315 }
316 
ghes_severity(int severity)317 static inline int ghes_severity(int severity)
318 {
319 	switch (severity) {
320 	case CPER_SEV_INFORMATIONAL:
321 		return GHES_SEV_NO;
322 	case CPER_SEV_CORRECTED:
323 		return GHES_SEV_CORRECTED;
324 	case CPER_SEV_RECOVERABLE:
325 		return GHES_SEV_RECOVERABLE;
326 	case CPER_SEV_FATAL:
327 		return GHES_SEV_PANIC;
328 	default:
329 		/* Unknown, go panic */
330 		return GHES_SEV_PANIC;
331 	}
332 }
333 
ghes_copy_tofrom_phys(void * buffer,u64 paddr,u32 len,int from_phys,enum fixed_addresses fixmap_idx)334 static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len,
335 				  int from_phys,
336 				  enum fixed_addresses fixmap_idx)
337 {
338 	void __iomem *vaddr;
339 	u64 offset;
340 	u32 trunk;
341 
342 	while (len > 0) {
343 		offset = paddr - (paddr & PAGE_MASK);
344 		vaddr = ghes_map(PHYS_PFN(paddr), fixmap_idx);
345 		trunk = PAGE_SIZE - offset;
346 		trunk = min(trunk, len);
347 		if (from_phys)
348 			memcpy_fromio(buffer, vaddr + offset, trunk);
349 		else
350 			memcpy_toio(vaddr + offset, buffer, trunk);
351 		len -= trunk;
352 		paddr += trunk;
353 		buffer += trunk;
354 		ghes_unmap(vaddr, fixmap_idx);
355 	}
356 }
357 
358 /* Check the top-level record header has an appropriate size. */
__ghes_check_estatus(struct ghes * ghes,struct acpi_hest_generic_status * estatus)359 static int __ghes_check_estatus(struct ghes *ghes,
360 				struct acpi_hest_generic_status *estatus)
361 {
362 	u32 len = cper_estatus_len(estatus);
363 
364 	if (len < sizeof(*estatus)) {
365 		pr_warn_ratelimited(FW_WARN GHES_PFX "Truncated error status block!\n");
366 		return -EIO;
367 	}
368 
369 	if (len > ghes->generic->error_block_length) {
370 		pr_warn_ratelimited(FW_WARN GHES_PFX "Invalid error status block length!\n");
371 		return -EIO;
372 	}
373 
374 	if (cper_estatus_check_header(estatus)) {
375 		pr_warn_ratelimited(FW_WARN GHES_PFX "Invalid CPER header!\n");
376 		return -EIO;
377 	}
378 
379 	return 0;
380 }
381 
382 /* Read the CPER block, returning its address, and header in estatus. */
__ghes_peek_estatus(struct ghes * ghes,struct acpi_hest_generic_status * estatus,u64 * buf_paddr,enum fixed_addresses fixmap_idx)383 static int __ghes_peek_estatus(struct ghes *ghes,
384 			       struct acpi_hest_generic_status *estatus,
385 			       u64 *buf_paddr, enum fixed_addresses fixmap_idx)
386 {
387 	struct acpi_hest_generic *g = ghes->generic;
388 	int rc;
389 
390 	rc = apei_read(buf_paddr, &g->error_status_address);
391 	if (rc) {
392 		*buf_paddr = 0;
393 		pr_warn_ratelimited(FW_WARN GHES_PFX
394 "Failed to read error status block address for hardware error source: %d.\n",
395 				   g->header.source_id);
396 		return -EIO;
397 	}
398 	if (!*buf_paddr)
399 		return -ENOENT;
400 
401 	ghes_copy_tofrom_phys(estatus, *buf_paddr, sizeof(*estatus), 1,
402 			      fixmap_idx);
403 	if (!estatus->block_status) {
404 		*buf_paddr = 0;
405 		return -ENOENT;
406 	}
407 
408 	return 0;
409 }
410 
__ghes_read_estatus(struct acpi_hest_generic_status * estatus,u64 buf_paddr,enum fixed_addresses fixmap_idx,size_t buf_len)411 static int __ghes_read_estatus(struct acpi_hest_generic_status *estatus,
412 			       u64 buf_paddr, enum fixed_addresses fixmap_idx,
413 			       size_t buf_len)
414 {
415 	ghes_copy_tofrom_phys(estatus, buf_paddr, buf_len, 1, fixmap_idx);
416 	if (cper_estatus_check(estatus)) {
417 		pr_warn_ratelimited(FW_WARN GHES_PFX
418 				    "Failed to read error status block!\n");
419 		return -EIO;
420 	}
421 
422 	return 0;
423 }
424 
ghes_read_estatus(struct ghes * ghes,struct acpi_hest_generic_status * estatus,u64 * buf_paddr,enum fixed_addresses fixmap_idx)425 static int ghes_read_estatus(struct ghes *ghes,
426 			     struct acpi_hest_generic_status *estatus,
427 			     u64 *buf_paddr, enum fixed_addresses fixmap_idx)
428 {
429 	int rc;
430 
431 	rc = __ghes_peek_estatus(ghes, estatus, buf_paddr, fixmap_idx);
432 	if (rc)
433 		return rc;
434 
435 	rc = __ghes_check_estatus(ghes, estatus);
436 	if (rc)
437 		return rc;
438 
439 	return __ghes_read_estatus(estatus, *buf_paddr, fixmap_idx,
440 				   cper_estatus_len(estatus));
441 }
442 
ghes_clear_estatus(struct ghes * ghes,struct acpi_hest_generic_status * estatus,u64 buf_paddr,enum fixed_addresses fixmap_idx)443 static void ghes_clear_estatus(struct ghes *ghes,
444 			       struct acpi_hest_generic_status *estatus,
445 			       u64 buf_paddr, enum fixed_addresses fixmap_idx)
446 {
447 	estatus->block_status = 0;
448 
449 	if (!buf_paddr)
450 		return;
451 
452 	ghes_copy_tofrom_phys(estatus, buf_paddr,
453 			      sizeof(estatus->block_status), 0,
454 			      fixmap_idx);
455 
456 	/*
457 	 * GHESv2 type HEST entries introduce support for error acknowledgment,
458 	 * so only acknowledge the error if this support is present.
459 	 */
460 	if (is_hest_type_generic_v2(ghes))
461 		ghes_ack_error(ghes->generic_v2);
462 }
463 
464 /*
465  * Called as task_work before returning to user-space.
466  * Ensure any queued work has been done before we return to the context that
467  * triggered the notification.
468  */
ghes_kick_task_work(struct callback_head * head)469 static void ghes_kick_task_work(struct callback_head *head)
470 {
471 	struct acpi_hest_generic_status *estatus;
472 	struct ghes_estatus_node *estatus_node;
473 	u32 node_len;
474 
475 	estatus_node = container_of(head, struct ghes_estatus_node, task_work);
476 	if (IS_ENABLED(CONFIG_ACPI_APEI_MEMORY_FAILURE))
477 		memory_failure_queue_kick(estatus_node->task_work_cpu);
478 
479 	estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
480 	node_len = GHES_ESTATUS_NODE_LEN(cper_estatus_len(estatus));
481 	gen_pool_free(ghes_estatus_pool, (unsigned long)estatus_node, node_len);
482 }
483 
ghes_do_memory_failure(u64 physical_addr,int flags)484 static bool ghes_do_memory_failure(u64 physical_addr, int flags)
485 {
486 	unsigned long pfn;
487 
488 	if (!IS_ENABLED(CONFIG_ACPI_APEI_MEMORY_FAILURE))
489 		return false;
490 
491 	pfn = PHYS_PFN(physical_addr);
492 	if (!pfn_valid(pfn) && !arch_is_platform_page(physical_addr)) {
493 		pr_warn_ratelimited(FW_WARN GHES_PFX
494 		"Invalid address in generic error data: %#llx\n",
495 		physical_addr);
496 		return false;
497 	}
498 
499 	memory_failure_queue(pfn, flags);
500 	return true;
501 }
502 
ghes_handle_memory_failure(struct acpi_hest_generic_data * gdata,int sev,bool sync)503 static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata,
504 				       int sev, bool sync)
505 {
506 	int flags = -1;
507 	int sec_sev = ghes_severity(gdata->error_severity);
508 	struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);
509 
510 	if (!(mem_err->validation_bits & CPER_MEM_VALID_PA))
511 		return false;
512 
513 	/* iff following two events can be handled properly by now */
514 	if (sec_sev == GHES_SEV_CORRECTED &&
515 	    (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED))
516 		flags = MF_SOFT_OFFLINE;
517 	if (sev == GHES_SEV_RECOVERABLE && sec_sev == GHES_SEV_RECOVERABLE)
518 		flags = sync ? MF_ACTION_REQUIRED : 0;
519 
520 	if (flags != -1)
521 		return ghes_do_memory_failure(mem_err->physical_addr, flags);
522 
523 	return false;
524 }
525 
ghes_handle_arm_hw_error(struct acpi_hest_generic_data * gdata,int sev,bool sync)526 static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,
527 				       int sev, bool sync)
528 {
529 	struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
530 	int flags = sync ? MF_ACTION_REQUIRED : 0;
531 	bool queued = false;
532 	int sec_sev, i;
533 	char *p;
534 
535 	log_arm_hw_error(err);
536 
537 	sec_sev = ghes_severity(gdata->error_severity);
538 	if (sev != GHES_SEV_RECOVERABLE || sec_sev != GHES_SEV_RECOVERABLE)
539 		return false;
540 
541 	p = (char *)(err + 1);
542 	for (i = 0; i < err->err_info_num; i++) {
543 		struct cper_arm_err_info *err_info = (struct cper_arm_err_info *)p;
544 		bool is_cache = (err_info->type == CPER_ARM_CACHE_ERROR);
545 		bool has_pa = (err_info->validation_bits & CPER_ARM_INFO_VALID_PHYSICAL_ADDR);
546 		const char *error_type = "unknown error";
547 
548 		/*
549 		 * The field (err_info->error_info & BIT(26)) is fixed to set to
550 		 * 1 in some old firmware of HiSilicon Kunpeng920. We assume that
551 		 * firmware won't mix corrected errors in an uncorrected section,
552 		 * and don't filter out 'corrected' error here.
553 		 */
554 		if (is_cache && has_pa) {
555 			queued = ghes_do_memory_failure(err_info->physical_fault_addr, flags);
556 			p += err_info->length;
557 			continue;
558 		}
559 
560 		if (err_info->type < ARRAY_SIZE(cper_proc_error_type_strs))
561 			error_type = cper_proc_error_type_strs[err_info->type];
562 
563 		pr_warn_ratelimited(FW_WARN GHES_PFX
564 				    "Unhandled processor error type: %s\n",
565 				    error_type);
566 		p += err_info->length;
567 	}
568 
569 	return queued;
570 }
571 
572 /*
573  * PCIe AER errors need to be sent to the AER driver for reporting and
574  * recovery. The GHES severities map to the following AER severities and
575  * require the following handling:
576  *
577  * GHES_SEV_CORRECTABLE -> AER_CORRECTABLE
578  *     These need to be reported by the AER driver but no recovery is
579  *     necessary.
580  * GHES_SEV_RECOVERABLE -> AER_NONFATAL
581  * GHES_SEV_RECOVERABLE && CPER_SEC_RESET -> AER_FATAL
582  *     These both need to be reported and recovered from by the AER driver.
583  * GHES_SEV_PANIC does not make it to this handling since the kernel must
584  *     panic.
585  */
ghes_handle_aer(struct acpi_hest_generic_data * gdata)586 static void ghes_handle_aer(struct acpi_hest_generic_data *gdata)
587 {
588 #ifdef CONFIG_ACPI_APEI_PCIEAER
589 	struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
590 
591 	if (pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
592 	    pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
593 		unsigned int devfn;
594 		int aer_severity;
595 		u8 *aer_info;
596 
597 		devfn = PCI_DEVFN(pcie_err->device_id.device,
598 				  pcie_err->device_id.function);
599 		aer_severity = cper_severity_to_aer(gdata->error_severity);
600 
601 		/*
602 		 * If firmware reset the component to contain
603 		 * the error, we must reinitialize it before
604 		 * use, so treat it as a fatal AER error.
605 		 */
606 		if (gdata->flags & CPER_SEC_RESET)
607 			aer_severity = AER_FATAL;
608 
609 		aer_info = (void *)gen_pool_alloc(ghes_estatus_pool,
610 						  sizeof(struct aer_capability_regs));
611 		if (!aer_info)
612 			return;
613 		memcpy(aer_info, pcie_err->aer_info, sizeof(struct aer_capability_regs));
614 
615 		aer_recover_queue(pcie_err->device_id.segment,
616 				  pcie_err->device_id.bus,
617 				  devfn, aer_severity,
618 				  (struct aer_capability_regs *)
619 				  aer_info);
620 	}
621 #endif
622 }
623 
624 static BLOCKING_NOTIFIER_HEAD(vendor_record_notify_list);
625 
ghes_register_vendor_record_notifier(struct notifier_block * nb)626 int ghes_register_vendor_record_notifier(struct notifier_block *nb)
627 {
628 	return blocking_notifier_chain_register(&vendor_record_notify_list, nb);
629 }
630 EXPORT_SYMBOL_GPL(ghes_register_vendor_record_notifier);
631 
ghes_unregister_vendor_record_notifier(struct notifier_block * nb)632 void ghes_unregister_vendor_record_notifier(struct notifier_block *nb)
633 {
634 	blocking_notifier_chain_unregister(&vendor_record_notify_list, nb);
635 }
636 EXPORT_SYMBOL_GPL(ghes_unregister_vendor_record_notifier);
637 
ghes_vendor_record_work_func(struct work_struct * work)638 static void ghes_vendor_record_work_func(struct work_struct *work)
639 {
640 	struct ghes_vendor_record_entry *entry;
641 	struct acpi_hest_generic_data *gdata;
642 	u32 len;
643 
644 	entry = container_of(work, struct ghes_vendor_record_entry, work);
645 	gdata = GHES_GDATA_FROM_VENDOR_ENTRY(entry);
646 
647 	blocking_notifier_call_chain(&vendor_record_notify_list,
648 				     entry->error_severity, gdata);
649 
650 	len = GHES_VENDOR_ENTRY_LEN(acpi_hest_get_record_size(gdata));
651 	gen_pool_free(ghes_estatus_pool, (unsigned long)entry, len);
652 }
653 
ghes_defer_non_standard_event(struct acpi_hest_generic_data * gdata,int sev)654 static void ghes_defer_non_standard_event(struct acpi_hest_generic_data *gdata,
655 					  int sev)
656 {
657 	struct acpi_hest_generic_data *copied_gdata;
658 	struct ghes_vendor_record_entry *entry;
659 	u32 len;
660 
661 	len = GHES_VENDOR_ENTRY_LEN(acpi_hest_get_record_size(gdata));
662 	entry = (void *)gen_pool_alloc(ghes_estatus_pool, len);
663 	if (!entry)
664 		return;
665 
666 	copied_gdata = GHES_GDATA_FROM_VENDOR_ENTRY(entry);
667 	memcpy(copied_gdata, gdata, acpi_hest_get_record_size(gdata));
668 	entry->error_severity = sev;
669 
670 	INIT_WORK(&entry->work, ghes_vendor_record_work_func);
671 	schedule_work(&entry->work);
672 }
673 
ghes_do_proc(struct ghes * ghes,const struct acpi_hest_generic_status * estatus)674 static bool ghes_do_proc(struct ghes *ghes,
675 			 const struct acpi_hest_generic_status *estatus)
676 {
677 	int sev, sec_sev;
678 	struct acpi_hest_generic_data *gdata;
679 	guid_t *sec_type;
680 	const guid_t *fru_id = &guid_null;
681 	char *fru_text = "";
682 	bool queued = false;
683 	bool sync = is_hest_sync_notify(ghes);
684 
685 	sev = ghes_severity(estatus->error_severity);
686 	apei_estatus_for_each_section(estatus, gdata) {
687 		sec_type = (guid_t *)gdata->section_type;
688 		sec_sev = ghes_severity(gdata->error_severity);
689 		if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID)
690 			fru_id = (guid_t *)gdata->fru_id;
691 
692 		if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)
693 			fru_text = gdata->fru_text;
694 
695 		if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) {
696 			struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);
697 
698 			atomic_notifier_call_chain(&ghes_report_chain, sev, mem_err);
699 
700 			arch_apei_report_mem_error(sev, mem_err);
701 			queued = ghes_handle_memory_failure(gdata, sev, sync);
702 		}
703 		else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
704 			ghes_handle_aer(gdata);
705 		}
706 		else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
707 			queued = ghes_handle_arm_hw_error(gdata, sev, sync);
708 		} else {
709 			void *err = acpi_hest_get_payload(gdata);
710 
711 			ghes_defer_non_standard_event(gdata, sev);
712 			log_non_standard_event(sec_type, fru_id, fru_text,
713 					       sec_sev, err,
714 					       gdata->error_data_length);
715 		}
716 	}
717 
718 	return queued;
719 }
720 
__ghes_print_estatus(const char * pfx,const struct acpi_hest_generic * generic,const struct acpi_hest_generic_status * estatus)721 static void __ghes_print_estatus(const char *pfx,
722 				 const struct acpi_hest_generic *generic,
723 				 const struct acpi_hest_generic_status *estatus)
724 {
725 	static atomic_t seqno;
726 	unsigned int curr_seqno;
727 	char pfx_seq[64];
728 
729 	if (pfx == NULL) {
730 		if (ghes_severity(estatus->error_severity) <=
731 		    GHES_SEV_CORRECTED)
732 			pfx = KERN_WARNING;
733 		else
734 			pfx = KERN_ERR;
735 	}
736 	curr_seqno = atomic_inc_return(&seqno);
737 	snprintf(pfx_seq, sizeof(pfx_seq), "%s{%u}" HW_ERR, pfx, curr_seqno);
738 	printk("%s""Hardware error from APEI Generic Hardware Error Source: %d\n",
739 	       pfx_seq, generic->header.source_id);
740 	cper_estatus_print(pfx_seq, estatus);
741 }
742 
ghes_print_estatus(const char * pfx,const struct acpi_hest_generic * generic,const struct acpi_hest_generic_status * estatus)743 static int ghes_print_estatus(const char *pfx,
744 			      const struct acpi_hest_generic *generic,
745 			      const struct acpi_hest_generic_status *estatus)
746 {
747 	/* Not more than 2 messages every 5 seconds */
748 	static DEFINE_RATELIMIT_STATE(ratelimit_corrected, 5*HZ, 2);
749 	static DEFINE_RATELIMIT_STATE(ratelimit_uncorrected, 5*HZ, 2);
750 	struct ratelimit_state *ratelimit;
751 
752 	if (ghes_severity(estatus->error_severity) <= GHES_SEV_CORRECTED)
753 		ratelimit = &ratelimit_corrected;
754 	else
755 		ratelimit = &ratelimit_uncorrected;
756 	if (__ratelimit(ratelimit)) {
757 		__ghes_print_estatus(pfx, generic, estatus);
758 		return 1;
759 	}
760 	return 0;
761 }
762 
763 /*
764  * GHES error status reporting throttle, to report more kinds of
765  * errors, instead of just most frequently occurred errors.
766  */
ghes_estatus_cached(struct acpi_hest_generic_status * estatus)767 static int ghes_estatus_cached(struct acpi_hest_generic_status *estatus)
768 {
769 	u32 len;
770 	int i, cached = 0;
771 	unsigned long long now;
772 	struct ghes_estatus_cache *cache;
773 	struct acpi_hest_generic_status *cache_estatus;
774 
775 	len = cper_estatus_len(estatus);
776 	rcu_read_lock();
777 	for (i = 0; i < GHES_ESTATUS_CACHES_SIZE; i++) {
778 		cache = rcu_dereference(ghes_estatus_caches[i]);
779 		if (cache == NULL)
780 			continue;
781 		if (len != cache->estatus_len)
782 			continue;
783 		cache_estatus = GHES_ESTATUS_FROM_CACHE(cache);
784 		if (memcmp(estatus, cache_estatus, len))
785 			continue;
786 		atomic_inc(&cache->count);
787 		now = sched_clock();
788 		if (now - cache->time_in < GHES_ESTATUS_IN_CACHE_MAX_NSEC)
789 			cached = 1;
790 		break;
791 	}
792 	rcu_read_unlock();
793 	return cached;
794 }
795 
ghes_estatus_cache_alloc(struct acpi_hest_generic * generic,struct acpi_hest_generic_status * estatus)796 static struct ghes_estatus_cache *ghes_estatus_cache_alloc(
797 	struct acpi_hest_generic *generic,
798 	struct acpi_hest_generic_status *estatus)
799 {
800 	int alloced;
801 	u32 len, cache_len;
802 	struct ghes_estatus_cache *cache;
803 	struct acpi_hest_generic_status *cache_estatus;
804 
805 	alloced = atomic_add_return(1, &ghes_estatus_cache_alloced);
806 	if (alloced > GHES_ESTATUS_CACHE_ALLOCED_MAX) {
807 		atomic_dec(&ghes_estatus_cache_alloced);
808 		return NULL;
809 	}
810 	len = cper_estatus_len(estatus);
811 	cache_len = GHES_ESTATUS_CACHE_LEN(len);
812 	cache = (void *)gen_pool_alloc(ghes_estatus_pool, cache_len);
813 	if (!cache) {
814 		atomic_dec(&ghes_estatus_cache_alloced);
815 		return NULL;
816 	}
817 	cache_estatus = GHES_ESTATUS_FROM_CACHE(cache);
818 	memcpy(cache_estatus, estatus, len);
819 	cache->estatus_len = len;
820 	atomic_set(&cache->count, 0);
821 	cache->generic = generic;
822 	cache->time_in = sched_clock();
823 	return cache;
824 }
825 
ghes_estatus_cache_rcu_free(struct rcu_head * head)826 static void ghes_estatus_cache_rcu_free(struct rcu_head *head)
827 {
828 	struct ghes_estatus_cache *cache;
829 	u32 len;
830 
831 	cache = container_of(head, struct ghes_estatus_cache, rcu);
832 	len = cper_estatus_len(GHES_ESTATUS_FROM_CACHE(cache));
833 	len = GHES_ESTATUS_CACHE_LEN(len);
834 	gen_pool_free(ghes_estatus_pool, (unsigned long)cache, len);
835 	atomic_dec(&ghes_estatus_cache_alloced);
836 }
837 
838 static void
ghes_estatus_cache_add(struct acpi_hest_generic * generic,struct acpi_hest_generic_status * estatus)839 ghes_estatus_cache_add(struct acpi_hest_generic *generic,
840 		       struct acpi_hest_generic_status *estatus)
841 {
842 	unsigned long long now, duration, period, max_period = 0;
843 	struct ghes_estatus_cache *cache, *new_cache;
844 	struct ghes_estatus_cache __rcu *victim;
845 	int i, slot = -1, count;
846 
847 	new_cache = ghes_estatus_cache_alloc(generic, estatus);
848 	if (!new_cache)
849 		return;
850 
851 	rcu_read_lock();
852 	now = sched_clock();
853 	for (i = 0; i < GHES_ESTATUS_CACHES_SIZE; i++) {
854 		cache = rcu_dereference(ghes_estatus_caches[i]);
855 		if (cache == NULL) {
856 			slot = i;
857 			break;
858 		}
859 		duration = now - cache->time_in;
860 		if (duration >= GHES_ESTATUS_IN_CACHE_MAX_NSEC) {
861 			slot = i;
862 			break;
863 		}
864 		count = atomic_read(&cache->count);
865 		period = duration;
866 		do_div(period, (count + 1));
867 		if (period > max_period) {
868 			max_period = period;
869 			slot = i;
870 		}
871 	}
872 	rcu_read_unlock();
873 
874 	if (slot != -1) {
875 		/*
876 		 * Use release semantics to ensure that ghes_estatus_cached()
877 		 * running on another CPU will see the updated cache fields if
878 		 * it can see the new value of the pointer.
879 		 */
880 		victim = xchg_release(&ghes_estatus_caches[slot],
881 				      RCU_INITIALIZER(new_cache));
882 
883 		/*
884 		 * At this point, victim may point to a cached item different
885 		 * from the one based on which we selected the slot. Instead of
886 		 * going to the loop again to pick another slot, let's just
887 		 * drop the other item anyway: this may cause a false cache
888 		 * miss later on, but that won't cause any problems.
889 		 */
890 		if (victim)
891 			call_rcu(&unrcu_pointer(victim)->rcu,
892 				 ghes_estatus_cache_rcu_free);
893 	}
894 }
895 
__ghes_panic(struct ghes * ghes,struct acpi_hest_generic_status * estatus,u64 buf_paddr,enum fixed_addresses fixmap_idx)896 static void __ghes_panic(struct ghes *ghes,
897 			 struct acpi_hest_generic_status *estatus,
898 			 u64 buf_paddr, enum fixed_addresses fixmap_idx)
899 {
900 	const char *msg = GHES_PFX "Fatal hardware error";
901 
902 	__ghes_print_estatus(KERN_EMERG, ghes->generic, estatus);
903 
904 	ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx);
905 
906 	if (!panic_timeout)
907 		pr_emerg("%s but panic disabled\n", msg);
908 
909 	panic(msg);
910 }
911 
ghes_proc(struct ghes * ghes)912 static int ghes_proc(struct ghes *ghes)
913 {
914 	struct acpi_hest_generic_status *estatus = ghes->estatus;
915 	u64 buf_paddr;
916 	int rc;
917 
918 	rc = ghes_read_estatus(ghes, estatus, &buf_paddr, FIX_APEI_GHES_IRQ);
919 	if (rc)
920 		goto out;
921 
922 	if (ghes_severity(estatus->error_severity) >= GHES_SEV_PANIC)
923 		__ghes_panic(ghes, estatus, buf_paddr, FIX_APEI_GHES_IRQ);
924 
925 	if (!ghes_estatus_cached(estatus)) {
926 		if (ghes_print_estatus(NULL, ghes->generic, estatus))
927 			ghes_estatus_cache_add(ghes->generic, estatus);
928 	}
929 	ghes_do_proc(ghes, estatus);
930 
931 out:
932 	ghes_clear_estatus(ghes, estatus, buf_paddr, FIX_APEI_GHES_IRQ);
933 
934 	return rc;
935 }
936 
ghes_add_timer(struct ghes * ghes)937 static void ghes_add_timer(struct ghes *ghes)
938 {
939 	struct acpi_hest_generic *g = ghes->generic;
940 	unsigned long expire;
941 
942 	if (!g->notify.poll_interval) {
943 		pr_warn(FW_WARN GHES_PFX "Poll interval is 0 for generic hardware error source: %d, disabled.\n",
944 			g->header.source_id);
945 		return;
946 	}
947 	expire = jiffies + msecs_to_jiffies(g->notify.poll_interval);
948 	ghes->timer.expires = round_jiffies_relative(expire);
949 	add_timer(&ghes->timer);
950 }
951 
ghes_poll_func(struct timer_list * t)952 static void ghes_poll_func(struct timer_list *t)
953 {
954 	struct ghes *ghes = from_timer(ghes, t, timer);
955 	unsigned long flags;
956 
957 	spin_lock_irqsave(&ghes_notify_lock_irq, flags);
958 	ghes_proc(ghes);
959 	spin_unlock_irqrestore(&ghes_notify_lock_irq, flags);
960 	if (!(ghes->flags & GHES_EXITING))
961 		ghes_add_timer(ghes);
962 }
963 
ghes_irq_func(int irq,void * data)964 static irqreturn_t ghes_irq_func(int irq, void *data)
965 {
966 	struct ghes *ghes = data;
967 	unsigned long flags;
968 	int rc;
969 
970 	spin_lock_irqsave(&ghes_notify_lock_irq, flags);
971 	rc = ghes_proc(ghes);
972 	spin_unlock_irqrestore(&ghes_notify_lock_irq, flags);
973 	if (rc)
974 		return IRQ_NONE;
975 
976 	return IRQ_HANDLED;
977 }
978 
ghes_notify_hed(struct notifier_block * this,unsigned long event,void * data)979 static int ghes_notify_hed(struct notifier_block *this, unsigned long event,
980 			   void *data)
981 {
982 	struct ghes *ghes;
983 	unsigned long flags;
984 	int ret = NOTIFY_DONE;
985 
986 	spin_lock_irqsave(&ghes_notify_lock_irq, flags);
987 	rcu_read_lock();
988 	list_for_each_entry_rcu(ghes, &ghes_hed, list) {
989 		if (!ghes_proc(ghes))
990 			ret = NOTIFY_OK;
991 	}
992 	rcu_read_unlock();
993 	spin_unlock_irqrestore(&ghes_notify_lock_irq, flags);
994 
995 	return ret;
996 }
997 
998 static struct notifier_block ghes_notifier_hed = {
999 	.notifier_call = ghes_notify_hed,
1000 };
1001 
1002 /*
1003  * Handlers for CPER records may not be NMI safe. For example,
1004  * memory_failure_queue() takes spinlocks and calls schedule_work_on().
1005  * In any NMI-like handler, memory from ghes_estatus_pool is used to save
1006  * estatus, and added to the ghes_estatus_llist. irq_work_queue() causes
1007  * ghes_proc_in_irq() to run in IRQ context where each estatus in
1008  * ghes_estatus_llist is processed.
1009  *
1010  * Memory from the ghes_estatus_pool is also used with the ghes_estatus_cache
1011  * to suppress frequent messages.
1012  */
1013 static struct llist_head ghes_estatus_llist;
1014 static struct irq_work ghes_proc_irq_work;
1015 
ghes_proc_in_irq(struct irq_work * irq_work)1016 static void ghes_proc_in_irq(struct irq_work *irq_work)
1017 {
1018 	struct llist_node *llnode, *next;
1019 	struct ghes_estatus_node *estatus_node;
1020 	struct acpi_hest_generic *generic;
1021 	struct acpi_hest_generic_status *estatus;
1022 	bool task_work_pending;
1023 	u32 len, node_len;
1024 	int ret;
1025 
1026 	llnode = llist_del_all(&ghes_estatus_llist);
1027 	/*
1028 	 * Because the time order of estatus in list is reversed,
1029 	 * revert it back to proper order.
1030 	 */
1031 	llnode = llist_reverse_order(llnode);
1032 	while (llnode) {
1033 		next = llnode->next;
1034 		estatus_node = llist_entry(llnode, struct ghes_estatus_node,
1035 					   llnode);
1036 		estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
1037 		len = cper_estatus_len(estatus);
1038 		node_len = GHES_ESTATUS_NODE_LEN(len);
1039 		task_work_pending = ghes_do_proc(estatus_node->ghes, estatus);
1040 		if (!ghes_estatus_cached(estatus)) {
1041 			generic = estatus_node->generic;
1042 			if (ghes_print_estatus(NULL, generic, estatus))
1043 				ghes_estatus_cache_add(generic, estatus);
1044 		}
1045 
1046 		if (task_work_pending && current->mm) {
1047 			estatus_node->task_work.func = ghes_kick_task_work;
1048 			estatus_node->task_work_cpu = smp_processor_id();
1049 			ret = task_work_add(current, &estatus_node->task_work,
1050 					    TWA_RESUME);
1051 			if (ret)
1052 				estatus_node->task_work.func = NULL;
1053 		}
1054 
1055 		if (!estatus_node->task_work.func)
1056 			gen_pool_free(ghes_estatus_pool,
1057 				      (unsigned long)estatus_node, node_len);
1058 
1059 		llnode = next;
1060 	}
1061 }
1062 
ghes_print_queued_estatus(void)1063 static void ghes_print_queued_estatus(void)
1064 {
1065 	struct llist_node *llnode;
1066 	struct ghes_estatus_node *estatus_node;
1067 	struct acpi_hest_generic *generic;
1068 	struct acpi_hest_generic_status *estatus;
1069 
1070 	llnode = llist_del_all(&ghes_estatus_llist);
1071 	/*
1072 	 * Because the time order of estatus in list is reversed,
1073 	 * revert it back to proper order.
1074 	 */
1075 	llnode = llist_reverse_order(llnode);
1076 	while (llnode) {
1077 		estatus_node = llist_entry(llnode, struct ghes_estatus_node,
1078 					   llnode);
1079 		estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
1080 		generic = estatus_node->generic;
1081 		ghes_print_estatus(NULL, generic, estatus);
1082 		llnode = llnode->next;
1083 	}
1084 }
1085 
ghes_in_nmi_queue_one_entry(struct ghes * ghes,enum fixed_addresses fixmap_idx)1086 static int ghes_in_nmi_queue_one_entry(struct ghes *ghes,
1087 				       enum fixed_addresses fixmap_idx)
1088 {
1089 	struct acpi_hest_generic_status *estatus, tmp_header;
1090 	struct ghes_estatus_node *estatus_node;
1091 	u32 len, node_len;
1092 	u64 buf_paddr;
1093 	int sev, rc;
1094 
1095 	if (!IS_ENABLED(CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG))
1096 		return -EOPNOTSUPP;
1097 
1098 	rc = __ghes_peek_estatus(ghes, &tmp_header, &buf_paddr, fixmap_idx);
1099 	if (rc) {
1100 		ghes_clear_estatus(ghes, &tmp_header, buf_paddr, fixmap_idx);
1101 		return rc;
1102 	}
1103 
1104 	rc = __ghes_check_estatus(ghes, &tmp_header);
1105 	if (rc) {
1106 		ghes_clear_estatus(ghes, &tmp_header, buf_paddr, fixmap_idx);
1107 		return rc;
1108 	}
1109 
1110 	len = cper_estatus_len(&tmp_header);
1111 	node_len = GHES_ESTATUS_NODE_LEN(len);
1112 	estatus_node = (void *)gen_pool_alloc(ghes_estatus_pool, node_len);
1113 	if (!estatus_node)
1114 		return -ENOMEM;
1115 
1116 	estatus_node->ghes = ghes;
1117 	estatus_node->generic = ghes->generic;
1118 	estatus_node->task_work.func = NULL;
1119 	estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
1120 
1121 	if (__ghes_read_estatus(estatus, buf_paddr, fixmap_idx, len)) {
1122 		ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx);
1123 		rc = -ENOENT;
1124 		goto no_work;
1125 	}
1126 
1127 	sev = ghes_severity(estatus->error_severity);
1128 	if (sev >= GHES_SEV_PANIC) {
1129 		ghes_print_queued_estatus();
1130 		__ghes_panic(ghes, estatus, buf_paddr, fixmap_idx);
1131 	}
1132 
1133 	ghes_clear_estatus(ghes, &tmp_header, buf_paddr, fixmap_idx);
1134 
1135 	/* This error has been reported before, don't process it again. */
1136 	if (ghes_estatus_cached(estatus))
1137 		goto no_work;
1138 
1139 	llist_add(&estatus_node->llnode, &ghes_estatus_llist);
1140 
1141 	return rc;
1142 
1143 no_work:
1144 	gen_pool_free(ghes_estatus_pool, (unsigned long)estatus_node,
1145 		      node_len);
1146 
1147 	return rc;
1148 }
1149 
ghes_in_nmi_spool_from_list(struct list_head * rcu_list,enum fixed_addresses fixmap_idx)1150 static int ghes_in_nmi_spool_from_list(struct list_head *rcu_list,
1151 				       enum fixed_addresses fixmap_idx)
1152 {
1153 	int ret = -ENOENT;
1154 	struct ghes *ghes;
1155 
1156 	rcu_read_lock();
1157 	list_for_each_entry_rcu(ghes, rcu_list, list) {
1158 		if (!ghes_in_nmi_queue_one_entry(ghes, fixmap_idx))
1159 			ret = 0;
1160 	}
1161 	rcu_read_unlock();
1162 
1163 	if (IS_ENABLED(CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG) && !ret)
1164 		irq_work_queue(&ghes_proc_irq_work);
1165 
1166 	return ret;
1167 }
1168 
1169 #ifdef CONFIG_ACPI_APEI_SEA
1170 static LIST_HEAD(ghes_sea);
1171 
1172 /*
1173  * Return 0 only if one of the SEA error sources successfully reported an error
1174  * record sent from the firmware.
1175  */
ghes_notify_sea(void)1176 int ghes_notify_sea(void)
1177 {
1178 	static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sea);
1179 	int rv;
1180 
1181 	raw_spin_lock(&ghes_notify_lock_sea);
1182 	rv = ghes_in_nmi_spool_from_list(&ghes_sea, FIX_APEI_GHES_SEA);
1183 	raw_spin_unlock(&ghes_notify_lock_sea);
1184 
1185 	return rv;
1186 }
1187 
ghes_sea_add(struct ghes * ghes)1188 static void ghes_sea_add(struct ghes *ghes)
1189 {
1190 	mutex_lock(&ghes_list_mutex);
1191 	list_add_rcu(&ghes->list, &ghes_sea);
1192 	mutex_unlock(&ghes_list_mutex);
1193 }
1194 
ghes_sea_remove(struct ghes * ghes)1195 static void ghes_sea_remove(struct ghes *ghes)
1196 {
1197 	mutex_lock(&ghes_list_mutex);
1198 	list_del_rcu(&ghes->list);
1199 	mutex_unlock(&ghes_list_mutex);
1200 	synchronize_rcu();
1201 }
1202 #else /* CONFIG_ACPI_APEI_SEA */
ghes_sea_add(struct ghes * ghes)1203 static inline void ghes_sea_add(struct ghes *ghes) { }
ghes_sea_remove(struct ghes * ghes)1204 static inline void ghes_sea_remove(struct ghes *ghes) { }
1205 #endif /* CONFIG_ACPI_APEI_SEA */
1206 
1207 #ifdef CONFIG_HAVE_ACPI_APEI_NMI
1208 /*
1209  * NMI may be triggered on any CPU, so ghes_in_nmi is used for
1210  * having only one concurrent reader.
1211  */
1212 static atomic_t ghes_in_nmi = ATOMIC_INIT(0);
1213 
1214 static LIST_HEAD(ghes_nmi);
1215 
ghes_notify_nmi(unsigned int cmd,struct pt_regs * regs)1216 static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
1217 {
1218 	static DEFINE_RAW_SPINLOCK(ghes_notify_lock_nmi);
1219 	int ret = NMI_DONE;
1220 
1221 	if (!atomic_add_unless(&ghes_in_nmi, 1, 1))
1222 		return ret;
1223 
1224 	raw_spin_lock(&ghes_notify_lock_nmi);
1225 	if (!ghes_in_nmi_spool_from_list(&ghes_nmi, FIX_APEI_GHES_NMI))
1226 		ret = NMI_HANDLED;
1227 	raw_spin_unlock(&ghes_notify_lock_nmi);
1228 
1229 	atomic_dec(&ghes_in_nmi);
1230 	return ret;
1231 }
1232 
ghes_nmi_add(struct ghes * ghes)1233 static void ghes_nmi_add(struct ghes *ghes)
1234 {
1235 	mutex_lock(&ghes_list_mutex);
1236 	if (list_empty(&ghes_nmi))
1237 		register_nmi_handler(NMI_LOCAL, ghes_notify_nmi, 0, "ghes");
1238 	list_add_rcu(&ghes->list, &ghes_nmi);
1239 	mutex_unlock(&ghes_list_mutex);
1240 }
1241 
ghes_nmi_remove(struct ghes * ghes)1242 static void ghes_nmi_remove(struct ghes *ghes)
1243 {
1244 	mutex_lock(&ghes_list_mutex);
1245 	list_del_rcu(&ghes->list);
1246 	if (list_empty(&ghes_nmi))
1247 		unregister_nmi_handler(NMI_LOCAL, "ghes");
1248 	mutex_unlock(&ghes_list_mutex);
1249 	/*
1250 	 * To synchronize with NMI handler, ghes can only be
1251 	 * freed after NMI handler finishes.
1252 	 */
1253 	synchronize_rcu();
1254 }
1255 #else /* CONFIG_HAVE_ACPI_APEI_NMI */
ghes_nmi_add(struct ghes * ghes)1256 static inline void ghes_nmi_add(struct ghes *ghes) { }
ghes_nmi_remove(struct ghes * ghes)1257 static inline void ghes_nmi_remove(struct ghes *ghes) { }
1258 #endif /* CONFIG_HAVE_ACPI_APEI_NMI */
1259 
ghes_nmi_init_cxt(void)1260 static void ghes_nmi_init_cxt(void)
1261 {
1262 	init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq);
1263 }
1264 
__ghes_sdei_callback(struct ghes * ghes,enum fixed_addresses fixmap_idx)1265 static int __ghes_sdei_callback(struct ghes *ghes,
1266 				enum fixed_addresses fixmap_idx)
1267 {
1268 	if (!ghes_in_nmi_queue_one_entry(ghes, fixmap_idx)) {
1269 		irq_work_queue(&ghes_proc_irq_work);
1270 
1271 		return 0;
1272 	}
1273 
1274 	return -ENOENT;
1275 }
1276 
ghes_sdei_normal_callback(u32 event_num,struct pt_regs * regs,void * arg)1277 static int ghes_sdei_normal_callback(u32 event_num, struct pt_regs *regs,
1278 				      void *arg)
1279 {
1280 	static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sdei_normal);
1281 	struct ghes *ghes = arg;
1282 	int err;
1283 
1284 	raw_spin_lock(&ghes_notify_lock_sdei_normal);
1285 	err = __ghes_sdei_callback(ghes, FIX_APEI_GHES_SDEI_NORMAL);
1286 	raw_spin_unlock(&ghes_notify_lock_sdei_normal);
1287 
1288 	return err;
1289 }
1290 
ghes_sdei_critical_callback(u32 event_num,struct pt_regs * regs,void * arg)1291 static int ghes_sdei_critical_callback(u32 event_num, struct pt_regs *regs,
1292 				       void *arg)
1293 {
1294 	static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sdei_critical);
1295 	struct ghes *ghes = arg;
1296 	int err;
1297 
1298 	raw_spin_lock(&ghes_notify_lock_sdei_critical);
1299 	err = __ghes_sdei_callback(ghes, FIX_APEI_GHES_SDEI_CRITICAL);
1300 	raw_spin_unlock(&ghes_notify_lock_sdei_critical);
1301 
1302 	return err;
1303 }
1304 
apei_sdei_register_ghes(struct ghes * ghes)1305 static int apei_sdei_register_ghes(struct ghes *ghes)
1306 {
1307 	if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE))
1308 		return -EOPNOTSUPP;
1309 
1310 	return sdei_register_ghes(ghes, ghes_sdei_normal_callback,
1311 				 ghes_sdei_critical_callback);
1312 }
1313 
apei_sdei_unregister_ghes(struct ghes * ghes)1314 static int apei_sdei_unregister_ghes(struct ghes *ghes)
1315 {
1316 	if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE))
1317 		return -EOPNOTSUPP;
1318 
1319 	return sdei_unregister_ghes(ghes);
1320 }
1321 
ghes_probe(struct platform_device * ghes_dev)1322 static int ghes_probe(struct platform_device *ghes_dev)
1323 {
1324 	struct acpi_hest_generic *generic;
1325 	struct ghes *ghes = NULL;
1326 	unsigned long flags;
1327 
1328 	int rc = -EINVAL;
1329 
1330 	generic = *(struct acpi_hest_generic **)ghes_dev->dev.platform_data;
1331 	if (!generic->enabled)
1332 		return -ENODEV;
1333 
1334 	switch (generic->notify.type) {
1335 	case ACPI_HEST_NOTIFY_POLLED:
1336 	case ACPI_HEST_NOTIFY_EXTERNAL:
1337 	case ACPI_HEST_NOTIFY_SCI:
1338 	case ACPI_HEST_NOTIFY_GSIV:
1339 	case ACPI_HEST_NOTIFY_GPIO:
1340 		break;
1341 
1342 	case ACPI_HEST_NOTIFY_SEA:
1343 		if (!IS_ENABLED(CONFIG_ACPI_APEI_SEA)) {
1344 			pr_warn(GHES_PFX "Generic hardware error source: %d notified via SEA is not supported\n",
1345 				generic->header.source_id);
1346 			rc = -ENOTSUPP;
1347 			goto err;
1348 		}
1349 		break;
1350 	case ACPI_HEST_NOTIFY_NMI:
1351 		if (!IS_ENABLED(CONFIG_HAVE_ACPI_APEI_NMI)) {
1352 			pr_warn(GHES_PFX "Generic hardware error source: %d notified via NMI interrupt is not supported!\n",
1353 				generic->header.source_id);
1354 			goto err;
1355 		}
1356 		break;
1357 	case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED:
1358 		if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE)) {
1359 			pr_warn(GHES_PFX "Generic hardware error source: %d notified via SDE Interface is not supported!\n",
1360 				generic->header.source_id);
1361 			goto err;
1362 		}
1363 		break;
1364 	case ACPI_HEST_NOTIFY_LOCAL:
1365 		pr_warn(GHES_PFX "Generic hardware error source: %d notified via local interrupt is not supported!\n",
1366 			generic->header.source_id);
1367 		goto err;
1368 	default:
1369 		pr_warn(FW_WARN GHES_PFX "Unknown notification type: %u for generic hardware error source: %d\n",
1370 			generic->notify.type, generic->header.source_id);
1371 		goto err;
1372 	}
1373 
1374 	rc = -EIO;
1375 	if (generic->error_block_length <
1376 	    sizeof(struct acpi_hest_generic_status)) {
1377 		pr_warn(FW_BUG GHES_PFX "Invalid error block length: %u for generic hardware error source: %d\n",
1378 			generic->error_block_length, generic->header.source_id);
1379 		goto err;
1380 	}
1381 	ghes = ghes_new(generic);
1382 	if (IS_ERR(ghes)) {
1383 		rc = PTR_ERR(ghes);
1384 		ghes = NULL;
1385 		goto err;
1386 	}
1387 
1388 	switch (generic->notify.type) {
1389 	case ACPI_HEST_NOTIFY_POLLED:
1390 		timer_setup(&ghes->timer, ghes_poll_func, 0);
1391 		ghes_add_timer(ghes);
1392 		break;
1393 	case ACPI_HEST_NOTIFY_EXTERNAL:
1394 		/* External interrupt vector is GSI */
1395 		rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq);
1396 		if (rc) {
1397 			pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n",
1398 			       generic->header.source_id);
1399 			goto err;
1400 		}
1401 		rc = request_irq(ghes->irq, ghes_irq_func, IRQF_SHARED,
1402 				 "GHES IRQ", ghes);
1403 		if (rc) {
1404 			pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n",
1405 			       generic->header.source_id);
1406 			goto err;
1407 		}
1408 		break;
1409 
1410 	case ACPI_HEST_NOTIFY_SCI:
1411 	case ACPI_HEST_NOTIFY_GSIV:
1412 	case ACPI_HEST_NOTIFY_GPIO:
1413 		mutex_lock(&ghes_list_mutex);
1414 		if (list_empty(&ghes_hed))
1415 			register_acpi_hed_notifier(&ghes_notifier_hed);
1416 		list_add_rcu(&ghes->list, &ghes_hed);
1417 		mutex_unlock(&ghes_list_mutex);
1418 		break;
1419 
1420 	case ACPI_HEST_NOTIFY_SEA:
1421 		ghes_sea_add(ghes);
1422 		break;
1423 	case ACPI_HEST_NOTIFY_NMI:
1424 		ghes_nmi_add(ghes);
1425 		break;
1426 	case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED:
1427 		rc = apei_sdei_register_ghes(ghes);
1428 		if (rc)
1429 			goto err;
1430 		break;
1431 	default:
1432 		BUG();
1433 	}
1434 
1435 	platform_set_drvdata(ghes_dev, ghes);
1436 
1437 	ghes->dev = &ghes_dev->dev;
1438 
1439 	mutex_lock(&ghes_devs_mutex);
1440 	list_add_tail(&ghes->elist, &ghes_devs);
1441 	mutex_unlock(&ghes_devs_mutex);
1442 
1443 	/* Handle any pending errors right away */
1444 	spin_lock_irqsave(&ghes_notify_lock_irq, flags);
1445 	ghes_proc(ghes);
1446 	spin_unlock_irqrestore(&ghes_notify_lock_irq, flags);
1447 
1448 	return 0;
1449 
1450 err:
1451 	if (ghes) {
1452 		ghes_fini(ghes);
1453 		kfree(ghes);
1454 	}
1455 	return rc;
1456 }
1457 
ghes_remove(struct platform_device * ghes_dev)1458 static int ghes_remove(struct platform_device *ghes_dev)
1459 {
1460 	int rc;
1461 	struct ghes *ghes;
1462 	struct acpi_hest_generic *generic;
1463 
1464 	ghes = platform_get_drvdata(ghes_dev);
1465 	generic = ghes->generic;
1466 
1467 	ghes->flags |= GHES_EXITING;
1468 	switch (generic->notify.type) {
1469 	case ACPI_HEST_NOTIFY_POLLED:
1470 		timer_shutdown_sync(&ghes->timer);
1471 		break;
1472 	case ACPI_HEST_NOTIFY_EXTERNAL:
1473 		free_irq(ghes->irq, ghes);
1474 		break;
1475 
1476 	case ACPI_HEST_NOTIFY_SCI:
1477 	case ACPI_HEST_NOTIFY_GSIV:
1478 	case ACPI_HEST_NOTIFY_GPIO:
1479 		mutex_lock(&ghes_list_mutex);
1480 		list_del_rcu(&ghes->list);
1481 		if (list_empty(&ghes_hed))
1482 			unregister_acpi_hed_notifier(&ghes_notifier_hed);
1483 		mutex_unlock(&ghes_list_mutex);
1484 		synchronize_rcu();
1485 		break;
1486 
1487 	case ACPI_HEST_NOTIFY_SEA:
1488 		ghes_sea_remove(ghes);
1489 		break;
1490 	case ACPI_HEST_NOTIFY_NMI:
1491 		ghes_nmi_remove(ghes);
1492 		break;
1493 	case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED:
1494 		rc = apei_sdei_unregister_ghes(ghes);
1495 		if (rc)
1496 			return rc;
1497 		break;
1498 	default:
1499 		BUG();
1500 		break;
1501 	}
1502 
1503 	ghes_fini(ghes);
1504 
1505 	mutex_lock(&ghes_devs_mutex);
1506 	list_del(&ghes->elist);
1507 	mutex_unlock(&ghes_devs_mutex);
1508 
1509 	kfree(ghes);
1510 
1511 	return 0;
1512 }
1513 
1514 static struct platform_driver ghes_platform_driver = {
1515 	.driver		= {
1516 		.name	= "GHES",
1517 	},
1518 	.probe		= ghes_probe,
1519 	.remove		= ghes_remove,
1520 };
1521 
acpi_ghes_init(void)1522 void __init acpi_ghes_init(void)
1523 {
1524 	int rc;
1525 
1526 	sdei_init();
1527 
1528 	if (acpi_disabled)
1529 		return;
1530 
1531 	switch (hest_disable) {
1532 	case HEST_NOT_FOUND:
1533 		return;
1534 	case HEST_DISABLED:
1535 		pr_info(GHES_PFX "HEST is not enabled!\n");
1536 		return;
1537 	default:
1538 		break;
1539 	}
1540 
1541 	if (ghes_disable) {
1542 		pr_info(GHES_PFX "GHES is not enabled!\n");
1543 		return;
1544 	}
1545 
1546 	ghes_nmi_init_cxt();
1547 
1548 	rc = platform_driver_register(&ghes_platform_driver);
1549 	if (rc)
1550 		return;
1551 
1552 	rc = apei_osc_setup();
1553 	if (rc == 0 && osc_sb_apei_support_acked)
1554 		pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit and WHEA _OSC.\n");
1555 	else if (rc == 0 && !osc_sb_apei_support_acked)
1556 		pr_info(GHES_PFX "APEI firmware first mode is enabled by WHEA _OSC.\n");
1557 	else if (rc && osc_sb_apei_support_acked)
1558 		pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit.\n");
1559 	else
1560 		pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n");
1561 }
1562 
1563 /*
1564  * Known x86 systems that prefer GHES error reporting:
1565  */
1566 static struct acpi_platform_list plat_list[] = {
1567 	{"HPE   ", "Server  ", 0, ACPI_SIG_FADT, all_versions},
1568 	{ } /* End */
1569 };
1570 
ghes_get_devices(void)1571 struct list_head *ghes_get_devices(void)
1572 {
1573 	int idx = -1;
1574 
1575 	if (IS_ENABLED(CONFIG_X86)) {
1576 		idx = acpi_match_platform_list(plat_list);
1577 		if (idx < 0) {
1578 			if (!ghes_edac_force_enable)
1579 				return NULL;
1580 
1581 			pr_warn_once("Force-loading ghes_edac on an unsupported platform. You're on your own!\n");
1582 		}
1583 	} else if (list_empty(&ghes_devs)) {
1584 		return NULL;
1585 	}
1586 
1587 	return &ghes_devs;
1588 }
1589 EXPORT_SYMBOL_GPL(ghes_get_devices);
1590 
ghes_register_report_chain(struct notifier_block * nb)1591 void ghes_register_report_chain(struct notifier_block *nb)
1592 {
1593 	atomic_notifier_chain_register(&ghes_report_chain, nb);
1594 }
1595 EXPORT_SYMBOL_GPL(ghes_register_report_chain);
1596 
ghes_unregister_report_chain(struct notifier_block * nb)1597 void ghes_unregister_report_chain(struct notifier_block *nb)
1598 {
1599 	atomic_notifier_chain_unregister(&ghes_report_chain, nb);
1600 }
1601 EXPORT_SYMBOL_GPL(ghes_unregister_report_chain);
1602