diff options
Diffstat (limited to 'drivers/pnp')
-rw-r--r-- | drivers/pnp/pnpacpi/rsparser.c | 62 | ||||
-rw-r--r-- | drivers/pnp/pnpbios/rsparser.c | 12 | ||||
-rw-r--r-- | drivers/pnp/quirks.c | 42 |
3 files changed, 80 insertions, 36 deletions
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index 100e4d9372f..bbf3edd85be 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
@@ -509,15 +509,15 @@ static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev, | |||
509 | struct acpi_resource_dma *p) | 509 | struct acpi_resource_dma *p) |
510 | { | 510 | { |
511 | int i; | 511 | int i; |
512 | unsigned char map = 0, flags; | 512 | unsigned char map = 0, flags = 0; |
513 | 513 | ||
514 | if (p->channel_count == 0) | 514 | if (p->channel_count == 0) |
515 | return; | 515 | flags |= IORESOURCE_DISABLED; |
516 | 516 | ||
517 | for (i = 0; i < p->channel_count; i++) | 517 | for (i = 0; i < p->channel_count; i++) |
518 | map |= 1 << p->channels[i]; | 518 | map |= 1 << p->channels[i]; |
519 | 519 | ||
520 | flags = dma_flags(dev, p->type, p->bus_master, p->transfer); | 520 | flags |= dma_flags(dev, p->type, p->bus_master, p->transfer); |
521 | pnp_register_dma_resource(dev, option_flags, map, flags); | 521 | pnp_register_dma_resource(dev, option_flags, map, flags); |
522 | } | 522 | } |
523 | 523 | ||
@@ -527,17 +527,17 @@ static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev, | |||
527 | { | 527 | { |
528 | int i; | 528 | int i; |
529 | pnp_irq_mask_t map; | 529 | pnp_irq_mask_t map; |
530 | unsigned char flags; | 530 | unsigned char flags = 0; |
531 | 531 | ||
532 | if (p->interrupt_count == 0) | 532 | if (p->interrupt_count == 0) |
533 | return; | 533 | flags |= IORESOURCE_DISABLED; |
534 | 534 | ||
535 | bitmap_zero(map.bits, PNP_IRQ_NR); | 535 | bitmap_zero(map.bits, PNP_IRQ_NR); |
536 | for (i = 0; i < p->interrupt_count; i++) | 536 | for (i = 0; i < p->interrupt_count; i++) |
537 | if (p->interrupts[i]) | 537 | if (p->interrupts[i]) |
538 | __set_bit(p->interrupts[i], map.bits); | 538 | __set_bit(p->interrupts[i], map.bits); |
539 | 539 | ||
540 | flags = irq_flags(p->triggering, p->polarity, p->sharable); | 540 | flags |= irq_flags(p->triggering, p->polarity, p->sharable); |
541 | pnp_register_irq_resource(dev, option_flags, &map, flags); | 541 | pnp_register_irq_resource(dev, option_flags, &map, flags); |
542 | } | 542 | } |
543 | 543 | ||
@@ -547,10 +547,10 @@ static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev, | |||
547 | { | 547 | { |
548 | int i; | 548 | int i; |
549 | pnp_irq_mask_t map; | 549 | pnp_irq_mask_t map; |
550 | unsigned char flags; | 550 | unsigned char flags = 0; |
551 | 551 | ||
552 | if (p->interrupt_count == 0) | 552 | if (p->interrupt_count == 0) |
553 | return; | 553 | flags |= IORESOURCE_DISABLED; |
554 | 554 | ||
555 | bitmap_zero(map.bits, PNP_IRQ_NR); | 555 | bitmap_zero(map.bits, PNP_IRQ_NR); |
556 | for (i = 0; i < p->interrupt_count; i++) { | 556 | for (i = 0; i < p->interrupt_count; i++) { |
@@ -564,7 +564,7 @@ static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev, | |||
564 | } | 564 | } |
565 | } | 565 | } |
566 | 566 | ||
567 | flags = irq_flags(p->triggering, p->polarity, p->sharable); | 567 | flags |= irq_flags(p->triggering, p->polarity, p->sharable); |
568 | pnp_register_irq_resource(dev, option_flags, &map, flags); | 568 | pnp_register_irq_resource(dev, option_flags, &map, flags); |
569 | } | 569 | } |
570 | 570 | ||
@@ -575,10 +575,10 @@ static __init void pnpacpi_parse_port_option(struct pnp_dev *dev, | |||
575 | unsigned char flags = 0; | 575 | unsigned char flags = 0; |
576 | 576 | ||
577 | if (io->address_length == 0) | 577 | if (io->address_length == 0) |
578 | return; | 578 | flags |= IORESOURCE_DISABLED; |
579 | 579 | ||
580 | if (io->io_decode == ACPI_DECODE_16) | 580 | if (io->io_decode == ACPI_DECODE_16) |
581 | flags = IORESOURCE_IO_16BIT_ADDR; | 581 | flags |= IORESOURCE_IO_16BIT_ADDR; |
582 | pnp_register_port_resource(dev, option_flags, io->minimum, io->maximum, | 582 | pnp_register_port_resource(dev, option_flags, io->minimum, io->maximum, |
583 | io->alignment, io->address_length, flags); | 583 | io->alignment, io->address_length, flags); |
584 | } | 584 | } |
@@ -587,11 +587,13 @@ static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev, | |||
587 | unsigned int option_flags, | 587 | unsigned int option_flags, |
588 | struct acpi_resource_fixed_io *io) | 588 | struct acpi_resource_fixed_io *io) |
589 | { | 589 | { |
590 | unsigned char flags = 0; | ||
591 | |||
590 | if (io->address_length == 0) | 592 | if (io->address_length == 0) |
591 | return; | 593 | flags |= IORESOURCE_DISABLED; |
592 | 594 | ||
593 | pnp_register_port_resource(dev, option_flags, io->address, io->address, | 595 | pnp_register_port_resource(dev, option_flags, io->address, io->address, |
594 | 0, io->address_length, IORESOURCE_IO_FIXED); | 596 | 0, io->address_length, flags | IORESOURCE_IO_FIXED); |
595 | } | 597 | } |
596 | 598 | ||
597 | static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev, | 599 | static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev, |
@@ -601,10 +603,10 @@ static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev, | |||
601 | unsigned char flags = 0; | 603 | unsigned char flags = 0; |
602 | 604 | ||
603 | if (p->address_length == 0) | 605 | if (p->address_length == 0) |
604 | return; | 606 | flags |= IORESOURCE_DISABLED; |
605 | 607 | ||
606 | if (p->write_protect == ACPI_READ_WRITE_MEMORY) | 608 | if (p->write_protect == ACPI_READ_WRITE_MEMORY) |
607 | flags = IORESOURCE_MEM_WRITEABLE; | 609 | flags |= IORESOURCE_MEM_WRITEABLE; |
608 | pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum, | 610 | pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum, |
609 | p->alignment, p->address_length, flags); | 611 | p->alignment, p->address_length, flags); |
610 | } | 612 | } |
@@ -616,10 +618,10 @@ static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev, | |||
616 | unsigned char flags = 0; | 618 | unsigned char flags = 0; |
617 | 619 | ||
618 | if (p->address_length == 0) | 620 | if (p->address_length == 0) |
619 | return; | 621 | flags |= IORESOURCE_DISABLED; |
620 | 622 | ||
621 | if (p->write_protect == ACPI_READ_WRITE_MEMORY) | 623 | if (p->write_protect == ACPI_READ_WRITE_MEMORY) |
622 | flags = IORESOURCE_MEM_WRITEABLE; | 624 | flags |= IORESOURCE_MEM_WRITEABLE; |
623 | pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum, | 625 | pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum, |
624 | p->alignment, p->address_length, flags); | 626 | p->alignment, p->address_length, flags); |
625 | } | 627 | } |
@@ -631,10 +633,10 @@ static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev, | |||
631 | unsigned char flags = 0; | 633 | unsigned char flags = 0; |
632 | 634 | ||
633 | if (p->address_length == 0) | 635 | if (p->address_length == 0) |
634 | return; | 636 | flags |= IORESOURCE_DISABLED; |
635 | 637 | ||
636 | if (p->write_protect == ACPI_READ_WRITE_MEMORY) | 638 | if (p->write_protect == ACPI_READ_WRITE_MEMORY) |
637 | flags = IORESOURCE_MEM_WRITEABLE; | 639 | flags |= IORESOURCE_MEM_WRITEABLE; |
638 | pnp_register_mem_resource(dev, option_flags, p->address, p->address, | 640 | pnp_register_mem_resource(dev, option_flags, p->address, p->address, |
639 | 0, p->address_length, flags); | 641 | 0, p->address_length, flags); |
640 | } | 642 | } |
@@ -655,18 +657,18 @@ static __init void pnpacpi_parse_address_option(struct pnp_dev *dev, | |||
655 | } | 657 | } |
656 | 658 | ||
657 | if (p->address_length == 0) | 659 | if (p->address_length == 0) |
658 | return; | 660 | flags |= IORESOURCE_DISABLED; |
659 | 661 | ||
660 | if (p->resource_type == ACPI_MEMORY_RANGE) { | 662 | if (p->resource_type == ACPI_MEMORY_RANGE) { |
661 | if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY) | 663 | if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY) |
662 | flags = IORESOURCE_MEM_WRITEABLE; | 664 | flags |= IORESOURCE_MEM_WRITEABLE; |
663 | pnp_register_mem_resource(dev, option_flags, p->minimum, | 665 | pnp_register_mem_resource(dev, option_flags, p->minimum, |
664 | p->minimum, 0, p->address_length, | 666 | p->minimum, 0, p->address_length, |
665 | flags); | 667 | flags); |
666 | } else if (p->resource_type == ACPI_IO_RANGE) | 668 | } else if (p->resource_type == ACPI_IO_RANGE) |
667 | pnp_register_port_resource(dev, option_flags, p->minimum, | 669 | pnp_register_port_resource(dev, option_flags, p->minimum, |
668 | p->minimum, 0, p->address_length, | 670 | p->minimum, 0, p->address_length, |
669 | IORESOURCE_IO_FIXED); | 671 | flags | IORESOURCE_IO_FIXED); |
670 | } | 672 | } |
671 | 673 | ||
672 | static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev, | 674 | static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev, |
@@ -677,18 +679,18 @@ static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev, | |||
677 | unsigned char flags = 0; | 679 | unsigned char flags = 0; |
678 | 680 | ||
679 | if (p->address_length == 0) | 681 | if (p->address_length == 0) |
680 | return; | 682 | flags |= IORESOURCE_DISABLED; |
681 | 683 | ||
682 | if (p->resource_type == ACPI_MEMORY_RANGE) { | 684 | if (p->resource_type == ACPI_MEMORY_RANGE) { |
683 | if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY) | 685 | if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY) |
684 | flags = IORESOURCE_MEM_WRITEABLE; | 686 | flags |= IORESOURCE_MEM_WRITEABLE; |
685 | pnp_register_mem_resource(dev, option_flags, p->minimum, | 687 | pnp_register_mem_resource(dev, option_flags, p->minimum, |
686 | p->minimum, 0, p->address_length, | 688 | p->minimum, 0, p->address_length, |
687 | flags); | 689 | flags); |
688 | } else if (p->resource_type == ACPI_IO_RANGE) | 690 | } else if (p->resource_type == ACPI_IO_RANGE) |
689 | pnp_register_port_resource(dev, option_flags, p->minimum, | 691 | pnp_register_port_resource(dev, option_flags, p->minimum, |
690 | p->minimum, 0, p->address_length, | 692 | p->minimum, 0, p->address_length, |
691 | IORESOURCE_IO_FIXED); | 693 | flags | IORESOURCE_IO_FIXED); |
692 | } | 694 | } |
693 | 695 | ||
694 | struct acpipnp_parse_option_s { | 696 | struct acpipnp_parse_option_s { |
@@ -1018,7 +1020,7 @@ static void pnpacpi_encode_io(struct pnp_dev *dev, | |||
1018 | io->minimum = p->start; | 1020 | io->minimum = p->start; |
1019 | io->maximum = p->end; | 1021 | io->maximum = p->end; |
1020 | io->alignment = 0; /* Correct? */ | 1022 | io->alignment = 0; /* Correct? */ |
1021 | io->address_length = p->end - p->start + 1; | 1023 | io->address_length = resource_size(p); |
1022 | } else { | 1024 | } else { |
1023 | io->minimum = 0; | 1025 | io->minimum = 0; |
1024 | io->address_length = 0; | 1026 | io->address_length = 0; |
@@ -1036,7 +1038,7 @@ static void pnpacpi_encode_fixed_io(struct pnp_dev *dev, | |||
1036 | 1038 | ||
1037 | if (pnp_resource_enabled(p)) { | 1039 | if (pnp_resource_enabled(p)) { |
1038 | fixed_io->address = p->start; | 1040 | fixed_io->address = p->start; |
1039 | fixed_io->address_length = p->end - p->start + 1; | 1041 | fixed_io->address_length = resource_size(p); |
1040 | } else { | 1042 | } else { |
1041 | fixed_io->address = 0; | 1043 | fixed_io->address = 0; |
1042 | fixed_io->address_length = 0; | 1044 | fixed_io->address_length = 0; |
@@ -1059,7 +1061,7 @@ static void pnpacpi_encode_mem24(struct pnp_dev *dev, | |||
1059 | memory24->minimum = p->start; | 1061 | memory24->minimum = p->start; |
1060 | memory24->maximum = p->end; | 1062 | memory24->maximum = p->end; |
1061 | memory24->alignment = 0; | 1063 | memory24->alignment = 0; |
1062 | memory24->address_length = p->end - p->start + 1; | 1064 | memory24->address_length = resource_size(p); |
1063 | } else { | 1065 | } else { |
1064 | memory24->minimum = 0; | 1066 | memory24->minimum = 0; |
1065 | memory24->address_length = 0; | 1067 | memory24->address_length = 0; |
@@ -1083,7 +1085,7 @@ static void pnpacpi_encode_mem32(struct pnp_dev *dev, | |||
1083 | memory32->minimum = p->start; | 1085 | memory32->minimum = p->start; |
1084 | memory32->maximum = p->end; | 1086 | memory32->maximum = p->end; |
1085 | memory32->alignment = 0; | 1087 | memory32->alignment = 0; |
1086 | memory32->address_length = p->end - p->start + 1; | 1088 | memory32->address_length = resource_size(p); |
1087 | } else { | 1089 | } else { |
1088 | memory32->minimum = 0; | 1090 | memory32->minimum = 0; |
1089 | memory32->alignment = 0; | 1091 | memory32->alignment = 0; |
@@ -1106,7 +1108,7 @@ static void pnpacpi_encode_fixed_mem32(struct pnp_dev *dev, | |||
1106 | p->flags & IORESOURCE_MEM_WRITEABLE ? | 1108 | p->flags & IORESOURCE_MEM_WRITEABLE ? |
1107 | ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; | 1109 | ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; |
1108 | fixed_memory32->address = p->start; | 1110 | fixed_memory32->address = p->start; |
1109 | fixed_memory32->address_length = p->end - p->start + 1; | 1111 | fixed_memory32->address_length = resource_size(p); |
1110 | } else { | 1112 | } else { |
1111 | fixed_memory32->address = 0; | 1113 | fixed_memory32->address = 0; |
1112 | fixed_memory32->address_length = 0; | 1114 | fixed_memory32->address_length = 0; |
diff --git a/drivers/pnp/pnpbios/rsparser.c b/drivers/pnp/pnpbios/rsparser.c index cb1f47bfee9..cca2f9f9f3e 100644 --- a/drivers/pnp/pnpbios/rsparser.c +++ b/drivers/pnp/pnpbios/rsparser.c | |||
@@ -505,7 +505,7 @@ static void pnpbios_encode_mem(struct pnp_dev *dev, unsigned char *p, | |||
505 | 505 | ||
506 | if (pnp_resource_enabled(res)) { | 506 | if (pnp_resource_enabled(res)) { |
507 | base = res->start; | 507 | base = res->start; |
508 | len = res->end - res->start + 1; | 508 | len = resource_size(res); |
509 | } else { | 509 | } else { |
510 | base = 0; | 510 | base = 0; |
511 | len = 0; | 511 | len = 0; |
@@ -529,7 +529,7 @@ static void pnpbios_encode_mem32(struct pnp_dev *dev, unsigned char *p, | |||
529 | 529 | ||
530 | if (pnp_resource_enabled(res)) { | 530 | if (pnp_resource_enabled(res)) { |
531 | base = res->start; | 531 | base = res->start; |
532 | len = res->end - res->start + 1; | 532 | len = resource_size(res); |
533 | } else { | 533 | } else { |
534 | base = 0; | 534 | base = 0; |
535 | len = 0; | 535 | len = 0; |
@@ -559,7 +559,7 @@ static void pnpbios_encode_fixed_mem32(struct pnp_dev *dev, unsigned char *p, | |||
559 | 559 | ||
560 | if (pnp_resource_enabled(res)) { | 560 | if (pnp_resource_enabled(res)) { |
561 | base = res->start; | 561 | base = res->start; |
562 | len = res->end - res->start + 1; | 562 | len = resource_size(res); |
563 | } else { | 563 | } else { |
564 | base = 0; | 564 | base = 0; |
565 | len = 0; | 565 | len = 0; |
@@ -617,7 +617,7 @@ static void pnpbios_encode_port(struct pnp_dev *dev, unsigned char *p, | |||
617 | 617 | ||
618 | if (pnp_resource_enabled(res)) { | 618 | if (pnp_resource_enabled(res)) { |
619 | base = res->start; | 619 | base = res->start; |
620 | len = res->end - res->start + 1; | 620 | len = resource_size(res); |
621 | } else { | 621 | } else { |
622 | base = 0; | 622 | base = 0; |
623 | len = 0; | 623 | len = 0; |
@@ -636,11 +636,11 @@ static void pnpbios_encode_fixed_port(struct pnp_dev *dev, unsigned char *p, | |||
636 | struct resource *res) | 636 | struct resource *res) |
637 | { | 637 | { |
638 | unsigned long base = res->start; | 638 | unsigned long base = res->start; |
639 | unsigned long len = res->end - res->start + 1; | 639 | unsigned long len = resource_size(res); |
640 | 640 | ||
641 | if (pnp_resource_enabled(res)) { | 641 | if (pnp_resource_enabled(res)) { |
642 | base = res->start; | 642 | base = res->start; |
643 | len = res->end - res->start + 1; | 643 | len = resource_size(res); |
644 | } else { | 644 | } else { |
645 | base = 0; | 645 | base = 0; |
646 | len = 0; | 646 | len = 0; |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index dfbd5a6cc58..258fef272ea 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
@@ -295,6 +295,45 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) | |||
295 | } | 295 | } |
296 | } | 296 | } |
297 | 297 | ||
298 | #ifdef CONFIG_AMD_NB | ||
299 | |||
300 | #include <asm/amd_nb.h> | ||
301 | |||
302 | static void quirk_amd_mmconfig_area(struct pnp_dev *dev) | ||
303 | { | ||
304 | resource_size_t start, end; | ||
305 | struct pnp_resource *pnp_res; | ||
306 | struct resource *res; | ||
307 | struct resource mmconfig_res, *mmconfig; | ||
308 | |||
309 | mmconfig = amd_get_mmconfig_range(&mmconfig_res); | ||
310 | if (!mmconfig) | ||
311 | return; | ||
312 | |||
313 | list_for_each_entry(pnp_res, &dev->resources, list) { | ||
314 | res = &pnp_res->res; | ||
315 | if (res->end < mmconfig->start || res->start > mmconfig->end || | ||
316 | (res->start == mmconfig->start && res->end == mmconfig->end)) | ||
317 | continue; | ||
318 | |||
319 | dev_info(&dev->dev, FW_BUG | ||
320 | "%pR covers only part of AMD MMCONFIG area %pR; adding more reservations\n", | ||
321 | res, mmconfig); | ||
322 | if (mmconfig->start < res->start) { | ||
323 | start = mmconfig->start; | ||
324 | end = res->start - 1; | ||
325 | pnp_add_mem_resource(dev, start, end, 0); | ||
326 | } | ||
327 | if (mmconfig->end > res->end) { | ||
328 | start = res->end + 1; | ||
329 | end = mmconfig->end; | ||
330 | pnp_add_mem_resource(dev, start, end, 0); | ||
331 | } | ||
332 | break; | ||
333 | } | ||
334 | } | ||
335 | #endif | ||
336 | |||
298 | /* | 337 | /* |
299 | * PnP Quirks | 338 | * PnP Quirks |
300 | * Cards or devices that need some tweaking due to incomplete resource info | 339 | * Cards or devices that need some tweaking due to incomplete resource info |
@@ -322,6 +361,9 @@ static struct pnp_fixup pnp_fixups[] = { | |||
322 | /* PnP resources that might overlap PCI BARs */ | 361 | /* PnP resources that might overlap PCI BARs */ |
323 | {"PNP0c01", quirk_system_pci_resources}, | 362 | {"PNP0c01", quirk_system_pci_resources}, |
324 | {"PNP0c02", quirk_system_pci_resources}, | 363 | {"PNP0c02", quirk_system_pci_resources}, |
364 | #ifdef CONFIG_AMD_NB | ||
365 | {"PNP0c01", quirk_amd_mmconfig_area}, | ||
366 | #endif | ||
325 | {""} | 367 | {""} |
326 | }; | 368 | }; |
327 | 369 | ||