diff options
| author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2005-09-20 15:26:00 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2006-01-07 02:37:24 -0500 |
| commit | 6f957eaf79356a32e838f5f262ee9a60544b1d5b (patch) | |
| tree | 1285828e48329d78b970526729f6c631c23dd8e0 /drivers | |
| parent | 0aec63e67c69545ca757a73a66f5dcf05fa484bf (diff) | |
[ACPI] enable PNPACPI support for resource types used by HP serial ports
PNPACPI complained about and ignored devices with ADDRESS16, ADDRESS32, or
ADDRESS64 descriptors in _PRS. HP firmware uses them for built-in serial
ports, so this patch adds support for parsing these descriptors from _PRS.
Note that this does not add the corresponding support for encoding them in
preparation for _SRS, because I don't have any machine that supports _SRS
on these descriptors, so I couldn't test that support. Attempts to encode
them will cause a warning and an -EINVAL return.
http://sourceforge.net/mailarchive/forum.php?thread_id=8250154&forum_id=6102
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pnp/pnpacpi/rsparser.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index 416d30debe6c..2424bd3620dc 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
| @@ -453,6 +453,45 @@ pnpacpi_parse_fixed_mem32_option(struct pnp_option *option, | |||
| 453 | return; | 453 | return; |
| 454 | } | 454 | } |
| 455 | 455 | ||
| 456 | static void | ||
| 457 | pnpacpi_parse_address_option(struct pnp_option *option, struct acpi_resource *r) | ||
| 458 | { | ||
| 459 | struct acpi_resource_address64 addr, *p = &addr; | ||
| 460 | acpi_status status; | ||
| 461 | struct pnp_mem * mem; | ||
| 462 | struct pnp_port * port; | ||
| 463 | |||
| 464 | status = acpi_resource_to_address64(r, p); | ||
| 465 | if (!ACPI_SUCCESS(status)) { | ||
| 466 | pnp_warn("PnPACPI: failed to convert resource type %d", r->id); | ||
| 467 | return; | ||
| 468 | } | ||
| 469 | |||
| 470 | if (p->address_length == 0) | ||
| 471 | return; | ||
| 472 | |||
| 473 | if (p->resource_type == ACPI_MEMORY_RANGE) { | ||
| 474 | mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL); | ||
| 475 | if (!mem) | ||
| 476 | return; | ||
| 477 | mem->min = mem->max = p->min_address_range; | ||
| 478 | mem->size = p->address_length; | ||
| 479 | mem->align = 0; | ||
| 480 | mem->flags = (p->attribute.memory.read_write_attribute == | ||
| 481 | ACPI_READ_WRITE_MEMORY) ? IORESOURCE_MEM_WRITEABLE : 0; | ||
| 482 | pnp_register_mem_resource(option,mem); | ||
| 483 | } else if (p->resource_type == ACPI_IO_RANGE) { | ||
| 484 | port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL); | ||
| 485 | if (!port) | ||
| 486 | return; | ||
| 487 | port->min = port->max = p->min_address_range; | ||
| 488 | port->size = p->address_length; | ||
| 489 | port->align = 0; | ||
| 490 | port->flags = PNP_PORT_FLAG_FIXED; | ||
| 491 | pnp_register_port_resource(option,port); | ||
| 492 | } | ||
| 493 | } | ||
| 494 | |||
| 456 | struct acpipnp_parse_option_s { | 495 | struct acpipnp_parse_option_s { |
| 457 | struct pnp_option *option; | 496 | struct pnp_option *option; |
| 458 | struct pnp_option *option_independent; | 497 | struct pnp_option *option_independent; |
| @@ -495,6 +534,11 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res, | |||
| 495 | pnpacpi_parse_fixed_mem32_option(option, | 534 | pnpacpi_parse_fixed_mem32_option(option, |
| 496 | &res->data.fixed_memory32); | 535 | &res->data.fixed_memory32); |
| 497 | break; | 536 | break; |
| 537 | case ACPI_RSTYPE_ADDRESS16: | ||
| 538 | case ACPI_RSTYPE_ADDRESS32: | ||
| 539 | case ACPI_RSTYPE_ADDRESS64: | ||
| 540 | pnpacpi_parse_address_option(option, res); | ||
| 541 | break; | ||
| 498 | case ACPI_RSTYPE_START_DPF: | 542 | case ACPI_RSTYPE_START_DPF: |
| 499 | switch (res->data.start_dpf.compatibility_priority) { | 543 | switch (res->data.start_dpf.compatibility_priority) { |
| 500 | case ACPI_GOOD_CONFIGURATION: | 544 | case ACPI_GOOD_CONFIGURATION: |
| @@ -568,11 +612,9 @@ static acpi_status pnpacpi_count_resources(struct acpi_resource *res, | |||
| 568 | case ACPI_RSTYPE_MEM24: | 612 | case ACPI_RSTYPE_MEM24: |
| 569 | case ACPI_RSTYPE_MEM32: | 613 | case ACPI_RSTYPE_MEM32: |
| 570 | case ACPI_RSTYPE_FIXED_MEM32: | 614 | case ACPI_RSTYPE_FIXED_MEM32: |
| 571 | #if 0 | ||
| 572 | case ACPI_RSTYPE_ADDRESS16: | 615 | case ACPI_RSTYPE_ADDRESS16: |
| 573 | case ACPI_RSTYPE_ADDRESS32: | 616 | case ACPI_RSTYPE_ADDRESS32: |
| 574 | case ACPI_RSTYPE_ADDRESS64: | 617 | case ACPI_RSTYPE_ADDRESS64: |
| 575 | #endif | ||
| 576 | (*res_cnt) ++; | 618 | (*res_cnt) ++; |
| 577 | default: | 619 | default: |
| 578 | return AE_OK; | 620 | return AE_OK; |
| @@ -593,11 +635,9 @@ static acpi_status pnpacpi_type_resources(struct acpi_resource *res, | |||
| 593 | case ACPI_RSTYPE_MEM24: | 635 | case ACPI_RSTYPE_MEM24: |
| 594 | case ACPI_RSTYPE_MEM32: | 636 | case ACPI_RSTYPE_MEM32: |
| 595 | case ACPI_RSTYPE_FIXED_MEM32: | 637 | case ACPI_RSTYPE_FIXED_MEM32: |
| 596 | #if 0 | ||
| 597 | case ACPI_RSTYPE_ADDRESS16: | 638 | case ACPI_RSTYPE_ADDRESS16: |
| 598 | case ACPI_RSTYPE_ADDRESS32: | 639 | case ACPI_RSTYPE_ADDRESS32: |
| 599 | case ACPI_RSTYPE_ADDRESS64: | 640 | case ACPI_RSTYPE_ADDRESS64: |
| 600 | #endif | ||
| 601 | (*resource)->id = res->id; | 641 | (*resource)->id = res->id; |
| 602 | (*resource)++; | 642 | (*resource)++; |
| 603 | default: | 643 | default: |
