diff options
Diffstat (limited to 'arch/ia64/pci/pci.c')
-rw-r--r-- | arch/ia64/pci/pci.c | 75 |
1 files changed, 23 insertions, 52 deletions
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index b30be7c48ba8..f4edfbf27134 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -469,10 +469,11 @@ pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) | |||
469 | } | 469 | } |
470 | } | 470 | } |
471 | 471 | ||
472 | static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | 472 | void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) |
473 | { | 473 | { |
474 | pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES); | 474 | pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES); |
475 | } | 475 | } |
476 | EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); | ||
476 | 477 | ||
477 | static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev) | 478 | static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev) |
478 | { | 479 | { |
@@ -493,6 +494,7 @@ pcibios_fixup_bus (struct pci_bus *b) | |||
493 | } | 494 | } |
494 | list_for_each_entry(dev, &b->devices, bus_list) | 495 | list_for_each_entry(dev, &b->devices, bus_list) |
495 | pcibios_fixup_device_resources(dev); | 496 | pcibios_fixup_device_resources(dev); |
497 | platform_pci_fixup_bus(b); | ||
496 | 498 | ||
497 | return; | 499 | return; |
498 | } | 500 | } |
@@ -738,75 +740,44 @@ int ia64_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
738 | return ret; | 740 | return ret; |
739 | } | 741 | } |
740 | 742 | ||
743 | /* It's defined in drivers/pci/pci.c */ | ||
744 | extern u8 pci_cache_line_size; | ||
745 | |||
741 | /** | 746 | /** |
742 | * pci_cacheline_size - determine cacheline size for PCI devices | 747 | * set_pci_cacheline_size - determine cacheline size for PCI devices |
743 | * @dev: void | ||
744 | * | 748 | * |
745 | * We want to use the line-size of the outer-most cache. We assume | 749 | * We want to use the line-size of the outer-most cache. We assume |
746 | * that this line-size is the same for all CPUs. | 750 | * that this line-size is the same for all CPUs. |
747 | * | 751 | * |
748 | * Code mostly taken from arch/ia64/kernel/palinfo.c:cache_info(). | 752 | * Code mostly taken from arch/ia64/kernel/palinfo.c:cache_info(). |
749 | * | ||
750 | * RETURNS: An appropriate -ERRNO error value on eror, or zero for success. | ||
751 | */ | 753 | */ |
752 | static unsigned long | 754 | static void __init set_pci_cacheline_size(void) |
753 | pci_cacheline_size (void) | ||
754 | { | 755 | { |
755 | u64 levels, unique_caches; | 756 | u64 levels, unique_caches; |
756 | s64 status; | 757 | s64 status; |
757 | pal_cache_config_info_t cci; | 758 | pal_cache_config_info_t cci; |
758 | static u8 cacheline_size; | ||
759 | |||
760 | if (cacheline_size) | ||
761 | return cacheline_size; | ||
762 | 759 | ||
763 | status = ia64_pal_cache_summary(&levels, &unique_caches); | 760 | status = ia64_pal_cache_summary(&levels, &unique_caches); |
764 | if (status != 0) { | 761 | if (status != 0) { |
765 | printk(KERN_ERR "%s: ia64_pal_cache_summary() failed (status=%ld)\n", | 762 | printk(KERN_ERR "%s: ia64_pal_cache_summary() failed " |
766 | __FUNCTION__, status); | 763 | "(status=%ld)\n", __FUNCTION__, status); |
767 | return SMP_CACHE_BYTES; | 764 | return; |
768 | } | 765 | } |
769 | 766 | ||
770 | status = ia64_pal_cache_config_info(levels - 1, /* cache_type (data_or_unified)= */ 2, | 767 | status = ia64_pal_cache_config_info(levels - 1, |
771 | &cci); | 768 | /* cache_type (data_or_unified)= */ 2, &cci); |
772 | if (status != 0) { | 769 | if (status != 0) { |
773 | printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed (status=%ld)\n", | 770 | printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed " |
774 | __FUNCTION__, status); | 771 | "(status=%ld)\n", __FUNCTION__, status); |
775 | return SMP_CACHE_BYTES; | 772 | return; |
776 | } | 773 | } |
777 | cacheline_size = 1 << cci.pcci_line_size; | 774 | pci_cache_line_size = (1 << cci.pcci_line_size) / 4; |
778 | return cacheline_size; | ||
779 | } | 775 | } |
780 | 776 | ||
781 | /** | 777 | static int __init pcibios_init(void) |
782 | * pcibios_prep_mwi - helper function for drivers/pci/pci.c:pci_set_mwi() | 778 | { |
783 | * @dev: the PCI device for which MWI is enabled | 779 | set_pci_cacheline_size(); |
784 | * | 780 | return 0; |
785 | * For ia64, we can get the cacheline sizes from PAL. | ||
786 | * | ||
787 | * RETURNS: An appropriate -ERRNO error value on eror, or zero for success. | ||
788 | */ | ||
789 | int | ||
790 | pcibios_prep_mwi (struct pci_dev *dev) | ||
791 | { | ||
792 | unsigned long desired_linesize, current_linesize; | ||
793 | int rc = 0; | ||
794 | u8 pci_linesize; | ||
795 | |||
796 | desired_linesize = pci_cacheline_size(); | ||
797 | |||
798 | pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &pci_linesize); | ||
799 | current_linesize = 4 * pci_linesize; | ||
800 | if (desired_linesize != current_linesize) { | ||
801 | printk(KERN_WARNING "PCI: slot %s has incorrect PCI cache line size of %lu bytes,", | ||
802 | pci_name(dev), current_linesize); | ||
803 | if (current_linesize > desired_linesize) { | ||
804 | printk(" expected %lu bytes instead\n", desired_linesize); | ||
805 | rc = -EINVAL; | ||
806 | } else { | ||
807 | printk(" correcting to %lu\n", desired_linesize); | ||
808 | pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, desired_linesize / 4); | ||
809 | } | ||
810 | } | ||
811 | return rc; | ||
812 | } | 781 | } |
782 | |||
783 | subsys_initcall(pcibios_init); | ||