aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pnp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pnp')
-rw-r--r--drivers/pnp/pnpacpi/rsparser.c62
-rw-r--r--drivers/pnp/pnpbios/rsparser.c12
-rw-r--r--drivers/pnp/quirks.c42
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
597static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev, 599static __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
672static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev, 674static __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
694struct acpipnp_parse_option_s { 696struct 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
302static 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