€•ŠŒ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/driver-api/surface_aggregator/clients/san”Œ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/driver-api/surface_aggregator/clients/san”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ=/translations/it_IT/driver-api/surface_aggregator/clients/san”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ=/translations/ja_JP/driver-api/surface_aggregator/clients/san”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ=/translations/ko_KR/driver-api/surface_aggregator/clients/san”Œ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/driver-api/surface_aggregator/clients/san”Œ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/driver-api/surface_aggregator/clients/san”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ!SPDX-License-Identifier: GPL-2.0+”h]”hŒ!SPDX-License-Identifier: GPL-2.0+”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒW/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san.rst”h´KubhŒsubstitution_definition”“”)”}”(hŒ8.. |san_client_link| replace:: :c:func:`san_client_link`”h]”h)”}”(hŒ:c:func:`san_client_link`”h]”hŒliteral”“”)”}”(hhÐh]”hŒsan_client_link()”…””}”(hhÔh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œc”Œc-func”eh"]”h$]”h&]”uh1hÒhhÎubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ)driver-api/surface_aggregator/clients/san”Œ refdomain”hߌreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰Œ reftarget”Œsan_client_link”uh1hh³hÇh´KhhÊubah}”(h]”h ]”h"]”Œsan_client_link”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)”}”(hŒN.. |san_dgpu_notifier_register| replace:: :c:func:`san_dgpu_notifier_register`”h]”h)”}”(hŒ$:c:func:`san_dgpu_notifier_register`”h]”hÓ)”}”(hjh]”hŒsan_dgpu_notifier_register()”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-func”eh"]”h$]”h&]”uh1hÒhhþubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰hñŒsan_dgpu_notifier_register”uh1hh³hÇh´Khhúubah}”(h]”h ]”h"]”Œsan_dgpu_notifier_register”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)”}”(hŒS.. |san_dgpu_notifier_unregister| replace:: :c:func:`san_dgpu_notifier_unregister` ”h]”h)”}”(hŒ&:c:func:`san_dgpu_notifier_unregister`”h]”hÓ)”}”(hj*h]”hŒsan_dgpu_notifier_unregister()”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-func”eh"]”h$]”h&]”uh1hÒhj(ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰hñŒsan_dgpu_notifier_unregister”uh1hh³hÇh´Khj$ubah}”(h]”h ]”h"]”Œsan_dgpu_notifier_unregister”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒSurface ACPI Notify”h]”hŒSurface ACPI Notify”…””}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jShjPh²hh³hÇh´K ubhŒ paragraph”“”)”}”(hXgThe Surface ACPI Notify (SAN) device provides the bridge between ACPI and SAM controller. Specifically, ACPI code can execute requests and handle battery and thermal events via this interface. In addition to this, events relating to the discrete GPU (dGPU) of the Surface Book 2 can be sent from ACPI code (note: the Surface Book 3 uses a different method for this). The only currently known event sent via this interface is a dGPU power-on notification. While this driver handles the former part internally, it only relays the dGPU events to any other driver interested via its public API and does not handle them.”h]”hXgThe Surface ACPI Notify (SAN) device provides the bridge between ACPI and SAM controller. Specifically, ACPI code can execute requests and handle battery and thermal events via this interface. In addition to this, events relating to the discrete GPU (dGPU) of the Surface Book 2 can be sent from ACPI code (note: the Surface Book 3 uses a different method for this). The only currently known event sent via this interface is a dGPU power-on notification. While this driver handles the former part internally, it only relays the dGPU events to any other driver interested via its public API and does not handle them.”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³hÇh´K hjPh²hubjd)”}”(hŒqThe public interface of this driver is split into two parts: Client registration and notifier-block registration.”h]”hŒqThe public interface of this driver is split into two parts: Client registration and notifier-block registration.”…””}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³hÇh´KhjPh²hubjd)”}”(hX1A client to the SAN interface can be linked as consumer to the SAN device via |san_client_link|. This can be used to ensure that the a client receiving dGPU events does not miss any events due to the SAN interface not being set up as this forces the client driver to unbind once the SAN driver is unbound.”h]”(hŒNA client to the SAN interface can be linked as consumer to the SAN device via ”…””}”(hjh²hh³Nh´Nubh)”}”(hhÐh]”hÓ)”}”(hhÐh]”hŒsan_client_link()”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhj‰ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”‰Œrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khjh²hubhŒÒ. This can be used to ensure that the a client receiving dGPU events does not miss any events due to the SAN interface not being set up as this forces the client driver to unbind once the SAN driver is unbound.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jch³hÇh´KhjPh²hubjd)”}”(hXNotifier-blocks can be registered by any device for as long as the module is loaded, regardless of being linked as client or not. Registration is done with |san_dgpu_notifier_register|. If the notifier is not needed any more, it should be unregistered via |san_dgpu_notifier_unregister|.”h]”(hŒœNotifier-blocks can be registered by any device for as long as the module is loaded, regardless of being linked as client or not. Registration is done with ”…””}”(hj¯h²hh³Nh´Nubh)”}”(hjh]”hÓ)”}”(hjh]”hŒsan_dgpu_notifier_register()”…””}”(hjºh²hh³Nh´Nubah}”(h]”h ]”(hÞhßj eh"]”h$]”h&]”uh1hÒh³Nh´Nhj·ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”jŒ refexplicit”‰Œrefwarn”‰Œ reftarget”juh1hh³hÇh´Khj¯h²hubhŒH. If the notifier is not needed any more, it should be unregistered via ”…””}”(hj¯h²hh³Nh´Nubh)”}”(hj*h]”hÓ)”}”(hj*h]”hŒsan_dgpu_notifier_unregister()”…””}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”(hÞhßj6eh"]”h$]”h&]”uh1hÒh³Nh´Nhj×ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”jCŒ refexplicit”‰Œrefwarn”‰Œ reftarget”jFuh1hh³hÇh´Khj¯h²hubhŒ.”…””}”(hj¯h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jch³hÇh´KhjPh²hubjd)”}”(hŒ5Consult the API documentation below for more details.”h]”hŒ5Consult the API documentation below for more details.”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³hÇh´K#hjPh²hubjO)”}”(hhh]”(jT)”}”(hŒAPI Documentation”h]”hŒAPI Documentation”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jShj h²hh³hÇh´K'ubhŒindex”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œsan_dgpu_event (C struct)”Œc.san_dgpu_event”hNt”auh1jhj h²hh³Nh´NubhŒdesc”“”)”}”(hhh]”(hŒdesc_signature”“”)”}”(hŒsan_dgpu_event”h]”hŒdesc_signature_line”“”)”}”(hŒstruct san_dgpu_event”h]”(hŒdesc_sig_keyword”“”)”}”(hŒstruct”h]”hŒstruct”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j>hj:h²hh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´KubhŒdesc_sig_space”“”)”}”(hŒ ”h]”hŒ ”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jPhj:h²hh³jOh´KubhŒ desc_name”“”)”}”(hŒsan_dgpu_event”h]”hŒ desc_sig_name”“”)”}”(hj6h]”hŒsan_dgpu_event”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jghjcubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jahj:h²hh³jOh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j8Œsphinx_line_type”Œ declarator”hj4h²hh³jOh´Kubah}”(h]”j+ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j2h³jOh´Khj/h²hubhŒ desc_content”“”)”}”(hhh]”jd)”}”(hŒDiscrete GPU ACPI event.”h]”hŒDiscrete GPU ACPI event.”…””}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj•h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj/h²hh³jOh´Kubeh}”(h]”h ]”(hߌstruct”eh"]”h$]”h&]”Œdomain”hߌobjtype”j°Œdesctype”j°Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j-h²hhj h³Nh´NubhŒ container”“”)”}”(hXÉ**Definition**:: struct san_dgpu_event { u8 category; u8 target; u8 command; u8 instance; u16 length; u8 *payload; }; **Members** ``category`` Category of the event. ``target`` Target ID of the event source. ``command`` Command ID of the event. ``instance`` Instance ID of the event source. ``length`` Length of the event's payload data (in bytes). ``payload`` Pointer to the event's payload data.”h]”(jd)”}”(hŒ**Definition**::”h]”(hŒstrong”“”)”}”(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&]”uh1jch³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj¼ubhŒ literal_block”“”)”}”(hŒ|struct san_dgpu_event { u8 category; u8 target; u8 command; u8 instance; u16 length; u8 *payload; };”h]”hŒ|struct san_dgpu_event { u8 category; u8 target; u8 command; u8 instance; u16 length; u8 *payload; };”…””}”hjásbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jßh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj¼ubjd)”}”(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&]”uh1jch³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´K!hj¼ubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒ$``category`` Category of the event. ”h]”(hŒterm”“”)”}”(hŒ ``category``”h]”hÓ)”}”(hjh]”hŒcategory”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´KhjubhŒ definition”“”)”}”(hhh]”jd)”}”(hŒCategory of the event.”h]”hŒCategory of the event.”…””}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³j,h´Khj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j,h´Khj ubj)”}”(hŒ*``target`` Target ID of the event source. ”h]”(j)”}”(hŒ ``target``”h]”hÓ)”}”(hjRh]”hŒtarget”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´KhjLubj.)”}”(hhh]”jd)”}”(hŒTarget ID of the event source.”h]”hŒTarget ID of the event source.”…””}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³jgh´Khjhubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jgh´Khj ubj)”}”(hŒ%``command`` Command ID of the event. ”h]”(j)”}”(hŒ ``command``”h]”hÓ)”}”(hj‹h]”hŒcommand”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj…ubj.)”}”(hhh]”jd)”}”(hŒCommand ID of the event.”h]”hŒCommand ID of the event.”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³j h´Khj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j h´Khj ubj)”}”(hŒ.``instance`` Instance ID of the event source. ”h]”(j)”}”(hŒ ``instance``”h]”hÓ)”}”(hjÄh]”hŒinstance”…””}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj¾ubj.)”}”(hhh]”jd)”}”(hŒ Instance ID of the event source.”h]”hŒ Instance ID of the event source.”…””}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³jÙh´KhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jÙh´Khj ubj)”}”(hŒ:``length`` Length of the event's payload data (in bytes). ”h]”(j)”}”(hŒ ``length``”h]”hÓ)”}”(hjýh]”hŒlength”…””}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj÷ubj.)”}”(hhh]”jd)”}”(hŒ.Length of the event's payload data (in bytes).”h]”hŒ0Length of the event’s payload data (in bytes).”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³jh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jh´Khj ubj)”}”(hŒ0``payload`` Pointer to the event's payload data.”h]”(j)”}”(hŒ ``payload``”h]”hÓ)”}”(hj6h]”hŒpayload”…””}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´Khj0ubj.)”}”(hhh]”jd)”}”(hŒ$Pointer to the event's payload data.”h]”hŒ&Pointer to the event’s payload data.”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œ}/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:41: ./include/linux/surface_acpi_notify.h”h´KhjLubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jKh´Khj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jºhj h²hh³Nh´Nubj)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j)Œsan_client_link (C function)”Œc.san_client_link”hNt”auh1jhj h²hh³Nh´Nubj.)”}”(hhh]”(j3)”}”(hŒ+int san_client_link (struct device *client)”h]”j9)”}”(hŒ*int san_client_link(struct device *client)”h]”(hŒdesc_sig_keyword_type”“”)”}”(hŒint”h]”hŒint”…””}”(hj’h²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jhjŒh²hh³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KGubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhjŒh²hh³j¡h´KGubjb)”}”(hŒsan_client_link”h]”jh)”}”(hŒsan_client_link”h]”hŒsan_client_link”…””}”(hj´h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghj°ubah}”(h]”h ]”(jzj{eh"]”h$]”h&]”hÅhÆuh1jahjŒh²hh³j¡h´KGubhŒdesc_parameterlist”“”)”}”(hŒ(struct device *client)”h]”hŒdesc_parameter”“”)”}”(hŒstruct device *client”h]”(j?)”}”(hjBh]”hŒstruct”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”jKah"]”h$]”h&]”uh1j>hjÐubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjáh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhjÐubh)”}”(hhh]”jh)”}”(hŒdevice”h]”hŒdevice”…””}”(hjòh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghjïubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”hߌreftype”Œ identifier”Œ reftarget”jôŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)”}”Œdata”]”j Œ ASTIdentifier”“”)”}”jj¶sbŒc.san_client_link”†”asbuh1hhjÐubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhjÐubhŒdesc_sig_punctuation”“”)”}”(hŒ*”h]”hŒ*”…””}”(hj*h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j(hjÐubjh)”}”(hŒclient”h]”hŒclient”…””}”(hj9h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghjÐubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jÎhjÊubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÈhjŒh²hh³j¡h´KGubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj…ˆuh1j8j†j‡hjˆh²hh³j¡h´KGubah}”(h]”jƒah ]”(j‹jŒeh"]”h$]”h&]”jˆj‘)j’huh1j2h³j¡h´KGhj…h²hubj”)”}”(hhh]”jd)”}”(hŒ&Link client as consumer to SAN device.”h]”hŒ&Link client as consumer to SAN device.”…””}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KGhj`h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj…h²hh³j¡h´KGubeh}”(h]”h ]”(hߌfunction”eh"]”h$]”h&]”j´hßjµj{j¶j{j·‰j¸‰j¹‰uh1j-h²hhj h³Nh´Nubj»)”}”(hX•**Parameters** ``struct device *client`` The client to link. **Description** Sets up a device link between the provided client device as consumer and the SAN device as provider. This function can be used to ensure that the SAN interface has been set up and will be set up for as long as the driver of the client device is bound. This guarantees that, during that time, all dGPU events will be received by any registered notifier. The link will be automatically removed once the client device's driver is unbound. **Return** Returns zero on success, ``-ENXIO`` if the SAN interface has not been set up yet, and ``-ENOMEM`` if device link creation failed.”h]”(jd)”}”(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&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KKhjubj )”}”(hhh]”j)”}”(hŒ.``struct device *client`` The client to link. ”h]”(j)”}”(hŒ``struct device *client``”h]”hÓ)”}”(hj¤h]”hŒstruct device *client”…””}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KHhjžubj.)”}”(hhh]”jd)”}”(hŒThe client to link.”h]”hŒThe client to link.”…””}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³j¹h´KHhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjžubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j¹h´KHhj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubjd)”}”(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&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KJhjubjd)”}”(hX`Sets up a device link between the provided client device as consumer and the SAN device as provider. This function can be used to ensure that the SAN interface has been set up and will be set up for as long as the driver of the client device is bound. This guarantees that, during that time, all dGPU events will be received by any registered notifier.”h]”hX`Sets up a device link between the provided client device as consumer and the SAN device as provider. This function can be used to ensure that the SAN interface has been set up and will be set up for as long as the driver of the client device is bound. This guarantees that, during that time, all dGPU events will be received by any registered notifier.”…””}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KIhjubjd)”}”(hŒRThe link will be automatically removed once the client device's driver is unbound.”h]”hŒTThe link will be automatically removed once the client device’s driver is unbound.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KOhjubjd)”}”(hŒ **Return**”h]”jÅ)”}”(hjh]”hŒReturn”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KRhjubjd)”}”(hŒReturns zero on success, ``-ENXIO`` if the SAN interface has not been set up yet, and ``-ENOMEM`` if device link creation failed.”h]”(hŒReturns zero on success, ”…””}”(hj+h²hh³Nh´NubhÓ)”}”(hŒ ``-ENXIO``”h]”hŒ-ENXIO”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj+ubhŒ3 if the SAN interface has not been set up yet, and ”…””}”(hj+h²hh³Nh´NubhÓ)”}”(hŒ ``-ENOMEM``”h]”hŒ-ENOMEM”…””}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj+ubhŒ if device link creation failed.”…””}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KShjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jºhj h²hh³Nh´Nubj)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j)Œ'san_dgpu_notifier_register (C function)”Œc.san_dgpu_notifier_register”hNt”auh1jhj h²hh³Nh´Nubj.)”}”(hhh]”(j3)”}”(hŒ:int san_dgpu_notifier_register (struct notifier_block *nb)”h]”j9)”}”(hŒ9int san_dgpu_notifier_register(struct notifier_block *nb)”h]”(j‘)”}”(hŒint”h]”hŒint”…””}”(hj~h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjzh²hh³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KsubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhjzh²hh³jŒh´Ksubjb)”}”(hŒsan_dgpu_notifier_register”h]”jh)”}”(hŒsan_dgpu_notifier_register”h]”hŒsan_dgpu_notifier_register”…””}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghj›ubah}”(h]”h ]”(jzj{eh"]”h$]”h&]”hÅhÆuh1jahjzh²hh³jŒh´KsubjÉ)”}”(hŒ(struct notifier_block *nb)”h]”jÏ)”}”(hŒstruct notifier_block *nb”h]”(j?)”}”(hjBh]”hŒstruct”…””}”(hj»h²hh³Nh´Nubah}”(h]”h ]”jKah"]”h$]”h&]”uh1j>hj·ubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhj·ubh)”}”(hhh]”jh)”}”(hŒnotifier_block”h]”hŒnotifier_block”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghjÖubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”hߌreftype”jŒ reftarget”jÛŒmodname”NŒ classname”Nj j)”}”j]”j)”}”jj¡sbŒc.san_dgpu_notifier_register”†”asbuh1hhj·ubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjùh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhj·ubj))”}”(hj,h]”hŒ*”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj·ubjh)”}”(hŒnb”h]”hŒnb”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghj·ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jÎhj³ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÈhjzh²hh³jŒh´Ksubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj…ˆuh1j8j†j‡hjvh²hh³jŒh´Ksubah}”(h]”jqah ]”(j‹jŒeh"]”h$]”h&]”jˆj‘)j’huh1j2h³jŒh´Kshjsh²hubj”)”}”(hhh]”jd)”}”(hŒRegister a SAN dGPU notifier.”h]”hŒRegister a SAN dGPU notifier.”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´Kshj;h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjsh²hh³jŒh´Ksubeh}”(h]”h ]”(hߌfunction”eh"]”h$]”h&]”j´hßjµjVj¶jVj·‰j¸‰j¹‰uh1j-h²hhj h³Nh´Nubj»)”}”(hXU**Parameters** ``struct notifier_block *nb`` The notifier-block to register. **Description** Registers a SAN dGPU notifier, receiving any new SAN dGPU events sent from ACPI. The registered notifier will be called with :c:type:`struct san_dgpu_event ` as notifier data and the command ID of that event as notifier action.”h]”(jd)”}”(hŒ**Parameters**”h]”jÅ)”}”(hj`h]”hŒ Parameters”…””}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KwhjZubj )”}”(hhh]”j)”}”(hŒ>``struct notifier_block *nb`` The notifier-block to register. ”h]”(j)”}”(hŒ``struct notifier_block *nb``”h]”hÓ)”}”(hjh]”hŒstruct notifier_block *nb”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´Kthjyubj.)”}”(hhh]”jd)”}”(hŒThe notifier-block to register.”h]”hŒThe notifier-block to register.”…””}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³j”h´Kthj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j”h´Kthjvubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZubjd)”}”(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&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KvhjZubjd)”}”(hŒóRegisters a SAN dGPU notifier, receiving any new SAN dGPU events sent from ACPI. The registered notifier will be called with :c:type:`struct san_dgpu_event ` as notifier data and the command ID of that event as notifier action.”h]”(hŒ}Registers a SAN dGPU notifier, receiving any new SAN dGPU events sent from ACPI. The registered notifier will be called with ”…””}”(hjÐh²hh³Nh´Nubh)”}”(hŒ0:c:type:`struct san_dgpu_event `”h]”hÓ)”}”(hjÚh]”hŒstruct san_dgpu_event”…””}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhjØubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j j)”}”j]”sbhñŒsan_dgpu_event”uh1hh³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´KuhjÐubhŒF as notifier data and the command ID of that event as notifier action.”…””}”(hjÐh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jch³júh´KuhjZubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jºhj h²hh³Nh´Nubj)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j)Œ)san_dgpu_notifier_unregister (C function)”Œc.san_dgpu_notifier_unregister”hNt”auh1jhj h²hh³Nh´Nubj.)”}”(hhh]”(j3)”}”(hŒhj^ubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhj^ubh)”}”(hhh]”jh)”}”(hŒnotifier_block”h]”hŒnotifier_block”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghj}ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”hߌreftype”jŒ reftarget”j‚Œmodname”NŒ classname”Nj j)”}”j]”j)”}”jjHsbŒc.san_dgpu_notifier_unregister”†”asbuh1hhj^ubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhj^ubj))”}”(hj,h]”hŒ*”…””}”(hj®h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj^ubjh)”}”(hŒnb”h]”hŒnb”…””}”(hj»h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jghj^ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jÎhjZubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÈhj!h²hh³j3h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj…ˆuh1j8j†j‡hjh²hh³j3h´Kubah}”(h]”jah ]”(j‹jŒeh"]”h$]”h&]”jˆj‘)j’huh1j2h³j3h´Khjh²hubj”)”}”(hhh]”jd)”}”(hŒUnregister a SAN dGPU notifier.”h]”hŒUnregister a SAN dGPU notifier.”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´Khjâh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjh²hh³j3h´Kubeh}”(h]”h ]”(hߌfunction”eh"]”h$]”h&]”j´hßjµjýj¶jýj·‰j¸‰j¹‰uh1j-h²hhj h³Nh´Nubj»)”}”(hŒQ**Parameters** ``struct notifier_block *nb`` The notifier-block to unregister.”h]”(jd)”}”(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&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´K…hj ubj )”}”(hhh]”j)”}”(hŒ?``struct notifier_block *nb`` The notifier-block to unregister.”h]”(j)”}”(hŒ``struct notifier_block *nb``”h]”hÓ)”}”(hj& h]”hŒstruct notifier_block *nb”…””}”(hj( h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj$ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´K‡hj ubj.)”}”(hhh]”jd)”}”(hŒ!The notifier-block to unregister.”h]”hŒ!The notifier-block to unregister.”…””}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jch³Œˆ/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/clients/san:43: ./drivers/platform/surface/surface_acpi_notify.c”h´K‚hj< ubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j; h´K‡hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jºhj h²hh³Nh´Nubeh}”(h]”Œapi-documentation”ah ]”h"]”Œapi documentation”ah$]”h&]”uh1jNhjPh²hh³hÇh´K'ubeh}”(h]”Œsurface-acpi-notify”ah ]”h"]”Œsurface acpi notify”ah$]”h&]”uh1jNhhh²hh³hÇh´K ubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(jSNŒ 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”}”(h÷hÊj!hújKj$uŒsubstitution_names”}”(Œsan_client_link”h÷Œsan_dgpu_notifier_register”j!Œsan_dgpu_notifier_unregister”jKuŒrefnames”}”Œrefids”}”Œnameids”}”(jt jq jl ji uŒ nametypes”}”(jt ‰jl ‰uh}”(jq jPji j j+j4jƒjˆjqjvjjuŒ 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”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.