1 /* 2 * vga_switcheroo.c - Support for laptop with dual GPU using one set of outputs 3 * 4 * Copyright (c) 2010 Red Hat Inc. 5 * Author : Dave Airlie <airlied@redhat.com> 6 * 7 * Copyright (c) 2015 Lukas Wunner <lukas@wunner.de> 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the next 17 * paragraph) shall be included in all copies or substantial portions of the 18 * Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 * DEALINGS 27 * IN THE SOFTWARE. 28 * 29 */ 30 31 #define pr_fmt(fmt) "vga_switcheroo: " fmt 32 33 #include <linux/apple-gmux.h> 34 #include <linux/console.h> 35 #include <linux/debugfs.h> 36 #include <linux/fb.h> 37 #include <linux/fs.h> 38 #include <linux/module.h> 39 #include <linux/pci.h> 40 #include <linux/pm_domain.h> 41 #include <linux/pm_runtime.h> 42 #include <linux/seq_file.h> 43 #include <linux/uaccess.h> 44 #include <linux/vgaarb.h> 45 #include <linux/vga_switcheroo.h> 46 47 /** 48 * DOC: Overview 49 * 50 * vga_switcheroo is the Linux subsystem for laptop hybrid graphics. 51 * These come in two flavors: 52 * 53 * * muxed: Dual GPUs with a multiplexer chip to switch outputs between GPUs. 54 * * muxless: Dual GPUs but only one of them is connected to outputs. 55 * The other one is merely used to offload rendering, its results 56 * are copied over PCIe into the framebuffer. On Linux this is 57 * supported with DRI PRIME. 58 * 59 * Hybrid graphics started to appear in the late Naughties and were initially 60 * all muxed. Newer laptops moved to a muxless architecture for cost reasons. 61 * A notable exception is the MacBook Pro which continues to use a mux. 62 * Muxes come with varying capabilities: Some switch only the panel, others 63 * can also switch external displays. Some switch all display pins at once 64 * while others can switch just the DDC lines. (To allow EDID probing 65 * for the inactive GPU.) Also, muxes are often used to cut power to the 66 * discrete GPU while it is not used. 67 * 68 * DRM drivers register GPUs with vga_switcheroo, these are henceforth called 69 * clients. The mux is called the handler. Muxless machines also register a 70 * handler to control the power state of the discrete GPU, its ->switchto 71 * callback is a no-op for obvious reasons. The discrete GPU is often equipped 72 * with an HDA controller for the HDMI/DP audio signal, this will also 73 * register as a client so that vga_switcheroo can take care of the correct 74 * suspend/resume order when changing the discrete GPU's power state. In total 75 * there can thus be up to three clients: Two vga clients (GPUs) and one audio 76 * client (on the discrete GPU). The code is mostly prepared to support 77 * machines with more than two GPUs should they become available. 78 * 79 * The GPU to which the outputs are currently switched is called the 80 * active client in vga_switcheroo parlance. The GPU not in use is the 81 * inactive client. When the inactive client's DRM driver is loaded, 82 * it will be unable to probe the panel's EDID and hence depends on 83 * VBIOS to provide its display modes. If the VBIOS modes are bogus or 84 * if there is no VBIOS at all (which is common on the MacBook Pro), 85 * a client may alternatively request that the DDC lines are temporarily 86 * switched to it, provided that the handler supports this. Switching 87 * only the DDC lines and not the entire output avoids unnecessary 88 * flickering. 89 */ 90 91 /** 92 * struct vga_switcheroo_client - registered client 93 * @pdev: client pci device 94 * @fb_info: framebuffer to which console is remapped on switching 95 * @pwr_state: current power state if manual power control is used. 96 * For driver power control, call vga_switcheroo_pwr_state(). 97 * @ops: client callbacks 98 * @id: client identifier. Determining the id requires the handler, 99 * so gpus are initially assigned VGA_SWITCHEROO_UNKNOWN_ID 100 * and later given their true id in vga_switcheroo_enable() 101 * @active: whether the outputs are currently switched to this client 102 * @driver_power_control: whether power state is controlled by the driver's 103 * runtime pm. If true, writing ON and OFF to the vga_switcheroo debugfs 104 * interface is a no-op so as not to interfere with runtime pm 105 * @list: client list 106 * @vga_dev: pci device, indicate which GPU is bound to current audio client 107 * 108 * Registered client. A client can be either a GPU or an audio device on a GPU. 109 * For audio clients, the @fb_info and @active members are bogus. For GPU 110 * clients, the @vga_dev is bogus. 111 */ 112 struct vga_switcheroo_client { 113 struct pci_dev *pdev; 114 struct fb_info *fb_info; 115 enum vga_switcheroo_state pwr_state; 116 const struct vga_switcheroo_client_ops *ops; 117 enum vga_switcheroo_client_id id; 118 bool active; 119 bool driver_power_control; 120 struct list_head list; 121 struct pci_dev *vga_dev; 122 }; 123 124 /* 125 * protects access to struct vgasr_priv 126 */ 127 static DEFINE_MUTEX(vgasr_mutex); 128 129 /** 130 * struct vgasr_priv - vga_switcheroo private data 131 * @active: whether vga_switcheroo is enabled. 132 * Prerequisite is the registration of two GPUs and a handler 133 * @delayed_switch_active: whether a delayed switch is pending 134 * @delayed_client_id: client to which a delayed switch is pending 135 * @debugfs_root: directory for vga_switcheroo debugfs interface 136 * @switch_file: file for vga_switcheroo debugfs interface 137 * @registered_clients: number of registered GPUs 138 * (counting only vga clients, not audio clients) 139 * @clients: list of registered clients 140 * @handler: registered handler 141 * @handler_flags: flags of registered handler 142 * @mux_hw_lock: protects mux state 143 * (in particular while DDC lines are temporarily switched) 144 * @old_ddc_owner: client to which DDC lines will be switched back on unlock 145 * 146 * vga_switcheroo private data. Currently only one vga_switcheroo instance 147 * per system is supported. 148 */ 149 struct vgasr_priv { 150 bool active; 151 bool delayed_switch_active; 152 enum vga_switcheroo_client_id delayed_client_id; 153 154 struct dentry *debugfs_root; 155 struct dentry *switch_file; 156 157 int registered_clients; 158 struct list_head clients; 159 160 const struct vga_switcheroo_handler *handler; 161 enum vga_switcheroo_handler_flags_t handler_flags; 162 struct mutex mux_hw_lock; 163 int old_ddc_owner; 164 }; 165 166 #define ID_BIT_AUDIO 0x100 167 #define client_is_audio(c) ((c)->id & ID_BIT_AUDIO) 168 #define client_is_vga(c) (!client_is_audio(c)) 169 #define client_id(c) ((c)->id & ~ID_BIT_AUDIO) 170 171 static int vga_switcheroo_debugfs_init(struct vgasr_priv *priv); 172 static void vga_switcheroo_debugfs_fini(struct vgasr_priv *priv); 173 174 /* only one switcheroo per system */ 175 static struct vgasr_priv vgasr_priv = { 176 .clients = LIST_HEAD_INIT(vgasr_priv.clients), 177 .mux_hw_lock = __MUTEX_INITIALIZER(vgasr_priv.mux_hw_lock), 178 }; 179 180 static bool vga_switcheroo_ready(void) 181 { 182 /* we're ready if we get two clients + handler */ 183 return !vgasr_priv.active && 184 vgasr_priv.registered_clients == 2 && vgasr_priv.handler; 185 } 186 187 static void vga_switcheroo_enable(void) 188 { 189 int ret; 190 struct vga_switcheroo_client *client; 191 192 /* call the handler to init */ 193 if (vgasr_priv.handler->init) 194 vgasr_priv.handler->init(); 195 196 list_for_each_entry(client, &vgasr_priv.clients, list) { 197 if (!client_is_vga(client) || 198 client_id(client) != VGA_SWITCHEROO_UNKNOWN_ID) 199 continue; 200 201 ret = vgasr_priv.handler->get_client_id(client->pdev); 202 if (ret < 0) 203 return; 204 205 client->id = ret; 206 } 207 208 list_for_each_entry(client, &vgasr_priv.clients, list) { 209 if (!client_is_audio(client) || 210 client_id(client) != VGA_SWITCHEROO_UNKNOWN_ID) 211 continue; 212 213 ret = vgasr_priv.handler->get_client_id(client->vga_dev); 214 if (ret < 0) 215 return; 216 217 client->id = ret | ID_BIT_AUDIO; 218 if (client->ops->gpu_bound) 219 client->ops->gpu_bound(client->pdev, ret); 220 } 221 222 vga_switcheroo_debugfs_init(&vgasr_priv); 223 vgasr_priv.active = true; 224 } 225 226 /** 227 * vga_switcheroo_register_handler() - register handler 228 * @handler: handler callbacks 229 * @handler_flags: handler flags 230 * 231 * Register handler. Enable vga_switcheroo if two vga clients have already 232 * registered. 233 * 234 * Return: 0 on success, -EINVAL if a handler was already registered. 235 */ 236 int vga_switcheroo_register_handler( 237 const struct vga_switcheroo_handler *handler, 238 enum vga_switcheroo_handler_flags_t handler_flags) 239 { 240 mutex_lock(&vgasr_mutex); 241 if (vgasr_priv.handler) { 242 mutex_unlock(&vgasr_mutex); 243 return -EINVAL; 244 } 245 246 vgasr_priv.handler = handler; 247 vgasr_priv.handler_flags = handler_flags; 248 if (vga_switcheroo_ready()) { 249 pr_info("enabled\n"); 250 vga_switcheroo_enable(); 251 } 252 mutex_unlock(&vgasr_mutex); 253 return 0; 254 } 255 EXPORT_SYMBOL(vga_switcheroo_register_handler); 256 257 /** 258 * vga_switcheroo_unregister_handler() - unregister handler 259 * 260 * Unregister handler. Disable vga_switcheroo. 261 */ 262 void vga_switcheroo_unregister_handler(void) 263 { 264 mutex_lock(&vgasr_mutex); 265 mutex_lock(&vgasr_priv.mux_hw_lock); 266 vgasr_priv.handler_flags = 0; 267 vgasr_priv.handler = NULL; 268 if (vgasr_priv.active) { 269 pr_info("disabled\n"); 270 vga_switcheroo_debugfs_fini(&vgasr_priv); 271 vgasr_priv.active = false; 272 } 273 mutex_unlock(&vgasr_priv.mux_hw_lock); 274 mutex_unlock(&vgasr_mutex); 275 } 276 EXPORT_SYMBOL(vga_switcheroo_unregister_handler); 277 278 /** 279 * vga_switcheroo_handler_flags() - obtain handler flags 280 * 281 * Helper for clients to obtain the handler flags bitmask. 282 * 283 * Return: Handler flags. A value of 0 means that no handler is registered 284 * or that the handler has no special capabilities. 285 */ 286 enum vga_switcheroo_handler_flags_t vga_switcheroo_handler_flags(void) 287 { 288 return vgasr_priv.handler_flags; 289 } 290 EXPORT_SYMBOL(vga_switcheroo_handler_flags); 291 292 static int register_client(struct pci_dev *pdev, 293 const struct vga_switcheroo_client_ops *ops, 294 enum vga_switcheroo_client_id id, 295 struct pci_dev *vga_dev, 296 bool active, 297 bool driver_power_control) 298 { 299 struct vga_switcheroo_client *client; 300 301 client = kzalloc(sizeof(*client), GFP_KERNEL); 302 if (!client) 303 return -ENOMEM; 304 305 client->pwr_state = VGA_SWITCHEROO_ON; 306 client->pdev = pdev; 307 client->ops = ops; 308 client->id = id; 309 client->active = active; 310 client->driver_power_control = driver_power_control; 311 client->vga_dev = vga_dev; 312 313 mutex_lock(&vgasr_mutex); 314 list_add_tail(&client->list, &vgasr_priv.clients); 315 if (client_is_vga(client)) 316 vgasr_priv.registered_clients++; 317 318 if (vga_switcheroo_ready()) { 319 pr_info("enabled\n"); 320 vga_switcheroo_enable(); 321 } 322 mutex_unlock(&vgasr_mutex); 323 return 0; 324 } 325 326 /** 327 * vga_switcheroo_register_client - register vga client 328 * @pdev: client pci device 329 * @ops: client callbacks 330 * @driver_power_control: whether power state is controlled by the driver's 331 * runtime pm 332 * 333 * Register vga client (GPU). Enable vga_switcheroo if another GPU and a 334 * handler have already registered. The power state of the client is assumed 335 * to be ON. Beforehand, vga_switcheroo_client_probe_defer() shall be called 336 * to ensure that all prerequisites are met. 337 * 338 * Return: 0 on success, -ENOMEM on memory allocation error. 339 */ 340 int vga_switcheroo_register_client(struct pci_dev *pdev, 341 const struct vga_switcheroo_client_ops *ops, 342 bool driver_power_control) 343 { 344 return register_client(pdev, ops, VGA_SWITCHEROO_UNKNOWN_ID, NULL, 345 pdev == vga_default_device(), 346 driver_power_control); 347 } 348 EXPORT_SYMBOL(vga_switcheroo_register_client); 349 350 /** 351 * vga_switcheroo_register_audio_client - register audio client 352 * @pdev: client pci device 353 * @ops: client callbacks 354 * @vga_dev: pci device which is bound to current audio client 355 * 356 * Register audio client (audio device on a GPU). The client is assumed 357 * to use runtime PM. Beforehand, vga_switcheroo_client_probe_defer() 358 * shall be called to ensure that all prerequisites are met. 359 * 360 * Return: 0 on success, -ENOMEM on memory allocation error, -EINVAL on getting 361 * client id error. 362 */ 363 int vga_switcheroo_register_audio_client(struct pci_dev *pdev, 364 const struct vga_switcheroo_client_ops *ops, 365 struct pci_dev *vga_dev) 366 { 367 enum vga_switcheroo_client_id id = VGA_SWITCHEROO_UNKNOWN_ID; 368 369 /* 370 * if vga_switcheroo has enabled, that mean two GPU clients and also 371 * handler are registered. Get audio client id from bound GPU client 372 * id directly, otherwise, set it as VGA_SWITCHEROO_UNKNOWN_ID, 373 * it will set to correct id in later when vga_switcheroo_enable() 374 * is called. 375 */ 376 mutex_lock(&vgasr_mutex); 377 if (vgasr_priv.active) { 378 id = vgasr_priv.handler->get_client_id(vga_dev); 379 if (id < 0) { 380 mutex_unlock(&vgasr_mutex); 381 return -EINVAL; 382 } 383 } 384 mutex_unlock(&vgasr_mutex); 385 386 return register_client(pdev, ops, id | ID_BIT_AUDIO, vga_dev, 387 false, true); 388 } 389 EXPORT_SYMBOL(vga_switcheroo_register_audio_client); 390 391 static struct vga_switcheroo_client * 392 find_client_from_pci(struct list_head *head, struct pci_dev *pdev) 393 { 394 struct vga_switcheroo_client *client; 395 396 list_for_each_entry(client, head, list) 397 if (client->pdev == pdev) 398 return client; 399 return NULL; 400 } 401 402 static struct vga_switcheroo_client * 403 find_client_from_id(struct list_head *head, 404 enum vga_switcheroo_client_id client_id) 405 { 406 struct vga_switcheroo_client *client; 407 408 list_for_each_entry(client, head, list) 409 if (client->id == client_id) 410 return client; 411 return NULL; 412 } 413 414 static struct vga_switcheroo_client * 415 find_active_client(struct list_head *head) 416 { 417 struct vga_switcheroo_client *client; 418 419 list_for_each_entry(client, head, list) 420 if (client->active) 421 return client; 422 return NULL; 423 } 424 425 /** 426 * vga_switcheroo_client_probe_defer() - whether to defer probing a given client 427 * @pdev: client pci device 428 * 429 * Determine whether any prerequisites are not fulfilled to probe a given 430 * client. Drivers shall invoke this early on in their ->probe callback 431 * and return %-EPROBE_DEFER if it evaluates to %true. Thou shalt not 432 * register the client ere thou hast called this. 433 * 434 * Return: %true if probing should be deferred, otherwise %false. 435 */ 436 bool vga_switcheroo_client_probe_defer(struct pci_dev *pdev) 437 { 438 if ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) { 439 /* 440 * apple-gmux is needed on pre-retina MacBook Pro 441 * to probe the panel if pdev is the inactive GPU. 442 */ 443 if (apple_gmux_present() && pdev != vga_default_device() && 444 !vgasr_priv.handler_flags) 445 return true; 446 } 447 448 return false; 449 } 450 EXPORT_SYMBOL(vga_switcheroo_client_probe_defer); 451 452 static enum vga_switcheroo_state 453 vga_switcheroo_pwr_state(struct vga_switcheroo_client *client) 454 { 455 if (client->driver_power_control) 456 if (pm_runtime_enabled(&client->pdev->dev) && 457 pm_runtime_active(&client->pdev->dev)) 458 return VGA_SWITCHEROO_ON; 459 else 460 return VGA_SWITCHEROO_OFF; 461 else 462 return client->pwr_state; 463 } 464 465 /** 466 * vga_switcheroo_get_client_state() - obtain power state of a given client 467 * @pdev: client pci device 468 * 469 * Obtain power state of a given client as seen from vga_switcheroo. 470 * The function is only called from hda_intel.c. 471 * 472 * Return: Power state. 473 */ 474 enum vga_switcheroo_state vga_switcheroo_get_client_state(struct pci_dev *pdev) 475 { 476 struct vga_switcheroo_client *client; 477 enum vga_switcheroo_state ret; 478 479 mutex_lock(&vgasr_mutex); 480 client = find_client_from_pci(&vgasr_priv.clients, pdev); 481 if (!client) 482 ret = VGA_SWITCHEROO_NOT_FOUND; 483 else 484 ret = vga_switcheroo_pwr_state(client); 485 mutex_unlock(&vgasr_mutex); 486 return ret; 487 } 488 EXPORT_SYMBOL(vga_switcheroo_get_client_state); 489 490 /** 491 * vga_switcheroo_unregister_client() - unregister client 492 * @pdev: client pci device 493 * 494 * Unregister client. Disable vga_switcheroo if this is a vga client (GPU). 495 */ 496 void vga_switcheroo_unregister_client(struct pci_dev *pdev) 497 { 498 struct vga_switcheroo_client *client; 499 500 mutex_lock(&vgasr_mutex); 501 client = find_client_from_pci(&vgasr_priv.clients, pdev); 502 if (client) { 503 if (client_is_vga(client)) 504 vgasr_priv.registered_clients--; 505 list_del(&client->list); 506 kfree(client); 507 } 508 if (vgasr_priv.active && vgasr_priv.registered_clients < 2) { 509 pr_info("disabled\n"); 510 vga_switcheroo_debugfs_fini(&vgasr_priv); 511 vgasr_priv.active = false; 512 } 513 mutex_unlock(&vgasr_mutex); 514 } 515 EXPORT_SYMBOL(vga_switcheroo_unregister_client); 516 517 /** 518 * vga_switcheroo_client_fb_set() - set framebuffer of a given client 519 * @pdev: client pci device 520 * @info: framebuffer 521 * 522 * Set framebuffer of a given client. The console will be remapped to this 523 * on switching. 524 */ 525 void vga_switcheroo_client_fb_set(struct pci_dev *pdev, 526 struct fb_info *info) 527 { 528 struct vga_switcheroo_client *client; 529 530 mutex_lock(&vgasr_mutex); 531 client = find_client_from_pci(&vgasr_priv.clients, pdev); 532 if (client) 533 client->fb_info = info; 534 mutex_unlock(&vgasr_mutex); 535 } 536 EXPORT_SYMBOL(vga_switcheroo_client_fb_set); 537 538 /** 539 * vga_switcheroo_lock_ddc() - temporarily switch DDC lines to a given client 540 * @pdev: client pci device 541 * 542 * Temporarily switch DDC lines to the client identified by @pdev 543 * (but leave the outputs otherwise switched to where they are). 544 * This allows the inactive client to probe EDID. The DDC lines must 545 * afterwards be switched back by calling vga_switcheroo_unlock_ddc(), 546 * even if this function returns an error. 547 * 548 * Return: Previous DDC owner on success or a negative int on error. 549 * Specifically, %-ENODEV if no handler has registered or if the handler 550 * does not support switching the DDC lines. Also, a negative value 551 * returned by the handler is propagated back to the caller. 552 * The return value has merely an informational purpose for any caller 553 * which might be interested in it. It is acceptable to ignore the return 554 * value and simply rely on the result of the subsequent EDID probe, 555 * which will be %NULL if DDC switching failed. 556 */ 557 int vga_switcheroo_lock_ddc(struct pci_dev *pdev) 558 { 559 enum vga_switcheroo_client_id id; 560 561 mutex_lock(&vgasr_priv.mux_hw_lock); 562 if (!vgasr_priv.handler || !vgasr_priv.handler->switch_ddc) { 563 vgasr_priv.old_ddc_owner = -ENODEV; 564 return -ENODEV; 565 } 566 567 id = vgasr_priv.handler->get_client_id(pdev); 568 vgasr_priv.old_ddc_owner = vgasr_priv.handler->switch_ddc(id); 569 return vgasr_priv.old_ddc_owner; 570 } 571 EXPORT_SYMBOL(vga_switcheroo_lock_ddc); 572 573 /** 574 * vga_switcheroo_unlock_ddc() - switch DDC lines back to previous owner 575 * @pdev: client pci device 576 * 577 * Switch DDC lines back to the previous owner after calling 578 * vga_switcheroo_lock_ddc(). This must be called even if 579 * vga_switcheroo_lock_ddc() returned an error. 580 * 581 * Return: Previous DDC owner on success (i.e. the client identifier of @pdev) 582 * or a negative int on error. 583 * Specifically, %-ENODEV if no handler has registered or if the handler 584 * does not support switching the DDC lines. Also, a negative value 585 * returned by the handler is propagated back to the caller. 586 * Finally, invoking this function without calling vga_switcheroo_lock_ddc() 587 * first is not allowed and will result in %-EINVAL. 588 */ 589 int vga_switcheroo_unlock_ddc(struct pci_dev *pdev) 590 { 591 enum vga_switcheroo_client_id id; 592 int ret = vgasr_priv.old_ddc_owner; 593 594 if (WARN_ON_ONCE(!mutex_is_locked(&vgasr_priv.mux_hw_lock))) 595 return -EINVAL; 596 597 if (vgasr_priv.old_ddc_owner >= 0) { 598 id = vgasr_priv.handler->get_client_id(pdev); 599 if (vgasr_priv.old_ddc_owner != id) 600 ret = vgasr_priv.handler->switch_ddc( 601 vgasr_priv.old_ddc_owner); 602 } 603 mutex_unlock(&vgasr_priv.mux_hw_lock); 604 return ret; 605 } 606 EXPORT_SYMBOL(vga_switcheroo_unlock_ddc); 607 608 /** 609 * DOC: Manual switching and manual power control 610 * 611 * In this mode of use, the file /sys/kernel/debug/vgaswitcheroo/switch 612 * can be read to retrieve the current vga_switcheroo state and commands 613 * can be written to it to change the state. The file appears as soon as 614 * two GPU drivers and one handler have registered with vga_switcheroo. 615 * The following commands are understood: 616 * 617 * * OFF: Power off the device not in use. 618 * * ON: Power on the device not in use. 619 * * IGD: Switch to the integrated graphics device. 620 * Power on the integrated GPU if necessary, power off the discrete GPU. 621 * Prerequisite is that no user space processes (e.g. Xorg, alsactl) 622 * have opened device files of the GPUs or the audio client. If the 623 * switch fails, the user may invoke lsof(8) or fuser(1) on /dev/dri/ 624 * and /dev/snd/controlC1 to identify processes blocking the switch. 625 * * DIS: Switch to the discrete graphics device. 626 * * DIGD: Delayed switch to the integrated graphics device. 627 * This will perform the switch once the last user space process has 628 * closed the device files of the GPUs and the audio client. 629 * * DDIS: Delayed switch to the discrete graphics device. 630 * * MIGD: Mux-only switch to the integrated graphics device. 631 * Does not remap console or change the power state of either gpu. 632 * If the integrated GPU is currently off, the screen will turn black. 633 * If it is on, the screen will show whatever happens to be in VRAM. 634 * Either way, the user has to blindly enter the command to switch back. 635 * * MDIS: Mux-only switch to the discrete graphics device. 636 * 637 * For GPUs whose power state is controlled by the driver's runtime pm, 638 * the ON and OFF commands are a no-op (see next section). 639 * 640 * For muxless machines, the IGD/DIS, DIGD/DDIS and MIGD/MDIS commands 641 * should not be used. 642 */ 643 644 static int vga_switcheroo_show(struct seq_file *m, void *v) 645 { 646 struct vga_switcheroo_client *client; 647 int i = 0; 648 649 mutex_lock(&vgasr_mutex); 650 list_for_each_entry(client, &vgasr_priv.clients, list) { 651 seq_printf(m, "%d:%s%s:%c:%s%s:%s\n", i, 652 client_id(client) == VGA_SWITCHEROO_DIS ? "DIS" : 653 "IGD", 654 client_is_vga(client) ? "" : "-Audio", 655 client->active ? '+' : ' ', 656 client->driver_power_control ? "Dyn" : "", 657 vga_switcheroo_pwr_state(client) ? "Pwr" : "Off", 658 pci_name(client->pdev)); 659 i++; 660 } 661 mutex_unlock(&vgasr_mutex); 662 return 0; 663 } 664 665 static int vga_switcheroo_debugfs_open(struct inode *inode, struct file *file) 666 { 667 return single_open(file, vga_switcheroo_show, NULL); 668 } 669 670 static int vga_switchon(struct vga_switcheroo_client *client) 671 { 672 if (client->driver_power_control) 673 return 0; 674 if (vgasr_priv.handler->power_state) 675 vgasr_priv.handler->power_state(client->id, VGA_SWITCHEROO_ON); 676 /* call the driver callback to turn on device */ 677 client->ops->set_gpu_state(client->pdev, VGA_SWITCHEROO_ON); 678 client->pwr_state = VGA_SWITCHEROO_ON; 679 return 0; 680 } 681 682 static int vga_switchoff(struct vga_switcheroo_client *client) 683 { 684 if (client->driver_power_control) 685 return 0; 686 /* call the driver callback to turn off device */ 687 client->ops->set_gpu_state(client->pdev, VGA_SWITCHEROO_OFF); 688 if (vgasr_priv.handler->power_state) 689 vgasr_priv.handler->power_state(client->id, VGA_SWITCHEROO_OFF); 690 client->pwr_state = VGA_SWITCHEROO_OFF; 691 return 0; 692 } 693 694 static void set_audio_state(enum vga_switcheroo_client_id id, 695 enum vga_switcheroo_state state) 696 { 697 struct vga_switcheroo_client *client; 698 699 client = find_client_from_id(&vgasr_priv.clients, id | ID_BIT_AUDIO); 700 if (client) 701 client->ops->set_gpu_state(client->pdev, state); 702 } 703 704 /* stage one happens before delay */ 705 static int vga_switchto_stage1(struct vga_switcheroo_client *new_client) 706 { 707 struct vga_switcheroo_client *active; 708 709 active = find_active_client(&vgasr_priv.clients); 710 if (!active) 711 return 0; 712 713 if (vga_switcheroo_pwr_state(new_client) == VGA_SWITCHEROO_OFF) 714 vga_switchon(new_client); 715 716 vga_set_default_device(new_client->pdev); 717 return 0; 718 } 719 720 /* post delay */ 721 static int vga_switchto_stage2(struct vga_switcheroo_client *new_client) 722 { 723 int ret; 724 struct vga_switcheroo_client *active; 725 726 active = find_active_client(&vgasr_priv.clients); 727 if (!active) 728 return 0; 729 730 active->active = false; 731 732 /* let HDA controller autosuspend if GPU uses driver power control */ 733 if (!active->driver_power_control) 734 set_audio_state(active->id, VGA_SWITCHEROO_OFF); 735 736 if (new_client->fb_info) { 737 struct fb_event event; 738 739 console_lock(); 740 event.info = new_client->fb_info; 741 fb_notifier_call_chain(FB_EVENT_REMAP_ALL_CONSOLE, &event); 742 console_unlock(); 743 } 744 745 mutex_lock(&vgasr_priv.mux_hw_lock); 746 ret = vgasr_priv.handler->switchto(new_client->id); 747 mutex_unlock(&vgasr_priv.mux_hw_lock); 748 if (ret) 749 return ret; 750 751 if (new_client->ops->reprobe) 752 new_client->ops->reprobe(new_client->pdev); 753 754 if (vga_switcheroo_pwr_state(active) == VGA_SWITCHEROO_ON) 755 vga_switchoff(active); 756 757 /* let HDA controller autoresume if GPU uses driver power control */ 758 if (!new_client->driver_power_control) 759 set_audio_state(new_client->id, VGA_SWITCHEROO_ON); 760 761 new_client->active = true; 762 return 0; 763 } 764 765 static bool check_can_switch(void) 766 { 767 struct vga_switcheroo_client *client; 768 769 list_for_each_entry(client, &vgasr_priv.clients, list) { 770 if (!client->ops->can_switch(client->pdev)) { 771 pr_err("client %x refused switch\n", client->id); 772 return false; 773 } 774 } 775 return true; 776 } 777 778 static ssize_t 779 vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf, 780 size_t cnt, loff_t *ppos) 781 { 782 char usercmd[64]; 783 int ret; 784 bool delay = false, can_switch; 785 bool just_mux = false; 786 enum vga_switcheroo_client_id client_id = VGA_SWITCHEROO_UNKNOWN_ID; 787 struct vga_switcheroo_client *client = NULL; 788 789 if (cnt > 63) 790 cnt = 63; 791 792 if (copy_from_user(usercmd, ubuf, cnt)) 793 return -EFAULT; 794 795 mutex_lock(&vgasr_mutex); 796 797 if (!vgasr_priv.active) { 798 cnt = -EINVAL; 799 goto out; 800 } 801 802 /* pwr off the device not in use */ 803 if (strncmp(usercmd, "OFF", 3) == 0) { 804 list_for_each_entry(client, &vgasr_priv.clients, list) { 805 if (client->active || client_is_audio(client)) 806 continue; 807 if (client->driver_power_control) 808 continue; 809 set_audio_state(client->id, VGA_SWITCHEROO_OFF); 810 if (client->pwr_state == VGA_SWITCHEROO_ON) 811 vga_switchoff(client); 812 } 813 goto out; 814 } 815 /* pwr on the device not in use */ 816 if (strncmp(usercmd, "ON", 2) == 0) { 817 list_for_each_entry(client, &vgasr_priv.clients, list) { 818 if (client->active || client_is_audio(client)) 819 continue; 820 if (client->driver_power_control) 821 continue; 822 if (client->pwr_state == VGA_SWITCHEROO_OFF) 823 vga_switchon(client); 824 set_audio_state(client->id, VGA_SWITCHEROO_ON); 825 } 826 goto out; 827 } 828 829 /* request a delayed switch - test can we switch now */ 830 if (strncmp(usercmd, "DIGD", 4) == 0) { 831 client_id = VGA_SWITCHEROO_IGD; 832 delay = true; 833 } 834 835 if (strncmp(usercmd, "DDIS", 4) == 0) { 836 client_id = VGA_SWITCHEROO_DIS; 837 delay = true; 838 } 839 840 if (strncmp(usercmd, "IGD", 3) == 0) 841 client_id = VGA_SWITCHEROO_IGD; 842 843 if (strncmp(usercmd, "DIS", 3) == 0) 844 client_id = VGA_SWITCHEROO_DIS; 845 846 if (strncmp(usercmd, "MIGD", 4) == 0) { 847 just_mux = true; 848 client_id = VGA_SWITCHEROO_IGD; 849 } 850 if (strncmp(usercmd, "MDIS", 4) == 0) { 851 just_mux = true; 852 client_id = VGA_SWITCHEROO_DIS; 853 } 854 855 if (client_id == VGA_SWITCHEROO_UNKNOWN_ID) 856 goto out; 857 client = find_client_from_id(&vgasr_priv.clients, client_id); 858 if (!client) 859 goto out; 860 861 vgasr_priv.delayed_switch_active = false; 862 863 if (just_mux) { 864 mutex_lock(&vgasr_priv.mux_hw_lock); 865 ret = vgasr_priv.handler->switchto(client_id); 866 mutex_unlock(&vgasr_priv.mux_hw_lock); 867 goto out; 868 } 869 870 if (client->active) 871 goto out; 872 873 /* okay we want a switch - test if devices are willing to switch */ 874 can_switch = check_can_switch(); 875 876 if (can_switch == false && delay == false) 877 goto out; 878 879 if (can_switch) { 880 ret = vga_switchto_stage1(client); 881 if (ret) 882 pr_err("switching failed stage 1 %d\n", ret); 883 884 ret = vga_switchto_stage2(client); 885 if (ret) 886 pr_err("switching failed stage 2 %d\n", ret); 887 888 } else { 889 pr_info("setting delayed switch to client %d\n", client->id); 890 vgasr_priv.delayed_switch_active = true; 891 vgasr_priv.delayed_client_id = client_id; 892 893 ret = vga_switchto_stage1(client); 894 if (ret) 895 pr_err("delayed switching stage 1 failed %d\n", ret); 896 } 897 898 out: 899 mutex_unlock(&vgasr_mutex); 900 return cnt; 901 } 902 903 static const struct file_operations vga_switcheroo_debugfs_fops = { 904 .owner = THIS_MODULE, 905 .open = vga_switcheroo_debugfs_open, 906 .write = vga_switcheroo_debugfs_write, 907 .read = seq_read, 908 .llseek = seq_lseek, 909 .release = single_release, 910 }; 911 912 static void vga_switcheroo_debugfs_fini(struct vgasr_priv *priv) 913 { 914 debugfs_remove(priv->switch_file); 915 priv->switch_file = NULL; 916 917 debugfs_remove(priv->debugfs_root); 918 priv->debugfs_root = NULL; 919 } 920 921 static int vga_switcheroo_debugfs_init(struct vgasr_priv *priv) 922 { 923 static const char mp[] = "/sys/kernel/debug"; 924 925 /* already initialised */ 926 if (priv->debugfs_root) 927 return 0; 928 priv->debugfs_root = debugfs_create_dir("vgaswitcheroo", NULL); 929 930 if (!priv->debugfs_root) { 931 pr_err("Cannot create %s/vgaswitcheroo\n", mp); 932 goto fail; 933 } 934 935 priv->switch_file = debugfs_create_file("switch", 0644, 936 priv->debugfs_root, NULL, 937 &vga_switcheroo_debugfs_fops); 938 if (!priv->switch_file) { 939 pr_err("cannot create %s/vgaswitcheroo/switch\n", mp); 940 goto fail; 941 } 942 return 0; 943 fail: 944 vga_switcheroo_debugfs_fini(priv); 945 return -1; 946 } 947 948 /** 949 * vga_switcheroo_process_delayed_switch() - helper for delayed switching 950 * 951 * Process a delayed switch if one is pending. DRM drivers should call this 952 * from their ->lastclose callback. 953 * 954 * Return: 0 on success. -EINVAL if no delayed switch is pending, if the client 955 * has unregistered in the meantime or if there are other clients blocking the 956 * switch. If the actual switch fails, an error is reported and 0 is returned. 957 */ 958 int vga_switcheroo_process_delayed_switch(void) 959 { 960 struct vga_switcheroo_client *client; 961 int ret; 962 int err = -EINVAL; 963 964 mutex_lock(&vgasr_mutex); 965 if (!vgasr_priv.delayed_switch_active) 966 goto err; 967 968 pr_info("processing delayed switch to %d\n", 969 vgasr_priv.delayed_client_id); 970 971 client = find_client_from_id(&vgasr_priv.clients, 972 vgasr_priv.delayed_client_id); 973 if (!client || !check_can_switch()) 974 goto err; 975 976 ret = vga_switchto_stage2(client); 977 if (ret) 978 pr_err("delayed switching failed stage 2 %d\n", ret); 979 980 vgasr_priv.delayed_switch_active = false; 981 err = 0; 982 err: 983 mutex_unlock(&vgasr_mutex); 984 return err; 985 } 986 EXPORT_SYMBOL(vga_switcheroo_process_delayed_switch); 987 988 /** 989 * DOC: Driver power control 990 * 991 * In this mode of use, the discrete GPU automatically powers up and down at 992 * the discretion of the driver's runtime pm. On muxed machines, the user may 993 * still influence the muxer state by way of the debugfs interface, however 994 * the ON and OFF commands become a no-op for the discrete GPU. 995 * 996 * This mode is the default on Nvidia HybridPower/Optimus and ATI PowerXpress. 997 * Specifying nouveau.runpm=0, radeon.runpm=0 or amdgpu.runpm=0 on the kernel 998 * command line disables it. 999 * 1000 * After the GPU has been suspended, the handler needs to be called to cut 1001 * power to the GPU. Likewise it needs to reinstate power before the GPU 1002 * can resume. This is achieved by vga_switcheroo_init_domain_pm_ops(), 1003 * which augments the GPU's suspend/resume functions by the requisite 1004 * calls to the handler. 1005 * 1006 * When the audio device resumes, the GPU needs to be woken. This is achieved 1007 * by a PCI quirk which calls device_link_add() to declare a dependency on the 1008 * GPU. That way, the GPU is kept awake whenever and as long as the audio 1009 * device is in use. 1010 * 1011 * On muxed machines, if the mux is initially switched to the discrete GPU, 1012 * the user ends up with a black screen when the GPU powers down after boot. 1013 * As a workaround, the mux is forced to the integrated GPU on runtime suspend, 1014 * cf. https://bugs.freedesktop.org/show_bug.cgi?id=75917 1015 */ 1016 1017 static void vga_switcheroo_power_switch(struct pci_dev *pdev, 1018 enum vga_switcheroo_state state) 1019 { 1020 struct vga_switcheroo_client *client; 1021 1022 if (!vgasr_priv.handler->power_state) 1023 return; 1024 1025 client = find_client_from_pci(&vgasr_priv.clients, pdev); 1026 if (!client) 1027 return; 1028 1029 if (!client->driver_power_control) 1030 return; 1031 1032 vgasr_priv.handler->power_state(client->id, state); 1033 } 1034 1035 /* switcheroo power domain */ 1036 static int vga_switcheroo_runtime_suspend(struct device *dev) 1037 { 1038 struct pci_dev *pdev = to_pci_dev(dev); 1039 int ret; 1040 1041 ret = dev->bus->pm->runtime_suspend(dev); 1042 if (ret) 1043 return ret; 1044 mutex_lock(&vgasr_mutex); 1045 if (vgasr_priv.handler->switchto) { 1046 mutex_lock(&vgasr_priv.mux_hw_lock); 1047 vgasr_priv.handler->switchto(VGA_SWITCHEROO_IGD); 1048 mutex_unlock(&vgasr_priv.mux_hw_lock); 1049 } 1050 pci_bus_set_current_state(pdev->bus, PCI_D3cold); 1051 vga_switcheroo_power_switch(pdev, VGA_SWITCHEROO_OFF); 1052 mutex_unlock(&vgasr_mutex); 1053 return 0; 1054 } 1055 1056 static int vga_switcheroo_runtime_resume(struct device *dev) 1057 { 1058 struct pci_dev *pdev = to_pci_dev(dev); 1059 int ret; 1060 1061 mutex_lock(&vgasr_mutex); 1062 vga_switcheroo_power_switch(pdev, VGA_SWITCHEROO_ON); 1063 mutex_unlock(&vgasr_mutex); 1064 pci_wakeup_bus(pdev->bus); 1065 ret = dev->bus->pm->runtime_resume(dev); 1066 if (ret) 1067 return ret; 1068 1069 return 0; 1070 } 1071 1072 /** 1073 * vga_switcheroo_init_domain_pm_ops() - helper for driver power control 1074 * @dev: vga client device 1075 * @domain: power domain 1076 * 1077 * Helper for GPUs whose power state is controlled by the driver's runtime pm. 1078 * After the GPU has been suspended, the handler needs to be called to cut 1079 * power to the GPU. Likewise it needs to reinstate power before the GPU 1080 * can resume. To this end, this helper augments the suspend/resume functions 1081 * by the requisite calls to the handler. It needs only be called on platforms 1082 * where the power switch is separate to the device being powered down. 1083 */ 1084 int vga_switcheroo_init_domain_pm_ops(struct device *dev, 1085 struct dev_pm_domain *domain) 1086 { 1087 /* copy over all the bus versions */ 1088 if (dev->bus && dev->bus->pm) { 1089 domain->ops = *dev->bus->pm; 1090 domain->ops.runtime_suspend = vga_switcheroo_runtime_suspend; 1091 domain->ops.runtime_resume = vga_switcheroo_runtime_resume; 1092 1093 dev_pm_domain_set(dev, domain); 1094 return 0; 1095 } 1096 dev_pm_domain_set(dev, NULL); 1097 return -EINVAL; 1098 } 1099 EXPORT_SYMBOL(vga_switcheroo_init_domain_pm_ops); 1100 1101 void vga_switcheroo_fini_domain_pm_ops(struct device *dev) 1102 { 1103 dev_pm_domain_set(dev, NULL); 1104 } 1105 EXPORT_SYMBOL(vga_switcheroo_fini_domain_pm_ops); 1106