GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / pci / hotplug / pnv_php.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * PCI Hotplug Driver for PowerPC PowerNV platform.
4  *
5  * Copyright Gavin Shan, IBM Corporation 2016.
6  */
7
8 #include <linux/bitfield.h>
9 #include <linux/libfdt.h>
10 #include <linux/module.h>
11 #include <linux/pci.h>
12 #include <linux/pci_hotplug.h>
13 #include <linux/of_fdt.h>
14
15 #include <asm/opal.h>
16 #include <asm/pnv-pci.h>
17 #include <asm/ppc-pci.h>
18
19 #define DRIVER_VERSION  "0.1"
20 #define DRIVER_AUTHOR   "Gavin Shan, IBM Corporation"
21 #define DRIVER_DESC     "PowerPC PowerNV PCI Hotplug Driver"
22
23 #define SLOT_WARN(sl, x...) \
24         ((sl)->pdev ? pci_warn((sl)->pdev, x) : dev_warn(&(sl)->bus->dev, x))
25
26 struct pnv_php_event {
27         bool                    added;
28         struct pnv_php_slot     *php_slot;
29         struct work_struct      work;
30 };
31
32 static LIST_HEAD(pnv_php_slot_list);
33 static DEFINE_SPINLOCK(pnv_php_lock);
34
35 static void pnv_php_register(struct device_node *dn);
36 static void pnv_php_unregister_one(struct device_node *dn);
37 static void pnv_php_unregister(struct device_node *dn);
38
39 static void pnv_php_disable_irq(struct pnv_php_slot *php_slot,
40                                 bool disable_device)
41 {
42         struct pci_dev *pdev = php_slot->pdev;
43         int irq = php_slot->irq;
44         u16 ctrl;
45
46         if (php_slot->irq > 0) {
47                 pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &ctrl);
48                 ctrl &= ~(PCI_EXP_SLTCTL_HPIE |
49                           PCI_EXP_SLTCTL_PDCE |
50                           PCI_EXP_SLTCTL_DLLSCE);
51                 pcie_capability_write_word(pdev, PCI_EXP_SLTCTL, ctrl);
52
53                 free_irq(php_slot->irq, php_slot);
54                 php_slot->irq = 0;
55         }
56
57         if (php_slot->wq) {
58                 destroy_workqueue(php_slot->wq);
59                 php_slot->wq = NULL;
60         }
61
62         if (disable_device || irq > 0) {
63                 if (pdev->msix_enabled)
64                         pci_disable_msix(pdev);
65                 else if (pdev->msi_enabled)
66                         pci_disable_msi(pdev);
67
68                 pci_disable_device(pdev);
69         }
70 }
71
72 static void pnv_php_free_slot(struct kref *kref)
73 {
74         struct pnv_php_slot *php_slot = container_of(kref,
75                                         struct pnv_php_slot, kref);
76
77         WARN_ON(!list_empty(&php_slot->children));
78         pnv_php_disable_irq(php_slot, false);
79         kfree(php_slot->name);
80         kfree(php_slot);
81 }
82
83 static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot)
84 {
85
86         if (!php_slot)
87                 return;
88
89         kref_put(&php_slot->kref, pnv_php_free_slot);
90 }
91
92 static struct pnv_php_slot *pnv_php_match(struct device_node *dn,
93                                           struct pnv_php_slot *php_slot)
94 {
95         struct pnv_php_slot *target, *tmp;
96
97         if (php_slot->dn == dn) {
98                 kref_get(&php_slot->kref);
99                 return php_slot;
100         }
101
102         list_for_each_entry(tmp, &php_slot->children, link) {
103                 target = pnv_php_match(dn, tmp);
104                 if (target)
105                         return target;
106         }
107
108         return NULL;
109 }
110
111 struct pnv_php_slot *pnv_php_find_slot(struct device_node *dn)
112 {
113         struct pnv_php_slot *php_slot, *tmp;
114         unsigned long flags;
115
116         spin_lock_irqsave(&pnv_php_lock, flags);
117         list_for_each_entry(tmp, &pnv_php_slot_list, link) {
118                 php_slot = pnv_php_match(dn, tmp);
119                 if (php_slot) {
120                         spin_unlock_irqrestore(&pnv_php_lock, flags);
121                         return php_slot;
122                 }
123         }
124         spin_unlock_irqrestore(&pnv_php_lock, flags);
125
126         return NULL;
127 }
128 EXPORT_SYMBOL_GPL(pnv_php_find_slot);
129
130 /*
131  * Remove pdn for all children of the indicated device node.
132  * The function should remove pdn in a depth-first manner.
133  */
134 static void pnv_php_rmv_pdns(struct device_node *dn)
135 {
136         struct device_node *child;
137
138         for_each_child_of_node(dn, child) {
139                 pnv_php_rmv_pdns(child);
140
141                 pci_remove_device_node_info(child);
142         }
143 }
144
145 /*
146  * Detach all child nodes of the indicated device nodes. The
147  * function should handle device nodes in depth-first manner.
148  *
149  * We should not invoke of_node_release() as the memory for
150  * individual device node is part of large memory block. The
151  * large block is allocated from memblock (system bootup) or
152  * kmalloc() when unflattening the device tree by OF changeset.
153  * We can not free the large block allocated from memblock. For
154  * later case, it should be released at once.
155  */
156 static void pnv_php_detach_device_nodes(struct device_node *parent)
157 {
158         struct device_node *dn;
159
160         for_each_child_of_node(parent, dn) {
161                 pnv_php_detach_device_nodes(dn);
162
163                 of_node_put(dn);
164                 of_detach_node(dn);
165         }
166 }
167
168 static void pnv_php_rmv_devtree(struct pnv_php_slot *php_slot)
169 {
170         pnv_php_rmv_pdns(php_slot->dn);
171
172         /*
173          * Decrease the refcount if the device nodes were created
174          * through OF changeset before detaching them.
175          */
176         if (php_slot->fdt)
177                 of_changeset_destroy(&php_slot->ocs);
178         pnv_php_detach_device_nodes(php_slot->dn);
179
180         if (php_slot->fdt) {
181                 kfree(php_slot->dt);
182                 kfree(php_slot->fdt);
183                 php_slot->dt        = NULL;
184                 php_slot->dn->child = NULL;
185                 php_slot->fdt       = NULL;
186         }
187 }
188
189 /*
190  * As the nodes in OF changeset are applied in reverse order, we
191  * need revert the nodes in advance so that we have correct node
192  * order after the changeset is applied.
193  */
194 static void pnv_php_reverse_nodes(struct device_node *parent)
195 {
196         struct device_node *child, *next;
197
198         /* In-depth first */
199         for_each_child_of_node(parent, child)
200                 pnv_php_reverse_nodes(child);
201
202         /* Reverse the nodes in the child list */
203         child = parent->child;
204         parent->child = NULL;
205         while (child) {
206                 next = child->sibling;
207
208                 child->sibling = parent->child;
209                 parent->child = child;
210                 child = next;
211         }
212 }
213
214 static int pnv_php_populate_changeset(struct of_changeset *ocs,
215                                       struct device_node *dn)
216 {
217         struct device_node *child;
218         int ret = 0;
219
220         for_each_child_of_node(dn, child) {
221                 ret = of_changeset_attach_node(ocs, child);
222                 if (ret) {
223                         of_node_put(child);
224                         break;
225                 }
226
227                 ret = pnv_php_populate_changeset(ocs, child);
228                 if (ret) {
229                         of_node_put(child);
230                         break;
231                 }
232         }
233
234         return ret;
235 }
236
237 static void *pnv_php_add_one_pdn(struct device_node *dn, void *data)
238 {
239         struct pci_controller *hose = (struct pci_controller *)data;
240         struct pci_dn *pdn;
241
242         pdn = pci_add_device_node_info(hose, dn);
243         if (!pdn)
244                 return ERR_PTR(-ENOMEM);
245
246         return NULL;
247 }
248
249 static void pnv_php_add_pdns(struct pnv_php_slot *slot)
250 {
251         struct pci_controller *hose = pci_bus_to_host(slot->bus);
252
253         pci_traverse_device_nodes(slot->dn, pnv_php_add_one_pdn, hose);
254 }
255
256 static int pnv_php_add_devtree(struct pnv_php_slot *php_slot)
257 {
258         void *fdt, *fdt1, *dt;
259         int ret;
260
261         /* We don't know the FDT blob size. We try to get it through
262          * maximal memory chunk and then copy it to another chunk that
263          * fits the real size.
264          */
265         fdt1 = kzalloc(0x10000, GFP_KERNEL);
266         if (!fdt1) {
267                 ret = -ENOMEM;
268                 goto out;
269         }
270
271         ret = pnv_pci_get_device_tree(php_slot->dn->phandle, fdt1, 0x10000);
272         if (ret) {
273                 SLOT_WARN(php_slot, "Error %d getting FDT blob\n", ret);
274                 goto free_fdt1;
275         }
276
277         fdt = kmemdup(fdt1, fdt_totalsize(fdt1), GFP_KERNEL);
278         if (!fdt) {
279                 ret = -ENOMEM;
280                 goto free_fdt1;
281         }
282
283         /* Unflatten device tree blob */
284         dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL);
285         if (!dt) {
286                 ret = -EINVAL;
287                 SLOT_WARN(php_slot, "Cannot unflatten FDT\n");
288                 goto free_fdt;
289         }
290
291         /* Initialize and apply the changeset */
292         of_changeset_init(&php_slot->ocs);
293         pnv_php_reverse_nodes(php_slot->dn);
294         ret = pnv_php_populate_changeset(&php_slot->ocs, php_slot->dn);
295         if (ret) {
296                 pnv_php_reverse_nodes(php_slot->dn);
297                 SLOT_WARN(php_slot, "Error %d populating changeset\n",
298                           ret);
299                 goto free_dt;
300         }
301
302         php_slot->dn->child = NULL;
303         ret = of_changeset_apply(&php_slot->ocs);
304         if (ret) {
305                 SLOT_WARN(php_slot, "Error %d applying changeset\n", ret);
306                 goto destroy_changeset;
307         }
308
309         /* Add device node firmware data */
310         pnv_php_add_pdns(php_slot);
311         php_slot->fdt = fdt;
312         php_slot->dt  = dt;
313         kfree(fdt1);
314         goto out;
315
316 destroy_changeset:
317         of_changeset_destroy(&php_slot->ocs);
318 free_dt:
319         kfree(dt);
320         php_slot->dn->child = NULL;
321 free_fdt:
322         kfree(fdt);
323 free_fdt1:
324         kfree(fdt1);
325 out:
326         return ret;
327 }
328
329 static inline struct pnv_php_slot *to_pnv_php_slot(struct hotplug_slot *slot)
330 {
331         return container_of(slot, struct pnv_php_slot, slot);
332 }
333
334 int pnv_php_set_slot_power_state(struct hotplug_slot *slot,
335                                  uint8_t state)
336 {
337         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
338         struct opal_msg msg;
339         int ret;
340
341         ret = pnv_pci_set_power_state(php_slot->id, state, &msg);
342         if (ret > 0) {
343                 if (be64_to_cpu(msg.params[1]) != php_slot->dn->phandle ||
344                     be64_to_cpu(msg.params[2]) != state) {
345                         SLOT_WARN(php_slot, "Wrong msg (%lld, %lld, %lld)\n",
346                                   be64_to_cpu(msg.params[1]),
347                                   be64_to_cpu(msg.params[2]),
348                                   be64_to_cpu(msg.params[3]));
349                         return -ENOMSG;
350                 }
351                 if (be64_to_cpu(msg.params[3]) != OPAL_SUCCESS) {
352                         ret = -ENODEV;
353                         goto error;
354                 }
355         } else if (ret < 0) {
356                 goto error;
357         }
358
359         if (state == OPAL_PCI_SLOT_POWER_OFF || state == OPAL_PCI_SLOT_OFFLINE)
360                 pnv_php_rmv_devtree(php_slot);
361         else
362                 ret = pnv_php_add_devtree(php_slot);
363
364         return ret;
365
366 error:
367         SLOT_WARN(php_slot, "Error %d powering %s\n",
368                   ret, (state == OPAL_PCI_SLOT_POWER_ON) ? "on" : "off");
369         return ret;
370 }
371 EXPORT_SYMBOL_GPL(pnv_php_set_slot_power_state);
372
373 static int pnv_php_get_power_state(struct hotplug_slot *slot, u8 *state)
374 {
375         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
376         uint8_t power_state = OPAL_PCI_SLOT_POWER_ON;
377         int ret;
378
379         /*
380          * Retrieve power status from firmware. If we fail
381          * getting that, the power status fails back to
382          * be on.
383          */
384         ret = pnv_pci_get_power_state(php_slot->id, &power_state);
385         if (ret) {
386                 SLOT_WARN(php_slot, "Error %d getting power status\n",
387                           ret);
388         } else {
389                 *state = power_state;
390         }
391
392         return 0;
393 }
394
395 static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)
396 {
397         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
398         uint8_t presence = OPAL_PCI_SLOT_EMPTY;
399         int ret;
400
401         /*
402          * Retrieve presence status from firmware. If we can't
403          * get that, it will fail back to be empty.
404          */
405         ret = pnv_pci_get_presence_state(php_slot->id, &presence);
406         if (ret >= 0) {
407                 *state = presence;
408                 ret = 0;
409         } else {
410                 SLOT_WARN(php_slot, "Error %d getting presence\n", ret);
411         }
412
413         return ret;
414 }
415
416 static int pnv_php_get_attention_state(struct hotplug_slot *slot, u8 *state)
417 {
418         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
419
420         *state = php_slot->attention_state;
421         return 0;
422 }
423
424 static int pnv_php_set_attention_state(struct hotplug_slot *slot, u8 state)
425 {
426         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
427         struct pci_dev *bridge = php_slot->pdev;
428         u16 new, mask;
429
430         php_slot->attention_state = state;
431         if (!bridge)
432                 return 0;
433
434         mask = PCI_EXP_SLTCTL_AIC;
435
436         if (state)
437                 new = PCI_EXP_SLTCTL_ATTN_IND_ON;
438         else
439                 new = PCI_EXP_SLTCTL_ATTN_IND_OFF;
440
441         pcie_capability_clear_and_set_word(bridge, PCI_EXP_SLTCTL, mask, new);
442
443         return 0;
444 }
445
446 static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan)
447 {
448         struct hotplug_slot *slot = &php_slot->slot;
449         uint8_t presence = OPAL_PCI_SLOT_EMPTY;
450         uint8_t power_status = OPAL_PCI_SLOT_POWER_ON;
451         int ret;
452
453         /* Check if the slot has been configured */
454         if (php_slot->state != PNV_PHP_STATE_REGISTERED)
455                 return 0;
456
457         /* Retrieve slot presence status */
458         ret = pnv_php_get_adapter_state(slot, &presence);
459         if (ret)
460                 return ret;
461
462         /*
463          * Proceed if there have nothing behind the slot. However,
464          * we should leave the slot in registered state at the
465          * beginning. Otherwise, the PCI devices inserted afterwards
466          * won't be probed and populated.
467          */
468         if (presence == OPAL_PCI_SLOT_EMPTY) {
469                 if (!php_slot->power_state_check) {
470                         php_slot->power_state_check = true;
471
472                         return 0;
473                 }
474
475                 goto scan;
476         }
477
478         /*
479          * If the power supply to the slot is off, we can't detect
480          * adapter presence state. That means we have to turn the
481          * slot on before going to probe slot's presence state.
482          *
483          * On the first time, we don't change the power status to
484          * boost system boot with assumption that the firmware
485          * supplies consistent slot power status: empty slot always
486          * has its power off and non-empty slot has its power on.
487          */
488         if (!php_slot->power_state_check) {
489                 php_slot->power_state_check = true;
490
491                 ret = pnv_php_get_power_state(slot, &power_status);
492                 if (ret)
493                         return ret;
494
495                 if (power_status != OPAL_PCI_SLOT_POWER_ON)
496                         return 0;
497         }
498
499         /* Check the power status. Scan the slot if it is already on */
500         ret = pnv_php_get_power_state(slot, &power_status);
501         if (ret)
502                 return ret;
503
504         if (power_status == OPAL_PCI_SLOT_POWER_ON)
505                 goto scan;
506
507         /* Power is off, turn it on and then scan the slot */
508         ret = pnv_php_set_slot_power_state(slot, OPAL_PCI_SLOT_POWER_ON);
509         if (ret)
510                 return ret;
511
512 scan:
513         if (presence == OPAL_PCI_SLOT_PRESENT) {
514                 if (rescan) {
515                         pci_lock_rescan_remove();
516                         pci_hp_add_devices(php_slot->bus);
517                         pci_unlock_rescan_remove();
518                 }
519
520                 /* Rescan for child hotpluggable slots */
521                 php_slot->state = PNV_PHP_STATE_POPULATED;
522                 if (rescan)
523                         pnv_php_register(php_slot->dn);
524         } else {
525                 php_slot->state = PNV_PHP_STATE_POPULATED;
526         }
527
528         return 0;
529 }
530
531 static int pnv_php_reset_slot(struct hotplug_slot *slot, bool probe)
532 {
533         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
534         struct pci_dev *bridge = php_slot->pdev;
535         uint16_t sts;
536
537         /*
538          * The CAPI folks want pnv_php to drive OpenCAPI slots
539          * which don't have a bridge. Only claim to support
540          * reset_slot() if we have a bridge device (for now...)
541          */
542         if (probe)
543                 return !bridge;
544
545         /* mask our interrupt while resetting the bridge */
546         if (php_slot->irq > 0)
547                 disable_irq(php_slot->irq);
548
549         pci_bridge_secondary_bus_reset(bridge);
550
551         /* clear any state changes that happened due to the reset */
552         pcie_capability_read_word(php_slot->pdev, PCI_EXP_SLTSTA, &sts);
553         sts &= (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC);
554         pcie_capability_write_word(php_slot->pdev, PCI_EXP_SLTSTA, sts);
555
556         if (php_slot->irq > 0)
557                 enable_irq(php_slot->irq);
558
559         return 0;
560 }
561
562 static int pnv_php_enable_slot(struct hotplug_slot *slot)
563 {
564         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
565
566         return pnv_php_enable(php_slot, true);
567 }
568
569 static int pnv_php_disable_slot(struct hotplug_slot *slot)
570 {
571         struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
572         int ret;
573
574         /*
575          * Allow to disable a slot already in the registered state to
576          * cover cases where the slot couldn't be enabled and never
577          * reached the populated state
578          */
579         if (php_slot->state != PNV_PHP_STATE_POPULATED &&
580             php_slot->state != PNV_PHP_STATE_REGISTERED)
581                 return 0;
582
583         /* Remove all devices behind the slot */
584         pci_lock_rescan_remove();
585         pci_hp_remove_devices(php_slot->bus);
586         pci_unlock_rescan_remove();
587
588         /* Detach the child hotpluggable slots */
589         pnv_php_unregister(php_slot->dn);
590
591         /* Notify firmware and remove device nodes */
592         ret = pnv_php_set_slot_power_state(slot, OPAL_PCI_SLOT_POWER_OFF);
593
594         php_slot->state = PNV_PHP_STATE_REGISTERED;
595         return ret;
596 }
597
598 static const struct hotplug_slot_ops php_slot_ops = {
599         .get_power_status       = pnv_php_get_power_state,
600         .get_adapter_status     = pnv_php_get_adapter_state,
601         .get_attention_status   = pnv_php_get_attention_state,
602         .set_attention_status   = pnv_php_set_attention_state,
603         .enable_slot            = pnv_php_enable_slot,
604         .disable_slot           = pnv_php_disable_slot,
605         .reset_slot             = pnv_php_reset_slot,
606 };
607
608 static void pnv_php_release(struct pnv_php_slot *php_slot)
609 {
610         unsigned long flags;
611
612         /* Remove from global or child list */
613         spin_lock_irqsave(&pnv_php_lock, flags);
614         list_del(&php_slot->link);
615         spin_unlock_irqrestore(&pnv_php_lock, flags);
616
617         /* Detach from parent */
618         pnv_php_put_slot(php_slot);
619         pnv_php_put_slot(php_slot->parent);
620 }
621
622 static struct pnv_php_slot *pnv_php_alloc_slot(struct device_node *dn)
623 {
624         struct pnv_php_slot *php_slot;
625         struct pci_bus *bus;
626         const char *label;
627         uint64_t id;
628         int ret;
629
630         ret = of_property_read_string(dn, "ibm,slot-label", &label);
631         if (ret)
632                 return NULL;
633
634         if (pnv_pci_get_slot_id(dn, &id))
635                 return NULL;
636
637         bus = pci_find_bus_by_node(dn);
638         if (!bus)
639                 return NULL;
640
641         php_slot = kzalloc(sizeof(*php_slot), GFP_KERNEL);
642         if (!php_slot)
643                 return NULL;
644
645         php_slot->name = kstrdup(label, GFP_KERNEL);
646         if (!php_slot->name) {
647                 kfree(php_slot);
648                 return NULL;
649         }
650
651         if (dn->child && PCI_DN(dn->child))
652                 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn);
653         else
654                 php_slot->slot_no = -1;   /* Placeholder slot */
655
656         kref_init(&php_slot->kref);
657         php_slot->state                 = PNV_PHP_STATE_INITIALIZED;
658         php_slot->dn                    = dn;
659         php_slot->pdev                  = bus->self;
660         php_slot->bus                   = bus;
661         php_slot->id                    = id;
662         php_slot->power_state_check     = false;
663         php_slot->slot.ops              = &php_slot_ops;
664
665         INIT_LIST_HEAD(&php_slot->children);
666         INIT_LIST_HEAD(&php_slot->link);
667
668         return php_slot;
669 }
670
671 static int pnv_php_register_slot(struct pnv_php_slot *php_slot)
672 {
673         struct pnv_php_slot *parent;
674         struct device_node *dn = php_slot->dn;
675         unsigned long flags;
676         int ret;
677
678         /* Check if the slot is registered or not */
679         parent = pnv_php_find_slot(php_slot->dn);
680         if (parent) {
681                 pnv_php_put_slot(parent);
682                 return -EEXIST;
683         }
684
685         /* Register PCI slot */
686         ret = pci_hp_register(&php_slot->slot, php_slot->bus,
687                               php_slot->slot_no, php_slot->name);
688         if (ret) {
689                 SLOT_WARN(php_slot, "Error %d registering slot\n", ret);
690                 return ret;
691         }
692
693         /* Attach to the parent's child list or global list */
694         while ((dn = of_get_parent(dn))) {
695                 if (!PCI_DN(dn)) {
696                         of_node_put(dn);
697                         break;
698                 }
699
700                 parent = pnv_php_find_slot(dn);
701                 if (parent) {
702                         of_node_put(dn);
703                         break;
704                 }
705
706                 of_node_put(dn);
707         }
708
709         spin_lock_irqsave(&pnv_php_lock, flags);
710         php_slot->parent = parent;
711         if (parent)
712                 list_add_tail(&php_slot->link, &parent->children);
713         else
714                 list_add_tail(&php_slot->link, &pnv_php_slot_list);
715         spin_unlock_irqrestore(&pnv_php_lock, flags);
716
717         php_slot->state = PNV_PHP_STATE_REGISTERED;
718         return 0;
719 }
720
721 static int pnv_php_enable_msix(struct pnv_php_slot *php_slot)
722 {
723         struct pci_dev *pdev = php_slot->pdev;
724         struct msix_entry entry;
725         int nr_entries, ret;
726         u16 pcie_flag;
727
728         /* Get total number of MSIx entries */
729         nr_entries = pci_msix_vec_count(pdev);
730         if (nr_entries < 0)
731                 return nr_entries;
732
733         /* Check hotplug MSIx entry is in range */
734         pcie_capability_read_word(pdev, PCI_EXP_FLAGS, &pcie_flag);
735         entry.entry = FIELD_GET(PCI_EXP_FLAGS_IRQ, pcie_flag);
736         if (entry.entry >= nr_entries)
737                 return -ERANGE;
738
739         /* Enable MSIx */
740         ret = pci_enable_msix_exact(pdev, &entry, 1);
741         if (ret) {
742                 SLOT_WARN(php_slot, "Error %d enabling MSIx\n", ret);
743                 return ret;
744         }
745
746         return entry.vector;
747 }
748
749 static void pnv_php_event_handler(struct work_struct *work)
750 {
751         struct pnv_php_event *event =
752                 container_of(work, struct pnv_php_event, work);
753         struct pnv_php_slot *php_slot = event->php_slot;
754
755         if (event->added)
756                 pnv_php_enable_slot(&php_slot->slot);
757         else
758                 pnv_php_disable_slot(&php_slot->slot);
759
760         kfree(event);
761 }
762
763 static irqreturn_t pnv_php_interrupt(int irq, void *data)
764 {
765         struct pnv_php_slot *php_slot = data;
766         struct pci_dev *pchild, *pdev = php_slot->pdev;
767         struct eeh_dev *edev;
768         struct eeh_pe *pe;
769         struct pnv_php_event *event;
770         u16 sts, lsts;
771         u8 presence;
772         bool added;
773         unsigned long flags;
774         int ret;
775
776         pcie_capability_read_word(pdev, PCI_EXP_SLTSTA, &sts);
777         sts &= (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC);
778         pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, sts);
779
780         pci_dbg(pdev, "PCI slot [%s]: HP int! DLAct: %d, PresDet: %d\n",
781                         php_slot->name,
782                         !!(sts & PCI_EXP_SLTSTA_DLLSC),
783                         !!(sts & PCI_EXP_SLTSTA_PDC));
784
785         if (sts & PCI_EXP_SLTSTA_DLLSC) {
786                 pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lsts);
787                 added = !!(lsts & PCI_EXP_LNKSTA_DLLLA);
788         } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) &&
789                    (sts & PCI_EXP_SLTSTA_PDC)) {
790                 ret = pnv_pci_get_presence_state(php_slot->id, &presence);
791                 if (ret) {
792                         SLOT_WARN(php_slot,
793                                   "PCI slot [%s] error %d getting presence (0x%04x), to retry the operation.\n",
794                                   php_slot->name, ret, sts);
795                         return IRQ_HANDLED;
796                 }
797
798                 added = !!(presence == OPAL_PCI_SLOT_PRESENT);
799         } else {
800                 pci_dbg(pdev, "PCI slot [%s]: Spurious IRQ?\n", php_slot->name);
801                 return IRQ_NONE;
802         }
803
804         /* Freeze the removed PE to avoid unexpected error reporting */
805         if (!added) {
806                 pchild = list_first_entry_or_null(&php_slot->bus->devices,
807                                                   struct pci_dev, bus_list);
808                 edev = pchild ? pci_dev_to_eeh_dev(pchild) : NULL;
809                 pe = edev ? edev->pe : NULL;
810                 if (pe) {
811                         eeh_serialize_lock(&flags);
812                         eeh_pe_mark_isolated(pe);
813                         eeh_serialize_unlock(flags);
814                         eeh_pe_set_option(pe, EEH_OPT_FREEZE_PE);
815                 }
816         }
817
818         /*
819          * The PE is left in frozen state if the event is missed. It's
820          * fine as the PCI devices (PE) aren't functional any more.
821          */
822         event = kzalloc(sizeof(*event), GFP_ATOMIC);
823         if (!event) {
824                 SLOT_WARN(php_slot,
825                           "PCI slot [%s] missed hotplug event 0x%04x\n",
826                           php_slot->name, sts);
827                 return IRQ_HANDLED;
828         }
829
830         pci_info(pdev, "PCI slot [%s] %s (IRQ: %d)\n",
831                  php_slot->name, added ? "added" : "removed", irq);
832         INIT_WORK(&event->work, pnv_php_event_handler);
833         event->added = added;
834         event->php_slot = php_slot;
835         queue_work(php_slot->wq, &event->work);
836
837         return IRQ_HANDLED;
838 }
839
840 static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq)
841 {
842         struct pci_dev *pdev = php_slot->pdev;
843         u32 broken_pdc = 0;
844         u16 sts, ctrl;
845         int ret;
846
847         /* Allocate workqueue */
848         php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name);
849         if (!php_slot->wq) {
850                 SLOT_WARN(php_slot, "Cannot alloc workqueue\n");
851                 pnv_php_disable_irq(php_slot, true);
852                 return;
853         }
854
855         /* Check PDC (Presence Detection Change) is broken or not */
856         ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc",
857                                    &broken_pdc);
858         if (!ret && broken_pdc)
859                 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC;
860
861         /* Clear pending interrupts */
862         pcie_capability_read_word(pdev, PCI_EXP_SLTSTA, &sts);
863         if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC)
864                 sts |= PCI_EXP_SLTSTA_DLLSC;
865         else
866                 sts |= (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC);
867         pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, sts);
868
869         /* Request the interrupt */
870         ret = request_irq(irq, pnv_php_interrupt, IRQF_SHARED,
871                           php_slot->name, php_slot);
872         if (ret) {
873                 pnv_php_disable_irq(php_slot, true);
874                 SLOT_WARN(php_slot, "Error %d enabling IRQ %d\n", ret, irq);
875                 return;
876         }
877
878         /* Enable the interrupts */
879         pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &ctrl);
880         if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) {
881                 ctrl &= ~PCI_EXP_SLTCTL_PDCE;
882                 ctrl |= (PCI_EXP_SLTCTL_HPIE |
883                          PCI_EXP_SLTCTL_DLLSCE);
884         } else {
885                 ctrl |= (PCI_EXP_SLTCTL_HPIE |
886                          PCI_EXP_SLTCTL_PDCE |
887                          PCI_EXP_SLTCTL_DLLSCE);
888         }
889         pcie_capability_write_word(pdev, PCI_EXP_SLTCTL, ctrl);
890
891         /* The interrupt is initialized successfully when @irq is valid */
892         php_slot->irq = irq;
893 }
894
895 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot)
896 {
897         struct pci_dev *pdev = php_slot->pdev;
898         int irq, ret;
899
900         /*
901          * The MSI/MSIx interrupt might have been occupied by other
902          * drivers. Don't populate the surprise hotplug capability
903          * in that case.
904          */
905         if (pci_dev_msi_enabled(pdev))
906                 return;
907
908         ret = pci_enable_device(pdev);
909         if (ret) {
910                 SLOT_WARN(php_slot, "Error %d enabling device\n", ret);
911                 return;
912         }
913
914         pci_set_master(pdev);
915
916         /* Enable MSIx interrupt */
917         irq = pnv_php_enable_msix(php_slot);
918         if (irq > 0) {
919                 pnv_php_init_irq(php_slot, irq);
920                 return;
921         }
922
923         /*
924          * Use MSI if MSIx doesn't work. Fail back to legacy INTx
925          * if MSI doesn't work either
926          */
927         ret = pci_enable_msi(pdev);
928         if (!ret || pdev->irq) {
929                 irq = pdev->irq;
930                 pnv_php_init_irq(php_slot, irq);
931         }
932 }
933
934 static int pnv_php_register_one(struct device_node *dn)
935 {
936         struct pnv_php_slot *php_slot;
937         u32 prop32;
938         int ret;
939
940         /* Check if it's hotpluggable slot */
941         ret = of_property_read_u32(dn, "ibm,slot-pluggable", &prop32);
942         if (ret || !prop32)
943                 return -ENXIO;
944
945         ret = of_property_read_u32(dn, "ibm,reset-by-firmware", &prop32);
946         if (ret || !prop32)
947                 return -ENXIO;
948
949         php_slot = pnv_php_alloc_slot(dn);
950         if (!php_slot)
951                 return -ENODEV;
952
953         ret = pnv_php_register_slot(php_slot);
954         if (ret)
955                 goto free_slot;
956
957         ret = pnv_php_enable(php_slot, false);
958         if (ret)
959                 goto unregister_slot;
960
961         /* Enable interrupt if the slot supports surprise hotplug */
962         ret = of_property_read_u32(dn, "ibm,slot-surprise-pluggable", &prop32);
963         if (!ret && prop32)
964                 pnv_php_enable_irq(php_slot);
965
966         return 0;
967
968 unregister_slot:
969         pnv_php_unregister_one(php_slot->dn);
970 free_slot:
971         pnv_php_put_slot(php_slot);
972         return ret;
973 }
974
975 static void pnv_php_register(struct device_node *dn)
976 {
977         struct device_node *child;
978
979         /*
980          * The parent slots should be registered before their
981          * child slots.
982          */
983         for_each_child_of_node(dn, child) {
984                 pnv_php_register_one(child);
985                 pnv_php_register(child);
986         }
987 }
988
989 static void pnv_php_unregister_one(struct device_node *dn)
990 {
991         struct pnv_php_slot *php_slot;
992
993         php_slot = pnv_php_find_slot(dn);
994         if (!php_slot)
995                 return;
996
997         php_slot->state = PNV_PHP_STATE_OFFLINE;
998         pci_hp_deregister(&php_slot->slot);
999         pnv_php_release(php_slot);
1000         pnv_php_put_slot(php_slot);
1001 }
1002
1003 static void pnv_php_unregister(struct device_node *dn)
1004 {
1005         struct device_node *child;
1006
1007         /* The child slots should go before their parent slots */
1008         for_each_child_of_node(dn, child) {
1009                 pnv_php_unregister(child);
1010                 pnv_php_unregister_one(child);
1011         }
1012 }
1013
1014 static int __init pnv_php_init(void)
1015 {
1016         struct device_node *dn;
1017
1018         pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
1019         for_each_compatible_node(dn, NULL, "ibm,ioda2-phb")
1020                 pnv_php_register(dn);
1021
1022         for_each_compatible_node(dn, NULL, "ibm,ioda3-phb")
1023                 pnv_php_register(dn);
1024
1025         for_each_compatible_node(dn, NULL, "ibm,ioda2-npu2-opencapi-phb")
1026                 pnv_php_register_one(dn); /* slot directly under the PHB */
1027         return 0;
1028 }
1029
1030 static void __exit pnv_php_exit(void)
1031 {
1032         struct device_node *dn;
1033
1034         for_each_compatible_node(dn, NULL, "ibm,ioda2-phb")
1035                 pnv_php_unregister(dn);
1036
1037         for_each_compatible_node(dn, NULL, "ibm,ioda3-phb")
1038                 pnv_php_unregister(dn);
1039
1040         for_each_compatible_node(dn, NULL, "ibm,ioda2-npu2-opencapi-phb")
1041                 pnv_php_unregister_one(dn); /* slot directly under the PHB */
1042 }
1043
1044 module_init(pnv_php_init);
1045 module_exit(pnv_php_exit);
1046
1047 MODULE_VERSION(DRIVER_VERSION);
1048 MODULE_LICENSE("GPL v2");
1049 MODULE_AUTHOR(DRIVER_AUTHOR);
1050 MODULE_DESCRIPTION(DRIVER_DESC);