Blame view

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