mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 12:10:52 -04:00
arm64 updates for 4.13:
- RAS reporting via GHES/APEI (ACPI) - Indirect ftrace trampolines for modules - Improvements to kernel fault reporting - Page poisoning - Sigframe cleanups and preparation for SVE context - Core dump fixes - Sparse fixes (mainly relating to endianness) - xgene SoC PMU v3 driver - Misc cleanups and non-critical fixes -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABCgAGBQJZWiuVAAoJELescNyEwWM0g/gIAIRpVEzjE61zfm/KCsVuIu4O p6F/HrvF/ApvlFcth8LDpTDYUholzT1e9wmx/O0Ll37UvFUrReT03R5MMJ02WU8s hRg0N4izdg2BPa9zuaP/XE5i6WmFfRAwFsv6PzX77FjNGk0M4zhW8acNpWHYMBQT DwXT/xCvg6045Sj6CuwfcIqqVHrz6/kpBmvdbW7G3/WpIHpUGIWM9EO3mkuLGMj0 j0VSCxfAVJvWwmKEBdFExLNjqxvSlVAMOIEAw7yBNLjuheiL+afK+Y1BggB00oe8 14+6viOgW6L97VmPpYVn0YDseqeGg5DqlNF3NqjTqdmzWH/ApAvL4WXN7SL2jbU= =RNzb -----END PGP SIGNATURE----- Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux Pull arm64 updates from Will Deacon: - RAS reporting via GHES/APEI (ACPI) - Indirect ftrace trampolines for modules - Improvements to kernel fault reporting - Page poisoning - Sigframe cleanups and preparation for SVE context - Core dump fixes - Sparse fixes (mainly relating to endianness) - xgene SoC PMU v3 driver - Misc cleanups and non-critical fixes * tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (75 commits) arm64: fix endianness annotation for 'struct jit_ctx' and friends arm64: cpuinfo: constify attribute_group structures. arm64: ptrace: Fix incorrect get_user() use in compat_vfp_set() arm64: ptrace: Remove redundant overrun check from compat_vfp_set() arm64: ptrace: Avoid setting compat FP[SC]R to garbage if get_user fails arm64: fix endianness annotation for __apply_alternatives()/get_alt_insn() arm64: fix endianness annotation in get_kaslr_seed() arm64: add missing conversion to __wsum in ip_fast_csum() arm64: fix endianness annotation in acpi_parking_protocol.c arm64: use readq() instead of readl() to read 64bit entry_point arm64: fix endianness annotation for reloc_insn_movw() & reloc_insn_imm() arm64: fix endianness annotation for aarch64_insn_write() arm64: fix endianness annotation in aarch64_insn_read() arm64: fix endianness annotation in call_undef_hook() arm64: fix endianness annotation for debug-monitors.c ras: mark stub functions as 'inline' arm64: pass endianness info to sparse arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels arm64: signal: Allow expansion of the signal frame acpi: apei: check for pending errors when probing GHES entries ...
This commit is contained in:
commit
55a7b2125c
62 changed files with 2190 additions and 341 deletions
|
|
@ -39,6 +39,21 @@ config ACPI_APEI_PCIEAER
|
|||
PCIe AER errors may be reported via APEI firmware first mode.
|
||||
Turn on this option to enable the corresponding support.
|
||||
|
||||
config ACPI_APEI_SEA
|
||||
bool "APEI Synchronous External Abort logging/recovering support"
|
||||
depends on ARM64 && ACPI_APEI_GHES
|
||||
default y
|
||||
help
|
||||
This option should be enabled if the system supports
|
||||
firmware first handling of SEA (Synchronous External Abort).
|
||||
SEA happens with certain faults of data abort or instruction
|
||||
abort synchronous exceptions on ARMv8 systems. If a system
|
||||
supports firmware first handling of SEA, the platform analyzes
|
||||
and handles hardware error notifications from SEA, and it may then
|
||||
form a HW error record for the OS to parse and handle. This
|
||||
option allows the OS to look for such hardware error record, and
|
||||
take appropriate action.
|
||||
|
||||
config ACPI_APEI_MEMORY_FAILURE
|
||||
bool "APEI memory error recovering support"
|
||||
depends on ACPI_APEI && MEMORY_FAILURE
|
||||
|
|
|
|||
|
|
@ -45,10 +45,14 @@
|
|||
#include <linux/aer.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/sched/clock.h>
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/ras.h>
|
||||
|
||||
#include <acpi/actbl1.h>
|
||||
#include <acpi/ghes.h>
|
||||
#include <acpi/apei.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <ras/ras_event.h>
|
||||
|
||||
#include "apei-internal.h"
|
||||
|
||||
|
|
@ -80,6 +84,11 @@
|
|||
((struct acpi_hest_generic_status *) \
|
||||
((struct ghes_estatus_node *)(estatus_node) + 1))
|
||||
|
||||
static inline bool is_hest_type_generic_v2(struct ghes *ghes)
|
||||
{
|
||||
return ghes->generic->header.type == ACPI_HEST_TYPE_GENERIC_ERROR_V2;
|
||||
}
|
||||
|
||||
/*
|
||||
* This driver isn't really modular, however for the time being,
|
||||
* continuing to use module_param is the easiest way to remain
|
||||
|
|
@ -110,11 +119,7 @@ static DEFINE_MUTEX(ghes_list_mutex);
|
|||
* Two virtual pages are used, one for IRQ/PROCESS context, the other for
|
||||
* NMI context (optionally).
|
||||
*/
|
||||
#ifdef CONFIG_HAVE_ACPI_APEI_NMI
|
||||
#define GHES_IOREMAP_PAGES 2
|
||||
#else
|
||||
#define GHES_IOREMAP_PAGES 1
|
||||
#endif
|
||||
#define GHES_IOREMAP_IRQ_PAGE(base) (base)
|
||||
#define GHES_IOREMAP_NMI_PAGE(base) ((base) + PAGE_SIZE)
|
||||
|
||||
|
|
@ -133,6 +138,8 @@ static unsigned long ghes_estatus_pool_size_request;
|
|||
static struct ghes_estatus_cache *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE];
|
||||
static atomic_t ghes_estatus_cache_alloced;
|
||||
|
||||
static int ghes_panic_timeout __read_mostly = 30;
|
||||
|
||||
static int ghes_ioremap_init(void)
|
||||
{
|
||||
ghes_ioremap_area = __get_vm_area(PAGE_SIZE * GHES_IOREMAP_PAGES,
|
||||
|
|
@ -153,10 +160,14 @@ static void ghes_ioremap_exit(void)
|
|||
static void __iomem *ghes_ioremap_pfn_nmi(u64 pfn)
|
||||
{
|
||||
unsigned long vaddr;
|
||||
phys_addr_t paddr;
|
||||
pgprot_t prot;
|
||||
|
||||
vaddr = (unsigned long)GHES_IOREMAP_NMI_PAGE(ghes_ioremap_area->addr);
|
||||
ioremap_page_range(vaddr, vaddr + PAGE_SIZE,
|
||||
pfn << PAGE_SHIFT, PAGE_KERNEL);
|
||||
|
||||
paddr = pfn << PAGE_SHIFT;
|
||||
prot = arch_apei_get_mem_attribute(paddr);
|
||||
ioremap_page_range(vaddr, vaddr + PAGE_SIZE, paddr, prot);
|
||||
|
||||
return (void __iomem *)vaddr;
|
||||
}
|
||||
|
|
@ -240,6 +251,16 @@ static int ghes_estatus_pool_expand(unsigned long len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int map_gen_v2(struct ghes *ghes)
|
||||
{
|
||||
return apei_map_generic_address(&ghes->generic_v2->read_ack_register);
|
||||
}
|
||||
|
||||
static void unmap_gen_v2(struct ghes *ghes)
|
||||
{
|
||||
apei_unmap_generic_address(&ghes->generic_v2->read_ack_register);
|
||||
}
|
||||
|
||||
static struct ghes *ghes_new(struct acpi_hest_generic *generic)
|
||||
{
|
||||
struct ghes *ghes;
|
||||
|
|
@ -249,10 +270,17 @@ static struct ghes *ghes_new(struct acpi_hest_generic *generic)
|
|||
ghes = kzalloc(sizeof(*ghes), GFP_KERNEL);
|
||||
if (!ghes)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ghes->generic = generic;
|
||||
if (is_hest_type_generic_v2(ghes)) {
|
||||
rc = map_gen_v2(ghes);
|
||||
if (rc)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
rc = apei_map_generic_address(&generic->error_status_address);
|
||||
if (rc)
|
||||
goto err_free;
|
||||
goto err_unmap_read_ack_addr;
|
||||
error_block_length = generic->error_block_length;
|
||||
if (error_block_length > GHES_ESTATUS_MAX_SIZE) {
|
||||
pr_warning(FW_WARN GHES_PFX
|
||||
|
|
@ -264,13 +292,16 @@ static struct ghes *ghes_new(struct acpi_hest_generic *generic)
|
|||
ghes->estatus = kmalloc(error_block_length, GFP_KERNEL);
|
||||
if (!ghes->estatus) {
|
||||
rc = -ENOMEM;
|
||||
goto err_unmap;
|
||||
goto err_unmap_status_addr;
|
||||
}
|
||||
|
||||
return ghes;
|
||||
|
||||
err_unmap:
|
||||
err_unmap_status_addr:
|
||||
apei_unmap_generic_address(&generic->error_status_address);
|
||||
err_unmap_read_ack_addr:
|
||||
if (is_hest_type_generic_v2(ghes))
|
||||
unmap_gen_v2(ghes);
|
||||
err_free:
|
||||
kfree(ghes);
|
||||
return ERR_PTR(rc);
|
||||
|
|
@ -280,6 +311,8 @@ static void ghes_fini(struct ghes *ghes)
|
|||
{
|
||||
kfree(ghes->estatus);
|
||||
apei_unmap_generic_address(&ghes->generic->error_status_address);
|
||||
if (is_hest_type_generic_v2(ghes))
|
||||
unmap_gen_v2(ghes);
|
||||
}
|
||||
|
||||
static inline int ghes_severity(int severity)
|
||||
|
|
@ -400,8 +433,7 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int
|
|||
unsigned long pfn;
|
||||
int flags = -1;
|
||||
int sec_sev = ghes_severity(gdata->error_severity);
|
||||
struct cper_sec_mem_err *mem_err;
|
||||
mem_err = (struct cper_sec_mem_err *)(gdata + 1);
|
||||
struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);
|
||||
|
||||
if (!(mem_err->validation_bits & CPER_MEM_VALID_PA))
|
||||
return;
|
||||
|
|
@ -432,14 +464,22 @@ static void ghes_do_proc(struct ghes *ghes,
|
|||
int sev, sec_sev;
|
||||
struct acpi_hest_generic_data *gdata;
|
||||
guid_t *sec_type;
|
||||
guid_t *fru_id = &NULL_UUID_LE;
|
||||
char *fru_text = "";
|
||||
|
||||
sev = ghes_severity(estatus->error_severity);
|
||||
apei_estatus_for_each_section(estatus, gdata) {
|
||||
sec_type = (guid_t *)gdata->section_type;
|
||||
sec_sev = ghes_severity(gdata->error_severity);
|
||||
if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID)
|
||||
fru_id = (guid_t *)gdata->fru_id;
|
||||
|
||||
if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)
|
||||
fru_text = gdata->fru_text;
|
||||
|
||||
if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) {
|
||||
struct cper_sec_mem_err *mem_err;
|
||||
mem_err = (struct cper_sec_mem_err *)(gdata+1);
|
||||
struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);
|
||||
|
||||
ghes_edac_report_mem_error(ghes, sev, mem_err);
|
||||
|
||||
arch_apei_report_mem_error(sev, mem_err);
|
||||
|
|
@ -447,8 +487,8 @@ static void ghes_do_proc(struct ghes *ghes,
|
|||
}
|
||||
#ifdef CONFIG_ACPI_APEI_PCIEAER
|
||||
else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
|
||||
struct cper_sec_pcie *pcie_err;
|
||||
pcie_err = (struct cper_sec_pcie *)(gdata+1);
|
||||
struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
|
||||
|
||||
if (sev == GHES_SEV_RECOVERABLE &&
|
||||
sec_sev == GHES_SEV_RECOVERABLE &&
|
||||
pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
|
||||
|
|
@ -477,6 +517,17 @@ static void ghes_do_proc(struct ghes *ghes,
|
|||
|
||||
}
|
||||
#endif
|
||||
else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
|
||||
struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
|
||||
|
||||
log_arm_hw_error(err);
|
||||
} else {
|
||||
void *err = acpi_hest_get_payload(gdata);
|
||||
|
||||
log_non_standard_event(sec_type, fru_id, fru_text,
|
||||
sec_sev, err,
|
||||
gdata->error_data_length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -649,6 +700,31 @@ static void ghes_estatus_cache_add(
|
|||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static int ghes_ack_error(struct acpi_hest_generic_v2 *gv2)
|
||||
{
|
||||
int rc;
|
||||
u64 val = 0;
|
||||
|
||||
rc = apei_read(&val, &gv2->read_ack_register);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
val &= gv2->read_ack_preserve << gv2->read_ack_register.bit_offset;
|
||||
val |= gv2->read_ack_write << gv2->read_ack_register.bit_offset;
|
||||
|
||||
return apei_write(val, &gv2->read_ack_register);
|
||||
}
|
||||
|
||||
static void __ghes_panic(struct ghes *ghes)
|
||||
{
|
||||
__ghes_print_estatus(KERN_EMERG, ghes->generic, ghes->estatus);
|
||||
|
||||
/* reboot to log the error! */
|
||||
if (!panic_timeout)
|
||||
panic_timeout = ghes_panic_timeout;
|
||||
panic("Fatal hardware error!");
|
||||
}
|
||||
|
||||
static int ghes_proc(struct ghes *ghes)
|
||||
{
|
||||
int rc;
|
||||
|
|
@ -656,11 +732,26 @@ static int ghes_proc(struct ghes *ghes)
|
|||
rc = ghes_read_estatus(ghes, 0);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (ghes_severity(ghes->estatus->error_severity) >= GHES_SEV_PANIC) {
|
||||
__ghes_panic(ghes);
|
||||
}
|
||||
|
||||
if (!ghes_estatus_cached(ghes->estatus)) {
|
||||
if (ghes_print_estatus(NULL, ghes->generic, ghes->estatus))
|
||||
ghes_estatus_cache_add(ghes->generic, ghes->estatus);
|
||||
}
|
||||
ghes_do_proc(ghes, ghes->estatus);
|
||||
|
||||
/*
|
||||
* GHESv2 type HEST entries introduce support for error acknowledgment,
|
||||
* so only acknowledge the error if this support is present.
|
||||
*/
|
||||
if (is_hest_type_generic_v2(ghes)) {
|
||||
rc = ghes_ack_error(ghes->generic_v2);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
out:
|
||||
ghes_clear_estatus(ghes);
|
||||
return rc;
|
||||
|
|
@ -722,6 +813,55 @@ static struct notifier_block ghes_notifier_hed = {
|
|||
.notifier_call = ghes_notify_hed,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_APEI_SEA
|
||||
static LIST_HEAD(ghes_sea);
|
||||
|
||||
/*
|
||||
* Return 0 only if one of the SEA error sources successfully reported an error
|
||||
* record sent from the firmware.
|
||||
*/
|
||||
int ghes_notify_sea(void)
|
||||
{
|
||||
struct ghes *ghes;
|
||||
int ret = -ENOENT;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(ghes, &ghes_sea, list) {
|
||||
if (!ghes_proc(ghes))
|
||||
ret = 0;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ghes_sea_add(struct ghes *ghes)
|
||||
{
|
||||
mutex_lock(&ghes_list_mutex);
|
||||
list_add_rcu(&ghes->list, &ghes_sea);
|
||||
mutex_unlock(&ghes_list_mutex);
|
||||
}
|
||||
|
||||
static void ghes_sea_remove(struct ghes *ghes)
|
||||
{
|
||||
mutex_lock(&ghes_list_mutex);
|
||||
list_del_rcu(&ghes->list);
|
||||
mutex_unlock(&ghes_list_mutex);
|
||||
synchronize_rcu();
|
||||
}
|
||||
#else /* CONFIG_ACPI_APEI_SEA */
|
||||
static inline void ghes_sea_add(struct ghes *ghes)
|
||||
{
|
||||
pr_err(GHES_PFX "ID: %d, trying to add SEA notification which is not supported\n",
|
||||
ghes->generic->header.source_id);
|
||||
}
|
||||
|
||||
static inline void ghes_sea_remove(struct ghes *ghes)
|
||||
{
|
||||
pr_err(GHES_PFX "ID: %d, trying to remove SEA notification which is not supported\n",
|
||||
ghes->generic->header.source_id);
|
||||
}
|
||||
#endif /* CONFIG_ACPI_APEI_SEA */
|
||||
|
||||
#ifdef CONFIG_HAVE_ACPI_APEI_NMI
|
||||
/*
|
||||
* printk is not safe in NMI context. So in NMI handler, we allocate
|
||||
|
|
@ -742,8 +882,6 @@ static atomic_t ghes_in_nmi = ATOMIC_INIT(0);
|
|||
|
||||
static LIST_HEAD(ghes_nmi);
|
||||
|
||||
static int ghes_panic_timeout __read_mostly = 30;
|
||||
|
||||
static void ghes_proc_in_irq(struct irq_work *irq_work)
|
||||
{
|
||||
struct llist_node *llnode, *next;
|
||||
|
|
@ -829,18 +967,6 @@ static void __process_error(struct ghes *ghes)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void __ghes_panic(struct ghes *ghes)
|
||||
{
|
||||
oops_begin();
|
||||
ghes_print_queued_estatus();
|
||||
__ghes_print_estatus(KERN_EMERG, ghes->generic, ghes->estatus);
|
||||
|
||||
/* reboot to log the error! */
|
||||
if (panic_timeout == 0)
|
||||
panic_timeout = ghes_panic_timeout;
|
||||
panic("Fatal hardware error!");
|
||||
}
|
||||
|
||||
static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
|
||||
{
|
||||
struct ghes *ghes;
|
||||
|
|
@ -858,8 +984,11 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
sev = ghes_severity(ghes->estatus->error_severity);
|
||||
if (sev >= GHES_SEV_PANIC)
|
||||
if (sev >= GHES_SEV_PANIC) {
|
||||
oops_begin();
|
||||
ghes_print_queued_estatus();
|
||||
__ghes_panic(ghes);
|
||||
}
|
||||
|
||||
if (!(ghes->flags & GHES_TO_CLEAR))
|
||||
continue;
|
||||
|
|
@ -970,6 +1099,14 @@ static int ghes_probe(struct platform_device *ghes_dev)
|
|||
case ACPI_HEST_NOTIFY_GPIO:
|
||||
break;
|
||||
|
||||
case ACPI_HEST_NOTIFY_SEA:
|
||||
if (!IS_ENABLED(CONFIG_ACPI_APEI_SEA)) {
|
||||
pr_warn(GHES_PFX "Generic hardware error source: %d notified via SEA is not supported\n",
|
||||
generic->header.source_id);
|
||||
rc = -ENOTSUPP;
|
||||
goto err;
|
||||
}
|
||||
break;
|
||||
case ACPI_HEST_NOTIFY_NMI:
|
||||
if (!IS_ENABLED(CONFIG_HAVE_ACPI_APEI_NMI)) {
|
||||
pr_warn(GHES_PFX "Generic hardware error source: %d notified via NMI interrupt is not supported!\n",
|
||||
|
|
@ -1038,6 +1175,9 @@ static int ghes_probe(struct platform_device *ghes_dev)
|
|||
mutex_unlock(&ghes_list_mutex);
|
||||
break;
|
||||
|
||||
case ACPI_HEST_NOTIFY_SEA:
|
||||
ghes_sea_add(ghes);
|
||||
break;
|
||||
case ACPI_HEST_NOTIFY_NMI:
|
||||
ghes_nmi_add(ghes);
|
||||
break;
|
||||
|
|
@ -1046,6 +1186,9 @@ static int ghes_probe(struct platform_device *ghes_dev)
|
|||
}
|
||||
platform_set_drvdata(ghes_dev, ghes);
|
||||
|
||||
/* Handle any pending errors right away */
|
||||
ghes_proc(ghes);
|
||||
|
||||
return 0;
|
||||
err_edac_unreg:
|
||||
ghes_edac_unregister(ghes);
|
||||
|
|
@ -1085,6 +1228,9 @@ static int ghes_remove(struct platform_device *ghes_dev)
|
|||
synchronize_rcu();
|
||||
break;
|
||||
|
||||
case ACPI_HEST_NOTIFY_SEA:
|
||||
ghes_sea_remove(ghes);
|
||||
break;
|
||||
case ACPI_HEST_NOTIFY_NMI:
|
||||
ghes_nmi_remove(ghes);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ static const int hest_esrc_len_tab[ACPI_HEST_TYPE_RESERVED] = {
|
|||
[ACPI_HEST_TYPE_AER_ENDPOINT] = sizeof(struct acpi_hest_aer),
|
||||
[ACPI_HEST_TYPE_AER_BRIDGE] = sizeof(struct acpi_hest_aer_bridge),
|
||||
[ACPI_HEST_TYPE_GENERIC_ERROR] = sizeof(struct acpi_hest_generic),
|
||||
[ACPI_HEST_TYPE_GENERIC_ERROR_V2] = sizeof(struct acpi_hest_generic_v2),
|
||||
};
|
||||
|
||||
static int hest_esrc_len(struct acpi_hest_header *hest_hdr)
|
||||
|
|
@ -141,7 +142,8 @@ static int __init hest_parse_ghes_count(struct acpi_hest_header *hest_hdr, void
|
|||
{
|
||||
int *count = data;
|
||||
|
||||
if (hest_hdr->type == ACPI_HEST_TYPE_GENERIC_ERROR)
|
||||
if (hest_hdr->type == ACPI_HEST_TYPE_GENERIC_ERROR ||
|
||||
hest_hdr->type == ACPI_HEST_TYPE_GENERIC_ERROR_V2)
|
||||
(*count)++;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -152,7 +154,8 @@ static int __init hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data)
|
|||
struct ghes_arr *ghes_arr = data;
|
||||
int rc, i;
|
||||
|
||||
if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR)
|
||||
if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR &&
|
||||
hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR_V2)
|
||||
return 0;
|
||||
|
||||
if (!((struct acpi_hest_generic *)hest_hdr)->enabled)
|
||||
|
|
|
|||
|
|
@ -234,21 +234,6 @@ static struct acpi_iort_node *iort_scan_node(enum acpi_iort_node_type type,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
iort_match_type_callback(struct acpi_iort_node *node, void *context)
|
||||
{
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
bool iort_node_match(u8 type)
|
||||
{
|
||||
struct acpi_iort_node *node;
|
||||
|
||||
node = iort_scan_node(type, iort_match_type_callback, NULL);
|
||||
|
||||
return node != NULL;
|
||||
}
|
||||
|
||||
static acpi_status iort_match_node_callback(struct acpi_iort_node *node,
|
||||
void *context)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue