152 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * apei-internal.h - ACPI Platform Error Interface internal4 * definitions.5 */6 7#ifndef APEI_INTERNAL_H8#define APEI_INTERNAL_H9 10#include <linux/acpi.h>11 12struct apei_exec_context;13 14typedef int (*apei_exec_ins_func_t)(struct apei_exec_context *ctx,15 struct acpi_whea_header *entry);16 17#define APEI_EXEC_INS_ACCESS_REGISTER 0x000118 19struct apei_exec_ins_type {20 u32 flags;21 apei_exec_ins_func_t run;22};23 24struct apei_exec_context {25 u32 ip;26 u64 value;27 u64 var1;28 u64 var2;29 u64 src_base;30 u64 dst_base;31 struct apei_exec_ins_type *ins_table;32 u32 instructions;33 struct acpi_whea_header *action_table;34 u32 entries;35};36 37void apei_exec_ctx_init(struct apei_exec_context *ctx,38 struct apei_exec_ins_type *ins_table,39 u32 instructions,40 struct acpi_whea_header *action_table,41 u32 entries);42 43static inline void apei_exec_ctx_set_input(struct apei_exec_context *ctx,44 u64 input)45{46 ctx->value = input;47}48 49static inline u64 apei_exec_ctx_get_output(struct apei_exec_context *ctx)50{51 return ctx->value;52}53 54int __apei_exec_run(struct apei_exec_context *ctx, u8 action, bool optional);55 56static inline int apei_exec_run(struct apei_exec_context *ctx, u8 action)57{58 return __apei_exec_run(ctx, action, 0);59}60 61/* It is optional whether the firmware provides the action */62static inline int apei_exec_run_optional(struct apei_exec_context *ctx, u8 action)63{64 return __apei_exec_run(ctx, action, 1);65}66 67/* Common instruction implementation */68 69/* IP has been set in instruction function */70#define APEI_EXEC_SET_IP 171 72int apei_map_generic_address(struct acpi_generic_address *reg);73 74static inline void apei_unmap_generic_address(struct acpi_generic_address *reg)75{76 acpi_os_unmap_generic_address(reg);77}78 79int apei_read(u64 *val, struct acpi_generic_address *reg);80int apei_write(u64 val, struct acpi_generic_address *reg);81 82int __apei_exec_read_register(struct acpi_whea_header *entry, u64 *val);83int __apei_exec_write_register(struct acpi_whea_header *entry, u64 val);84int apei_exec_read_register(struct apei_exec_context *ctx,85 struct acpi_whea_header *entry);86int apei_exec_read_register_value(struct apei_exec_context *ctx,87 struct acpi_whea_header *entry);88int apei_exec_write_register(struct apei_exec_context *ctx,89 struct acpi_whea_header *entry);90int apei_exec_write_register_value(struct apei_exec_context *ctx,91 struct acpi_whea_header *entry);92int apei_exec_noop(struct apei_exec_context *ctx,93 struct acpi_whea_header *entry);94int apei_exec_pre_map_gars(struct apei_exec_context *ctx);95int apei_exec_post_unmap_gars(struct apei_exec_context *ctx);96 97struct apei_resources {98 struct list_head iomem;99 struct list_head ioport;100};101 102static inline void apei_resources_init(struct apei_resources *resources)103{104 INIT_LIST_HEAD(&resources->iomem);105 INIT_LIST_HEAD(&resources->ioport);106}107 108void apei_resources_fini(struct apei_resources *resources);109int apei_resources_add(struct apei_resources *resources,110 unsigned long start, unsigned long size,111 bool iomem);112int apei_resources_sub(struct apei_resources *resources1,113 struct apei_resources *resources2);114int apei_resources_request(struct apei_resources *resources,115 const char *desc);116void apei_resources_release(struct apei_resources *resources);117int apei_exec_collect_resources(struct apei_exec_context *ctx,118 struct apei_resources *resources);119 120struct dentry;121struct dentry *apei_get_debugfs_dir(void);122 123static inline u32 cper_estatus_len(struct acpi_hest_generic_status *estatus)124{125 if (estatus->raw_data_length)126 return estatus->raw_data_offset + \127 estatus->raw_data_length;128 else129 return sizeof(*estatus) + estatus->data_length;130}131 132int apei_osc_setup(void);133 134int einj_get_available_error_type(u32 *type);135int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2, u64 param3,136 u64 param4);137int einj_cxl_rch_error_inject(u32 type, u32 flags, u64 param1, u64 param2,138 u64 param3, u64 param4);139bool einj_is_cxl_error_type(u64 type);140int einj_validate_error_type(u64 type);141 142#ifndef ACPI_EINJ_CXL_CACHE_CORRECTABLE143#define ACPI_EINJ_CXL_CACHE_CORRECTABLE BIT(12)144#define ACPI_EINJ_CXL_CACHE_UNCORRECTABLE BIT(13)145#define ACPI_EINJ_CXL_CACHE_FATAL BIT(14)146#define ACPI_EINJ_CXL_MEM_CORRECTABLE BIT(15)147#define ACPI_EINJ_CXL_MEM_UNCORRECTABLE BIT(16)148#define ACPI_EINJ_CXL_MEM_FATAL BIT(17)149#endif150 151#endif152