Lines Matching refs:php_slot
31 struct pnv_php_slot *php_slot; member
42 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot);
44 static void pnv_php_disable_irq(struct pnv_php_slot *php_slot, in pnv_php_disable_irq() argument
47 struct pci_dev *pdev = php_slot->pdev; in pnv_php_disable_irq()
50 if (php_slot->irq > 0) { in pnv_php_disable_irq()
57 free_irq(php_slot->irq, php_slot); in pnv_php_disable_irq()
58 php_slot->irq = 0; in pnv_php_disable_irq()
74 struct pnv_php_slot *php_slot = container_of(kref, in pnv_php_free_slot() local
77 WARN_ON(!list_empty(&php_slot->children)); in pnv_php_free_slot()
78 pnv_php_disable_irq(php_slot, false, false); in pnv_php_free_slot()
79 destroy_workqueue(php_slot->wq); in pnv_php_free_slot()
80 kfree(php_slot->name); in pnv_php_free_slot()
81 kfree(php_slot); in pnv_php_free_slot()
84 static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot) in pnv_php_put_slot() argument
87 if (!php_slot) in pnv_php_put_slot()
90 kref_put(&php_slot->kref, pnv_php_free_slot); in pnv_php_put_slot()
94 struct pnv_php_slot *php_slot) in pnv_php_match() argument
98 if (php_slot->dn == dn) { in pnv_php_match()
99 kref_get(&php_slot->kref); in pnv_php_match()
100 return php_slot; in pnv_php_match()
103 list_for_each_entry(tmp, &php_slot->children, link) { in pnv_php_match()
114 struct pnv_php_slot *php_slot, *tmp; in pnv_php_find_slot() local
119 php_slot = pnv_php_match(dn, tmp); in pnv_php_find_slot()
120 if (php_slot) { in pnv_php_find_slot()
122 return php_slot; in pnv_php_find_slot()
169 static void pnv_php_rmv_devtree(struct pnv_php_slot *php_slot) in pnv_php_rmv_devtree() argument
171 pnv_php_rmv_pdns(php_slot->dn); in pnv_php_rmv_devtree()
177 if (php_slot->fdt) in pnv_php_rmv_devtree()
178 of_changeset_destroy(&php_slot->ocs); in pnv_php_rmv_devtree()
179 pnv_php_detach_device_nodes(php_slot->dn); in pnv_php_rmv_devtree()
181 if (php_slot->fdt) { in pnv_php_rmv_devtree()
182 kfree(php_slot->dt); in pnv_php_rmv_devtree()
183 kfree(php_slot->fdt); in pnv_php_rmv_devtree()
184 php_slot->dt = NULL; in pnv_php_rmv_devtree()
185 php_slot->dn->child = NULL; in pnv_php_rmv_devtree()
186 php_slot->fdt = NULL; in pnv_php_rmv_devtree()
257 static int pnv_php_add_devtree(struct pnv_php_slot *php_slot) in pnv_php_add_devtree() argument
272 ret = pnv_pci_get_device_tree(php_slot->dn->phandle, fdt1, 0x10000); in pnv_php_add_devtree()
274 SLOT_WARN(php_slot, "Error %d getting FDT blob\n", ret); in pnv_php_add_devtree()
285 dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL); in pnv_php_add_devtree()
288 SLOT_WARN(php_slot, "Cannot unflatten FDT\n"); in pnv_php_add_devtree()
293 of_changeset_init(&php_slot->ocs); in pnv_php_add_devtree()
294 pnv_php_reverse_nodes(php_slot->dn); in pnv_php_add_devtree()
295 ret = pnv_php_populate_changeset(&php_slot->ocs, php_slot->dn); in pnv_php_add_devtree()
297 pnv_php_reverse_nodes(php_slot->dn); in pnv_php_add_devtree()
298 SLOT_WARN(php_slot, "Error %d populating changeset\n", in pnv_php_add_devtree()
303 php_slot->dn->child = NULL; in pnv_php_add_devtree()
304 ret = of_changeset_apply(&php_slot->ocs); in pnv_php_add_devtree()
306 SLOT_WARN(php_slot, "Error %d applying changeset\n", ret); in pnv_php_add_devtree()
311 pnv_php_add_pdns(php_slot); in pnv_php_add_devtree()
312 php_slot->fdt = fdt; in pnv_php_add_devtree()
313 php_slot->dt = dt; in pnv_php_add_devtree()
318 of_changeset_destroy(&php_slot->ocs); in pnv_php_add_devtree()
321 php_slot->dn->child = NULL; in pnv_php_add_devtree()
338 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_set_slot_power_state() local
342 ret = pnv_pci_set_power_state(php_slot->id, state, &msg); in pnv_php_set_slot_power_state()
344 if (be64_to_cpu(msg.params[1]) != php_slot->dn->phandle || in pnv_php_set_slot_power_state()
346 SLOT_WARN(php_slot, "Wrong msg (%lld, %lld, %lld)\n", in pnv_php_set_slot_power_state()
361 pnv_php_rmv_devtree(php_slot); in pnv_php_set_slot_power_state()
363 ret = pnv_php_add_devtree(php_slot); in pnv_php_set_slot_power_state()
368 SLOT_WARN(php_slot, "Error %d powering %s\n", in pnv_php_set_slot_power_state()
376 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_power_state() local
385 ret = pnv_pci_get_power_state(php_slot->id, &power_state); in pnv_php_get_power_state()
387 SLOT_WARN(php_slot, "Error %d getting power status\n", in pnv_php_get_power_state()
412 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_adapter_state() local
420 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_get_adapter_state()
422 if (pci_pcie_type(php_slot->pdev) == PCI_EXP_TYPE_DOWNSTREAM && in pnv_php_get_adapter_state()
431 if (pcie_check_link_active(php_slot->pdev) > 0) in pnv_php_get_adapter_state()
438 SLOT_WARN(php_slot, "Error %d getting presence\n", ret); in pnv_php_get_adapter_state()
446 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_raw_indicator_status() local
447 struct pci_dev *bridge = php_slot->pdev; in pnv_php_get_raw_indicator_status()
458 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_attention_state() local
460 pnv_php_get_raw_indicator_status(slot, &php_slot->attention_state); in pnv_php_get_attention_state()
461 *state = php_slot->attention_state; in pnv_php_get_attention_state()
467 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_set_attention_state() local
468 struct pci_dev *bridge = php_slot->pdev; in pnv_php_set_attention_state()
471 php_slot->attention_state = state; in pnv_php_set_attention_state()
487 static int pnv_php_activate_slot(struct pnv_php_slot *php_slot, in pnv_php_activate_slot() argument
506 php_slot, in pnv_php_activate_slot()
510 php_slot, in pnv_php_activate_slot()
521 SLOT_WARN(php_slot, "Try %d...\n", i + 1); in pnv_php_activate_slot()
522 pci_set_pcie_reset_state(php_slot->pdev, in pnv_php_activate_slot()
525 pci_set_pcie_reset_state(php_slot->pdev, in pnv_php_activate_slot()
535 SLOT_WARN(php_slot, in pnv_php_activate_slot()
542 static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan) in pnv_php_enable() argument
544 struct hotplug_slot *slot = &php_slot->slot; in pnv_php_enable()
550 if (php_slot->state != PNV_PHP_STATE_REGISTERED) in pnv_php_enable()
565 if (!php_slot->power_state_check) { in pnv_php_enable()
566 php_slot->power_state_check = true; in pnv_php_enable()
584 if (!php_slot->power_state_check) { in pnv_php_enable()
585 php_slot->power_state_check = true; in pnv_php_enable()
604 ret = pnv_php_activate_slot(php_slot, slot); in pnv_php_enable()
612 pci_hp_add_devices(php_slot->bus); in pnv_php_enable()
617 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
619 pnv_php_register(php_slot->dn); in pnv_php_enable()
621 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
629 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_reset_slot() local
630 struct pci_dev *bridge = php_slot->pdev; in pnv_php_reset_slot()
642 if (php_slot->irq > 0) in pnv_php_reset_slot()
643 disable_irq(php_slot->irq); in pnv_php_reset_slot()
648 pcie_capability_read_word(php_slot->pdev, PCI_EXP_SLTSTA, &sts); in pnv_php_reset_slot()
650 pcie_capability_write_word(php_slot->pdev, PCI_EXP_SLTSTA, sts); in pnv_php_reset_slot()
652 if (php_slot->irq > 0) in pnv_php_reset_slot()
653 enable_irq(php_slot->irq); in pnv_php_reset_slot()
660 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_enable_slot() local
664 ret = pnv_php_enable(php_slot, true); in pnv_php_enable_slot()
669 ret = of_property_read_u32(php_slot->dn, "ibm,slot-surprise-pluggable", in pnv_php_enable_slot()
672 pnv_php_enable_irq(php_slot); in pnv_php_enable_slot()
692 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot->hotplug); in pnv_php_disable_all_irqs() local
694 pnv_php_disable_irq(php_slot, false, true); in pnv_php_disable_all_irqs()
717 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_disable_slot() local
725 if (php_slot->state != PNV_PHP_STATE_POPULATED && in pnv_php_disable_slot()
726 php_slot->state != PNV_PHP_STATE_REGISTERED) in pnv_php_disable_slot()
734 pnv_php_disable_all_downstream_irqs(php_slot->bus); in pnv_php_disable_slot()
738 pci_hp_remove_devices(php_slot->bus); in pnv_php_disable_slot()
742 pnv_php_unregister(php_slot->dn); in pnv_php_disable_slot()
747 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_disable_slot()
761 static void pnv_php_release(struct pnv_php_slot *php_slot) in pnv_php_release() argument
767 list_del(&php_slot->link); in pnv_php_release()
771 pnv_php_put_slot(php_slot); in pnv_php_release()
772 pnv_php_put_slot(php_slot->parent); in pnv_php_release()
777 struct pnv_php_slot *php_slot; in pnv_php_alloc_slot() local
794 php_slot = kzalloc(sizeof(*php_slot), GFP_KERNEL); in pnv_php_alloc_slot()
795 if (!php_slot) in pnv_php_alloc_slot()
798 php_slot->name = kstrdup(label, GFP_KERNEL); in pnv_php_alloc_slot()
799 if (!php_slot->name) { in pnv_php_alloc_slot()
800 kfree(php_slot); in pnv_php_alloc_slot()
805 php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name); in pnv_php_alloc_slot()
806 if (!php_slot->wq) { in pnv_php_alloc_slot()
807 SLOT_WARN(php_slot, "Cannot alloc workqueue\n"); in pnv_php_alloc_slot()
808 kfree(php_slot->name); in pnv_php_alloc_slot()
809 kfree(php_slot); in pnv_php_alloc_slot()
814 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn); in pnv_php_alloc_slot()
816 php_slot->slot_no = -1; /* Placeholder slot */ in pnv_php_alloc_slot()
818 kref_init(&php_slot->kref); in pnv_php_alloc_slot()
819 php_slot->state = PNV_PHP_STATE_INITIALIZED; in pnv_php_alloc_slot()
820 php_slot->dn = dn; in pnv_php_alloc_slot()
821 php_slot->pdev = bus->self; in pnv_php_alloc_slot()
822 php_slot->bus = bus; in pnv_php_alloc_slot()
823 php_slot->id = id; in pnv_php_alloc_slot()
824 php_slot->power_state_check = false; in pnv_php_alloc_slot()
825 php_slot->slot.ops = &php_slot_ops; in pnv_php_alloc_slot()
827 INIT_LIST_HEAD(&php_slot->children); in pnv_php_alloc_slot()
828 INIT_LIST_HEAD(&php_slot->link); in pnv_php_alloc_slot()
830 return php_slot; in pnv_php_alloc_slot()
833 static int pnv_php_register_slot(struct pnv_php_slot *php_slot) in pnv_php_register_slot() argument
836 struct device_node *dn = php_slot->dn; in pnv_php_register_slot()
841 parent = pnv_php_find_slot(php_slot->dn); in pnv_php_register_slot()
848 ret = pci_hp_register(&php_slot->slot, php_slot->bus, in pnv_php_register_slot()
849 php_slot->slot_no, php_slot->name); in pnv_php_register_slot()
851 SLOT_WARN(php_slot, "Error %d registering slot\n", ret); in pnv_php_register_slot()
872 php_slot->parent = parent; in pnv_php_register_slot()
874 list_add_tail(&php_slot->link, &parent->children); in pnv_php_register_slot()
876 list_add_tail(&php_slot->link, &pnv_php_slot_list); in pnv_php_register_slot()
879 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_register_slot()
883 static int pnv_php_enable_msix(struct pnv_php_slot *php_slot) in pnv_php_enable_msix() argument
885 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_msix()
904 SLOT_WARN(php_slot, "Error %d enabling MSIx\n", ret); in pnv_php_enable_msix()
912 pnv_php_detect_clear_suprise_removal_freeze(struct pnv_php_slot *php_slot) in pnv_php_detect_clear_suprise_removal_freeze() argument
914 struct pci_dev *pdev = php_slot->pdev; in pnv_php_detect_clear_suprise_removal_freeze()
932 php_slot, in pnv_php_detect_clear_suprise_removal_freeze()
937 php_slot, in pnv_php_detect_clear_suprise_removal_freeze()
945 php_slot, in pnv_php_detect_clear_suprise_removal_freeze()
949 SLOT_WARN(php_slot, in pnv_php_detect_clear_suprise_removal_freeze()
960 struct pnv_php_slot *php_slot = event->php_slot; in pnv_php_event_handler() local
963 pnv_php_enable_slot(&php_slot->slot); in pnv_php_event_handler()
965 pnv_php_disable_slot(&php_slot->slot); in pnv_php_event_handler()
966 pnv_php_detect_clear_suprise_removal_freeze(php_slot); in pnv_php_event_handler()
974 struct pnv_php_slot *php_slot = data; in pnv_php_interrupt() local
975 struct pci_dev *pchild, *pdev = php_slot->pdev; in pnv_php_interrupt()
990 php_slot->name, in pnv_php_interrupt()
997 } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) && in pnv_php_interrupt()
999 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_interrupt()
1001 SLOT_WARN(php_slot, in pnv_php_interrupt()
1003 php_slot->name, ret, sts); in pnv_php_interrupt()
1009 pci_dbg(pdev, "PCI slot [%s]: Spurious IRQ?\n", php_slot->name); in pnv_php_interrupt()
1015 pchild = list_first_entry_or_null(&php_slot->bus->devices, in pnv_php_interrupt()
1033 SLOT_WARN(php_slot, in pnv_php_interrupt()
1035 php_slot->name, sts); in pnv_php_interrupt()
1040 php_slot->name, added ? "added" : "removed", irq); in pnv_php_interrupt()
1043 event->php_slot = php_slot; in pnv_php_interrupt()
1044 queue_work(php_slot->wq, &event->work); in pnv_php_interrupt()
1049 static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) in pnv_php_init_irq() argument
1051 struct pci_dev *pdev = php_slot->pdev; in pnv_php_init_irq()
1057 ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc", in pnv_php_init_irq()
1060 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC; in pnv_php_init_irq()
1064 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) in pnv_php_init_irq()
1072 php_slot->name, php_slot); in pnv_php_init_irq()
1074 pnv_php_disable_irq(php_slot, true, true); in pnv_php_init_irq()
1075 SLOT_WARN(php_slot, "Error %d enabling IRQ %d\n", ret, irq); in pnv_php_init_irq()
1081 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) { in pnv_php_init_irq()
1093 php_slot->irq = irq; in pnv_php_init_irq()
1096 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot) in pnv_php_enable_irq() argument
1098 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_irq()
1111 SLOT_WARN(php_slot, "Error %d enabling device\n", ret); in pnv_php_enable_irq()
1118 irq = pnv_php_enable_msix(php_slot); in pnv_php_enable_irq()
1120 pnv_php_init_irq(php_slot, irq); in pnv_php_enable_irq()
1131 pnv_php_init_irq(php_slot, irq); in pnv_php_enable_irq()
1137 struct pnv_php_slot *php_slot; in pnv_php_register_one() local
1150 php_slot = pnv_php_alloc_slot(dn); in pnv_php_register_one()
1151 if (!php_slot) in pnv_php_register_one()
1154 ret = pnv_php_register_slot(php_slot); in pnv_php_register_one()
1158 ret = pnv_php_enable(php_slot, false); in pnv_php_register_one()
1165 pnv_php_enable_irq(php_slot); in pnv_php_register_one()
1170 pnv_php_unregister_one(php_slot->dn); in pnv_php_register_one()
1172 pnv_php_put_slot(php_slot); in pnv_php_register_one()
1192 struct pnv_php_slot *php_slot; in pnv_php_unregister_one() local
1194 php_slot = pnv_php_find_slot(dn); in pnv_php_unregister_one()
1195 if (!php_slot) in pnv_php_unregister_one()
1198 php_slot->state = PNV_PHP_STATE_OFFLINE; in pnv_php_unregister_one()
1199 pci_hp_deregister(&php_slot->slot); in pnv_php_unregister_one()
1200 pnv_php_release(php_slot); in pnv_php_unregister_one()
1201 pnv_php_put_slot(php_slot); in pnv_php_unregister_one()