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