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