€•¼8Œ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/intel-display/dpio”Œ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/intel-display/dpio”Œ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/intel-display/dpio”Œ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/intel-display/dpio”Œ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/intel-display/dpio”Œ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/intel-display/dpio”Œ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/intel-display/dpio”Œ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: MIT”h]”hŒSPDX-License-Identifier: MIT”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒD/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio.rst”h“Kubh¶)”}”(hŒ#Copyright Ā© 2026 Intel Corporation”h]”hŒ#Copyright Ā© 2026 Intel Corporation”…””}”hhČsbah}”(h]”h ]”h"]”h$]”h&]”hÅhĘuh1hµhhh²hh³hĒh“KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒDPIO”h]”hŒDPIO”…””}”(hhŻh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hŪhhŲh²hh³hĒh“KubhŒ paragraph”“”)”}”(hXžVLV, CHV and BXT have slightly peculiar display PHYs for driving DP/HDMI ports. DPIO is the name given to such a display PHY. These PHYs don't follow the standard programming model using direct MMIO registers, and instead their registers must be accessed through IOSF sideband. VLV has one such PHY for driving ports B and C, and CHV adds another PHY for driving port D. Each PHY responds to specific IOSF-SB port.”h]”hX VLV, CHV and BXT have slightly peculiar display PHYs for driving DP/HDMI ports. DPIO is the name given to such a display PHY. These PHYs don’t follow the standard programming model using direct MMIO registers, and instead their registers must be accessed through IOSF sideband. VLV has one such PHY for driving ports B and C, and CHV adds another PHY for driving port D. Each PHY responds to specific IOSF-SB port.”…””}”(hhķh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“K(hhŲh²hubhģ)”}”(hX9Each display PHY is made up of one or two channels. Each channel houses a common lane part which contains the PLL and other common logic. CH0 common lane also contains the IOSF-SB logic for the Common Register Interface (CRI) ie. the DPIO registers. CRI clock must be running when any DPIO registers are accessed.”h]”hX9Each display PHY is made up of one or two channels. Each channel houses a common lane part which contains the PLL and other common logic. CH0 common lane also contains the IOSF-SB logic for the Common Register Interface (CRI) ie. the DPIO registers. CRI clock must be running when any DPIO registers are accessed.”…””}”(hhüh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“K0hhŲh²hubhģ)”}”(hŒßIn addition to having their own registers, the PHYs are also controlled through some dedicated signals from the display controller. These include PLL reference clock enable, PLL enable, and CRI clock selection, for example.”h]”hŒßIn addition to having their own registers, the PHYs are also controlled through some dedicated signals from the display controller. These include PLL reference clock enable, PLL enable, and CRI clock selection, for example.”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“K6hhŲh²hubhģ)”}”(hX,Eeach channel also has two splines (also called data lanes), and each spline is made up of one Physical Access Coding Sub-Layer (PCS) block and two TX lanes. So each channel has two PCS blocks and four TX lanes. The TX lanes are used as DP lanes or TMDS data/clock pairs depending on the output type.”h]”hX,Eeach channel also has two splines (also called data lanes), and each spline is made up of one Physical Access Coding Sub-Layer (PCS) block and two TX lanes. So each channel has two PCS blocks and four TX lanes. The TX lanes are used as DP lanes or TMDS data/clock pairs depending on the output type.”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“K;hhŲh²hubhģ)”}”(hX$Additionally the PHY also contains an AUX lane with AUX blocks for each channel. This is used for DP AUX communication, but this fact isn't really relevant for the driver since AUX is controlled from the display controller side. No DPIO registers need to be accessed during AUX communication,”h]”hX&Additionally the PHY also contains an AUX lane with AUX blocks for each channel. This is used for DP AUX communication, but this fact isn’t really relevant for the driver since AUX is controlled from the display controller side. No DPIO registers need to be accessed during AUX communication,”…””}”(hj)h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KAhhŲh²hubhģ)”}”(hŒmGenerally on VLV/CHV the common lane corresponds to the pipe and the spline (PCS/TX) corresponds to the port.”h]”hŒmGenerally on VLV/CHV the common lane corresponds to the pipe and the spline (PCS/TX) corresponds to the port.”…””}”(hj8h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KGhhŲh²hubhģ)”}”(hŒFor dual channel PHY (VLV/CHV):”h]”hŒFor dual channel PHY (VLV/CHV):”…””}”(hjGh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KJhhŲh²hubhŒ block_quote”“”)”}”(hŒapipe A == CMN/PLL/REF CH0 pipe B == CMN/PLL/REF CH1 port B == PCS/TX CH0 port C == PCS/TX CH1 ”h]”(hģ)”}”(hŒpipe A == CMN/PLL/REF CH0”h]”hŒpipe A == CMN/PLL/REF CH0”…””}”(hj\h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KLhjXubhģ)”}”(hŒpipe B == CMN/PLL/REF CH1”h]”hŒpipe B == CMN/PLL/REF CH1”…””}”(hjkh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KNhjXubhģ)”}”(hŒport B == PCS/TX CH0”h]”hŒport B == PCS/TX CH0”…””}”(hjzh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KPhjXubhģ)”}”(hŒport C == PCS/TX CH1”h]”hŒport C == PCS/TX CH1”…””}”(hj‰h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KRhjXubeh}”(h]”h ]”h"]”h$]”h&]”uh1jVh³jjh“KLhhŲh²hubhģ)”}”(hŒkThis is especially important when we cross the streams ie. drive port B with pipe B, or port C with pipe A.”h]”hŒkThis is especially important when we cross the streams ie. drive port B with pipe B, or port C with pipe A.”…””}”(hjžh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KThhŲh²hubhģ)”}”(hŒFor single channel PHY (CHV):”h]”hŒFor single channel PHY (CHV):”…””}”(hj­h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KWhhŲh²hubjW)”}”(hŒ0pipe C == CMN/PLL/REF CH0 port D == PCS/TX CH0 ”h]”(hģ)”}”(hŒpipe C == CMN/PLL/REF CH0”h]”hŒpipe C == CMN/PLL/REF CH0”…””}”(hjĄh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KYhj¼ubhģ)”}”(hŒport D == PCS/TX CH0”h]”hŒport D == PCS/TX CH0”…””}”(hjĻh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“K[hj¼ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jVh³jĪh“KYhhŲh²hubhģ)”}”(hX3On BXT the entire PHY channel corresponds to the port. That means the PLL is also now associated with the port rather than the pipe, and so the clock needs to be routed to the appropriate transcoder. Port A PLL is directly connected to transcoder EDP and port B/C PLLs can be routed to any transcoder A/B/C.”h]”hX3On BXT the entire PHY channel corresponds to the port. That means the PLL is also now associated with the port rather than the pipe, and so the clock needs to be routed to the appropriate transcoder. Port A PLL is directly connected to transcoder EDP and port B/C PLLs can be routed to any transcoder A/B/C.”…””}”(hjäh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“K]hhŲh²hubhģ)”}”(hŒiNote: DDI0 is digital port B, DD1 is digital port C, and DDI2 is digital port D (CHV) or port A (BXT). ::”h]”hŒfNote: DDI0 is digital port B, DD1 is digital port C, and DDI2 is digital port D (CHV) or port A (BXT).”…””}”(hjóh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hėh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KchhŲh²hubhŒ literal_block”“”)”}”(hXwDual channel PHY (VLV/CHV/BXT) --------------------------------- | CH0 | CH1 | | CMN/PLL/REF | CMN/PLL/REF | |---------------|---------------| Display PHY | PCS01 | PCS23 | PCS01 | PCS23 | |-------|-------|-------|-------| |TX0|TX1|TX2|TX3|TX0|TX1|TX2|TX3| --------------------------------- | DDI0 | DDI1 | DP/HDMI ports --------------------------------- Single channel PHY (CHV/BXT) ----------------- | CH0 | | CMN/PLL/REF | |---------------| Display PHY | PCS01 | PCS23 | |-------|-------| |TX0|TX1|TX2|TX3| ----------------- | DDI2 | DP/HDMI port -----------------”h]”hXwDual channel PHY (VLV/CHV/BXT) --------------------------------- | CH0 | CH1 | | CMN/PLL/REF | CMN/PLL/REF | |---------------|---------------| Display PHY | PCS01 | PCS23 | PCS01 | PCS23 | |-------|-------|-------|-------| |TX0|TX1|TX2|TX3|TX0|TX1|TX2|TX3| --------------------------------- | DDI0 | DDI1 | DP/HDMI ports --------------------------------- Single channel PHY (CHV/BXT) ----------------- | CH0 | | CMN/PLL/REF | |---------------| Display PHY | PCS01 | PCS23 | |-------|-------| |TX0|TX1|TX2|TX3| ----------------- | DDI2 | DP/HDMI port -----------------”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhĘuh1jh³Œs/var/lib/git/docbuild/linux/Documentation/gpu/intel-display/dpio:7: ./drivers/gpu/drm/i915/display/intel_dpio_phy.c”h“KghhŲh²hubeh}”(h]”Œdpio”ah ]”h"]”Œdpio”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”hnj _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”}”jjsŒ nametypes”}”j‰sh}”jhŲsŒ 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.