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 | |
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>
-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: |