| .. | .. |
|---|
| 98 | 98 | * @reg_base: IO Mapped Register Base |
|---|
| 99 | 99 | * @irq: Interrupt number |
|---|
| 100 | 100 | * @msi_pages: MSI pages |
|---|
| 101 | | - * @root_busno: Root Bus number |
|---|
| 102 | 101 | * @dev: Device pointer |
|---|
| 103 | 102 | * @msi_domain: MSI IRQ domain pointer |
|---|
| 104 | 103 | * @leg_domain: Legacy IRQ domain pointer |
|---|
| .. | .. |
|---|
| 108 | 107 | void __iomem *reg_base; |
|---|
| 109 | 108 | u32 irq; |
|---|
| 110 | 109 | unsigned long msi_pages; |
|---|
| 111 | | - u8 root_busno; |
|---|
| 112 | 110 | struct device *dev; |
|---|
| 113 | 111 | struct irq_domain *msi_domain; |
|---|
| 114 | 112 | struct irq_domain *leg_domain; |
|---|
| .. | .. |
|---|
| 162 | 160 | struct xilinx_pcie_port *port = bus->sysdata; |
|---|
| 163 | 161 | |
|---|
| 164 | 162 | /* Check if link is up when trying to access downstream ports */ |
|---|
| 165 | | - if (bus->number != port->root_busno) |
|---|
| 163 | + if (!pci_is_root_bus(bus)) { |
|---|
| 166 | 164 | if (!xilinx_pcie_link_up(port)) |
|---|
| 167 | 165 | return false; |
|---|
| 168 | | - |
|---|
| 169 | | - /* Only one device down on each root port */ |
|---|
| 170 | | - if (bus->number == port->root_busno && devfn > 0) |
|---|
| 166 | + } else if (devfn > 0) { |
|---|
| 167 | + /* Only one device down on each root port */ |
|---|
| 171 | 168 | return false; |
|---|
| 172 | | - |
|---|
| 169 | + } |
|---|
| 173 | 170 | return true; |
|---|
| 174 | 171 | } |
|---|
| 175 | 172 | |
|---|
| .. | .. |
|---|
| 582 | 579 | struct device *dev = port->dev; |
|---|
| 583 | 580 | struct device_node *node = dev->of_node; |
|---|
| 584 | 581 | struct resource regs; |
|---|
| 585 | | - const char *type; |
|---|
| 586 | 582 | int err; |
|---|
| 587 | | - |
|---|
| 588 | | - type = of_get_property(node, "device_type", NULL); |
|---|
| 589 | | - if (!type || strcmp(type, "pci")) { |
|---|
| 590 | | - dev_err(dev, "invalid \"device_type\" %s\n", type); |
|---|
| 591 | | - return -EINVAL; |
|---|
| 592 | | - } |
|---|
| 593 | 583 | |
|---|
| 594 | 584 | err = of_address_to_resource(node, 0, ®s); |
|---|
| 595 | 585 | if (err) { |
|---|
| .. | .. |
|---|
| 623 | 613 | { |
|---|
| 624 | 614 | struct device *dev = &pdev->dev; |
|---|
| 625 | 615 | struct xilinx_pcie_port *port; |
|---|
| 626 | | - struct pci_bus *bus, *child; |
|---|
| 627 | 616 | struct pci_host_bridge *bridge; |
|---|
| 628 | 617 | int err; |
|---|
| 629 | | - resource_size_t iobase = 0; |
|---|
| 630 | | - LIST_HEAD(res); |
|---|
| 631 | 618 | |
|---|
| 632 | 619 | if (!dev->of_node) |
|---|
| 633 | 620 | return -ENODEV; |
|---|
| .. | .. |
|---|
| 654 | 641 | return err; |
|---|
| 655 | 642 | } |
|---|
| 656 | 643 | |
|---|
| 657 | | - err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res, |
|---|
| 658 | | - &iobase); |
|---|
| 659 | | - if (err) { |
|---|
| 660 | | - dev_err(dev, "Getting bridge resources failed\n"); |
|---|
| 661 | | - return err; |
|---|
| 662 | | - } |
|---|
| 663 | | - |
|---|
| 664 | | - err = devm_request_pci_bus_resources(dev, &res); |
|---|
| 665 | | - if (err) |
|---|
| 666 | | - goto error; |
|---|
| 667 | | - |
|---|
| 668 | | - |
|---|
| 669 | | - list_splice_init(&res, &bridge->windows); |
|---|
| 670 | | - bridge->dev.parent = dev; |
|---|
| 671 | 644 | bridge->sysdata = port; |
|---|
| 672 | | - bridge->busnr = 0; |
|---|
| 673 | 645 | bridge->ops = &xilinx_pcie_ops; |
|---|
| 674 | | - bridge->map_irq = of_irq_parse_and_map_pci; |
|---|
| 675 | | - bridge->swizzle_irq = pci_common_swizzle; |
|---|
| 676 | 646 | |
|---|
| 677 | 647 | #ifdef CONFIG_PCI_MSI |
|---|
| 678 | 648 | xilinx_pcie_msi_chip.dev = dev; |
|---|
| 679 | 649 | bridge->msi = &xilinx_pcie_msi_chip; |
|---|
| 680 | 650 | #endif |
|---|
| 681 | | - err = pci_scan_root_bus_bridge(bridge); |
|---|
| 682 | | - if (err < 0) |
|---|
| 683 | | - goto error; |
|---|
| 684 | | - |
|---|
| 685 | | - bus = bridge->bus; |
|---|
| 686 | | - |
|---|
| 687 | | - pci_assign_unassigned_bus_resources(bus); |
|---|
| 688 | | - list_for_each_entry(child, &bus->children, node) |
|---|
| 689 | | - pcie_bus_configure_settings(child); |
|---|
| 690 | | - pci_bus_add_devices(bus); |
|---|
| 691 | | - return 0; |
|---|
| 692 | | - |
|---|
| 693 | | -error: |
|---|
| 694 | | - pci_free_resource_list(&res); |
|---|
| 695 | | - return err; |
|---|
| 651 | + return pci_host_probe(bridge); |
|---|
| 696 | 652 | } |
|---|
| 697 | 653 | |
|---|
| 698 | 654 | static const struct of_device_id xilinx_pcie_of_match[] = { |
|---|