1 /* 2 * File: pci-acpi.c 3 * Purpose: Provide PCI support in ACPI 4 * 5 * Copyright (C) 2005 David Shaohua Li <shaohua.li@intel.com> 6 * Copyright (C) 2004 Tom Long Nguyen <tom.l.nguyen@intel.com> 7 * Copyright (C) 2004 Intel Corp. 8 */ 9 10 #include <linux/delay.h> 11 #include <linux/init.h> 12 #include <linux/pci.h> 13 #include <linux/module.h> 14 #include <linux/pci-aspm.h> 15 #include <acpi/acpi.h> 16 #include <acpi/acpi_bus.h> 17 18 #include <linux/pci-acpi.h> 19 #include <linux/pm_runtime.h> 20 #include "pci.h" 21 22 static DEFINE_MUTEX(pci_acpi_pm_notify_mtx); 23 24 /** 25 * pci_acpi_wake_bus - Wake-up notification handler for root buses. 26 * @handle: ACPI handle of a device the notification is for. 27 * @event: Type of the signaled event. 28 * @context: PCI root bus to wake up devices on. 29 */ 30 static void pci_acpi_wake_bus(acpi_handle handle, u32 event, void *context) 31 { 32 struct pci_bus *pci_bus = context; 33 34 if (event == ACPI_NOTIFY_DEVICE_WAKE && pci_bus) 35 pci_pme_wakeup_bus(pci_bus); 36 } 37 38 /** 39 * pci_acpi_wake_dev - Wake-up notification handler for PCI devices. 40 * @handle: ACPI handle of a device the notification is for. 41 * @event: Type of the signaled event. 42 * @context: PCI device object to wake up. 43 */ 44 static void pci_acpi_wake_dev(acpi_handle handle, u32 event, void *context) 45 { 46 struct pci_dev *pci_dev = context; 47 48 if (event != ACPI_NOTIFY_DEVICE_WAKE || !pci_dev) 49 return; 50 51 if (!pci_dev->pm_cap || !pci_dev->pme_support 52 || pci_check_pme_status(pci_dev)) { 53 if (pci_dev->pme_poll) 54 pci_dev->pme_poll = false; 55 56 pci_wakeup_event(pci_dev); 57 pm_runtime_resume(&pci_dev->dev); 58 } 59 60 if (pci_dev->subordinate) 61 pci_pme_wakeup_bus(pci_dev->subordinate); 62 } 63 64 /** 65 * add_pm_notifier - Register PM notifier for given ACPI device. 66 * @dev: ACPI device to add the notifier for. 67 * @context: PCI device or bus to check for PME status if an event is signaled. 68 * 69 * NOTE: @dev need not be a run-wake or wake-up device to be a valid source of 70 * PM wake-up events. For example, wake-up events may be generated for bridges 71 * if one of the devices below the bridge is signaling PME, even if the bridge 72 * itself doesn't have a wake-up GPE associated with it. 73 */ 74 static acpi_status add_pm_notifier(struct acpi_device *dev, 75 acpi_notify_handler handler, 76 void *context) 77 { 78 acpi_status status = AE_ALREADY_EXISTS; 79 80 mutex_lock(&pci_acpi_pm_notify_mtx); 81 82 if (dev->wakeup.flags.notifier_present) 83 goto out; 84 85 status = acpi_install_notify_handler(dev->handle, 86 ACPI_SYSTEM_NOTIFY, 87 handler, context); 88 if (ACPI_FAILURE(status)) 89 goto out; 90 91 dev->wakeup.flags.notifier_present = true; 92 93 out: 94 mutex_unlock(&pci_acpi_pm_notify_mtx); 95 return status; 96 } 97 98 /** 99 * remove_pm_notifier - Unregister PM notifier from given ACPI device. 100 * @dev: ACPI device to remove the notifier from. 101 */ 102 static acpi_status remove_pm_notifier(struct acpi_device *dev, 103 acpi_notify_handler handler) 104 { 105 acpi_status status = AE_BAD_PARAMETER; 106 107 mutex_lock(&pci_acpi_pm_notify_mtx); 108 109 if (!dev->wakeup.flags.notifier_present) 110 goto out; 111 112 status = acpi_remove_notify_handler(dev->handle, 113 ACPI_SYSTEM_NOTIFY, 114 handler); 115 if (ACPI_FAILURE(status)) 116 goto out; 117 118 dev->wakeup.flags.notifier_present = false; 119 120 out: 121 mutex_unlock(&pci_acpi_pm_notify_mtx); 122 return status; 123 } 124 125 /** 126 * pci_acpi_add_bus_pm_notifier - Register PM notifier for given PCI bus. 127 * @dev: ACPI device to add the notifier for. 128 * @pci_bus: PCI bus to walk checking for PME status if an event is signaled. 129 */ 130 acpi_status pci_acpi_add_bus_pm_notifier(struct acpi_device *dev, 131 struct pci_bus *pci_bus) 132 { 133 return add_pm_notifier(dev, pci_acpi_wake_bus, pci_bus); 134 } 135 136 /** 137 * pci_acpi_remove_bus_pm_notifier - Unregister PCI bus PM notifier. 138 * @dev: ACPI device to remove the notifier from. 139 */ 140 acpi_status pci_acpi_remove_bus_pm_notifier(struct acpi_device *dev) 141 { 142 return remove_pm_notifier(dev, pci_acpi_wake_bus); 143 } 144 145 /** 146 * pci_acpi_add_pm_notifier - Register PM notifier for given PCI device. 147 * @dev: ACPI device to add the notifier for. 148 * @pci_dev: PCI device to check for the PME status if an event is signaled. 149 */ 150 acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev, 151 struct pci_dev *pci_dev) 152 { 153 return add_pm_notifier(dev, pci_acpi_wake_dev, pci_dev); 154 } 155 156 /** 157 * pci_acpi_remove_pm_notifier - Unregister PCI device PM notifier. 158 * @dev: ACPI device to remove the notifier from. 159 */ 160 acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev) 161 { 162 return remove_pm_notifier(dev, pci_acpi_wake_dev); 163 } 164 165 /* 166 * _SxD returns the D-state with the highest power 167 * (lowest D-state number) supported in the S-state "x". 168 * 169 * If the devices does not have a _PRW 170 * (Power Resources for Wake) supporting system wakeup from "x" 171 * then the OS is free to choose a lower power (higher number 172 * D-state) than the return value from _SxD. 173 * 174 * But if _PRW is enabled at S-state "x", the OS 175 * must not choose a power lower than _SxD -- 176 * unless the device has an _SxW method specifying 177 * the lowest power (highest D-state number) the device 178 * may enter while still able to wake the system. 179 * 180 * ie. depending on global OS policy: 181 * 182 * if (_PRW at S-state x) 183 * choose from highest power _SxD to lowest power _SxW 184 * else // no _PRW at S-state x 185 * choose highest power _SxD or any lower power 186 */ 187 188 static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev) 189 { 190 int acpi_state; 191 192 acpi_state = acpi_pm_device_sleep_state(&pdev->dev, NULL); 193 if (acpi_state < 0) 194 return PCI_POWER_ERROR; 195 196 switch (acpi_state) { 197 case ACPI_STATE_D0: 198 return PCI_D0; 199 case ACPI_STATE_D1: 200 return PCI_D1; 201 case ACPI_STATE_D2: 202 return PCI_D2; 203 case ACPI_STATE_D3_HOT: 204 return PCI_D3hot; 205 case ACPI_STATE_D3_COLD: 206 return PCI_D3cold; 207 } 208 return PCI_POWER_ERROR; 209 } 210 211 static bool acpi_pci_power_manageable(struct pci_dev *dev) 212 { 213 acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); 214 215 return handle ? acpi_bus_power_manageable(handle) : false; 216 } 217 218 static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state) 219 { 220 acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); 221 acpi_handle tmp; 222 static const u8 state_conv[] = { 223 [PCI_D0] = ACPI_STATE_D0, 224 [PCI_D1] = ACPI_STATE_D1, 225 [PCI_D2] = ACPI_STATE_D2, 226 [PCI_D3hot] = ACPI_STATE_D3, 227 [PCI_D3cold] = ACPI_STATE_D3 228 }; 229 int error = -EINVAL; 230 231 /* If the ACPI device has _EJ0, ignore the device */ 232 if (!handle || ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp))) 233 return -ENODEV; 234 235 switch (state) { 236 case PCI_D0: 237 case PCI_D1: 238 case PCI_D2: 239 case PCI_D3hot: 240 case PCI_D3cold: 241 error = acpi_bus_set_power(handle, state_conv[state]); 242 } 243 244 if (!error) 245 dev_printk(KERN_INFO, &dev->dev, 246 "power state changed by ACPI to D%d\n", state); 247 248 return error; 249 } 250 251 static bool acpi_pci_can_wakeup(struct pci_dev *dev) 252 { 253 acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); 254 255 return handle ? acpi_bus_can_wakeup(handle) : false; 256 } 257 258 static void acpi_pci_propagate_wakeup_enable(struct pci_bus *bus, bool enable) 259 { 260 while (bus->parent) { 261 if (!acpi_pm_device_sleep_wake(&bus->self->dev, enable)) 262 return; 263 bus = bus->parent; 264 } 265 266 /* We have reached the root bus. */ 267 if (bus->bridge) 268 acpi_pm_device_sleep_wake(bus->bridge, enable); 269 } 270 271 static int acpi_pci_sleep_wake(struct pci_dev *dev, bool enable) 272 { 273 if (acpi_pci_can_wakeup(dev)) 274 return acpi_pm_device_sleep_wake(&dev->dev, enable); 275 276 acpi_pci_propagate_wakeup_enable(dev->bus, enable); 277 return 0; 278 } 279 280 static void acpi_pci_propagate_run_wake(struct pci_bus *bus, bool enable) 281 { 282 while (bus->parent) { 283 struct pci_dev *bridge = bus->self; 284 285 if (bridge->pme_interrupt) 286 return; 287 if (!acpi_pm_device_run_wake(&bridge->dev, enable)) 288 return; 289 bus = bus->parent; 290 } 291 292 /* We have reached the root bus. */ 293 if (bus->bridge) 294 acpi_pm_device_run_wake(bus->bridge, enable); 295 } 296 297 static int acpi_pci_run_wake(struct pci_dev *dev, bool enable) 298 { 299 if (dev->pme_interrupt) 300 return 0; 301 302 if (!acpi_pm_device_run_wake(&dev->dev, enable)) 303 return 0; 304 305 acpi_pci_propagate_run_wake(dev->bus, enable); 306 return 0; 307 } 308 309 static struct pci_platform_pm_ops acpi_pci_platform_pm = { 310 .is_manageable = acpi_pci_power_manageable, 311 .set_state = acpi_pci_set_power_state, 312 .choose_state = acpi_pci_choose_state, 313 .can_wakeup = acpi_pci_can_wakeup, 314 .sleep_wake = acpi_pci_sleep_wake, 315 .run_wake = acpi_pci_run_wake, 316 }; 317 318 /* ACPI bus type */ 319 static int acpi_pci_find_device(struct device *dev, acpi_handle *handle) 320 { 321 struct pci_dev * pci_dev; 322 u64 addr; 323 324 pci_dev = to_pci_dev(dev); 325 /* Please ref to ACPI spec for the syntax of _ADR */ 326 addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); 327 *handle = acpi_get_child(DEVICE_ACPI_HANDLE(dev->parent), addr); 328 if (!*handle) 329 return -ENODEV; 330 return 0; 331 } 332 333 static int acpi_pci_find_root_bridge(struct device *dev, acpi_handle *handle) 334 { 335 int num; 336 unsigned int seg, bus; 337 338 /* 339 * The string should be the same as root bridge's name 340 * Please look at 'pci_scan_bus_parented' 341 */ 342 num = sscanf(dev_name(dev), "pci%04x:%02x", &seg, &bus); 343 if (num != 2) 344 return -ENODEV; 345 *handle = acpi_get_pci_rootbridge_handle(seg, bus); 346 if (!*handle) 347 return -ENODEV; 348 return 0; 349 } 350 351 static struct acpi_bus_type acpi_pci_bus = { 352 .bus = &pci_bus_type, 353 .find_device = acpi_pci_find_device, 354 .find_bridge = acpi_pci_find_root_bridge, 355 }; 356 357 static int __init acpi_pci_init(void) 358 { 359 int ret; 360 361 if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) { 362 printk(KERN_INFO"ACPI FADT declares the system doesn't support MSI, so disable it\n"); 363 pci_no_msi(); 364 } 365 366 if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) { 367 printk(KERN_INFO"ACPI FADT declares the system doesn't support PCIe ASPM, so disable it\n"); 368 pcie_no_aspm(); 369 } 370 371 ret = register_acpi_bus_type(&acpi_pci_bus); 372 if (ret) 373 return 0; 374 pci_set_platform_pm(&acpi_pci_platform_pm); 375 return 0; 376 } 377 arch_initcall(acpi_pci_init); 378