Lines Matching +full:trigger +full:- +full:address
1 // SPDX-License-Identifier: GPL-2.0-only
11 * Copyright 2009-2010 Intel Corp.
27 #include "apei-internal.h"
89 * most will ignore the parameter and make their own choice of address
157 EINJ_TAB_ENTRY(einj_tab), einj_tab->entries); in einj_exec_ctx_init()
192 *t -= SLEEP_UNIT_MIN; in einj_timedout()
204 vendor_size = v->length - sizeof(struct vendor_error_type_extension); in get_oem_vendor_struct()
216 int offset = v5param->vendor_extension; in check_vendor_extension()
226 sbdf = v->pcie_sbdf; in check_vendor_extension()
230 v->vendor_id, v->device_id, v->rev_id); in check_vendor_extension()
241 for (i = 0; i < einj_tab->entries; i++) { in einj_get_parameter_address()
242 if (entry->action == ACPI_EINJ_SET_ERROR_TYPE && in einj_get_parameter_address()
243 entry->instruction == ACPI_EINJ_WRITE_REGISTER && in einj_get_parameter_address()
244 entry->register_region.space_id == in einj_get_parameter_address()
246 pa_v4 = get_unaligned(&entry->register_region.address); in einj_get_parameter_address()
247 if (entry->action == ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS && in einj_get_parameter_address()
248 entry->instruction == ACPI_EINJ_WRITE_REGISTER && in einj_get_parameter_address()
249 entry->register_region.space_id == in einj_get_parameter_address()
251 pa_v5 = get_unaligned(&entry->register_region.address); in einj_get_parameter_address()
270 if (v4param->reserved1 || v4param->reserved2) { in einj_get_parameter_address()
280 /* do sanity check to trigger table */
283 if (trigger_tab->header_size != sizeof(struct acpi_einj_trigger)) in einj_check_trigger_header()
284 return -EINVAL; in einj_check_trigger_header()
285 if (trigger_tab->table_size > PAGE_SIZE || in einj_check_trigger_header()
286 trigger_tab->table_size < trigger_tab->header_size) in einj_check_trigger_header()
287 return -EINVAL; in einj_check_trigger_header()
288 if (trigger_tab->entry_count != in einj_check_trigger_header()
289 (trigger_tab->table_size - trigger_tab->header_size) / in einj_check_trigger_header()
291 return -EINVAL; in einj_check_trigger_header()
304 for (i = 0; i < trigger_tab->entry_count; i++) { in einj_get_trigger_parameter_region()
305 if (entry->action == ACPI_EINJ_TRIGGER_ERROR && in einj_get_trigger_parameter_region()
306 entry->instruction <= ACPI_EINJ_WRITE_REGISTER_VALUE && in einj_get_trigger_parameter_region()
307 entry->register_region.space_id == in einj_get_trigger_parameter_region()
309 (entry->register_region.address & param2) == (param1 & param2)) in einj_get_trigger_parameter_region()
310 return &entry->register_region; in einj_get_trigger_parameter_region()
316 /* Execute instructions in trigger error action table */
326 int rc = -EIO; in __einj_error_trigger()
330 "APEI EINJ Trigger Table"); in __einj_error_trigger()
332 pr_err("Can not request [mem %#010llx-%#010llx] for Trigger table\n", in __einj_error_trigger()
335 sizeof(*trigger_tab) - 1); in __einj_error_trigger()
340 pr_err("Failed to map trigger table!\n"); in __einj_error_trigger()
345 pr_warn(FW_BUG "Invalid trigger error action table.\n"); in __einj_error_trigger()
350 if (!trigger_tab->entry_count) in __einj_error_trigger()
353 rc = -EIO; in __einj_error_trigger()
354 table_size = trigger_tab->table_size; in __einj_error_trigger()
356 table_size - sizeof(*trigger_tab), in __einj_error_trigger()
357 "APEI EINJ Trigger Table"); in __einj_error_trigger()
359 pr_err("Can not request [mem %#010llx-%#010llx] for Trigger Table Entry\n", in __einj_error_trigger()
361 (unsigned long long)trigger_paddr + table_size - 1); in __einj_error_trigger()
367 pr_err("Failed to map trigger table!\n"); in __einj_error_trigger()
375 trigger_entry, trigger_tab->entry_count); in __einj_error_trigger()
383 * Some firmware will access target address specified in in __einj_error_trigger()
384 * param1 to trigger the error when injecting memory error. in __einj_error_trigger()
386 * remove it from trigger table resources. in __einj_error_trigger()
396 trigger_param_region->address, in __einj_error_trigger()
397 trigger_param_region->bit_width/8, true); in __einj_error_trigger()
407 rc = apei_resources_request(&trigger_resources, "APEI EINJ Trigger"); in __einj_error_trigger()
423 table_size - sizeof(*trigger_tab)); in __einj_error_trigger()
449 v5param->type = type; in __einj_error_inject()
453 v5param->apicid = param1; in __einj_error_inject()
456 v5param->memory_address = param1; in __einj_error_inject()
457 v5param->memory_address_range = param2; in __einj_error_inject()
460 v5param->pcie_sbdf = param1; in __einj_error_inject()
463 v5param->flags = vendor_flags; in __einj_error_inject()
465 v5param->flags = flags; in __einj_error_inject()
466 v5param->memory_address = param1; in __einj_error_inject()
467 v5param->memory_address_range = param2; in __einj_error_inject()
468 v5param->apicid = param3; in __einj_error_inject()
469 v5param->pcie_sbdf = param4; in __einj_error_inject()
475 v5param->apicid = param1; in __einj_error_inject()
476 v5param->flags = SETWA_FLAGS_APICID; in __einj_error_inject()
481 v5param->memory_address = param1; in __einj_error_inject()
482 v5param->memory_address_range = param2; in __einj_error_inject()
483 v5param->flags = SETWA_FLAGS_MEM; in __einj_error_inject()
488 v5param->pcie_sbdf = param1; in __einj_error_inject()
489 v5param->flags = SETWA_FLAGS_PCIE_SBDF; in __einj_error_inject()
500 v4param->param1 = param1; in __einj_error_inject()
501 v4param->param2 = param2; in __einj_error_inject()
515 return -EIO; in __einj_error_inject()
522 return -EBUSY; in __einj_error_inject()
524 return -EINVAL; in __einj_error_inject()
528 * to trigger the error. in __einj_error_inject()
554 return -EINVAL; in einj_error_inject()
576 * validation of the given RCRB base (MMIO) address. in einj_error_inject()
579 return -EINVAL; in einj_error_inject()
582 * Disallow crazy address masks that give BIOS leeway to pick in einj_error_inject()
583 * injection address almost anywhere. Insist on page or in einj_error_inject()
584 * better granularity and that target address is normal RAM or in einj_error_inject()
598 return -EINVAL; in einj_error_inject()
601 return -EADDRINUSE; in einj_error_inject()
617 return -EINVAL; in einj_cxl_rch_error_inject()
635 { BIT(1), "Processor Uncorrectable non-fatal" },
638 { BIT(4), "Memory Uncorrectable non-fatal" },
641 { BIT(7), "PCI Express Uncorrectable non-fatal" },
644 { BIT(10), "Platform Uncorrectable non-fatal" },
686 return -EINVAL; in einj_validate_error_type()
696 if (tval & (tval - 1)) in einj_validate_error_type()
697 return -EINVAL; in einj_validate_error_type()
703 return -EINVAL; in einj_validate_error_type()
728 return -EINVAL; in error_inject_set()
738 if ((einj_tab->header_length != in einj_check_table()
739 (sizeof(struct acpi_table_einj) - sizeof(einj_tab->header))) in einj_check_table()
740 && (einj_tab->header_length != sizeof(struct acpi_table_einj))) in einj_check_table()
741 return -EINVAL; in einj_check_table()
742 if (einj_tab->header.length < sizeof(struct acpi_table_einj)) in einj_check_table()
743 return -EINVAL; in einj_check_table()
744 if (einj_tab->entries != in einj_check_table()
745 (einj_tab->header.length - sizeof(struct acpi_table_einj)) / in einj_check_table()
747 return -EINVAL; in einj_check_table()
760 return -ENODEV; in einj_probe()
767 return -ENODEV; in einj_probe()
771 return -EINVAL; in einj_probe()
780 rc = -ENOMEM; in einj_probe()
806 pr_err("Error pre-mapping GARs.\n"); in einj_probe()
885 .name = "acpi-einj",
892 .name = "acpi-einj", in einj_init()
893 .id = -1, in einj_init()