Lines Matching refs:php_slot
23 struct pnv_php_slot *php_slot; member
34 static void pnv_php_disable_irq(struct pnv_php_slot *php_slot, in pnv_php_disable_irq() argument
37 struct pci_dev *pdev = php_slot->pdev; in pnv_php_disable_irq()
38 int irq = php_slot->irq; in pnv_php_disable_irq()
41 if (php_slot->irq > 0) { in pnv_php_disable_irq()
48 free_irq(php_slot->irq, php_slot); in pnv_php_disable_irq()
49 php_slot->irq = 0; in pnv_php_disable_irq()
52 if (php_slot->wq) { in pnv_php_disable_irq()
53 destroy_workqueue(php_slot->wq); in pnv_php_disable_irq()
54 php_slot->wq = NULL; in pnv_php_disable_irq()
69 struct pnv_php_slot *php_slot = container_of(kref, in pnv_php_free_slot() local
72 WARN_ON(!list_empty(&php_slot->children)); in pnv_php_free_slot()
73 pnv_php_disable_irq(php_slot, false); in pnv_php_free_slot()
74 kfree(php_slot->name); in pnv_php_free_slot()
75 kfree(php_slot); in pnv_php_free_slot()
78 static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot) in pnv_php_put_slot() argument
81 if (!php_slot) in pnv_php_put_slot()
84 kref_put(&php_slot->kref, pnv_php_free_slot); in pnv_php_put_slot()
88 struct pnv_php_slot *php_slot) in pnv_php_match() argument
92 if (php_slot->dn == dn) { in pnv_php_match()
93 kref_get(&php_slot->kref); in pnv_php_match()
94 return php_slot; in pnv_php_match()
97 list_for_each_entry(tmp, &php_slot->children, link) { in pnv_php_match()
108 struct pnv_php_slot *php_slot, *tmp; in pnv_php_find_slot() local
113 php_slot = pnv_php_match(dn, tmp); in pnv_php_find_slot()
114 if (php_slot) { in pnv_php_find_slot()
116 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 pci_warn(php_slot->pdev, "Error %d getting FDT blob\n", ret); in pnv_php_add_devtree()
286 dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL); in pnv_php_add_devtree()
289 pci_warn(php_slot->pdev, "Cannot unflatten FDT\n"); in pnv_php_add_devtree()
294 of_changeset_init(&php_slot->ocs); in pnv_php_add_devtree()
295 pnv_php_reverse_nodes(php_slot->dn); in pnv_php_add_devtree()
296 ret = pnv_php_populate_changeset(&php_slot->ocs, php_slot->dn); in pnv_php_add_devtree()
298 pnv_php_reverse_nodes(php_slot->dn); in pnv_php_add_devtree()
299 pci_warn(php_slot->pdev, "Error %d populating changeset\n", in pnv_php_add_devtree()
304 php_slot->dn->child = NULL; in pnv_php_add_devtree()
305 ret = of_changeset_apply(&php_slot->ocs); in pnv_php_add_devtree()
307 pci_warn(php_slot->pdev, "Error %d applying changeset\n", ret); in pnv_php_add_devtree()
312 pnv_php_add_pdns(php_slot); in pnv_php_add_devtree()
313 php_slot->fdt = fdt; in pnv_php_add_devtree()
314 php_slot->dt = dt; in pnv_php_add_devtree()
319 of_changeset_destroy(&php_slot->ocs); in pnv_php_add_devtree()
322 php_slot->dn->child = NULL; in pnv_php_add_devtree()
334 struct pnv_php_slot *php_slot = slot->private; in pnv_php_set_slot_power_state() local
338 ret = pnv_pci_set_power_state(php_slot->id, state, &msg); in pnv_php_set_slot_power_state()
340 if (be64_to_cpu(msg.params[1]) != php_slot->dn->phandle || in pnv_php_set_slot_power_state()
343 pci_warn(php_slot->pdev, "Wrong msg (%lld, %lld, %lld)\n", in pnv_php_set_slot_power_state()
350 pci_warn(php_slot->pdev, "Error %d powering %s\n", in pnv_php_set_slot_power_state()
356 pnv_php_rmv_devtree(php_slot); in pnv_php_set_slot_power_state()
358 ret = pnv_php_add_devtree(php_slot); in pnv_php_set_slot_power_state()
366 struct pnv_php_slot *php_slot = slot->private; in pnv_php_get_power_state() local
375 ret = pnv_pci_get_power_state(php_slot->id, &power_state); in pnv_php_get_power_state()
377 pci_warn(php_slot->pdev, "Error %d getting power status\n", in pnv_php_get_power_state()
389 struct pnv_php_slot *php_slot = slot->private; in pnv_php_get_adapter_state() local
397 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_get_adapter_state()
403 pci_warn(php_slot->pdev, "Error %d getting presence\n", ret); in pnv_php_get_adapter_state()
417 static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan) in pnv_php_enable() argument
419 struct hotplug_slot *slot = &php_slot->slot; in pnv_php_enable()
425 if (php_slot->state != PNV_PHP_STATE_REGISTERED) in pnv_php_enable()
440 if (!php_slot->power_state_check) { in pnv_php_enable()
441 php_slot->power_state_check = true; in pnv_php_enable()
459 if (!php_slot->power_state_check) { in pnv_php_enable()
460 php_slot->power_state_check = true; in pnv_php_enable()
487 pci_hp_add_devices(php_slot->bus); in pnv_php_enable()
492 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
494 pnv_php_register(php_slot->dn); in pnv_php_enable()
496 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
504 struct pnv_php_slot *php_slot = container_of(slot, in pnv_php_enable_slot() local
507 return pnv_php_enable(php_slot, true); in pnv_php_enable_slot()
512 struct pnv_php_slot *php_slot = slot->private; in pnv_php_disable_slot() local
515 if (php_slot->state != PNV_PHP_STATE_POPULATED) in pnv_php_disable_slot()
520 pci_hp_remove_devices(php_slot->bus); in pnv_php_disable_slot()
524 pnv_php_unregister(php_slot->dn); in pnv_php_disable_slot()
529 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_disable_slot()
541 static void pnv_php_release(struct pnv_php_slot *php_slot) in pnv_php_release() argument
547 list_del(&php_slot->link); in pnv_php_release()
551 pnv_php_put_slot(php_slot); in pnv_php_release()
552 pnv_php_put_slot(php_slot->parent); in pnv_php_release()
557 struct pnv_php_slot *php_slot; in pnv_php_alloc_slot() local
574 php_slot = kzalloc(sizeof(*php_slot), GFP_KERNEL); in pnv_php_alloc_slot()
575 if (!php_slot) in pnv_php_alloc_slot()
578 php_slot->name = kstrdup(label, GFP_KERNEL); in pnv_php_alloc_slot()
579 if (!php_slot->name) { in pnv_php_alloc_slot()
580 kfree(php_slot); in pnv_php_alloc_slot()
585 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn); in pnv_php_alloc_slot()
587 php_slot->slot_no = -1; /* Placeholder slot */ in pnv_php_alloc_slot()
589 kref_init(&php_slot->kref); in pnv_php_alloc_slot()
590 php_slot->state = PNV_PHP_STATE_INITIALIZED; in pnv_php_alloc_slot()
591 php_slot->dn = dn; in pnv_php_alloc_slot()
592 php_slot->pdev = bus->self; in pnv_php_alloc_slot()
593 php_slot->bus = bus; in pnv_php_alloc_slot()
594 php_slot->id = id; in pnv_php_alloc_slot()
595 php_slot->power_state_check = false; in pnv_php_alloc_slot()
596 php_slot->slot.ops = &php_slot_ops; in pnv_php_alloc_slot()
597 php_slot->slot.info = &php_slot->slot_info; in pnv_php_alloc_slot()
598 php_slot->slot.private = php_slot; in pnv_php_alloc_slot()
600 INIT_LIST_HEAD(&php_slot->children); in pnv_php_alloc_slot()
601 INIT_LIST_HEAD(&php_slot->link); in pnv_php_alloc_slot()
603 return php_slot; in pnv_php_alloc_slot()
606 static int pnv_php_register_slot(struct pnv_php_slot *php_slot) in pnv_php_register_slot() argument
609 struct device_node *dn = php_slot->dn; in pnv_php_register_slot()
614 parent = pnv_php_find_slot(php_slot->dn); in pnv_php_register_slot()
621 ret = pci_hp_register(&php_slot->slot, php_slot->bus, in pnv_php_register_slot()
622 php_slot->slot_no, php_slot->name); in pnv_php_register_slot()
624 pci_warn(php_slot->pdev, "Error %d registering slot\n", ret); in pnv_php_register_slot()
645 php_slot->parent = parent; in pnv_php_register_slot()
647 list_add_tail(&php_slot->link, &parent->children); in pnv_php_register_slot()
649 list_add_tail(&php_slot->link, &pnv_php_slot_list); in pnv_php_register_slot()
652 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_register_slot()
656 static int pnv_php_enable_msix(struct pnv_php_slot *php_slot) in pnv_php_enable_msix() argument
658 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_msix()
688 struct pnv_php_slot *php_slot = event->php_slot; in pnv_php_event_handler() local
691 pnv_php_enable_slot(&php_slot->slot); in pnv_php_event_handler()
693 pnv_php_disable_slot(&php_slot->slot); in pnv_php_event_handler()
700 struct pnv_php_slot *php_slot = data; in pnv_php_interrupt() local
701 struct pci_dev *pchild, *pdev = php_slot->pdev; in pnv_php_interrupt()
717 } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) && in pnv_php_interrupt()
719 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_interrupt()
722 php_slot->name, ret, sts); in pnv_php_interrupt()
733 pchild = list_first_entry_or_null(&php_slot->bus->devices, in pnv_php_interrupt()
752 php_slot->name, sts); in pnv_php_interrupt()
757 php_slot->name, added ? "added" : "removed", irq); in pnv_php_interrupt()
760 event->php_slot = php_slot; in pnv_php_interrupt()
761 queue_work(php_slot->wq, &event->work); in pnv_php_interrupt()
766 static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) in pnv_php_init_irq() argument
768 struct pci_dev *pdev = php_slot->pdev; in pnv_php_init_irq()
774 php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name); in pnv_php_init_irq()
775 if (!php_slot->wq) { in pnv_php_init_irq()
777 pnv_php_disable_irq(php_slot, true); in pnv_php_init_irq()
782 ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc", in pnv_php_init_irq()
785 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC; in pnv_php_init_irq()
789 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) in pnv_php_init_irq()
797 php_slot->name, php_slot); in pnv_php_init_irq()
799 pnv_php_disable_irq(php_slot, true); in pnv_php_init_irq()
806 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) { in pnv_php_init_irq()
818 php_slot->irq = irq; in pnv_php_init_irq()
821 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot) in pnv_php_enable_irq() argument
823 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_irq()
843 irq = pnv_php_enable_msix(php_slot); in pnv_php_enable_irq()
845 pnv_php_init_irq(php_slot, irq); in pnv_php_enable_irq()
856 pnv_php_init_irq(php_slot, irq); in pnv_php_enable_irq()
862 struct pnv_php_slot *php_slot; in pnv_php_register_one() local
875 php_slot = pnv_php_alloc_slot(dn); in pnv_php_register_one()
876 if (!php_slot) in pnv_php_register_one()
879 ret = pnv_php_register_slot(php_slot); in pnv_php_register_one()
883 ret = pnv_php_enable(php_slot, false); in pnv_php_register_one()
890 pnv_php_enable_irq(php_slot); in pnv_php_register_one()
895 pnv_php_unregister_one(php_slot->dn); in pnv_php_register_one()
897 pnv_php_put_slot(php_slot); in pnv_php_register_one()
917 struct pnv_php_slot *php_slot; in pnv_php_unregister_one() local
919 php_slot = pnv_php_find_slot(dn); in pnv_php_unregister_one()
920 if (!php_slot) in pnv_php_unregister_one()
923 php_slot->state = PNV_PHP_STATE_OFFLINE; in pnv_php_unregister_one()
924 pci_hp_deregister(&php_slot->slot); in pnv_php_unregister_one()
925 pnv_php_release(php_slot); in pnv_php_unregister_one()
926 pnv_php_put_slot(php_slot); in pnv_php_unregister_one()