Lines Matching +full:pdc +full:- +full:global

1 // SPDX-License-Identifier: GPL-2.0+
16 #include <asm/pnv-pci.h>
17 #include <asm/ppc-pci.h>
24 ((sl)->pdev ? pci_warn((sl)->pdev, x) : dev_warn(&(sl)->bus->dev, x))
42 struct pci_dev *pdev = php_slot->pdev; in pnv_php_disable_irq()
43 int irq = php_slot->irq; in pnv_php_disable_irq()
46 if (php_slot->irq > 0) { in pnv_php_disable_irq()
53 free_irq(php_slot->irq, php_slot); in pnv_php_disable_irq()
54 php_slot->irq = 0; in pnv_php_disable_irq()
57 if (php_slot->wq) { in pnv_php_disable_irq()
58 destroy_workqueue(php_slot->wq); in pnv_php_disable_irq()
59 php_slot->wq = NULL; in pnv_php_disable_irq()
63 if (pdev->msix_enabled) in pnv_php_disable_irq()
65 else if (pdev->msi_enabled) in pnv_php_disable_irq()
77 WARN_ON(!list_empty(&php_slot->children)); in pnv_php_free_slot()
79 kfree(php_slot->name); in pnv_php_free_slot()
89 kref_put(&php_slot->kref, pnv_php_free_slot); in pnv_php_put_slot()
97 if (php_slot->dn == dn) { in pnv_php_match()
98 kref_get(&php_slot->kref); in pnv_php_match()
102 list_for_each_entry(tmp, &php_slot->children, link) { in pnv_php_match()
132 * The function should remove pdn in a depth-first manner.
147 * function should handle device nodes in depth-first manner.
170 pnv_php_rmv_pdns(php_slot->dn); in pnv_php_rmv_devtree()
176 if (php_slot->fdt) in pnv_php_rmv_devtree()
177 of_changeset_destroy(&php_slot->ocs); in pnv_php_rmv_devtree()
178 pnv_php_detach_device_nodes(php_slot->dn); in pnv_php_rmv_devtree()
180 if (php_slot->fdt) { in pnv_php_rmv_devtree()
181 kfree(php_slot->dt); in pnv_php_rmv_devtree()
182 kfree(php_slot->fdt); in pnv_php_rmv_devtree()
183 php_slot->dt = NULL; in pnv_php_rmv_devtree()
184 php_slot->dn->child = NULL; in pnv_php_rmv_devtree()
185 php_slot->fdt = NULL; in pnv_php_rmv_devtree()
198 /* In-depth first */ in pnv_php_reverse_nodes()
203 child = parent->child; in pnv_php_reverse_nodes()
204 parent->child = NULL; in pnv_php_reverse_nodes()
206 next = child->sibling; in pnv_php_reverse_nodes()
208 child->sibling = parent->child; in pnv_php_reverse_nodes()
209 parent->child = child; in pnv_php_reverse_nodes()
244 return ERR_PTR(-ENOMEM); in pnv_php_add_one_pdn()
251 struct pci_controller *hose = pci_bus_to_host(slot->bus); in pnv_php_add_pdns()
253 pci_traverse_device_nodes(slot->dn, pnv_php_add_one_pdn, hose); in pnv_php_add_pdns()
267 ret = -ENOMEM; in pnv_php_add_devtree()
271 ret = pnv_pci_get_device_tree(php_slot->dn->phandle, fdt1, 0x10000); in pnv_php_add_devtree()
279 ret = -ENOMEM; in pnv_php_add_devtree()
284 dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL); in pnv_php_add_devtree()
286 ret = -EINVAL; in pnv_php_add_devtree()
292 of_changeset_init(&php_slot->ocs); in pnv_php_add_devtree()
293 pnv_php_reverse_nodes(php_slot->dn); in pnv_php_add_devtree()
294 ret = pnv_php_populate_changeset(&php_slot->ocs, php_slot->dn); in pnv_php_add_devtree()
296 pnv_php_reverse_nodes(php_slot->dn); in pnv_php_add_devtree()
302 php_slot->dn->child = NULL; in pnv_php_add_devtree()
303 ret = of_changeset_apply(&php_slot->ocs); in pnv_php_add_devtree()
311 php_slot->fdt = fdt; in pnv_php_add_devtree()
312 php_slot->dt = dt; in pnv_php_add_devtree()
317 of_changeset_destroy(&php_slot->ocs); in pnv_php_add_devtree()
320 php_slot->dn->child = NULL; in pnv_php_add_devtree()
341 ret = pnv_pci_set_power_state(php_slot->id, state, &msg); in pnv_php_set_slot_power_state()
343 if (be64_to_cpu(msg.params[1]) != php_slot->dn->phandle || in pnv_php_set_slot_power_state()
349 return -ENOMSG; in pnv_php_set_slot_power_state()
352 ret = -ENODEV; in pnv_php_set_slot_power_state()
384 ret = pnv_pci_get_power_state(php_slot->id, &power_state); in pnv_php_get_power_state()
405 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_get_adapter_state()
420 *state = php_slot->attention_state; in pnv_php_get_attention_state()
427 struct pci_dev *bridge = php_slot->pdev; in pnv_php_set_attention_state()
430 php_slot->attention_state = state; in pnv_php_set_attention_state()
448 struct hotplug_slot *slot = &php_slot->slot; in pnv_php_enable()
454 if (php_slot->state != PNV_PHP_STATE_REGISTERED) in pnv_php_enable()
469 if (!php_slot->power_state_check) { in pnv_php_enable()
470 php_slot->power_state_check = true; in pnv_php_enable()
486 * has its power off and non-empty slot has its power on. in pnv_php_enable()
488 if (!php_slot->power_state_check) { in pnv_php_enable()
489 php_slot->power_state_check = true; in pnv_php_enable()
516 pci_hp_add_devices(php_slot->bus); in pnv_php_enable()
521 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
523 pnv_php_register(php_slot->dn); in pnv_php_enable()
525 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
534 struct pci_dev *bridge = php_slot->pdev; in pnv_php_reset_slot()
546 if (php_slot->irq > 0) in pnv_php_reset_slot()
547 disable_irq(php_slot->irq); in pnv_php_reset_slot()
552 pcie_capability_read_word(php_slot->pdev, PCI_EXP_SLTSTA, &sts); in pnv_php_reset_slot()
554 pcie_capability_write_word(php_slot->pdev, PCI_EXP_SLTSTA, sts); in pnv_php_reset_slot()
556 if (php_slot->irq > 0) in pnv_php_reset_slot()
557 enable_irq(php_slot->irq); in pnv_php_reset_slot()
579 if (php_slot->state != PNV_PHP_STATE_POPULATED && in pnv_php_disable_slot()
580 php_slot->state != PNV_PHP_STATE_REGISTERED) in pnv_php_disable_slot()
585 pci_hp_remove_devices(php_slot->bus); in pnv_php_disable_slot()
589 pnv_php_unregister(php_slot->dn); in pnv_php_disable_slot()
594 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_disable_slot()
612 /* Remove from global or child list */ in pnv_php_release()
614 list_del(&php_slot->link); in pnv_php_release()
619 pnv_php_put_slot(php_slot->parent); in pnv_php_release()
630 ret = of_property_read_string(dn, "ibm,slot-label", &label); in pnv_php_alloc_slot()
645 php_slot->name = kstrdup(label, GFP_KERNEL); in pnv_php_alloc_slot()
646 if (!php_slot->name) { in pnv_php_alloc_slot()
651 if (dn->child && PCI_DN(dn->child)) in pnv_php_alloc_slot()
652 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn); in pnv_php_alloc_slot()
654 php_slot->slot_no = -1; /* Placeholder slot */ in pnv_php_alloc_slot()
656 kref_init(&php_slot->kref); in pnv_php_alloc_slot()
657 php_slot->state = PNV_PHP_STATE_INITIALIZED; in pnv_php_alloc_slot()
658 php_slot->dn = dn; in pnv_php_alloc_slot()
659 php_slot->pdev = bus->self; in pnv_php_alloc_slot()
660 php_slot->bus = bus; in pnv_php_alloc_slot()
661 php_slot->id = id; in pnv_php_alloc_slot()
662 php_slot->power_state_check = false; in pnv_php_alloc_slot()
663 php_slot->slot.ops = &php_slot_ops; in pnv_php_alloc_slot()
665 INIT_LIST_HEAD(&php_slot->children); in pnv_php_alloc_slot()
666 INIT_LIST_HEAD(&php_slot->link); in pnv_php_alloc_slot()
674 struct device_node *dn = php_slot->dn; in pnv_php_register_slot()
679 parent = pnv_php_find_slot(php_slot->dn); in pnv_php_register_slot()
682 return -EEXIST; in pnv_php_register_slot()
686 ret = pci_hp_register(&php_slot->slot, php_slot->bus, in pnv_php_register_slot()
687 php_slot->slot_no, php_slot->name); in pnv_php_register_slot()
693 /* Attach to the parent's child list or global list */ in pnv_php_register_slot()
710 php_slot->parent = parent; in pnv_php_register_slot()
712 list_add_tail(&php_slot->link, &parent->children); in pnv_php_register_slot()
714 list_add_tail(&php_slot->link, &pnv_php_slot_list); in pnv_php_register_slot()
717 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_register_slot()
723 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_msix()
737 return -ERANGE; in pnv_php_enable_msix()
753 struct pnv_php_slot *php_slot = event->php_slot; in pnv_php_event_handler()
755 if (event->added) in pnv_php_event_handler()
756 pnv_php_enable_slot(&php_slot->slot); in pnv_php_event_handler()
758 pnv_php_disable_slot(&php_slot->slot); in pnv_php_event_handler()
766 struct pci_dev *pchild, *pdev = php_slot->pdev; in pnv_php_interrupt()
781 php_slot->name, in pnv_php_interrupt()
788 } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) && in pnv_php_interrupt()
790 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_interrupt()
794 php_slot->name, ret, sts); in pnv_php_interrupt()
800 pci_dbg(pdev, "PCI slot [%s]: Spurious IRQ?\n", php_slot->name); in pnv_php_interrupt()
806 pchild = list_first_entry_or_null(&php_slot->bus->devices, in pnv_php_interrupt()
809 pe = edev ? edev->pe : NULL; in pnv_php_interrupt()
826 php_slot->name, sts); in pnv_php_interrupt()
831 php_slot->name, added ? "added" : "removed", irq); in pnv_php_interrupt()
832 INIT_WORK(&event->work, pnv_php_event_handler); in pnv_php_interrupt()
833 event->added = added; in pnv_php_interrupt()
834 event->php_slot = php_slot; in pnv_php_interrupt()
835 queue_work(php_slot->wq, &event->work); in pnv_php_interrupt()
842 struct pci_dev *pdev = php_slot->pdev; in pnv_php_init_irq()
848 php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name); in pnv_php_init_irq()
849 if (!php_slot->wq) { in pnv_php_init_irq()
855 /* Check PDC (Presence Detection Change) is broken or not */ in pnv_php_init_irq()
856 ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc", in pnv_php_init_irq()
859 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC; in pnv_php_init_irq()
863 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) in pnv_php_init_irq()
871 php_slot->name, php_slot); in pnv_php_init_irq()
880 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) { in pnv_php_init_irq()
892 php_slot->irq = irq; in pnv_php_init_irq()
897 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_irq()
928 if (!ret || pdev->irq) { in pnv_php_enable_irq()
929 irq = pdev->irq; in pnv_php_enable_irq()
941 ret = of_property_read_u32(dn, "ibm,slot-pluggable", &prop32); in pnv_php_register_one()
943 return -ENXIO; in pnv_php_register_one()
945 ret = of_property_read_u32(dn, "ibm,reset-by-firmware", &prop32); in pnv_php_register_one()
947 return -ENXIO; in pnv_php_register_one()
951 return -ENODEV; in pnv_php_register_one()
962 ret = of_property_read_u32(dn, "ibm,slot-surprise-pluggable", &prop32); in pnv_php_register_one()
969 pnv_php_unregister_one(php_slot->dn); in pnv_php_register_one()
997 php_slot->state = PNV_PHP_STATE_OFFLINE; in pnv_php_unregister_one()
998 pci_hp_deregister(&php_slot->slot); in pnv_php_unregister_one()
1019 for_each_compatible_node(dn, NULL, "ibm,ioda2-phb") in pnv_php_init()
1022 for_each_compatible_node(dn, NULL, "ibm,ioda3-phb") in pnv_php_init()
1025 for_each_compatible_node(dn, NULL, "ibm,ioda2-npu2-opencapi-phb") in pnv_php_init()
1034 for_each_compatible_node(dn, NULL, "ibm,ioda2-phb") in pnv_php_exit()
1037 for_each_compatible_node(dn, NULL, "ibm,ioda3-phb") in pnv_php_exit()
1040 for_each_compatible_node(dn, NULL, "ibm,ioda2-npu2-opencapi-phb") in pnv_php_exit()