Lines Matching refs:php_slot

26 	struct pnv_php_slot	*php_slot;
37 static void pnv_php_disable_irq(struct pnv_php_slot *php_slot,
40 struct pci_dev *pdev = php_slot->pdev;
43 if (php_slot->irq > 0) {
50 free_irq(php_slot->irq, php_slot);
51 php_slot->irq = 0;
54 if (php_slot->wq) {
55 destroy_workqueue(php_slot->wq);
56 php_slot->wq = NULL;
71 struct pnv_php_slot *php_slot = container_of(kref,
74 WARN_ON(!list_empty(&php_slot->children));
75 pnv_php_disable_irq(php_slot, false);
76 kfree(php_slot->name);
77 kfree(php_slot);
80 static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot)
83 if (!php_slot)
86 kref_put(&php_slot->kref, pnv_php_free_slot);
90 struct pnv_php_slot *php_slot)
94 if (php_slot->dn == dn) {
95 kref_get(&php_slot->kref);
96 return php_slot;
99 list_for_each_entry(tmp, &php_slot->children, link) {
110 struct pnv_php_slot *php_slot, *tmp;
115 php_slot = pnv_php_match(dn, tmp);
116 if (php_slot) {
118 return php_slot;
165 static void pnv_php_rmv_devtree(struct pnv_php_slot *php_slot)
167 pnv_php_rmv_pdns(php_slot->dn);
173 if (php_slot->fdt)
174 of_changeset_destroy(&php_slot->ocs);
175 pnv_php_detach_device_nodes(php_slot->dn);
177 if (php_slot->fdt) {
178 kfree(php_slot->dt);
179 kfree(php_slot->fdt);
180 php_slot->dt = NULL;
181 php_slot->dn->child = NULL;
182 php_slot->fdt = NULL;
253 static int pnv_php_add_devtree(struct pnv_php_slot *php_slot)
268 ret = pnv_pci_get_device_tree(php_slot->dn->phandle, fdt1, 0x10000);
270 SLOT_WARN(php_slot, "Error %d getting FDT blob\n", ret);
281 dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL);
284 SLOT_WARN(php_slot, "Cannot unflatten FDT\n");
289 of_changeset_init(&php_slot->ocs);
290 pnv_php_reverse_nodes(php_slot->dn);
291 ret = pnv_php_populate_changeset(&php_slot->ocs, php_slot->dn);
293 pnv_php_reverse_nodes(php_slot->dn);
294 SLOT_WARN(php_slot, "Error %d populating changeset\n",
299 php_slot->dn->child = NULL;
300 ret = of_changeset_apply(&php_slot->ocs);
302 SLOT_WARN(php_slot, "Error %d applying changeset\n", ret);
307 pnv_php_add_pdns(php_slot);
308 php_slot->fdt = fdt;
309 php_slot->dt = dt;
314 of_changeset_destroy(&php_slot->ocs);
317 php_slot->dn->child = NULL;
334 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
338 ret = pnv_pci_set_power_state(php_slot->id, state, &msg);
340 if (be64_to_cpu(msg.params[1]) != php_slot->dn->phandle ||
342 SLOT_WARN(php_slot, "Wrong msg (%lld, %lld, %lld)\n",
357 pnv_php_rmv_devtree(php_slot);
359 ret = pnv_php_add_devtree(php_slot);
364 SLOT_WARN(php_slot, "Error %d powering %s\n",
372 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
381 ret = pnv_pci_get_power_state(php_slot->id, &power_state);
383 SLOT_WARN(php_slot, "Error %d getting power status\n",
394 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
402 ret = pnv_pci_get_presence_state(php_slot->id, &presence);
407 SLOT_WARN(php_slot, "Error %d getting presence\n", ret);
415 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
417 *state = php_slot->attention_state;
423 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
424 struct pci_dev *bridge = php_slot->pdev;
427 php_slot->attention_state = state;
443 static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan)
445 struct hotplug_slot *slot = &php_slot->slot;
451 if (php_slot->state != PNV_PHP_STATE_REGISTERED)
466 if (!php_slot->power_state_check) {
467 php_slot->power_state_check = true;
485 if (!php_slot->power_state_check) {
486 php_slot->power_state_check = true;
513 pci_hp_add_devices(php_slot->bus);
518 php_slot->state = PNV_PHP_STATE_POPULATED;
520 pnv_php_register(php_slot->dn);
522 php_slot->state = PNV_PHP_STATE_POPULATED;
530 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
531 struct pci_dev *bridge = php_slot->pdev;
543 if (php_slot->irq > 0)
544 disable_irq(php_slot->irq);
549 pcie_capability_read_word(php_slot->pdev, PCI_EXP_SLTSTA, &sts);
551 pcie_capability_write_word(php_slot->pdev, PCI_EXP_SLTSTA, sts);
553 if (php_slot->irq > 0)
554 enable_irq(php_slot->irq);
561 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
563 return pnv_php_enable(php_slot, true);
568 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
576 if (php_slot->state != PNV_PHP_STATE_POPULATED &&
577 php_slot->state != PNV_PHP_STATE_REGISTERED)
582 pci_hp_remove_devices(php_slot->bus);
586 pnv_php_unregister(php_slot->dn);
591 php_slot->state = PNV_PHP_STATE_REGISTERED;
605 static void pnv_php_release(struct pnv_php_slot *php_slot)
611 list_del(&php_slot->link);
615 pnv_php_put_slot(php_slot);
616 pnv_php_put_slot(php_slot->parent);
621 struct pnv_php_slot *php_slot;
638 php_slot = kzalloc(sizeof(*php_slot), GFP_KERNEL);
639 if (!php_slot)
642 php_slot->name = kstrdup(label, GFP_KERNEL);
643 if (!php_slot->name) {
644 kfree(php_slot);
649 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn);
651 php_slot->slot_no = -1; /* Placeholder slot */
653 kref_init(&php_slot->kref);
654 php_slot->state = PNV_PHP_STATE_INITIALIZED;
655 php_slot->dn = dn;
656 php_slot->pdev = bus->self;
657 php_slot->bus = bus;
658 php_slot->id = id;
659 php_slot->power_state_check = false;
660 php_slot->slot.ops = &php_slot_ops;
662 INIT_LIST_HEAD(&php_slot->children);
663 INIT_LIST_HEAD(&php_slot->link);
665 return php_slot;
668 static int pnv_php_register_slot(struct pnv_php_slot *php_slot)
671 struct device_node *dn = php_slot->dn;
676 parent = pnv_php_find_slot(php_slot->dn);
683 ret = pci_hp_register(&php_slot->slot, php_slot->bus,
684 php_slot->slot_no, php_slot->name);
686 SLOT_WARN(php_slot, "Error %d registering slot\n", ret);
707 php_slot->parent = parent;
709 list_add_tail(&php_slot->link, &parent->children);
711 list_add_tail(&php_slot->link, &pnv_php_slot_list);
714 php_slot->state = PNV_PHP_STATE_REGISTERED;
718 static int pnv_php_enable_msix(struct pnv_php_slot *php_slot)
720 struct pci_dev *pdev = php_slot->pdev;
739 SLOT_WARN(php_slot, "Error %d enabling MSIx\n", ret);
750 struct pnv_php_slot *php_slot = event->php_slot;
753 pnv_php_enable_slot(&php_slot->slot);
755 pnv_php_disable_slot(&php_slot->slot);
762 struct pnv_php_slot *php_slot = data;
763 struct pci_dev *pchild, *pdev = php_slot->pdev;
778 php_slot->name,
785 } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) &&
787 ret = pnv_pci_get_presence_state(php_slot->id, &presence);
789 SLOT_WARN(php_slot,
791 php_slot->name, ret, sts);
797 pci_dbg(pdev, "PCI slot [%s]: Spurious IRQ?\n", php_slot->name);
803 pchild = list_first_entry_or_null(&php_slot->bus->devices,
821 SLOT_WARN(php_slot,
823 php_slot->name, sts);
828 php_slot->name, added ? "added" : "removed", irq);
831 event->php_slot = php_slot;
832 queue_work(php_slot->wq, &event->work);
837 static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq)
839 struct pci_dev *pdev = php_slot->pdev;
845 php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name);
846 if (!php_slot->wq) {
847 SLOT_WARN(php_slot, "Cannot alloc workqueue\n");
848 pnv_php_disable_irq(php_slot, true);
853 ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc",
856 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC;
860 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC)
868 php_slot->name, php_slot);
870 pnv_php_disable_irq(php_slot, true);
871 SLOT_WARN(php_slot, "Error %d enabling IRQ %d\n", ret, irq);
877 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) {
889 php_slot->irq = irq;
892 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot)
894 struct pci_dev *pdev = php_slot->pdev;
907 SLOT_WARN(php_slot, "Error %d enabling device\n", ret);
914 irq = pnv_php_enable_msix(php_slot);
916 pnv_php_init_irq(php_slot, irq);
927 pnv_php_init_irq(php_slot, irq);
933 struct pnv_php_slot *php_slot;
946 php_slot = pnv_php_alloc_slot(dn);
947 if (!php_slot)
950 ret = pnv_php_register_slot(php_slot);
954 ret = pnv_php_enable(php_slot, false);
961 pnv_php_enable_irq(php_slot);
966 pnv_php_unregister_one(php_slot->dn);
968 pnv_php_put_slot(php_slot);
988 struct pnv_php_slot *php_slot;
990 php_slot = pnv_php_find_slot(dn);
991 if (!php_slot)
994 php_slot->state = PNV_PHP_STATE_OFFLINE;
995 pci_hp_deregister(&php_slot->slot);
996 pnv_php_release(php_slot);
997 pnv_php_put_slot(php_slot);