aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
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