aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2008-04-10 11:06:43 -0400
committerLen Brown <len.brown@intel.com>2008-04-22 14:29:31 -0400
commit3fa347770a8a9cb3568600380ce4b5c041b3ac0b (patch)
tree184d5b7f3cf94e43241e2ae137f501bf48941ea5
parent7823665eccdc7e230d0a904c6ec01d5c70ee099b (diff)
ACPICA: Disassembler support for new ACPI tables
Implemented full disassembler support for the following new ACPI tables: BERT, EINJ, and ERST. Partial disassembler support for the complicated HEST table. These tables support the Windows Hardware Error Architecture (WHEA). Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--include/acpi/acdisasm.h26
-rw-r--r--include/acpi/actbl1.h233
2 files changed, 249 insertions, 10 deletions
diff --git a/include/acpi/acdisasm.h b/include/acpi/acdisasm.h
index 07d5241ea7a2..73d86ebaeed6 100644
--- a/include/acpi/acdisasm.h
+++ b/include/acpi/acdisasm.h
@@ -99,10 +99,13 @@ typedef const struct acpi_dmtable_info {
99#define ACPI_DMT_GAS 22 99#define ACPI_DMT_GAS 22
100#define ACPI_DMT_ASF 23 100#define ACPI_DMT_ASF 23
101#define ACPI_DMT_DMAR 24 101#define ACPI_DMT_DMAR 24
102#define ACPI_DMT_MADT 25 102#define ACPI_DMT_HEST 25
103#define ACPI_DMT_SRAT 26 103#define ACPI_DMT_HESTNTFY 26
104#define ACPI_DMT_EXIT 27 104#define ACPI_DMT_HESTNTYP 27
105#define ACPI_DMT_SIG 28 105#define ACPI_DMT_MADT 28
106#define ACPI_DMT_SRAT 29
107#define ACPI_DMT_EXIT 30
108#define ACPI_DMT_SIG 31
106 109
107typedef 110typedef
108void (*acpi_dmtable_handler) (struct acpi_table_header * table); 111void (*acpi_dmtable_handler) (struct acpi_table_header * table);
@@ -150,6 +153,7 @@ extern struct acpi_dmtable_info acpi_dm_table_info_asf3[];
150extern struct acpi_dmtable_info acpi_dm_table_info_asf4[]; 153extern struct acpi_dmtable_info acpi_dm_table_info_asf4[];
151extern struct acpi_dmtable_info acpi_dm_table_info_asf_hdr[]; 154extern struct acpi_dmtable_info acpi_dm_table_info_asf_hdr[];
152extern struct acpi_dmtable_info acpi_dm_table_info_boot[]; 155extern struct acpi_dmtable_info acpi_dm_table_info_boot[];
156extern struct acpi_dmtable_info acpi_dm_table_info_bert[];
153extern struct acpi_dmtable_info acpi_dm_table_info_cpep[]; 157extern struct acpi_dmtable_info acpi_dm_table_info_cpep[];
154extern struct acpi_dmtable_info acpi_dm_table_info_cpep0[]; 158extern struct acpi_dmtable_info acpi_dm_table_info_cpep0[];
155extern struct acpi_dmtable_info acpi_dm_table_info_dbgp[]; 159extern struct acpi_dmtable_info acpi_dm_table_info_dbgp[];
@@ -159,11 +163,17 @@ extern struct acpi_dmtable_info acpi_dm_table_info_dmar_scope[];
159extern struct acpi_dmtable_info acpi_dm_table_info_dmar0[]; 163extern struct acpi_dmtable_info acpi_dm_table_info_dmar0[];
160extern struct acpi_dmtable_info acpi_dm_table_info_dmar1[]; 164extern struct acpi_dmtable_info acpi_dm_table_info_dmar1[];
161extern struct acpi_dmtable_info acpi_dm_table_info_ecdt[]; 165extern struct acpi_dmtable_info acpi_dm_table_info_ecdt[];
166extern struct acpi_dmtable_info acpi_dm_table_info_einj[];
167extern struct acpi_dmtable_info acpi_dm_table_info_einj0[];
168extern struct acpi_dmtable_info acpi_dm_table_info_erst[];
162extern struct acpi_dmtable_info acpi_dm_table_info_facs[]; 169extern struct acpi_dmtable_info acpi_dm_table_info_facs[];
163extern struct acpi_dmtable_info acpi_dm_table_info_fadt1[]; 170extern struct acpi_dmtable_info acpi_dm_table_info_fadt1[];
164extern struct acpi_dmtable_info acpi_dm_table_info_fadt2[]; 171extern struct acpi_dmtable_info acpi_dm_table_info_fadt2[];
165extern struct acpi_dmtable_info acpi_dm_table_info_gas[]; 172extern struct acpi_dmtable_info acpi_dm_table_info_gas[];
166extern struct acpi_dmtable_info acpi_dm_table_info_header[]; 173extern struct acpi_dmtable_info acpi_dm_table_info_header[];
174extern struct acpi_dmtable_info acpi_dm_table_info_hest[];
175extern struct acpi_dmtable_info acpi_dm_table_info_hest9[];
176extern struct acpi_dmtable_info acpi_dm_table_info_hest_notify[];
167extern struct acpi_dmtable_info acpi_dm_table_info_hpet[]; 177extern struct acpi_dmtable_info acpi_dm_table_info_hpet[];
168extern struct acpi_dmtable_info acpi_dm_table_info_madt[]; 178extern struct acpi_dmtable_info acpi_dm_table_info_madt[];
169extern struct acpi_dmtable_info acpi_dm_table_info_madt0[]; 179extern struct acpi_dmtable_info acpi_dm_table_info_madt0[];
@@ -215,9 +225,13 @@ void acpi_dm_dump_cpep(struct acpi_table_header *table);
215 225
216void acpi_dm_dump_dmar(struct acpi_table_header *table); 226void acpi_dm_dump_dmar(struct acpi_table_header *table);
217 227
228void acpi_dm_dump_einj(struct acpi_table_header *table);
229
230void acpi_dm_dump_erst(struct acpi_table_header *table);
231
218void acpi_dm_dump_fadt(struct acpi_table_header *table); 232void acpi_dm_dump_fadt(struct acpi_table_header *table);
219 233
220void acpi_dm_dump_srat(struct acpi_table_header *table); 234void acpi_dm_dump_hest(struct acpi_table_header *table);
221 235
222void acpi_dm_dump_mcfg(struct acpi_table_header *table); 236void acpi_dm_dump_mcfg(struct acpi_table_header *table);
223 237
@@ -229,6 +243,8 @@ void acpi_dm_dump_rsdt(struct acpi_table_header *table);
229 243
230void acpi_dm_dump_slit(struct acpi_table_header *table); 244void acpi_dm_dump_slit(struct acpi_table_header *table);
231 245
246void acpi_dm_dump_srat(struct acpi_table_header *table);
247
232void acpi_dm_dump_xsdt(struct acpi_table_header *table); 248void acpi_dm_dump_xsdt(struct acpi_table_header *table);
233 249
234/* 250/*
diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h
index 5d39992314a9..604dfb311660 100644
--- a/include/acpi/actbl1.h
+++ b/include/acpi/actbl1.h
@@ -109,8 +109,8 @@ struct acpi_whea_header {
109 u8 flags; 109 u8 flags;
110 u8 reserved; 110 u8 reserved;
111 struct acpi_generic_address register_region; 111 struct acpi_generic_address register_region;
112 u32 value; /* Value used with Read/Write register */ 112 u64 value; /* Value used with Read/Write register */
113 u32 mask; /* Bitmask required for this register instruction */ 113 u64 mask; /* Bitmask required for this register instruction */
114}; 114};
115 115
116/******************************************************************************* 116/*******************************************************************************
@@ -234,13 +234,14 @@ struct acpi_table_bert {
234 u64 address; /* Physical addresss of the error region */ 234 u64 address; /* Physical addresss of the error region */
235}; 235};
236 236
237/* Boot Error Region */
238
237struct acpi_bert_region { 239struct acpi_bert_region {
238 u32 block_status; 240 u32 block_status;
239 u32 raw_data_offset; 241 u32 raw_data_offset;
240 u32 raw_data_length; 242 u32 raw_data_length;
241 u32 data_length; 243 u32 data_length;
242 u32 error_severity; 244 u32 error_severity;
243 u8 error_data[1];
244}; 245};
245 246
246/* block_status Flags */ 247/* block_status Flags */
@@ -441,6 +442,15 @@ enum acpi_einj_instructions {
441 ACPI_EINJ_INSTRUCTION_RESERVED = 5 /* 5 and greater are reserved */ 442 ACPI_EINJ_INSTRUCTION_RESERVED = 5 /* 5 and greater are reserved */
442}; 443};
443 444
445/* EINJ Trigger Error Action Table */
446
447struct acpi_einj_trigger {
448 u32 header_size;
449 u32 revision;
450 u32 table_size;
451 u32 entry_count;
452};
453
444/******************************************************************************* 454/*******************************************************************************
445 * 455 *
446 * ERST - Error Record Serialization Table 456 * ERST - Error Record Serialization Table
@@ -518,7 +528,220 @@ struct acpi_table_hest {
518 u32 error_source_count; 528 u32 error_source_count;
519}; 529};
520 530
521/* TBD: Need Error Source Descriptor layout */ 531/* HEST subtable header */
532
533struct acpi_hest_header {
534 u16 type;
535};
536
537/* Values for Type field above for subtables */
538
539enum acpi_hest_types {
540 ACPI_HEST_TYPE_XPF_MACHINE_CHECK = 0,
541 ACPI_HEST_TYPE_XPF_CORRECTED_MACHINE_CHECK = 1,
542 ACPI_HEST_TYPE_XPF_UNUSED = 2,
543 ACPI_HEST_TYPE_XPF_NON_MASKABLE_INTERRUPT = 3,
544 ACPI_HEST_TYPE_IPF_CORRECTED_MACHINE_CHECK = 4,
545 ACPI_HEST_TYPE_IPF_CORRECTED_PLATFORM_ERROR = 5,
546 ACPI_HEST_TYPE_AER_ROOT_PORT = 6,
547 ACPI_HEST_TYPE_AER_ENDPOINT = 7,
548 ACPI_HEST_TYPE_AER_BRIDGE = 8,
549 ACPI_HEST_TYPE_GENERIC_HARDWARE_ERROR_SOURCE = 9,
550 ACPI_HEST_TYPE_RESERVED = 10 /* 10 and greater are reserved */
551};
552
553/*
554 * HEST Sub-subtables
555 */
556
557/* XPF Machine Check Error Bank */
558
559struct acpi_hest_xpf_error_bank {
560 u8 bank_number;
561 u8 clear_status_on_init;
562 u8 status_format;
563 u8 config_write_enable;
564 u32 control_register;
565 u64 control_init_data;
566 u32 status_register;
567 u32 address_register;
568 u32 misc_register;
569};
570
571/* Generic Error Status */
572
573struct acpi_hest_generic_status {
574 u32 block_status;
575 u32 raw_data_offset;
576 u32 raw_data_length;
577 u32 data_length;
578 u32 error_severity;
579};
580
581/* Generic Error Data */
582
583struct acpi_hest_generic_data {
584 u8 section_type[16];
585 u32 error_severity;
586 u16 revision;
587 u8 validation_bits;
588 u8 flags;
589 u32 error_data_length;
590 u8 fru_id[16];
591 u8 fru_text[20];
592};
593
594/* Common HEST structure for PCI/AER types below (6,7,8) */
595
596struct acpi_hest_aer_common {
597 u16 source_id;
598 u16 config_write_enable;
599 u8 flags;
600 u8 enabled;
601 u32 records_to_pre_allocate;
602 u32 max_sections_per_record;
603 u32 bus;
604 u16 device;
605 u16 function;
606 u16 device_control;
607 u16 reserved;
608 u32 uncorrectable_error_mask;
609 u32 uncorrectable_error_severity;
610 u32 correctable_error_mask;
611 u32 advanced_error_cababilities;
612};
613
614/* Hardware Error Notification */
615
616struct acpi_hest_notify {
617 u8 type;
618 u8 length;
619 u16 config_write_enable;
620 u32 poll_interval;
621 u32 vector;
622 u32 polling_threshold_value;
623 u32 polling_threshold_window;
624 u32 error_threshold_value;
625 u32 error_threshold_window;
626};
627
628/* Values for Notify Type field above */
629
630enum acpi_hest_notify_types {
631 ACPI_HEST_NOTIFY_POLLED = 0,
632 ACPI_HEST_NOTIFY_EXTERNAL = 1,
633 ACPI_HEST_NOTIFY_LOCAL = 2,
634 ACPI_HEST_NOTIFY_SCI = 3,
635 ACPI_HEST_NOTIFY_NMI = 4,
636 ACPI_HEST_NOTIFY_RESERVED = 5 /* 5 and greater are reserved */
637};
638
639/*
640 * HEST subtables
641 *
642 * From WHEA Design Document, 16 May 2007.
643 * Note: There is no subtable type 2 in this version of the document,
644 * and there are two different subtable type 3s.
645 */
646
647 /* 0: XPF Machine Check Exception */
648
649struct acpi_hest_xpf_machine_check {
650 struct acpi_hest_header header;
651 u16 source_id;
652 u16 config_write_enable;
653 u8 flags;
654 u8 reserved1;
655 u32 records_to_pre_allocate;
656 u32 max_sections_per_record;
657 u64 global_capability_data;
658 u64 global_control_data;
659 u8 num_hardware_banks;
660 u8 reserved2[7];
661};
662
663/* 1: XPF Corrected Machine Check */
664
665struct acpi_table_hest_xpf_corrected {
666 struct acpi_hest_header header;
667 u16 source_id;
668 u16 config_write_enable;
669 u8 flags;
670 u8 enabled;
671 u32 records_to_pre_allocate;
672 u32 max_sections_per_record;
673 struct acpi_hest_notify notify;
674 u8 num_hardware_banks;
675 u8 reserved[3];
676};
677
678/* 3: XPF Non-Maskable Interrupt */
679
680struct acpi_hest_xpf_nmi {
681 struct acpi_hest_header header;
682 u16 source_id;
683 u32 reserved;
684 u32 records_to_pre_allocate;
685 u32 max_sections_per_record;
686 u32 max_raw_data_length;
687};
688
689/* 4: IPF Corrected Machine Check */
690
691struct acpi_hest_ipf_corrected {
692 struct acpi_hest_header header;
693 u8 enabled;
694 u8 reserved;
695};
696
697/* 5: IPF Corrected Platform Error */
698
699struct acpi_hest_ipf_corrected_platform {
700 struct acpi_hest_header header;
701 u8 enabled;
702 u8 reserved;
703};
704
705/* 6: PCI Express Root Port AER */
706
707struct acpi_hest_aer_root {
708 struct acpi_hest_header header;
709 struct acpi_hest_aer_common aer;
710 u32 root_error_command;
711};
712
713/* 7: PCI Express AER (AER Endpoint) */
714
715struct acpi_hest_aer {
716 struct acpi_hest_header header;
717 struct acpi_hest_aer_common aer;
718};
719
720/* 8: PCI Express/PCI-X Bridge AER */
721
722struct acpi_hest_aer_bridge {
723 struct acpi_hest_header header;
724 struct acpi_hest_aer_common aer;
725 u32 secondary_uncorrectable_error_mask;
726 u32 secondary_uncorrectable_error_severity;
727 u32 secondary_advanced_capabilities;
728};
729
730/* 9: Generic Hardware Error Source */
731
732struct acpi_hest_generic {
733 struct acpi_hest_header header;
734 u16 source_id;
735 u16 related_source_id;
736 u8 config_write_enable;
737 u8 enabled;
738 u32 records_to_pre_allocate;
739 u32 max_sections_per_record;
740 u32 max_raw_data_length;
741 struct acpi_generic_address error_status_address;
742 struct acpi_hest_notify notify;
743 u32 error_status_block_length;
744};
522 745
523/******************************************************************************* 746/*******************************************************************************
524 * 747 *
@@ -545,7 +768,7 @@ struct acpi_table_hpet {
545 768
546/******************************************************************************* 769/*******************************************************************************
547 * 770 *
548 * IBFT - i_sCSI Boot Firmware Table 771 * IBFT - Boot Firmware Table
549 * 772 *
550 ******************************************************************************/ 773 ******************************************************************************/
551 774