Lines Matching +full:trigger +full:- +full:address
1 // SPDX-License-Identifier: GPL-2.0-only
11 * Copyright 2009-2010 Intel Corp.
26 #include "apei-internal.h"
82 * most will ignore the parameter and make their own choice of address
145 EINJ_TAB_ENTRY(einj_tab), einj_tab->entries); in einj_exec_ctx_init()
180 *t -= SLEEP_UNIT_MIN; in einj_timedout()
192 vendor_size = v->length - sizeof(struct vendor_error_type_extension); in get_oem_vendor_struct()
204 int offset = v5param->vendor_extension; in check_vendor_extension()
214 sbdf = v->pcie_sbdf; in check_vendor_extension()
218 v->vendor_id, v->device_id, v->rev_id); in check_vendor_extension()
229 for (i = 0; i < einj_tab->entries; i++) { in einj_get_parameter_address()
230 if (entry->action == ACPI_EINJ_SET_ERROR_TYPE && in einj_get_parameter_address()
231 entry->instruction == ACPI_EINJ_WRITE_REGISTER && in einj_get_parameter_address()
232 entry->register_region.space_id == in einj_get_parameter_address()
234 pa_v4 = get_unaligned(&entry->register_region.address); in einj_get_parameter_address()
235 if (entry->action == ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS && in einj_get_parameter_address()
236 entry->instruction == ACPI_EINJ_WRITE_REGISTER && in einj_get_parameter_address()
237 entry->register_region.space_id == in einj_get_parameter_address()
239 pa_v5 = get_unaligned(&entry->register_region.address); in einj_get_parameter_address()
258 if (v4param->reserved1 || v4param->reserved2) { in einj_get_parameter_address()
268 /* do sanity check to trigger table */
271 if (trigger_tab->header_size != sizeof(struct acpi_einj_trigger)) in einj_check_trigger_header()
272 return -EINVAL; in einj_check_trigger_header()
273 if (trigger_tab->table_size > PAGE_SIZE || in einj_check_trigger_header()
274 trigger_tab->table_size < trigger_tab->header_size) in einj_check_trigger_header()
275 return -EINVAL; in einj_check_trigger_header()
276 if (trigger_tab->entry_count != in einj_check_trigger_header()
277 (trigger_tab->table_size - trigger_tab->header_size) / in einj_check_trigger_header()
279 return -EINVAL; in einj_check_trigger_header()
292 for (i = 0; i < trigger_tab->entry_count; i++) { in einj_get_trigger_parameter_region()
293 if (entry->action == ACPI_EINJ_TRIGGER_ERROR && in einj_get_trigger_parameter_region()
294 entry->instruction <= ACPI_EINJ_WRITE_REGISTER_VALUE && in einj_get_trigger_parameter_region()
295 entry->register_region.space_id == in einj_get_trigger_parameter_region()
297 (entry->register_region.address & param2) == (param1 & param2)) in einj_get_trigger_parameter_region()
298 return &entry->register_region; in einj_get_trigger_parameter_region()
304 /* Execute instructions in trigger error action table */
314 int rc = -EIO; in __einj_error_trigger()
318 "APEI EINJ Trigger Table"); in __einj_error_trigger()
320 pr_err("Can not request [mem %#010llx-%#010llx] for Trigger table\n", in __einj_error_trigger()
323 sizeof(*trigger_tab) - 1); in __einj_error_trigger()
328 pr_err("Failed to map trigger table!\n"); in __einj_error_trigger()
333 pr_warn(FW_BUG "Invalid trigger error action table.\n"); in __einj_error_trigger()
338 if (!trigger_tab->entry_count) in __einj_error_trigger()
341 rc = -EIO; in __einj_error_trigger()
342 table_size = trigger_tab->table_size; in __einj_error_trigger()
344 table_size - sizeof(*trigger_tab), in __einj_error_trigger()
345 "APEI EINJ Trigger Table"); in __einj_error_trigger()
347 pr_err("Can not request [mem %#010llx-%#010llx] for Trigger Table Entry\n", in __einj_error_trigger()
349 (unsigned long long)trigger_paddr + table_size - 1); in __einj_error_trigger()
355 pr_err("Failed to map trigger table!\n"); in __einj_error_trigger()
363 trigger_entry, trigger_tab->entry_count); in __einj_error_trigger()
371 * Some firmware will access target address specified in in __einj_error_trigger()
372 * param1 to trigger the error when injecting memory error. in __einj_error_trigger()
374 * remove it from trigger table resources. in __einj_error_trigger()
384 trigger_param_region->address, in __einj_error_trigger()
385 trigger_param_region->bit_width/8, true); in __einj_error_trigger()
395 rc = apei_resources_request(&trigger_resources, "APEI EINJ Trigger"); in __einj_error_trigger()
411 table_size - sizeof(*trigger_tab)); in __einj_error_trigger()
437 v5param->type = type; in __einj_error_inject()
441 v5param->apicid = param1; in __einj_error_inject()
444 v5param->memory_address = param1; in __einj_error_inject()
445 v5param->memory_address_range = param2; in __einj_error_inject()
448 v5param->pcie_sbdf = param1; in __einj_error_inject()
451 v5param->flags = vendor_flags; in __einj_error_inject()
453 v5param->flags = flags; in __einj_error_inject()
454 v5param->memory_address = param1; in __einj_error_inject()
455 v5param->memory_address_range = param2; in __einj_error_inject()
456 v5param->apicid = param3; in __einj_error_inject()
457 v5param->pcie_sbdf = param4; in __einj_error_inject()
463 v5param->apicid = param1; in __einj_error_inject()
464 v5param->flags = SETWA_FLAGS_APICID; in __einj_error_inject()
469 v5param->memory_address = param1; in __einj_error_inject()
470 v5param->memory_address_range = param2; in __einj_error_inject()
471 v5param->flags = SETWA_FLAGS_MEM; in __einj_error_inject()
476 v5param->pcie_sbdf = param1; in __einj_error_inject()
477 v5param->flags = SETWA_FLAGS_PCIE_SBDF; in __einj_error_inject()
488 v4param->param1 = param1; in __einj_error_inject()
489 v4param->param2 = param2; in __einj_error_inject()
503 return -EIO; in __einj_error_inject()
510 return -EBUSY; in __einj_error_inject()
512 return -EINVAL; in __einj_error_inject()
516 * to trigger the error. in __einj_error_inject()
542 return -EINVAL; in einj_error_inject()
561 * Disallow crazy address masks that give BIOS leeway to pick in einj_error_inject()
562 * injection address almost anywhere. Insist on page or in einj_error_inject()
563 * better granularity and that target address is normal RAM or in einj_error_inject()
577 return -EINVAL; in einj_error_inject()
580 return -EADDRINUSE; in einj_error_inject()
599 { BIT(1), "Processor Uncorrectable non-fatal" },
602 { BIT(4), "Memory Uncorrectable non-fatal" },
605 { BIT(7), "PCI Express Uncorrectable non-fatal" },
608 { BIT(10), "Platform Uncorrectable non-fatal" },
611 { BIT(13), "CXL.cache Protocol Uncorrectable non-fatal" },
614 { BIT(16), "CXL.mem Protocol Uncorrectable non-fatal" },
652 return -EINVAL; in error_type_set()
662 if (tval & (tval - 1)) in error_type_set()
663 return -EINVAL; in error_type_set()
669 return -EINVAL; in error_type_set()
682 return -EINVAL; in error_inject_set()
692 if ((einj_tab->header_length != in einj_check_table()
693 (sizeof(struct acpi_table_einj) - sizeof(einj_tab->header))) in einj_check_table()
694 && (einj_tab->header_length != sizeof(struct acpi_table_einj))) in einj_check_table()
695 return -EINVAL; in einj_check_table()
696 if (einj_tab->header.length < sizeof(struct acpi_table_einj)) in einj_check_table()
697 return -EINVAL; in einj_check_table()
698 if (einj_tab->entries != in einj_check_table()
699 (einj_tab->header.length - sizeof(struct acpi_table_einj)) / in einj_check_table()
701 return -EINVAL; in einj_check_table()
714 return -ENODEV; in einj_init()
721 return -ENODEV; in einj_init()
725 return -EINVAL; in einj_init()
734 rc = -ENOMEM; in einj_init()
760 pr_err("Error pre-mapping GARs.\n"); in einj_init()