brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · cd2766c Raw
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