€•9Œ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/vgaarbiter”Œ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/vgaarbiter”Œ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/vgaarbiter”Œ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/vgaarbiter”Œ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/vgaarbiter”Œ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/vgaarbiter”Œ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/vgaarbiter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ VGA Arbiter”h]”hŒ VGA Arbiter”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ,decodes=,owns=,locks= (ic,mc)" An IO state string is of the form {io,mem,io+mem,none}, mc and ic are respectively mem and io lock counts (for debugging/ diagnostic only). "decodes" indicate what the card currently decodes, "owns" indicates what is currently enabled on it, and "locks" indicates what is locked by this card. If the card is unplugged, we get "invalid" then for card_ID and an -ENODEV error is returned for any command until a new card is targeted. ”h]”(j")�”}”(hŒread”h]”hŒread”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´K5hjubj2)�”}”(hhh]”(hÌ)�”}”(hŒ9Return a string indicating the status of the target like:”h]”hŒ9Return a string indicating the status of the target like:”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K*hj‘ubhÌ)�”}”(hŒG",decodes=,owns=,locks= (ic,mc)"”h]”hŒK“,decodes=,owns=,locks= (ic,mc)â€�”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K,hj‘ubhÌ)�”}”(hX¯An IO state string is of the form {io,mem,io+mem,none}, mc and ic are respectively mem and io lock counts (for debugging/ diagnostic only). "decodes" indicate what the card currently decodes, "owns" indicates what is currently enabled on it, and "locks" indicates what is locked by this card. If the card is unplugged, we get "invalid" then for card_ID and an -ENODEV error is returned for any command until a new card is targeted.”h]”hX¿An IO state string is of the form {io,mem,io+mem,none}, mc and ic are respectively mem and io lock counts (for debugging/ diagnostic only). “decodesâ€� indicate what the card currently decodes, “ownsâ€� indicates what is currently enabled on it, and “locksâ€� indicates what is locked by this card. If the card is unplugged, we get “invalidâ€� then for card_ID and an -ENODEV error is returned for any command until a new card is targeted.”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K.hj‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j1hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´K5hjh²hubj)�”}”(hXŽwrite Write a command to the arbiter. List of commands: target switch target to card (see below) lock acquires locks on target ("none" is an invalid io_state) trylock non-blocking acquire locks on target (returns EBUSY if unsuccessful) unlock release locks on target unlock all release all locks on target held by this user (not implemented yet) decodes set the legacy decoding attributes for the card poll event if something changes on any card (not just the target) card_ID is of the form "PCI:domain:bus:dev.fn". It can be set to "default" to go back to the system default card (TODO: not implemented yet). Currently, only PCI is supported as a prefix, but the userland API may support other bus types in the future, even if the current kernel implementation doesn't. ”h]”(j")�”}”(hŒwrite”h]”hŒwrite”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´KOhjÊubj2)�”}”(hhh]”(hÌ)�”}”(hŒ1Write a command to the arbiter. List of commands:”h]”hŒ1Write a command to the arbiter. List of commands:”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K8hjÜubj)�”}”(hhh]”(j)�”}”(hŒ switch target to card (see below)”h]”(j")�”}”(hŒtarget ”h]”hŒtarget ”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´K:hjðubj2)�”}”(hhh]”hÌ)�”}”(hŒ+switch target to card (see below)”h]”hŒ+switch target to card (see below)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K;hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjðubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´K:hjíubj)�”}”(hŒHlock acquires locks on target ("none" is an invalid io_state)”h]”(j")�”}”(hŒlock ”h]”hŒlock ”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´K non-blocking acquire locks on target (returns EBUSY if unsuccessful)”h]”(j")�”}”(hŒtrylock ”h]”hŒtrylock ”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´K?hjNubj2)�”}”(hhh]”hÌ)�”}”(hŒDnon-blocking acquire locks on target (returns EBUSY if unsuccessful)”h]”hŒDnon-blocking acquire locks on target (returns EBUSY if unsuccessful)”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K?hj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjNubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´K?hjíubj)�”}”(hŒ)unlock release locks on target”h]”(j")�”}”(hŒunlock ”h]”hŒunlock ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´KAhj}ubj2)�”}”(hhh]”hÌ)�”}”(hŒrelease locks on target”h]”hŒrelease locks on target”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KBhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´KAhjíubj)�”}”(hŒNunlock all release all locks on target held by this user (not implemented yet)”h]”(j")�”}”(hŒ unlock all”h]”hŒ unlock all”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´KDhj¬ubj2)�”}”(hhh]”hÌ)�”}”(hŒCrelease all locks on target held by this user (not implemented yet)”h]”hŒCrelease all locks on target held by this user (not implemented yet)”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KDhj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´KDhjíubj)�”}”(hŒCdecodes set the legacy decoding attributes for the card ”h]”(j")�”}”(hŒdecodes ”h]”hŒdecodes ”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´KGhjÛubj2)�”}”(hhh]”hÌ)�”}”(hŒ/set the legacy decoding attributes for the card”h]”hŒ/set the legacy decoding attributes for the card”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KGhjíubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjÛubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´KGhjíubj)�”}”(hŒBpoll event if something changes on any card (not just the target) ”h]”(j")�”}”(hŒpoll”h]”hŒpoll”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³hÊh´KJhj ubj2)�”}”(hhh]”hÌ)�”}”(hŒh´Kuubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjMubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”jRŒmodname”NŒ classname”Nj_jb)�”}”je]”jh)�”}”j[Œvga_default_device”sbŒc.vga_default_device”†”asbuh1hhj-h²hh³j>h´Kuubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj-h²hh³j>h´Kuubj|)�”}”(hjh]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hj-h²hh³j>h´Kuubjö)�”}”(hŒvga_default_device”h]”jü)�”}”(hjnh]”hŒvga_default_device”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjŒubah}”(h]”h ]”(jjeh"]”h$]”h&]”jjuh1jõhj-h²hh³j>h´Kuubj)�”}”(hŒ(void)”h]”j)�”}”(hŒvoid”h]”jÓ)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj§ubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj£ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jhj-h²hh³j>h´Kuubeh}”(h]”h ]”h"]”h$]”h&]”jjjþˆuh1jÌjÿjhj)h²hh³j>h´Kuubah}”(h]”j$ah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jÆh³j>h´Kuhj&h²hubj )�”}”(hhh]”hÌ)�”}”(hŒ)return the default VGA device, for vgacon”h]”hŒ)return the default VGA device, for vgacon”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´KuhjÒh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj&h²hh³j>h´Kuubeh}”(h]”h ]”(jYŒfunction”eh"]”h$]”h&]”jjYjjíj jíj!‰j"‰j#‰uh1jÁh²hhjŸh³Nh´Nubj%)�”}”(hX**Parameters** ``void`` no arguments **Description** This can be defined by the platform. The default implementation is rather dumb and will probably only work properly on single VGA card setups and/or x86 platforms. If your VGA default device is not PCI, you'll have to return NULL here. In this case, I assume it will not conflict with any PCI card. If this is not true, I'll have to define two arch hooks for enabling/disabling the VGA default device if that is possible. This may be a problem with real _ISA_ VGA cards, in addition to a PCI one. I don't know at this point how to deal with that card. Can their IOs be disabled at all? If not, then I suppose it's a matter of having the proper arch hook telling us about it, so we basically never allow anybody to succeed a vga_get().”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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Kyhjñubj)�”}”(hhh]”j)�”}”(hŒ``void`` no arguments ”h]”(j")�”}”(hŒ``void``”h]”jP)�”}”(hj h]”hŒvoid”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Khj ubj2)�”}”(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&]”uh1j1hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j+ h´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjñubhÌ)�”}”(hŒ**Description**”h]”j/)�”}”(hjQ h]”hŒ Description”…”�”}”(hjS h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjO ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´KhjñubhÌ)�”}”(hŒ£This can be defined by the platform. The default implementation is rather dumb and will probably only work properly on single VGA card setups and/or x86 platforms.”h]”hŒ£This can be defined by the platform. The default implementation is rather dumb and will probably only work properly on single VGA card setups and/or x86 platforms.”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´KvhjñubhÌ)�”}”(hX:If your VGA default device is not PCI, you'll have to return NULL here. In this case, I assume it will not conflict with any PCI card. If this is not true, I'll have to define two arch hooks for enabling/disabling the VGA default device if that is possible. This may be a problem with real _ISA_ VGA cards, in addition to a PCI one. I don't know at this point how to deal with that card. Can their IOs be disabled at all? If not, then I suppose it's a matter of having the proper arch hook telling us about it, so we basically never allow anybody to succeed a vga_get().”h]”hXBIf your VGA default device is not PCI, you’ll have to return NULL here. In this case, I assume it will not conflict with any PCI card. If this is not true, I’ll have to define two arch hooks for enabling/disabling the VGA default device if that is possible. This may be a problem with real _ISA_ VGA cards, in addition to a PCI one. I don’t know at this point how to deal with that card. Can their IOs be disabled at all? If not, then I suppose it’s a matter of having the proper arch hook telling us about it, so we basically never allow anybody to succeed a vga_get().”…”�”}”(hjv h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Kzhjñubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j$hjŸh²hh³Nh´Nubj±)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j½Œvga_remove_vgacon (C function)”Œc.vga_remove_vgacon”hNt”auh1j°hjŸh²hh³Nh´NubjÂ)�”}”(hhh]”(jÇ)�”}”(hŒ,int vga_remove_vgacon (struct pci_dev *pdev)”h]”jÍ)�”}”(hŒ+int vga_remove_vgacon(struct pci_dev *pdev)”h]”(jÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj¡ h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´K”ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj´ h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj¡ h²hh³j³ h´K”ubjö)�”}”(hŒvga_remove_vgacon”h]”jü)�”}”(hŒvga_remove_vgacon”h]”hŒvga_remove_vgacon”…”�”}”(hjÆ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj ubah}”(h]”h ]”(jjeh"]”h$]”h&]”jjuh1jõhj¡ h²hh³j³ h´K”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Þ ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjÞ ubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjý ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”j Œmodname”NŒ classname”Nj_jb)�”}”je]”jh)�”}”j[jÈ sbŒc.vga_remove_vgacon”†”asbuh1hhjÞ ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjÞ ubj|)�”}”(hjh]”hŒ*”…”�”}”(hj. h²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjÞ ubjü)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj; h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjÞ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhjÚ ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jhj¡ h²hh³j³ h´K”ubeh}”(h]”h ]”h"]”h$]”h&]”jjjþˆuh1jÌjÿjhj� h²hh³j³ h´K”ubah}”(h]”j˜ ah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jÆh³j³ h´K”hjš h²hubj )�”}”(hhh]”hÌ)�”}”(hŒdeactivate VGA console”h]”hŒdeactivate VGA console”…”�”}”(hje h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´K”hjb h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjš h²hh³j³ h´K”ubeh}”(h]”h ]”(jYŒfunction”eh"]”h$]”h&]”jjYjj} j j} j!‰j"‰j#‰uh1jÁh²hhjŸh³Nh´Nubj%)�”}”(hX **Parameters** ``struct pci_dev *pdev`` PCI device. **Description** Unbind and unregister vgacon in case pdev is the default VGA device. Can be called by GPU drivers on initialization to make sure VGA register access done by vgacon will not disturb the device.”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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´K˜hj� ubj)�”}”(hhh]”j)�”}”(hŒ%``struct pci_dev *pdev`` PCI device. ”h]”(j")�”}”(hŒ``struct pci_dev *pdev``”h]”jP)�”}”(hj¦ h]”hŒstruct pci_dev *pdev”…”�”}”(hj¨ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj¤ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Kšhj  ubj2)�”}”(hhh]”hÌ)�”}”(hŒ PCI device.”h]”hŒ PCI device.”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j» h´Kšhj¼ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj  ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j» h´Kšhj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj� 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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Kœhj� ubhÌ)�”}”(hŒÀUnbind and unregister vgacon in case pdev is the default VGA device. Can be called by GPU drivers on initialization to make sure VGA register access done by vgacon will not disturb the device.”h]”hŒÀUnbind and unregister vgacon in case pdev is the default VGA device. Can be called by GPU drivers on initialization to make sure VGA register access done by vgacon will not disturb the device.”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.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_get (C function)”Œ c.vga_get”hNt”auh1j°hjŸh²hh³Nh´NubjÂ)�”}”(hhh]”(jÇ)�”}”(hŒHint vga_get (struct pci_dev *pdev, unsigned int rsrc, int interruptible)”h]”jÍ)�”}”(hŒGint vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)”h]”(jÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj" h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M–ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj" h²hh³j4 h´M–ubjö)�”}”(hŒvga_get”h]”jü)�”}”(hŒvga_get”h]”hŒvga_get”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjC ubah}”(h]”h ]”(jjeh"]”h$]”h&]”jjuh1jõhj" h²hh³j4 h´M–ubj)�”}”(hŒ<(struct pci_dev *pdev, unsigned int rsrc, int interruptible)”h]”(j)�”}”(hŒstruct pci_dev *pdev”h]”(j#)�”}”(hj&h]”hŒstruct”…”�”}”(hjc h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj_ ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj_ ubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj~ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”jƒ Œmodname”NŒ classname”Nj_jb)�”}”je]”jh)�”}”j[jI sbŒ c.vga_get”†”asbuh1hhj_ ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¡ h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj_ ubj|)�”}”(hjh]”hŒ*”…”�”}”(hj¯ h²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hj_ ubjü)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj¼ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj_ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj[ ubj)�”}”(hŒunsigned int rsrc”h]”(jÓ)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjÑ ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjÑ ubjÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjÑ ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjÑ ubjü)�”}”(hŒrsrc”h]”hŒrsrc”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjÑ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj[ ubj)�”}”(hŒint interruptible”h]”(jÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj" ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj" ubjü)�”}”(hŒ interruptible”h]”hŒ interruptible”…”�”}”(hjB h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj" ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj[ ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jhj" h²hh³j4 h´M–ubeh}”(h]”h ]”h"]”h$]”h&]”jjjþˆuh1jÌjÿjhj h²hh³j4 h´M–ubah}”(h]”j ah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jÆh³j4 h´M–hj h²hubj )�”}”(hhh]”hÌ)�”}”(hŒacquire & lock VGA resources”h]”hŒacquire & lock VGA resources”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M–hji h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj h²hh³j4 h´M–ubeh}”(h]”h ]”(jYŒfunction”eh"]”h$]”h&]”jjYjj„ j j„ j!‰j"‰j#‰uh1jÁh²hhjŸh³Nh´Nubj%)�”}”(hX**Parameters** ``struct pci_dev *pdev`` PCI device of the VGA card or NULL for the system default ``unsigned int rsrc`` bit mask of resources to acquire and lock ``int interruptible`` blocking should be interruptible by signals ? **Description** Acquire VGA resources for the given card and mark those resources locked. If the resources requested are "normal" (and not legacy) resources, the arbiter will first check whether the card is doing legacy decoding for that type of resource. If yes, the lock is "converted" into a legacy resource lock. The arbiter will first look for all VGA cards that might conflict and disable their IOs and/or Memory access, including VGA forwarding on P2P bridges if necessary, so that the requested resources can be used. Then, the card is marked as locking these resources and the IO and/or Memory accesses are enabled on the card (including VGA forwarding on parent P2P bridges if any). This function will block if some conflicting card is already locking one of the required resources (or any resource on a different bus segment, since P2P bridges don't differentiate VGA memory and IO afaik). You can indicate whether this blocking should be interruptible by a signal (for userland interface) or not. Must not be called at interrupt time or in atomic context. If the card already owns the resources, the function succeeds. Nested calls are supported (a per-resource counter is maintained) On success, release the VGA resource again with vga_put(). 0 on success, negative error code on failure.”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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mšhjˆ ubj)�”}”(hhh]”(j)�”}”(hŒS``struct pci_dev *pdev`` PCI device of the VGA card or NULL for the system default ”h]”(j")�”}”(hŒ``struct pci_dev *pdev``”h]”jP)�”}”(hj­ h]”hŒstruct pci_dev *pdev”…”�”}”(hj¯ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj« ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M—hj§ ubj2)�”}”(hhh]”hÌ)�”}”(hŒ9PCI device of the VGA card or NULL for the system default”h]”hŒ9PCI device of the VGA card or NULL for the system default”…”�”}”(hjÆ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j h´M—hjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj§ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j h´M—hj¤ ubj)�”}”(hŒ@``unsigned int rsrc`` bit mask of resources to acquire and lock ”h]”(j")�”}”(hŒ``unsigned int rsrc``”h]”jP)�”}”(hjæ h]”hŒunsigned int rsrc”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhjä ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M˜hjà ubj2)�”}”(hhh]”hÌ)�”}”(hŒ)bit mask of resources to acquire and lock”h]”hŒ)bit mask of resources to acquire and lock”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jû h´M˜hjü ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjà ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jû h´M˜hj¤ ubj)�”}”(hŒD``int interruptible`` blocking should be interruptible by signals ? ”h]”(j")�”}”(hŒ``int interruptible``”h]”jP)�”}”(hj h]”hŒint interruptible”…”�”}”(hj! h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M™hj ubj2)�”}”(hhh]”hÌ)�”}”(hŒ-blocking should be interruptible by signals ?”h]”hŒ-blocking should be interruptible by signals ?”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j4 h´M™hj5 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j4 h´M™hj¤ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhjˆ ubhÌ)�”}”(hŒ**Description**”h]”j/)�”}”(hjZ h]”hŒ Description”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M›hjˆ ubhÌ)�”}”(hX,Acquire VGA resources for the given card and mark those resources locked. If the resources requested are "normal" (and not legacy) resources, the arbiter will first check whether the card is doing legacy decoding for that type of resource. If yes, the lock is "converted" into a legacy resource lock.”h]”hX4Acquire VGA resources for the given card and mark those resources locked. If the resources requested are “normalâ€� (and not legacy) resources, the arbiter will first check whether the card is doing legacy decoding for that type of resource. If yes, the lock is “convertedâ€� into a legacy resource lock.”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mšhjˆ ubhÌ)�”}”(hXwThe arbiter will first look for all VGA cards that might conflict and disable their IOs and/or Memory access, including VGA forwarding on P2P bridges if necessary, so that the requested resources can be used. Then, the card is marked as locking these resources and the IO and/or Memory accesses are enabled on the card (including VGA forwarding on parent P2P bridges if any).”h]”hXwThe arbiter will first look for all VGA cards that might conflict and disable their IOs and/or Memory access, including VGA forwarding on P2P bridges if necessary, so that the requested resources can be used. Then, the card is marked as locking these resources and the IO and/or Memory accesses are enabled on the card (including VGA forwarding on parent P2P bridges if any).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M hjˆ ubhÌ)�”}”(hX;This function will block if some conflicting card is already locking one of the required resources (or any resource on a different bus segment, since P2P bridges don't differentiate VGA memory and IO afaik). You can indicate whether this blocking should be interruptible by a signal (for userland interface) or not.”h]”hX=This function will block if some conflicting card is already locking one of the required resources (or any resource on a different bus segment, since P2P bridges don’t differentiate VGA memory and IO afaik). You can indicate whether this blocking should be interruptible by a signal (for userland interface) or not.”…”�”}”(hjŽ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M¦hjˆ ubhÌ)�”}”(hŒ½Must not be called at interrupt time or in atomic context. If the card already owns the resources, the function succeeds. Nested calls are supported (a per-resource counter is maintained)”h]”hŒ½Must not be called at interrupt time or in atomic context. If the card already owns the resources, the function succeeds. Nested calls are supported (a per-resource counter is maintained)”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M¬hjˆ ubhÌ)�”}”(hŒ:On success, release the VGA resource again with vga_put().”h]”hŒ:On success, release the VGA resource again with vga_put().”…”�”}”(hj¬ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M°hjˆ ubhÌ)�”}”(hŒ-0 on success, negative error code on failure.”h]”hŒ-0 on success, negative error code on failure.”…”�”}”(hj» h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.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_put (C function)”Œ c.vga_put”hNt”auh1j°hjŸh²hh³Nh´NubjÂ)�”}”(hhh]”(jÇ)�”}”(hŒ6void vga_put (struct pci_dev *pdev, unsigned int rsrc)”h]”jÍ)�”}”(hŒ5void vga_put(struct pci_dev *pdev, unsigned int rsrc)”h]”(jÓ)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjê h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjæ h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjæ h²hh³jø h´Mubjö)�”}”(hŒvga_put”h]”jü)�”}”(hŒvga_put”h]”hŒvga_put”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjubah}”(h]”h ]”(jjeh"]”h$]”h&]”jjuh1jõhjæ h²hh³jø h´Mubj)�”}”(hŒ)(struct pci_dev *pdev, unsigned int rsrc)”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#ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj#ubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjBubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”jGŒmodname”NŒ classname”Nj_jb)�”}”je]”jh)�”}”j[j sbŒ c.vga_put”†”asbuh1hhj#ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj#ubj|)�”}”(hjh]”hŒ*”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hj#ubjü)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj#ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhjubj)�”}”(hŒunsigned int rsrc”h]”(jÓ)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj•ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj•ubjÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj•ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj•ubjü)�”}”(hŒrsrc”h]”hŒrsrc”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj•ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jhjæ h²hh³jø h´Mubeh}”(h]”h ]”h"]”h$]”h&]”jjjþˆuh1jÌjÿjhjâ h²hh³jø h´Mubah}”(h]”jÝ ah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jÆh³jø h´Mhjß h²hubj )�”}”(hhh]”hÌ)�”}”(hŒ$release lock on legacy VGA resources”h]”hŒ$release lock on legacy VGA resources”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mhjøh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjß h²hh³jø h´Mubeh}”(h]”h ]”(jYŒfunction”eh"]”h$]”h&]”jjYjjj jj!‰j"‰j#‰uh1jÁh²hhjŸh³Nh´Nubj%)�”}”(hX®**Parameters** ``struct pci_dev *pdev`` PCI device of VGA card or NULL for system default ``unsigned int rsrc`` bit mask of resource to release **Description** Release resources previously locked by vga_get() or vga_tryget(). The resources aren't disabled right away, so that a subsequent vga_get() on the same card will succeed immediately. Resources have a counter, so locks are only released if the counter reaches 0.”h]”(hÌ)�”}”(hŒ**Parameters**”h]”j/)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mhjubj)�”}”(hhh]”(j)�”}”(hŒK``struct pci_dev *pdev`` PCI device of VGA card or NULL for system default ”h]”(j")�”}”(hŒ``struct pci_dev *pdev``”h]”jP)�”}”(hj<h]”hŒstruct pci_dev *pdev”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mhj6ubj2)�”}”(hhh]”hÌ)�”}”(hŒ1PCI device of VGA card or NULL for system default”h]”hŒ1PCI device of VGA card or NULL for system default”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jQh´MhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj6ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jQh´Mhj3ubj)�”}”(hŒ6``unsigned int rsrc`` bit mask of resource to release ”h]”(j")�”}”(hŒ``unsigned int rsrc``”h]”jP)�”}”(hjuh]”hŒunsigned int rsrc”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhjsubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mhjoubj2)�”}”(hhh]”hÌ)�”}”(hŒbit mask of resource to release”h]”hŒbit mask of resource to release”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jŠh´Mhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjoubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jŠh´Mhj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhÌ)�”}”(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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´MhjubhÌ)�”}”(hXRelease resources previously locked by vga_get() or vga_tryget(). The resources aren't disabled right away, so that a subsequent vga_get() on the same card will succeed immediately. Resources have a counter, so locks are only released if the counter reaches 0.”h]”hXRelease resources previously locked by vga_get() or vga_tryget(). The resources aren’t disabled right away, so that a subsequent vga_get() on the same card will succeed immediately. Resources have a counter, so locks are only released if the counter reaches 0.”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mhjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j$hjŸh²hh³Nh´Nubj±)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j½Œ$vga_set_legacy_decoding (C function)”Œc.vga_set_legacy_decoding”hNt”auh1j°hjŸh²hh³Nh´NubjÂ)�”}”(hhh]”(jÇ)�”}”(hŒIvoid vga_set_legacy_decoding (struct pci_dev *pdev, unsigned int decodes)”h]”jÍ)�”}”(hŒHvoid vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes)”h]”(jÓ)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjñh²hh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M–ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjñh²hh³jh´M–ubjö)�”}”(hŒvga_set_legacy_decoding”h]”jü)�”}”(hŒvga_set_legacy_decoding”h]”hŒvga_set_legacy_decoding”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjubah}”(h]”h ]”(jjeh"]”h$]”h&]”jjuh1jõhjñh²hh³jh´M–ubj)�”}”(hŒ,(struct pci_dev *pdev, unsigned int decodes)”h]”(j)�”}”(hŒstruct pci_dev *pdev”h]”(j#)�”}”(hj&h]”hŒstruct”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj.ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj.ubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjMubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”jRŒmodname”NŒ classname”Nj_jb)�”}”je]”jh)�”}”j[jsbŒc.vga_set_legacy_decoding”†”asbuh1hhj.ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj.ubj|)�”}”(hjh]”hŒ*”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hj.ubjü)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj.ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj*ubj)�”}”(hŒunsigned int decodes”h]”(jÓ)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj ubjÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhj ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj ubjü)�”}”(hŒdecodes”h]”hŒdecodes”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj*ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jhjñh²hh³jh´M–ubeh}”(h]”h ]”h"]”h$]”h&]”jjjþˆuh1jÌjÿjhjíh²hh³jh´M–ubah}”(h]”jèah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jÆh³jh´M–hjêh²hubj )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j hjêh²hh³jh´M–ubeh}”(h]”h ]”(jYŒfunction”eh"]”h$]”h&]”jjYjjj jj!‰j"‰j#‰uh1jÁh²hhjŸh³Nh´Nubj%)�”}”(hXå**Parameters** ``struct pci_dev *pdev`` PCI device of the VGA card ``unsigned int decodes`` bit mask of what legacy regions the card decodes **Description** Indicate to the arbiter if the card decodes legacy VGA IOs, legacy VGA Memory, both, or none. All cards default to both, the card driver (fbdev for example) should tell the arbiter if it has disabled legacy decoding, so the card can be left out of the arbitration process (and can be safe to take interrupts at any time.”h]”(hÌ)�”}”(hŒ**Parameters**”h]”j/)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mšhjubj)�”}”(hhh]”(j)�”}”(hŒ4``struct pci_dev *pdev`` PCI device of the VGA card ”h]”(j")�”}”(hŒ``struct pci_dev *pdev``”h]”jP)�”}”(hj8h]”hŒstruct pci_dev *pdev”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M—hj2ubj2)�”}”(hhh]”hÌ)�”}”(hŒPCI device of the VGA card”h]”hŒPCI device of the VGA card”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jMh´M—hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jMh´M—hj/ubj)�”}”(hŒJ``unsigned int decodes`` bit mask of what legacy regions the card decodes ”h]”(j")�”}”(hŒ``unsigned int decodes``”h]”jP)�”}”(hjqh]”hŒunsigned int decodes”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M˜hjkubj2)�”}”(hhh]”hÌ)�”}”(hŒ0bit mask of what legacy regions the card decodes”h]”hŒ0bit mask of what legacy regions the card decodes”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j†h´M˜hj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjkubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j†h´M˜hj/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhÌ)�”}”(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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´MšhjubhÌ)�”}”(hX@Indicate to the arbiter if the card decodes legacy VGA IOs, legacy VGA Memory, both, or none. All cards default to both, the card driver (fbdev for example) should tell the arbiter if it has disabled legacy decoding, so the card can be left out of the arbitration process (and can be safe to take interrupts at any time.”h]”hX@Indicate to the arbiter if the card decodes legacy VGA IOs, legacy VGA Memory, both, or none. All cards default to both, the card driver (fbdev for example) should tell the arbiter if it has disabled legacy decoding, so the card can be left out of the arbitration process (and can be safe to take interrupts at any time.”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.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_client_register (C function)”Œc.vga_client_register”hNt”auh1j°hjŸh²hh³Nh´NubjÂ)�”}”(hhh]”(jÇ)�”}”(hŒmint vga_client_register (struct pci_dev *pdev, unsigned int (*set_decode)(struct pci_dev *pdev, bool decode))”h]”jÍ)�”}”(hŒlint vga_client_register(struct pci_dev *pdev, unsigned int (*set_decode)(struct pci_dev *pdev, bool decode))”•Í`h]”(jÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjíh²hh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M§ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjíh²hh³jÿh´M§ubjö)�”}”(hŒvga_client_register”h]”jü)�”}”(hŒvga_client_register”h]”hŒvga_client_register”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjubah}”(h]”h ]”(jjeh"]”h$]”h&]”jjuh1jõhjíh²hh³jÿh´M§ubj)�”}”(hŒU(struct pci_dev *pdev, unsigned int (*set_decode)(struct pci_dev *pdev, bool decode))”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*ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj*ubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjIubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”jNŒmodname”NŒ classname”Nj_jb)�”}”je]”jh)�”}”j[jsbŒc.vga_client_register”†”asbuh1hhj*ubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähj*ubj|)�”}”(hjh]”hŒ*”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hj*ubjü)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj*ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj&ubj)�”}”(hŒ=unsigned int (*set_decode)(struct pci_dev *pdev, bool decode)”h]”(jÓ)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjœubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjœubjÓ)�”}”(hŒint”h]”hŒint”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjœubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjœubj|)�”}”(hŒ(”h]”hŒ(”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubj|)�”}”(hjh]”hŒ*”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubjü)�”}”(hŒ set_decode”h]”hŒ set_decode”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjœubj|)�”}”(hŒ)”h]”hŒ)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubj|)�”}”(hjÚh]”hŒ(”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubj#)�”}”(hj&h]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjœubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjœubh)�”}”(hhh]”jü)�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhj7ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jYŒreftype”j[Œ reftarget”j<Œmodname”NŒ classname”Nj_jb)�”}”je]”jhŒc.vga_client_register”†”asbuh1hhjœubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjœubj|)�”}”(hjh]”hŒ*”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubjü)�”}”(hŒpdev”h]”hŒpdev”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjœubj|)�”}”(hŒ,”h]”hŒ,”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjœubjÓ)�”}”(hŒbool”h]”hŒbool”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jßah"]”h$]”h&]”uh1jÒhjœubjå)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”jñah"]”h$]”h&]”uh1jähjœubjü)�”}”(hŒdecode”h]”hŒdecode”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jûhjœubj|)�”}”(hjh]”hŒ)”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”jˆah"]”h$]”h&]”uh1j{hjœubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆjjuh1jhj&ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jhjíh²hh³jÿh´M§ubeh}”(h]”h ]”h"]”h$]”h&]”jjjþˆuh1jÌjÿjhjéh²hh³jÿh´M§ubah}”(h]”jäah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jÆh³jÿh´M§hjæh²hubj )�”}”(hhh]”hÌ)�”}”(hŒ/register or unregister a VGA arbitration client”h]”hŒ/register or unregister a VGA arbitration client”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M§hjíh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjæh²hh³jÿh´M§ubeh}”(h]”h ]”(jYŒfunction”eh"]”h$]”h&]”jjYjjj jj!‰j"‰j#‰uh1jÁh²hhjŸh³Nh´Nubj%)�”}”(hX¿**Parameters** ``struct pci_dev *pdev`` PCI device of the VGA client ``unsigned int (*set_decode)(struct pci_dev *pdev, bool decode)`` VGA decode change callback **Description** Clients have two callback mechanisms they can use. **set_decode** callback: If a client can disable its GPU VGA resource, it will get a callback from this to set the encode/decode state. Rationale: we cannot disable VGA decode resources unconditionally because some single GPU laptops seem to require ACPI or BIOS access to the VGA registers to control things like backlights etc. Hopefully newer multi-GPU laptops do something saner, and desktops won't have any special ACPI for this. The driver will get a callback when VGA arbitration is first used by userspace since some older X servers have issues. Does not check whether a client for **pdev** has been registered already. To unregister, call vga_client_unregister(). **Return** 0 on success, -ENODEV on failure”h]”(hÌ)�”}”(hŒ**Parameters**”h]”j/)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M«hj ubj)�”}”(hhh]”(j)�”}”(hŒ6``struct pci_dev *pdev`` PCI device of the VGA client ”h]”(j")�”}”(hŒ``struct pci_dev *pdev``”h]”jP)�”}”(hj1h]”hŒstruct pci_dev *pdev”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M¨hj+ubj2)�”}”(hhh]”hÌ)�”}”(hŒPCI device of the VGA client”h]”hŒPCI device of the VGA client”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jFh´M¨hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jFh´M¨hj(ubj)�”}”(hŒ]``unsigned int (*set_decode)(struct pci_dev *pdev, bool decode)`` VGA decode change callback ”h]”(j")�”}”(hŒA``unsigned int (*set_decode)(struct pci_dev *pdev, bool decode)``”h]”jP)�”}”(hjjh]”hŒ=unsigned int (*set_decode)(struct pci_dev *pdev, bool decode)”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1j!h³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M©hjdubj2)�”}”(hhh]”hÌ)�”}”(hŒVGA decode change callback”h]”hŒVGA decode change callback”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´M©hj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjdubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jh´M©hj(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhj 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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M«hj ubhÌ)�”}”(hŒ2Clients have two callback mechanisms they can use.”h]”hŒ2Clients have two callback mechanisms they can use.”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´Mªhj ubhÌ)�”}”(hŒ‡**set_decode** callback: If a client can disable its GPU VGA resource, it will get a callback from this to set the encode/decode state.”h]”(j/)�”}”(hŒ**set_decode**”h]”hŒ set_decode”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjÊubhŒy callback: If a client can disable its GPU VGA resource, it will get a callback from this to set the encode/decode state.”…”�”}”(hjÊh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M¬hj ubhÌ)�”}”(hX¡Rationale: we cannot disable VGA decode resources unconditionally because some single GPU laptops seem to require ACPI or BIOS access to the VGA registers to control things like backlights etc. Hopefully newer multi-GPU laptops do something saner, and desktops won't have any special ACPI for this. The driver will get a callback when VGA arbitration is first used by userspace since some older X servers have issues.”h]”hX£Rationale: we cannot disable VGA decode resources unconditionally because some single GPU laptops seem to require ACPI or BIOS access to the VGA registers to control things like backlights etc. Hopefully newer multi-GPU laptops do something saner, and desktops won’t have any special ACPI for this. The driver will get a callback when VGA arbitration is first used by userspace since some older X servers have issues.”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M¯hj ubhÌ)�”}”(hŒIDoes not check whether a client for **pdev** has been registered already.”h]”(hŒ$Does not check whether a client for ”…”�”}”(hjöh²hh³Nh´Nubj/)�”}”(hŒ**pdev**”h]”hŒpdev”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjöubhŒ has been registered already.”…”�”}”(hjöh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M·hj ubhÌ)�”}”(hŒ,To unregister, call vga_client_unregister().”h]”hŒ,To unregister, call vga_client_unregister().”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.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³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M»hj ubhÌ)�”}”(hŒ 0 on success, -ENODEV on failure”h]”hŒ 0 on success, -ENODEV on failure”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³ŒT/var/lib/git/docbuild/linux/Documentation/gpu/vgaarbiter:103: ./drivers/pci/vgaarb.c”h´M¼hj ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j$hjŸh²hh³Nh´Nubeh}”(h]”Œin-kernel-interface”ah ]”h"]”Œin-kernel interface”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kbubh¶)�”}”(hhh]”(h»)�”}”(hŒ libpciaccess”h]”hŒ libpciaccess”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj\h²hh³hÊh´KkubhÌ)�”}”(hŒ¢To use the vga arbiter char device, an API was implemented inside the libpciaccess library. One field was added to struct pci_device (each device on the system)::”h]”hŒ¡To use the vga arbiter char device, an API was implemented inside the libpciaccess library. One field was added to struct pci_device (each device on the system):”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kmhj\h²hubhŒ literal_block”“”)�”}”(hŒA/* the type of resource decoded by the device */ int vgaarb_rsrc;”h]”hŒA/* the type of resource decoded by the device */ int vgaarb_rsrc;”…”�”}”hj}sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´Kqhj\h²hubhÌ)�”}”(hŒ&Besides it, in pci_system were added::”h]”hŒ%Besides it, in pci_system were added:”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kthj\h²hubj|)�”}”(hŒ`int vgaarb_fd; int vga_count; struct pci_device *vga_target; struct pci_device *vga_default_dev;”h]”hŒ`int vgaarb_fd; int vga_count; struct pci_device *vga_target; struct pci_device *vga_default_dev;”…”�”}”hj™sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´Kvhj\h²hubhÌ)�”}”(hŒšThe vga_count is used to track how many cards are being arbitrated, so for instance, if there is only one card, then it can completely escape arbitration.”h]”hŒšThe vga_count is used to track how many cards are being arbitrated, so for instance, if there is only one card, then it can completely escape arbitration.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K{hj\h²hubhÌ)�”}”(hXgThese functions below acquire VGA resources for the given card and mark those resources as locked. If the resources requested are "normal" (and not legacy) resources, the arbiter will first check whether the card is doing legacy decoding for that type of resource. If yes, the lock is "converted" into a legacy resource lock. The arbiter will first look for all VGA cards that might conflict and disable their IOs and/or Memory access, including VGA forwarding on P2P bridges if necessary, so that the requested resources can be used. Then, the card is marked as locking these resources and the IO and/or Memory access is enabled on the card (including VGA forwarding on parent P2P bridges if any). In the case of vga_arb_lock(), the function will block if some conflicting card is already locking one of the required resources (or any resource on a different bus segment, since P2P bridges don't differentiate VGA memory and IO afaik). If the card already owns the resources, the function succeeds. vga_arb_trylock() will return (-EBUSY) instead of blocking. Nested calls are supported (a per-resource counter is maintained).”h]”hXqThese functions below acquire VGA resources for the given card and mark those resources as locked. If the resources requested are “normalâ€� (and not legacy) resources, the arbiter will first check whether the card is doing legacy decoding for that type of resource. If yes, the lock is “convertedâ€� into a legacy resource lock. The arbiter will first look for all VGA cards that might conflict and disable their IOs and/or Memory access, including VGA forwarding on P2P bridges if necessary, so that the requested resources can be used. Then, the card is marked as locking these resources and the IO and/or Memory access is enabled on the card (including VGA forwarding on parent P2P bridges if any). In the case of vga_arb_lock(), the function will block if some conflicting card is already locking one of the required resources (or any resource on a different bus segment, since P2P bridges don’t differentiate VGA memory and IO afaik). If the card already owns the resources, the function succeeds. vga_arb_trylock() will return (-EBUSY) instead of blocking. Nested calls are supported (a per-resource counter is maintained).”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K~hj\h²hubhÌ)�”}”(hŒ(Set the target device of this client. ::”h]”hŒ%Set the target device of this client.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KŽhj\h²hubj|)�”}”(hŒ=int pci_device_vgaarb_set_target (struct pci_device *dev);”h]”hŒ=int pci_device_vgaarb_set_target (struct pci_device *dev);”…”�”}”hjÑsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´K�hj\h²hubhÌ)�”}”(hŒßFor instance, in x86 if two devices on the same bus want to lock different resources, both will succeed (lock). If devices are in different buses and trying to lock different resources, only the first who tried succeeds. ::”h]”hŒÜFor instance, in x86 if two devices on the same bus want to lock different resources, both will succeed (lock). If devices are in different buses and trying to lock different resources, only the first who tried succeeds.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K’hj\h²hubj|)�”}”(hŒWint pci_device_vgaarb_lock (void); int pci_device_vgaarb_trylock (void);”h]”hŒWint pci_device_vgaarb_lock (void); int pci_device_vgaarb_trylock (void);”…”�”}”hjísbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´K–hj\h²hubhÌ)�”}”(hŒUnlock resources of device. ::”h]”hŒUnlock resources of device.”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K™hj\h²hubj|)�”}”(hŒ+int pci_device_vgaarb_unlock (void);”h]”hŒ+int pci_device_vgaarb_unlock (void);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´K›hj\h²hubhÌ)�”}”(hXDIndicates to the arbiter if the card decodes legacy VGA IOs, legacy VGA Memory, both, or none. All cards default to both, the card driver (fbdev for example) should tell the arbiter if it has disabled legacy decoding, so the card can be left out of the arbitration process (and can be safe to take interrupts at any time. ::”h]”hXAIndicates to the arbiter if the card decodes legacy VGA IOs, legacy VGA Memory, both, or none. All cards default to both, the card driver (fbdev for example) should tell the arbiter if it has disabled legacy decoding, so the card can be left out of the arbitration process (and can be safe to take interrupts at any time.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K�hj\h²hubj|)�”}”(hŒ:int pci_device_vgaarb_decodes (int new_vgaarb_rsrc);”h]”hŒ:int pci_device_vgaarb_decodes (int new_vgaarb_rsrc);”…”�”}”hj%sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´K£hj\h²hubhÌ)�”}”(hŒ7Connects to the arbiter device, allocates the struct ::”h]”hŒ4Connects to the arbiter device, allocates the struct”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¥hj\h²hubj|)�”}”(hŒ+int pci_device_vgaarb_init (void);”h]”hŒ+int pci_device_vgaarb_init (void);”…”�”}”hjAsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´K§hj\h²hubhÌ)�”}”(hŒClose the connection ::”h]”hŒClose the connection”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K©hj\h²hubj|)�”}”(hŒ+void pci_device_vgaarb_fini (void);”h]”hŒ+void pci_device_vgaarb_fini (void);”…”�”}”hj]sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j{h³hÊh´K«hj\h²hubeh}”(h]”Œ libpciaccess”ah ]”h"]”Œ libpciaccess”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kkubh¶)�”}”(hhh]”(h»)�”}”(hŒ(xf86VGAArbiter (X server implementation)”h]”hŒ(xf86VGAArbiter (X server implementation)”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjsh²hh³hÊh´K®ubhÌ)�”}”(hŒLX server basically wraps all the functions that touch VGA registers somehow.”h]”hŒLX server basically wraps all the functions that touch VGA registers somehow.”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K°hjsh²hubeh}”(h]”Œ&xf86vgaarbiter-x-server-implementation”ah ]”h"]”Œ(xf86vgaarbiter (x server implementation)”ah$]”h&]”uh1hµhh·h²hh³hÊh´K®ubh¶)�”}”(hhh]”(h»)�”}”(hŒ References”h]”hŒ References”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjšh²hh³hÊh´K³ubhÌ)�”}”(hXÊBenjamin Herrenschmidt (IBM?) started this work when he discussed such design with the Xorg community in 2005 [1, 2]. In the end of 2007, Paulo Zanoni and Tiago Vignatti (both of C3SL/Federal University of Paraná) proceeded his work enhancing the kernel code to adapt as a kernel module and also did the implementation of the user space side [3]. Now (2009) Tiago Vignatti and Dave Airlie finally put this work in shape and queued to Jesse Barnes' PCI tree.”h]”hXÌBenjamin Herrenschmidt (IBM?) started this work when he discussed such design with the Xorg community in 2005 [1, 2]. In the end of 2007, Paulo Zanoni and Tiago Vignatti (both of C3SL/Federal University of Paraná) proceeded his work enhancing the kernel code to adapt as a kernel module and also did the implementation of the user space side [3]. Now (2009) Tiago Vignatti and Dave Airlie finally put this work in shape and queued to Jesse Barnes’ PCI tree.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kµhjšh²hubhŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ]https://cgit.freedesktop.org/xorg/xserver/commit/?id=4b42448a2388d40f257774fbffdccaea87bd0347”h]”hÌ)�”}”(hjÂh]”hŒ reference”“”)�”}”(hjÂh]”hŒ]https://cgit.freedesktop.org/xorg/xserver/commit/?id=4b42448a2388d40f257774fbffdccaea87bd0347”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÂuh1jÇhjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¼hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³hÊh´Nubj¿)�”}”(hŒBhttps://lists.freedesktop.org/archives/xorg/2005-March/006663.html”h]”hÌ)�”}”(hjåh]”jÈ)�”}”(hjåh]”hŒBhttps://lists.freedesktop.org/archives/xorg/2005-March/006663.html”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jåuh1jÇhjçubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K½hjãubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³hÊh´Nubj¿)�”}”(hŒBhttps://lists.freedesktop.org/archives/xorg/2005-March/006745.html”h]”hÌ)�”}”(hjh]”jÈ)�”}”(hjh]”hŒBhttps://lists.freedesktop.org/archives/xorg/2005-March/006745.html”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jÇhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¾hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³hÊh´Nubj¿)�”}”(hŒDhttps://lists.freedesktop.org/archives/xorg/2007-October/029507.html”h]”hÌ)�”}”(hj'h]”jÈ)�”}”(hj'h]”hŒDhttps://lists.freedesktop.org/archives/xorg/2007-October/029507.html”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j'uh1jÇhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¿hj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”jŒstart”Kuh1j¹hjšh²hh³hÊh´K¼ubeh}”(h]”Œ references”ah ]”h"]”Œ references”ah$]”h&]”uh1hµhh·h²hh³hÊh´K³ubeh}”(h]”Œ vga-arbiter”ah ]”h"]”Œ vga arbiter”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(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”j„Œ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”}”Œrefids”}”Œnameids”}”(j^j[jœj™jYjVjpjmj—j”jVjSuŒ nametypes”}”(j^‰jœ‰jY‰jp‰j—‰jV‰uh}”(j[h·j™héjVjŸj¿jÈj jj$j)j˜ j� j j jÝ jâ jèjíjäjéjmj\j”jsjSjšuŒ 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”“”}”…”R”Œparse_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÌ)�”}”(hŒ:Enumerated list start value not ordinal-1: "0" (ordinal 0)”h]”hŒ>Enumerated list start value not ordinal-1: “0â€� (ordinal 0)”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhjèubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÊŒline”Kuh1jæhjšh²hh³hÊh´K¼ubaŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.