• Home
  • Raw
  • Download

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()
285 dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL); in pnv_php_add_devtree()
288 pci_warn(php_slot->pdev, "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 pci_warn(php_slot->pdev, "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 pci_warn(php_slot->pdev, "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()
347 pci_warn(php_slot->pdev, "Wrong msg (%lld, %lld, %lld)\n", in pnv_php_set_slot_power_state()
354 pci_warn(php_slot->pdev, "Error %d powering %s\n", in pnv_php_set_slot_power_state()
360 pnv_php_rmv_devtree(php_slot); in pnv_php_set_slot_power_state()
362 ret = pnv_php_add_devtree(php_slot); in pnv_php_set_slot_power_state()
370 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_power_state() local
379 ret = pnv_pci_get_power_state(php_slot->id, &power_state); in pnv_php_get_power_state()
381 pci_warn(php_slot->pdev, "Error %d getting power status\n", in pnv_php_get_power_state()
392 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_adapter_state() local
400 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_get_adapter_state()
405 pci_warn(php_slot->pdev, "Error %d getting presence\n", ret); in pnv_php_get_adapter_state()
413 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_get_attention_state() local
415 *state = php_slot->attention_state; in pnv_php_get_attention_state()
421 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_set_attention_state() local
422 struct pci_dev *bridge = php_slot->pdev; in pnv_php_set_attention_state()
425 php_slot->attention_state = state; in pnv_php_set_attention_state()
441 static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan) in pnv_php_enable() argument
443 struct hotplug_slot *slot = &php_slot->slot; in pnv_php_enable()
449 if (php_slot->state != PNV_PHP_STATE_REGISTERED) in pnv_php_enable()
464 if (!php_slot->power_state_check) { in pnv_php_enable()
465 php_slot->power_state_check = true; in pnv_php_enable()
483 if (!php_slot->power_state_check) { in pnv_php_enable()
484 php_slot->power_state_check = true; in pnv_php_enable()
511 pci_hp_add_devices(php_slot->bus); in pnv_php_enable()
516 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
518 pnv_php_register(php_slot->dn); in pnv_php_enable()
520 php_slot->state = PNV_PHP_STATE_POPULATED; in pnv_php_enable()
528 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_reset_slot() local
529 struct pci_dev *bridge = php_slot->pdev; in pnv_php_reset_slot()
541 if (php_slot->irq > 0) in pnv_php_reset_slot()
542 disable_irq(php_slot->irq); in pnv_php_reset_slot()
547 pcie_capability_read_word(php_slot->pdev, PCI_EXP_SLTSTA, &sts); in pnv_php_reset_slot()
549 pcie_capability_write_word(php_slot->pdev, PCI_EXP_SLTSTA, sts); in pnv_php_reset_slot()
551 if (php_slot->irq > 0) in pnv_php_reset_slot()
552 enable_irq(php_slot->irq); in pnv_php_reset_slot()
559 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_enable_slot() local
561 return pnv_php_enable(php_slot, true); in pnv_php_enable_slot()
566 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); in pnv_php_disable_slot() local
569 if (php_slot->state != PNV_PHP_STATE_POPULATED) in pnv_php_disable_slot()
574 pci_hp_remove_devices(php_slot->bus); in pnv_php_disable_slot()
578 pnv_php_unregister(php_slot->dn); in pnv_php_disable_slot()
583 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_disable_slot()
597 static void pnv_php_release(struct pnv_php_slot *php_slot) in pnv_php_release() argument
603 list_del(&php_slot->link); in pnv_php_release()
607 pnv_php_put_slot(php_slot); in pnv_php_release()
608 pnv_php_put_slot(php_slot->parent); in pnv_php_release()
613 struct pnv_php_slot *php_slot; in pnv_php_alloc_slot() local
630 php_slot = kzalloc(sizeof(*php_slot), GFP_KERNEL); in pnv_php_alloc_slot()
631 if (!php_slot) in pnv_php_alloc_slot()
634 php_slot->name = kstrdup(label, GFP_KERNEL); in pnv_php_alloc_slot()
635 if (!php_slot->name) { in pnv_php_alloc_slot()
636 kfree(php_slot); in pnv_php_alloc_slot()
641 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn); in pnv_php_alloc_slot()
643 php_slot->slot_no = -1; /* Placeholder slot */ in pnv_php_alloc_slot()
645 kref_init(&php_slot->kref); in pnv_php_alloc_slot()
646 php_slot->state = PNV_PHP_STATE_INITIALIZED; in pnv_php_alloc_slot()
647 php_slot->dn = dn; in pnv_php_alloc_slot()
648 php_slot->pdev = bus->self; in pnv_php_alloc_slot()
649 php_slot->bus = bus; in pnv_php_alloc_slot()
650 php_slot->id = id; in pnv_php_alloc_slot()
651 php_slot->power_state_check = false; in pnv_php_alloc_slot()
652 php_slot->slot.ops = &php_slot_ops; in pnv_php_alloc_slot()
654 INIT_LIST_HEAD(&php_slot->children); in pnv_php_alloc_slot()
655 INIT_LIST_HEAD(&php_slot->link); in pnv_php_alloc_slot()
657 return php_slot; in pnv_php_alloc_slot()
660 static int pnv_php_register_slot(struct pnv_php_slot *php_slot) in pnv_php_register_slot() argument
663 struct device_node *dn = php_slot->dn; in pnv_php_register_slot()
668 parent = pnv_php_find_slot(php_slot->dn); in pnv_php_register_slot()
675 ret = pci_hp_register(&php_slot->slot, php_slot->bus, in pnv_php_register_slot()
676 php_slot->slot_no, php_slot->name); in pnv_php_register_slot()
678 pci_warn(php_slot->pdev, "Error %d registering slot\n", ret); in pnv_php_register_slot()
699 php_slot->parent = parent; in pnv_php_register_slot()
701 list_add_tail(&php_slot->link, &parent->children); in pnv_php_register_slot()
703 list_add_tail(&php_slot->link, &pnv_php_slot_list); in pnv_php_register_slot()
706 php_slot->state = PNV_PHP_STATE_REGISTERED; in pnv_php_register_slot()
710 static int pnv_php_enable_msix(struct pnv_php_slot *php_slot) in pnv_php_enable_msix() argument
712 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_msix()
742 struct pnv_php_slot *php_slot = event->php_slot; in pnv_php_event_handler() local
745 pnv_php_enable_slot(&php_slot->slot); in pnv_php_event_handler()
747 pnv_php_disable_slot(&php_slot->slot); in pnv_php_event_handler()
754 struct pnv_php_slot *php_slot = data; in pnv_php_interrupt() local
755 struct pci_dev *pchild, *pdev = php_slot->pdev; in pnv_php_interrupt()
770 php_slot->name, in pnv_php_interrupt()
777 } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) && in pnv_php_interrupt()
779 ret = pnv_pci_get_presence_state(php_slot->id, &presence); in pnv_php_interrupt()
782 php_slot->name, ret, sts); in pnv_php_interrupt()
788 pci_dbg(pdev, "PCI slot [%s]: Spurious IRQ?\n", php_slot->name); in pnv_php_interrupt()
794 pchild = list_first_entry_or_null(&php_slot->bus->devices, in pnv_php_interrupt()
813 php_slot->name, sts); in pnv_php_interrupt()
818 php_slot->name, added ? "added" : "removed", irq); in pnv_php_interrupt()
821 event->php_slot = php_slot; in pnv_php_interrupt()
822 queue_work(php_slot->wq, &event->work); in pnv_php_interrupt()
827 static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) in pnv_php_init_irq() argument
829 struct pci_dev *pdev = php_slot->pdev; in pnv_php_init_irq()
835 php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name); in pnv_php_init_irq()
836 if (!php_slot->wq) { in pnv_php_init_irq()
838 pnv_php_disable_irq(php_slot, true); in pnv_php_init_irq()
843 ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc", in pnv_php_init_irq()
846 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC; in pnv_php_init_irq()
850 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) in pnv_php_init_irq()
858 php_slot->name, php_slot); in pnv_php_init_irq()
860 pnv_php_disable_irq(php_slot, true); in pnv_php_init_irq()
867 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) { in pnv_php_init_irq()
879 php_slot->irq = irq; in pnv_php_init_irq()
882 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot) in pnv_php_enable_irq() argument
884 struct pci_dev *pdev = php_slot->pdev; in pnv_php_enable_irq()
904 irq = pnv_php_enable_msix(php_slot); in pnv_php_enable_irq()
906 pnv_php_init_irq(php_slot, irq); in pnv_php_enable_irq()
917 pnv_php_init_irq(php_slot, irq); in pnv_php_enable_irq()
923 struct pnv_php_slot *php_slot; in pnv_php_register_one() local
936 php_slot = pnv_php_alloc_slot(dn); in pnv_php_register_one()
937 if (!php_slot) in pnv_php_register_one()
940 ret = pnv_php_register_slot(php_slot); in pnv_php_register_one()
944 ret = pnv_php_enable(php_slot, false); in pnv_php_register_one()
951 pnv_php_enable_irq(php_slot); in pnv_php_register_one()
956 pnv_php_unregister_one(php_slot->dn); in pnv_php_register_one()
958 pnv_php_put_slot(php_slot); in pnv_php_register_one()
978 struct pnv_php_slot *php_slot; in pnv_php_unregister_one() local
980 php_slot = pnv_php_find_slot(dn); in pnv_php_unregister_one()
981 if (!php_slot) in pnv_php_unregister_one()
984 php_slot->state = PNV_PHP_STATE_OFFLINE; in pnv_php_unregister_one()
985 pci_hp_deregister(&php_slot->slot); in pnv_php_unregister_one()
986 pnv_php_release(php_slot); in pnv_php_unregister_one()
987 pnv_php_put_slot(php_slot); in pnv_php_unregister_one()