]>
Commit | Line | Data |
---|---|---|
a643ce20 YH |
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 | ||
06d65dea YH |
9 | #include <linux/cper.h> |
10 | ||
a643ce20 YH |
11 | struct apei_exec_context; |
12 | ||
13 | typedef 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 | ||
18 | struct apei_exec_ins_type { | |
19 | u32 flags; | |
20 | apei_exec_ins_func_t run; | |
21 | }; | |
22 | ||
23 | struct 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 | ||
36 | void 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 | ||
42 | static inline void apei_exec_ctx_set_input(struct apei_exec_context *ctx, | |
43 | u64 input) | |
44 | { | |
45 | ctx->value = input; | |
46 | } | |
47 | ||
48 | static inline u64 apei_exec_ctx_get_output(struct apei_exec_context *ctx) | |
49 | { | |
50 | return ctx->value; | |
51 | } | |
52 | ||
eecf2f71 YH |
53 | int __apei_exec_run(struct apei_exec_context *ctx, u8 action, bool optional); |
54 | ||
55 | static inline int apei_exec_run(struct apei_exec_context *ctx, u8 action) | |
56 | { | |
57 | return __apei_exec_run(ctx, action, 0); | |
58 | } | |
59 | ||
60 | /* It is optional whether the firmware provides the action */ | |
61 | static inline int apei_exec_run_optional(struct apei_exec_context *ctx, u8 action) | |
62 | { | |
63 | return __apei_exec_run(ctx, action, 1); | |
64 | } | |
a643ce20 YH |
65 | |
66 | /* Common instruction implementation */ | |
67 | ||
68 | /* IP has been set in instruction function */ | |
69 | #define APEI_EXEC_SET_IP 1 | |
70 | ||
700130b4 MS |
71 | int apei_read(u64 *val, struct acpi_generic_address *reg); |
72 | int apei_write(u64 val, struct acpi_generic_address *reg); | |
73 | ||
a643ce20 YH |
74 | int __apei_exec_read_register(struct acpi_whea_header *entry, u64 *val); |
75 | int __apei_exec_write_register(struct acpi_whea_header *entry, u64 val); | |
76 | int apei_exec_read_register(struct apei_exec_context *ctx, | |
77 | struct acpi_whea_header *entry); | |
78 | int apei_exec_read_register_value(struct apei_exec_context *ctx, | |
79 | struct acpi_whea_header *entry); | |
80 | int apei_exec_write_register(struct apei_exec_context *ctx, | |
81 | struct acpi_whea_header *entry); | |
82 | int apei_exec_write_register_value(struct apei_exec_context *ctx, | |
83 | struct acpi_whea_header *entry); | |
84 | int apei_exec_noop(struct apei_exec_context *ctx, | |
85 | struct acpi_whea_header *entry); | |
86 | int apei_exec_pre_map_gars(struct apei_exec_context *ctx); | |
87 | int apei_exec_post_unmap_gars(struct apei_exec_context *ctx); | |
88 | ||
89 | struct apei_resources { | |
90 | struct list_head iomem; | |
91 | struct list_head ioport; | |
92 | }; | |
93 | ||
94 | static inline void apei_resources_init(struct apei_resources *resources) | |
95 | { | |
96 | INIT_LIST_HEAD(&resources->iomem); | |
97 | INIT_LIST_HEAD(&resources->ioport); | |
98 | } | |
99 | ||
100 | void apei_resources_fini(struct apei_resources *resources); | |
fdea163d YH |
101 | int apei_resources_add(struct apei_resources *resources, |
102 | unsigned long start, unsigned long size, | |
103 | bool iomem); | |
a643ce20 YH |
104 | int apei_resources_sub(struct apei_resources *resources1, |
105 | struct apei_resources *resources2); | |
106 | int apei_resources_request(struct apei_resources *resources, | |
107 | const char *desc); | |
108 | void apei_resources_release(struct apei_resources *resources); | |
109 | int apei_exec_collect_resources(struct apei_exec_context *ctx, | |
110 | struct apei_resources *resources); | |
111 | ||
112 | struct dentry; | |
113 | struct dentry *apei_get_debugfs_dir(void); | |
06d65dea YH |
114 | |
115 | #define apei_estatus_for_each_section(estatus, section) \ | |
116 | for (section = (struct acpi_hest_generic_data *)(estatus + 1); \ | |
117 | (void *)section - (void *)estatus < estatus->data_length; \ | |
118 | section = (void *)(section+1) + section->error_data_length) | |
119 | ||
120 | static inline u32 apei_estatus_len(struct acpi_hest_generic_status *estatus) | |
121 | { | |
122 | if (estatus->raw_data_length) | |
123 | return estatus->raw_data_offset + \ | |
124 | estatus->raw_data_length; | |
125 | else | |
126 | return sizeof(*estatus) + estatus->data_length; | |
127 | } | |
128 | ||
f59c55d0 YH |
129 | void apei_estatus_print(const char *pfx, |
130 | const struct acpi_hest_generic_status *estatus); | |
06d65dea YH |
131 | int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus); |
132 | int apei_estatus_check(const struct acpi_hest_generic_status *estatus); | |
9fb0bfe1 YH |
133 | |
134 | int apei_osc_setup(void); | |
a643ce20 | 135 | #endif |