]> Git Repo - linux.git/blob - drivers/pci/hotplug/acpiphp_glue.c
Merge tag 'cxl-for-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl
[linux.git] / drivers / pci / hotplug / acpiphp_glue.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * ACPI PCI HotPlug glue functions to ACPI CA subsystem
4  *
5  * Copyright (C) 2002,2003 Takayoshi Kochi ([email protected])
6  * Copyright (C) 2002 Hiroshi Aono ([email protected])
7  * Copyright (C) 2002,2003 NEC Corporation
8  * Copyright (C) 2003-2005 Matthew Wilcox ([email protected])
9  * Copyright (C) 2003-2005 Hewlett Packard
10  * Copyright (C) 2005 Rajesh Shah ([email protected])
11  * Copyright (C) 2005 Intel Corporation
12  *
13  * All rights reserved.
14  *
15  * Send feedback to <[email protected]>
16  *
17  */
18
19 /*
20  * Lifetime rules for pci_dev:
21  *  - The one in acpiphp_bridge has its refcount elevated by pci_get_slot()
22  *    when the bridge is scanned and it loses a refcount when the bridge
23  *    is removed.
24  *  - When a P2P bridge is present, we elevate the refcount on the subordinate
25  *    bus. It loses the refcount when the driver unloads.
26  */
27
28 #define pr_fmt(fmt) "acpiphp_glue: " fmt
29
30 #include <linux/module.h>
31
32 #include <linux/kernel.h>
33 #include <linux/pci.h>
34 #include <linux/pci_hotplug.h>
35 #include <linux/pci-acpi.h>
36 #include <linux/pm_runtime.h>
37 #include <linux/mutex.h>
38 #include <linux/slab.h>
39 #include <linux/acpi.h>
40
41 #include "../pci.h"
42 #include "acpiphp.h"
43
44 static LIST_HEAD(bridge_list);
45 static DEFINE_MUTEX(bridge_mutex);
46
47 static int acpiphp_hotplug_notify(struct acpi_device *adev, u32 type);
48 static void acpiphp_post_dock_fixup(struct acpi_device *adev);
49 static void acpiphp_sanitize_bus(struct pci_bus *bus);
50 static void hotplug_event(u32 type, struct acpiphp_context *context);
51 static void free_bridge(struct kref *kref);
52
53 /**
54  * acpiphp_init_context - Create hotplug context and grab a reference to it.
55  * @adev: ACPI device object to create the context for.
56  *
57  * Call under acpi_hp_context_lock.
58  */
59 static struct acpiphp_context *acpiphp_init_context(struct acpi_device *adev)
60 {
61         struct acpiphp_context *context;
62
63         context = kzalloc(sizeof(*context), GFP_KERNEL);
64         if (!context)
65                 return NULL;
66
67         context->refcount = 1;
68         context->hp.notify = acpiphp_hotplug_notify;
69         context->hp.fixup = acpiphp_post_dock_fixup;
70         acpi_set_hp_context(adev, &context->hp);
71         return context;
72 }
73
74 /**
75  * acpiphp_get_context - Get hotplug context and grab a reference to it.
76  * @adev: ACPI device object to get the context for.
77  *
78  * Call under acpi_hp_context_lock.
79  */
80 static struct acpiphp_context *acpiphp_get_context(struct acpi_device *adev)
81 {
82         struct acpiphp_context *context;
83
84         if (!adev->hp)
85                 return NULL;
86
87         context = to_acpiphp_context(adev->hp);
88         context->refcount++;
89         return context;
90 }
91
92 /**
93  * acpiphp_put_context - Drop a reference to ACPI hotplug context.
94  * @context: ACPI hotplug context to drop a reference to.
95  *
96  * The context object is removed if there are no more references to it.
97  *
98  * Call under acpi_hp_context_lock.
99  */
100 static void acpiphp_put_context(struct acpiphp_context *context)
101 {
102         if (--context->refcount)
103                 return;
104
105         WARN_ON(context->bridge);
106         context->hp.self->hp = NULL;
107         kfree(context);
108 }
109
110 static inline void get_bridge(struct acpiphp_bridge *bridge)
111 {
112         kref_get(&bridge->ref);
113 }
114
115 static inline void put_bridge(struct acpiphp_bridge *bridge)
116 {
117         kref_put(&bridge->ref, free_bridge);
118 }
119
120 static struct acpiphp_context *acpiphp_grab_context(struct acpi_device *adev)
121 {
122         struct acpiphp_context *context;
123
124         acpi_lock_hp_context();
125
126         context = acpiphp_get_context(adev);
127         if (!context)
128                 goto unlock;
129
130         if (context->func.parent->is_going_away) {
131                 acpiphp_put_context(context);
132                 context = NULL;
133                 goto unlock;
134         }
135
136         get_bridge(context->func.parent);
137         acpiphp_put_context(context);
138
139 unlock:
140         acpi_unlock_hp_context();
141         return context;
142 }
143
144 static void acpiphp_let_context_go(struct acpiphp_context *context)
145 {
146         put_bridge(context->func.parent);
147 }
148
149 static void free_bridge(struct kref *kref)
150 {
151         struct acpiphp_context *context;
152         struct acpiphp_bridge *bridge;
153         struct acpiphp_slot *slot, *next;
154         struct acpiphp_func *func, *tmp;
155
156         acpi_lock_hp_context();
157
158         bridge = container_of(kref, struct acpiphp_bridge, ref);
159
160         list_for_each_entry_safe(slot, next, &bridge->slots, node) {
161                 list_for_each_entry_safe(func, tmp, &slot->funcs, sibling)
162                         acpiphp_put_context(func_to_context(func));
163
164                 kfree(slot);
165         }
166
167         context = bridge->context;
168         /* Root bridges will not have hotplug context. */
169         if (context) {
170                 /* Release the reference taken by acpiphp_enumerate_slots(). */
171                 put_bridge(context->func.parent);
172                 context->bridge = NULL;
173                 acpiphp_put_context(context);
174         }
175
176         put_device(&bridge->pci_bus->dev);
177         pci_dev_put(bridge->pci_dev);
178         kfree(bridge);
179
180         acpi_unlock_hp_context();
181 }
182
183 /**
184  * acpiphp_post_dock_fixup - Post-dock fixups for PCI devices.
185  * @adev: ACPI device object corresponding to a PCI device.
186  *
187  * TBD - figure out a way to only call fixups for systems that require them.
188  */
189 static void acpiphp_post_dock_fixup(struct acpi_device *adev)
190 {
191         struct acpiphp_context *context = acpiphp_grab_context(adev);
192         struct pci_bus *bus;
193         u32 buses;
194
195         if (!context)
196                 return;
197
198         bus = context->func.slot->bus;
199         if (!bus->self)
200                 goto out;
201
202         /* fixup bad _DCK function that rewrites
203          * secondary bridge on slot
204          */
205         pci_read_config_dword(bus->self, PCI_PRIMARY_BUS, &buses);
206
207         if (((buses >> 8) & 0xff) != bus->busn_res.start) {
208                 buses = (buses & 0xff000000)
209                         | ((unsigned int)(bus->primary)     <<  0)
210                         | ((unsigned int)(bus->busn_res.start)   <<  8)
211                         | ((unsigned int)(bus->busn_res.end) << 16);
212                 pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses);
213         }
214
215  out:
216         acpiphp_let_context_go(context);
217 }
218
219 /**
220  * acpiphp_add_context - Add ACPIPHP context to an ACPI device object.
221  * @handle: ACPI handle of the object to add a context to.
222  * @lvl: Not used.
223  * @data: The object's parent ACPIPHP bridge.
224  * @rv: Not used.
225  */
226 static acpi_status acpiphp_add_context(acpi_handle handle, u32 lvl, void *data,
227                                        void **rv)
228 {
229         struct acpi_device *adev = acpi_fetch_acpi_dev(handle);
230         struct acpiphp_bridge *bridge = data;
231         struct acpiphp_context *context;
232         struct acpiphp_slot *slot;
233         struct acpiphp_func *newfunc;
234         acpi_status status = AE_OK;
235         unsigned long long adr;
236         int device, function;
237         struct pci_bus *pbus = bridge->pci_bus;
238         struct pci_dev *pdev = bridge->pci_dev;
239         u32 val;
240
241         if (!adev)
242                 return AE_OK;
243
244         status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
245         if (ACPI_FAILURE(status)) {
246                 if (status != AE_NOT_FOUND)
247                         acpi_handle_warn(handle,
248                                 "can't evaluate _ADR (%#x)\n", status);
249                 return AE_OK;
250         }
251
252         device = (adr >> 16) & 0xffff;
253         function = adr & 0xffff;
254
255         acpi_lock_hp_context();
256         context = acpiphp_init_context(adev);
257         if (!context) {
258                 acpi_unlock_hp_context();
259                 acpi_handle_err(handle, "No hotplug context\n");
260                 return AE_NOT_EXIST;
261         }
262         newfunc = &context->func;
263         newfunc->function = function;
264         newfunc->parent = bridge;
265         acpi_unlock_hp_context();
266
267         /*
268          * If this is a dock device, its _EJ0 should be executed by the dock
269          * notify handler after calling _DCK.
270          */
271         if (!is_dock_device(adev) && acpi_has_method(handle, "_EJ0"))
272                 newfunc->flags = FUNC_HAS_EJ0;
273
274         if (acpi_has_method(handle, "_STA"))
275                 newfunc->flags |= FUNC_HAS_STA;
276
277         /* search for objects that share the same slot */
278         list_for_each_entry(slot, &bridge->slots, node)
279                 if (slot->device == device)
280                         goto slot_found;
281
282         slot = kzalloc(sizeof(struct acpiphp_slot), GFP_KERNEL);
283         if (!slot) {
284                 acpi_lock_hp_context();
285                 acpiphp_put_context(context);
286                 acpi_unlock_hp_context();
287                 return AE_NO_MEMORY;
288         }
289
290         slot->bus = bridge->pci_bus;
291         slot->device = device;
292         INIT_LIST_HEAD(&slot->funcs);
293
294         list_add_tail(&slot->node, &bridge->slots);
295
296         /*
297          * Expose slots to user space for functions that have _EJ0 or _RMV or
298          * are located in dock stations.  Do not expose them for devices handled
299          * by the native PCIe hotplug (PCIeHP) or standard PCI hotplug
300          * (SHPCHP), because that code is supposed to expose slots to user
301          * space in those cases.
302          */
303         if ((acpi_pci_check_ejectable(pbus, handle) || is_dock_device(adev))
304             && !(pdev && hotplug_is_native(pdev))) {
305                 unsigned long long sun;
306                 int retval;
307
308                 bridge->nr_slots++;
309                 status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun);
310                 if (ACPI_FAILURE(status))
311                         sun = bridge->nr_slots;
312
313                 pr_debug("found ACPI PCI Hotplug slot %llu at PCI %04x:%02x:%02x\n",
314                     sun, pci_domain_nr(pbus), pbus->number, device);
315
316                 retval = acpiphp_register_hotplug_slot(slot, sun);
317                 if (retval) {
318                         slot->slot = NULL;
319                         bridge->nr_slots--;
320                         if (retval == -EBUSY)
321                                 pr_warn("Slot %llu already registered by another hotplug driver\n", sun);
322                         else
323                                 pr_warn("acpiphp_register_hotplug_slot failed (err code = 0x%x)\n", retval);
324                 }
325                 /* Even if the slot registration fails, we can still use it. */
326         }
327
328  slot_found:
329         newfunc->slot = slot;
330         list_add_tail(&newfunc->sibling, &slot->funcs);
331
332         if (pci_bus_read_dev_vendor_id(pbus, PCI_DEVFN(device, function),
333                                        &val, 60*1000))
334                 slot->flags |= SLOT_ENABLED;
335
336         return AE_OK;
337 }
338
339 static void cleanup_bridge(struct acpiphp_bridge *bridge)
340 {
341         struct acpiphp_slot *slot;
342         struct acpiphp_func *func;
343
344         list_for_each_entry(slot, &bridge->slots, node) {
345                 list_for_each_entry(func, &slot->funcs, sibling) {
346                         struct acpi_device *adev = func_to_acpi_device(func);
347
348                         acpi_lock_hp_context();
349                         adev->hp->notify = NULL;
350                         adev->hp->fixup = NULL;
351                         acpi_unlock_hp_context();
352                 }
353                 slot->flags |= SLOT_IS_GOING_AWAY;
354                 if (slot->slot)
355                         acpiphp_unregister_hotplug_slot(slot);
356         }
357
358         mutex_lock(&bridge_mutex);
359         list_del(&bridge->list);
360         mutex_unlock(&bridge_mutex);
361
362         acpi_lock_hp_context();
363         bridge->is_going_away = true;
364         acpi_unlock_hp_context();
365 }
366
367 /**
368  * acpiphp_max_busnr - return the highest reserved bus number under the given bus.
369  * @bus: bus to start search with
370  */
371 static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
372 {
373         struct pci_bus *tmp;
374         unsigned char max, n;
375
376         /*
377          * pci_bus_max_busnr will return the highest
378          * reserved busnr for all these children.
379          * that is equivalent to the bus->subordinate
380          * value.  We don't want to use the parent's
381          * bus->subordinate value because it could have
382          * padding in it.
383          */
384         max = bus->busn_res.start;
385
386         list_for_each_entry(tmp, &bus->children, node) {
387                 n = pci_bus_max_busnr(tmp);
388                 if (n > max)
389                         max = n;
390         }
391         return max;
392 }
393
394 static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
395 {
396         struct acpiphp_func *func;
397
398         list_for_each_entry(func, &slot->funcs, sibling) {
399                 /* _REG is optional, we don't care about if there is failure */
400                 acpi_evaluate_reg(func_to_handle(func),
401                                   ACPI_ADR_SPACE_PCI_CONFIG,
402                                   ACPI_REG_CONNECT);
403         }
404 }
405
406 static void check_hotplug_bridge(struct acpiphp_slot *slot, struct pci_dev *dev)
407 {
408         struct acpiphp_func *func;
409
410         /* quirk, or pcie could set it already */
411         if (dev->is_hotplug_bridge)
412                 return;
413
414         list_for_each_entry(func, &slot->funcs, sibling) {
415                 if (PCI_FUNC(dev->devfn) == func->function) {
416                         dev->is_hotplug_bridge = 1;
417                         break;
418                 }
419         }
420 }
421
422 static int acpiphp_rescan_slot(struct acpiphp_slot *slot)
423 {
424         struct acpiphp_func *func;
425
426         list_for_each_entry(func, &slot->funcs, sibling) {
427                 struct acpi_device *adev = func_to_acpi_device(func);
428
429                 acpi_bus_scan(adev->handle);
430                 if (acpi_device_enumerated(adev))
431                         acpi_device_set_power(adev, ACPI_STATE_D0);
432         }
433         return pci_scan_slot(slot->bus, PCI_DEVFN(slot->device, 0));
434 }
435
436 static void acpiphp_native_scan_bridge(struct pci_dev *bridge)
437 {
438         struct pci_bus *bus = bridge->subordinate;
439         struct pci_dev *dev;
440         int max;
441
442         if (!bus)
443                 return;
444
445         max = bus->busn_res.start;
446         /* Scan already configured non-hotplug bridges */
447         for_each_pci_bridge(dev, bus) {
448                 if (!hotplug_is_native(dev))
449                         max = pci_scan_bridge(bus, dev, max, 0);
450         }
451
452         /* Scan non-hotplug bridges that need to be reconfigured */
453         for_each_pci_bridge(dev, bus) {
454                 if (hotplug_is_native(dev))
455                         continue;
456
457                 max = pci_scan_bridge(bus, dev, max, 1);
458                 if (dev->subordinate) {
459                         pcibios_resource_survey_bus(dev->subordinate);
460                         pci_bus_size_bridges(dev->subordinate);
461                         pci_bus_assign_resources(dev->subordinate);
462                 }
463         }
464 }
465
466 /**
467  * enable_slot - enable, configure a slot
468  * @slot: slot to be enabled
469  * @bridge: true if enable is for the whole bridge (not a single slot)
470  *
471  * This function should be called per *physical slot*,
472  * not per each slot object in ACPI namespace.
473  */
474 static void enable_slot(struct acpiphp_slot *slot, bool bridge)
475 {
476         struct pci_dev *dev;
477         struct pci_bus *bus = slot->bus;
478         struct acpiphp_func *func;
479
480         if (bridge && bus->self && hotplug_is_native(bus->self)) {
481                 /*
482                  * If native hotplug is used, it will take care of hotplug
483                  * slot management and resource allocation for hotplug
484                  * bridges. However, ACPI hotplug may still be used for
485                  * non-hotplug bridges to bring in additional devices such
486                  * as a Thunderbolt host controller.
487                  */
488                 for_each_pci_bridge(dev, bus) {
489                         if (PCI_SLOT(dev->devfn) == slot->device)
490                                 acpiphp_native_scan_bridge(dev);
491                 }
492         } else {
493                 LIST_HEAD(add_list);
494                 int max, pass;
495
496                 acpiphp_rescan_slot(slot);
497                 max = acpiphp_max_busnr(bus);
498                 for (pass = 0; pass < 2; pass++) {
499                         for_each_pci_bridge(dev, bus) {
500                                 if (PCI_SLOT(dev->devfn) != slot->device)
501                                         continue;
502
503                                 max = pci_scan_bridge(bus, dev, max, pass);
504                                 if (pass && dev->subordinate) {
505                                         check_hotplug_bridge(slot, dev);
506                                         pcibios_resource_survey_bus(dev->subordinate);
507                                         __pci_bus_size_bridges(dev->subordinate,
508                                                                &add_list);
509                                 }
510                         }
511                 }
512                 __pci_bus_assign_resources(bus, &add_list, NULL);
513         }
514
515         acpiphp_sanitize_bus(bus);
516         pcie_bus_configure_settings(bus);
517         acpiphp_set_acpi_region(slot);
518
519         list_for_each_entry(dev, &bus->devices, bus_list) {
520                 /* Assume that newly added devices are powered on already. */
521                 if (!pci_dev_is_added(dev))
522                         dev->current_state = PCI_D0;
523         }
524
525         pci_bus_add_devices(bus);
526
527         slot->flags |= SLOT_ENABLED;
528         list_for_each_entry(func, &slot->funcs, sibling) {
529                 dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
530                                                   func->function));
531                 if (!dev) {
532                         /* Do not set SLOT_ENABLED flag if some funcs
533                            are not added. */
534                         slot->flags &= ~SLOT_ENABLED;
535                         continue;
536                 }
537                 pci_dev_put(dev);
538         }
539 }
540
541 /**
542  * disable_slot - disable a slot
543  * @slot: ACPI PHP slot
544  */
545 static void disable_slot(struct acpiphp_slot *slot)
546 {
547         struct pci_bus *bus = slot->bus;
548         struct pci_dev *dev, *prev;
549         struct acpiphp_func *func;
550
551         /*
552          * enable_slot() enumerates all functions in this device via
553          * pci_scan_slot(), whether they have associated ACPI hotplug
554          * methods (_EJ0, etc.) or not.  Therefore, we remove all functions
555          * here.
556          */
557         list_for_each_entry_safe_reverse(dev, prev, &bus->devices, bus_list)
558                 if (PCI_SLOT(dev->devfn) == slot->device)
559                         pci_stop_and_remove_bus_device(dev);
560
561         list_for_each_entry(func, &slot->funcs, sibling)
562                 acpi_bus_trim(func_to_acpi_device(func));
563
564         slot->flags &= ~SLOT_ENABLED;
565 }
566
567 static bool slot_no_hotplug(struct acpiphp_slot *slot)
568 {
569         struct pci_bus *bus = slot->bus;
570         struct pci_dev *dev;
571
572         list_for_each_entry(dev, &bus->devices, bus_list) {
573                 if (PCI_SLOT(dev->devfn) == slot->device && dev->ignore_hotplug)
574                         return true;
575         }
576         return false;
577 }
578
579 /**
580  * get_slot_status - get ACPI slot status
581  * @slot: ACPI PHP slot
582  *
583  * If a slot has _STA for each function and if any one of them
584  * returned non-zero status, return it.
585  *
586  * If a slot doesn't have _STA and if any one of its functions'
587  * configuration space is configured, return 0x0f as a _STA.
588  *
589  * Otherwise return 0.
590  */
591 static unsigned int get_slot_status(struct acpiphp_slot *slot)
592 {
593         unsigned long long sta = 0;
594         struct acpiphp_func *func;
595         u32 dvid;
596
597         list_for_each_entry(func, &slot->funcs, sibling) {
598                 if (func->flags & FUNC_HAS_STA) {
599                         acpi_status status;
600
601                         status = acpi_evaluate_integer(func_to_handle(func),
602                                                        "_STA", NULL, &sta);
603                         if (ACPI_SUCCESS(status) && sta)
604                                 break;
605                 } else {
606                         if (pci_bus_read_dev_vendor_id(slot->bus,
607                                         PCI_DEVFN(slot->device, func->function),
608                                         &dvid, 0)) {
609                                 sta = ACPI_STA_ALL;
610                                 break;
611                         }
612                 }
613         }
614
615         if (!sta) {
616                 /*
617                  * Check for the slot itself since it may be that the
618                  * ACPI slot is a device below PCIe upstream port so in
619                  * that case it may not even be reachable yet.
620                  */
621                 if (pci_bus_read_dev_vendor_id(slot->bus,
622                                 PCI_DEVFN(slot->device, 0), &dvid, 0)) {
623                         sta = ACPI_STA_ALL;
624                 }
625         }
626
627         return (unsigned int)sta;
628 }
629
630 static inline bool device_status_valid(unsigned int sta)
631 {
632         /*
633          * ACPI spec says that _STA may return bit 0 clear with bit 3 set
634          * if the device is valid but does not require a device driver to be
635          * loaded (Section 6.3.7 of ACPI 5.0A).
636          */
637         unsigned int mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING;
638         return (sta & mask) == mask;
639 }
640
641 /**
642  * trim_stale_devices - remove PCI devices that are not responding.
643  * @dev: PCI device to start walking the hierarchy from.
644  */
645 static void trim_stale_devices(struct pci_dev *dev)
646 {
647         struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
648         struct pci_bus *bus = dev->subordinate;
649         bool alive = dev->ignore_hotplug;
650
651         if (adev) {
652                 acpi_status status;
653                 unsigned long long sta;
654
655                 status = acpi_evaluate_integer(adev->handle, "_STA", NULL, &sta);
656                 alive = alive || (ACPI_SUCCESS(status) && device_status_valid(sta));
657         }
658         if (!alive)
659                 alive = pci_device_is_present(dev);
660
661         if (!alive) {
662                 pci_dev_set_disconnected(dev, NULL);
663                 if (pci_has_subordinate(dev))
664                         pci_walk_bus(dev->subordinate, pci_dev_set_disconnected,
665                                      NULL);
666
667                 pci_stop_and_remove_bus_device(dev);
668                 if (adev)
669                         acpi_bus_trim(adev);
670         } else if (bus) {
671                 struct pci_dev *child, *tmp;
672
673                 /* The device is a bridge. so check the bus below it. */
674                 pm_runtime_get_sync(&dev->dev);
675                 list_for_each_entry_safe_reverse(child, tmp, &bus->devices, bus_list)
676                         trim_stale_devices(child);
677
678                 pm_runtime_put(&dev->dev);
679         }
680 }
681
682 /**
683  * acpiphp_check_bridge - re-enumerate devices
684  * @bridge: where to begin re-enumeration
685  *
686  * Iterate over all slots under this bridge and make sure that if a
687  * card is present they are enabled, and if not they are disabled.
688  */
689 static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
690 {
691         struct acpiphp_slot *slot;
692
693         /* Bail out if the bridge is going away. */
694         if (bridge->is_going_away)
695                 return;
696
697         if (bridge->pci_dev)
698                 pm_runtime_get_sync(&bridge->pci_dev->dev);
699
700         list_for_each_entry(slot, &bridge->slots, node) {
701                 struct pci_bus *bus = slot->bus;
702                 struct pci_dev *dev, *tmp;
703
704                 if (slot_no_hotplug(slot)) {
705                         ; /* do nothing */
706                 } else if (device_status_valid(get_slot_status(slot))) {
707                         /* remove stale devices if any */
708                         list_for_each_entry_safe_reverse(dev, tmp,
709                                                          &bus->devices, bus_list)
710                                 if (PCI_SLOT(dev->devfn) == slot->device)
711                                         trim_stale_devices(dev);
712
713                         /* configure all functions */
714                         enable_slot(slot, true);
715                 } else {
716                         disable_slot(slot);
717                 }
718         }
719
720         if (bridge->pci_dev)
721                 pm_runtime_put(&bridge->pci_dev->dev);
722 }
723
724 /*
725  * Remove devices for which we could not assign resources, call
726  * arch specific code to fix-up the bus
727  */
728 static void acpiphp_sanitize_bus(struct pci_bus *bus)
729 {
730         struct pci_dev *dev, *tmp;
731         int i;
732         unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
733
734         list_for_each_entry_safe_reverse(dev, tmp, &bus->devices, bus_list) {
735                 for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) {
736                         struct resource *res = &dev->resource[i];
737                         if ((res->flags & type_mask) && !res->start &&
738                                         res->end) {
739                                 /* Could not assign a required resources
740                                  * for this device, remove it */
741                                 pci_stop_and_remove_bus_device(dev);
742                                 break;
743                         }
744                 }
745         }
746 }
747
748 /*
749  * ACPI event handlers
750  */
751
752 void acpiphp_check_host_bridge(struct acpi_device *adev)
753 {
754         struct acpiphp_bridge *bridge = NULL;
755
756         acpi_lock_hp_context();
757         if (adev->hp) {
758                 bridge = to_acpiphp_root_context(adev->hp)->root_bridge;
759                 if (bridge)
760                         get_bridge(bridge);
761         }
762         acpi_unlock_hp_context();
763         if (bridge) {
764                 pci_lock_rescan_remove();
765
766                 acpiphp_check_bridge(bridge);
767
768                 pci_unlock_rescan_remove();
769                 put_bridge(bridge);
770         }
771 }
772
773 static int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot);
774
775 static void hotplug_event(u32 type, struct acpiphp_context *context)
776 {
777         acpi_handle handle = context->hp.self->handle;
778         struct acpiphp_func *func = &context->func;
779         struct acpiphp_slot *slot = func->slot;
780         struct acpiphp_bridge *bridge;
781
782         acpi_lock_hp_context();
783         bridge = context->bridge;
784         if (bridge)
785                 get_bridge(bridge);
786
787         acpi_unlock_hp_context();
788
789         pci_lock_rescan_remove();
790
791         switch (type) {
792         case ACPI_NOTIFY_BUS_CHECK:
793                 /* bus re-enumerate */
794                 acpi_handle_debug(handle, "Bus check in %s()\n", __func__);
795                 if (bridge)
796                         acpiphp_check_bridge(bridge);
797                 else if (!(slot->flags & SLOT_IS_GOING_AWAY))
798                         enable_slot(slot, false);
799
800                 break;
801
802         case ACPI_NOTIFY_DEVICE_CHECK:
803                 /* device check */
804                 acpi_handle_debug(handle, "Device check in %s()\n", __func__);
805                 if (bridge) {
806                         acpiphp_check_bridge(bridge);
807                 } else if (!(slot->flags & SLOT_IS_GOING_AWAY)) {
808                         /*
809                          * Check if anything has changed in the slot and rescan
810                          * from the parent if that's the case.
811                          */
812                         if (acpiphp_rescan_slot(slot))
813                                 acpiphp_check_bridge(func->parent);
814                 }
815                 break;
816
817         case ACPI_NOTIFY_EJECT_REQUEST:
818                 /* request device eject */
819                 acpi_handle_debug(handle, "Eject request in %s()\n", __func__);
820                 acpiphp_disable_and_eject_slot(slot);
821                 break;
822         }
823
824         pci_unlock_rescan_remove();
825         if (bridge)
826                 put_bridge(bridge);
827 }
828
829 static int acpiphp_hotplug_notify(struct acpi_device *adev, u32 type)
830 {
831         struct acpiphp_context *context;
832
833         context = acpiphp_grab_context(adev);
834         if (!context)
835                 return -ENODATA;
836
837         hotplug_event(type, context);
838         acpiphp_let_context_go(context);
839         return 0;
840 }
841
842 /**
843  * acpiphp_enumerate_slots - Enumerate PCI slots for a given bus.
844  * @bus: PCI bus to enumerate the slots for.
845  *
846  * A "slot" is an object associated with a PCI device number.  All functions
847  * (PCI devices) with the same bus and device number belong to the same slot.
848  */
849 void acpiphp_enumerate_slots(struct pci_bus *bus)
850 {
851         struct acpiphp_bridge *bridge;
852         struct acpi_device *adev;
853         acpi_handle handle;
854         acpi_status status;
855
856         if (acpiphp_disabled)
857                 return;
858
859         adev = ACPI_COMPANION(bus->bridge);
860         if (!adev)
861                 return;
862
863         handle = adev->handle;
864         bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
865         if (!bridge)
866                 return;
867
868         INIT_LIST_HEAD(&bridge->slots);
869         kref_init(&bridge->ref);
870         bridge->pci_dev = pci_dev_get(bus->self);
871         bridge->pci_bus = bus;
872
873         /*
874          * Grab a ref to the subordinate PCI bus in case the bus is
875          * removed via PCI core logical hotplug. The ref pins the bus
876          * (which we access during module unload).
877          */
878         get_device(&bus->dev);
879
880         acpi_lock_hp_context();
881         if (pci_is_root_bus(bridge->pci_bus)) {
882                 struct acpiphp_root_context *root_context;
883
884                 root_context = kzalloc(sizeof(*root_context), GFP_KERNEL);
885                 if (!root_context)
886                         goto err;
887
888                 root_context->root_bridge = bridge;
889                 acpi_set_hp_context(adev, &root_context->hp);
890         } else {
891                 struct acpiphp_context *context;
892
893                 /*
894                  * This bridge should have been registered as a hotplug function
895                  * under its parent, so the context should be there, unless the
896                  * parent is going to be handled by pciehp, in which case this
897                  * bridge is not interesting to us either.
898                  */
899                 context = acpiphp_get_context(adev);
900                 if (!context)
901                         goto err;
902
903                 bridge->context = context;
904                 context->bridge = bridge;
905                 /* Get a reference to the parent bridge. */
906                 get_bridge(context->func.parent);
907         }
908         acpi_unlock_hp_context();
909
910         /* Must be added to the list prior to calling acpiphp_add_context(). */
911         mutex_lock(&bridge_mutex);
912         list_add(&bridge->list, &bridge_list);
913         mutex_unlock(&bridge_mutex);
914
915         /* register all slot objects under this bridge */
916         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
917                                      acpiphp_add_context, NULL, bridge, NULL);
918         if (ACPI_FAILURE(status)) {
919                 acpi_handle_err(handle, "failed to register slots\n");
920                 cleanup_bridge(bridge);
921                 put_bridge(bridge);
922         }
923         return;
924
925  err:
926         acpi_unlock_hp_context();
927         put_device(&bus->dev);
928         pci_dev_put(bridge->pci_dev);
929         kfree(bridge);
930 }
931
932 static void acpiphp_drop_bridge(struct acpiphp_bridge *bridge)
933 {
934         if (pci_is_root_bus(bridge->pci_bus)) {
935                 struct acpiphp_root_context *root_context;
936                 struct acpi_device *adev;
937
938                 acpi_lock_hp_context();
939                 adev = ACPI_COMPANION(bridge->pci_bus->bridge);
940                 root_context = to_acpiphp_root_context(adev->hp);
941                 adev->hp = NULL;
942                 acpi_unlock_hp_context();
943                 kfree(root_context);
944         }
945         cleanup_bridge(bridge);
946         put_bridge(bridge);
947 }
948
949 /**
950  * acpiphp_remove_slots - Remove slot objects associated with a given bus.
951  * @bus: PCI bus to remove the slot objects for.
952  */
953 void acpiphp_remove_slots(struct pci_bus *bus)
954 {
955         struct acpiphp_bridge *bridge;
956
957         if (acpiphp_disabled)
958                 return;
959
960         mutex_lock(&bridge_mutex);
961         list_for_each_entry(bridge, &bridge_list, list)
962                 if (bridge->pci_bus == bus) {
963                         mutex_unlock(&bridge_mutex);
964                         acpiphp_drop_bridge(bridge);
965                         return;
966                 }
967
968         mutex_unlock(&bridge_mutex);
969 }
970
971 /**
972  * acpiphp_enable_slot - power on slot
973  * @slot: ACPI PHP slot
974  */
975 int acpiphp_enable_slot(struct acpiphp_slot *slot)
976 {
977         pci_lock_rescan_remove();
978
979         if (slot->flags & SLOT_IS_GOING_AWAY) {
980                 pci_unlock_rescan_remove();
981                 return -ENODEV;
982         }
983
984         /* configure all functions */
985         if (!(slot->flags & SLOT_ENABLED))
986                 enable_slot(slot, false);
987
988         pci_unlock_rescan_remove();
989         return 0;
990 }
991
992 /**
993  * acpiphp_disable_and_eject_slot - power off and eject slot
994  * @slot: ACPI PHP slot
995  */
996 static int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot)
997 {
998         struct acpiphp_func *func;
999
1000         if (slot->flags & SLOT_IS_GOING_AWAY)
1001                 return -ENODEV;
1002
1003         /* unconfigure all functions */
1004         disable_slot(slot);
1005
1006         list_for_each_entry(func, &slot->funcs, sibling)
1007                 if (func->flags & FUNC_HAS_EJ0) {
1008                         acpi_handle handle = func_to_handle(func);
1009
1010                         if (ACPI_FAILURE(acpi_evaluate_ej0(handle)))
1011                                 acpi_handle_err(handle, "_EJ0 failed\n");
1012
1013                         break;
1014                 }
1015
1016         return 0;
1017 }
1018
1019 int acpiphp_disable_slot(struct acpiphp_slot *slot)
1020 {
1021         int ret;
1022
1023         /*
1024          * Acquire acpi_scan_lock to ensure that the execution of _EJ0 in
1025          * acpiphp_disable_and_eject_slot() will be synchronized properly.
1026          */
1027         acpi_scan_lock_acquire();
1028         pci_lock_rescan_remove();
1029         ret = acpiphp_disable_and_eject_slot(slot);
1030         pci_unlock_rescan_remove();
1031         acpi_scan_lock_release();
1032         return ret;
1033 }
1034
1035 /*
1036  * slot enabled:  1
1037  * slot disabled: 0
1038  */
1039 u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
1040 {
1041         return (slot->flags & SLOT_ENABLED);
1042 }
1043
1044 /*
1045  * latch   open:  1
1046  * latch closed:  0
1047  */
1048 u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
1049 {
1050         return !(get_slot_status(slot) & ACPI_STA_DEVICE_UI);
1051 }
1052
1053 /*
1054  * adapter presence : 1
1055  *          absence : 0
1056  */
1057 u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
1058 {
1059         return !!get_slot_status(slot);
1060 }
This page took 0.098266 seconds and 4 git commands to generate.