diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2009-10-26 16:20:44 -0400 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2009-11-04 11:47:10 -0500 |
commit | ac1aa47b131416a6ff37eb1005a0a1d2541aad6c (patch) | |
tree | 1d7efa15a16f61664a240520970e729b1a47e4a5 /arch | |
parent | 99935a7a59eaca0292c1a5880e10bae03f4a5e3d (diff) |
PCI: determine CLS more intelligently
Till now, CLS has been determined either by arch code or as
L1_CACHE_BYTES. Only x86 and ia64 set CLS explicitly and x86 doesn't
always get it right. On most configurations, the chance is that
firmware configures the correct value during boot.
This patch makes pci_init() determine CLS by looking at what firmware
has configured. It scans all devices and if all non-zero values
agree, the value is used. If none is configured or there is a
disagreement, pci_dfl_cache_line_size is used. arch can set the dfl
value (via PCI_CACHE_LINE_BYTES or pci_dfl_cache_line_size) or
override the actual one.
ia64, x86 and sparc64 updated to set the default cls instead of the
actual one.
While at it, declare pci_cache_line_size and pci_dfl_cache_line_size
in pci.h and drop private declarations from arch code.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: David Miller <davem@davemloft.net>
Acked-by: Greg KH <gregkh@suse.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ia64/pci/pci.c | 9 | ||||
-rw-r--r-- | arch/x86/pci/common.c | 8 |
2 files changed, 6 insertions, 11 deletions
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index c0fca2c1c858..d60e7195b7dd 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -720,9 +720,6 @@ int ia64_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
720 | return ret; | 720 | return ret; |
721 | } | 721 | } |
722 | 722 | ||
723 | /* It's defined in drivers/pci/pci.c */ | ||
724 | extern u8 pci_cache_line_size; | ||
725 | |||
726 | /** | 723 | /** |
727 | * set_pci_cacheline_size - determine cacheline size for PCI devices | 724 | * set_pci_cacheline_size - determine cacheline size for PCI devices |
728 | * | 725 | * |
@@ -731,7 +728,7 @@ extern u8 pci_cache_line_size; | |||
731 | * | 728 | * |
732 | * Code mostly taken from arch/ia64/kernel/palinfo.c:cache_info(). | 729 | * Code mostly taken from arch/ia64/kernel/palinfo.c:cache_info(). |
733 | */ | 730 | */ |
734 | static void __init set_pci_cacheline_size(void) | 731 | static void __init set_pci_dfl_cacheline_size(void) |
735 | { | 732 | { |
736 | unsigned long levels, unique_caches; | 733 | unsigned long levels, unique_caches; |
737 | long status; | 734 | long status; |
@@ -751,7 +748,7 @@ static void __init set_pci_cacheline_size(void) | |||
751 | "(status=%ld)\n", __func__, status); | 748 | "(status=%ld)\n", __func__, status); |
752 | return; | 749 | return; |
753 | } | 750 | } |
754 | pci_cache_line_size = (1 << cci.pcci_line_size) / 4; | 751 | pci_dfl_cache_line_size = (1 << cci.pcci_line_size) / 4; |
755 | } | 752 | } |
756 | 753 | ||
757 | u64 ia64_dma_get_required_mask(struct device *dev) | 754 | u64 ia64_dma_get_required_mask(struct device *dev) |
@@ -782,7 +779,7 @@ EXPORT_SYMBOL_GPL(dma_get_required_mask); | |||
782 | 779 | ||
783 | static int __init pcibios_init(void) | 780 | static int __init pcibios_init(void) |
784 | { | 781 | { |
785 | set_pci_cacheline_size(); | 782 | set_pci_dfl_cacheline_size(); |
786 | return 0; | 783 | return 0; |
787 | } | 784 | } |
788 | 785 | ||
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 1331fcf26143..fbeec31316cf 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -410,8 +410,6 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum) | |||
410 | return bus; | 410 | return bus; |
411 | } | 411 | } |
412 | 412 | ||
413 | extern u8 pci_cache_line_size; | ||
414 | |||
415 | int __init pcibios_init(void) | 413 | int __init pcibios_init(void) |
416 | { | 414 | { |
417 | struct cpuinfo_x86 *c = &boot_cpu_data; | 415 | struct cpuinfo_x86 *c = &boot_cpu_data; |
@@ -426,11 +424,11 @@ int __init pcibios_init(void) | |||
426 | * and P4. It's also good for 386/486s (which actually have 16) | 424 | * and P4. It's also good for 386/486s (which actually have 16) |
427 | * as quite a few PCI devices do not support smaller values. | 425 | * as quite a few PCI devices do not support smaller values. |
428 | */ | 426 | */ |
429 | pci_cache_line_size = 32 >> 2; | 427 | pci_dfl_cache_line_size = 32 >> 2; |
430 | if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD) | 428 | if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD) |
431 | pci_cache_line_size = 64 >> 2; /* K7 & K8 */ | 429 | pci_dfl_cache_line_size = 64 >> 2; /* K7 & K8 */ |
432 | else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL) | 430 | else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL) |
433 | pci_cache_line_size = 128 >> 2; /* P4 */ | 431 | pci_dfl_cache_line_size = 128 >> 2; /* P4 */ |
434 | 432 | ||
435 | pcibios_resource_survey(); | 433 | pcibios_resource_survey(); |
436 | 434 | ||