€•s•Œ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”Œ3/translations/zh_CN/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/zh_TW/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/it_IT/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ja_JP/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ko_KR/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/pt_BR/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/sp_SP/gpu/amdgpu/display/dcn-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒtarget”“”)�”}”(hŒ.. _dcn_overview:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œ dcn-overview”uh1hµh´Khhh²hh³ŒM/var/lib/git/docbuild/linux/Documentation/gpu/amdgpu/display/dcn-overview.rst”ubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒDisplay Core Next (DCN)”h]”hŒDisplay Core Next (DCN)”…”�”}”(hhËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhhÆh²hh³hÃh´KubhŒ paragraph”“”)�”}”(hXTo equip our readers with the basic knowledge of how AMD Display Core Next (DCN) works, we need to start with an overview of the hardware pipeline. Below you can see a picture that provides a DCN overview, keep in mind that this is a generic diagram, and we have variations per ASIC.”h]”hXTo equip our readers with the basic knowledge of how AMD Display Core Next (DCN) works, we need to start with an overview of the hardware pipeline. Below you can see a picture that provides a DCN overview, keep in mind that this is a generic diagram, and we have variations per ASIC.”…”�”}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KhhÆh²hubŒkfigure”Œ kernel_figure”“”)�”}”(hhh]”hŒfigure”“”)�”}”(hhh]”hŒimage”“”)�”}”(hŒ,.. kernel-figure:: dc_pipeline_overview.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ+gpu/amdgpu/display/dc_pipeline_overview.svg”Œ candidates”}”Œ*”jsuh1hôhhñh³hÃh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhhìubah}”(h]”h ]”h"]”h$]”h&]”uh1hêhhÆh²hh³hÃh´K ubhÚ)�”}”(hŒPBased on this diagram, we can pass through each block and briefly describe them:”h]”hŒPBased on this diagram, we can pass through each block and briefly describe them:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KhhÆh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒË**Display Controller Hub (DCHUB)**: This is the gateway between the Scalable Data Port (SDP) and DCN. This component has multiple features, such as memory arbitration, rotation, and cursor manipulation. ”h]”hÚ)�”}”(hŒÊ**Display Controller Hub (DCHUB)**: This is the gateway between the Scalable Data Port (SDP) and DCN. This component has multiple features, such as memory arbitration, rotation, and cursor manipulation.”h]”(hŒstrong”“”)�”}”(hŒ"**Display Controller Hub (DCHUB)**”h]”hŒDisplay Controller Hub (DCHUB)”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hj*ubhŒ¨: This is the gateway between the Scalable Data Port (SDP) and DCN. This component has multiple features, such as memory arbitration, rotation, and cursor manipulation.”…”�”}”(hj*h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒ¯**Display Pipe and Plane (DPP)**: This block provides pre-blend pixel processing such as color space conversion, linearization of pixel data, tone mapping, and gamut mapping. ”h]”hÚ)�”}”(hŒ®**Display Pipe and Plane (DPP)**: This block provides pre-blend pixel processing such as color space conversion, linearization of pixel data, tone mapping, and gamut mapping.”h]”(j/)�”}”(hŒ **Display Pipe and Plane (DPP)**”h]”hŒDisplay Pipe and Plane (DPP)”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjRubhŒŽ: This block provides pre-blend pixel processing such as color space conversion, linearization of pixel data, tone mapping, and gamut mapping.”…”�”}”(hjRh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒ~**Multiple Pipe/Plane Combined (MPC)**: This component performs blending of multiple planes, using global or per-pixel alpha. ”h]”hÚ)�”}”(hŒ}**Multiple Pipe/Plane Combined (MPC)**: This component performs blending of multiple planes, using global or per-pixel alpha.”h]”(j/)�”}”(hŒ&**Multiple Pipe/Plane Combined (MPC)**”h]”hŒ"Multiple Pipe/Plane Combined (MPC)”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjxubhŒW: This component performs blending of multiple planes, using global or per-pixel alpha.”…”�”}”(hjxh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khjtubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒX**Output Pixel Processing (OPP)**: Process and format pixels to be sent to the display. ”h]”hÚ)�”}”(hŒW**Output Pixel Processing (OPP)**: Process and format pixels to be sent to the display.”h]”(j/)�”}”(hŒ!**Output Pixel Processing (OPP)**”h]”hŒOutput Pixel Processing (OPP)”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjžubhŒ6: Process and format pixels to be sent to the display.”…”�”}”(hjžh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khjšubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒ”**Output Pipe Timing Combiner (OPTC)**: It generates time output to combine streams or divide capabilities. CRC values are generated in this block. ”h]”hÚ)�”}”(hŒ“**Output Pipe Timing Combiner (OPTC)**: It generates time output to combine streams or divide capabilities. CRC values are generated in this block.”h]”(j/)�”}”(hŒ&**Output Pipe Timing Combiner (OPTC)**”h]”hŒ"Output Pipe Timing Combiner (OPTC)”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjÄubhŒm: It generates time output to combine streams or divide capabilities. CRC values are generated in this block.”…”�”}”(hjÄh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KhjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒQ**Display Output (DIO)**: Codify the output to the display connected to our GPU. ”h]”hÚ)�”}”(hŒP**Display Output (DIO)**: Codify the output to the display connected to our GPU.”h]”(j/)�”}”(hŒ**Display Output (DIO)**”h]”hŒDisplay Output (DIO)”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjêubhŒ8: Codify the output to the display connected to our GPU.”…”�”}”(hjêh²hh³Nh´Nubeh}”(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Œ}**Display Writeback (DWB)**: It provides the ability to write the output of the display pipe back to memory as video frames. ”h]”hÚ)�”}”(hŒ|**Display Writeback (DWB)**: It provides the ability to write the output of the display pipe back to memory as video frames.”h]”(j/)�”}”(hŒ**Display Writeback (DWB)**”h]”hŒDisplay Writeback (DWB)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjubhŒa: It provides the ability to write the output of the display pipe back to memory as video frames.”…”�”}”(hjh²hh³Nh´Nubeh}”(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Œq**Multi-Media HUB (MMHUBBUB)**: Memory controller interface for DMCUB and DWB (Note that DWB is not hooked yet). ”h]”hÚ)�”}”(hŒp**Multi-Media HUB (MMHUBBUB)**: Memory controller interface for DMCUB and DWB (Note that DWB is not hooked yet).”h]”(j/)�”}”(hŒ**Multi-Media HUB (MMHUBBUB)**”h]”hŒMulti-Media HUB (MMHUBBUB)”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hj6ubhŒR: Memory controller interface for DMCUB and DWB (Note that DWB is not hooked yet).”…”�”}”(hj6h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K(hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒñ**DCN Management Unit (DMU)**: It provides registers with access control and interrupts the controller to the SOC host interrupt unit. This block includes the Display Micro-Controller Unit - version B (DMCUB), which is handled via firmware. ”h]”hÚ)�”}”(hŒð**DCN Management Unit (DMU)**: It provides registers with access control and interrupts the controller to the SOC host interrupt unit. This block includes the Display Micro-Controller Unit - version B (DMCUB), which is handled via firmware.”h]”(j/)�”}”(hŒ**DCN Management Unit (DMU)**”h]”hŒDCN Management Unit (DMU)”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hj\ubhŒÓ: It provides registers with access control and interrupts the controller to the SOC host interrupt unit. This block includes the Display Micro-Controller Unit - version B (DMCUB), which is handled via firmware.”…”�”}”(hj\h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K+hjXubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒy**DCN Clock Generator Block (DCCG)**: It provides the clocks and resets for all of the display controller clock domains. ”h]”hÚ)�”}”(hŒx**DCN Clock Generator Block (DCCG)**: It provides the clocks and resets for all of the display controller clock domains.”h]”(j/)�”}”(hŒ$**DCN Clock Generator Block (DCCG)**”h]”hŒ DCN Clock Generator Block (DCCG)”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hj‚ubhŒT: It provides the clocks and resets for all of the display controller clock domains.”…”�”}”(hj‚h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K0hj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubj%)�”}”(hŒ**Azalia (AZ)**: Audio engine. ”h]”hÚ)�”}”(hŒ**Azalia (AZ)**: Audio engine.”h]”(j/)�”}”(hŒ**Azalia (AZ)**”h]”hŒ Azalia (AZ)”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hj¨ubhŒ: Audio engine.”…”�”}”(hj¨h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K3hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj!h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”juh1jh³hÃh´KhhÆh²hubhÚ)�”}”(hX,The above diagram is an architecture generalization of DCN, which means that every ASIC has variations around this base model. Notice that the display pipeline is connected to the Scalable Data Port (SDP) via DCHUB; you can see the SDP as the element from our Data Fabric that feeds the display pipe.”h]”hX,The above diagram is an architecture generalization of DCN, which means that every ASIC has variations around this base model. Notice that the display pipeline is connected to the Scalable Data Port (SDP) via DCHUB; you can see the SDP as the element from our Data Fabric that feeds the display pipe.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K5hhÆh²hubhÚ)�”}”(hXoAlways approach the DCN architecture as something flexible that can be configured and reconfigured in multiple ways; in other words, each block can be setup or ignored accordingly with userspace demands. For example, if we want to drive an 8k@60Hz with a DSC enabled, our DCN may require 4 DPP and 2 OPP. It is DC's responsibility to drive the best configuration for each specific scenario. Orchestrate all of these components together requires a sophisticated communication interface which is highlighted in the diagram by the edges that connect each block; from the chart, each connection between these blocks represents:”h]”(hŒðAlways approach the DCN architecture as something flexible that can be configured and reconfigured in multiple ways; in other words, each block can be setup or ignored accordingly with userspace demands. For example, if we want to drive an ”…”�”}”(hjßh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ8k@60Hz”h]”hŒ8k@60Hz”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:8k@60Hz”uh1jçhjßubhXz with a DSC enabled, our DCN may require 4 DPP and 2 OPP. It is DC’s responsibility to drive the best configuration for each specific scenario. Orchestrate all of these components together requires a sophisticated communication interface which is highlighted in the diagram by the edges that connect each block; from the chart, each connection between these blocks represents:”…”�”}”(hjßh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K:hhÆh²hubhŒenumerated_list”“”)�”}”(hhh]”(j%)�”}”(hŒ;Pixel data interface (red): Represents the pixel data flow;”h]”hÚ)�”}”(hj h]”hŒ;Pixel data interface (red): Represents the pixel data flow;”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KDhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjh²hh³hÃh´Nubj%)�”}”(hŒnGlobal sync signals (green): It is a set of synchronization signals composed by VStartup, VUpdate, and VReady;”h]”hÚ)�”}”(hŒnGlobal sync signals (green): It is a set of synchronization signals composed by VStartup, VUpdate, and VReady;”h]”hŒnGlobal sync signals (green): It is a set of synchronization signals composed by VStartup, VUpdate, and VReady;”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KEhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjh²hh³hÃh´Nubj%)�”}”(hŒ2Config interface: Responsible to configure blocks;”h]”hÚ)�”}”(hj9h]”hŒ2Config interface: Responsible to configure blocks;”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KGhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjh²hh³hÃh´Nubj%)�”}”(hŒFSideband signals: All other signals that do not fit the previous one. ”h]”hÚ)�”}”(hŒESideband signals: All other signals that do not fit the previous one.”h]”hŒESideband signals: All other signals that do not fit the previous one.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KHhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jhhÆh²hh³hÃh´KDubhÚ)�”}”(hŒ�These signals are essential and play an important role in DCN. Nevertheless, the Global Sync deserves an extra level of detail described in the next section.”h]”hŒ�These signals are essential and play an important role in DCN. Nevertheless, the Global Sync deserves an extra level of detail described in the next section.”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KJhhÆh²hubhÚ)�”}”(hXµAll of these components are represented by a data structure named dc_state. From DCHUB to MPC, we have a representation called dc_plane; from MPC to OPTC, we have dc_stream, and the output (DIO) is handled by dc_link. Keep in mind that HUBP accesses a surface using a specific format read from memory, and our dc_plane should work to convert all pixels in the plane to something that can be sent to the display via dc_stream and dc_link.”h]”hXµAll of these components are represented by a data structure named dc_state. From DCHUB to MPC, we have a representation called dc_plane; from MPC to OPTC, we have dc_stream, and the output (DIO) is handled by dc_link. Keep in mind that HUBP accesses a surface using a specific format read from memory, and our dc_plane should work to convert all pixels in the plane to something that can be sent to the display via dc_stream and dc_link.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KNhhÆh²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒFront End and Back End”h]”hŒFront End and Back End”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj�h²hh³hÃh´KVubhÚ)�”}”(hŒ”Display pipeline can be broken down into two components that are usually referred as **Front End (FE)** and **Back End (BE)**, where FE consists of:”h]”(hŒUDisplay pipeline can be broken down into two components that are usually referred as ”…”�”}”(hjžh²hh³Nh´Nubj/)�”}”(hŒ**Front End (FE)**”h]”hŒFront End (FE)”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjžubhŒ and ”…”�”}”(hjžh²hh³Nh´Nubj/)�”}”(hŒ**Back End (BE)**”h]”hŒ Back End (BE)”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjžubhŒ, where FE consists of:”…”�”}”(hjžh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KXhj�h²hubj )�”}”(hhh]”(j%)�”}”(hŒ5DCHUB (Mainly referring to a subcomponent named HUBP)”h]”hÚ)�”}”(hjÕh]”hŒ5DCHUB (Mainly referring to a subcomponent named HUBP)”…”�”}”(hj×h²hh³Nh´Nubah}”(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ŒDPP”h]”hÚ)�”}”(hjìh]”hŒDPP”…”�”}”(hjîh²hh³Nh´Nubah}”(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ŒMPC ”h]”hÚ)�”}”(hŒMPC”h]”hŒMPC”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K]hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjÐh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÐjuh1jh³hÃh´K[hj�h²hubhÚ)�”}”(hŒ On the other hand, BE consist of”h]”hŒ On the other hand, BE consist of”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K_hj�h²hubj )�”}”(hhh]”(j%)�”}”(hŒOPP”h]”hÚ)�”}”(hj2h]”hŒOPP”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kahj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj-h²hh³hÃh´Nubj%)�”}”(hŒOPTC”h]”hÚ)�”}”(hjIh]”hŒOPTC”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KbhjGubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj-h²hh³hÃh´Nubj%)�”}”(hŒ.DIO (DP/HDMI stream encoder and link encoder) ”h]”hÚ)�”}”(hŒ-DIO (DP/HDMI stream encoder and link encoder)”h]”hŒ-DIO (DP/HDMI stream encoder and link encoder)”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kchj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj-h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÐjuh1jh³hÃh´Kahj�h²hubhÚ)�”}”(hXoOPP and OPTC are two joining blocks between FE and BE. On a side note, this is a one-to-one mapping of the link encoder to PHY, but we can configure the DCN to choose which link encoder to connect to which PHY. FE's main responsibility is to change, blend and compose pixel data, while BE's job is to frame a generic pixel stream to a specific display's pixel stream.”h]”hXuOPP and OPTC are two joining blocks between FE and BE. On a side note, this is a one-to-one mapping of the link encoder to PHY, but we can configure the DCN to choose which link encoder to connect to which PHY. FE’s main responsibility is to change, blend and compose pixel data, while BE’s job is to frame a generic pixel stream to a specific display’s pixel stream.”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kehj�h²hubeh}”(h]”Œfront-end-and-back-end”ah ]”h"]”Œfront end and back end”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KVubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Data Flow”h]”hŒ Data Flow”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj’h²hh³hÃh´KlubhÚ)�”}”(hXInitially, data is passed in from VRAM through Data Fabric (DF) in native pixel formats. Such data format stays through till HUBP in DCHUB, where HUBP unpacks different pixel formats and outputs them to DPP in uniform streams through 4 channels (1 for alpha + 3 for colors).”h]”hXInitially, data is passed in from VRAM through Data Fabric (DF) in native pixel formats. Such data format stays through till HUBP in DCHUB, where HUBP unpacks different pixel formats and outputs them to DPP in uniform streams through 4 channels (1 for alpha + 3 for colors).”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Knhj’h²hubhÚ)�”}”(hX¡The Converter and Cursor (CNVC) in DPP would then normalize the data representation and convert them to a DCN specific floating-point format (i.e., different from the IEEE floating-point format). In the process, CNVC also applies a degamma function to transform the data from non-linear to linear space to relax the floating-point calculations following. Data would stay in this floating-point format from DPP to OPP.”h]”hX¡The Converter and Cursor (CNVC) in DPP would then normalize the data representation and convert them to a DCN specific floating-point format (i.e., different from the IEEE floating-point format). In the process, CNVC also applies a degamma function to transform the data from non-linear to linear space to relax the floating-point calculations following. Data would stay in this floating-point format from DPP to OPP.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kshj’h²hubhÚ)�”}”(hX´Starting OPP, because color transformation and blending have been completed (i.e alpha can be dropped), and the end sinks do not require the precision and dynamic range that floating points provide (i.e. all displays are in integer depth format), bit-depth reduction/dithering would kick in. In OPP, we would also apply a regamma function to introduce the gamma removed earlier back. Eventually, we output data in integer format at DIO.”h]”hX´Starting OPP, because color transformation and blending have been completed (i.e alpha can be dropped), and the end sinks do not require the precision and dynamic range that floating points provide (i.e. all displays are in integer depth format), bit-depth reduction/dithering would kick in. In OPP, we would also apply a regamma function to introduce the gamma removed earlier back. Eventually, we output data in integer format at DIO.”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kzhj’h²hubeh}”(h]”Œ data-flow”ah ]”h"]”Œ data flow”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KlubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAMD Hardware Pipeline”h]”hŒAMD Hardware Pipeline”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÕh²hh³hÃh´K‚ubhÚ)�”}”(hXWhen discussing graphics on Linux, the **pipeline** term can sometimes be overloaded with multiple meanings, so it is important to define what we mean when we say **pipeline**. In the DCN driver, we use the term **hardware pipeline** or **pipeline** or just **pipe** as an abstraction to indicate a sequence of DCN blocks instantiated to address some specific configuration. DC core treats DCN blocks as individual resources, meaning we can build a pipeline by taking resources for all individual hardware blocks to compose one pipeline. In actuality, we can't connect an arbitrary block from one pipe to a block from another pipe; they are routed linearly, except for DSC, which can be arbitrarily assigned as needed. We have this pipeline concept for trying to optimize bandwidth utilization.”h]”(hŒ'When discussing graphics on Linux, the ”…”�”}”(hjæh²hh³Nh´Nubj/)�”}”(hŒ **pipeline**”h]”hŒpipeline”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjæubhŒp term can sometimes be overloaded with multiple meanings, so it is important to define what we mean when we say ”…”�”}”(hjæh²hh³Nh´Nubj/)�”}”(hŒ **pipeline**”h]”hŒpipeline”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjæubhŒ%. In the DCN driver, we use the term ”…”�”}”(hjæh²hh³Nh´Nubj/)�”}”(hŒ**hardware pipeline**”h]”hŒhardware pipeline”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjæubhŒ or ”…”�”}”(hjæh²hh³Nh´Nubj/)�”}”(hŒ **pipeline**”h]”hŒpipeline”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjæubhŒ or just ”…”�”}”(hjæh²hh³Nh´Nubj/)�”}”(hŒ**pipe**”h]”hŒpipe”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjæubhX as an abstraction to indicate a sequence of DCN blocks instantiated to address some specific configuration. DC core treats DCN blocks as individual resources, meaning we can build a pipeline by taking resources for all individual hardware blocks to compose one pipeline. In actuality, we can’t connect an arbitrary block from one pipe to a block from another pipe; they are routed linearly, except for DSC, which can be arbitrarily assigned as needed. We have this pipeline concept for trying to optimize bandwidth utilization.”…”�”}”(hjæh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K„hjÕh²hubhë)�”}”(hhh]”hð)�”}”(hhh]”hõ)�”}”(hŒ,.. kernel-figure:: pipeline_4k_no_split.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ+gpu/amdgpu/display/pipeline_4k_no_split.svg”j}”jj_suh1hôhjQh³hÃh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1hêhjÕh²hh³hÃh´K‘ubhÚ)�”}”(hŒÒAdditionally, let's take a look at parts of the DTN log (see 'Documentation/gpu/amdgpu/display/dc-debug.rst' for more information) since this log can help us to see part of this pipeline behavior in real-time::”h]”hŒ×Additionally, let’s take a look at parts of the DTN log (see ‘Documentation/gpu/amdgpu/display/dc-debug.rst’ for more information) since this log can help us to see part of this pipeline behavior in real-time:”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K’hjÕh²hubhŒ literal_block”“”)�”}”(hXHUBP: format addr_hi width height ... [ 0]: 8h 81h 3840 2160 [ 1]: 0h 0h 0 0 [ 2]: 0h 0h 0 0 [ 3]: 0h 0h 0 0 [ 4]: 0h 0h 0 0 ... MPCC: OPP DPP ... [ 0]: 0h 0h ...”h]”hXHUBP: format addr_hi width height ... [ 0]: 8h 81h 3840 2160 [ 1]: 0h 0h 0 0 [ 2]: 0h 0h 0 0 [ 3]: 0h 0h 0 0 [ 4]: 0h 0h 0 0 ... MPCC: OPP DPP ... [ 0]: 0h 0h ...”…”�”}”hj}sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j{h³hÃh´K–hjÕh²hubhÚ)�”}”(hX†The first thing to notice from the diagram and DTN log it is the fact that we have different clock domains for each part of the DCN blocks. In this example, we have just a single **pipeline** where the data flows from DCHUB to DIO, as we intuitively expect. Nonetheless, DCN is flexible, as mentioned before, and we can split this single pipe differently, as described in the below diagram:”h]”(hŒ³The first thing to notice from the diagram and DTN log it is the fact that we have different clock domains for each part of the DCN blocks. In this example, we have just a single ”…”�”}”(hj�h²hh³Nh´Nubj/)�”}”(hŒ **pipeline**”h]”hŒpipeline”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hj�ubhŒÇ where the data flows from DCHUB to DIO, as we intuitively expect. Nonetheless, DCN is flexible, as mentioned before, and we can split this single pipe differently, as described in the below diagram:”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K hjÕh²hubhë)�”}”(hhh]”hð)�”}”(hhh]”hõ)�”}”(hŒ).. kernel-figure:: pipeline_4k_split.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ(gpu/amdgpu/display/pipeline_4k_split.svg”j}”jj¾suh1hôhj°h³hÃh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1hêhjÕh²hh³hÃh´K§ubhÚ)�”}”(hŒJNow, if we inspect the DTN log again we can see some interesting changes::”h]”hŒINow, if we inspect the DTN log again we can see some interesting changes:”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K¨hjÕh²hubj|)�”}”(hŒëHUBP: format addr_hi width height ... [ 0]: 8h 81h 1920 2160 ... ... [ 4]: 0h 0h 0 0 ... [ 5]: 8h 81h 1920 2160 ... ... MPCC: OPP DPP ... [ 0]: 0h 0h ... [ 5]: 0h 5h ...”h]”hŒëHUBP: format addr_hi width height ... [ 0]: 8h 81h 1920 2160 ... ... [ 4]: 0h 0h 0 0 ... [ 5]: 8h 81h 1920 2160 ... ... MPCC: OPP DPP ... [ 0]: 0h 0h ... [ 5]: 0h 5h ...”…”�”}”hjÚsbah}”(h]”h ]”h"]”h$]”h&]”j‹jŒuh1j{h³hÃh´KªhjÕh²hubhÚ)�”}”(hX From the above example, we now split the display pipeline into two vertical parts of 1920x2160 (i.e., 3440x2160), and as a result, we could reduce the clock frequency in the DPP part. This is not only useful for saving power but also to better handle the required throughput. The idea to keep in mind here is that the pipe configuration can vary a lot according to the display configuration, and it is the DML's responsibility to set up all required configuration parameters for multiple scenarios supported by our hardware.”h]”hXFrom the above example, we now split the display pipeline into two vertical parts of 1920x2160 (i.e., 3440x2160), and as a result, we could reduce the clock frequency in the DPP part. This is not only useful for saving power but also to better handle the required throughput. The idea to keep in mind here is that the pipe configuration can vary a lot according to the display configuration, and it is the DML’s responsibility to set up all required configuration parameters for multiple scenarios supported by our hardware.”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K´hjÕh²hubeh}”(h]”Œamd-hardware-pipeline”ah ]”h"]”Œamd hardware pipeline”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K‚ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Global Sync”h]”hŒ Global Sync”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjþh²hh³hÃh´K½ubhÚ)�”}”(hŒçMany DCN registers are double buffered, most importantly the surface address. This allows us to update DCN hardware atomically for page flips, as well as for most other updates that don't require enabling or disabling of new pipes.”h]”hŒéMany DCN registers are double buffered, most importantly the surface address. This allows us to update DCN hardware atomically for page flips, as well as for most other updates that don’t require enabling or disabling of new pipes.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K¿hjþh²hubhÚ)�”}”(hŒ¨(Note: There are many scenarios when DC will decide to reserve extra pipes in order to support outputs that need a very high pixel clock, or for power saving purposes.)”h]”hŒ¨(Note: There are many scenarios when DC will decide to reserve extra pipes in order to support outputs that need a very high pixel clock, or for power saving purposes.)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÃhjþh²hubhÚ)�”}”(hŒøThese atomic register updates are driven by global sync signals in DCN. In order to understand how atomic updates interact with DCN hardware, and how DCN signals page flip and vblank events it is helpful to understand how global sync is programmed.”h]”hŒøThese atomic register updates are driven by global sync signals in DCN. In order to understand how atomic updates interact with DCN hardware, and how DCN signals page flip and vblank events it is helpful to understand how global sync is programmed.”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÇhjþh²hubhÚ)�”}”(hXºGlobal sync consists of three signals, VSTARTUP, VUPDATE, and VREADY. These are calculated by the Display Mode Library - DML (drivers/gpu/drm/amd/display/dc/dml) based on a large number of parameters and ensure our hardware is able to feed the DCN pipeline without underflows or hangs in any given system configuration. The global sync signals always happen during VBlank, are independent from the VSync signal, and do not overlap each other.”h]”hXºGlobal sync consists of three signals, VSTARTUP, VUPDATE, and VREADY. These are calculated by the Display Mode Library - DML (drivers/gpu/drm/amd/display/dc/dml) based on a large number of parameters and ensure our hardware is able to feed the DCN pipeline without underflows or hangs in any given system configuration. The global sync signals always happen during VBlank, are independent from the VSync signal, and do not overlap each other.”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÌhjþh²hubhÚ)�”}”(hX{VUPDATE is the only signal that is of interest to the rest of the driver stack or userspace clients as it signals the point at which hardware latches to atomically programmed (i.e. double buffered) registers. Even though it is independent of the VSync signal we use VUPDATE to signal the VSync event as it provides the best indication of how atomic commits and hardware interact.”h]”hX{VUPDATE is the only signal that is of interest to the rest of the driver stack or userspace clients as it signals the point at which hardware latches to atomically programmed (i.e. double buffered) registers. Even though it is independent of the VSync signal we use VUPDATE to signal the VSync event as it provides the best indication of how atomic commits and hardware interact.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÓhjþh²hubhÚ)�”}”(hŒrSince DCN hardware is double-buffered the DC driver is able to program the hardware at any point during the frame.”h]”hŒrSince DCN hardware is double-buffered the DC driver is able to program the hardware at any point during the frame.”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÙhjþh²hubhÚ)�”}”(hŒ6The below picture illustrates the global sync signals:”h]”hŒ6The below picture illustrates the global sync signals:”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÜhjþh²hubhë)�”}”(hhh]”hð)�”}”(hhh]”hõ)�”}”(hŒ*.. kernel-figure:: global_sync_vblank.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ)gpu/amdgpu/display/global_sync_vblank.svg”j}”jj‚suh1hôhjth³hÃh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhjqubah}”(h]”h ]”h"]”h$]”h&]”uh1hêhjþh²hh³hÃh´KßubhÚ)�”}”(hŒ•These signals affect core DCN behavior. Programming them incorrectly will lead to a number of negative consequences, most of them quite catastrophic.”h]”hŒ•These signals affect core DCN behavior. Programming them incorrectly will lead to a number of negative consequences, most of them quite catastrophic.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kàhjþh²hubhÚ)�”}”(hŒñThe following picture shows how global sync allows for a mailbox style of updates, i.e. it allows for multiple re-configurations between VUpdate events where only the last configuration programmed before the VUpdate signal becomes effective.”h]”hŒñThe following picture shows how global sync allows for a mailbox style of updates, i.e. it allows for multiple re-configurations between VUpdate events where only the last configuration programmed before the VUpdate signal becomes effective.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kãhjþh²hubhë)�”}”(hhh]”hð)�”}”(hhh]”hõ)�”}”(hŒ%.. kernel-figure:: config_example.svg”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ%gpu/amdgpu/display/config_example.svg”j}”jj½suh1hôhj¯h³hÃh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1hïhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1hêhjþh²hh³hÃh´Kèubeh}”(h]”Œ global-sync”ah ]”h"]”Œ global sync”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K½ubeh}”(h]”(Œdisplay-core-next-dcn”hÂeh ]”h"]”(Œdisplay core next (dcn)”Œ dcn_overview”eh$]”h&]”uh1hÄhhh²hh³hÃh´KŒexpect_referenced_by_name”}”jÙh·sŒexpect_referenced_by_id”}”hÂh·subeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÃuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÉNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”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”}”hÂ]”h·asŒnameids”}”(jÙhÂjØjÕj�jŒjÒjÏjûjøjÐjÍuŒ nametypes”}”(jÙˆj؉j�‰jÒ‰jû‰jЉuh}”(hÂhÆjÕhÆjŒj�jÏj’jøjÕjÍjþ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”]”Œtransform_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÚ)�”}”(hhh]”hŒ2Hyperlink target "dcn-overview" is not referenced.”…”�”}”hjmsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhjjubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÃŒline”Kuh1jhubaŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.