mmconfig-shared.c (5663b1b963183e98ece3e77e471da833bb5ad2ff) | mmconfig-shared.c (e823d6ff581c5d1d76aa8c73a202d7d1419d34b8) |
---|---|
1/* 2 * mmconfig-shared.c - Low-level direct PCI config space access via 3 * MMCONFIG - common code between i386 and x86-64. 4 * 5 * This code does: 6 * - known chipset handling 7 * - ACPI decoding and validation 8 * --- 541 unchanged lines hidden (view full) --- 550 cfg->start_bus_number, cfg->end_bus_number, cfg->address); 551 return -EINVAL; 552} 553 554static int __init pci_parse_mcfg(struct acpi_table_header *header) 555{ 556 struct acpi_table_mcfg *mcfg; 557 unsigned long i; | 1/* 2 * mmconfig-shared.c - Low-level direct PCI config space access via 3 * MMCONFIG - common code between i386 and x86-64. 4 * 5 * This code does: 6 * - known chipset handling 7 * - ACPI decoding and validation 8 * --- 541 unchanged lines hidden (view full) --- 550 cfg->start_bus_number, cfg->end_bus_number, cfg->address); 551 return -EINVAL; 552} 553 554static int __init pci_parse_mcfg(struct acpi_table_header *header) 555{ 556 struct acpi_table_mcfg *mcfg; 557 unsigned long i; |
558 int config_size; | 558 int entries, config_size; |
559 560 if (!header) 561 return -EINVAL; 562 563 mcfg = (struct acpi_table_mcfg *)header; 564 565 /* how many config structures do we have */ 566 pci_mmcfg_config_num = 0; | 559 560 if (!header) 561 return -EINVAL; 562 563 mcfg = (struct acpi_table_mcfg *)header; 564 565 /* how many config structures do we have */ 566 pci_mmcfg_config_num = 0; |
567 entries = 0; |
|
567 i = header->length - sizeof(struct acpi_table_mcfg); 568 while (i >= sizeof(struct acpi_mcfg_allocation)) { | 568 i = header->length - sizeof(struct acpi_table_mcfg); 569 while (i >= sizeof(struct acpi_mcfg_allocation)) { |
569 ++pci_mmcfg_config_num; | 570 entries++; |
570 i -= sizeof(struct acpi_mcfg_allocation); 571 }; | 571 i -= sizeof(struct acpi_mcfg_allocation); 572 }; |
572 if (pci_mmcfg_config_num == 0) { | 573 if (entries == 0) { |
573 printk(KERN_ERR PREFIX "MMCONFIG has no entries\n"); 574 return -ENODEV; 575 } 576 | 574 printk(KERN_ERR PREFIX "MMCONFIG has no entries\n"); 575 return -ENODEV; 576 } 577 |
577 config_size = pci_mmcfg_config_num * sizeof(*pci_mmcfg_config); | 578 config_size = entries * sizeof(*pci_mmcfg_config); |
578 pci_mmcfg_config = kmalloc(config_size, GFP_KERNEL); 579 if (!pci_mmcfg_config) { 580 printk(KERN_WARNING PREFIX 581 "No memory for MCFG config tables\n"); 582 return -ENOMEM; 583 } 584 585 memcpy(pci_mmcfg_config, &mcfg[1], config_size); | 579 pci_mmcfg_config = kmalloc(config_size, GFP_KERNEL); 580 if (!pci_mmcfg_config) { 581 printk(KERN_WARNING PREFIX 582 "No memory for MCFG config tables\n"); 583 return -ENOMEM; 584 } 585 586 memcpy(pci_mmcfg_config, &mcfg[1], config_size); |
587 pci_mmcfg_config_num = entries; |
|
586 | 588 |
587 for (i = 0; i < pci_mmcfg_config_num; ++i) { | 589 for (i = 0; i < entries; i++) { |
588 if (acpi_mcfg_check_entry(mcfg, &pci_mmcfg_config[i])) { 589 kfree(pci_mmcfg_config); 590 pci_mmcfg_config_num = 0; 591 return -ENODEV; 592 } 593 } 594 595 return 0; --- 81 unchanged lines hidden --- | 590 if (acpi_mcfg_check_entry(mcfg, &pci_mmcfg_config[i])) { 591 kfree(pci_mmcfg_config); 592 pci_mmcfg_config_num = 0; 593 return -ENODEV; 594 } 595 } 596 597 return 0; --- 81 unchanged lines hidden --- |