apei-internal.h 4.1 KB

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