aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2009-06-11 23:53:55 -0400
committerLen Brown <len.brown@intel.com>2009-06-12 20:50:38 -0400
commitc4bf2f372db09ef8d16a25a60d523bfa1c50f7b5 (patch)
tree0323bf3d79875ae2bd0a59657595e9f532a640e1 /arch
parent24c5c4c2f506bf87ef2343669fb892c944c3fdde (diff)
ACPI, PCI, x86: move MCFG parsing routine from ACPI to PCI file
Move arch/x86/kernel/acpi/boot.c: acpi_parse_mcfg() to arch/x86/pci/mmconfig-shared.c: pci_parse_mcfg() where it is used, and make it static. Move associated globals and helper routine with it. No functional change. This code move is in preparation for SFI support, which will allow the PCI code to find the MCFG table on systems which do not support ACPI. Signed-off-by: Len Brown <len.brown@intel.com> Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/pci_x86.h3
-rw-r--r--arch/x86/kernel/acpi/boot.c66
-rw-r--r--arch/x86/pci/mmconfig-shared.c65
3 files changed, 67 insertions, 67 deletions
diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h
index e60fd3e14bd..b399988eee3 100644
--- a/arch/x86/include/asm/pci_x86.h
+++ b/arch/x86/include/asm/pci_x86.h
@@ -121,6 +121,9 @@ extern int __init pcibios_init(void);
121extern int __init pci_mmcfg_arch_init(void); 121extern int __init pci_mmcfg_arch_init(void);
122extern void __init pci_mmcfg_arch_free(void); 122extern void __init pci_mmcfg_arch_free(void);
123 123
124extern struct acpi_mcfg_allocation *pci_mmcfg_config;
125extern int pci_mmcfg_config_num;
126
124/* 127/*
125 * AMD Fam10h CPUs are buggy, and cannot access MMIO config space 128 * AMD Fam10h CPUs are buggy, and cannot access MMIO config space
126 * on their northbrige except through the * %eax register. As such, you MUST 129 * on their northbrige except through the * %eax register. As such, you MUST
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 817d6a5e115..f54e0e557cd 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -117,72 +117,6 @@ void __init __acpi_unmap_table(char *map, unsigned long size)
117 early_iounmap(map, size); 117 early_iounmap(map, size);
118} 118}
119 119
120#ifdef CONFIG_PCI_MMCONFIG
121
122static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
123
124/* The physical address of the MMCONFIG aperture. Set from ACPI tables. */
125struct acpi_mcfg_allocation *pci_mmcfg_config;
126int pci_mmcfg_config_num;
127
128static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg)
129{
130 if (!strcmp(mcfg->header.oem_id, "SGI"))
131 acpi_mcfg_64bit_base_addr = TRUE;
132
133 return 0;
134}
135
136int __init acpi_parse_mcfg(struct acpi_table_header *header)
137{
138 struct acpi_table_mcfg *mcfg;
139 unsigned long i;
140 int config_size;
141
142 if (!header)
143 return -EINVAL;
144
145 mcfg = (struct acpi_table_mcfg *)header;
146
147 /* how many config structures do we have */
148 pci_mmcfg_config_num = 0;
149 i = header->length - sizeof(struct acpi_table_mcfg);
150 while (i >= sizeof(struct acpi_mcfg_allocation)) {
151 ++pci_mmcfg_config_num;
152 i -= sizeof(struct acpi_mcfg_allocation);
153 };
154 if (pci_mmcfg_config_num == 0) {
155 printk(KERN_ERR PREFIX "MMCONFIG has no entries\n");
156 return -ENODEV;
157 }
158
159 config_size = pci_mmcfg_config_num * sizeof(*pci_mmcfg_config);
160 pci_mmcfg_config = kmalloc(config_size, GFP_KERNEL);
161 if (!pci_mmcfg_config) {
162 printk(KERN_WARNING PREFIX
163 "No memory for MCFG config tables\n");
164 return -ENOMEM;
165 }
166
167 memcpy(pci_mmcfg_config, &mcfg[1], config_size);
168
169 acpi_mcfg_oem_check(mcfg);
170
171 for (i = 0; i < pci_mmcfg_config_num; ++i) {
172 if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) &&
173 !acpi_mcfg_64bit_base_addr) {
174 printk(KERN_ERR PREFIX
175 "MMCONFIG not in low 4GB of memory\n");
176 kfree(pci_mmcfg_config);
177 pci_mmcfg_config_num = 0;
178 return -ENODEV;
179 }
180 }
181
182 return 0;
183}
184#endif /* CONFIG_PCI_MMCONFIG */
185
186#ifdef CONFIG_X86_LOCAL_APIC 120#ifdef CONFIG_X86_LOCAL_APIC
187static int __init acpi_parse_madt(struct acpi_table_header *table) 121static int __init acpi_parse_madt(struct acpi_table_header *table)
188{ 122{
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
index 8766b0e216c..712443ec6d4 100644
--- a/arch/x86/pci/mmconfig-shared.c
+++ b/arch/x86/pci/mmconfig-shared.c
@@ -523,6 +523,69 @@ reject:
523 523
524static int __initdata known_bridge; 524static int __initdata known_bridge;
525 525
526static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
527
528/* The physical address of the MMCONFIG aperture. Set from ACPI tables. */
529struct acpi_mcfg_allocation *pci_mmcfg_config;
530int pci_mmcfg_config_num;
531
532static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg)
533{
534 if (!strcmp(mcfg->header.oem_id, "SGI"))
535 acpi_mcfg_64bit_base_addr = TRUE;
536
537 return 0;
538}
539
540static int __init pci_parse_mcfg(struct acpi_table_header *header)
541{
542 struct acpi_table_mcfg *mcfg;
543 unsigned long i;
544 int config_size;
545
546 if (!header)
547 return -EINVAL;
548
549 mcfg = (struct acpi_table_mcfg *)header;
550
551 /* how many config structures do we have */
552 pci_mmcfg_config_num = 0;
553 i = header->length - sizeof(struct acpi_table_mcfg);
554 while (i >= sizeof(struct acpi_mcfg_allocation)) {
555 ++pci_mmcfg_config_num;
556 i -= sizeof(struct acpi_mcfg_allocation);
557 };
558 if (pci_mmcfg_config_num == 0) {
559 printk(KERN_ERR PREFIX "MMCONFIG has no entries\n");
560 return -ENODEV;
561 }
562
563 config_size = pci_mmcfg_config_num * sizeof(*pci_mmcfg_config);
564 pci_mmcfg_config = kmalloc(config_size, GFP_KERNEL);
565 if (!pci_mmcfg_config) {
566 printk(KERN_WARNING PREFIX
567 "No memory for MCFG config tables\n");
568 return -ENOMEM;
569 }
570
571 memcpy(pci_mmcfg_config, &mcfg[1], config_size);
572
573 acpi_mcfg_oem_check(mcfg);
574
575 for (i = 0; i < pci_mmcfg_config_num; ++i) {
576 if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) &&
577 !acpi_mcfg_64bit_base_addr) {
578 printk(KERN_ERR PREFIX
579 "MMCONFIG not in low 4GB of memory\n");
580 kfree(pci_mmcfg_config);
581 pci_mmcfg_config_num = 0;
582 return -ENODEV;
583 }
584 }
585
586 return 0;
587}
588
526static void __init __pci_mmcfg_init(int early) 589static void __init __pci_mmcfg_init(int early)
527{ 590{
528 /* MMCONFIG disabled */ 591 /* MMCONFIG disabled */
@@ -543,7 +606,7 @@ static void __init __pci_mmcfg_init(int early)
543 } 606 }
544 607
545 if (!known_bridge) 608 if (!known_bridge)
546 acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg); 609 acpi_table_parse(ACPI_SIG_MCFG, pci_parse_mcfg);
547 610
548 pci_mmcfg_reject_broken(early); 611 pci_mmcfg_reject_broken(early);
549 612