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 ---