diff options
Diffstat (limited to 'drivers/acpi/resources/rscreate.c')
| -rw-r--r-- | drivers/acpi/resources/rscreate.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/drivers/acpi/resources/rscreate.c b/drivers/acpi/resources/rscreate.c index faddaee1bc07..7804a8c40e7a 100644 --- a/drivers/acpi/resources/rscreate.c +++ b/drivers/acpi/resources/rscreate.c | |||
| @@ -181,9 +181,9 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | /* | 183 | /* |
| 184 | * Loop through the ACPI_INTERNAL_OBJECTS - Each object | 184 | * Loop through the ACPI_INTERNAL_OBJECTS - Each object should be a |
| 185 | * should be a package that in turn contains an | 185 | * package that in turn contains an acpi_integer Address, a u8 Pin, |
| 186 | * acpi_integer Address, a u8 Pin, a Name and a u8 source_index. | 186 | * a Name, and a u8 source_index. |
| 187 | */ | 187 | */ |
| 188 | top_object_list = package_object->package.elements; | 188 | top_object_list = package_object->package.elements; |
| 189 | number_of_elements = package_object->package.count; | 189 | number_of_elements = package_object->package.count; |
| @@ -240,9 +240,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 240 | /* 1) First subobject: Dereference the PRT.Address */ | 240 | /* 1) First subobject: Dereference the PRT.Address */ |
| 241 | 241 | ||
| 242 | obj_desc = sub_object_list[0]; | 242 | obj_desc = sub_object_list[0]; |
| 243 | if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { | 243 | if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) { |
| 244 | user_prt->address = obj_desc->integer.value; | ||
| 245 | } else { | ||
| 246 | ACPI_ERROR((AE_INFO, | 244 | ACPI_ERROR((AE_INFO, |
| 247 | "(PRT[%X].Address) Need Integer, found %s", | 245 | "(PRT[%X].Address) Need Integer, found %s", |
| 248 | index, | 246 | index, |
| @@ -250,12 +248,12 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 250 | return_ACPI_STATUS(AE_BAD_DATA); | 248 | return_ACPI_STATUS(AE_BAD_DATA); |
| 251 | } | 249 | } |
| 252 | 250 | ||
| 251 | user_prt->address = obj_desc->integer.value; | ||
| 252 | |||
| 253 | /* 2) Second subobject: Dereference the PRT.Pin */ | 253 | /* 2) Second subobject: Dereference the PRT.Pin */ |
| 254 | 254 | ||
| 255 | obj_desc = sub_object_list[1]; | 255 | obj_desc = sub_object_list[1]; |
| 256 | if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { | 256 | if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) { |
| 257 | user_prt->pin = (u32) obj_desc->integer.value; | ||
| 258 | } else { | ||
| 259 | ACPI_ERROR((AE_INFO, | 257 | ACPI_ERROR((AE_INFO, |
| 260 | "(PRT[%X].Pin) Need Integer, found %s", | 258 | "(PRT[%X].Pin) Need Integer, found %s", |
| 261 | index, | 259 | index, |
| @@ -284,6 +282,25 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 284 | } | 282 | } |
| 285 | } | 283 | } |
| 286 | 284 | ||
| 285 | user_prt->pin = (u32) obj_desc->integer.value; | ||
| 286 | |||
| 287 | /* | ||
| 288 | * If the BIOS has erroneously reversed the _PRT source_name (index 2) | ||
| 289 | * and the source_index (index 3), fix it. _PRT is important enough to | ||
| 290 | * workaround this BIOS error. This also provides compatibility with | ||
| 291 | * other ACPI implementations. | ||
| 292 | */ | ||
| 293 | obj_desc = sub_object_list[3]; | ||
| 294 | if (!obj_desc | ||
| 295 | || (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER)) { | ||
| 296 | sub_object_list[3] = sub_object_list[2]; | ||
| 297 | sub_object_list[2] = obj_desc; | ||
| 298 | |||
| 299 | ACPI_WARNING((AE_INFO, | ||
| 300 | "(PRT[%X].Source) SourceName and SourceIndex are reversed, fixed", | ||
| 301 | index)); | ||
| 302 | } | ||
| 303 | |||
| 287 | /* | 304 | /* |
| 288 | * 3) Third subobject: Dereference the PRT.source_name | 305 | * 3) Third subobject: Dereference the PRT.source_name |
| 289 | * The name may be unresolved (slack mode), so allow a null object | 306 | * The name may be unresolved (slack mode), so allow a null object |
| @@ -364,9 +381,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 364 | /* 4) Fourth subobject: Dereference the PRT.source_index */ | 381 | /* 4) Fourth subobject: Dereference the PRT.source_index */ |
| 365 | 382 | ||
| 366 | obj_desc = sub_object_list[source_index_index]; | 383 | obj_desc = sub_object_list[source_index_index]; |
| 367 | if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { | 384 | if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) { |
| 368 | user_prt->source_index = (u32) obj_desc->integer.value; | ||
| 369 | } else { | ||
| 370 | ACPI_ERROR((AE_INFO, | 385 | ACPI_ERROR((AE_INFO, |
| 371 | "(PRT[%X].SourceIndex) Need Integer, found %s", | 386 | "(PRT[%X].SourceIndex) Need Integer, found %s", |
| 372 | index, | 387 | index, |
| @@ -374,6 +389,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 374 | return_ACPI_STATUS(AE_BAD_DATA); | 389 | return_ACPI_STATUS(AE_BAD_DATA); |
| 375 | } | 390 | } |
| 376 | 391 | ||
| 392 | user_prt->source_index = (u32) obj_desc->integer.value; | ||
| 393 | |||
| 377 | /* Point to the next union acpi_operand_object in the top level package */ | 394 | /* Point to the next union acpi_operand_object in the top level package */ |
| 378 | 395 | ||
| 379 | top_object_list++; | 396 | top_object_list++; |
