diff options
author | Bob Moore <robert.moore@intel.com> | 2014-04-29 22:06:09 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-05-06 18:55:02 -0400 |
commit | 21126b296e6f5f172e72da7cebb42b87fbd19b3a (patch) | |
tree | 1f9577af4377d69c767608a84146d9e202895545 /drivers/acpi/acpica | |
parent | 57429a403eeaf4fe63e1a6956e3f57a673cfcd73 (diff) |
ACPICA: Remove extraneous error message for large number of GPEs.
Fixes a problem where an extraneous error message was emitted during
initialization if there is a GPE block larger than 255 bits. Any
GPE block larger than 120 GPEs could generate the error.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/acpica')
-rw-r--r-- | drivers/acpi/acpica/tbfadt.c | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c index a37af164b8c8..41519a958083 100644 --- a/drivers/acpi/acpica/tbfadt.c +++ b/drivers/acpi/acpica/tbfadt.c | |||
@@ -52,7 +52,8 @@ ACPI_MODULE_NAME("tbfadt") | |||
52 | static void | 52 | static void |
53 | acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, | 53 | acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, |
54 | u8 space_id, | 54 | u8 space_id, |
55 | u8 byte_width, u64 address, char *register_name); | 55 | u8 byte_width, |
56 | u64 address, char *register_name, u8 flags); | ||
56 | 57 | ||
57 | static void acpi_tb_convert_fadt(void); | 58 | static void acpi_tb_convert_fadt(void); |
58 | 59 | ||
@@ -69,13 +70,14 @@ typedef struct acpi_fadt_info { | |||
69 | u16 address32; | 70 | u16 address32; |
70 | u16 length; | 71 | u16 length; |
71 | u8 default_length; | 72 | u8 default_length; |
72 | u8 type; | 73 | u8 flags; |
73 | 74 | ||
74 | } acpi_fadt_info; | 75 | } acpi_fadt_info; |
75 | 76 | ||
76 | #define ACPI_FADT_OPTIONAL 0 | 77 | #define ACPI_FADT_OPTIONAL 0 |
77 | #define ACPI_FADT_REQUIRED 1 | 78 | #define ACPI_FADT_REQUIRED 1 |
78 | #define ACPI_FADT_SEPARATE_LENGTH 2 | 79 | #define ACPI_FADT_SEPARATE_LENGTH 2 |
80 | #define ACPI_FADT_GPE_REGISTER 4 | ||
79 | 81 | ||
80 | static struct acpi_fadt_info fadt_info_table[] = { | 82 | static struct acpi_fadt_info fadt_info_table[] = { |
81 | {"Pm1aEventBlock", | 83 | {"Pm1aEventBlock", |
@@ -125,14 +127,14 @@ static struct acpi_fadt_info fadt_info_table[] = { | |||
125 | ACPI_FADT_OFFSET(gpe0_block), | 127 | ACPI_FADT_OFFSET(gpe0_block), |
126 | ACPI_FADT_OFFSET(gpe0_block_length), | 128 | ACPI_FADT_OFFSET(gpe0_block_length), |
127 | 0, | 129 | 0, |
128 | ACPI_FADT_SEPARATE_LENGTH}, | 130 | ACPI_FADT_SEPARATE_LENGTH | ACPI_FADT_GPE_REGISTER}, |
129 | 131 | ||
130 | {"Gpe1Block", | 132 | {"Gpe1Block", |
131 | ACPI_FADT_OFFSET(xgpe1_block), | 133 | ACPI_FADT_OFFSET(xgpe1_block), |
132 | ACPI_FADT_OFFSET(gpe1_block), | 134 | ACPI_FADT_OFFSET(gpe1_block), |
133 | ACPI_FADT_OFFSET(gpe1_block_length), | 135 | ACPI_FADT_OFFSET(gpe1_block_length), |
134 | 0, | 136 | 0, |
135 | ACPI_FADT_SEPARATE_LENGTH} | 137 | ACPI_FADT_SEPARATE_LENGTH | ACPI_FADT_GPE_REGISTER} |
136 | }; | 138 | }; |
137 | 139 | ||
138 | #define ACPI_FADT_INFO_ENTRIES \ | 140 | #define ACPI_FADT_INFO_ENTRIES \ |
@@ -189,19 +191,29 @@ static struct acpi_fadt_pm_info fadt_pm_info_table[] = { | |||
189 | static void | 191 | static void |
190 | acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, | 192 | acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, |
191 | u8 space_id, | 193 | u8 space_id, |
192 | u8 byte_width, u64 address, char *register_name) | 194 | u8 byte_width, |
195 | u64 address, char *register_name, u8 flags) | ||
193 | { | 196 | { |
194 | u8 bit_width; | 197 | u8 bit_width; |
195 | 198 | ||
196 | /* Bit width field in the GAS is only one byte long, 255 max */ | 199 | /* |
197 | 200 | * Bit width field in the GAS is only one byte long, 255 max. | |
201 | * Check for bit_width overflow in GAS. | ||
202 | */ | ||
198 | bit_width = (u8)(byte_width * 8); | 203 | bit_width = (u8)(byte_width * 8); |
199 | 204 | if (byte_width > 31) { /* (31*8)=248, (32*8)=256 */ | |
200 | if (byte_width > 31) { /* (31*8)=248 */ | 205 | /* |
201 | ACPI_ERROR((AE_INFO, | 206 | * No error for GPE blocks, because we do not use the bit_width |
202 | "%s - 32-bit FADT register is too long (%u bytes, %u bits) " | 207 | * for GPEs, the legacy length (byte_width) is used instead to |
203 | "to convert to GAS struct - 255 bits max, truncating", | 208 | * allow for a large number of GPEs. |
204 | register_name, byte_width, (byte_width * 8))); | 209 | */ |
210 | if (!(flags & ACPI_FADT_GPE_REGISTER)) { | ||
211 | ACPI_ERROR((AE_INFO, | ||
212 | "%s - 32-bit FADT register is too long (%u bytes, %u bits) " | ||
213 | "to convert to GAS struct - 255 bits max, truncating", | ||
214 | register_name, byte_width, | ||
215 | (byte_width * 8))); | ||
216 | } | ||
205 | 217 | ||
206 | bit_width = 255; | 218 | bit_width = 255; |
207 | } | 219 | } |
@@ -450,6 +462,7 @@ static void acpi_tb_convert_fadt(void) | |||
450 | struct acpi_generic_address *address64; | 462 | struct acpi_generic_address *address64; |
451 | u32 address32; | 463 | u32 address32; |
452 | u8 length; | 464 | u8 length; |
465 | u8 flags; | ||
453 | u32 i; | 466 | u32 i; |
454 | 467 | ||
455 | /* | 468 | /* |
@@ -515,6 +528,7 @@ static void acpi_tb_convert_fadt(void) | |||
515 | fadt_info_table[i].length); | 528 | fadt_info_table[i].length); |
516 | 529 | ||
517 | name = fadt_info_table[i].name; | 530 | name = fadt_info_table[i].name; |
531 | flags = fadt_info_table[i].flags; | ||
518 | 532 | ||
519 | /* | 533 | /* |
520 | * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X" | 534 | * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X" |
@@ -554,7 +568,7 @@ static void acpi_tb_convert_fadt(void) | |||
554 | [i]. | 568 | [i]. |
555 | length), | 569 | length), |
556 | (u64)address32, | 570 | (u64)address32, |
557 | name); | 571 | name, flags); |
558 | } else if (address64->address != (u64)address32) { | 572 | } else if (address64->address != (u64)address32) { |
559 | 573 | ||
560 | /* Address mismatch */ | 574 | /* Address mismatch */ |
@@ -582,7 +596,8 @@ static void acpi_tb_convert_fadt(void) | |||
582 | length), | 596 | length), |
583 | (u64) | 597 | (u64) |
584 | address32, | 598 | address32, |
585 | name); | 599 | name, |
600 | flags); | ||
586 | } | 601 | } |
587 | } | 602 | } |
588 | } | 603 | } |
@@ -603,7 +618,7 @@ static void acpi_tb_convert_fadt(void) | |||
603 | address64->bit_width)); | 618 | address64->bit_width)); |
604 | } | 619 | } |
605 | 620 | ||
606 | if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) { | 621 | if (fadt_info_table[i].flags & ACPI_FADT_REQUIRED) { |
607 | /* | 622 | /* |
608 | * Field is required (Pm1a_event, Pm1a_control). | 623 | * Field is required (Pm1a_event, Pm1a_control). |
609 | * Both the address and length must be non-zero. | 624 | * Both the address and length must be non-zero. |
@@ -617,7 +632,7 @@ static void acpi_tb_convert_fadt(void) | |||
617 | address), | 632 | address), |
618 | length)); | 633 | length)); |
619 | } | 634 | } |
620 | } else if (fadt_info_table[i].type & ACPI_FADT_SEPARATE_LENGTH) { | 635 | } else if (fadt_info_table[i].flags & ACPI_FADT_SEPARATE_LENGTH) { |
621 | /* | 636 | /* |
622 | * Field is optional (Pm2_control, GPE0, GPE1) AND has its own | 637 | * Field is optional (Pm2_control, GPE0, GPE1) AND has its own |
623 | * length field. If present, both the address and length must | 638 | * length field. If present, both the address and length must |
@@ -726,7 +741,7 @@ static void acpi_tb_setup_fadt_registers(void) | |||
726 | (fadt_pm_info_table[i]. | 741 | (fadt_pm_info_table[i]. |
727 | register_num * | 742 | register_num * |
728 | pm1_register_byte_width), | 743 | pm1_register_byte_width), |
729 | "PmRegisters"); | 744 | "PmRegisters", 0); |
730 | } | 745 | } |
731 | } | 746 | } |
732 | } | 747 | } |