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