linux/drivers/acpi/apei/apei-internal.h
<<
>>
Prefs
   1/*
   2 * apei-internal.h - ACPI Platform Error Interface internal
   3 * definations.
   4 */
   5
   6#ifndef APEI_INTERNAL_H
   7#define APEI_INTERNAL_H
   8
   9#include <linux/cper.h>
  10
  11struct apei_exec_context;
  12
  13typedef int (*apei_exec_ins_func_t)(struct apei_exec_context *ctx,
  14                                    struct acpi_whea_header *entry);
  15
  16#define APEI_EXEC_INS_ACCESS_REGISTER   0x0001
  17
  18struct apei_exec_ins_type {
  19        u32 flags;
  20        apei_exec_ins_func_t run;
  21};
  22
  23struct apei_exec_context {
  24        u32 ip;
  25        u64 value;
  26        u64 var1;
  27        u64 var2;
  28        u64 src_base;
  29        u64 dst_base;
  30        struct apei_exec_ins_type *ins_table;
  31        u32 instructions;
  32        struct acpi_whea_header *action_table;
  33        u32 entries;
  34};
  35
  36void apei_exec_ctx_init(struct apei_exec_context *ctx,
  37                        struct apei_exec_ins_type *ins_table,
  38                        u32 instructions,
  39                        struct acpi_whea_header *action_table,
  40                        u32 entries);
  41
  42static inline void apei_exec_ctx_set_input(struct apei_exec_context *ctx,
  43                                           u64 input)
  44{
  45        ctx->value = input;
  46}
  47
  48static inline u64 apei_exec_ctx_get_output(struct apei_exec_context *ctx)
  49{
  50        return ctx->value;
  51}
  52
  53int apei_exec_run(struct apei_exec_context *ctx, u8 action);
  54
  55/* Common instruction implementation */
  56
  57/* IP has been set in instruction function */
  58#define APEI_EXEC_SET_IP        1
  59
  60int __apei_exec_read_register(struct acpi_whea_header *entry, u64 *val);
  61int __apei_exec_write_register(struct acpi_whea_header *entry, u64 val);
  62int apei_exec_read_register(struct apei_exec_context *ctx,
  63                            struct acpi_whea_header *entry);
  64int apei_exec_read_register_value(struct apei_exec_context *ctx,
  65                                  struct acpi_whea_header *entry);
  66int apei_exec_write_register(struct apei_exec_context *ctx,
  67                             struct acpi_whea_header *entry);
  68int apei_exec_write_register_value(struct apei_exec_context *ctx,
  69                                   struct acpi_whea_header *entry);
  70int apei_exec_noop(struct apei_exec_context *ctx,
  71                   struct acpi_whea_header *entry);
  72int apei_exec_pre_map_gars(struct apei_exec_context *ctx);
  73int apei_exec_post_unmap_gars(struct apei_exec_context *ctx);
  74
  75struct apei_resources {
  76        struct list_head iomem;
  77        struct list_head ioport;
  78};
  79
  80static inline void apei_resources_init(struct apei_resources *resources)
  81{
  82        INIT_LIST_HEAD(&resources->iomem);
  83        INIT_LIST_HEAD(&resources->ioport);
  84}
  85
  86void apei_resources_fini(struct apei_resources *resources);
  87int apei_resources_sub(struct apei_resources *resources1,
  88                       struct apei_resources *resources2);
  89int apei_resources_request(struct apei_resources *resources,
  90                           const char *desc);
  91void apei_resources_release(struct apei_resources *resources);
  92int apei_exec_collect_resources(struct apei_exec_context *ctx,
  93                                struct apei_resources *resources);
  94
  95struct dentry;
  96struct dentry *apei_get_debugfs_dir(void);
  97
  98#define apei_estatus_for_each_section(estatus, section)                 \
  99        for (section = (struct acpi_hest_generic_data *)(estatus + 1);  \
 100             (void *)section - (void *)estatus < estatus->data_length;  \
 101             section = (void *)(section+1) + section->error_data_length)
 102
 103static inline u32 apei_estatus_len(struct acpi_hest_generic_status *estatus)
 104{
 105        if (estatus->raw_data_length)
 106                return estatus->raw_data_offset + \
 107                        estatus->raw_data_length;
 108        else
 109                return sizeof(*estatus) + estatus->data_length;
 110}
 111
 112void apei_estatus_print(const char *pfx,
 113                        const struct acpi_hest_generic_status *estatus);
 114int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus);
 115int apei_estatus_check(const struct acpi_hest_generic_status *estatus);
 116#endif
 117