€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ&/translations/zh_CN/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/zh_TW/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/it_IT/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ja_JP/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ko_KR/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/pt_BR/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/sp_SP/gpu/vga-switcheroo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒtarget”“”)�”}”(hŒ.. _vga_switcheroo:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œvga-switcheroo”uh1hµh´Khhh²hh³Œ@/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo.rst”ubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒVGA Switcheroo”h]”hŒVGA Switcheroo”…”�”}”(hhËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhhÆh²hh³hÃh´KubhŒ paragraph”“”)�”}”(hŒ\vga_switcheroo is the Linux subsystem for laptop hybrid graphics. These come in two flavors:”h]”hŒ\vga_switcheroo is the Linux subsystem for laptop hybrid graphics. These come in two flavors:”…”�”}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œb/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:7: ./drivers/gpu/vga/vga_switcheroo.c”h´K/hhÆh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒHmuxed: Dual GPUs with a multiplexer chip to switch outputs between GPUs.”h]”hÚ)�”}”(hhóh]”hŒHmuxed: Dual GPUs with a multiplexer chip to switch outputs between GPUs.”…”�”}”(hhõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œb/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:7: ./drivers/gpu/vga/vga_switcheroo.c”h´K2hhñubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhhìubhð)�”}”(hŒÖmuxless: Dual GPUs but only one of them is connected to outputs. The other one is merely used to offload rendering, its results are copied over PCIe into the framebuffer. On Linux this is supported with DRI PRIME. ”h]”hÚ)�”}”(hŒÕmuxless: Dual GPUs but only one of them is connected to outputs. The other one is merely used to offload rendering, its results are copied over PCIe into the framebuffer. On Linux this is supported with DRI PRIME.”h]”hŒÕmuxless: Dual GPUs but only one of them is connected to outputs. The other one is merely used to offload rendering, its results are copied over PCIe into the framebuffer. On Linux this is supported with DRI PRIME.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œb/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:7: ./drivers/gpu/vga/vga_switcheroo.c”h´K3hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhhìubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1hêh³jh´K2hhÆh²hubhÚ)�”}”(hXHybrid graphics started to appear in the late Naughties and were initially all muxed. Newer laptops moved to a muxless architecture for cost reasons. A notable exception is the MacBook Pro which continues to use a mux. Muxes come with varying capabilities: Some switch only the panel, others can also switch external displays. Some switch all display pins at once while others can switch just the DDC lines. (To allow EDID probing for the inactive GPU.) Also, muxes are often used to cut power to the discrete GPU while it is not used.”h]”hXHybrid graphics started to appear in the late Naughties and were initially all muxed. Newer laptops moved to a muxless architecture for cost reasons. A notable exception is the MacBook Pro which continues to use a mux. Muxes come with varying capabilities: Some switch only the panel, others can also switch external displays. Some switch all display pins at once while others can switch just the DDC lines. (To allow EDID probing for the inactive GPU.) Also, muxes are often used to cut power to the discrete GPU while it is not used.”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œb/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:7: ./drivers/gpu/vga/vga_switcheroo.c”h´K8hhÆh²hubhÚ)�”}”(hXÏDRM drivers register GPUs with vga_switcheroo, these are henceforth called clients. The mux is called the handler. Muxless machines also register a handler to control the power state of the discrete GPU, its ->switchto callback is a no-op for obvious reasons. The discrete GPU is often equipped with an HDA controller for the HDMI/DP audio signal, this will also register as a client so that vga_switcheroo can take care of the correct suspend/resume order when changing the discrete GPU's power state. In total there can thus be up to three clients: Two vga clients (GPUs) and one audio client (on the discrete GPU). The code is mostly prepared to support machines with more than two GPUs should they become available.”h]”hXÑDRM drivers register GPUs with vga_switcheroo, these are henceforth called clients. The mux is called the handler. Muxless machines also register a handler to control the power state of the discrete GPU, its ->switchto callback is a no-op for obvious reasons. The discrete GPU is often equipped with an HDA controller for the HDMI/DP audio signal, this will also register as a client so that vga_switcheroo can take care of the correct suspend/resume order when changing the discrete GPU’s power state. In total there can thus be up to three clients: Two vga clients (GPUs) and one audio client (on the discrete GPU). The code is mostly prepared to support machines with more than two GPUs should they become available.”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œb/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:7: ./drivers/gpu/vga/vga_switcheroo.c”h´KAhhÆh²hubhÚ)�”}”(hXcThe GPU to which the outputs are currently switched is called the active client in vga_switcheroo parlance. The GPU not in use is the inactive client. When the inactive client's DRM driver is loaded, it will be unable to probe the panel's EDID and hence depends on VBIOS to provide its display modes. If the VBIOS modes are bogus or if there is no VBIOS at all (which is common on the MacBook Pro), a client may alternatively request that the DDC lines are temporarily switched to it, provided that the handler supports this. Switching only the DDC lines and not the entire output avoids unnecessary flickering.”h]”hXgThe GPU to which the outputs are currently switched is called the active client in vga_switcheroo parlance. The GPU not in use is the inactive client. When the inactive client’s DRM driver is loaded, it will be unable to probe the panel’s EDID and hence depends on VBIOS to provide its display modes. If the VBIOS modes are bogus or if there is no VBIOS at all (which is common on the MacBook Pro), a client may alternatively request that the DDC lines are temporarily switched to it, provided that the handler supports this. Switching only the DDC lines and not the entire output avoids unnecessary flickering.”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œb/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:7: ./drivers/gpu/vga/vga_switcheroo.c”h´KLhhÆh²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Modes of Use”h]”hŒ Modes of Use”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjWh²hh³hÃh´K ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ)Manual switching and manual power control”h]”hŒ)Manual switching and manual power control”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjhh²hh³hÃh´KubhÚ)�”}”(hX<In this mode of use, the file /sys/kernel/debug/vgaswitcheroo/switch can be read to retrieve the current vga_switcheroo state and commands can be written to it to change the state. The file appears as soon as two GPU drivers and one handler have registered with vga_switcheroo. The following commands are understood:”h]”hX<In this mode of use, the file /sys/kernel/debug/vgaswitcheroo/switch can be read to retrieve the current vga_switcheroo state and commands can be written to it to change the state. The file appears as soon as two GPU drivers and one handler have registered with vga_switcheroo. The following commands are understood:”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mahjhh²hubhë)�”}”(hhh]”(hð)�”}”(hŒ%OFF: Power off the device not in use.”h]”hÚ)�”}”(hj�h]”hŒ%OFF: Power off the device not in use.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mghj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hŒ#ON: Power on the device not in use.”h]”hÚ)�”}”(hj¥h]”hŒ#ON: Power on the device not in use.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hX|IGD: Switch to the integrated graphics device. Power on the integrated GPU if necessary, power off the discrete GPU. Prerequisite is that no user space processes (e.g. Xorg, alsactl) have opened device files of the GPUs or the audio client. If the switch fails, the user may invoke lsof(8) or fuser(1) on /dev/dri/ and /dev/snd/controlC1 to identify processes blocking the switch.”h]”hÚ)�”}”(hX|IGD: Switch to the integrated graphics device. Power on the integrated GPU if necessary, power off the discrete GPU. Prerequisite is that no user space processes (e.g. Xorg, alsactl) have opened device files of the GPUs or the audio client. If the switch fails, the user may invoke lsof(8) or fuser(1) on /dev/dri/ and /dev/snd/controlC1 to identify processes blocking the switch.”h]”hX|IGD: Switch to the integrated graphics device. Power on the integrated GPU if necessary, power off the discrete GPU. Prerequisite is that no user space processes (e.g. Xorg, alsactl) have opened device files of the GPUs or the audio client. If the switch fails, the user may invoke lsof(8) or fuser(1) on /dev/dri/ and /dev/snd/controlC1 to identify processes blocking the switch.”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mihj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hŒ,DIS: Switch to the discrete graphics device.”h]”hÚ)�”}”(hjÖh]”hŒ,DIS: Switch to the discrete graphics device.”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´MohjÔubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hŒ³DIGD: Delayed switch to the integrated graphics device. This will perform the switch once the last user space process has closed the device files of the GPUs and the audio client.”h]”hÚ)�”}”(hŒ³DIGD: Delayed switch to the integrated graphics device. This will perform the switch once the last user space process has closed the device files of the GPUs and the audio client.”h]”hŒ³DIGD: Delayed switch to the integrated graphics device. This will perform the switch once the last user space process has closed the device files of the GPUs and the audio client.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mphjìubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hŒ5DDIS: Delayed switch to the discrete graphics device.”h]”hÚ)�”}”(hjh]”hŒ5DDIS: Delayed switch to the discrete graphics device.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mshjubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hXDMIGD: Mux-only switch to the integrated graphics device. Does not remap console or change the power state of either gpu. If the integrated GPU is currently off, the screen will turn black. If it is on, the screen will show whatever happens to be in VRAM. Either way, the user has to blindly enter the command to switch back.”h]”hÚ)�”}”(hXDMIGD: Mux-only switch to the integrated graphics device. Does not remap console or change the power state of either gpu. If the integrated GPU is currently off, the screen will turn black. If it is on, the screen will show whatever happens to be in VRAM. Either way, the user has to blindly enter the command to switch back.”h]”hXDMIGD: Mux-only switch to the integrated graphics device. Does not remap console or change the power state of either gpu. If the integrated GPU is currently off, the screen will turn black. If it is on, the screen will show whatever happens to be in VRAM. Either way, the user has to blindly enter the command to switch back.”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Mthjubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubhð)�”}”(hŒ7MDIS: Mux-only switch to the discrete graphics device. ”h]”hÚ)�”}”(hŒ6MDIS: Mux-only switch to the discrete graphics device.”h]”hŒ6MDIS: Mux-only switch to the discrete graphics device.”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´Myhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjˆubeh}”(h]”h ]”h"]”h$]”h&]”j(j)uh1hêh³jœh´Mghjhh²hubhÚ)�”}”(hŒ|For GPUs whose power state is controlled by the driver's runtime pm, the ON and OFF commands are a no-op (see next section).”h]”hŒ~For GPUs whose power state is controlled by the driver’s runtime pm, the ON and OFF commands are a no-op (see next section).”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´M{hjhh²hubhÚ)�”}”(hŒWFor muxless machines, the IGD/DIS, DIGD/DDIS and MIGD/MDIS commands should not be used.”h]”hŒWFor muxless machines, the IGD/DIS, DIGD/DDIS and MIGD/MDIS commands should not be used.”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:16: ./drivers/gpu/vga/vga_switcheroo.c”h´M~hjhh²hubeh}”(h]”Œ)manual-switching-and-manual-power-control”ah ]”h"]”Œ)manual switching and manual power control”ah$]”h&]”uh1hÄhjWh²hh³hÃh´KubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒDriver power control”h]”hŒDriver power control”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj{h²hh³hÃh´KubhÚ)�”}”(hXIn this mode of use, the discrete GPU automatically powers up and down at the discretion of the driver's runtime pm. On muxed machines, the user may still influence the muxer state by way of the debugfs interface, however the ON and OFF commands become a no-op for the discrete GPU.”h]”hXIn this mode of use, the discrete GPU automatically powers up and down at the discretion of the driver’s runtime pm. On muxed machines, the user may still influence the muxer state by way of the debugfs interface, however the ON and OFF commands become a no-op for the discrete GPU.”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:22: ./drivers/gpu/vga/vga_switcheroo.c”h´MÆhj{h²hubhÚ)�”}”(hŒ°This mode is the default on Nvidia HybridPower/Optimus and ATI PowerXpress. Specifying nouveau.runpm=0, radeon.runpm=0 or amdgpu.runpm=0 on the kernel command line disables it.”h]”hŒ°This mode is the default on Nvidia HybridPower/Optimus and ATI PowerXpress. Specifying nouveau.runpm=0, radeon.runpm=0 or amdgpu.runpm=0 on the kernel command line disables it.”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:22: ./drivers/gpu/vga/vga_switcheroo.c”h´MËhj{h²hubhÚ)�”}”(hX+After the GPU has been suspended, the handler needs to be called to cut power to the GPU. Likewise it needs to reinstate power before the GPU can resume. This is achieved by vga_switcheroo_init_domain_pm_ops(), which augments the GPU's suspend/resume functions by the requisite calls to the handler.”h]”hX-After the GPU has been suspended, the handler needs to be called to cut power to the GPU. Likewise it needs to reinstate power before the GPU can resume. This is achieved by vga_switcheroo_init_domain_pm_ops(), which augments the GPU’s suspend/resume functions by the requisite calls to the handler.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:22: ./drivers/gpu/vga/vga_switcheroo.c”h´MÏhj{h²hubhÚ)�”}”(hŒïWhen the audio device resumes, the GPU needs to be woken. This is achieved by a PCI quirk which calls device_link_add() to declare a dependency on the GPU. That way, the GPU is kept awake whenever and as long as the audio device is in use.”h]”hŒïWhen the audio device resumes, the GPU needs to be woken. This is achieved by a PCI quirk which calls device_link_add() to declare a dependency on the GPU. That way, the GPU is kept awake whenever and as long as the audio device is in use.”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:22: ./drivers/gpu/vga/vga_switcheroo.c”h´MÕhj{h²hubhÚ)�”}”(hXOn muxed machines, if the mux is initially switched to the discrete GPU, the user ends up with a black screen when the GPU powers down after boot. As a workaround, the mux is forced to the integrated GPU on runtime suspend, cf. https://bugs.freedesktop.org/show_bug.cgi?id=75917”h]”(hŒäOn muxed machines, if the mux is initially switched to the discrete GPU, the user ends up with a black screen when the GPU powers down after boot. As a workaround, the mux is forced to the integrated GPU on runtime suspend, cf. ”…”�”}”(hjÈh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ2https://bugs.freedesktop.org/show_bug.cgi?id=75917”h]”hŒ2https://bugs.freedesktop.org/show_bug.cgi?id=75917”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÔuh1jÐhjÈubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:22: ./drivers/gpu/vga/vga_switcheroo.c”h´MÚhj{h²hubeh}”(h]”Œdriver-power-control”ah ]”h"]”Œdriver power control”ah$]”h&]”uh1hÄhjWh²hh³hÃh´Kubeh}”(h]”Œ modes-of-use”ah ]”h"]”Œ modes of use”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAPI”h]”hŒAPI”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjøh²hh³hÃh´KubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒPublic functions”h]”hŒPublic functions”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj h²hh³hÃh´KubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œ,vga_switcheroo_register_handler (C function)”Œ!c.vga_switcheroo_register_handler”hNt”auh1jhj h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ…int vga_switcheroo_register_handler (const struct vga_switcheroo_handler *handler, enum vga_switcheroo_handler_flags_t handler_flags)”h]”hŒdesc_signature_line”“”)�”}”(hŒ„int vga_switcheroo_register_handler(const struct vga_switcheroo_handler *handler, enum vga_switcheroo_handler_flags_t handler_flags)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1j<hj8h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KàubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jNhj8h²hh³jMh´KàubhŒ desc_name”“”)�”}”(hŒvga_switcheroo_register_handler”h]”hŒ desc_sig_name”“”)�”}”(hŒvga_switcheroo_register_handler”h]”hŒvga_switcheroo_register_handler”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jehjaubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j_hj8h²hh³jMh´KàubhŒdesc_parameterlist”“”)�”}”(hŒa(const struct vga_switcheroo_handler *handler, enum vga_switcheroo_handler_flags_t handler_flags)”h]”(hŒdesc_parameter”“”)�”}”(hŒ,const struct vga_switcheroo_handler *handler”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒconst”h]”hŒconst”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jŒhjˆubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjˆubj�)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjˆubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjˆubh)�”}”(hhh]”jf)�”}”(hŒvga_switcheroo_handler”h]”hŒvga_switcheroo_handler”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjÇubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”Œc”Œreftype”Œ identifier”Œ reftarget”jÌŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”jæŒ ASTIdentifier”“”)�”}”jájisbŒ!c.vga_switcheroo_register_handler”†”asbuh1hhjˆubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjˆubhŒdesc_sig_punctuation”“”)�”}”(hj)h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1jhjˆubjf)�”}”(hŒhandler”h]”hŒhandler”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjˆubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj‚ubj‡)�”}”(hŒ1enum vga_switcheroo_handler_flags_t handler_flags”h]”(j�)�”}”(hŒenum”h]”hŒenum”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj&ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj&ubh)�”}”(hhh]”jf)�”}”(hŒvga_switcheroo_handler_flags_t”h]”hŒvga_switcheroo_handler_flags_t”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjFubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jKŒmodname”NŒ classname”Njåjè)�”}”jë]”jïŒ!c.vga_switcheroo_register_handler”†”asbuh1hhj&ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj&ubjf)�”}”(hŒ handler_flags”h]”hŒ handler_flags”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj&ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj‚ubeh}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj8h²hh³jMh´Kàubeh}”(h]”h ]”h"]”h$]”h&]”j~jŒ add_permalink”ˆuh1j6Œsphinx_line_type”Œ declarator”hj2h²hh³jMh´Kàubah}”(h]”j)ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j0h³jMh´Kàhj-h²hubhŒ desc_content”“”)�”}”(hhh]”hÚ)�”}”(hŒregister handler”h]”hŒregister handler”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Kàhj¦h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj-h²hh³jMh´Kàubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”Œdomain”jߌobjtype”jÁŒdesctype”jÁŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j+h²hhj h³Nh´NubhŒ container”“”)�”}”(hXI**Parameters** ``const struct vga_switcheroo_handler *handler`` handler callbacks ``enum vga_switcheroo_handler_flags_t handler_flags`` handler flags **Description** Register handler. Enable vga_switcheroo if two vga clients have already registered. **Return** 0 on success, -EINVAL if a handler was already registered.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hjÓh]”hŒ Parameters”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KähjÍubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒC``const struct vga_switcheroo_handler *handler`` handler callbacks ”h]”(hŒterm”“”)�”}”(hŒ0``const struct vga_switcheroo_handler *handler``”h]”hŒliteral”“”)�”}”(hjúh]”hŒ,const struct vga_switcheroo_handler *handler”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KáhjòubhŒ definition”“”)�”}”(hhh]”hÚ)�”}”(hŒhandler callbacks”h]”hŒhandler callbacks”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jh´Káhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjòubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jh´Káhjíubjñ)�”}”(hŒD``enum vga_switcheroo_handler_flags_t handler_flags`` handler flags ”h]”(j÷)�”}”(hŒ5``enum vga_switcheroo_handler_flags_t handler_flags``”h]”jý)�”}”(hj7h]”hŒ1enum vga_switcheroo_handler_flags_t handler_flags”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Kâhj1ubj)�”}”(hhh]”hÚ)�”}”(hŒ handler flags”h]”hŒ handler flags”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jLh´KâhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jLh´Kâhjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhjÍubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjrh]”hŒ Description”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KähjÍubhÚ)�”}”(hŒSRegister handler. Enable vga_switcheroo if two vga clients have already registered.”h]”hŒSRegister handler. Enable vga_switcheroo if two vga clients have already registered.”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KãhjÍubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hj™h]”hŒReturn”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KæhjÍubhÚ)�”}”(hŒ:0 on success, -EINVAL if a handler was already registered.”h]”hŒ:0 on success, -EINVAL if a handler was already registered.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KçhjÍubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ.vga_switcheroo_unregister_handler (C function)”Œ#c.vga_switcheroo_unregister_handler”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ-void vga_switcheroo_unregister_handler (void)”h]”j7)�”}”(hŒ,void vga_switcheroo_unregister_handler(void)”h]”(j=)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjÚh²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KÿubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjÚh²hh³jìh´Kÿubj`)�”}”(hŒ!vga_switcheroo_unregister_handler”h]”jf)�”}”(hŒ!vga_switcheroo_unregister_handler”h]”hŒ!vga_switcheroo_unregister_handler”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjûubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjÚh²hh³jìh´Kÿubj�)�”}”(hŒ(void)”h]”j‡)�”}”(hŒvoid”h]”j=)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hjÚh²hh³jìh´Kÿubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjÖh²hh³jìh´Kÿubah}”(h]”jÑah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jìh´KÿhjÓh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒunregister handler”h]”hŒunregister handler”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KÿhjBh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÓh²hh³jìh´Kÿubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj]jÇj]jȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hŒe**Parameters** ``void`` no arguments **Description** Unregister handler. Disable vga_switcheroo.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hjgh]”hŒ Parameters”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjeubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhjaubjì)�”}”(hhh]”jñ)�”}”(hŒ``void`` no arguments ”h]”(j÷)�”}”(hŒ``void``”h]”jý)�”}”(hj†h]”hŒvoid”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Khj€ubj)�”}”(hhh]”hÚ)�”}”(hŒ no arguments”h]”hŒ no arguments”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j›h´Khjœubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj€ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j›h´Khj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjaubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjÁh]”hŒ Description”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KhjaubhÚ)�”}”(hŒ+Unregister handler. Disable vga_switcheroo.”h]”hŒ+Unregister handler. Disable vga_switcheroo.”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhjaubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ)vga_switcheroo_handler_flags (C function)”Œc.vga_switcheroo_handler_flags”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒGenum vga_switcheroo_handler_flags_t vga_switcheroo_handler_flags (void)”h]”j7)�”}”(hŒFenum vga_switcheroo_handler_flags_t vga_switcheroo_handler_flags(void)”h]”(j�)�”}”(hj,h]”hŒenum”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjh²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjh²hh³jh´Mubh)�”}”(hhh]”jf)�”}”(hŒvga_switcheroo_handler_flags_t”h]”hŒvga_switcheroo_handler_flags_t”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj"ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j'Œmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jáŒvga_switcheroo_handler_flags”sbŒc.vga_switcheroo_handler_flags”†”asbuh1hhjh²hh³jh´MubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjh²hh³jh´Mubj`)�”}”(hŒvga_switcheroo_handler_flags”h]”jf)�”}”(hjCh]”hŒvga_switcheroo_handler_flags”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjTubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjh²hh³jh´Mubj�)�”}”(hŒ(void)”h]”j‡)�”}”(hŒvoid”h]”j=)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjoubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjkubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hjh²hh³jh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjþh²hh³jh´Mubah}”(h]”jùah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jh´Mhjûh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒobtain handler flags”h]”hŒobtain handler flags”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhjšh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjûh²hh³jh´Mubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆjµjÇjµjȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hŒï**Parameters** ``void`` no arguments **Description** Helper for clients to obtain the handler flags bitmask. **Return** Handler flags. A value of 0 means that no handler is registered or that the handler has no special capabilities.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj¿h]”hŒ Parameters”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj¹ubjì)�”}”(hhh]”jñ)�”}”(hŒ``void`` no arguments ”h]”(j÷)�”}”(hŒ``void``”h]”jý)�”}”(hjÞh]”hŒvoid”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´KhjØubj)�”}”(hhh]”hÚ)�”}”(hŒ no arguments”h]”hŒ no arguments”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jóh´Khjôubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjØubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jóh´KhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj¹ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Khj¹ubhÚ)�”}”(hŒ7Helper for clients to obtain the handler flags bitmask.”h]”hŒ7Helper for clients to obtain the handler flags bitmask.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj¹ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hj@h]”hŒReturn”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj¹ubhÚ)�”}”(hŒpHandler flags. A value of 0 means that no handler is registered or that the handler has no special capabilities.”h]”hŒpHandler flags. A value of 0 means that no handler is registered or that the handler has no special capabilities.”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj¹ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ+vga_switcheroo_register_client (C function)”Œ c.vga_switcheroo_register_client”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ�int vga_switcheroo_register_client (struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, bool driver_power_control)”h]”j7)�”}”(hŒ€int vga_switcheroo_register_client(struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, bool driver_power_control)”h]”(j=)�”}”(hŒint”h]”hŒint”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj�h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MDubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj�h²hh³j“h´MDubj`)�”}”(hŒvga_switcheroo_register_client”h]”jf)�”}”(hŒvga_switcheroo_register_client”h]”hŒvga_switcheroo_register_client”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj¢ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj�h²hh³j“h´MDubj�)�”}”(hŒ^(struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, bool driver_power_control)”h]”(j‡)�”}”(hŒstruct pci_dev *pdev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj¾ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj¾ubh)�”}”(hhh]”jf)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjÝubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jâŒmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jáj¨sbŒ c.vga_switcheroo_register_client”†”asbuh1hhj¾ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj¾ubj)�”}”(hj)h]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj¾ubjf)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj¾ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjºubj‡)�”}”(hŒ+const struct vga_switcheroo_client_ops *ops”h]”(j�)�”}”(hj�h]”hŒconst”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj0 ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjA h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj0 ubj�)�”}”(hj­h]”hŒstruct”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj0 ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj0 ubh)�”}”(hhh]”jf)�”}”(hŒvga_switcheroo_client_ops”h]”hŒvga_switcheroo_client_ops”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jo Œmodname”NŒ classname”Njåjè)�”}”jë]”jüŒ c.vga_switcheroo_register_client”†”asbuh1hhj0 ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj0 ubj)�”}”(hj)h]”hŒ*”…”�”}”(hj™ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj0 ubjf)�”}”(hŒops”h]”hŒops”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj0 ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjºubj‡)�”}”(hŒbool driver_power_control”h]”(j=)�”}”(hŒbool”h]”hŒbool”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj» ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj» ubjf)�”}”(hŒdriver_power_control”h]”hŒdriver_power_control”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj» ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjºubeh}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj�h²hh³j“h´MDubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj}h²hh³j“h´MDubah}”(h]”jxah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³j“h´MDhjzh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒregister vga client”h]”hŒregister vga client”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MDhj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjzh²hh³j“h´MDubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj jÇj jȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hX5**Parameters** ``struct pci_dev *pdev`` client pci device ``const struct vga_switcheroo_client_ops *ops`` client callbacks ``bool driver_power_control`` whether power state is controlled by the driver's runtime pm **Description** Register vga client (GPU). Enable vga_switcheroo if another GPU and a handler have already registered. The power state of the client is assumed to be ON. Beforehand, vga_switcheroo_client_probe_defer() shall be called to ensure that all prerequisites are met. **Return** 0 on success, -ENOMEM on memory allocation error.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj' h]”hŒ Parameters”…”�”}”(hj) h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj% ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MHhj! ubjì)�”}”(hhh]”(jñ)�”}”(hŒ+``struct pci_dev *pdev`` client pci device ”h]”(j÷)�”}”(hŒ``struct pci_dev *pdev``”h]”jý)�”}”(hjF h]”hŒstruct pci_dev *pdev”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjD ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MEhj@ ubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j[ h´MEhj\ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj@ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j[ h´MEhj= ubjñ)�”}”(hŒA``const struct vga_switcheroo_client_ops *ops`` client callbacks ”h]”(j÷)�”}”(hŒ/``const struct vga_switcheroo_client_ops *ops``”h]”jý)�”}”(hj h]”hŒ+const struct vga_switcheroo_client_ops *ops”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj} ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MFhjy ubj)�”}”(hhh]”hÚ)�”}”(hŒclient callbacks”h]”hŒclient callbacks”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j” h´MFhj• ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjy ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j” h´MFhj= ubjñ)�”}”(hŒ[``bool driver_power_control`` whether power state is controlled by the driver's runtime pm ”h]”(j÷)�”}”(hŒ``bool driver_power_control``”h]”jý)�”}”(hj¸ h]”hŒbool driver_power_control”…”�”}”(hjº h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj¶ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MHhj² ubj)�”}”(hhh]”hÚ)�”}”(hŒwhether power state is controlled by the driver’s runtime pm”…”�”}”(hjÑ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MGhjÎ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj² ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jÍ h´MHhj= ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj! ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjô h]”hŒ Description”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjò ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MJhj! ubhÚ)�”}”(hXRegister vga client (GPU). Enable vga_switcheroo if another GPU and a handler have already registered. The power state of the client is assumed to be ON. Beforehand, vga_switcheroo_client_probe_defer() shall be called to ensure that all prerequisites are met.”h]”hXRegister vga client (GPU). Enable vga_switcheroo if another GPU and a handler have already registered. The power state of the client is assumed to be ON. Beforehand, vga_switcheroo_client_probe_defer() shall be called to ensure that all prerequisites are met.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MIhj! ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hj h]”hŒReturn”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MNhj! ubhÚ)�”}”(hŒ10 on success, -ENOMEM on memory allocation error.”h]”hŒ10 on success, -ENOMEM on memory allocation error.”…”�”}”(hj1 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MOhj! ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ1vga_switcheroo_register_audio_client (C function)”Œ&c.vga_switcheroo_register_audio_client”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ…int vga_switcheroo_register_audio_client (struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, struct pci_dev *vga_dev)”h]”j7)�”}”(hŒ„int vga_switcheroo_register_audio_client(struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, struct pci_dev *vga_dev)”h]”(j=)�”}”(hŒint”h]”hŒint”…”�”}”(hj` h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj\ h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M\ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjo h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj\ h²hh³jn h´M\ubj`)�”}”(hŒ$vga_switcheroo_register_audio_client”h]”jf)�”}”(hŒ$vga_switcheroo_register_audio_client”h]”hŒ$vga_switcheroo_register_audio_client”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj} ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj\ h²hh³jn h´M\ubj�)�”}”(hŒ\(struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, struct pci_dev *vga_dev)”h]”(j‡)�”}”(hŒstruct pci_dev *pdev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj™ ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjª h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj™ ubh)�”}”(hhh]”jf)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj» h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj¸ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j½ Œmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jájƒ sbŒ&c.vga_switcheroo_register_audio_client”†”asbuh1hhj™ ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj™ ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj™ ubjf)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj™ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj• ubj‡)�”}”(hŒ+const struct vga_switcheroo_client_ops *ops”h]”(j�)�”}”(hj�h]”hŒconst”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj ubj�)�”}”(hj­h]”hŒstruct”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj ubh)�”}”(hhh]”jf)�”}”(hŒvga_switcheroo_client_ops”h]”hŒvga_switcheroo_client_ops”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjE ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jJ Œmodname”NŒ classname”Njåjè)�”}”jë]”j× Œ&c.vga_switcheroo_register_audio_client”†”asbuh1hhj ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjf h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjt h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj ubjf)�”}”(hŒops”h]”hŒops”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj• ubj‡)�”}”(hŒstruct pci_dev *vga_dev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj– ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj– ubh)�”}”(hhh]”jf)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj¸ h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjµ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jº Œmodname”NŒ classname”Njåjè)�”}”jë]”j× Œ&c.vga_switcheroo_register_audio_client”†”asbuh1hhj– ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj– ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjä h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj– ubjf)�”}”(hŒvga_dev”h]”hŒvga_dev”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj– ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj• ubeh}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj\ h²hh³jn h´M\ubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjX h²hh³jn h´M\ubah}”(h]”jS ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jn h´M\hjU h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒregister audio client”h]”hŒregister audio client”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M\hj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjU h²hh³jn h´M\ubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj3 jÇj3 jȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hX**Parameters** ``struct pci_dev *pdev`` client pci device ``const struct vga_switcheroo_client_ops *ops`` client callbacks ``struct pci_dev *vga_dev`` pci device which is bound to current audio client **Description** Register audio client (audio device on a GPU). The client is assumed to use runtime PM. Beforehand, vga_switcheroo_client_probe_defer() shall be called to ensure that all prerequisites are met. **Return** 0 on success, -ENOMEM on memory allocation error, -EINVAL on getting client id error.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj= h]”hŒ Parameters”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj; ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M`hj7 ubjì)�”}”(hhh]”(jñ)�”}”(hŒ+``struct pci_dev *pdev`` client pci device ”h]”(j÷)�”}”(hŒ``struct pci_dev *pdev``”h]”jý)�”}”(hj\ h]”hŒstruct pci_dev *pdev”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjZ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M]hjV ubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hju h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jq h´M]hjr ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjV ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jq h´M]hjS ubjñ)�”}”(hŒA``const struct vga_switcheroo_client_ops *ops`` client callbacks ”h]”(j÷)�”}”(hŒ/``const struct vga_switcheroo_client_ops *ops``”h]”jý)�”}”(hj• h]”hŒ+const struct vga_switcheroo_client_ops *ops”…”�”}”(hj— h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj“ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M^hj� ubj)�”}”(hhh]”hÚ)�”}”(hŒclient callbacks”h]”hŒclient callbacks”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jª h´M^hj« ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jª h´M^hjS ubjñ)�”}”(hŒN``struct pci_dev *vga_dev`` pci device which is bound to current audio client ”h]”(j÷)�”}”(hŒ``struct pci_dev *vga_dev``”h]”jý)�”}”(hjÎ h]”hŒstruct pci_dev *vga_dev”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÌ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M_hjÈ ubj)�”}”(hhh]”hÚ)�”}”(hŒ1pci device which is bound to current audio client”h]”hŒ1pci device which is bound to current audio client”…”�”}”(hjç h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jã h´M_hjä ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÈ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jã h´M_hjS ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj7 ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj h]”hŒ Description”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mahj7 ubhÚ)�”}”(hŒÁRegister audio client (audio device on a GPU). The client is assumed to use runtime PM. Beforehand, vga_switcheroo_client_probe_defer() shall be called to ensure that all prerequisites are met.”h]”hŒÁRegister audio client (audio device on a GPU). The client is assumed to use runtime PM. Beforehand, vga_switcheroo_client_probe_defer() shall be called to ensure that all prerequisites are met.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M`hj7 ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hj0h]”hŒReturn”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mdhj7 ubhÚ)�”}”(hŒU0 on success, -ENOMEM on memory allocation error, -EINVAL on getting client id error.”h]”hŒU0 on success, -ENOMEM on memory allocation error, -EINVAL on getting client id error.”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mehj7 ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ.vga_switcheroo_client_probe_defer (C function)”Œ#c.vga_switcheroo_client_probe_defer”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ=bool vga_switcheroo_client_probe_defer (struct pci_dev *pdev)”h]”j7)�”}”(hŒprobe callback and return ``-EPROBE_DEFER`` if it evaluates to ``true``. Thou shalt not register the client ere thou hast called this. **Return** ``true`` if probing should be deferred, otherwise ``false``.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hjVh]”hŒ Parameters”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjTubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M®hjPubjì)�”}”(hhh]”jñ)�”}”(hŒ+``struct pci_dev *pdev`` client pci device ”h]”(j÷)�”}”(hŒ``struct pci_dev *pdev``”h]”jý)�”}”(hjuh]”hŒstruct pci_dev *pdev”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M«hjoubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jŠh´M«hj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjoubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jŠh´M«hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjPubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj°h]”hŒ Description”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M­hjPubhÚ)�”}”(hXDetermine whether any prerequisites are not fulfilled to probe a given client. Drivers shall invoke this early on in their ->probe callback and return ``-EPROBE_DEFER`` if it evaluates to ``true``. Thou shalt not register the client ere thou hast called this.”h]”(hŒ—Determine whether any prerequisites are not fulfilled to probe a given client. Drivers shall invoke this early on in their ->probe callback and return ”…”�”}”(hjÆh²hh³Nh´Nubjý)�”}”(hŒ``-EPROBE_DEFER``”h]”hŒ -EPROBE_DEFER”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÆubhŒ if it evaluates to ”…”�”}”(hjÆh²hh³Nh´Nubjý)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÆubhŒ?. Thou shalt not register the client ere thou hast called this.”…”�”}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M¬hjPubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hjûh]”hŒReturn”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjùubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M±hjPubhÚ)�”}”(hŒ<``true`` if probing should be deferred, otherwise ``false``.”h]”(jý)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjubhŒ* if probing should be deferred, otherwise ”…”�”}”(hjh²hh³Nh´Nubjý)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjubhŒ.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M²hjPubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ,vga_switcheroo_get_client_state (C function)”Œ!c.vga_switcheroo_get_client_state”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒPenum vga_switcheroo_state vga_switcheroo_get_client_state (struct pci_dev *pdev)”h]”j7)�”}”(hŒOenum vga_switcheroo_state vga_switcheroo_get_client_state(struct pci_dev *pdev)”h]”(j�)�”}”(hj,h]”hŒenum”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj\h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MÒubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj\h²hh³jmh´MÒubh)�”}”(hhh]”jf)�”}”(hŒvga_switcheroo_state”h]”hŒvga_switcheroo_state”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj|ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j�Œmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jáŒvga_switcheroo_get_client_state”sbŒ!c.vga_switcheroo_get_client_state”†”asbuh1hhj\h²hh³jmh´MÒubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj\h²hh³jmh´MÒubj`)�”}”(hŒvga_switcheroo_get_client_state”h]”jf)�”}”(hj�h]”hŒvga_switcheroo_get_client_state”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj®ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj\h²hh³jmh´MÒubj�)�”}”(hŒ(struct pci_dev *pdev)”h]”j‡)�”}”(hŒstruct pci_dev *pdev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjÉubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjÉubh)�”}”(hhh]”jf)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjèubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jíŒmodname”NŒ classname”Njåjè)�”}”jë]”j›Œ!c.vga_switcheroo_get_client_state”†”asbuh1hhjÉubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjÉubj)�”}”(hj)h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjÉubjf)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjÉubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjÅubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj\h²hh³jmh´MÒubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjXh²hh³jmh´MÒubah}”(h]”jSah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jmh´MÒhjUh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒ$obtain power state of a given client”h]”hŒ$obtain power state of a given client”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MÒhjKh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjUh²hh³jmh´MÒubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆjfjÇjfjȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hŒØ**Parameters** ``struct pci_dev *pdev`` client pci device **Description** Obtain power state of a given client as seen from vga_switcheroo. The function is only called from hda_intel.c. **Return** Power state.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hjph]”hŒ Parameters”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjnubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MÖhjjubjì)�”}”(hhh]”jñ)�”}”(hŒ+``struct pci_dev *pdev`` client pci device ”h]”(j÷)�”}”(hŒ``struct pci_dev *pdev``”•#h]”jý)�”}”(hj�h]”hŒstruct pci_dev *pdev”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MÓhj‰ubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j¤h´MÓhj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j¤h´MÓhj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjjubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjÊh]”hŒ Description”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MÕhjjubhÚ)�”}”(hŒoObtain power state of a given client as seen from vga_switcheroo. The function is only called from hda_intel.c.”h]”hŒoObtain power state of a given client as seen from vga_switcheroo. The function is only called from hda_intel.c.”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MÔhjjubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hjñh]”hŒReturn”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjïubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M×hjjubhÚ)�”}”(hŒ Power state.”h]”hŒ Power state.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MØhjjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ-vga_switcheroo_unregister_client (C function)”Œ"c.vga_switcheroo_unregister_client”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j=h´Mhjubjñ)�”}”(hŒ%``struct fb_info *info`` framebuffer ”h]”(j÷)�”}”(hŒ``struct fb_info *info``”h]”jý)�”}”(hjah]”hŒstruct fb_info *info”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj[ubj)�”}”(hhh]”hÚ)�”}”(hŒ framebuffer”h]”hŒ framebuffer”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jvh´Mhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jvh´Mhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhjubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjœh]”hŒ Description”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M hjubhÚ)�”}”(hŒUSet framebuffer of a given client. The console will be remapped to this on switching.”h]”hŒUSet framebuffer of a given client. The console will be remapped to this on switching.”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M hjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ$vga_switcheroo_lock_ddc (C function)”Œc.vga_switcheroo_lock_ddc”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ2int vga_switcheroo_lock_ddc (struct pci_dev *pdev)”h]”j7)�”}”(hŒ1int vga_switcheroo_lock_ddc(struct pci_dev *pdev)”h]”(j=)�”}”(hŒint”h]”hŒint”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjÝh²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjÝh²hh³jïh´Mubj`)�”}”(hŒvga_switcheroo_lock_ddc”h]”jf)�”}”(hŒvga_switcheroo_lock_ddc”h]”hŒvga_switcheroo_lock_ddc”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjþubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjÝh²hh³jïh´Mubj�)�”}”(hŒ(struct pci_dev *pdev)”h]”j‡)�”}”(hŒstruct pci_dev *pdev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjubh)�”}”(hhh]”jf)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj9ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j>Œmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jájsbŒc.vga_switcheroo_lock_ddc”†”asbuh1hhjubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjubj)�”}”(hj)h]”hŒ*”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjubjf)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hjÝh²hh³jïh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjÙh²hh³jïh´Mubah}”(h]”jÔah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jïh´MhjÖh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒ.temporarily switch DDC lines to a given client”h]”hŒ.temporarily switch DDC lines to a given client”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhjžh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÖh²hh³jïh´Mubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj¹jÇj¹jȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hX„**Parameters** ``struct pci_dev *pdev`` client pci device **Description** Temporarily switch DDC lines to the client identified by **pdev** (but leave the outputs otherwise switched to where they are). This allows the inactive client to probe EDID. The DDC lines must afterwards be switched back by calling vga_switcheroo_unlock_ddc(), even if this function returns an error. **Return** Previous DDC owner on success or a negative int on error. Specifically, ``-ENODEV`` if no handler has registered or if the handler does not support switching the DDC lines. Also, a negative value returned by the handler is propagated back to the caller. The return value has merely an informational purpose for any caller which might be interested in it. It is acceptable to ignore the return value and simply rely on the result of the subsequent EDID probe, which will be ``NULL`` if DDC switching failed.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hjÃh]”hŒ Parameters”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj½ubjì)�”}”(hhh]”jñ)�”}”(hŒ+``struct pci_dev *pdev`` client pci device ”h]”(j÷)�”}”(hŒ``struct pci_dev *pdev``”h]”jý)�”}”(hjâh]”hŒstruct pci_dev *pdev”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MhjÜubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j÷h´Mhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÜubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j÷h´MhjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj½ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj½ubhÚ)�”}”(hX-Temporarily switch DDC lines to the client identified by **pdev** (but leave the outputs otherwise switched to where they are). This allows the inactive client to probe EDID. The DDC lines must afterwards be switched back by calling vga_switcheroo_unlock_ddc(), even if this function returns an error.”h]”(hŒ9Temporarily switch DDC lines to the client identified by ”…”�”}”(hj3h²hh³Nh´NubjÖ)�”}”(hŒ**pdev**”h]”hŒpdev”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj3ubhŒì (but leave the outputs otherwise switched to where they are). This allows the inactive client to probe EDID. The DDC lines must afterwards be switched back by calling vga_switcheroo_unlock_ddc(), even if this function returns an error.”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj½ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hjVh]”hŒReturn”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjTubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M#hj½ubhÚ)�”}”(hXúPrevious DDC owner on success or a negative int on error. Specifically, ``-ENODEV`` if no handler has registered or if the handler does not support switching the DDC lines. Also, a negative value returned by the handler is propagated back to the caller. The return value has merely an informational purpose for any caller which might be interested in it. It is acceptable to ignore the return value and simply rely on the result of the subsequent EDID probe, which will be ``NULL`` if DDC switching failed.”h]”(hŒHPrevious DDC owner on success or a negative int on error. Specifically, ”…”�”}”(hjlh²hh³Nh´Nubjý)�”}”(hŒ ``-ENODEV``”h]”hŒ-ENODEV”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjlubhX† if no handler has registered or if the handler does not support switching the DDC lines. Also, a negative value returned by the handler is propagated back to the caller. The return value has merely an informational purpose for any caller which might be interested in it. It is acceptable to ignore the return value and simply rely on the result of the subsequent EDID probe, which will be ”…”�”}”(hjlh²hh³Nh´Nubjý)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjlubhŒ if DDC switching failed.”…”�”}”(hjlh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M$hj½ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ&vga_switcheroo_unlock_ddc (C function)”Œc.vga_switcheroo_unlock_ddc”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ4int vga_switcheroo_unlock_ddc (struct pci_dev *pdev)”h]”j7)�”}”(hŒ3int vga_switcheroo_unlock_ddc(struct pci_dev *pdev)”h]”(j=)�”}”(hŒint”h]”hŒint”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj»h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M>ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj»h²hh³jÍh´M>ubj`)�”}”(hŒvga_switcheroo_unlock_ddc”h]”jf)�”}”(hŒvga_switcheroo_unlock_ddc”h]”hŒvga_switcheroo_unlock_ddc”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjÜubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj»h²hh³jÍh´M>ubj�)�”}”(hŒ(struct pci_dev *pdev)”h]”j‡)�”}”(hŒstruct pci_dev *pdev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjøubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjøubh)�”}”(hhh]”jf)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jŒmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jájâsbŒc.vga_switcheroo_unlock_ddc”†”asbuh1hhjøubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjøubj)�”}”(hj)h]”hŒ*”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjøubjf)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjøubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjôubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj»h²hh³jÍh´M>ubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj·h²hh³jÍh´M>ubah}”(h]”j²ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jÍh´M>hj´h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒ'switch DDC lines back to previous owner”h]”hŒ'switch DDC lines back to previous owner”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M>hj|h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj´h²hh³jÍh´M>ubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj—jÇj—jȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hXŸ**Parameters** ``struct pci_dev *pdev`` client pci device **Description** Switch DDC lines back to the previous owner after calling vga_switcheroo_lock_ddc(). This must be called even if vga_switcheroo_lock_ddc() returned an error. **Return** Previous DDC owner on success (i.e. the client identifier of **pdev**) or a negative int on error. Specifically, ``-ENODEV`` if no handler has registered or if the handler does not support switching the DDC lines. Also, a negative value returned by the handler is propagated back to the caller. Finally, invoking this function without calling vga_switcheroo_lock_ddc() first is not allowed and will result in ``-EINVAL``.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj¡h]”hŒ Parameters”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MBhj›ubjì)�”}”(hhh]”jñ)�”}”(hŒ+``struct pci_dev *pdev`` client pci device ”h]”(j÷)�”}”(hŒ``struct pci_dev *pdev``”h]”jý)�”}”(hjÀh]”hŒstruct pci_dev *pdev”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M?hjºubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jÕh´M?hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjºubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jÕh´M?hj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj›ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjûh]”hŒ Description”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjùubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MAhj›ubhÚ)�”}”(hŒ�Switch DDC lines back to the previous owner after calling vga_switcheroo_lock_ddc(). This must be called even if vga_switcheroo_lock_ddc() returned an error.”h]”hŒ�Switch DDC lines back to the previous owner after calling vga_switcheroo_lock_ddc(). This must be called even if vga_switcheroo_lock_ddc() returned an error.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M@hj›ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hj"h]”hŒReturn”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MDhj›ubhÚ)�”}”(hX¥Previous DDC owner on success (i.e. the client identifier of **pdev**) or a negative int on error. Specifically, ``-ENODEV`` if no handler has registered or if the handler does not support switching the DDC lines. Also, a negative value returned by the handler is propagated back to the caller. Finally, invoking this function without calling vga_switcheroo_lock_ddc() first is not allowed and will result in ``-EINVAL``.”h]”(hŒ=Previous DDC owner on success (i.e. the client identifier of ”…”�”}”(hj8h²hh³Nh´NubjÖ)�”}”(hŒ**pdev**”h]”hŒpdev”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj8ubhŒ,) or a negative int on error. Specifically, ”…”�”}”(hj8h²hh³Nh´Nubjý)�”}”(hŒ ``-ENODEV``”h]”hŒ-ENODEV”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj8ubhX if no handler has registered or if the handler does not support switching the DDC lines. Also, a negative value returned by the handler is propagated back to the caller. Finally, invoking this function without calling vga_switcheroo_lock_ddc() first is not allowed and will result in ”…”�”}”(hj8h²hh³Nh´Nubjý)�”}”(hŒ ``-EINVAL``”h]”hŒ-EINVAL”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj8ubhŒ.”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MEhj›ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ2vga_switcheroo_process_delayed_switch (C function)”Œ'c.vga_switcheroo_process_delayed_switch”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ0int vga_switcheroo_process_delayed_switch (void)”h]”j7)�”}”(hŒ/int vga_switcheroo_process_delayed_switch(void)”h]”(j=)�”}”(hŒint”h]”hŒint”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj™h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MŸubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj™h²hh³j«h´MŸubj`)�”}”(hŒ%vga_switcheroo_process_delayed_switch”h]”jf)�”}”(hŒ%vga_switcheroo_process_delayed_switch”h]”hŒ%vga_switcheroo_process_delayed_switch”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjºubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj™h²hh³j«h´MŸubj�)�”}”(hŒ(void)”h]”j‡)�”}”(hŒvoid”h]”j=)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjÖubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hjÒubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj™h²hh³j«h´MŸubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj•h²hh³j«h´MŸubah}”(h]”j�ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³j«h´MŸhj’h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒhelper for delayed switching”h]”hŒhelper for delayed switching”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MŸhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj’h²hh³j«h´MŸubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆjjÇjjȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hXO**Parameters** ``void`` no arguments **Description** Process a delayed switch if one is pending. **Return** 0 on success. -EINVAL if no delayed switch is pending, if the client has unregistered in the meantime or if there are other clients blocking the switch. If the actual switch fails, an error is reported and 0 is returned.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj&h]”hŒ Parameters”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M£hj ubjì)�”}”(hhh]”jñ)�”}”(hŒ``void`` no arguments ”h]”(j÷)�”}”(hŒ``void``”h]”jý)�”}”(hjEh]”hŒvoid”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Khj?ubj)�”}”(hhh]”hÚ)�”}”(hŒ no arguments”h]”hŒ no arguments”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jZh´Khj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj?ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jZh´Khj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj€h]”hŒ Description”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Khj ubhÚ)�”}”(hŒ+Process a delayed switch if one is pending.”h]”hŒ+Process a delayed switch if one is pending.”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M hj ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hj§h]”hŒReturn”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M¢hj ubhÚ)�”}”(hŒÜ0 on success. -EINVAL if no delayed switch is pending, if the client has unregistered in the meantime or if there are other clients blocking the switch. If the actual switch fails, an error is reported and 0 is returned.”h]”hŒÜ0 on success. -EINVAL if no delayed switch is pending, if the client has unregistered in the meantime or if there are other clients blocking the switch. If the actual switch fails, an error is reported and 0 is returned.”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´M£hj ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ.vga_switcheroo_init_domain_pm_ops (C function)”Œ#c.vga_switcheroo_init_domain_pm_ops”hNt”auh1jhj h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒXint vga_switcheroo_init_domain_pm_ops (struct device *dev, struct dev_pm_domain *domain)”h]”j7)�”}”(hŒWint vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain)”h]”(j=)�”}”(hŒint”h]”hŒint”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjèh²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjèh²hh³júh´Mubj`)�”}”(hŒ!vga_switcheroo_init_domain_pm_ops”h]”jf)�”}”(hŒ!vga_switcheroo_init_domain_pm_ops”h]”hŒ!vga_switcheroo_init_domain_pm_ops”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjèh²hh³júh´Mubj�)�”}”(hŒ2(struct device *dev, struct dev_pm_domain *domain)”h]”(j‡)�”}”(hŒstruct device *dev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj%ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj%ubh)�”}”(hhh]”jf)�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjDubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”jIŒmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jájsbŒ#c.vga_switcheroo_init_domain_pm_ops”†”asbuh1hhj%ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj%ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj%ubjf)�”}”(hŒdev”h]”hŒdev”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj!ubj‡)�”}”(hŒstruct dev_pm_domain *domain”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj—ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj—ubh)�”}”(hhh]”jf)�”}”(hŒ dev_pm_domain”h]”hŒ dev_pm_domain”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj¶ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j»Œmodname”NŒ classname”Njåjè)�”}”jë]”jcŒ#c.vga_switcheroo_init_domain_pm_ops”†”asbuh1hhj—ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj—ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj—ubjf)�”}”(hŒdomain”h]”hŒdomain”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj—ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj!ubeh}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hjèh²hh³júh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjäh²hh³júh´Mubah}”(h]”jßah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³júh´Mhjáh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒhelper for driver power control”h]”hŒhelper for driver power control”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjáh²hh³júh´Mubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj4jÇj4jȉjɉjʉuh1j+h²hhj h³Nh´NubjÌ)�”}”(hX3**Parameters** ``struct device *dev`` vga client device ``struct dev_pm_domain *domain`` power domain **Description** Helper for GPUs whose power state is controlled by the driver's runtime pm. After the GPU has been suspended, the handler needs to be called to cut power to the GPU. Likewise it needs to reinstate power before the GPU can resume. To this end, this helper augments the suspend/resume functions by the requisite calls to the handler. It needs only be called on platforms where the power switch is separate to the device being powered down.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj>h]”hŒ Parameters”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj8ubjì)�”}”(hhh]”(jñ)�”}”(hŒ)``struct device *dev`` vga client device ”h]”(j÷)�”}”(hŒ``struct device *dev``”h]”jý)�”}”(hj]h]”hŒstruct device *dev”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´MhjWubj)�”}”(hhh]”hÚ)�”}”(hŒvga client device”h]”hŒvga client device”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jrh´Mhjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjWubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jrh´MhjTubjñ)�”}”(hŒ.``struct dev_pm_domain *domain`` power domain ”h]”(j÷)�”}”(hŒ ``struct dev_pm_domain *domain``”h]”jý)�”}”(hj–h]”hŒstruct dev_pm_domain *domain”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj�ubj)�”}”(hhh]”hÚ)�”}”(hŒ power domain”h]”hŒ power domain”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j«h´Mhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j«h´MhjTubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj8ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjÑh]”hŒ Description”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj8ubhÚ)�”}”(hXµHelper for GPUs whose power state is controlled by the driver's runtime pm. After the GPU has been suspended, the handler needs to be called to cut power to the GPU. Likewise it needs to reinstate power before the GPU can resume. To this end, this helper augments the suspend/resume functions by the requisite calls to the handler. It needs only be called on platforms where the power switch is separate to the device being powered down.”h]”hX·Helper for GPUs whose power state is controlled by the driver’s runtime pm. After the GPU has been suspended, the handler needs to be called to cut power to the GPU. Likewise it needs to reinstate power before the GPU can resume. To this end, this helper augments the suspend/resume functions by the requisite calls to the handler. It needs only be called on platforms where the power switch is separate to the device being powered down.”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:31: ./drivers/gpu/vga/vga_switcheroo.c”h´Mhj8ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj h²hh³Nh´Nubeh}”(h]”Œpublic-functions”ah ]”h"]”h$]”Œpublic functions”ah&]”uh1hÄhjøh²hh³hÃh´KŒ referenced”KubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒPublic structures”h]”hŒPublic structures”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjh²hh³hÃh´K#ubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ!vga_switcheroo_handler (C struct)”Œc.vga_switcheroo_handler”hNt”auh1jhjh²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒvga_switcheroo_handler”h]”j7)�”}”(hŒstruct vga_switcheroo_handler”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj-h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj-h²hh³j>h´Kubj`)�”}”(hŒvga_switcheroo_handler”h]”jf)�”}”(hj+h]”hŒvga_switcheroo_handler”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjMubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj-h²hh³j>h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj)h²hh³j>h´Kubah}”(h]”j#ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³j>h´Khj&h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒhandler callbacks”h]”hŒhandler callbacks”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´K^hjph²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj&h²hh³j>h´Kubeh}”(h]”h ]”(jߌstruct”eh"]”h$]”h&]”jÅjßjÆj‹jÇj‹jȉjɉjʉuh1j+h²hhjh³j%h´NubjÌ)�”}”(hXä**Definition**:: struct vga_switcheroo_handler { int (*init)(void); int (*switchto)(enum vga_switcheroo_client_id id); int (*switch_ddc)(enum vga_switcheroo_client_id id); int (*power_state)(enum vga_switcheroo_client_id id, enum vga_switcheroo_state state); enum vga_switcheroo_client_id (*get_client_id)(struct pci_dev *pdev); }; **Members** ``init`` initialize handler. Optional. This gets called when vga_switcheroo is enabled, i.e. when two vga clients have registered. It allows the handler to perform some delayed initialization that depends on the existence of the vga clients. Currently only the radeon and amdgpu drivers use this. The return value is ignored ``switchto`` switch outputs to given client. Mandatory. For muxless machines this should be a no-op. Returning 0 denotes success, anything else failure (in which case the switch is aborted) ``switch_ddc`` switch DDC lines to given client. Optional. Should return the previous DDC owner on success or a negative int on failure ``power_state`` cut or reinstate power of given client. Optional. The return value is ignored ``get_client_id`` determine if given pci device is integrated or discrete GPU. Mandatory”h]”(hÚ)�”}”(hŒ**Definition**::”h]”(jÖ)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj“ubhŒ:”…”�”}”(hj“h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kbhj�ubhŒ literal_block”“”)�”}”(hXNstruct vga_switcheroo_handler { int (*init)(void); int (*switchto)(enum vga_switcheroo_client_id id); int (*switch_ddc)(enum vga_switcheroo_client_id id); int (*power_state)(enum vga_switcheroo_client_id id, enum vga_switcheroo_state state); enum vga_switcheroo_client_id (*get_client_id)(struct pci_dev *pdev); };”h]”hXNstruct vga_switcheroo_handler { int (*init)(void); int (*switchto)(enum vga_switcheroo_client_id id); int (*switch_ddc)(enum vga_switcheroo_client_id id); int (*power_state)(enum vga_switcheroo_client_id id, enum vga_switcheroo_state state); enum vga_switcheroo_client_id (*get_client_id)(struct pci_dev *pdev); };”…”�”}”hj²sbah}”(h]”h ]”h"]”h$]”h&]”j~juh1j°h³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kdhj�ubhÚ)�”}”(hŒ **Members**”h]”jÖ)�”}”(hjÃh]”hŒMembers”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Klhj�ubjì)�”}”(hhh]”(jñ)�”}”(hXE``init`` initialize handler. Optional. This gets called when vga_switcheroo is enabled, i.e. when two vga clients have registered. It allows the handler to perform some delayed initialization that depends on the existence of the vga clients. Currently only the radeon and amdgpu drivers use this. The return value is ignored ”h]”(j÷)�”}”(hŒ``init``”h]”jý)�”}”(hjâh]”hŒinit”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´KehjÜubj)�”}”(hhh]”hÚ)�”}”(hX;initialize handler. Optional. This gets called when vga_switcheroo is enabled, i.e. when two vga clients have registered. It allows the handler to perform some delayed initialization that depends on the existence of the vga clients. Currently only the radeon and amdgpu drivers use this. The return value is ignored”h]”hX;initialize handler. Optional. This gets called when vga_switcheroo is enabled, i.e. when two vga clients have registered. It allows the handler to perform some delayed initialization that depends on the existence of the vga clients. Currently only the radeon and amdgpu drivers use this. The return value is ignored”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´K`hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÜubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j÷h´KehjÙubjñ)�”}”(hŒ¾``switchto`` switch outputs to given client. Mandatory. For muxless machines this should be a no-op. Returning 0 denotes success, anything else failure (in which case the switch is aborted) ”h]”(j÷)�”}”(hŒ ``switchto``”h]”jý)�”}”(hjh]”hŒswitchto”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kihjubj)�”}”(hhh]”hÚ)�”}”(hŒ°switch outputs to given client. Mandatory. For muxless machines this should be a no-op. Returning 0 denotes success, anything else failure (in which case the switch is aborted)”h]”hŒ°switch outputs to given client. Mandatory. For muxless machines this should be a no-op. Returning 0 denotes success, anything else failure (in which case the switch is aborted)”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kfhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j1h´KihjÙubjñ)�”}”(hŒˆ``switch_ddc`` switch DDC lines to given client. Optional. Should return the previous DDC owner on success or a negative int on failure ”h]”(j÷)�”}”(hŒ``switch_ddc``”h]”jý)�”}”(hjVh]”hŒ switch_ddc”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjTubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´KlhjPubj)�”}”(hhh]”hÚ)�”}”(hŒxswitch DDC lines to given client. Optional. Should return the previous DDC owner on success or a negative int on failure”h]”hŒxswitch DDC lines to given client. Optional. Should return the previous DDC owner on success or a negative int on failure”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kjhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jkh´KlhjÙubjñ)�”}”(hŒ^``power_state`` cut or reinstate power of given client. Optional. The return value is ignored ”h]”(j÷)�”}”(hŒ``power_state``”h]”jý)�”}”(hj�h]”hŒ power_state”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´KnhjŠubj)�”}”(hhh]”hÚ)�”}”(hŒMcut or reinstate power of given client. Optional. The return value is ignored”h]”hŒMcut or reinstate power of given client. Optional. The return value is ignored”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kmhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j¥h´KnhjÙubjñ)�”}”(hŒX``get_client_id`` determine if given pci device is integrated or discrete GPU. Mandatory”h]”(j÷)�”}”(hŒ``get_client_id``”h]”jý)�”}”(hjÊh]”hŒ get_client_id”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´KohjÄubj)�”}”(hhh]”hÚ)�”}”(hŒFdetermine if given pci device is integrated or discrete GPU. Mandatory”h]”hŒFdetermine if given pci device is integrated or discrete GPU. Mandatory”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jßh´Kohjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jßh´KohjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj�ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhjh²hh³j%h´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj h]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kshjh²hubhÚ)�”}”(hŒ‡Handler callbacks. The multiplexer itself. The **switchto** and **get_client_id** methods are mandatory, all others may be set to NULL.”h]”(hŒ/Handler callbacks. The multiplexer itself. The ”…”�”}”(hj"h²hh³Nh´NubjÖ)�”}”(hŒ **switchto**”h]”hŒswitchto”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj"ubhŒ and ”…”�”}”(hj"h²hh³Nh´NubjÖ)�”}”(hŒ**get_client_id**”h]”hŒ get_client_id”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj"ubhŒ6 methods are mandatory, all others may be set to NULL.”…”�”}”(hj"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:37: ./include/linux/vga_switcheroo.h”h´Kphjh²hubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ$vga_switcheroo_client_ops (C struct)”Œc.vga_switcheroo_client_ops”hNt”auh1jhjh²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒvga_switcheroo_client_ops”h]”j7)�”}”(hŒ struct vga_switcheroo_client_ops”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjkh²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjkh²hh³j|h´Kubj`)�”}”(hŒvga_switcheroo_client_ops”h]”jf)�”}”(hjih]”hŒvga_switcheroo_client_ops”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj‹ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjkh²hh³j|h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjgh²hh³j|h´Kubah}”(h]”jaah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³j|h´Khjdh²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒclient callbacks”h]”hŒclient callbacks”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K~hj®h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjdh²hh³j|h´Kubeh}”(h]”h ]”(jߌstruct”eh"]”h$]”h&]”jÅjßjÆjÉjÇjÉjȉjɉjʉuh1j+h²hhjh³jch´NubjÌ)�”}”(hXM**Definition**:: struct vga_switcheroo_client_ops { void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state); void (*reprobe)(struct pci_dev *dev); bool (*can_switch)(struct pci_dev *dev); void (*gpu_bound)(struct pci_dev *dev, enum vga_switcheroo_client_id); }; **Members** ``set_gpu_state`` do the equivalent of suspend/resume for the card. Mandatory. This should not cut power to the discrete GPU, which is the job of the handler ``reprobe`` poll outputs. Optional. This gets called after waking the GPU and switching the outputs to it ``can_switch`` check if the device is in a position to switch now. Mandatory. The client should return false if a user space process has one of its device files open ``gpu_bound`` notify the client id to audio client when the GPU is bound.”h]”(hÚ)�”}”(hŒ**Definition**::”h]”(jÖ)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÑubhŒ:”…”�”}”(hjÑh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K‚hjÍubj±)�”}”(hXstruct vga_switcheroo_client_ops { void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state); void (*reprobe)(struct pci_dev *dev); bool (*can_switch)(struct pci_dev *dev); void (*gpu_bound)(struct pci_dev *dev, enum vga_switcheroo_client_id); };”h]”hXstruct vga_switcheroo_client_ops { void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state); void (*reprobe)(struct pci_dev *dev); bool (*can_switch)(struct pci_dev *dev); void (*gpu_bound)(struct pci_dev *dev, enum vga_switcheroo_client_id); };”…”�”}”hjîsbah}”(h]”h ]”h"]”h$]”h&]”j~juh1j°h³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K„hjÍubhÚ)�”}”(hŒ **Members**”h]”jÖ)�”}”(hjÿh]”hŒMembers”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjýubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K‹hjÍubjì)�”}”(hhh]”(jñ)�”}”(hŒž``set_gpu_state`` do the equivalent of suspend/resume for the card. Mandatory. This should not cut power to the discrete GPU, which is the job of the handler ”h]”(j÷)�”}”(hŒ``set_gpu_state``”h]”jý)�”}”(hj h]”hŒ set_gpu_state”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K‚hj ubj)�”}”(hhh]”hÚ)�”}”(hŒ‹do the equivalent of suspend/resume for the card. Mandatory. This should not cut power to the discrete GPU, which is the job of the handler”h]”hŒ‹do the equivalent of suspend/resume for the card. Mandatory. This should not cut power to the discrete GPU, which is the job of the handler”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K€hj4 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j3 h´K‚hj ubjñ)�”}”(hŒj``reprobe`` poll outputs. Optional. This gets called after waking the GPU and switching the outputs to it ”h]”(j÷)�”}”(hŒ ``reprobe``”h]”jý)�”}”(hjX h]”hŒreprobe”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjV ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K…hjR ubj)�”}”(hhh]”hÚ)�”}”(hŒ]poll outputs. Optional. This gets called after waking the GPU and switching the outputs to it”h]”hŒ]poll outputs. Optional. This gets called after waking the GPU and switching the outputs to it”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´Kƒhjn ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjR ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jm h´K…hj ubjñ)�”}”(hŒ¦``can_switch`` check if the device is in a position to switch now. Mandatory. The client should return false if a user space process has one of its device files open ”h]”(j÷)�”}”(hŒ``can_switch``”h]”jý)�”}”(hj’ h]”hŒ can_switch”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´KˆhjŒ ubj)�”}”(hhh]”hÚ)�”}”(hŒ–check if the device is in a position to switch now. Mandatory. The client should return false if a user space process has one of its device files open”h]”hŒ–check if the device is in a position to switch now. Mandatory. The client should return false if a user space process has one of its device files open”…”�”}”(hj« h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K†hj¨ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j§ h´Kˆhj ubjñ)�”}”(hŒI``gpu_bound`` notify the client id to audio client when the GPU is bound.”h]”(j÷)�”}”(hŒ ``gpu_bound``”h]”jý)�”}”(hjÌ h]”hŒ gpu_bound”…”�”}”(hjÎ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÊ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´KˆhjÆ ubj)�”}”(hhh]”hÚ)�”}”(hŒ;notify the client id to audio client when the GPU is bound.”h]”hŒ;notify the client id to audio client when the GPU is bound.”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K‰hjâ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÆ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³já h´Kˆhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhjÍubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhjh²hh³jch´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj!h]”hŒ Description”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj !ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´KŒhjh²hubhÚ)�”}”(hX,Client callbacks. A client can be either a GPU or an audio device on a GPU. The **set_gpu_state** and **can_switch** methods are mandatory, **reprobe** may be set to NULL. For audio clients, the **reprobe** member is bogus. OTOH, **gpu_bound** is only for audio clients, and not used for GPU clients.”h]”(hŒPClient callbacks. A client can be either a GPU or an audio device on a GPU. The ”…”�”}”(hj%!h²hh³Nh´NubjÖ)�”}”(hŒ**set_gpu_state**”h]”hŒ set_gpu_state”…”�”}”(hj-!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj%!ubhŒ and ”…”�”}”(hj%!h²hh³Nh´NubjÖ)�”}”(hŒ**can_switch**”h]”hŒ can_switch”…”�”}”(hj?!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj%!ubhŒ methods are mandatory, ”…”�”}”(hj%!h²hh³Nh´NubjÖ)�”}”(hŒ **reprobe**”h]”hŒreprobe”…”�”}”(hjQ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj%!ubhŒ, may be set to NULL. For audio clients, the ”…”�”}”(hj%!h²hh³Nh´NubjÖ)�”}”(hŒ **reprobe**”h]”hŒreprobe”…”�”}”(hjc!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj%!ubhŒ member is bogus. OTOH, ”…”�”}”(hj%!h²hh³Nh´NubjÖ)�”}”(hŒ **gpu_bound**”h]”hŒ gpu_bound”…”�”}”(hju!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj%!ubhŒ9 is only for audio clients, and not used for GPU clients.”…”�”}”(hj%!h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:40: ./include/linux/vga_switcheroo.h”h´K‰hjh²hubeh}”(h]”Œpublic-structures”ah ]”h"]”Œpublic structures”ah$]”h&]”uh1hÄhjøh²hh³hÃh´K#ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒPublic constants”h]”hŒPublic constants”…”�”}”(hj™!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj–!h²hh³hÃh´K,ubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ'vga_switcheroo_handler_flags_t (C enum)”Œ c.vga_switcheroo_handler_flags_t”hNt”auh1jhj–!h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒvga_switcheroo_handler_flags_t”h]”j7)�”}”(hŒ#enum vga_switcheroo_handler_flags_t”h]”(j�)�”}”(hj,h]”hŒenum”…”�”}”(hjÁ!h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj½!h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏ!h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj½!h²hh³jÎ!h´Kubj`)�”}”(hŒvga_switcheroo_handler_flags_t”h]”jf)�”}”(hj»!h]”hŒvga_switcheroo_handler_flags_t”…”�”}”(hjá!h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjÝ!ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj½!h²hh³jÎ!h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj¹!h²hh³jÎ!h´Kubah}”(h]”j³!ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jÎ!h´Khj¶!h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒhandler flags bitmask”h]”hŒhandler flags bitmask”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K'hj"h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj¶!h²hh³jÎ!h´Kubeh}”(h]”h ]”(jߌenum”eh"]”h$]”h&]”jÅjßjÆj"jÇj"jȉjɉjʉuh1j+h²hhj–!h³jµ!h´NubjÌ)�”}”(hXz**Constants** ``VGA_SWITCHEROO_CAN_SWITCH_DDC`` whether the handler is able to switch the DDC lines separately. This signals to clients that they should call drm_get_edid_switcheroo() to probe the EDID ``VGA_SWITCHEROO_NEEDS_EDP_CONFIG`` whether the handler is unable to switch the AUX channel separately. This signals to clients that the active GPU needs to train the link and communicate the link parameters to the inactive GPU (mediated by vga_switcheroo). The inactive GPU may then skip the AUX handshake and set up its output with these pre-calibrated values (DisplayPort specification v1.1a, section 2.5.3.3)”h]”(hÚ)�”}”(hŒ **Constants**”h]”jÖ)�”}”(hj%"h]”hŒ Constants”…”�”}”(hj'"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj#"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K+hj"ubjì)�”}”(hhh]”(jñ)�”}”(hŒ¼``VGA_SWITCHEROO_CAN_SWITCH_DDC`` whether the handler is able to switch the DDC lines separately. This signals to clients that they should call drm_get_edid_switcheroo() to probe the EDID ”h]”(j÷)�”}”(hŒ!``VGA_SWITCHEROO_CAN_SWITCH_DDC``”h]”jý)�”}”(hjD"h]”hŒVGA_SWITCHEROO_CAN_SWITCH_DDC”…”�”}”(hjF"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjB"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K0hj>"ubj)�”}”(hhh]”hÚ)�”}”(hŒ™whether the handler is able to switch the DDC lines separately. This signals to clients that they should call drm_get_edid_switcheroo() to probe the EDID”h]”hŒ™whether the handler is able to switch the DDC lines separately. This signals to clients that they should call drm_get_edid_switcheroo() to probe the EDID”…”�”}”(hj]"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K.hjZ"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jY"h´K0hj;"ubjñ)�”}”(hXœ``VGA_SWITCHEROO_NEEDS_EDP_CONFIG`` whether the handler is unable to switch the AUX channel separately. This signals to clients that the active GPU needs to train the link and communicate the link parameters to the inactive GPU (mediated by vga_switcheroo). The inactive GPU may then skip the AUX handshake and set up its output with these pre-calibrated values (DisplayPort specification v1.1a, section 2.5.3.3)”h]”(j÷)�”}”(hŒ#``VGA_SWITCHEROO_NEEDS_EDP_CONFIG``”h]”jý)�”}”(hj~"h]”hŒVGA_SWITCHEROO_NEEDS_EDP_CONFIG”…”�”}”(hj€"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj|"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K7hjx"ubj)�”}”(hhh]”hÚ)�”}”(hXxwhether the handler is unable to switch the AUX channel separately. This signals to clients that the active GPU needs to train the link and communicate the link parameters to the inactive GPU (mediated by vga_switcheroo). The inactive GPU may then skip the AUX handshake and set up its output with these pre-calibrated values (DisplayPort specification v1.1a, section 2.5.3.3)”h]”hXxwhether the handler is unable to switch the AUX channel separately. This signals to clients that the active GPU needs to train the link and communicate the link parameters to the inactive GPU (mediated by vga_switcheroo). The inactive GPU may then skip the AUX handshake and set up its output with these pre-calibrated values (DisplayPort specification v1.1a, section 2.5.3.3)”…”�”}”(hj—"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”•h´K3hj”"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjx"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j“"h´K7hj;"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj"ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj–!h²hh³jµ!h´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjÁ"h]”hŒ Description”…”�”}”(hjÃ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¿"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K:hj–!h²hubhÚ)�”}”(hŒkHandler flags bitmask. Used by handlers to declare their capabilities upon registering with vga_switcheroo.”h]”hŒkHandler flags bitmask. Used by handlers to declare their capabilities upon registering with vga_switcheroo.”…”�”}”(hj×"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:46: ./include/linux/vga_switcheroo.h”h´K1hj–!h²hubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ!vga_switcheroo_client_id (C enum)”Œc.vga_switcheroo_client_id”hNt”auh1jhj–!h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒvga_switcheroo_client_id”h]”j7)�”}”(hŒenum vga_switcheroo_client_id”h]”(j�)�”}”(hj,h]”hŒenum”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjü"h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjü"h²hh³j #h´Kubj`)�”}”(hŒvga_switcheroo_client_id”h]”jf)�”}”(hjú"h]”hŒvga_switcheroo_client_id”…”�”}”(hj #h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj#ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjü"h²hh³j #h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjø"h²hh³j #h´Kubah}”(h]”jò"ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³j #h´Khjõ"h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒclient identifier”h]”hŒclient identifier”…”�”}”(hjB#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KLhj?#h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjõ"h²hh³j #h´Kubeh}”(h]”h ]”(jߌenum”eh"]”h$]”h&]”jÅjßjÆjZ#jÇjZ#jȉjɉjʉuh1j+h²hhj–!h³jô"h´NubjÌ)�”}”(hX�**Constants** ``VGA_SWITCHEROO_UNKNOWN_ID`` initial identifier assigned to vga clients. Determining the id requires the handler, so GPUs are given their true id in a delayed fashion in vga_switcheroo_enable() ``VGA_SWITCHEROO_IGD`` integrated graphics device ``VGA_SWITCHEROO_DIS`` discrete graphics device ``VGA_SWITCHEROO_MAX_CLIENTS`` currently no more than two GPUs are supported”h]”(hÚ)�”}”(hŒ **Constants**”h]”jÖ)�”}”(hjd#h]”hŒ Constants”…”�”}”(hjf#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjb#ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KPhj^#ubjì)�”}”(hhh]”(jñ)�”}”(hŒÃ``VGA_SWITCHEROO_UNKNOWN_ID`` initial identifier assigned to vga clients. Determining the id requires the handler, so GPUs are given their true id in a delayed fashion in vga_switcheroo_enable() ”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_UNKNOWN_ID``”h]”jý)�”}”(hjƒ#h]”hŒVGA_SWITCHEROO_UNKNOWN_ID”…”�”}”(hj…#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj�#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KUhj}#ubj)�”}”(hhh]”hÚ)�”}”(hŒ¤initial identifier assigned to vga clients. Determining the id requires the handler, so GPUs are given their true id in a delayed fashion in vga_switcheroo_enable()”h]”hŒ¤initial identifier assigned to vga clients. Determining the id requires the handler, so GPUs are given their true id in a delayed fashion in vga_switcheroo_enable()”…”�”}”(hjœ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KShj™#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj}#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j˜#h´KUhjz#ubjñ)�”}”(hŒ2``VGA_SWITCHEROO_IGD`` integrated graphics device ”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_IGD``”h]”jý)�”}”(hj½#h]”hŒVGA_SWITCHEROO_IGD”…”�”}”(hj¿#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj»#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KXhj·#ubj)�”}”(hhh]”hÚ)�”}”(hŒintegrated graphics device”h]”hŒintegrated graphics device”…”�”}”(hjÖ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jÒ#h´KXhjÓ#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj·#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jÒ#h´KXhjz#ubjñ)�”}”(hŒ0``VGA_SWITCHEROO_DIS`` discrete graphics device ”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_DIS``”h]”jý)�”}”(hjö#h]”hŒVGA_SWITCHEROO_DIS”…”�”}”(hjø#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjô#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´K[hjð#ubj)�”}”(hhh]”hÚ)�”}”(hŒdiscrete graphics device”h]”hŒdiscrete graphics device”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j $h´K[hj $ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjð#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j $h´K[hjz#ubjñ)�”}”(hŒL``VGA_SWITCHEROO_MAX_CLIENTS`` currently no more than two GPUs are supported”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_MAX_CLIENTS``”h]”jý)�”}”(hj/$h]”hŒVGA_SWITCHEROO_MAX_CLIENTS”…”�”}”(hj1$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj-$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´K]hj)$ubj)�”}”(hhh]”hÚ)�”}”(hŒ-currently no more than two GPUs are supported”h]”hŒ-currently no more than two GPUs are supported”…”�”}”(hjH$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´K^hjE$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj)$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jD$h´K]hjz#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj^#ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj–!h²hh³jô"h´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjr$h]”hŒ Description”…”�”}”(hjt$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjp$ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´K`hj–!h²hubhÚ)�”}”(hŒAClient identifier. Audio clients use the same identifier & 0x100.”h]”hŒAClient identifier. Audio clients use the same identifier & 0x100.”…”�”}”(hjˆ$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:49: ./include/linux/vga_switcheroo.h”h´KShj–!h²hubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œvga_switcheroo_state (C enum)”Œc.vga_switcheroo_state”hNt”auh1jhj–!h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒvga_switcheroo_state”h]”j7)�”}”(hŒenum vga_switcheroo_state”h]”(j�)�”}”(hj,h]”hŒenum”…”�”}”(hj±$h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj­$h²hh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¿$h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj­$h²hh³j¾$h´Kubj`)�”}”(hŒvga_switcheroo_state”h]”jf)�”}”(hj«$h]”hŒvga_switcheroo_state”…”�”}”(hjÑ$h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjÍ$ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj­$h²hh³j¾$h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj©$h²hh³j¾$h´Kubah}”(h]”j£$ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³j¾$h´Khj¦$h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒclient power state”h]”hŒclient power state”…”�”}”(hjó$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´K;hjð$h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj¦$h²hh³j¾$h´Kubeh}”(h]”h ]”(jߌenum”eh"]”h$]”h&]”jÅjßjÆj %jÇj %jȉjɉjʉuh1j+h²hhj–!h³j¥$h´NubjÌ)�”}”(hŒ÷**Constants** ``VGA_SWITCHEROO_OFF`` off ``VGA_SWITCHEROO_ON`` on ``VGA_SWITCHEROO_NOT_FOUND`` client has not registered with vga_switcheroo. Only used in vga_switcheroo_get_client_state() which in turn is only called from hda_intel.c”h]”(hÚ)�”}”(hŒ **Constants**”h]”jÖ)�”}”(hj%h]”hŒ Constants”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´K?hj%ubjì)�”}”(hhh]”(jñ)�”}”(hŒ``VGA_SWITCHEROO_OFF`` off ”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_OFF``”h]”jý)�”}”(hj4%h]”hŒVGA_SWITCHEROO_OFF”…”�”}”(hj6%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj2%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KBhj.%ubj)�”}”(hhh]”hÚ)�”}”(hŒoff”h]”hŒoff”…”�”}”(hjM%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jI%h´KBhjJ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj.%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jI%h´KBhj+%ubjñ)�”}”(hŒ``VGA_SWITCHEROO_ON`` on ”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_ON``”h]”jý)�”}”(hjm%h]”hŒVGA_SWITCHEROO_ON”…”�”}”(hjo%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjk%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KEhjg%ubj)�”}”(hhh]”hÚ)�”}”(hŒon”h]”hŒon”…”�”}”(hj†%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j‚%h´KEhjƒ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjg%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j‚%h´KEhj+%ubjñ)�”}”(hŒ¨``VGA_SWITCHEROO_NOT_FOUND`` client has not registered with vga_switcheroo. Only used in vga_switcheroo_get_client_state() which in turn is only called from hda_intel.c”h]”(j÷)�”}”(hŒ``VGA_SWITCHEROO_NOT_FOUND``”h]”jý)�”}”(hj¦%h]”hŒVGA_SWITCHEROO_NOT_FOUND”…”�”}”(hj¨%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj¤%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KIhj %ubj)�”}”(hhh]”hÚ)�”}”(hŒ‹client has not registered with vga_switcheroo. Only used in vga_switcheroo_get_client_state() which in turn is only called from hda_intel.c”h]”hŒ‹client has not registered with vga_switcheroo. Only used in vga_switcheroo_get_client_state() which in turn is only called from hda_intel.c”…”�”}”(hj¿%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KHhj¼%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj %ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j»%h´KIhj+%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj%ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj–!h²hh³j¥$h´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjé%h]”hŒ Description”…”�”}”(hjë%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjç%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KLhj–!h²hubhÚ)�”}”(hŒClient power state.”h]”hŒClient power state.”…”�”}”(hjÿ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:52: ./include/linux/vga_switcheroo.h”h´KAhj–!h²hubeh}”(h]”Œpublic-constants”ah ]”h"]”Œpublic constants”ah$]”h&]”uh1hÄhjøh²hh³hÃh´K,ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒPrivate structures”h]”hŒPrivate structures”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj&h²hh³hÃh´K8ubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œvgasr_priv (C struct)”Œ c.vgasr_priv”hNt”auh1jhj&h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒ vgasr_priv”h]”j7)�”}”(hŒstruct vgasr_priv”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjA&h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj=&h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjO&h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj=&h²hh³jN&h´Kubj`)�”}”(hŒ vgasr_priv”h]”jf)�”}”(hj;&h]”hŒ vgasr_priv”…”�”}”(hja&h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj]&ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj=&h²hh³jN&h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hj9&h²hh³jN&h´Kubah}”(h]”j3&ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jN&h´Khj6&h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒvga_switcheroo private data”h]”hŒvga_switcheroo private data”…”�”}”(hjƒ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K�hj€&h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj6&h²hh³jN&h´Kubeh}”(h]”h ]”(jߌstruct”eh"]”h$]”h&]”jÅjßjÆj›&jÇj›&jȉjɉjʉuh1j+h²hhj&h³j5&h´NubjÌ)�”}”(hXu**Definition**:: struct vgasr_priv { bool active; bool delayed_switch_active; enum vga_switcheroo_client_id delayed_client_id; struct dentry *debugfs_root; int registered_clients; struct list_head clients; const struct vga_switcheroo_handler *handler; enum vga_switcheroo_handler_flags_t handler_flags; struct mutex mux_hw_lock; int old_ddc_owner; }; **Members** ``active`` whether vga_switcheroo is enabled. Prerequisite is the registration of two GPUs and a handler ``delayed_switch_active`` whether a delayed switch is pending ``delayed_client_id`` client to which a delayed switch is pending ``debugfs_root`` directory for vga_switcheroo debugfs interface ``registered_clients`` number of registered GPUs (counting only vga clients, not audio clients) ``clients`` list of registered clients ``handler`` registered handler ``handler_flags`` flags of registered handler ``mux_hw_lock`` protects mux state (in particular while DDC lines are temporarily switched) ``old_ddc_owner`` client to which DDC lines will be switched back on unlock”h]”(hÚ)�”}”(hŒ**Definition**::”h]”(jÖ)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj§&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj£&ubhŒ:”…”�”}”(hj£&h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K…hjŸ&ubj±)�”}”(hXustruct vgasr_priv { bool active; bool delayed_switch_active; enum vga_switcheroo_client_id delayed_client_id; struct dentry *debugfs_root; int registered_clients; struct list_head clients; const struct vga_switcheroo_handler *handler; enum vga_switcheroo_handler_flags_t handler_flags; struct mutex mux_hw_lock; int old_ddc_owner; };”h]”hXustruct vgasr_priv { bool active; bool delayed_switch_active; enum vga_switcheroo_client_id delayed_client_id; struct dentry *debugfs_root; int registered_clients; struct list_head clients; const struct vga_switcheroo_handler *handler; enum vga_switcheroo_handler_flags_t handler_flags; struct mutex mux_hw_lock; int old_ddc_owner; };”…”�”}”hjÀ&sbah}”(h]”h ]”h"]”h$]”h&]”j~juh1j°h³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K‡hjŸ&ubhÚ)�”}”(hŒ **Members**”h]”jÖ)�”}”(hjÑ&h]”hŒMembers”…”�”}”(hjÓ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÏ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K”hjŸ&ubjì)�”}”(hhh]”(jñ)�”}”(hŒi``active`` whether vga_switcheroo is enabled. Prerequisite is the registration of two GPUs and a handler ”h]”(j÷)�”}”(hŒ ``active``”h]”jý)�”}”(hjð&h]”hŒactive”…”�”}”(hjò&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjî&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K„hjê&ubj)�”}”(hhh]”hÚ)�”}”(hŒ]whether vga_switcheroo is enabled. Prerequisite is the registration of two GPUs and a handler”h]”hŒ]whether vga_switcheroo is enabled. Prerequisite is the registration of two GPUs and a handler”…”�”}”(hj 'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´Kƒhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjê&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j'h´K„hjç&ubjñ)�”}”(hŒ>``delayed_switch_active`` whether a delayed switch is pending ”h]”(j÷)�”}”(hŒ``delayed_switch_active``”h]”jý)�”}”(hj*'h]”hŒdelayed_switch_active”…”�”}”(hj,'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj('ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K…hj$'ubj)�”}”(hhh]”hÚ)�”}”(hŒ#whether a delayed switch is pending”h]”hŒ#whether a delayed switch is pending”…”�”}”(hjC'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j?'h´K…hj@'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j?'h´K…hjç&ubjñ)�”}”(hŒB``delayed_client_id`` client to which a delayed switch is pending ”h]”(j÷)�”}”(hŒ``delayed_client_id``”h]”jý)�”}”(hjc'h]”hŒdelayed_client_id”…”�”}”(hje'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühja'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K†hj]'ubj)�”}”(hhh]”hÚ)�”}”(hŒ+client to which a delayed switch is pending”h]”hŒ+client to which a delayed switch is pending”…”�”}”(hj|'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jx'h´K†hjy'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj]'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jx'h´K†hjç&ubjñ)�”}”(hŒ@``debugfs_root`` directory for vga_switcheroo debugfs interface ”h]”(j÷)�”}”(hŒ``debugfs_root``”h]”jý)�”}”(hjœ'h]”hŒ debugfs_root”…”�”}”(hjž'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjš'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K‡hj–'ubj)�”}”(hhh]”hÚ)�”}”(hŒ.directory for vga_switcheroo debugfs interface”h]”hŒ.directory for vga_switcheroo debugfs interface”…”�”}”(hjµ'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j±'h´K‡hj²'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj–'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j±'h´K‡hjç&ubjñ)�”}”(hŒ```registered_clients`` number of registered GPUs (counting only vga clients, not audio clients) ”h]”(j÷)�”}”(hŒ``registered_clients``”h]”jý)�”}”(hjÕ'h]”hŒregistered_clients”…”�”}”(hj×'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÓ'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K‰hjÏ'ubj)�”}”(hhh]”hÚ)�”}”(hŒHnumber of registered GPUs (counting only vga clients, not audio clients)”h]”hŒHnumber of registered GPUs (counting only vga clients, not audio clients)”…”�”}”(hjî'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´Kˆhjë'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÏ'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jê'h´K‰hjç&ubjñ)�”}”(hŒ'``clients`` list of registered clients ”h]”(j÷)�”}”(hŒ ``clients``”h]”jý)�”}”(hj(h]”hŒclients”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj (ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´KŠhj (ubj)�”}”(hhh]”hÚ)�”}”(hŒlist of registered clients”h]”hŒlist of registered clients”…”�”}”(hj((h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j$(h´KŠhj%(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj (ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j$(h´KŠhjç&ubjñ)�”}”(hŒ``handler`` registered handler ”h]”(j÷)�”}”(hŒ ``handler``”h]”jý)�”}”(hjH(h]”hŒhandler”…”�”}”(hjJ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjF(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K‹hjB(ubj)�”}”(hhh]”hÚ)�”}”(hŒregistered handler”h]”hŒregistered handler”…”�”}”(hja(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j](h´K‹hj^(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjB(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j](h´K‹hjç&ubjñ)�”}”(hŒ.``handler_flags`` flags of registered handler ”h]”(j÷)�”}”(hŒ``handler_flags``”h]”jý)�”}”(hj�(h]”hŒ handler_flags”…”�”}”(hjƒ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´KŒhj{(ubj)�”}”(hhh]”hÚ)�”}”(hŒflags of registered handler”h]”hŒflags of registered handler”…”�”}”(hjš(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j–(h´KŒhj—(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j–(h´KŒhjç&ubjñ)�”}”(hŒ\``mux_hw_lock`` protects mux state (in particular while DDC lines are temporarily switched) ”h]”(j÷)�”}”(hŒ``mux_hw_lock``”h]”jý)�”}”(hjº(h]”hŒ mux_hw_lock”…”�”}”(hj¼(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj¸(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´KŽhj´(ubj)�”}”(hhh]”hÚ)�”}”(hŒKprotects mux state (in particular while DDC lines are temporarily switched)”h]”hŒKprotects mux state (in particular while DDC lines are temporarily switched)”…”�”}”(hjÓ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K�hjÐ(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj´(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jÏ(h´KŽhjç&ubjñ)�”}”(hŒK``old_ddc_owner`` client to which DDC lines will be switched back on unlock”h]”(j÷)�”}”(hŒ``old_ddc_owner``”h]”jý)�”}”(hjô(h]”hŒ old_ddc_owner”…”�”}”(hjö(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjò(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´KŽhjî(ubj)�”}”(hhh]”hÚ)�”}”(hŒ9client to which DDC lines will be switched back on unlock”h]”hŒ9client to which DDC lines will be switched back on unlock”…”�”}”(hj )h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K�hj )ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjî(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j )h´KŽhjç&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhjŸ&ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj&h²hh³j5&h´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj7)h]”hŒ Description”…”�”}”(hj9)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj5)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K’hj&h²hubhÚ)�”}”(hŒ`vga_switcheroo private data. Currently only one vga_switcheroo instance per system is supported.”h]”hŒ`vga_switcheroo private data. Currently only one vga_switcheroo instance per system is supported.”…”�”}”(hjM)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:58: ./drivers/gpu/vga/vga_switcheroo.c”h´K�hj&h²hubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œ vga_switcheroo_client (C struct)”Œc.vga_switcheroo_client”hNt”auh1jhj&h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Nubj,)�”}”(hhh]”(j1)�”}”(hŒvga_switcheroo_client”h]”j7)�”}”(hŒstruct vga_switcheroo_client”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjv)h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhjr)h²hh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´KubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„)h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjr)h²hh³jƒ)h´Kubj`)�”}”(hŒvga_switcheroo_client”h]”jf)�”}”(hjp)h]”hŒvga_switcheroo_client”…”�”}”(hj–)h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj’)ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjr)h²hh³jƒ)h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjn)h²hh³jƒ)h´Kubah}”(h]”jh)ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jƒ)h´Khjk)h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒregistered client”h]”hŒregistered client”…”�”}”(hj¸)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´K[hjµ)h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjk)h²hh³jƒ)h´Kubeh}”(h]”h ]”(jߌstruct”eh"]”h$]”h&]”jÅjßjÆjÐ)jÇjÐ)jȉjɉjʉuh1j+h²hhj&h³jj)h´NubjÌ)�”}”(hX¶**Definition**:: struct vga_switcheroo_client { struct pci_dev *pdev; struct fb_info *fb_info; enum vga_switcheroo_state pwr_state; const struct vga_switcheroo_client_ops *ops; enum vga_switcheroo_client_id id; bool active; bool driver_power_control; struct list_head list; struct pci_dev *vga_dev; }; **Members** ``pdev`` client pci device ``fb_info`` framebuffer to which console is remapped on switching ``pwr_state`` current power state if manual power control is used. For driver power control, call vga_switcheroo_pwr_state(). ``ops`` client callbacks ``id`` client identifier. Determining the id requires the handler, so gpus are initially assigned VGA_SWITCHEROO_UNKNOWN_ID and later given their true id in vga_switcheroo_enable() ``active`` whether the outputs are currently switched to this client ``driver_power_control`` whether power state is controlled by the driver's runtime pm. If true, writing ON and OFF to the vga_switcheroo debugfs interface is a no-op so as not to interfere with runtime pm ``list`` client list ``vga_dev`` pci device, indicate which GPU is bound to current audio client”h]”(hÚ)�”}”(hŒ**Definition**::”h]”(jÖ)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjÜ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjØ)ubhŒ:”…”�”}”(hjØ)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´K_hjÔ)ubj±)�”}”(hX@struct vga_switcheroo_client { struct pci_dev *pdev; struct fb_info *fb_info; enum vga_switcheroo_state pwr_state; const struct vga_switcheroo_client_ops *ops; enum vga_switcheroo_client_id id; bool active; bool driver_power_control; struct list_head list; struct pci_dev *vga_dev; };”h]”hX@struct vga_switcheroo_client { struct pci_dev *pdev; struct fb_info *fb_info; enum vga_switcheroo_state pwr_state; const struct vga_switcheroo_client_ops *ops; enum vga_switcheroo_client_id id; bool active; bool driver_power_control; struct list_head list; struct pci_dev *vga_dev; };”…”�”}”hjõ)sbah}”(h]”h ]”h"]”h$]”h&]”j~juh1j°h³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´KahjÔ)ubhÚ)�”}”(hŒ **Members**”h]”jÖ)�”}”(hj*h]”hŒMembers”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´KmhjÔ)ubjì)�”}”(hhh]”(jñ)�”}”(hŒ``pdev`` client pci device ”h]”(j÷)�”}”(hŒ``pdev``”h]”jý)�”}”(hj%*h]”hŒpdev”…”�”}”(hj'*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj#*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´K]hj*ubj)�”}”(hhh]”hÚ)�”}”(hŒclient pci device”h]”hŒclient pci device”…”�”}”(hj>*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j:*h´K]hj;*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j:*h´K]hj*ubjñ)�”}”(hŒB``fb_info`` framebuffer to which console is remapped on switching ”h]”(j÷)�”}”(hŒ ``fb_info``”h]”jý)�”}”(hj^*h]”hŒfb_info”…”�”}”(hj`*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj\*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´K^hjX*ubj)�”}”(hhh]”hÚ)�”}”(hŒ5framebuffer to which console is remapped on switching”h]”hŒ5framebuffer to which console is remapped on switching”…”�”}”(hjw*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³js*h´K^hjt*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjX*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³js*h´K^hj*ubjñ)�”}”(hŒ~``pwr_state`` current power state if manual power control is used. For driver power control, call vga_switcheroo_pwr_state(). ”h]”(j÷)�”}”(hŒ ``pwr_state``”h]”jý)�”}”(hj—*h]”hŒ pwr_state”…”�”}”(hj™*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj•*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´K`hj‘*ubj)�”}”(hhh]”hÚ)�”}”(hŒocurrent power state if manual power control is used. For driver power control, call vga_switcheroo_pwr_state().”h]”hŒocurrent power state if manual power control is used. For driver power control, call vga_switcheroo_pwr_state().”…”�”}”(hj°*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´K_hj­*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‘*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j¬*h´K`hj*ubjñ)�”}”(hŒ``ops`` client callbacks ”h]”(j÷)�”}”(hŒ``ops``”h]”jý)�”}”(hjÑ*h]”hŒops”…”�”}”(hjÓ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÏ*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´KahjË*ubj)�”}”(hhh]”hÚ)�”}”(hŒclient callbacks”h]”hŒclient callbacks”…”�”}”(hjê*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jæ*h´Kahjç*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjË*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jæ*h´Kahj*ubjñ)�”}”(hŒµ``id`` client identifier. Determining the id requires the handler, so gpus are initially assigned VGA_SWITCHEROO_UNKNOWN_ID and later given their true id in vga_switcheroo_enable() ”h]”(j÷)�”}”(hŒ``id``”h]”jý)�”}”(hj +h]”hŒid”…”�”}”(hj +h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kdhj+ubj)�”}”(hhh]”hÚ)�”}”(hŒ­client identifier. Determining the id requires the handler, so gpus are initially assigned VGA_SWITCHEROO_UNKNOWN_ID and later given their true id in vga_switcheroo_enable()”h]”hŒ­client identifier. Determining the id requires the handler, so gpus are initially assigned VGA_SWITCHEROO_UNKNOWN_ID and later given their true id in vga_switcheroo_enable()”…”�”}”(hj#+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kbhj +ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j+h´Kdhj*ubjñ)�”}”(hŒE``active`` whether the outputs are currently switched to this client ”h]”(j÷)�”}”(hŒ ``active``”h]”jý)�”}”(hjD+h]”hŒactive”…”�”}”(hjF+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjB+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kehj>+ubj)�”}”(hhh]”hÚ)�”}”(hŒ9whether the outputs are currently switched to this client”h]”hŒ9whether the outputs are currently switched to this client”…”�”}”(hj]+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jY+h´KehjZ+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jY+h´Kehj*ubjñ)�”}”(hŒÍ``driver_power_control`` whether power state is controlled by the driver's runtime pm. If true, writing ON and OFF to the vga_switcheroo debugfs interface is a no-op so as not to interfere with runtime pm ”h]”(j÷)�”}”(hŒ``driver_power_control``”h]”jý)�”}”(hj}+h]”hŒdriver_power_control”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj{+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Khhjw+ubj)�”}”(hhh]”hÚ)�”}”(hŒ³whether power state is controlled by the driver's runtime pm. If true, writing ON and OFF to the vga_switcheroo debugfs interface is a no-op so as not to interfere with runtime pm”h]”hŒµwhether power state is controlled by the driver’s runtime pm. If true, writing ON and OFF to the vga_switcheroo debugfs interface is a no-op so as not to interfere with runtime pm”…”�”}”(hj–+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kfhj“+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjw+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j’+h´Khhj*ubjñ)�”}”(hŒ``list`` client list ”h]”(j÷)�”}”(hŒ``list``”h]”jý)�”}”(hj·+h]”hŒlist”…”�”}”(hj¹+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjµ+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kihj±+ubj)�”}”(hhh]”hÚ)�”}”(hŒ client list”h]”hŒ client list”…”�”}”(hjÐ+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jÌ+h´KihjÍ+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj±+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jÌ+h´Kihj*ubjñ)�”}”(hŒK``vga_dev`` pci device, indicate which GPU is bound to current audio client”h]”(j÷)�”}”(hŒ ``vga_dev``”h]”jý)�”}”(hjð+h]”hŒvga_dev”…”�”}”(hjò+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjî+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kihjê+ubj)�”}”(hhh]”hÚ)�”}”(hŒ?pci device, indicate which GPU is bound to current audio client”h]”hŒ?pci device, indicate which GPU is bound to current audio client”…”�”}”(hj ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kjhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjê+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j,h´Kihj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhjÔ)ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj&h²hh³jj)h´NubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj3,h]”hŒ Description”…”�”}”(hj5,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj1,ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kmhj&h²hubhÚ)�”}”(hŒ¼Registered client. A client can be either a GPU or an audio device on a GPU. For audio clients, the **fb_info** and **active** members are bogus. For GPU clients, the **vga_dev** is bogus.”h]”(hŒdRegistered client. A client can be either a GPU or an audio device on a GPU. For audio clients, the ”…”�”}”(hjI,h²hh³Nh´NubjÖ)�”}”(hŒ **fb_info**”h]”hŒfb_info”…”�”}”(hjQ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjI,ubhŒ and ”…”�”}”(hjI,h²hh³Nh´NubjÖ)�”}”(hŒ **active**”h]”hŒactive”…”�”}”(hjc,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjI,ubhŒ) members are bogus. For GPU clients, the ”…”�”}”(hjI,h²hh³Nh´NubjÖ)�”}”(hŒ **vga_dev**”h]”hŒvga_dev”…”�”}”(hju,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjI,ubhŒ is bogus.”…”�”}”(hjI,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œc/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:61: ./drivers/gpu/vga/vga_switcheroo.c”h´Kjhj&h²hubeh}”(h]”Œprivate-structures”ah ]”h"]”Œprivate structures”ah$]”h&]”uh1hÄhjøh²hh³hÃh´K8ubeh}”(h]”Œapi”ah ]”h"]”Œapi”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒHandlers”h]”hŒHandlers”…”�”}”(hj¡,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjž,h²hh³hÃh´KAubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒapple-gmux Handler”h]”hŒapple-gmux Handler”…”�”}”(hj²,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj¯,h²hh³hÃh´KDubhÚ)�”}”(hŒ“gmux is a microcontroller built into the MacBook Pro to support dual GPUs: A `Lattice XP2`_ on pre-retinas, a `Renesas R4F2113`_ on pre-T2 retinas.”h]”(hŒMgmux is a microcontroller built into the MacBook Pro to support dual GPUs: A ”…”�”}”(hjÀ,h²hh³Nh´NubjÑ)�”}”(hŒ`Lattice XP2`_”h]”hŒ Lattice XP2”…”�”}”(hjÈ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ Lattice XP2”Œrefuri”ŒBhttp://www.latticesemi.com/en/Products/FPGAandCPLD/LatticeXP2.aspx”uh1jÐhjÀ,Œresolved”KubhŒ on pre-retinas, a ”…”�”}”(hjÀ,h²hh³Nh´NubjÑ)�”}”(hŒ`Renesas R4F2113`_”h]”hŒRenesas R4F2113”…”�”}”(hjß,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒRenesas R4F2113”jØ,ŒDhttp://www.renesas.com/products/mpumcu/h8s/h8s2100/h8s2113/index.jsp”uh1jÐhjÀ,jÚ,KubhŒ on pre-T2 retinas.”…”�”}”(hjÀ,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:70: ./drivers/platform/x86/apple-gmux.c”h´Khj¯,h²hubhÚ)�”}”(hXoOn T2 Macbooks, the gmux is part of the T2 Coprocessor's SMC. The SMC has an I2C connection to a `NXP PCAL6524` GPIO expander, which enables/disables the voltage regulators of the discrete GPU, drives the display panel power, and has a GPIO to switch the eDP mux. The Intel CPU can interact with gmux through MMIO, similar to how the main SMC interface is controlled.”h]”(hŒcOn T2 Macbooks, the gmux is part of the T2 Coprocessor’s SMC. The SMC has an I2C connection to a ”…”�”}”(hjû,h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`NXP PCAL6524`”h]”hŒ NXP PCAL6524”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjû,ubhX GPIO expander, which enables/disables the voltage regulators of the discrete GPU, drives the display panel power, and has a GPIO to switch the eDP mux. The Intel CPU can interact with gmux through MMIO, similar to how the main SMC interface is controlled.”…”�”}”(hjû,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:70: ./drivers/platform/x86/apple-gmux.c”h´K hj¯,h²hubhÚ)�”}”(hŒo(The MacPro6,1 2013 also has a gmux, however it is unclear why since it has dual GPUs but no built-in display.)”h]”hŒo(The MacPro6,1 2013 also has a gmux, however it is unclear why since it has dual GPUs but no built-in display.)”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:70: ./drivers/platform/x86/apple-gmux.c”h´K&hj¯,h²hubhÚ)�”}”(hX+gmux is connected to the LPC bus of the southbridge. Its I/O ports are accessed differently depending on the microcontroller: Driver functions to access a pre-retina gmux are infixed ``_pio_``, those for a pre-T2 retina gmux are infixed ``_index_``, and those on T2 Macs are infixed with ``_mmio_``.”h]”(hŒ·gmux is connected to the LPC bus of the southbridge. Its I/O ports are accessed differently depending on the microcontroller: Driver functions to access a pre-retina gmux are infixed ”…”�”}”(hj--h²hh³Nh´Nubjý)�”}”(hŒ ``_pio_``”h]”hŒ_pio_”…”�”}”(hj5-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj--ubhŒ-, those for a pre-T2 retina gmux are infixed ”…”�”}”(hj--h²hh³Nh´Nubjý)�”}”(hŒ ``_index_``”h]”hŒ_index_”…”�”}”(hjG-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj--ubhŒ(, and those on T2 Macs are infixed with ”…”�”}”(hj--h²hh³Nh´Nubjý)�”}”(hŒ ``_mmio_``”h]”hŒ_mmio_”…”�”}”(hjY-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj--ubhŒ.”…”�”}”(hj--h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:70: ./drivers/platform/x86/apple-gmux.c”h´K)hj¯,h²hubh¶)�”}”(hŒW.. _Lattice XP2: http://www.latticesemi.com/en/Products/FPGAandCPLD/LatticeXP2.aspx”h]”h}”(h]”Œ lattice-xp2”ah ]”h"]”Œ lattice xp2”ah$]”h&]”jØ,jÙ,uh1hµh´Khj¯,h²hh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:70: ./drivers/platform/x86/apple-gmux.c”jKubh¶)�”}”(hŒ].. _Renesas R4F2113: http://www.renesas.com/products/mpumcu/h8s/h8s2100/h8s2113/index.jsp”h]”h}”(h]”Œrenesas-r4f2113”ah ]”h"]”Œrenesas r4f2113”ah$]”h&]”jØ,jï,uh1hµh´Khj¯,h²hh³j~-jKubh¶)�”}”(hŒI.. _NXP PCAL6524: https://www.nxp.com/docs/en/data-sheet/PCAL6524.pdf”h]”h}”(h]”Œ nxp-pcal6524”ah ]”h"]”Œ nxp pcal6524”ah$]”h&]”jØ,Œ3https://www.nxp.com/docs/en/data-sheet/PCAL6524.pdf”uh1hµh´Khj¯,h²hh³j~-ubhÚ)�”}”(hX!gmux is also connected to a GPIO pin of the southbridge and thereby is able to trigger an ACPI GPE. ACPI name GMGP holds this GPIO pin's number. On the MBP5 2008/09 it's GPIO pin 22 of the Nvidia MCP79, on following generations it's GPIO pin 6 of the Intel PCH, on MMIO gmux's it's pin 21.”h]”hX+gmux is also connected to a GPIO pin of the southbridge and thereby is able to trigger an ACPI GPE. ACPI name GMGP holds this GPIO pin’s number. On the MBP5 2008/09 it’s GPIO pin 22 of the Nvidia MCP79, on following generations it’s GPIO pin 6 of the Intel PCH, on MMIO gmux’s it’s pin 21.”…”�”}”(hj˜-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:73: ./drivers/platform/x86/apple-gmux.c”h´Mbhj¯,h²hubhÚ)�”}”(hŒuThe GPE merely signals that an interrupt occurred, the actual type of event is identified by reading a gmux register.”h]”hŒuThe GPE merely signals that an interrupt occurred, the actual type of event is identified by reading a gmux register.”…”�”}”(hj§-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:73: ./drivers/platform/x86/apple-gmux.c”h´Mghj¯,h²hubhÚ)�”}”(hXåIn addition to the GMGP name, gmux's ACPI device also has two methods GMSP and GMLV. GMLV likely means "GMUX Level", and reads the value of the GPIO, while GMSP likely means "GMUX Set Polarity", and seems to write to the GPIO's value. On newer Macbooks (This was introduced with or sometime before the MacBookPro14,3), the ACPI GPE method differentiates between the OS type: On Darwin, only a notification is signaled, whereas on other OSes, the GPIO's value is read and then inverted.”h]”hXóIn addition to the GMGP name, gmux’s ACPI device also has two methods GMSP and GMLV. GMLV likely means “GMUX Levelâ€�, and reads the value of the GPIO, while GMSP likely means “GMUX Set Polarityâ€�, and seems to write to the GPIO’s value. On newer Macbooks (This was introduced with or sometime before the MacBookPro14,3), the ACPI GPE method differentiates between the OS type: On Darwin, only a notification is signaled, whereas on other OSes, the GPIO’s value is read and then inverted.”…”�”}”(hj¶-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:73: ./drivers/platform/x86/apple-gmux.c”h´Mjhj¯,h²hubhÚ)�”}”(hX1Because Linux masquerades as Darwin, it ends up in the notification-only code path. On MMIO gmux's, this seems to lead to us being unable to clear interrupts, unless we call GMSP(0). Without this, there is a flood of status=0 interrupts that can't be cleared. This issue seems to be unique to MMIO gmux's.”h]”hX7Because Linux masquerades as Darwin, it ends up in the notification-only code path. On MMIO gmux’s, this seems to lead to us being unable to clear interrupts, unless we call GMSP(0). Without this, there is a flood of status=0 interrupts that can’t be cleared. This issue seems to be unique to MMIO gmux’s.”…”�”}”(hjÅ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:73: ./drivers/platform/x86/apple-gmux.c”h´Mrhj¯,h²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Graphics mux”h]”hŒ Graphics mux”…”�”}”(hj×-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÔ-h²hh³hÃh´KMubhÚ)�”}”(hX[On pre-retinas, the LVDS outputs of both GPUs feed into gmux which muxes either of them to the panel. One of the tricks gmux has up its sleeve is to lengthen the blanking interval of its output during a switch to synchronize it with the GPU switched to. This allows for a flicker-free switch that is imperceptible by the user (`US 8,687,007 B2`_).”h]”(hXGOn pre-retinas, the LVDS outputs of both GPUs feed into gmux which muxes either of them to the panel. One of the tricks gmux has up its sleeve is to lengthen the blanking interval of its output during a switch to synchronize it with the GPU switched to. This allows for a flicker-free switch that is imperceptible by the user (”…”�”}”(hjå-h²hh³Nh´NubjÑ)�”}”(hŒ`US 8,687,007 B2`_”h]”hŒUS 8,687,007 B2”…”�”}”(hjí-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒUS 8,687,007 B2”jØ,Œ0https://pimg-fpiw.uspto.gov/fdd/07/870/086/0.pdf”uh1jÐhjå-jÚ,KubhŒ).”…”�”}”(hjå-h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´MhhjÔ-h²hubhÚ)�”}”(hXHOn retinas, muxing is no longer done by gmux itself, but by a separate chip which is controlled by gmux. The chip is triple sourced, it is either an `NXP CBTL06142`_, `TI HD3SS212`_ or `Pericom PI3VDP12412`_. The panel is driven with eDP instead of LVDS since the pixel clock required for retina resolution exceeds LVDS' limits.”h]”(hŒ•On retinas, muxing is no longer done by gmux itself, but by a separate chip which is controlled by gmux. The chip is triple sourced, it is either an ”…”�”}”(hj .h²hh³Nh´NubjÑ)�”}”(hŒ`NXP CBTL06142`_”h]”hŒ NXP CBTL06142”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ NXP CBTL06142”jØ,Œ6https://www.nxp.com/documents/data_sheet/CBTL06141.pdf”uh1jÐhj .jÚ,KubhŒ, ”…”�”}”(hj .h²hh³Nh´NubjÑ)�”}”(hŒ`TI HD3SS212`_”h]”hŒ TI HD3SS212”…”�”}”(hj&.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ TI HD3SS212”jØ,Œ.https://www.ti.com/lit/ds/symlink/hd3ss212.pdf”uh1jÐhj .jÚ,KubhŒ or ”…”�”}”(hj .h²hh³Nh´NubjÑ)�”}”(hŒ`Pericom PI3VDP12412`_”h]”hŒPericom PI3VDP12412”…”�”}”(hj;.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒPericom PI3VDP12412”jØ,Œ9https://www.pericom.com/assets/Datasheets/PI3VDP12412.pdf”uh1jÐhj .jÚ,KubhŒ{. The panel is driven with eDP instead of LVDS since the pixel clock required for retina resolution exceeds LVDS’ limits.”…”�”}”(hj .h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´MnhjÔ-h²hubhÚ)�”}”(hXuPre-retinas are able to switch the panel's DDC pins separately. This is handled by a `TI SN74LV4066A`_ which is controlled by gmux. The inactive GPU can thus probe the panel's EDID without switching over the entire panel. Retinas lack this functionality as the chips used for eDP muxing are incapable of switching the AUX channel separately (see the linked data sheets, Pericom would be capable but this is unused). However the retina panel has the NO_AUX_HANDSHAKE_LINK_TRAINING bit set in its DPCD, allowing the inactive GPU to skip the AUX handshake and set up the output with link parameters pre-calibrated by the active GPU.”h]”(hŒWPre-retinas are able to switch the panel’s DDC pins separately. This is handled by a ”…”�”}”(hjW.h²hh³Nh´NubjÑ)�”}”(hŒ`TI SN74LV4066A`_”h]”hŒTI SN74LV4066A”…”�”}”(hj_.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒTI SN74LV4066A”jØ,Œ1https://www.ti.com/lit/ds/symlink/sn74lv4066a.pdf”uh1jÐhjW.jÚ,KubhX which is controlled by gmux. The inactive GPU can thus probe the panel’s EDID without switching over the entire panel. Retinas lack this functionality as the chips used for eDP muxing are incapable of switching the AUX channel separately (see the linked data sheets, Pericom would be capable but this is unused). However the retina panel has the NO_AUX_HANDSHAKE_LINK_TRAINING bit set in its DPCD, allowing the inactive GPU to skip the AUX handshake and set up the output with link parameters pre-calibrated by the active GPU.”…”�”}”(hjW.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´MthjÔ-h²hubhÚ)�”}”(hX$The external DP port is only fully switchable on the first two unibody MacBook Pro generations, MBP5 2008/09 and MBP6 2010. This is done by an `NXP CBTL06141`_ which is controlled by gmux. It's the predecessor of the eDP mux on retinas, the difference being support for 2.7 versus 5.4 Gbit/s.”h]”(hŒ�The external DP port is only fully switchable on the first two unibody MacBook Pro generations, MBP5 2008/09 and MBP6 2010. This is done by an ”…”�”}”(hj{.h²hh³Nh´NubjÑ)�”}”(hŒ`NXP CBTL06141`_”h]”hŒ NXP CBTL06141”…”�”}”(hjƒ.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ NXP CBTL06141”jØ,Œ6https://www.nxp.com/documents/data_sheet/CBTL06141.pdf”uh1jÐhj{.jÚ,KubhŒ‡ which is controlled by gmux. It’s the predecessor of the eDP mux on retinas, the difference being support for 2.7 versus 5.4 Gbit/s.”…”�”}”(hj{.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´M~hjÔ-h²hubhÚ)�”}”(hXAThe following MacBook Pro generations replaced the external DP port with a combined DP/Thunderbolt port and lost the ability to switch it between GPUs, connecting it either to the discrete GPU or the Thunderbolt controller. Oddly enough, while the full port is no longer switchable, AUX and HPD are still switchable by way of an `NXP CBTL03062`_ (on pre-retinas MBP8 2011 and MBP9 2012) or two `TI TS3DS10224`_ (on pre-t2 retinas) under the control of gmux. Since the integrated GPU is missing the main link, external displays appear to it as phantoms which fail to link-train.”h]”(hXIThe following MacBook Pro generations replaced the external DP port with a combined DP/Thunderbolt port and lost the ability to switch it between GPUs, connecting it either to the discrete GPU or the Thunderbolt controller. Oddly enough, while the full port is no longer switchable, AUX and HPD are still switchable by way of an ”…”�”}”(hjŸ.h²hh³Nh´NubjÑ)�”}”(hŒ`NXP CBTL03062`_”h]”hŒ NXP CBTL03062”…”�”}”(hj§.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ NXP CBTL03062”jØ,ŒNhttp://pdf.datasheetarchive.com/indexerfiles/Datasheets-SW16/DSASW00308511.pdf”uh1jÐhjŸ.jÚ,KubhŒ1 (on pre-retinas MBP8 2011 and MBP9 2012) or two ”…”�”}”(hjŸ.h²hh³Nh´NubjÑ)�”}”(hŒ`TI TS3DS10224`_”h]”hŒ TI TS3DS10224”…”�”}”(hj¼.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ TI TS3DS10224”jØ,Œ0https://www.ti.com/lit/ds/symlink/ts3ds10224.pdf”uh1jÐhjŸ.jÚ,KubhŒ§ (on pre-t2 retinas) under the control of gmux. Since the integrated GPU is missing the main link, external displays appear to it as phantoms which fail to link-train.”…”�”}”(hjŸ.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´MƒhjÔ-h²hubhÚ)�”}”(hX¾gmux receives the HPD signal of all display connectors and sends an interrupt on hotplug. On generations which cannot switch external ports, the discrete GPU can then be woken to drive the newly connected display. The ability to switch AUX on these generations could be used to improve reliability of hotplug detection by having the integrated GPU poll the ports while the discrete GPU is asleep, but currently we do not make use of this feature.”h]”hX¾gmux receives the HPD signal of all display connectors and sends an interrupt on hotplug. On generations which cannot switch external ports, the discrete GPU can then be woken to drive the newly connected display. The ability to switch AUX on these generations could be used to improve reliability of hotplug detection by having the integrated GPU poll the ports while the discrete GPU is asleep, but currently we do not make use of this feature.”…”�”}”(hjØ.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´MŒhjÔ-h²hubhÚ)�”}”(hXrOur switching policy for the external port is that on those generations which are able to switch it fully, the port is switched together with the panel when IGD / DIS commands are issued to vga_switcheroo. It is thus possible to drive e.g. a beamer on battery power with the integrated GPU. The user may manually switch to the discrete GPU if more performance is needed.”h]”hXrOur switching policy for the external port is that on those generations which are able to switch it fully, the port is switched together with the panel when IGD / DIS commands are issued to vga_switcheroo. It is thus possible to drive e.g. a beamer on battery power with the integrated GPU. The user may manually switch to the discrete GPU if more performance is needed.”…”�”}”(hjç.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´M”hjÔ-h²hubhÚ)�”}”(hXMOn all newer generations, the external port can only be driven by the discrete GPU. If a display is plugged in while the panel is switched to the integrated GPU, *both* GPUs will be in use for maximum performance. To decrease power consumption, the user may manually switch to the discrete GPU, thereby suspending the integrated GPU.”h]”(hŒ¢On all newer generations, the external port can only be driven by the discrete GPU. If a display is plugged in while the panel is switched to the integrated GPU, ”…”�”}”(hjö.h²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ*both*”h]”hŒboth”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jþ.hjö.ubhŒ¥ GPUs will be in use for maximum performance. To decrease power consumption, the user may manually switch to the discrete GPU, thereby suspending the integrated GPU.”…”�”}”(hjö.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´M›hjÔ-h²hubhÚ)�”}”(hX<gmux' initial switch state on bootup is user configurable via the EFI variable ``gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9`` (5th byte, 1 = IGD, 0 = DIS). Based on this setting, the EFI firmware tells gmux to switch the panel and the external DP connector and allocates a framebuffer for the selected GPU.”h]”(hŒQgmux’ initial switch state on bootup is user configurable via the EFI variable ”…”�”}”(hj/h²hh³Nh´Nubjý)�”}”(hŒ8``gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9``”h]”hŒ4gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9”…”�”}”(hj!/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj/ubhŒµ (5th byte, 1 = IGD, 0 = DIS). Based on this setting, the EFI firmware tells gmux to switch the panel and the external DP connector and allocates a framebuffer for the selected GPU.”…”�”}”(hj/h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”h´M¡hjÔ-h²hubh¶)�”}”(hŒE.. _US 8,687,007 B2: https://pimg-fpiw.uspto.gov/fdd/07/870/086/0.pdf”h]”h}”(h]”Œus-8-687-007-b2”ah ]”h"]”Œus 8,687,007 b2”ah$]”h&]”jØ,jý-uh1hµh´K@hjÔ-h²hh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:79: ./drivers/platform/x86/apple-gmux.c”jKubh¶)�”}”(hŒK.. _NXP CBTL06141: https://www.nxp.com/documents/data_sheet/CBTL06141.pdf”h]”h}”(h]”Œ nxp-cbtl06141”ah ]”h"]”Œ nxp cbtl06141”ah$]”h&]”jØ,j“.uh1hµh´KAhjÔ-h²hh³jF/jKubh¶)�”}”(hŒK.. _NXP CBTL06142: https://www.nxp.com/documents/data_sheet/CBTL06141.pdf”h]”h}”(h]”Œ nxp-cbtl06142”ah ]”h"]”Œ nxp cbtl06142”ah$]”h&]”jØ,j!.uh1hµh´KBhjÔ-h²hh³jF/jKubh¶)�”}”(hŒC.. _TI HD3SS212: https://www.ti.com/lit/ds/symlink/hd3ss212.pdf”h]”h}”(h]”Œ ti-hd3ss212”ah ]”h"]”Œ ti hd3ss212”ah$]”h&]”jØ,j6.uh1hµh´KChjÔ-h²hh³jF/jKubh¶)�”}”(hŒR.. _Pericom PI3VDP12412: https://www.pericom.com/assets/Datasheets/PI3VDP12412.pdf”h]”h}”(h]”Œpericom-pi3vdp12412”ah ]”h"]”Œpericom pi3vdp12412”ah$]”h&]”jØ,jK.uh1hµh´KDhjÔ-h²hh³jF/jKubh¶)�”}”(hŒF.. _TI SN74LV4066A: https://www.ti.com/lit/ds/symlink/sn74lv4066a.pdf”h]”h}”(h]”Œti-sn74lv4066a”ah ]”h"]”Œti sn74lv4066a”ah$]”h&]”jØ,jo.uh1hµh´KEhjÔ-h²hh³jF/jKubh¶)�”}”(hŒc.. _NXP CBTL03062: http://pdf.datasheetarchive.com/indexerfiles/Datasheets-SW16/DSASW00308511.pdf”h]”h}”(h]”Œ nxp-cbtl03062”ah ]”h"]”Œ nxp cbtl03062”ah$]”h&]”jØ,j·.uh1hµh´KFhjÔ-h²hh³jF/jKubh¶)�”}”(hŒE.. _TI TS3DS10224: https://www.ti.com/lit/ds/symlink/ts3ds10224.pdf”h]”h}”(h]”Œ ti-ts3ds10224”ah ]”h"]”Œ ti ts3ds10224”ah$]”h&]”jØ,jÌ.uh1hµh´KGhjÔ-h²hh³jF/jKubeh}”(h]”Œ graphics-mux”ah ]”h"]”Œ graphics mux”ah$]”h&]”uh1hÄhj¯,h²hh³hÃh´KMubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Power control”h]”hŒ Power control”…”�”}”(hj¦/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj£/h²hh³hÃh´KSubhÚ)�”}”(hŒ­gmux is able to cut power to the discrete GPU. It automatically takes care of the correct sequence to tear down and bring up the power rails for core voltage, VRAM and PCIe.”h]”hŒ­gmux is able to cut power to the discrete GPU. It automatically takes care of the correct sequence to tear down and bring up the power rails for core voltage, VRAM and PCIe.”…”�”}”(hj´/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:85: ./drivers/platform/x86/apple-gmux.c”h´M÷hj£/h²hubeh}”(h]”Œ power-control”ah ]”h"]”Œ power control”ah$]”h&]”uh1hÄhj¯,h²hh³hÃh´KSubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒBacklight control”h]”hŒBacklight control”…”�”}”(hjÎ/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjË/h²hh³hÃh´KYubhÚ)�”}”(hX‰On single GPU MacBooks, the PWM signal for the backlight is generated by the GPU. On dual GPU MacBook Pros by contrast, either GPU may be suspended to conserve energy. Hence the PWM signal needs to be generated by a separate backlight driver which is controlled by gmux. The earliest generation MBP5 2008/09 uses a `TI LP8543`_ backlight driver. Newer models use a `TI LP8545`_ or a TI LP8548.”h]”(hX;On single GPU MacBooks, the PWM signal for the backlight is generated by the GPU. On dual GPU MacBook Pros by contrast, either GPU may be suspended to conserve energy. Hence the PWM signal needs to be generated by a separate backlight driver which is controlled by gmux. The earliest generation MBP5 2008/09 uses a ”…”�”}”(hjÜ/h²hh³Nh´NubjÑ)�”}”(hŒ `TI LP8543`_”h]”hŒ TI LP8543”…”�”}”(hjä/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ TI LP8543”jØ,Œ,https://www.ti.com/lit/ds/symlink/lp8543.pdf”uh1jÐhjÜ/jÚ,KubhŒ& backlight driver. Newer models use a ”…”�”}”(hjÜ/h²hh³Nh´NubjÑ)�”}”(hŒ `TI LP8545`_”h]”hŒ TI LP8545”…”�”}”(hjù/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ TI LP8545”jØ,Œ,https://www.ti.com/lit/ds/symlink/lp8545.pdf”uh1jÐhjÜ/jÚ,KubhŒ or a TI LP8548.”…”�”}”(hjÜ/h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:91: ./drivers/platform/x86/apple-gmux.c”h´MChjË/h²hubh¶)�”}”(hŒ;.. _TI LP8543: https://www.ti.com/lit/ds/symlink/lp8543.pdf”h]”h}”(h]”Œ ti-lp8543”ah ]”h"]”Œ ti lp8543”ah$]”h&]”jØ,jô/uh1hµh´KhjË/h²hh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:91: ./drivers/platform/x86/apple-gmux.c”jKubh¶)�”}”(hŒ;.. _TI LP8545: https://www.ti.com/lit/ds/symlink/lp8545.pdf”h]”h}”(h]”Œ ti-lp8545”ah ]”h"]”Œ ti lp8545”ah$]”h&]”jØ,j 0uh1hµh´K hjË/h²hh³j!0jKubeh}”(h]”Œbacklight-control”ah ]”h"]”Œbacklight control”ah$]”h&]”uh1hÄhj¯,h²hh³hÃh´KYubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒPublic functions”h]”hŒPublic functions”…”�”}”(hj90h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj60h²hh³hÃh´K_ubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œapple_gmux_detect (C function)”Œc.apple_gmux_detect”hNt”auh1jhj60h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒPbool apple_gmux_detect (struct pnp_dev *pnp_dev, enum apple_gmux_type *type_ret)”h]”j7)�”}”(hŒObool apple_gmux_detect(struct pnp_dev *pnp_dev, enum apple_gmux_type *type_ret)”h]”(j=)�”}”(hjÁ h]”hŒbool”…”�”}”(hj`0h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj\0h²hh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KVubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjn0h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj\0h²hh³jm0h´KVubj`)�”}”(hŒapple_gmux_detect”h]”jf)�”}”(hŒapple_gmux_detect”h]”hŒapple_gmux_detect”…”�”}”(hj€0h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj|0ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hj\0h²hh³jm0h´KVubj�)�”}”(hŒ9(struct pnp_dev *pnp_dev, enum apple_gmux_type *type_ret)”h]”(j‡)�”}”(hŒstruct pnp_dev *pnp_dev”h]”(j�)�”}”(hj­h]”hŒstruct”…”�”}”(hjœ0h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj˜0ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj©0h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj˜0ubh)�”}”(hhh]”jf)�”}”(hŒpnp_dev”h]”hŒpnp_dev”…”�”}”(hjº0h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj·0ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j¼0Œmodname”NŒ classname”Njåjè)�”}”jë]”jî)�”}”jáj‚0sbŒc.apple_gmux_detect”†”asbuh1hhj˜0ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚ0h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj˜0ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjè0h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj˜0ubjf)�”}”(hŒpnp_dev”h]”hŒpnp_dev”…”�”}”(hjõ0h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj˜0ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj”0ubj‡)�”}”(hŒenum apple_gmux_type *type_ret”h]”(j�)�”}”(hj,h]”hŒenum”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”j™ah"]”h$]”h&]”uh1jŒhj 1ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj 1ubh)�”}”(hhh]”jf)�”}”(hŒapple_gmux_type”h]”hŒapple_gmux_type”…”�”}”(hj,1h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj)1ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jߌreftype”jጠreftarget”j.1Œmodname”NŒ classname”Njåjè)�”}”jë]”jÖ0Œc.apple_gmux_detect”†”asbuh1hhj 1ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjJ1h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhj 1ubj)�”}”(hj)h]”hŒ*”…”�”}”(hjX1h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj 1ubjf)�”}”(hŒtype_ret”h]”hŒtype_ret”…”�”}”(hje1h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehj 1ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj”0ubeh}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hj\0h²hh³jm0h´KVubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjX0h²hh³jm0h´KVubah}”(h]”jS0ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jm0h´KVhjU0h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒ(detect if gmux is built into the machine”h]”hŒ(detect if gmux is built into the machine”…”�”}”(hj�1h²hh³Nh´Nubah}”(h]”h ]”•P5h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KVhjŒ1h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjU0h²hh³jm0h´KVubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆj§1jÇj§1jȉjɉjʉuh1j+h²hhj60h³Nh´NubjÌ)�”}”(hXú**Parameters** ``struct pnp_dev *pnp_dev`` Device to probe or NULL to use the first matching device ``enum apple_gmux_type *type_ret`` Returns (by reference) the apple_gmux_type of the device **Description** Detect if a supported gmux device is present by actually probing it. This avoids the false positives returned on some models by apple_gmux_present(). **Return** ``true`` if a supported gmux ACPI device is detected and the kernel was configured with CONFIG_APPLE_GMUX, ``false`` otherwise.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hj±1h]”hŒ Parameters”…”�”}”(hj³1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¯1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KZhj«1ubjì)�”}”(hhh]”(jñ)�”}”(hŒU``struct pnp_dev *pnp_dev`` Device to probe or NULL to use the first matching device ”h]”(j÷)�”}”(hŒ``struct pnp_dev *pnp_dev``”h]”jý)�”}”(hjÐ1h]”hŒstruct pnp_dev *pnp_dev”…”�”}”(hjÒ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjÎ1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KXhjÊ1ubj)�”}”(hhh]”hÚ)�”}”(hŒ8Device to probe or NULL to use the first matching device”h]”hŒ8Device to probe or NULL to use the first matching device”…”�”}”(hjé1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jå1h´KXhjæ1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÊ1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jå1h´KXhjÇ1ubjñ)�”}”(hŒ\``enum apple_gmux_type *type_ret`` Returns (by reference) the apple_gmux_type of the device ”h]”(j÷)�”}”(hŒ"``enum apple_gmux_type *type_ret``”h]”jý)�”}”(hj 2h]”hŒenum apple_gmux_type *type_ret”…”�”}”(hj 2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KYhj2ubj)�”}”(hhh]”hÚ)�”}”(hŒ8Returns (by reference) the apple_gmux_type of the device”h]”hŒ8Returns (by reference) the apple_gmux_type of the device”…”�”}”(hj"2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³j2h´KYhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³j2h´KYhjÇ1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëhj«1ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hjD2h]”hŒ Description”…”�”}”(hjF2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjB2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K[hj«1ubhÚ)�”}”(hŒ•Detect if a supported gmux device is present by actually probing it. This avoids the false positives returned on some models by apple_gmux_present().”h]”hŒ•Detect if a supported gmux device is present by actually probing it. This avoids the false positives returned on some models by apple_gmux_present().”…”�”}”(hjZ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KZhj«1ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hjk2h]”hŒReturn”…”�”}”(hjm2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhji2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K^hj«1ubhÚ)�”}”(hŒ``true`` if a supported gmux ACPI device is detected and the kernel was configured with CONFIG_APPLE_GMUX, ``false`` otherwise.”h]”(jý)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hj…2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj�2ubhŒc if a supported gmux ACPI device is detected and the kernel was configured with CONFIG_APPLE_GMUX, ”…”�”}”(hj�2h²hh³Nh´Nubjý)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hj—2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühj�2ubhŒ otherwise.”…”�”}”(hj�2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K_hj«1ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj60h²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j'Œapple_gmux_present (C function)”Œc.apple_gmux_present”hNt”auh1jhj60h²hh³Nh´Nubj,)�”}”(hhh]”(j1)�”}”(hŒbool apple_gmux_present (void)”h]”j7)�”}”(hŒbool apple_gmux_present(void)”h]”(j=)�”}”(hjÁ h]”hŒbool”…”�”}”(hjÐ2h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hjÌ2h²hh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K™ubjO)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÞ2h²hh³Nh´Nubah}”(h]”h ]”j[ah"]”h$]”h&]”uh1jNhjÌ2h²hh³jÝ2h´K™ubj`)�”}”(hŒapple_gmux_present”h]”jf)�”}”(hŒapple_gmux_present”h]”hŒapple_gmux_present”…”�”}”(hjð2h²hh³Nh´Nubah}”(h]”h ]”jrah"]”h$]”h&]”uh1jehjì2ubah}”(h]”h ]”(jyjzeh"]”h$]”h&]”j~juh1j_hjÌ2h²hh³jÝ2h´K™ubj�)�”}”(hŒ(void)”h]”j‡)�”}”(hŒvoid”h]”j=)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj 3h²hh³Nh´Nubah}”(h]”h ]”jIah"]”h$]”h&]”uh1j<hj3ubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj~juh1j†hj3ubah}”(h]”h ]”h"]”h$]”h&]”j~juh1j€hjÌ2h²hh³jÝ2h´K™ubeh}”(h]”h ]”h"]”h$]”h&]”j~jj–ˆuh1j6j—j˜hjÈ2h²hh³jÝ2h´K™ubah}”(h]”jÃ2ah ]”(jœj�eh"]”h$]”h&]”j¡ˆj¢)j£huh1j0h³jÝ2h´K™hjÅ2h²hubj¥)�”}”(hhh]”hÚ)�”}”(hŒ$check if gmux ACPI device is present”h]”hŒ$check if gmux ACPI device is present”…”�”}”(hj63h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K™hj33h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÅ2h²hh³jÝ2h´K™ubeh}”(h]”h ]”(jߌfunction”eh"]”h$]”h&]”jÅjßjÆjN3jÇjN3jȉjɉjʉuh1j+h²hhj60h³Nh´NubjÌ)�”}”(hXF**Parameters** ``void`` no arguments **Description** Drivers may use this to activate quirks specific to dual GPU MacBook Pros and Mac Pros, e.g. for deferred probing, runtime pm and backlight. **Return** ``true`` if gmux ACPI device is present and the kernel was configured with CONFIG_APPLE_GMUX, ``false`` otherwise.”h]”(hÚ)�”}”(hŒ**Parameters**”h]”jÖ)�”}”(hjX3h]”hŒ Parameters”…”�”}”(hjZ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjV3ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K�hjR3ubjì)�”}”(hhh]”jñ)�”}”(hŒ``void`` no arguments ”h]”(j÷)�”}”(hŒ``void``”h]”jý)�”}”(hjw3h]”hŒvoid”…”�”}”(hjy3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühju3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´Khjq3ubj)�”}”(hhh]”hÚ)�”}”(hŒ no arguments”h]”hŒ no arguments”…”�”}”(hj�3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³jŒ3h´Khj�3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjq3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðh³jŒ3h´Khjn3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjR3ubhÚ)�”}”(hŒ**Description**”h]”jÖ)�”}”(hj²3h]”hŒ Description”…”�”}”(hj´3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj°3ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KhjR3ubhÚ)�”}”(hŒŒDrivers may use this to activate quirks specific to dual GPU MacBook Pros and Mac Pros, e.g. for deferred probing, runtime pm and backlight.”h]”hŒŒDrivers may use this to activate quirks specific to dual GPU MacBook Pros and Mac Pros, e.g. for deferred probing, runtime pm and backlight.”…”�”}”(hjÈ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KšhjR3ubhÚ)�”}”(hŒ **Return**”h]”jÖ)�”}”(hjÙ3h]”hŒReturn”…”�”}”(hjÛ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj×3ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´K�hjR3ubhÚ)�”}”(hŒr``true`` if gmux ACPI device is present and the kernel was configured with CONFIG_APPLE_GMUX, ``false`` otherwise.”h]”(jý)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hjó3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjï3ubhŒV if gmux ACPI device is present and the kernel was configured with CONFIG_APPLE_GMUX, ”…”�”}”(hjï3h²hh³Nh´Nubjý)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jühjï3ubhŒ otherwise.”…”�”}”(hjï3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³Œ]/var/lib/git/docbuild/linux/Documentation/gpu/vga-switcheroo:97: ./include/linux/apple-gmux.h”h´KžhjR3ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jËhj60h²hh³Nh´Nubeh}”(h]”Œid2”ah ]”h"]”h$]”jah&]”uh1hÄhj¯,h²hh³hÃh´K_jKubeh}”(h]”Œapple-gmux-handler”ah ]”h"]”Œapple-gmux handler”ah$]”h&]”uh1hÄhjž,h²hh³hÃh´KDubeh}”(h]”Œhandlers”ah ]”h"]”Œhandlers”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KAubeh}”(h]”(hÂŒid1”eh ]”h"]”(Œvga switcheroo”Œvga_switcheroo”eh$]”h&]”uh1hÄhhh²hh³hÃh´KŒexpect_referenced_by_name”}”jB4h·sŒexpect_referenced_by_id”}”hÂh·subeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÃuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÉNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jl4Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÃŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”(Œ lattice xp2”]”jÈ,aŒrenesas r4f2113”]”jß,aŒus 8,687,007 b2”]”jí-aŒ nxp cbtl06142”]”j.aŒ ti hd3ss212”]”j&.aŒpericom pi3vdp12412”]”j;.aŒti sn74lv4066a”]”j_.aŒ nxp cbtl06141”]”jƒ.aŒ nxp cbtl03062”]”j§.aŒ ti ts3ds10224”]”j¼.aŒ ti lp8543”]”jä/aŒ ti lp8545”]”jù/auŒrefids”}”hÂ]”h·asŒnameids”}”(jB4hÂjA4j>4jõjòjxjujíjêj›,j˜,Œpublic functions”Nj“!j�!j&j&j“,j�,j94j64j14j.4j{-jx-jˆ-j…-j”-j‘-j /j�/jC/j@/jP/jM/j\/jY/jh/je/jt/jq/j€/j}/jŒ/j‰/j˜/j•/jÈ/jÅ/j30j00j0j0j+0j(0uŒ nametypes”}”(jB4ˆjA4‰jõ‰jx‰jí‰j›,‰jÉ4‰j“!‰j&‰j“,‰j94‰j14‰j{-ˆjˆ-ˆj”-ˆj /‰jC/ˆjP/ˆj\/ˆjh/ˆjt/ˆj€/ˆjŒ/ˆj˜/ˆjÈ/‰j30‰j0ˆj+0ˆuh}”(hÂhÆj>4hÆjòjWjujhjêj{j˜,jøjÿj j)j2jÑjÖjùjþjxj}jS jX jhjmjSjXj)j.jªj¯jÔjÙj²j·j�j•jßjäj�!jj#j)jajgj&j–!j³!j¹!jò"jø"j£$j©$j�,j&j3&j9&jh)jn)j64jž,j.4j¯,jx-jr-j…-j-j‘-j‹-j�/jÔ-j@/j:/jM/jG/jY/jS/je/j_/jq/jk/j}/jw/j‰/jƒ/j•/j�/jÅ/j£/j00jË/j0j0j(0j"0j'4j60jS0jX0jÃ2jÈ2uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jz4Ks…”R”Œparse_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÚ)�”}”(hŒ3Duplicate implicit target name: "public functions".”h]”hŒ7Duplicate implicit target name: “public functionsâ€�.”…”�”}”(hjí4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhjê4ubah}”(h]”h ]”h"]”h$]”h&]”j'4aŒlevel”KŒtype”ŒINFO”Œsource”hÃŒline”K_uh1jè4hj60h²hh³hÃh´K_ubaŒtransform_messages”]”(jé4)�”}”(hhh]”hÚ)�”}”(hhh]”hŒ4Hyperlink target "vga-switcheroo" is not referenced.”…”�”}”hj 5sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhj5ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j5Œsource”hÃŒline”Kuh1jè4ubjé4)�”}”(hhh]”hÚ)�”}”(hhh]”hŒ2Hyperlink target "nxp pcal6524" is not referenced.”…”�”}”hj%5sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhj"5ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j5Œsource”j~-Œline”Kuh1jè4ubeŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.