All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <a9e782eacbd88d41eee7bf7475b3c6e48e437923.camel@mediatek.com>

diff --git a/N1/2.bin b/N1/2.bin
new file mode 100644
index 0000000..5bd9536
--- /dev/null
+++ b/N1/2.bin
@@ -0,0 +1,1331 @@
+<html><body><p>
+<pre>
+Hi,&#32;Paul:
+
+On&#32;Fri,&#32;2025-01-10&#32;at&#32;20:34&#32;+0800,&#32;paul-pl.chen&#32;wrote:
+&gt;&#32;From:&#32;&quot;Nancy.Lin&quot;&#32;&lt;nancy.lin@mediatek.com&gt;
+&gt;&#32;
+&gt;&#32;To&#32;support&#32;multiple&#32;mmsys&#32;instances&#32;in&#32;the&#32;one&#32;mediatek-drm&#32;instance,
+&gt;&#32;providing&#32;improved&#32;flexibility&#32;and&#32;scalability&#32;by&#32;the&#32;following&#32;changes:
+&gt;&#32;
+&gt;&#32;1.&#32;Defined&#32;new&#32;DRM&#32;component&#32;IDs&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR*
+&gt;&#32;&#32;&#32;to&#32;support&#32;different&#32;mmsys&#32;composition.
+&gt;&#32;2.&#32;Added&#32;new&#32;component&#32;types&#32;MTK_DISP_VIRTUAL&#32;to&#32;support&#32;the
+&gt;&#32;&#32;&#32;routing&#32;to&#32;virtual&#32;display&#32;components.
+&gt;&#32;3.&#32;Added&#32;and&#32;adjusted&#32;the&#32;existed&#32;structure&#32;or&#32;interface&#32;to&#32;extend
+&gt;&#32;&#32;&#32;the&#32;support&#32;of&#32;multiple&#32;mmsys&#32;instances.
+&gt;&#32;4.&#32;Modified&#32;the&#32;component&#32;matching&#32;and&#32;binding&#32;logic&#32;to&#32;support
+&gt;&#32;&#32;&#32;multiple&#32;mmsys&#32;instances.
+
+I&#32;think&#32;the&#32;title&#32;would&#32;confuse&#32;me.
+Original&#32;mediatek-drm&#32;driver&#32;already&#32;support&#32;multiple&#32;mmsys.
+I&#32;try&#32;to&#32;understand&#32;MT8196&#32;display.
+Is&#32;one&#32;display&#32;pipeline&#32;separated&#32;into&#32;two&#32;mmsys&#63;
+The&#32;first&#32;is&#32;ovlsys&#32;and&#32;the&#32;second&#32;is&#32;dispsys&#63;
+If&#32;so,&#32;I&#32;would&#32;like&#32;mediatek-drm&#32;driver&#32;see&#32;only&#32;mmsys&#32;(dispsys),
+and&#32;let&#32;ovlsys&#32;control&#32;is&#32;hidden&#32;in&#32;ovlsys&#32;sub&#32;driver,&#32;so&#32;mediatek-drm&#32;driver&#32;would&#32;not&#32;change&#32;so&#32;much.
+
+&gt;&#32;
+&gt;&#32;Signed-off-by:&#32;Nancy.Lin&#32;&lt;nancy.lin@mediatek.com&gt;
+&gt;&#32;Signed-off-by:&#32;Paul-pl.Chen&#32;&lt;paul-pl.chen@mediatek.com&gt;
+&gt;&#32;---
+&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_crtc.c&#32;&#32;&#32;&#32;&#32;|&#32;350&#32;+++++++++++++++++++-----
+&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_crtc.h&#32;&#32;&#32;&#32;&#32;|&#32;&#32;&#32;6&#32;+-
+&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_ddp_comp.c&#32;|&#32;106&#32;+++++--
+&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_ddp_comp.h&#32;|&#32;&#32;&#32;2&#32;+
+&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_drm_drv.c&#32;&#32;|&#32;223&#32;++++++++++++---
+&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_drm_drv.h&#32;&#32;|&#32;&#32;16&#32;+-
+&gt;&#32;&#32;6&#32;files&#32;changed,&#32;578&#32;insertions(+),&#32;125&#32;deletions(-)
+&gt;&#32;
+&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.c&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.c
+&gt;&#32;index&#32;eb0e1233ad04..eca6941bfaa2&#32;100644
+&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.c
+&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.c
+&gt;&#32;@@&#32;-58,13&#32;+58,17&#32;@@&#32;struct&#32;mtk_crtc&#32;{
+&gt;&#32;&#32;wait_queue_head_tcb_blocking_queue;
+&gt;&#32;&#32;#endif
+&gt;&#32;&#32;
+&gt;&#32;-struct&#32;device*mmsys_dev;
+&gt;&#32;+struct&#32;device*mmsys_dev[MAX_MMSYS];
+&gt;&#32;&#32;struct&#32;device*dma_dev;
+&gt;&#32;-struct&#32;mtk_mutex*mutex;
+&gt;&#32;+struct&#32;device*vdisp_ao_dev;
+&gt;&#32;+struct&#32;mtk_mutex*mutex[MAX_MMSYS];
+&gt;&#32;&#32;unsigned&#32;intddp_comp_nr;
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp**ddp_comp;
+&gt;&#32;+enum&#32;mtk_drm_mmsys*ddp_comp_sys;
+&gt;&#32;+boolexist[MAX_MMSYS];
+&gt;&#32;&#32;unsigned&#32;intnum_conn_routes;
+&gt;&#32;&#32;const&#32;struct&#32;mtk_drm_route*conn_routes;
+&gt;&#32;+enum&#32;mtk_drm_mmsysconn_routes_sys;
+&gt;&#32;&#32;
+&gt;&#32;&#32;/*&#32;lock&#32;for&#32;display&#32;hardware&#32;access&#32;*/
+&gt;&#32;&#32;struct&#32;mutexhw_lock;
+&gt;&#32;@@&#32;-82,6&#32;+86,11&#32;@@&#32;struct&#32;mtk_crtc_state&#32;{
+&gt;&#32;&#32;unsigned&#32;intpending_vrefresh;
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;+struct&#32;mtk_crtc_comp_info&#32;{
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;sys;
+&gt;&#32;+unsigned&#32;int&#32;comp_id;
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;&#32;static&#32;inline&#32;struct&#32;mtk_crtc&#32;*to_mtk_crtc(struct&#32;drm_crtc&#32;*c)
+&gt;&#32;&#32;{
+&gt;&#32;&#32;return&#32;container_of(c,&#32;struct&#32;mtk_crtc,&#32;base);
+&gt;&#32;@@&#32;-125,7&#32;+134,9&#32;@@&#32;static&#32;void&#32;mtk_crtc_destroy(struct&#32;drm_crtc&#32;*crtc)
+&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);
+&gt;&#32;&#32;int&#32;i;
+&gt;&#32;&#32;
+&gt;&#32;-mtk_mutex_put(mtk_crtc-&gt;mutex);
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_put(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;&#32;#if&#32;IS_REACHABLE(CONFIG_MTK_CMDQ)
+&gt;&#32;&#32;if&#32;(mtk_crtc-&gt;cmdq_client.chan)&#32;{
+&gt;&#32;&#32;cmdq_pkt_destroy(&amp;mtk_crtc-&gt;cmdq_client,&#32;&amp;mtk_crtc-&gt;cmdq_handle);
+&gt;&#32;@@&#32;-223,7&#32;+234,14&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_clk_enable(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;int&#32;i;
+&gt;&#32;&#32;
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;
+&gt;&#32;+
+&gt;&#32;&#32;ret&#32;=&#32;mtk_ddp_comp_clk_enable(mtk_crtc-&gt;ddp_comp[i]);
+&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(mtk_crtc-&gt;ddp_comp[i]-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)&#32;{
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+ret&#32;=&#32;mtk_mmsys_ddp_clk_enable(mtk_crtc-&gt;mmsys_dev[mmsys],
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+}
+&gt;&#32;&#32;if&#32;(ret)&#32;{
+&gt;&#32;&#32;DRM_ERROR(&quot;Failed&#32;to&#32;enable&#32;clock&#32;%d:&#32;%d&#92;n&quot;,&#32;i,&#32;ret);
+&gt;&#32;&#32;goto&#32;err;
+&gt;&#32;@@&#32;-232,17&#32;+250,28&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_clk_enable(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;
+&gt;&#32;&#32;return&#32;0;
+&gt;&#32;&#32;err:
+&gt;&#32;-while&#32;(--i&#32;&gt;=&#32;0)
+&gt;&#32;+while&#32;(--i&#32;&gt;=&#32;0)&#32;{
+&gt;&#32;&#32;mtk_ddp_comp_clk_disable(mtk_crtc-&gt;ddp_comp[i]);
+&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(mtk_crtc-&gt;ddp_comp[i]-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)
+&gt;&#32;+mtk_mmsys_ddp_clk_disable(mtk_crtc-&gt;mmsys_dev[mtk_crtc-&gt;ddp_comp_sys[i]],
+&gt;&#32;+&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+}
+&gt;&#32;&#32;return&#32;ret;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;static&#32;void&#32;mtk_crtc_ddp_clk_disable(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;{
+&gt;&#32;&#32;int&#32;i;
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;
+&gt;&#32;&#32;
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{
+&gt;&#32;&#32;mtk_ddp_comp_clk_disable(mtk_crtc-&gt;ddp_comp[i]);
+&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(mtk_crtc-&gt;ddp_comp[i]-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)&#32;{
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+mtk_mmsys_ddp_clk_disable(mtk_crtc-&gt;mmsys_dev[mmsys],
+&gt;&#32;+&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+}
+&gt;&#32;+}
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;static
+&gt;&#32;@@&#32;-332,7&#32;+361,8&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;struct&#32;drm_connector_list_iter&#32;conn_iter;
+&gt;&#32;&#32;unsigned&#32;int&#32;width,&#32;height,&#32;vrefresh,&#32;bpc&#32;=&#32;MTK_MAX_BPC;
+&gt;&#32;&#32;int&#32;ret;
+&gt;&#32;-int&#32;i;
+&gt;&#32;+int&#32;i,&#32;j;
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(WARN_ON(!crtc-&gt;state))
+&gt;&#32;&#32;return&#32;-EINVAL;
+&gt;&#32;@@&#32;-362,10&#32;+392,18&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;return&#32;ret;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;-ret&#32;=&#32;mtk_mutex_prepare(mtk_crtc-&gt;mutex);
+&gt;&#32;-if&#32;(ret&#32;&lt;&#32;0)&#32;{
+&gt;&#32;-DRM_ERROR(&quot;Failed&#32;to&#32;enable&#32;mutex&#32;clock:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;-goto&#32;err_pm_runtime_put;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+mtk_mmsys_top_clk_enable(mtk_crtc-&gt;mmsys_dev[i]);
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{
+&gt;&#32;+if&#32;(!mtk_crtc-&gt;mutex[i]&#32;||&#32;!mtk_crtc-&gt;exist[i])
+&gt;&#32;+continue;
+&gt;&#32;+ret&#32;=&#32;mtk_mutex_prepare(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)&#32;{
+&gt;&#32;+DRM_ERROR(&quot;Failed&#32;to&#32;enable&#32;mmsys%d&#32;mutex&#32;clock:&#32;%d&#92;n&quot;,&#32;i,&#32;ret);
+&gt;&#32;+goto&#32;err_pm_runtime_put;
+&gt;&#32;+}
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;ret&#32;=&#32;mtk_crtc_ddp_clk_enable(mtk_crtc);
+&gt;&#32;@@&#32;-374,19&#32;+412,36&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;goto&#32;err_mutex_unprepare;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;+if&#32;(mtk_crtc-&gt;vdisp_ao_dev)
+&gt;&#32;+mtk_mmsys_default_config(mtk_crtc-&gt;vdisp_ao_dev);
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+mtk_mmsys_default_config(mtk_crtc-&gt;mmsys_dev[i]);
+&gt;&#32;+
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1;&#32;i++)&#32;{
+&gt;&#32;-if&#32;(!mtk_ddp_comp_connect(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mmsys_dev,
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+if&#32;(!mtk_ddp_comp_connect(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mmsys_dev[mmsys],
+&gt;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id))
+&gt;&#32;-mtk_mmsys_ddp_connect(mtk_crtc-&gt;mmsys_dev,
+&gt;&#32;+mtk_mmsys_ddp_connect(mtk_crtc-&gt;mmsys_dev[mmsys],
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id,
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id);
+&gt;&#32;-if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))
+&gt;&#32;-mtk_mutex_add_comp(mtk_crtc-&gt;mutex,
+&gt;&#32;+if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))
+&gt;&#32;+mtk_mutex_add_comp(mtk_crtc-&gt;mutex[mmsys],
+&gt;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;&#32;}
+&gt;&#32;-if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))
+&gt;&#32;-mtk_mutex_add_comp(mtk_crtc-&gt;mutex,&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;-mtk_mutex_enable(mtk_crtc-&gt;mutex);
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))
+&gt;&#32;+mtk_mutex_add_comp(mtk_crtc-&gt;mutex[mmsys],&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+
+&gt;&#32;+/*&#32;Need&#32;to&#32;set&#32;sof&#32;source&#32;for&#32;all&#32;mmsys&#32;mutexs&#32;in&#32;this&#32;crtc&#32;*/
+&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;MAX_MMSYS;&#32;j++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[j]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[j])
+&gt;&#32;+mtk_mutex_write_comp_sof(mtk_crtc-&gt;mutex[j],&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_enable(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;&#32;
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[i];
+&gt;&#32;@@&#32;-394,7&#32;+449,11&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;if&#32;(i&#32;==&#32;1)
+&gt;&#32;&#32;mtk_ddp_comp_bgclr_in_on(comp);
+&gt;&#32;&#32;
+&gt;&#32;-mtk_ddp_comp_config(comp,&#32;width,&#32;height,&#32;vrefresh,&#32;bpc,&#32;NULL);
+&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(comp-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)
+&gt;&#32;+mtk_mmsys_ddp_config(mtk_crtc-&gt;mmsys_dev[mtk_crtc-&gt;ddp_comp_sys[i]],
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;comp-&gt;id,&#32;width,&#32;height,&#32;NULL);
+&gt;&#32;+else
+&gt;&#32;+mtk_ddp_comp_config(comp,&#32;width,&#32;height,&#32;vrefresh,&#32;bpc,&#32;NULL);
+&gt;&#32;&#32;mtk_ddp_comp_start(comp);
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;@@&#32;-418,7&#32;+477,10&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;return&#32;0;
+&gt;&#32;&#32;
+&gt;&#32;&#32;err_mutex_unprepare:
+&gt;&#32;-mtk_mutex_unprepare(mtk_crtc-&gt;mutex);
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_unprepare(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;+
+&gt;&#32;&#32;err_pm_runtime_put:
+&gt;&#32;&#32;pm_runtime_put(crtc-&gt;dev-&gt;dev);
+&gt;&#32;&#32;return&#32;ret;
+&gt;&#32;@@&#32;-430,6&#32;+492,7&#32;@@&#32;static&#32;void&#32;mtk_crtc_ddp_hw_fini(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;struct&#32;drm_crtc&#32;*crtc&#32;=&#32;&amp;mtk_crtc-&gt;base;
+&gt;&#32;&#32;unsigned&#32;long&#32;flags;
+&gt;&#32;&#32;int&#32;i;
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;
+&gt;&#32;&#32;
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{
+&gt;&#32;&#32;mtk_ddp_comp_stop(mtk_crtc-&gt;ddp_comp[i]);
+&gt;&#32;@@&#32;-437,27&#32;+500,46&#32;@@&#32;static&#32;void&#32;mtk_crtc_ddp_hw_fini(struct&#32;mtk_crtc&#32;*mtk_crtc)
+&gt;&#32;&#32;mtk_ddp_comp_bgclr_in_off(mtk_crtc-&gt;ddp_comp[i]);
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)
+&gt;&#32;-if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))
+&gt;&#32;-mtk_mutex_remove_comp(mtk_crtc-&gt;mutex,
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))
+&gt;&#32;+mtk_mutex_remove_comp(mtk_crtc-&gt;mutex[mtk_crtc-&gt;ddp_comp_sys[i]],
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;-mtk_mutex_disable(mtk_crtc-&gt;mutex);
+&gt;&#32;+}
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_disable(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;+
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1;&#32;i++)&#32;{
+&gt;&#32;-if&#32;(!mtk_ddp_comp_disconnect(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mmsys_dev,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id))
+&gt;&#32;-mtk_mmsys_ddp_disconnect(mtk_crtc-&gt;mmsys_dev,
+&gt;&#32;-&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id,
+&gt;&#32;-&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id);
+&gt;&#32;-if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))
+&gt;&#32;-mtk_mutex_remove_comp(mtk_crtc-&gt;mutex,
+&gt;&#32;+struct&#32;mtk_ddp_comp&#32;*comp;
+&gt;&#32;+unsigned&#32;int&#32;curr,&#32;next;
+&gt;&#32;+
+&gt;&#32;+comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[i];
+&gt;&#32;+curr&#32;=&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id;
+&gt;&#32;+next&#32;=&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id;
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+if&#32;(!mtk_ddp_comp_disconnect(comp,&#32;mtk_crtc-&gt;mmsys_dev[mmsys],&#32;next))
+&gt;&#32;+mtk_mmsys_ddp_disconnect(mtk_crtc-&gt;mmsys_dev[mmsys],&#32;curr,&#32;next);
+&gt;&#32;+if&#32;(!mtk_ddp_comp_remove(comp,&#32;mtk_crtc-&gt;mutex[mmsys]))
+&gt;&#32;+mtk_mutex_remove_comp(mtk_crtc-&gt;mutex[mtk_crtc-&gt;ddp_comp_sys[i]],
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;&#32;}
+&gt;&#32;-if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))
+&gt;&#32;-mtk_mutex_remove_comp(mtk_crtc-&gt;mutex,&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];
+&gt;&#32;+if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))
+&gt;&#32;+mtk_mutex_remove_comp(mtk_crtc-&gt;mutex[mmsys],&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);
+&gt;&#32;+
+&gt;&#32;&#32;mtk_crtc_ddp_clk_disable(mtk_crtc);
+&gt;&#32;-mtk_mutex_unprepare(mtk_crtc-&gt;mutex);
+&gt;&#32;&#32;
+&gt;&#32;-pm_runtime_put(drm-&gt;dev);
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_unprepare(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+mtk_mmsys_top_clk_disable(mtk_crtc-&gt;mmsys_dev[i]);
+&gt;&#32;+
+&gt;&#32;+pm_runtime_put_sync(drm-&gt;dev);
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(crtc-&gt;state-&gt;event&#32;&amp;&amp;&#32;!crtc-&gt;state-&gt;active)&#32;{
+&gt;&#32;&#32;spin_lock_irqsave(&amp;crtc-&gt;dev-&gt;event_lock,&#32;flags);
+&gt;&#32;@@&#32;-581,9&#32;+663,15&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_config(struct&#32;mtk_crtc&#32;*mtk_crtc,&#32;bool&#32;needs_vblank)
+&gt;&#32;&#32;mtk_crtc-&gt;pending_async_planes&#32;=&#32;true;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(priv-&gt;data-&gt;shadow_register)&#32;{
+&gt;&#32;-mtk_mutex_acquire(mtk_crtc-&gt;mutex);
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_acquire(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;+
+&gt;&#32;&#32;mtk_crtc_ddp_config(crtc,&#32;NULL);
+&gt;&#32;-mtk_mutex_release(mtk_crtc-&gt;mutex);
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])
+&gt;&#32;+mtk_mutex_release(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;&#32;}
+&gt;&#32;&#32;#if&#32;IS_REACHABLE(CONFIG_MTK_CMDQ)
+&gt;&#32;&#32;if&#32;(mtk_crtc-&gt;cmdq_client.chan)&#32;{
+&gt;&#32;@@&#32;-659,6&#32;+747,7&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_output(struct&#32;drm_crtc&#32;*crtc,
+&gt;&#32;&#32;{
+&gt;&#32;&#32;int&#32;crtc_index&#32;=&#32;drm_crtc_index(crtc);
+&gt;&#32;&#32;int&#32;i;
+&gt;&#32;+unsigned&#32;int&#32;mmsys;
+&gt;&#32;&#32;struct&#32;device&#32;*dev;
+&gt;&#32;&#32;struct&#32;drm_crtc_state&#32;*crtc_state&#32;=&#32;state-&gt;crtcs[crtc_index].new_state;
+&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);
+&gt;&#32;@@&#32;-671,7&#32;+760,8&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_output(struct&#32;drm_crtc&#32;*crtc,
+&gt;&#32;&#32;if&#32;(!mtk_crtc-&gt;num_conn_routes)
+&gt;&#32;&#32;return;
+&gt;&#32;&#32;
+&gt;&#32;-priv&#32;=&#32;((struct&#32;mtk_drm_private&#32;*)crtc-&gt;dev-&gt;dev_private)-&gt;all_drm_private[crtc_index];
+&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;conn_routes_sys;
+&gt;&#32;+priv&#32;=&#32;((struct&#32;mtk_drm_private&#32;*)crtc-&gt;dev-&gt;dev_private)-&gt;all_drm_private[mmsys];
+&gt;&#32;&#32;dev&#32;=&#32;priv-&gt;dev;
+&gt;&#32;&#32;
+&gt;&#32;&#32;dev_dbg(dev,&#32;&quot;connector&#32;change:%d,&#32;encoder&#32;mask:0x%x&#32;for&#32;crtc:%d&#92;n&quot;,
+&gt;&#32;@@&#32;-684,6&#32;+774,8&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_output(struct&#32;drm_crtc&#32;*crtc,
+&gt;&#32;&#32;if&#32;(comp-&gt;encoder_index&#32;&gt;=&#32;0&#32;&amp;&amp;
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;(encoder_mask&#32;&amp;&#32;BIT(comp-&gt;encoder_index)))&#32;{
+&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp[mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1]&#32;=&#32;comp;
+&gt;&#32;+mtk_crtc-&gt;ddp_comp_sys[mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1]&#32;=&#32;mmsys;
+&gt;&#32;+mtk_crtc-&gt;exist[mmsys]&#32;=&#32;true;
+&gt;&#32;&#32;dev_dbg(dev,&#32;&quot;Add&#32;comp_id:&#32;%d&#32;at&#32;path&#32;index&#32;%d&#92;n&quot;,
+&gt;&#32;&#32;comp-&gt;id,&#32;mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1);
+&gt;&#32;&#32;break;
+&gt;&#32;@@&#32;-720,13&#32;+812,35&#32;@@&#32;static&#32;void&#32;mtk_crtc_atomic_enable(struct&#32;drm_crtc&#32;*crtc,
+&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[0];
+&gt;&#32;&#32;int&#32;ret;
+&gt;&#32;+int&#32;i,&#32;j;
+&gt;&#32;+int&#32;mmsys_cnt&#32;=&#32;0;
+&gt;&#32;&#32;
+&gt;&#32;&#32;DRM_DEBUG_DRIVER(&quot;%s&#32;%d&#92;n&quot;,&#32;__func__,&#32;crtc-&gt;base.id);
+&gt;&#32;&#32;
+&gt;&#32;-ret&#32;=&#32;mtk_ddp_comp_power_on(comp);
+&gt;&#32;-if&#32;(ret&#32;&lt;&#32;0)&#32;{
+&gt;&#32;-DRM_DEV_ERROR(comp-&gt;dev,&#32;&quot;Failed&#32;to&#32;enable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;-return;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+mmsys_cnt++;
+&gt;&#32;+
+&gt;&#32;+if&#32;(mmsys_cnt&#32;==&#32;1)&#32;{
+&gt;&#32;+ret&#32;=&#32;pm_runtime_resume_and_get(comp-&gt;dev);
+&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)&#32;{
+&gt;&#32;+DRM_DEV_ERROR(comp-&gt;dev,&#32;&quot;Failed&#32;to&#32;enable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;+return;
+&gt;&#32;+}
+&gt;&#32;+}&#32;else&#32;{
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{
+&gt;&#32;+if&#32;(!mtk_crtc-&gt;exist[i])
+&gt;&#32;+continue;
+&gt;&#32;+ret&#32;=&#32;pm_runtime_resume_and_get(mtk_crtc-&gt;mmsys_dev[i]);
+&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)&#32;{
+&gt;&#32;+DRM_DEV_ERROR(mtk_crtc-&gt;mmsys_dev[i],
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;&quot;Failed&#32;to&#32;enable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;+for&#32;(j&#32;=&#32;i&#32;-&#32;1;&#32;j&#32;&gt;=&#32;0;&#32;j--)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+pm_runtime_put(comp-&gt;dev);
+&gt;&#32;+return;
+&gt;&#32;+}
+&gt;&#32;+}
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;mtk_crtc_update_output(crtc,&#32;state);
+&gt;&#32;@@&#32;-746,12&#32;+860,17&#32;@@&#32;static&#32;void&#32;mtk_crtc_atomic_disable(struct&#32;drm_crtc&#32;*crtc,
+&gt;&#32;&#32;{
+&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[0];
+&gt;&#32;-int&#32;i;
+&gt;&#32;+int&#32;i,&#32;ret;
+&gt;&#32;+int&#32;mmsys_cnt&#32;=&#32;0;
+&gt;&#32;&#32;
+&gt;&#32;&#32;DRM_DEBUG_DRIVER(&quot;%s&#32;%d&#92;n&quot;,&#32;__func__,&#32;crtc-&gt;base.id);
+&gt;&#32;&#32;if&#32;(!mtk_crtc-&gt;enabled)
+&gt;&#32;&#32;return;
+&gt;&#32;&#32;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+mmsys_cnt++;
+&gt;&#32;+
+&gt;&#32;&#32;/*&#32;Set&#32;all&#32;pending&#32;plane&#32;state&#32;to&#32;disabled&#32;*/
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;layer_nr;&#32;i++)&#32;{
+&gt;&#32;&#32;struct&#32;drm_plane&#32;*plane&#32;=&#32;&amp;mtk_crtc-&gt;planes[i];
+&gt;&#32;@@&#32;-776,7&#32;+895,21&#32;@@&#32;static&#32;void&#32;mtk_crtc_atomic_disable(struct&#32;drm_crtc&#32;*crtc,
+&gt;&#32;&#32;
+&gt;&#32;&#32;drm_crtc_vblank_off(crtc);
+&gt;&#32;&#32;mtk_crtc_ddp_hw_fini(mtk_crtc);
+&gt;&#32;-mtk_ddp_comp_power_off(comp);
+&gt;&#32;+
+&gt;&#32;+if&#32;(mmsys_cnt&#32;&gt;&#32;1)&#32;{
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])&#32;{
+&gt;&#32;+ret&#32;=&#32;pm_runtime_put(mtk_crtc-&gt;mmsys_dev[i]);
+&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)
+&gt;&#32;+DRM_DEV_ERROR(mtk_crtc-&gt;mmsys_dev[i],
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;&quot;Failed&#32;to&#32;disable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;+}
+&gt;&#32;+}
+&gt;&#32;+}&#32;else&#32;{
+&gt;&#32;+ret&#32;=&#32;pm_runtime_put(comp-&gt;dev);
+&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)
+&gt;&#32;+DRM_DEV_ERROR(comp-&gt;dev,&#32;&quot;Failed&#32;to&#32;disable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;+}
+&gt;&#32;&#32;
+&gt;&#32;&#32;mtk_crtc-&gt;enabled&#32;=&#32;false;
+&gt;&#32;&#32;}
+&gt;&#32;@@&#32;-937,49&#32;+1070,108&#32;@@&#32;struct&#32;device&#32;*mtk_crtc_dma_dev_get(struct&#32;drm_crtc&#32;*crtc)
+&gt;&#32;&#32;return&#32;mtk_crtc-&gt;dma_dev;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;-int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;path_len,&#32;int&#32;priv_data_index,
+&gt;&#32;-&#32;&#32;&#32;&#32;const&#32;struct&#32;mtk_drm_route&#32;*conn_routes,
+&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;num_conn_routes)
+&gt;&#32;+int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;enum&#32;mtk_crtc_path&#32;path_sel)
+&gt;&#32;&#32;{
+&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*priv&#32;=&#32;drm_dev-&gt;dev_private;
+&gt;&#32;&#32;struct&#32;device&#32;*dev&#32;=&#32;drm_dev-&gt;dev;
+&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc;
+&gt;&#32;&#32;unsigned&#32;int&#32;num_comp_planes&#32;=&#32;0;
+&gt;&#32;&#32;int&#32;ret;
+&gt;&#32;-int&#32;i;
+&gt;&#32;+int&#32;i,&#32;j,&#32;k;
+&gt;&#32;&#32;bool&#32;has_ctm&#32;=&#32;false;
+&gt;&#32;&#32;uint&#32;gamma_lut_size&#32;=&#32;0;
+&gt;&#32;&#32;struct&#32;drm_crtc&#32;*tmp;
+&gt;&#32;&#32;int&#32;crtc_i&#32;=&#32;0;
+&gt;&#32;-
+&gt;&#32;-if&#32;(!path)
+&gt;&#32;-return&#32;0;
+&gt;&#32;-
+&gt;&#32;-priv&#32;=&#32;priv-&gt;all_drm_private[priv_data_index];
+&gt;&#32;+struct&#32;mtk_drm_private&#32;*subsys_priv;
+&gt;&#32;+struct&#32;mtk_crtc_comp_info&#32;path[DDP_COMPONENT_ID_MAX];
+&gt;&#32;+unsigned&#32;int&#32;path_len&#32;=&#32;0;
+&gt;&#32;+const&#32;struct&#32;mtk_drm_route&#32;*conn_routes&#32;=&#32;NULL;
+&gt;&#32;+unsigned&#32;int&#32;num_conn_routes&#32;=&#32;0;
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;conn_mmsys;
+&gt;&#32;&#32;
+&gt;&#32;&#32;drm_for_each_crtc(tmp,&#32;drm_dev)
+&gt;&#32;&#32;crtc_i++;
+&gt;&#32;&#32;
+&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;priv-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{
+&gt;&#32;+for&#32;(k&#32;=&#32;0;&#32;k&#32;&lt;&#32;MAX_MMSYS;&#32;k++)&#32;{
+&gt;&#32;+const&#32;unsigned&#32;int&#32;*subsys_path;
+&gt;&#32;+unsigned&#32;int&#32;subsys_path_len;
+&gt;&#32;+unsigned&#32;int&#32;order&#32;=&#32;0;
+&gt;&#32;+
+&gt;&#32;+subsys_priv&#32;=&#32;priv-&gt;all_drm_private[k];
+&gt;&#32;+if&#32;(!subsys_priv)
+&gt;&#32;+continue;
+&gt;&#32;+
+&gt;&#32;+if&#32;(path_sel&#32;==&#32;CRTC_MAIN)&#32;{
+&gt;&#32;+subsys_path&#32;=&#32;subsys_priv-&gt;data-&gt;main_path;
+&gt;&#32;+subsys_path_len&#32;=&#32;subsys_priv-&gt;data-&gt;main_len;
+&gt;&#32;+order&#32;=&#32;subsys_priv-&gt;data-&gt;main_order;
+&gt;&#32;+}&#32;else&#32;if&#32;(path_sel&#32;==&#32;CRTC_EXT)&#32;{
+&gt;&#32;+subsys_path&#32;=&#32;subsys_priv-&gt;data-&gt;ext_path;
+&gt;&#32;+subsys_path_len&#32;=&#32;subsys_priv-&gt;data-&gt;ext_len;
+&gt;&#32;+order&#32;=&#32;subsys_priv-&gt;data-&gt;ext_order;
+&gt;&#32;+}&#32;else&#32;if&#32;(path_sel&#32;==&#32;CRTC_THIRD)&#32;{
+&gt;&#32;+subsys_path&#32;=&#32;subsys_priv-&gt;data-&gt;third_path;
+&gt;&#32;+subsys_path_len&#32;=&#32;subsys_priv-&gt;data-&gt;third_len;
+&gt;&#32;+order&#32;=&#32;subsys_priv-&gt;data-&gt;third_order;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+if&#32;(subsys_priv-&gt;data-&gt;num_conn_routes)&#32;{
+&gt;&#32;+conn_routes&#32;=&#32;subsys_priv-&gt;data-&gt;conn_routes;
+&gt;&#32;+num_conn_routes&#32;=&#32;subsys_priv-&gt;data-&gt;num_conn_routes;
+&gt;&#32;+conn_mmsys&#32;=&#32;subsys_priv-&gt;data-&gt;mmsys_id;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+if&#32;(j&#32;!=&#32;order)
+&gt;&#32;+continue;
+&gt;&#32;+if&#32;(!subsys_path_len)
+&gt;&#32;+continue;
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;subsys_path_len;&#32;i++)&#32;{
+&gt;&#32;+path[path_len].sys&#32;=&#32;subsys_priv-&gt;data-&gt;mmsys_id;
+&gt;&#32;+path[path_len].comp_id&#32;=&#32;subsys_path[i];
+&gt;&#32;+path_len++;
+&gt;&#32;+}
+&gt;&#32;+}
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+if&#32;(!path_len)
+&gt;&#32;+return&#32;0;
+&gt;&#32;+
+&gt;&#32;+if&#32;(num_conn_routes)&#32;{
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;num_conn_routes;&#32;i++)
+&gt;&#32;+if&#32;(conn_routes-&gt;crtc_id&#32;==&#32;crtc_i)
+&gt;&#32;+break;
+&gt;&#32;+if&#32;(i&#32;==&#32;num_conn_routes)&#32;{
+&gt;&#32;+num_conn_routes&#32;=&#32;0;
+&gt;&#32;+conn_routes&#32;=&#32;NULL;
+&gt;&#32;+}
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;path_len;&#32;i++)&#32;{
+&gt;&#32;-enum&#32;mtk_ddp_comp_id&#32;comp_id&#32;=&#32;path[i];
+&gt;&#32;+enum&#32;mtk_ddp_comp_id&#32;comp_id&#32;=&#32;path[i].comp_id;
+&gt;&#32;&#32;struct&#32;device_node&#32;*node;
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp;
+&gt;&#32;&#32;
+&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[path[i].sys];
+&gt;&#32;&#32;node&#32;=&#32;priv-&gt;comp_node[comp_id];
+&gt;&#32;&#32;comp&#32;=&#32;&amp;priv-&gt;ddp_comp[comp_id];
+&gt;&#32;&#32;
+&gt;&#32;&#32;/*&#32;Not&#32;all&#32;drm&#32;components&#32;have&#32;a&#32;DTS&#32;device&#32;node,&#32;such&#32;as&#32;ovl_adaptor,
+&gt;&#32;&#32;&#32;*&#32;which&#32;is&#32;the&#32;drm&#32;bring&#32;up&#32;sub&#32;driver
+&gt;&#32;&#32;&#32;*/
+&gt;&#32;-if&#32;(!node&#32;&amp;&amp;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR)&#32;{
+&gt;&#32;+if&#32;(!node&#32;&amp;&amp;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;&amp;&amp;
+&gt;&#32;+&#32;&#32;&#32;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;&amp;&amp;
+&gt;&#32;+&#32;&#32;&#32;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;&amp;&amp;
+&gt;&#32;+&#32;&#32;&#32;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;&amp;&amp;
+&gt;&#32;+&#32;&#32;&#32;&#32;mtk_ddp_comp_get_type(comp_id)&#32;!=&#32;MTK_DISP_VIRTUAL)&#32;{
+&gt;&#32;&#32;dev_info(dev,
+&gt;&#32;&#32;&quot;Not&#32;creating&#32;crtc&#32;%d&#32;because&#32;component&#32;%d&#32;is&#32;disabled&#32;or&#32;missing&#92;n&quot;,
+&gt;&#32;&#32;crtc_i,&#32;comp_id);
+&gt;&#32;&#32;return&#32;0;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;-if&#32;(!comp-&gt;dev)&#32;{
+&gt;&#32;+if&#32;(!comp-&gt;dev&#32;&amp;&amp;&#32;mtk_ddp_comp_get_type(comp_id)&#32;!=&#32;MTK_DISP_VIRTUAL)&#32;{
+&gt;&#32;&#32;dev_err(dev,&#32;&quot;Component&#32;%pOF&#32;not&#32;initialized&#92;n&quot;,&#32;node);
+&gt;&#32;&#32;return&#32;-ENODEV;
+&gt;&#32;&#32;}
+&gt;&#32;@@&#32;-989,7&#32;+1181,9&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;if&#32;(!mtk_crtc)
+&gt;&#32;&#32;return&#32;-ENOMEM;
+&gt;&#32;&#32;
+&gt;&#32;-mtk_crtc-&gt;mmsys_dev&#32;=&#32;priv-&gt;mmsys_dev;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(priv-&gt;all_drm_private[i])
+&gt;&#32;+mtk_crtc-&gt;mmsys_dev[i]&#32;=&#32;priv-&gt;all_drm_private[i]-&gt;mmsys_dev;
+&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;=&#32;path_len;
+&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp&#32;=&#32;devm_kcalloc(dev,
+&gt;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;+&#32;(conn_routes&#32;&#63;&#32;1&#32;:&#32;0),
+&gt;&#32;@@&#32;-998,19&#32;+1192,36&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;if&#32;(!mtk_crtc-&gt;ddp_comp)
+&gt;&#32;&#32;return&#32;-ENOMEM;
+&gt;&#32;&#32;
+&gt;&#32;-mtk_crtc-&gt;mutex&#32;=&#32;mtk_mutex_get(priv-&gt;mutex_dev);
+&gt;&#32;-if&#32;(IS_ERR(mtk_crtc-&gt;mutex))&#32;{
+&gt;&#32;-ret&#32;=&#32;PTR_ERR(mtk_crtc-&gt;mutex);
+&gt;&#32;-dev_err(dev,&#32;&quot;Failed&#32;to&#32;get&#32;mutex:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;-return&#32;ret;
+&gt;&#32;+mtk_crtc-&gt;ddp_comp_sys&#32;=&#32;devm_kmalloc_array(dev,&#32;mtk_crtc-&gt;ddp_comp_nr&#32;+
+&gt;&#32;+&#32;&#32;&#32;&#32;(conn_routes&#32;&#63;&#32;1&#32;:&#32;0),
+&gt;&#32;+&#32;&#32;&#32;&#32;sizeof(mtk_crtc-&gt;ddp_comp_sys),&#32;GFP_KERNEL);
+&gt;&#32;+if&#32;(!mtk_crtc-&gt;ddp_comp_sys)
+&gt;&#32;+return&#32;-ENOMEM;
+&gt;&#32;+
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{
+&gt;&#32;+if&#32;(!priv-&gt;all_drm_private[i])
+&gt;&#32;+continue;
+&gt;&#32;+
+&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[i];
+&gt;&#32;+mtk_crtc-&gt;mutex[i]&#32;=&#32;mtk_mutex_get(priv-&gt;mutex_dev);
+&gt;&#32;+if&#32;(IS_ERR(mtk_crtc-&gt;mutex[i]))&#32;{
+&gt;&#32;+ret&#32;=&#32;PTR_ERR(mtk_crtc-&gt;mutex[i]);
+&gt;&#32;+dev_err(dev,&#32;&quot;Failed&#32;to&#32;get&#32;mutex:&#32;%d&#92;n&quot;,&#32;ret);
+&gt;&#32;+return&#32;ret;
+&gt;&#32;+}
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{
+&gt;&#32;-unsigned&#32;int&#32;comp_id&#32;=&#32;path[i];
+&gt;&#32;+unsigned&#32;int&#32;comp_id&#32;=&#32;path[i].comp_id;
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp;
+&gt;&#32;&#32;
+&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[path[i].sys];
+&gt;&#32;&#32;comp&#32;=&#32;&amp;priv-&gt;ddp_comp[comp_id];
+&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(comp_id)&#32;==&#32;MTK_DISP_VIRTUAL)
+&gt;&#32;+comp-&gt;id&#32;=&#32;comp_id;
+&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]&#32;=&#32;comp;
+&gt;&#32;+mtk_crtc-&gt;ddp_comp_sys[i]&#32;=&#32;path[i].sys;
+&gt;&#32;+mtk_crtc-&gt;exist[path[i].sys]&#32;=&#32;true;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(comp-&gt;funcs)&#32;{
+&gt;&#32;&#32;if&#32;(comp-&gt;funcs-&gt;gamma_set&#32;&amp;&amp;&#32;comp-&gt;funcs-&gt;gamma_get_lut_size)&#32;{
+&gt;&#32;@@&#32;-1047,8&#32;+1258,10&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;&#32;*&#32;In&#32;the&#32;case&#32;of&#32;ovl_adaptor&#32;sub&#32;driver,&#32;it&#32;needs&#32;to&#32;use&#32;the
+&gt;&#32;&#32;&#32;*&#32;dma_dev_get&#32;function&#32;to&#32;get&#32;representative&#32;dma&#32;dev.
+&gt;&#32;&#32;&#32;*/
+&gt;&#32;-mtk_crtc-&gt;dma_dev&#32;=&#32;mtk_ddp_comp_dma_dev_get(&amp;priv-&gt;ddp_comp[path[0]]);
+&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[path[0].sys];
+&gt;&#32;+mtk_crtc-&gt;dma_dev&#32;=&#32;mtk_ddp_comp_dma_dev_get(&amp;priv-&gt;ddp_comp[path[0].comp_id]);
+&gt;&#32;&#32;
+&gt;&#32;+mtk_crtc-&gt;vdisp_ao_dev&#32;=&#32;priv-&gt;vdisp_ao_dev;
+&gt;&#32;&#32;ret&#32;=&#32;mtk_crtc_init(drm_dev,&#32;mtk_crtc,&#32;crtc_i);
+&gt;&#32;&#32;if&#32;(ret&#32;&lt;&#32;0)
+&gt;&#32;&#32;return&#32;ret;
+&gt;&#32;@@&#32;-1061,7&#32;+1274,7&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;
+&gt;&#32;&#32;#if&#32;IS_REACHABLE(CONFIG_MTK_CMDQ)
+&gt;&#32;&#32;i&#32;=&#32;priv-&gt;mbox_index++;
+&gt;&#32;-mtk_crtc-&gt;cmdq_client.client.dev&#32;=&#32;mtk_crtc-&gt;mmsys_dev;
+&gt;&#32;+mtk_crtc-&gt;cmdq_client.client.dev&#32;=&#32;mtk_crtc-&gt;mmsys_dev[priv-&gt;data-&gt;mmsys_id];
+&gt;&#32;&#32;mtk_crtc-&gt;cmdq_client.client.tx_block&#32;=&#32;false;
+&gt;&#32;&#32;mtk_crtc-&gt;cmdq_client.client.knows_txdone&#32;=&#32;true;
+&gt;&#32;&#32;mtk_crtc-&gt;cmdq_client.client.rx_callback&#32;=&#32;ddp_cmdq_cb;
+&gt;&#32;@@&#32;-1101,6&#32;+1314,7&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;#endif
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(conn_routes)&#32;{
+&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[conn_mmsys];
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;num_conn_routes;&#32;i++)&#32;{
+&gt;&#32;&#32;unsigned&#32;int&#32;comp_id&#32;=&#32;conn_routes[i].route_ddp;
+&gt;&#32;&#32;struct&#32;device_node&#32;*node&#32;=&#32;priv-&gt;comp_node[comp_id];
+&gt;&#32;@@&#32;-1117,6&#32;+1331,7&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;mtk_ddp_comp_encoder_index_set(&amp;priv-&gt;ddp_comp[comp_id]);
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;+mtk_crtc-&gt;conn_routes_sys&#32;=&#32;conn_mmsys;
+&gt;&#32;&#32;mtk_crtc-&gt;num_conn_routes&#32;=&#32;num_conn_routes;
+&gt;&#32;&#32;mtk_crtc-&gt;conn_routes&#32;=&#32;conn_routes;
+&gt;&#32;&#32;
+&gt;&#32;@@&#32;-1124,5&#32;+1339,10&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp_nr++;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])
+&gt;&#32;+device_link_add(mtk_crtc-&gt;base.dev-&gt;dev,
+&gt;&#32;+priv-&gt;all_drm_private[i]-&gt;mutex_dev,&#32;0);
+&gt;&#32;+
+&gt;&#32;&#32;return&#32;0;
+&gt;&#32;&#32;}
+&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.h&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.h
+&gt;&#32;index&#32;388e900b6f4d..255f2823d17a&#32;100644
+&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.h
+&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.h
+&gt;&#32;@@&#32;-15,10&#32;+15,8&#32;@@
+&gt;&#32;&#32;#define&#32;MTK_MIN_BPC3
+&gt;&#32;&#32;
+&gt;&#32;&#32;void&#32;mtk_crtc_commit(struct&#32;drm_crtc&#32;*crtc);
+&gt;&#32;-int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;path_len,&#32;int&#32;priv_data_index,
+&gt;&#32;-&#32;&#32;&#32;&#32;const&#32;struct&#32;mtk_drm_route&#32;*conn_routes,
+&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;num_conn_routes);
+&gt;&#32;+int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,
+&gt;&#32;+&#32;&#32;&#32;&#32;enum&#32;mtk_crtc_path&#32;path_sel);
+&gt;&#32;&#32;int&#32;mtk_crtc_plane_check(struct&#32;drm_crtc&#32;*crtc,&#32;struct&#32;drm_plane&#32;*plane,
+&gt;&#32;&#32;&#32;struct&#32;mtk_plane_state&#32;*state);
+&gt;&#32;&#32;void&#32;mtk_crtc_async_update(struct&#32;drm_crtc&#32;*crtc,&#32;struct&#32;drm_plane&#32;*plane,
+&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+&gt;&#32;index&#32;492b8d965309..f841184d1e06&#32;100644
+&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+&gt;&#32;@@&#32;-464,6&#32;+464,7&#32;@@&#32;static&#32;const&#32;char&#32;*&#32;const&#32;mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX]&#32;=&#32;{
+&gt;&#32;&#32;[MTK_DISP_PWM]&#32;=&#32;&quot;pwm&quot;,
+&gt;&#32;&#32;[MTK_DISP_RDMA]&#32;=&#32;&quot;rdma&quot;,
+&gt;&#32;&#32;[MTK_DISP_UFOE]&#32;=&#32;&quot;ufoe&quot;,
+&gt;&#32;+[MTK_DISP_VIRTUAL]&#32;=&#32;&quot;virtual&quot;,
+&gt;&#32;&#32;[MTK_DISP_WDMA]&#32;=&#32;&quot;wdma&quot;,
+&gt;&#32;&#32;[MTK_DP_INTF]&#32;=&#32;&quot;dp-intf&quot;,
+&gt;&#32;&#32;[MTK_DPI]&#32;=&#32;&quot;dpi&quot;,
+&gt;&#32;@@&#32;-487,6&#32;+488,15&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_ddp_comp_match&#32;mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]
+&gt;&#32;&#32;[DDP_COMPONENT_COLOR0]=&#32;{&#32;MTK_DISP_COLOR,0,&#32;&amp;ddp_color&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_COLOR1]=&#32;{&#32;MTK_DISP_COLOR,1,&#32;&amp;ddp_color&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DITHER0]=&#32;{&#32;MTK_DISP_DITHER,0,&#32;&amp;ddp_dither&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC0]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC1]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC8]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC21]&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC22]&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC23]&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLO_ASYNC1]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLO_ASYNC2]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_DLO_ASYNC3]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DP_INTF0]=&#32;{&#32;MTK_DP_INTF,0,&#32;&amp;ddp_dpi&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DP_INTF1]=&#32;{&#32;MTK_DP_INTF,1,&#32;&amp;ddp_dpi&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DPI0]=&#32;{&#32;MTK_DPI,0,&#32;&amp;ddp_dpi&#32;},
+&gt;&#32;@@&#32;-494,6&#32;+504,9&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_ddp_comp_match&#32;mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]
+&gt;&#32;&#32;[DDP_COMPONENT_DRM_OVL_ADAPTOR]=&#32;{&#32;MTK_DISP_OVL_ADAPTOR,0,&#32;&amp;ddp_ovl_adaptor&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;0,&#32;&amp;ddp_ovlsys_adaptor},
+&gt;&#32;&#32;[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;1,&#32;&amp;ddp_ovlsys_adaptor},
+&gt;&#32;+[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;0,&#32;&amp;ddp_ovlsys_adaptor},
+&gt;&#32;+[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;1,&#32;&amp;ddp_ovlsys_adaptor},
+&gt;&#32;+[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;2,&#32;&amp;ddp_ovlsys_adaptor},
+&gt;&#32;&#32;[DDP_COMPONENT_DSC0]=&#32;{&#32;MTK_DISP_DSC,0,&#32;&amp;ddp_dsc&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DSC1]=&#32;{&#32;MTK_DISP_DSC,1,&#32;&amp;ddp_dsc&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_DSI0]=&#32;{&#32;MTK_DSI,0,&#32;&amp;ddp_dsi&#32;},
+&gt;&#32;@@&#32;-510,7&#32;+523,10&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_ddp_comp_match&#32;mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]
+&gt;&#32;&#32;[DDP_COMPONENT_OD0]=&#32;{&#32;MTK_DISP_OD,0,&#32;&amp;ddp_od&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_OD1]=&#32;{&#32;MTK_DISP_OD,1,&#32;&amp;ddp_od&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_OVL0]=&#32;{&#32;MTK_DISP_OVL,0,&#32;&amp;ddp_ovl&#32;},
+&gt;&#32;+[DDP_COMPONENT_OVL0_DLO_ASYNC5]&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;+[DDP_COMPONENT_OVL0_DLO_ASYNC6]&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_OVL1]=&#32;{&#32;MTK_DISP_OVL,1,&#32;&amp;ddp_ovl&#32;},
+&gt;&#32;+[DDP_COMPONENT_OVL1_DLO_ASYNC5]&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_OVL_2L0]=&#32;{&#32;MTK_DISP_OVL_2L,0,&#32;&amp;ddp_ovl&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_OVL_2L1]=&#32;{&#32;MTK_DISP_OVL_2L,1,&#32;&amp;ddp_ovl&#32;},
+&gt;&#32;&#32;[DDP_COMPONENT_OVL_2L2]=&#32;{&#32;MTK_DISP_OVL_2L,2,&#32;&amp;ddp_ovl&#32;},
+&gt;&#32;@@&#32;-567,12&#32;+583,19&#32;@@&#32;static&#32;bool&#32;mtk_ddp_path_available(const&#32;unsigned&#32;int&#32;*path,
+&gt;&#32;&#32;{
+&gt;&#32;&#32;unsigned&#32;int&#32;i;
+&gt;&#32;&#32;
+&gt;&#32;+if&#32;(!path_len)
+&gt;&#32;+return&#32;true;
+&gt;&#32;+
+&gt;&#32;&#32;if&#32;(!path&#32;||&#32;!path_len)
+&gt;&#32;&#32;return&#32;false;
+&gt;&#32;&#32;
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0U;&#32;i&#32;&lt;&#32;path_len;&#32;i++)&#32;{
+&gt;&#32;&#32;/*&#32;OVL_ADAPTOR&#32;doesn&#39;t&#32;have&#32;a&#32;device&#32;node&#32;*/
+&gt;&#32;-if&#32;(path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR)
+&gt;&#32;+if&#32;(path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;||
+&gt;&#32;+&#32;&#32;&#32;&#32;path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;||
+&gt;&#32;+path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;||
+&gt;&#32;+path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;||
+&gt;&#32;+mtk_ddp_comp_get_type(path[i])&#32;==&#32;MTK_DISP_VIRTUAL)
+&gt;&#32;&#32;continue;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(!comp_node[path[i]])
+&gt;&#32;@@&#32;-597,44&#32;+620,81&#32;@@&#32;int&#32;mtk_ddp_comp_get_id(struct&#32;device_node&#32;*node,
+&gt;&#32;&#32;return&#32;-EINVAL;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;+enum&#32;mtk_ddp_comp_type&#32;mtk_ddp_comp_get_type(unsigned&#32;int&#32;comp_id)
+&gt;&#32;+{
+&gt;&#32;+return&#32;mtk_ddp_matches[comp_id].type;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;&#32;int&#32;mtk_find_possible_crtcs(struct&#32;drm_device&#32;*drm,&#32;struct&#32;device&#32;*dev)
+&gt;&#32;&#32;{
+&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*private&#32;=&#32;drm-&gt;dev_private;
+&gt;&#32;&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;*data;
+&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*priv_n;
+&gt;&#32;-int&#32;i&#32;=&#32;0,&#32;j;
+&gt;&#32;&#32;int&#32;ret;
+&gt;&#32;+int&#32;i&#32;=&#32;0,&#32;j,&#32;count&#32;=&#32;0;
+&gt;&#32;+bool&#32;found&#32;=&#32;false;
+&gt;&#32;&#32;
+&gt;&#32;&#32;for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{
+&gt;&#32;&#32;priv_n&#32;=&#32;private-&gt;all_drm_private[j];
+&gt;&#32;&#32;data&#32;=&#32;priv_n-&gt;data;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(mtk_ddp_path_available(data-&gt;main_path,&#32;data-&gt;main_len,
+&gt;&#32;-&#32;&#32;&#32;priv_n-&gt;comp_node))&#32;{
+&gt;&#32;-if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;main_path,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;data-&gt;main_len,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))
+&gt;&#32;-return&#32;BIT(i);
+&gt;&#32;-i++;
+&gt;&#32;-}
+&gt;&#32;+&#32;&#32;&#32;priv_n-&gt;comp_node))
+&gt;&#32;+count++;
+&gt;&#32;+
+&gt;&#32;+if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;main_path,&#32;data-&gt;main_len,
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))
+&gt;&#32;+found&#32;=&#32;true;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+if&#32;(count&#32;==&#32;private-&gt;data-&gt;mmsys_dev_num)&#32;{
+&gt;&#32;+if&#32;(found)
+&gt;&#32;+return&#32;BIT(i);
+&gt;&#32;+i++;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+count&#32;=&#32;0;
+&gt;&#32;+found&#32;=&#32;false;
+&gt;&#32;+
+&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{
+&gt;&#32;+priv_n&#32;=&#32;private-&gt;all_drm_private[j];
+&gt;&#32;+data&#32;=&#32;priv_n-&gt;data;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(mtk_ddp_path_available(data-&gt;ext_path,&#32;data-&gt;ext_len,
+&gt;&#32;-&#32;&#32;&#32;priv_n-&gt;comp_node))&#32;{
+&gt;&#32;-if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;ext_path,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;data-&gt;ext_len,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))
+&gt;&#32;-return&#32;BIT(i);
+&gt;&#32;-i++;
+&gt;&#32;-}
+&gt;&#32;+&#32;&#32;&#32;priv_n-&gt;comp_node))
+&gt;&#32;+count++;
+&gt;&#32;+
+&gt;&#32;+if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;ext_path,&#32;data-&gt;ext_len,
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))
+&gt;&#32;+found&#32;=&#32;true;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+if&#32;(count&#32;==&#32;private-&gt;data-&gt;mmsys_dev_num)&#32;{
+&gt;&#32;+if&#32;(found)
+&gt;&#32;+return&#32;BIT(i);
+&gt;&#32;+i++;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+count&#32;=&#32;0;
+&gt;&#32;+found&#32;=&#32;false;
+&gt;&#32;+
+&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{
+&gt;&#32;+priv_n&#32;=&#32;private-&gt;all_drm_private[j];
+&gt;&#32;+data&#32;=&#32;priv_n-&gt;data;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(mtk_ddp_path_available(data-&gt;third_path,&#32;data-&gt;third_len,
+&gt;&#32;-&#32;&#32;&#32;priv_n-&gt;comp_node))&#32;{
+&gt;&#32;-if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;third_path,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;data-&gt;third_len,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))
+&gt;&#32;-return&#32;BIT(i);
+&gt;&#32;-i++;
+&gt;&#32;-}
+&gt;&#32;+priv_n-&gt;comp_node))
+&gt;&#32;+count++;
+&gt;&#32;+
+&gt;&#32;+if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;third_path,&#32;data-&gt;third_len,
+&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))
+&gt;&#32;+found&#32;=&#32;true;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;+if&#32;(count&#32;==&#32;private-&gt;data-&gt;mmsys_dev_num)&#32;{
+&gt;&#32;+if&#32;(found)
+&gt;&#32;+return&#32;BIT(i);
+&gt;&#32;+i++;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;ret&#32;=&#32;mtk_ddp_comp_find_in_route(dev,
+&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+&gt;&#32;index&#32;ef64ce7a071f..badb42bd4f7c&#32;100644
+&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+&gt;&#32;@@&#32;-40,6&#32;+40,7&#32;@@&#32;enum&#32;mtk_ddp_comp_type&#32;{
+&gt;&#32;&#32;MTK_DISP_PWM,
+&gt;&#32;&#32;MTK_DISP_RDMA,
+&gt;&#32;&#32;MTK_DISP_UFOE,
+&gt;&#32;+MTK_DISP_VIRTUAL,
+&gt;&#32;&#32;MTK_DISP_WDMA,
+&gt;&#32;&#32;MTK_DPI,
+&gt;&#32;&#32;MTK_DP_INTF,
+&gt;&#32;@@&#32;-47,6&#32;+48,7&#32;@@&#32;enum&#32;mtk_ddp_comp_type&#32;{
+&gt;&#32;&#32;MTK_OVL_BLENDER,
+&gt;&#32;&#32;MTK_OVL_EXDMA,
+&gt;&#32;&#32;MTK_OVL_OUTPROC,
+&gt;&#32;+MTK_VDISP_AO,
+&gt;&#32;&#32;MTK_DDP_COMP_TYPE_MAX,
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.c&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+&gt;&#32;index&#32;7526bc38bcc7..0665a6feb546&#32;100644
+&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+&gt;&#32;@@&#32;-193,6&#32;+193,10&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_drm_route&#32;mt8188_mtk_ddp_main_routes[]&#32;=&#32;{
+&gt;&#32;&#32;{0,&#32;DDP_COMPONENT_DSI0},
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;+static&#32;const&#32;struct&#32;mtk_drm_route&#32;mt8196_mtk_ddp_routes[]&#32;=&#32;{
+&gt;&#32;+{2,&#32;DDP_COMPONENT_DSI0},
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;&#32;static&#32;const&#32;unsigned&#32;int&#32;mt8192_mtk_ddp_main[]&#32;=&#32;{
+&gt;&#32;&#32;DDP_COMPONENT_OVL0,
+&gt;&#32;&#32;DDP_COMPONENT_OVL_2L0,
+&gt;&#32;@@&#32;-231,6&#32;+235,50&#32;@@&#32;static&#32;const&#32;unsigned&#32;int&#32;mt8195_mtk_ddp_ext[]&#32;=&#32;{
+&gt;&#32;&#32;DDP_COMPONENT_DP_INTF1,
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_ovl0_main[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0,
+&gt;&#32;+DDP_COMPONENT_OVL0_DLO_ASYNC5,
+&gt;&#32;+};
+
+Separate&#32;MT8196&#32;part&#32;to&#32;another&#32;patch&#32;which&#32;add&#32;support&#32;MT8196.
+Let&#32;this&#32;patch&#32;not&#32;related&#32;to&#32;specific&#32;SoC.
+
+Regards,
+CK
+
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp0_main[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DLI_ASYNC0,
+&gt;&#32;+DDP_COMPONENT_DLO_ASYNC1,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp1_main[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DLI_ASYNC21,
+&gt;&#32;+DDP_COMPONENT_DVO0,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_ovl0_ext[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1,
+&gt;&#32;+DDP_COMPONENT_OVL0_DLO_ASYNC6,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp0_ext[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DLI_ASYNC1,
+&gt;&#32;+DDP_COMPONENT_DLO_ASYNC2,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp1_ext[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DLI_ASYNC22,
+&gt;&#32;+DDP_COMPONENT_DP_INTF0,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_ovl1_third[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2,
+&gt;&#32;+DDP_COMPONENT_OVL1_DLO_ASYNC5,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp0_third[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DLI_ASYNC8,
+&gt;&#32;+DDP_COMPONENT_DLO_ASYNC3,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp1_third[]&#32;=&#32;{
+&gt;&#32;+DDP_COMPONENT_DLI_ASYNC23,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;&#32;static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt2701_mmsys_driver_data&#32;=&#32;{
+&gt;&#32;&#32;.main_path&#32;=&#32;mt2701_mtk_ddp_main,
+&gt;&#32;&#32;.main_len&#32;=&#32;ARRAY_SIZE(mt2701_mtk_ddp_main),
+&gt;&#32;@@&#32;-327,6&#32;+375,67&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8195_vdosys1_driver_data&#32;=&#32;{
+&gt;&#32;&#32;.min_height&#32;=&#32;1,
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_dispsys0_driver_data&#32;=&#32;{
+&gt;&#32;+.main_path&#32;=&#32;mt8196_mtk_ddp_disp0_main,
+&gt;&#32;+.main_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp0_main),
+&gt;&#32;+.main_order&#32;=&#32;1,
+&gt;&#32;+.ext_path&#32;=&#32;mt8196_mtk_ddp_disp0_ext,
+&gt;&#32;+.ext_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp0_ext),
+&gt;&#32;+.ext_order&#32;=&#32;1,
+&gt;&#32;+.third_path&#32;=&#32;mt8196_mtk_ddp_disp0_third,
+&gt;&#32;+.third_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp0_third),
+&gt;&#32;+.third_order&#32;=&#32;1,
+&gt;&#32;+.mmsys_id&#32;=&#32;DISPSYS0,
+&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,
+&gt;&#32;+.max_width&#32;=&#32;8191,
+&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/
+&gt;&#32;+.min_height&#32;=&#32;1,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_dispsys1_driver_data&#32;=&#32;{
+&gt;&#32;+.main_path&#32;=&#32;mt8196_mtk_ddp_disp1_main,
+&gt;&#32;+.main_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp1_main),
+&gt;&#32;+.main_order&#32;=&#32;2,
+&gt;&#32;+.ext_path&#32;=&#32;mt8196_mtk_ddp_disp1_ext,
+&gt;&#32;+.ext_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp1_ext),
+&gt;&#32;+.ext_order&#32;=&#32;2,
+&gt;&#32;+.third_path&#32;=&#32;mt8196_mtk_ddp_disp1_third,
+&gt;&#32;+.third_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp1_third),
+&gt;&#32;+.conn_routes&#32;=&#32;mt8196_mtk_ddp_routes,
+&gt;&#32;+.num_conn_routes&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_routes),
+&gt;&#32;+.third_order&#32;=&#32;2,
+&gt;&#32;+.mmsys_id&#32;=&#32;DISPSYS1,
+&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,
+&gt;&#32;+.max_width&#32;=&#32;8191,
+&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/
+&gt;&#32;+.min_height&#32;=&#32;1,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_ovlsys0_driver_data&#32;=&#32;{
+&gt;&#32;+.main_path&#32;=&#32;mt8196_mtk_ddp_ovl0_main,
+&gt;&#32;+.main_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_ovl0_main),
+&gt;&#32;+.main_order&#32;=&#32;0,
+&gt;&#32;+.ext_path&#32;=&#32;mt8196_mtk_ddp_ovl0_ext,
+&gt;&#32;+.ext_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_ovl0_ext),
+&gt;&#32;+.ext_order&#32;=&#32;0,
+&gt;&#32;+.mmsys_id&#32;=&#32;OVLSYS0,
+&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,
+&gt;&#32;+.max_width&#32;=&#32;8191,
+&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/
+&gt;&#32;+.min_height&#32;=&#32;1,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_ovlsys1_driver_data&#32;=&#32;{
+&gt;&#32;+.third_path&#32;=&#32;mt8196_mtk_ddp_ovl1_third,
+&gt;&#32;+.third_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_ovl1_third),
+&gt;&#32;+.third_order&#32;=&#32;0,
+&gt;&#32;+.mmsys_id&#32;=&#32;OVLSYS1,
+&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,
+&gt;&#32;+.max_width&#32;=&#32;8191,
+&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/
+&gt;&#32;+.min_height&#32;=&#32;1,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_drm_of_ids[]&#32;=&#32;{
+&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt2701-mmsys&quot;,
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;&amp;mt2701_mmsys_driver_data},
+&gt;&#32;@@&#32;-354,6&#32;+463,14&#32;@@&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_drm_of_ids[]&#32;=&#32;{
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;&amp;mt8195_vdosys0_driver_data},
+&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8195-vdosys1&quot;,
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;&amp;mt8195_vdosys1_driver_data},
+&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-dispsys0&quot;,
+&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_dispsys0_driver_data},
+&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-dispsys1&quot;,
+&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_dispsys1_driver_data},
+&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-ovlsys0&quot;,
+&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_ovlsys0_driver_data},
+&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-ovlsys1&quot;,
+&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_ovlsys1_driver_data},
+&gt;&#32;&#32;{&#32;}
+&gt;&#32;&#32;};
+&gt;&#32;&#32;MODULE_DEVICE_TABLE(of,&#32;mtk_drm_of_ids);
+&gt;&#32;@@&#32;-368,7&#32;+485,7&#32;@@&#32;static&#32;int&#32;mtk_drm_match(struct&#32;device&#32;*dev,&#32;const&#32;void&#32;*data)
+&gt;&#32;&#32;static&#32;bool&#32;mtk_drm_get_all_drm_priv(struct&#32;device&#32;*dev)
+&gt;&#32;&#32;{
+&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*drm_priv&#32;=&#32;dev_get_drvdata(dev);
+&gt;&#32;-struct&#32;mtk_drm_private&#32;*all_drm_priv[MAX_CRTC];
+&gt;&#32;+struct&#32;mtk_drm_private&#32;*all_drm_priv[MAX_MMSYS]&#32;=&#32;{NULL};
+&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*temp_drm_priv;
+&gt;&#32;&#32;struct&#32;device_node&#32;*phandle&#32;=&#32;dev-&gt;parent-&gt;of_node;
+&gt;&#32;&#32;const&#32;struct&#32;of_device_id&#32;*of_id;
+&gt;&#32;@@&#32;-395,23&#32;+512,18&#32;@@&#32;static&#32;bool&#32;mtk_drm_get_all_drm_priv(struct&#32;device&#32;*dev)
+&gt;&#32;&#32;if&#32;(!temp_drm_priv)
+&gt;&#32;&#32;continue;
+&gt;&#32;&#32;
+&gt;&#32;-if&#32;(temp_drm_priv-&gt;data-&gt;main_len)
+&gt;&#32;-all_drm_priv[CRTC_MAIN]&#32;=&#32;temp_drm_priv;
+&gt;&#32;-else&#32;if&#32;(temp_drm_priv-&gt;data-&gt;ext_len)
+&gt;&#32;-all_drm_priv[CRTC_EXT]&#32;=&#32;temp_drm_priv;
+&gt;&#32;-else&#32;if&#32;(temp_drm_priv-&gt;data-&gt;third_len)
+&gt;&#32;-all_drm_priv[CRTC_THIRD]&#32;=&#32;temp_drm_priv;
+&gt;&#32;+all_drm_priv[temp_drm_priv-&gt;data-&gt;mmsys_id]&#32;=&#32;temp_drm_priv;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(temp_drm_priv-&gt;mtk_drm_bound)
+&gt;&#32;&#32;cnt++;
+&gt;&#32;&#32;
+&gt;&#32;-if&#32;(cnt&#32;==&#32;MAX_CRTC)
+&gt;&#32;+if&#32;(cnt&#32;==&#32;temp_drm_priv-&gt;data-&gt;mmsys_dev_num)
+&gt;&#32;&#32;break;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(drm_priv-&gt;data-&gt;mmsys_dev_num&#32;==&#32;cnt)&#32;{
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;cnt;&#32;i++)
+&gt;&#32;-for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;cnt;&#32;j++)
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;MAX_MMSYS;&#32;j++)
+&gt;&#32;&#32;all_drm_priv[j]-&gt;all_drm_private[i]&#32;=&#32;all_drm_priv[i];
+&gt;&#32;&#32;
+&gt;&#32;&#32;return&#32;true;
+&gt;&#32;@@&#32;-498,7&#32;+610,10&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)
+&gt;&#32;&#32;drm-&gt;mode_config.funcs&#32;=&#32;&amp;mtk_drm_mode_config_funcs;
+&gt;&#32;&#32;drm-&gt;mode_config.helper_private&#32;=&#32;&amp;mtk_drm_mode_config_helpers;
+&gt;&#32;&#32;
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)&#32;{
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{
+&gt;&#32;+if&#32;(!private-&gt;all_drm_private[i])
+&gt;&#32;+continue;
+&gt;&#32;+
+&gt;&#32;&#32;drm-&gt;dev_private&#32;=&#32;private-&gt;all_drm_private[i];
+&gt;&#32;&#32;ret&#32;=&#32;component_bind_all(private-&gt;all_drm_private[i]-&gt;dev,&#32;drm);
+&gt;&#32;&#32;if&#32;(ret)
+&gt;&#32;@@&#32;-521,8&#32;+636,10&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)
+&gt;&#32;&#32;&#32;*&#32;&#32;&#32;&#32;third&#32;path.
+&gt;&#32;&#32;&#32;*/
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_CRTC;&#32;i++)&#32;{
+&gt;&#32;-for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{
+&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;MAX_MMSYS;&#32;j++)&#32;{
+&gt;&#32;&#32;priv_n&#32;=&#32;private-&gt;all_drm_private[j];
+&gt;&#32;+if&#32;(!priv_n)
+&gt;&#32;+continue;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(priv_n-&gt;data-&gt;max_width)
+&gt;&#32;&#32;drm-&gt;mode_config.max_width&#32;=&#32;priv_n-&gt;data-&gt;max_width;
+&gt;&#32;@@&#32;-534,28&#32;+651,23&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)
+&gt;&#32;&#32;drm-&gt;mode_config.min_height&#32;=&#32;priv_n-&gt;data-&gt;min_height;
+&gt;&#32;&#32;
+&gt;&#32;&#32;if&#32;(i&#32;==&#32;CRTC_MAIN&#32;&amp;&amp;&#32;priv_n-&gt;data-&gt;main_len)&#32;{
+&gt;&#32;-ret&#32;=&#32;mtk_crtc_create(drm,&#32;priv_n-&gt;data-&gt;main_path,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;main_len,&#32;j,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;conn_routes,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;num_conn_routes);
+&gt;&#32;+ret&#32;=&#32;mtk_crtc_create(drm,&#32;CRTC_MAIN);
+&gt;&#32;&#32;if&#32;(ret)
+&gt;&#32;&#32;goto&#32;err_component_unbind;
+&gt;&#32;&#32;
+&gt;&#32;-continue;
+&gt;&#32;+break;
+&gt;&#32;&#32;}&#32;else&#32;if&#32;(i&#32;==&#32;CRTC_EXT&#32;&amp;&amp;&#32;priv_n-&gt;data-&gt;ext_len)&#32;{
+&gt;&#32;-ret&#32;=&#32;mtk_crtc_create(drm,&#32;priv_n-&gt;data-&gt;ext_path,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;ext_len,&#32;j,&#32;NULL,&#32;0);
+&gt;&#32;+ret&#32;=&#32;mtk_crtc_create(drm,&#32;CRTC_EXT);
+&gt;&#32;&#32;if&#32;(ret)
+&gt;&#32;&#32;goto&#32;err_component_unbind;
+&gt;&#32;&#32;
+&gt;&#32;-continue;
+&gt;&#32;+break;
+&gt;&#32;&#32;}&#32;else&#32;if&#32;(i&#32;==&#32;CRTC_THIRD&#32;&amp;&amp;&#32;priv_n-&gt;data-&gt;third_len)&#32;{
+&gt;&#32;-ret&#32;=&#32;mtk_crtc_create(drm,&#32;priv_n-&gt;data-&gt;third_path,
+&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;third_len,&#32;j,&#32;NULL,&#32;0);
+&gt;&#32;+ret&#32;=&#32;mtk_crtc_create(drm,&#32;CRTC_THIRD);
+&gt;&#32;&#32;if&#32;(ret)
+&gt;&#32;&#32;goto&#32;err_component_unbind;
+&gt;&#32;&#32;
+&gt;&#32;-continue;
+&gt;&#32;+break;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;}
+&gt;&#32;&#32;}
+&gt;&#32;@@&#32;-574,8&#32;+686,9&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)
+&gt;&#32;&#32;goto&#32;err_component_unbind;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)
+&gt;&#32;-private-&gt;all_drm_private[i]-&gt;dma_dev&#32;=&#32;dma_dev;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])
+&gt;&#32;+private-&gt;all_drm_private[i]-&gt;dma_dev&#32;=&#32;dma_dev;
+&gt;&#32;&#32;
+&gt;&#32;&#32;/*
+&gt;&#32;&#32;&#32;*&#32;Configure&#32;the&#32;DMA&#32;segment&#32;size&#32;to&#32;make&#32;sure&#32;we&#32;get&#32;contiguous&#32;IOVA
+&gt;&#32;@@&#32;-593,11&#32;+706,13&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)
+&gt;&#32;&#32;return&#32;0;
+&gt;&#32;&#32;
+&gt;&#32;&#32;err_component_unbind:
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)
+&gt;&#32;-component_unbind_all(private-&gt;all_drm_private[i]-&gt;dev,&#32;drm);
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])
+&gt;&#32;+component_unbind_all(private-&gt;all_drm_private[i]-&gt;dev,&#32;drm);
+&gt;&#32;&#32;put_mutex_dev:
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)
+&gt;&#32;-put_device(private-&gt;all_drm_private[i]-&gt;mutex_dev);
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])
+&gt;&#32;+put_device(private-&gt;all_drm_private[i]-&gt;mutex_dev);
+&gt;&#32;&#32;
+&gt;&#32;&#32;return&#32;ret;
+&gt;&#32;&#32;}
+&gt;&#32;@@&#32;-661,6&#32;+776,19&#32;@@&#32;static&#32;int&#32;mtk_drm_bind(struct&#32;device&#32;*dev)
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;&#32;private-&gt;mutex_dev&#32;=&#32;&amp;pdev-&gt;dev;
+&gt;&#32;+
+&gt;&#32;+if&#32;(private-&gt;vdisp_ao_node)&#32;{
+&gt;&#32;+pdev&#32;=&#32;of_find_device_by_node(private-&gt;vdisp_ao_node);
+&gt;&#32;+if&#32;(!pdev)&#32;{
+&gt;&#32;+dev_err(dev,&#32;&quot;Waiting&#32;for&#32;vdisp_ao&#32;device&#32;%pOF&#92;n&quot;,
+&gt;&#32;+private-&gt;vdisp_ao_node);
+&gt;&#32;+of_node_put(private-&gt;mutex_node);
+&gt;&#32;+of_node_put(private-&gt;vdisp_ao_node);
+&gt;&#32;+return&#32;-EPROBE_DEFER;
+&gt;&#32;+}
+&gt;&#32;+private-&gt;vdisp_ao_dev&#32;=&#32;&amp;pdev-&gt;dev;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;&#32;private-&gt;mtk_drm_bound&#32;=&#32;true;
+&gt;&#32;&#32;private-&gt;dev&#32;=&#32;dev;
+&gt;&#32;&#32;
+&gt;&#32;@@&#32;-673,8&#32;+801,9&#32;@@&#32;static&#32;int&#32;mtk_drm_bind(struct&#32;device&#32;*dev)
+&gt;&#32;&#32;
+&gt;&#32;&#32;private-&gt;drm_master&#32;=&#32;true;
+&gt;&#32;&#32;drm-&gt;dev_private&#32;=&#32;private;
+&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)
+&gt;&#32;-private-&gt;all_drm_private[i]-&gt;drm&#32;=&#32;drm;
+&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)
+&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])
+&gt;&#32;+private-&gt;all_drm_private[i]-&gt;drm&#32;=&#32;drm;
+&gt;&#32;&#32;
+&gt;&#32;&#32;ret&#32;=&#32;mtk_drm_kms_init(drm);
+&gt;&#32;&#32;if&#32;(ret&#32;&lt;&#32;0)
+&gt;&#32;@@&#32;-771,6&#32;+900,8&#32;@@&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_ddp_comp_dt_ids[]&#32;=&#32;{
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_MUTEX&#32;},
+&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8195-disp-mutex&quot;,
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_MUTEX&#32;},
+&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-disp-mutex&quot;,
+&gt;&#32;+&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_MUTEX&#32;},
+&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8173-disp-od&quot;,
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_OD&#32;},
+&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt2701-disp-ovl&quot;,
+&gt;&#32;@@&#32;-837,6&#32;+968,8&#32;@@&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_ddp_comp_dt_ids[]&#32;=&#32;{
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DSI&#32;},
+&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8188-dsi&quot;,
+&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DSI&#32;},
+&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-vdisp-ao&quot;,
+&gt;&#32;+&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_VDISP_AO&#32;},
+&gt;&#32;&#32;{&#32;}
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;@@&#32;-1111,7&#32;+1244,7&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)
+&gt;&#32;&#32;private-&gt;data&#32;=&#32;mtk_drm_data;
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;-private-&gt;all_drm_private&#32;=&#32;devm_kmalloc_array(dev,&#32;private-&gt;data-&gt;mmsys_dev_num,
+&gt;&#32;+private-&gt;all_drm_private&#32;=&#32;devm_kmalloc_array(dev,&#32;MAX_MMSYS,
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;sizeof(*private-&gt;all_drm_private),
+&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;GFP_KERNEL);
+&gt;&#32;&#32;if&#32;(!private-&gt;all_drm_private)
+&gt;&#32;@@&#32;-1163,6&#32;+1296,22&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)
+&gt;&#32;&#32;component_match_add(dev,&#32;&amp;match,&#32;compare_dev,&#32;&amp;ovl_adaptor-&gt;dev);
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;+if&#32;(mtk_drm_find_mmsys_comp(private,&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2))&#32;{
+&gt;&#32;+struct&#32;mtk_drm_ovlsys_private&#32;ovlsys_priv;
+&gt;&#32;+
+&gt;&#32;+ovlsys_priv.mmsys_dev&#32;=&#32;private-&gt;mmsys_dev;
+&gt;&#32;+ovlsys_priv.use_path&#32;=
+&gt;&#32;+mtk_drm_mmsys_comp_in_path(private,&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2);
+&gt;&#32;+ovl_adaptor&#32;=&#32;platform_device_register_data(dev,&#32;&quot;mediatek-disp-ovlsys-adaptor&quot;,
+&gt;&#32;+&#32;&#32;&#32;&#32;PLATFORM_DEVID_AUTO,
+&gt;&#32;+&#32;&#32;&#32;&#32;(void&#32;*)&amp;ovlsys_priv,
+&gt;&#32;+&#32;&#32;&#32;&#32;sizeof(struct&#32;mtk_drm_ovlsys_private));
+&gt;&#32;+private-&gt;ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2].dev&#32;=&#32;&amp;ovl_adaptor-&gt;dev;
+&gt;&#32;+mtk_ddp_comp_init(NULL,&#32;&amp;private-&gt;ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2],
+&gt;&#32;+&#32;&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2);
+&gt;&#32;+component_match_add(dev,&#32;&amp;match,&#32;compare_dev,&#32;&amp;ovl_adaptor-&gt;dev);
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;&#32;/*&#32;Iterate&#32;over&#32;sibling&#32;DISP&#32;function&#32;blocks&#32;*/
+&gt;&#32;&#32;for_each_child_of_node(phandle-&gt;parent,&#32;node)&#32;{
+&gt;&#32;&#32;enum&#32;mtk_ddp_comp_type&#32;comp_type;
+&gt;&#32;@@&#32;-1189,6&#32;+1338,12&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)
+&gt;&#32;&#32;continue;
+&gt;&#32;&#32;}
+&gt;&#32;&#32;
+&gt;&#32;+if&#32;(comp_type&#32;==&#32;MTK_VDISP_AO)&#32;{
+&gt;&#32;+private-&gt;vdisp_ao_node&#32;=&#32;of_node_get(node);
+&gt;&#32;+dev_dbg(dev,&#32;&quot;get&#32;vdisp_ao&#32;node&quot;);
+&gt;&#32;+continue;
+&gt;&#32;+}
+&gt;&#32;+
+&gt;&#32;&#32;comp_id&#32;=&#32;mtk_ddp_comp_get_id(node,&#32;comp_type);
+&gt;&#32;&#32;if&#32;(comp_id&#32;&lt;&#32;0)&#32;{
+&gt;&#32;&#32;dev_warn(dev,&#32;&quot;Skipping&#32;unknown&#32;component&#32;%pOF&#92;n&quot;,
+&gt;&#32;@@&#32;-1241,6&#32;+1396,9&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)
+&gt;&#32;&#32;
+&gt;&#32;&#32;platform_set_drvdata(pdev,&#32;private);
+&gt;&#32;&#32;
+&gt;&#32;+if&#32;(!match)
+&gt;&#32;+drm_of_component_match_add(dev,&#32;&amp;match,&#32;component_compare_of,&#32;NULL);
+&gt;&#32;+
+&gt;&#32;&#32;ret&#32;=&#32;component_master_add_with_match(dev,&#32;&amp;mtk_drm_ops,&#32;match);
+&gt;&#32;&#32;if&#32;(ret)
+&gt;&#32;&#32;goto&#32;err_pm;
+&gt;&#32;@@&#32;-1264,6&#32;+1422,7&#32;@@&#32;static&#32;void&#32;mtk_drm_remove(struct&#32;platform_device&#32;*pdev)
+&gt;&#32;&#32;component_master_del(&amp;pdev-&gt;dev,&#32;&amp;mtk_drm_ops);
+&gt;&#32;&#32;pm_runtime_disable(&amp;pdev-&gt;dev);
+&gt;&#32;&#32;of_node_put(private-&gt;mutex_node);
+&gt;&#32;+of_node_put(private-&gt;vdisp_ao_node);
+&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;DDP_COMPONENT_DRM_ID_MAX;&#32;i++)
+&gt;&#32;&#32;of_node_put(private-&gt;comp_node[i]);
+&gt;&#32;&#32;}
+&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.h&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+&gt;&#32;index&#32;aa17e743a1d0..36cfbfa30ff2&#32;100644
+&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+&gt;&#32;@@&#32;-13,7&#32;+13,8&#32;@@
+&gt;&#32;&#32;#define&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;(DDP_COMPONENT_ID_MAX&#32;+&#32;1)
+&gt;&#32;&#32;#define&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;(DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;+&#32;1)
+&gt;&#32;&#32;#define&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;+&#32;1)
+&gt;&#32;-#define&#32;DDP_COMPONENT_DRM_ID_MAX&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;+&#32;1)
+&gt;&#32;+#define&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;+&#32;1)
+&gt;&#32;+#define&#32;DDP_COMPONENT_DRM_ID_MAX&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;+&#32;1)
+&gt;&#32;&#32;
+&gt;&#32;&#32;enum&#32;mtk_crtc_path&#32;{
+&gt;&#32;&#32;CRTC_MAIN,
+&gt;&#32;@@&#32;-22,6&#32;+23,14&#32;@@&#32;enum&#32;mtk_crtc_path&#32;{
+&gt;&#32;&#32;MAX_CRTC,
+&gt;&#32;&#32;};
+&gt;&#32;&#32;
+&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;{
+&gt;&#32;+DISPSYS0,
+&gt;&#32;+DISPSYS1,
+&gt;&#32;+OVLSYS0,
+&gt;&#32;+OVLSYS1,
+&gt;&#32;+MAX_MMSYS,
+&gt;&#32;+};
+&gt;&#32;+
+&gt;&#32;&#32;struct&#32;device;
+&gt;&#32;&#32;struct&#32;device_node;
+&gt;&#32;&#32;struct&#32;drm_crtc;
+&gt;&#32;@@&#32;-38,10&#32;+47,13&#32;@@&#32;struct&#32;mtk_drm_route&#32;{
+&gt;&#32;&#32;struct&#32;mtk_mmsys_driver_data&#32;{
+&gt;&#32;&#32;const&#32;unsigned&#32;int&#32;*main_path;
+&gt;&#32;&#32;unsigned&#32;int&#32;main_len;
+&gt;&#32;+unsigned&#32;int&#32;main_order;
+&gt;&#32;&#32;const&#32;unsigned&#32;int&#32;*ext_path;
+&gt;&#32;&#32;unsigned&#32;int&#32;ext_len;
+&gt;&#32;+unsigned&#32;int&#32;ext_order;
+&gt;&#32;&#32;const&#32;unsigned&#32;int&#32;*third_path;
+&gt;&#32;&#32;unsigned&#32;int&#32;third_len;
+&gt;&#32;+unsigned&#32;int&#32;third_order;
+&gt;&#32;&#32;const&#32;struct&#32;mtk_drm_route&#32;*conn_routes;
+&gt;&#32;&#32;unsigned&#32;int&#32;num_conn_routes;
+&gt;&#32;&#32;
+&gt;&#32;@@&#32;-63,6&#32;+75,8&#32;@@&#32;struct&#32;mtk_drm_private&#32;{
+&gt;&#32;&#32;struct&#32;device_node&#32;*mutex_node;
+&gt;&#32;&#32;struct&#32;device&#32;*mutex_dev;
+&gt;&#32;&#32;struct&#32;device&#32;*mmsys_dev;
+&gt;&#32;+struct&#32;device_node&#32;*vdisp_ao_node;
+&gt;&#32;+struct&#32;device&#32;*vdisp_ao_dev;
+&gt;&#32;&#32;struct&#32;device_node&#32;*comp_node[DDP_COMPONENT_DRM_ID_MAX];
+&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;ddp_comp[DDP_COMPONENT_DRM_ID_MAX];
+&gt;&#32;&#32;struct&#32;mtk_mmsys_driver_data&#32;*data;
+
+
+</pre>
+</p></body></html><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice
+ ********************
+The information contained in this e-mail message (including any 
+attachments) may be confidential, proprietary, privileged, or otherwise
+exempt from disclosure under applicable laws. It is intended to be 
+conveyed only to the designated recipient(s). Any use, dissemination, 
+distribution, printing, retaining or copying of this e-mail (including its 
+attachments) by unintended recipient(s) is strictly prohibited and may 
+be unlawful. If you are not an intended recipient of this e-mail, or believe
+ 
+that you have received this e-mail in error, please notify the sender 
+immediately (by replying to this e-mail), delete any and all copies of 
+this e-mail (including any attachments) from your system, and do not
+disclose the content of this e-mail to any other person. Thank you!
+</pre><!--}-->
diff --git a/N1/2.hdr b/N1/2.hdr
new file mode 100644
index 0000000..da1f671
--- /dev/null
+++ b/N1/2.hdr
@@ -0,0 +1,3 @@
+Content-Type: text/html;
+	charset="utf-8"
+Content-Transfer-Encoding: base64
diff --git a/a/content_digest b/N1/content_digest
index 49a5d70..8325194 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -24,7 +24,7 @@
   p.zabel@pengutronix.de <p.zabel@pengutronix.de>
  " Sirius Wang (\347\216\213\347\232\223\346\230\261) <Sirius.Wang@mediatek.com>"
  " linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org>\0"
- "\00:1\0"
+ "\01:1\0"
  "b\0"
  "Hi, Paul:\n"
  "\n"
@@ -1337,5 +1337,1338 @@
  ">  \tstruct device_node *comp_node[DDP_COMPONENT_DRM_ID_MAX];\n"
  ">  \tstruct mtk_ddp_comp ddp_comp[DDP_COMPONENT_DRM_ID_MAX];\n"
  ">  \tstruct mtk_mmsys_driver_data *data;"
+ "\01:2\0"
+ "b\0"
+ "<html><body><p>\r\n"
+ "<pre>\r\n"
+ "Hi,&#32;Paul:\r\n"
+ "\r\n"
+ "On&#32;Fri,&#32;2025-01-10&#32;at&#32;20:34&#32;+0800,&#32;paul-pl.chen&#32;wrote:\r\n"
+ "&gt;&#32;From:&#32;&quot;Nancy.Lin&quot;&#32;&lt;nancy.lin@mediatek.com&gt;\r\n"
+ "&gt;&#32;\r\n"
+ "&gt;&#32;To&#32;support&#32;multiple&#32;mmsys&#32;instances&#32;in&#32;the&#32;one&#32;mediatek-drm&#32;instance,\r\n"
+ "&gt;&#32;providing&#32;improved&#32;flexibility&#32;and&#32;scalability&#32;by&#32;the&#32;following&#32;changes:\r\n"
+ "&gt;&#32;\r\n"
+ "&gt;&#32;1.&#32;Defined&#32;new&#32;DRM&#32;component&#32;IDs&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR*\r\n"
+ "&gt;&#32;&#32;&#32;to&#32;support&#32;different&#32;mmsys&#32;composition.\r\n"
+ "&gt;&#32;2.&#32;Added&#32;new&#32;component&#32;types&#32;MTK_DISP_VIRTUAL&#32;to&#32;support&#32;the\r\n"
+ "&gt;&#32;&#32;&#32;routing&#32;to&#32;virtual&#32;display&#32;components.\r\n"
+ "&gt;&#32;3.&#32;Added&#32;and&#32;adjusted&#32;the&#32;existed&#32;structure&#32;or&#32;interface&#32;to&#32;extend\r\n"
+ "&gt;&#32;&#32;&#32;the&#32;support&#32;of&#32;multiple&#32;mmsys&#32;instances.\r\n"
+ "&gt;&#32;4.&#32;Modified&#32;the&#32;component&#32;matching&#32;and&#32;binding&#32;logic&#32;to&#32;support\r\n"
+ "&gt;&#32;&#32;&#32;multiple&#32;mmsys&#32;instances.\r\n"
+ "\r\n"
+ "I&#32;think&#32;the&#32;title&#32;would&#32;confuse&#32;me.\r\n"
+ "Original&#32;mediatek-drm&#32;driver&#32;already&#32;support&#32;multiple&#32;mmsys.\r\n"
+ "I&#32;try&#32;to&#32;understand&#32;MT8196&#32;display.\r\n"
+ "Is&#32;one&#32;display&#32;pipeline&#32;separated&#32;into&#32;two&#32;mmsys&#63;\r\n"
+ "The&#32;first&#32;is&#32;ovlsys&#32;and&#32;the&#32;second&#32;is&#32;dispsys&#63;\r\n"
+ "If&#32;so,&#32;I&#32;would&#32;like&#32;mediatek-drm&#32;driver&#32;see&#32;only&#32;mmsys&#32;(dispsys),\r\n"
+ "and&#32;let&#32;ovlsys&#32;control&#32;is&#32;hidden&#32;in&#32;ovlsys&#32;sub&#32;driver,&#32;so&#32;mediatek-drm&#32;driver&#32;would&#32;not&#32;change&#32;so&#32;much.\r\n"
+ "\r\n"
+ "&gt;&#32;\r\n"
+ "&gt;&#32;Signed-off-by:&#32;Nancy.Lin&#32;&lt;nancy.lin@mediatek.com&gt;\r\n"
+ "&gt;&#32;Signed-off-by:&#32;Paul-pl.Chen&#32;&lt;paul-pl.chen@mediatek.com&gt;\r\n"
+ "&gt;&#32;---\r\n"
+ "&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_crtc.c&#32;&#32;&#32;&#32;&#32;|&#32;350&#32;+++++++++++++++++++-----\r\n"
+ "&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_crtc.h&#32;&#32;&#32;&#32;&#32;|&#32;&#32;&#32;6&#32;+-\r\n"
+ "&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_ddp_comp.c&#32;|&#32;106&#32;+++++--\r\n"
+ "&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_ddp_comp.h&#32;|&#32;&#32;&#32;2&#32;+\r\n"
+ "&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_drm_drv.c&#32;&#32;|&#32;223&#32;++++++++++++---\r\n"
+ "&gt;&#32;&#32;drivers/gpu/drm/mediatek/mtk_drm_drv.h&#32;&#32;|&#32;&#32;16&#32;+-\r\n"
+ "&gt;&#32;&#32;6&#32;files&#32;changed,&#32;578&#32;insertions(+),&#32;125&#32;deletions(-)\r\n"
+ "&gt;&#32;\r\n"
+ "&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.c&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.c\r\n"
+ "&gt;&#32;index&#32;eb0e1233ad04..eca6941bfaa2&#32;100644\r\n"
+ "&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.c\r\n"
+ "&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.c\r\n"
+ "&gt;&#32;@@&#32;-58,13&#32;+58,17&#32;@@&#32;struct&#32;mtk_crtc&#32;{\r\n"
+ "&gt;&#32;&#32;wait_queue_head_tcb_blocking_queue;\r\n"
+ "&gt;&#32;&#32;#endif\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-struct&#32;device*mmsys_dev;\r\n"
+ "&gt;&#32;+struct&#32;device*mmsys_dev[MAX_MMSYS];\r\n"
+ "&gt;&#32;&#32;struct&#32;device*dma_dev;\r\n"
+ "&gt;&#32;-struct&#32;mtk_mutex*mutex;\r\n"
+ "&gt;&#32;+struct&#32;device*vdisp_ao_dev;\r\n"
+ "&gt;&#32;+struct&#32;mtk_mutex*mutex[MAX_MMSYS];\r\n"
+ "&gt;&#32;&#32;unsigned&#32;intddp_comp_nr;\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp**ddp_comp;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys*ddp_comp_sys;\r\n"
+ "&gt;&#32;+boolexist[MAX_MMSYS];\r\n"
+ "&gt;&#32;&#32;unsigned&#32;intnum_conn_routes;\r\n"
+ "&gt;&#32;&#32;const&#32;struct&#32;mtk_drm_route*conn_routes;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsysconn_routes_sys;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;/*&#32;lock&#32;for&#32;display&#32;hardware&#32;access&#32;*/\r\n"
+ "&gt;&#32;&#32;struct&#32;mutexhw_lock;\r\n"
+ "&gt;&#32;@@&#32;-82,6&#32;+86,11&#32;@@&#32;struct&#32;mtk_crtc_state&#32;{\r\n"
+ "&gt;&#32;&#32;unsigned&#32;intpending_vrefresh;\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+struct&#32;mtk_crtc_comp_info&#32;{\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;sys;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;comp_id;\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;static&#32;inline&#32;struct&#32;mtk_crtc&#32;*to_mtk_crtc(struct&#32;drm_crtc&#32;*c)\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;return&#32;container_of(c,&#32;struct&#32;mtk_crtc,&#32;base);\r\n"
+ "&gt;&#32;@@&#32;-125,7&#32;+134,9&#32;@@&#32;static&#32;void&#32;mtk_crtc_destroy(struct&#32;drm_crtc&#32;*crtc)\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);\r\n"
+ "&gt;&#32;&#32;int&#32;i;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-mtk_mutex_put(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_put(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;&#32;#if&#32;IS_REACHABLE(CONFIG_MTK_CMDQ)\r\n"
+ "&gt;&#32;&#32;if&#32;(mtk_crtc-&gt;cmdq_client.chan)&#32;{\r\n"
+ "&gt;&#32;&#32;cmdq_pkt_destroy(&amp;mtk_crtc-&gt;cmdq_client,&#32;&amp;mtk_crtc-&gt;cmdq_handle);\r\n"
+ "&gt;&#32;@@&#32;-223,7&#32;+234,14&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_clk_enable(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;int&#32;i;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;mtk_ddp_comp_clk_enable(mtk_crtc-&gt;ddp_comp[i]);\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(mtk_crtc-&gt;ddp_comp[i]-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)&#32;{\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+ret&#32;=&#32;mtk_mmsys_ddp_clk_enable(mtk_crtc-&gt;mmsys_dev[mmsys],\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;if&#32;(ret)&#32;{\r\n"
+ "&gt;&#32;&#32;DRM_ERROR(&quot;Failed&#32;to&#32;enable&#32;clock&#32;%d:&#32;%d&#92;n&quot;,&#32;i,&#32;ret);\r\n"
+ "&gt;&#32;&#32;goto&#32;err;\r\n"
+ "&gt;&#32;@@&#32;-232,17&#32;+250,28&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_clk_enable(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;return&#32;0;\r\n"
+ "&gt;&#32;&#32;err:\r\n"
+ "&gt;&#32;-while&#32;(--i&#32;&gt;=&#32;0)\r\n"
+ "&gt;&#32;+while&#32;(--i&#32;&gt;=&#32;0)&#32;{\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_clk_disable(mtk_crtc-&gt;ddp_comp[i]);\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(mtk_crtc-&gt;ddp_comp[i]-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)\r\n"
+ "&gt;&#32;+mtk_mmsys_ddp_clk_disable(mtk_crtc-&gt;mmsys_dev[mtk_crtc-&gt;ddp_comp_sys[i]],\r\n"
+ "&gt;&#32;+&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;return&#32;ret;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;static&#32;void&#32;mtk_crtc_ddp_clk_disable(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;int&#32;i;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_clk_disable(mtk_crtc-&gt;ddp_comp[i]);\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(mtk_crtc-&gt;ddp_comp[i]-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)&#32;{\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+mtk_mmsys_ddp_clk_disable(mtk_crtc-&gt;mmsys_dev[mmsys],\r\n"
+ "&gt;&#32;+&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;static\r\n"
+ "&gt;&#32;@@&#32;-332,7&#32;+361,8&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;struct&#32;drm_connector_list_iter&#32;conn_iter;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;width,&#32;height,&#32;vrefresh,&#32;bpc&#32;=&#32;MTK_MAX_BPC;\r\n"
+ "&gt;&#32;&#32;int&#32;ret;\r\n"
+ "&gt;&#32;-int&#32;i;\r\n"
+ "&gt;&#32;+int&#32;i,&#32;j;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(WARN_ON(!crtc-&gt;state))\r\n"
+ "&gt;&#32;&#32;return&#32;-EINVAL;\r\n"
+ "&gt;&#32;@@&#32;-362,10&#32;+392,18&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;return&#32;ret;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-ret&#32;=&#32;mtk_mutex_prepare(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;-if&#32;(ret&#32;&lt;&#32;0)&#32;{\r\n"
+ "&gt;&#32;-DRM_ERROR(&quot;Failed&#32;to&#32;enable&#32;mutex&#32;clock:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;-goto&#32;err_pm_runtime_put;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+mtk_mmsys_top_clk_enable(mtk_crtc-&gt;mmsys_dev[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(!mtk_crtc-&gt;mutex[i]&#32;||&#32;!mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+ret&#32;=&#32;mtk_mutex_prepare(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)&#32;{\r\n"
+ "&gt;&#32;+DRM_ERROR(&quot;Failed&#32;to&#32;enable&#32;mmsys%d&#32;mutex&#32;clock:&#32;%d&#92;n&quot;,&#32;i,&#32;ret);\r\n"
+ "&gt;&#32;+goto&#32;err_pm_runtime_put;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;mtk_crtc_ddp_clk_enable(mtk_crtc);\r\n"
+ "&gt;&#32;@@&#32;-374,19&#32;+412,36&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;goto&#32;err_mutex_unprepare;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;vdisp_ao_dev)\r\n"
+ "&gt;&#32;+mtk_mmsys_default_config(mtk_crtc-&gt;vdisp_ao_dev);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+mtk_mmsys_default_config(mtk_crtc-&gt;mmsys_dev[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_connect(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mmsys_dev,\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_connect(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mmsys_dev[mmsys],\r\n"
+ "&gt;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id))\r\n"
+ "&gt;&#32;-mtk_mmsys_ddp_connect(mtk_crtc-&gt;mmsys_dev,\r\n"
+ "&gt;&#32;+mtk_mmsys_ddp_connect(mtk_crtc-&gt;mmsys_dev[mmsys],\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id);\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))\r\n"
+ "&gt;&#32;-mtk_mutex_add_comp(mtk_crtc-&gt;mutex,\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))\r\n"
+ "&gt;&#32;+mtk_mutex_add_comp(mtk_crtc-&gt;mutex[mmsys],\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))\r\n"
+ "&gt;&#32;-mtk_mutex_add_comp(mtk_crtc-&gt;mutex,&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;-mtk_mutex_enable(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_add(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))\r\n"
+ "&gt;&#32;+mtk_mutex_add_comp(mtk_crtc-&gt;mutex[mmsys],&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+/*&#32;Need&#32;to&#32;set&#32;sof&#32;source&#32;for&#32;all&#32;mmsys&#32;mutexs&#32;in&#32;this&#32;crtc&#32;*/\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;MAX_MMSYS;&#32;j++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[j]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[j])\r\n"
+ "&gt;&#32;+mtk_mutex_write_comp_sof(mtk_crtc-&gt;mutex[j],&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_enable(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[i];\r\n"
+ "&gt;&#32;@@&#32;-394,7&#32;+449,11&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;if&#32;(i&#32;==&#32;1)\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_bgclr_in_on(comp);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-mtk_ddp_comp_config(comp,&#32;width,&#32;height,&#32;vrefresh,&#32;bpc,&#32;NULL);\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(comp-&gt;id)&#32;==&#32;MTK_DISP_VIRTUAL)\r\n"
+ "&gt;&#32;+mtk_mmsys_ddp_config(mtk_crtc-&gt;mmsys_dev[mtk_crtc-&gt;ddp_comp_sys[i]],\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;comp-&gt;id,&#32;width,&#32;height,&#32;NULL);\r\n"
+ "&gt;&#32;+else\r\n"
+ "&gt;&#32;+mtk_ddp_comp_config(comp,&#32;width,&#32;height,&#32;vrefresh,&#32;bpc,&#32;NULL);\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_start(comp);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;@@&#32;-418,7&#32;+477,10&#32;@@&#32;static&#32;int&#32;mtk_crtc_ddp_hw_init(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;return&#32;0;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;err_mutex_unprepare:\r\n"
+ "&gt;&#32;-mtk_mutex_unprepare(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_unprepare(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;err_pm_runtime_put:\r\n"
+ "&gt;&#32;&#32;pm_runtime_put(crtc-&gt;dev-&gt;dev);\r\n"
+ "&gt;&#32;&#32;return&#32;ret;\r\n"
+ "&gt;&#32;@@&#32;-430,6&#32;+492,7&#32;@@&#32;static&#32;void&#32;mtk_crtc_ddp_hw_fini(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;struct&#32;drm_crtc&#32;*crtc&#32;=&#32;&amp;mtk_crtc-&gt;base;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;long&#32;flags;\r\n"
+ "&gt;&#32;&#32;int&#32;i;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;mmsys;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_stop(mtk_crtc-&gt;ddp_comp[i]);\r\n"
+ "&gt;&#32;@@&#32;-437,27&#32;+500,46&#32;@@&#32;static&#32;void&#32;mtk_crtc_ddp_hw_fini(struct&#32;mtk_crtc&#32;*mtk_crtc)\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_bgclr_in_off(mtk_crtc-&gt;ddp_comp[i]);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))\r\n"
+ "&gt;&#32;-mtk_mutex_remove_comp(mtk_crtc-&gt;mutex,\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))\r\n"
+ "&gt;&#32;+mtk_mutex_remove_comp(mtk_crtc-&gt;mutex[mtk_crtc-&gt;ddp_comp_sys[i]],\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;-mtk_mutex_disable(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_disable(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_disconnect(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mmsys_dev,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id))\r\n"
+ "&gt;&#32;-mtk_mmsys_ddp_disconnect(mtk_crtc-&gt;mmsys_dev,\r\n"
+ "&gt;&#32;-&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id,\r\n"
+ "&gt;&#32;-&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id);\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))\r\n"
+ "&gt;&#32;-mtk_mutex_remove_comp(mtk_crtc-&gt;mutex,\r\n"
+ "&gt;&#32;+struct&#32;mtk_ddp_comp&#32;*comp;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;curr,&#32;next;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[i];\r\n"
+ "&gt;&#32;+curr&#32;=&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id;\r\n"
+ "&gt;&#32;+next&#32;=&#32;mtk_crtc-&gt;ddp_comp[i&#32;+&#32;1]-&gt;id;\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_disconnect(comp,&#32;mtk_crtc-&gt;mmsys_dev[mmsys],&#32;next))\r\n"
+ "&gt;&#32;+mtk_mmsys_ddp_disconnect(mtk_crtc-&gt;mmsys_dev[mmsys],&#32;curr,&#32;next);\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_remove(comp,&#32;mtk_crtc-&gt;mutex[mmsys]))\r\n"
+ "&gt;&#32;+mtk_mutex_remove_comp(mtk_crtc-&gt;mutex[mtk_crtc-&gt;ddp_comp_sys[i]],\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;-if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex))\r\n"
+ "&gt;&#32;-mtk_mutex_remove_comp(mtk_crtc-&gt;mutex,&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;ddp_comp_sys[i];\r\n"
+ "&gt;&#32;+if&#32;(!mtk_ddp_comp_remove(mtk_crtc-&gt;ddp_comp[i],&#32;mtk_crtc-&gt;mutex[mmsys]))\r\n"
+ "&gt;&#32;+mtk_mutex_remove_comp(mtk_crtc-&gt;mutex[mmsys],&#32;mtk_crtc-&gt;ddp_comp[i]-&gt;id);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;mtk_crtc_ddp_clk_disable(mtk_crtc);\r\n"
+ "&gt;&#32;-mtk_mutex_unprepare(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-pm_runtime_put(drm-&gt;dev);\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_unprepare(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+mtk_mmsys_top_clk_disable(mtk_crtc-&gt;mmsys_dev[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+pm_runtime_put_sync(drm-&gt;dev);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(crtc-&gt;state-&gt;event&#32;&amp;&amp;&#32;!crtc-&gt;state-&gt;active)&#32;{\r\n"
+ "&gt;&#32;&#32;spin_lock_irqsave(&amp;crtc-&gt;dev-&gt;event_lock,&#32;flags);\r\n"
+ "&gt;&#32;@@&#32;-581,9&#32;+663,15&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_config(struct&#32;mtk_crtc&#32;*mtk_crtc,&#32;bool&#32;needs_vblank)\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;pending_async_planes&#32;=&#32;true;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(priv-&gt;data-&gt;shadow_register)&#32;{\r\n"
+ "&gt;&#32;-mtk_mutex_acquire(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_acquire(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;mtk_crtc_ddp_config(crtc,&#32;NULL);\r\n"
+ "&gt;&#32;-mtk_mutex_release(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i]&#32;&amp;&amp;&#32;mtk_crtc-&gt;mutex[i])\r\n"
+ "&gt;&#32;+mtk_mutex_release(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;#if&#32;IS_REACHABLE(CONFIG_MTK_CMDQ)\r\n"
+ "&gt;&#32;&#32;if&#32;(mtk_crtc-&gt;cmdq_client.chan)&#32;{\r\n"
+ "&gt;&#32;@@&#32;-659,6&#32;+747,7&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_output(struct&#32;drm_crtc&#32;*crtc,\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;int&#32;crtc_index&#32;=&#32;drm_crtc_index(crtc);\r\n"
+ "&gt;&#32;&#32;int&#32;i;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;mmsys;\r\n"
+ "&gt;&#32;&#32;struct&#32;device&#32;*dev;\r\n"
+ "&gt;&#32;&#32;struct&#32;drm_crtc_state&#32;*crtc_state&#32;=&#32;state-&gt;crtcs[crtc_index].new_state;\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);\r\n"
+ "&gt;&#32;@@&#32;-671,7&#32;+760,8&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_output(struct&#32;drm_crtc&#32;*crtc,\r\n"
+ "&gt;&#32;&#32;if&#32;(!mtk_crtc-&gt;num_conn_routes)\r\n"
+ "&gt;&#32;&#32;return;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-priv&#32;=&#32;((struct&#32;mtk_drm_private&#32;*)crtc-&gt;dev-&gt;dev_private)-&gt;all_drm_private[crtc_index];\r\n"
+ "&gt;&#32;+mmsys&#32;=&#32;mtk_crtc-&gt;conn_routes_sys;\r\n"
+ "&gt;&#32;+priv&#32;=&#32;((struct&#32;mtk_drm_private&#32;*)crtc-&gt;dev-&gt;dev_private)-&gt;all_drm_private[mmsys];\r\n"
+ "&gt;&#32;&#32;dev&#32;=&#32;priv-&gt;dev;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;dev_dbg(dev,&#32;&quot;connector&#32;change:%d,&#32;encoder&#32;mask:0x%x&#32;for&#32;crtc:%d&#92;n&quot;,\r\n"
+ "&gt;&#32;@@&#32;-684,6&#32;+774,8&#32;@@&#32;static&#32;void&#32;mtk_crtc_update_output(struct&#32;drm_crtc&#32;*crtc,\r\n"
+ "&gt;&#32;&#32;if&#32;(comp-&gt;encoder_index&#32;&gt;=&#32;0&#32;&amp;&amp;\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;(encoder_mask&#32;&amp;&#32;BIT(comp-&gt;encoder_index)))&#32;{\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp[mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1]&#32;=&#32;comp;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;ddp_comp_sys[mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1]&#32;=&#32;mmsys;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;exist[mmsys]&#32;=&#32;true;\r\n"
+ "&gt;&#32;&#32;dev_dbg(dev,&#32;&quot;Add&#32;comp_id:&#32;%d&#32;at&#32;path&#32;index&#32;%d&#92;n&quot;,\r\n"
+ "&gt;&#32;&#32;comp-&gt;id,&#32;mtk_crtc-&gt;ddp_comp_nr&#32;-&#32;1);\r\n"
+ "&gt;&#32;&#32;break;\r\n"
+ "&gt;&#32;@@&#32;-720,13&#32;+812,35&#32;@@&#32;static&#32;void&#32;mtk_crtc_atomic_enable(struct&#32;drm_crtc&#32;*crtc,\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[0];\r\n"
+ "&gt;&#32;&#32;int&#32;ret;\r\n"
+ "&gt;&#32;+int&#32;i,&#32;j;\r\n"
+ "&gt;&#32;+int&#32;mmsys_cnt&#32;=&#32;0;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;DRM_DEBUG_DRIVER(&quot;%s&#32;%d&#92;n&quot;,&#32;__func__,&#32;crtc-&gt;base.id);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-ret&#32;=&#32;mtk_ddp_comp_power_on(comp);\r\n"
+ "&gt;&#32;-if&#32;(ret&#32;&lt;&#32;0)&#32;{\r\n"
+ "&gt;&#32;-DRM_DEV_ERROR(comp-&gt;dev,&#32;&quot;Failed&#32;to&#32;enable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;-return;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+mmsys_cnt++;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(mmsys_cnt&#32;==&#32;1)&#32;{\r\n"
+ "&gt;&#32;+ret&#32;=&#32;pm_runtime_resume_and_get(comp-&gt;dev);\r\n"
+ "&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)&#32;{\r\n"
+ "&gt;&#32;+DRM_DEV_ERROR(comp-&gt;dev,&#32;&quot;Failed&#32;to&#32;enable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;+return;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}&#32;else&#32;{\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(!mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+ret&#32;=&#32;pm_runtime_resume_and_get(mtk_crtc-&gt;mmsys_dev[i]);\r\n"
+ "&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)&#32;{\r\n"
+ "&gt;&#32;+DRM_DEV_ERROR(mtk_crtc-&gt;mmsys_dev[i],\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;&quot;Failed&#32;to&#32;enable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;i&#32;-&#32;1;&#32;j&#32;&gt;=&#32;0;&#32;j--)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+pm_runtime_put(comp-&gt;dev);\r\n"
+ "&gt;&#32;+return;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;mtk_crtc_update_output(crtc,&#32;state);\r\n"
+ "&gt;&#32;@@&#32;-746,12&#32;+860,17&#32;@@&#32;static&#32;void&#32;mtk_crtc_atomic_disable(struct&#32;drm_crtc&#32;*crtc,\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc&#32;=&#32;to_mtk_crtc(crtc);\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp&#32;=&#32;mtk_crtc-&gt;ddp_comp[0];\r\n"
+ "&gt;&#32;-int&#32;i;\r\n"
+ "&gt;&#32;+int&#32;i,&#32;ret;\r\n"
+ "&gt;&#32;+int&#32;mmsys_cnt&#32;=&#32;0;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;DRM_DEBUG_DRIVER(&quot;%s&#32;%d&#92;n&quot;,&#32;__func__,&#32;crtc-&gt;base.id);\r\n"
+ "&gt;&#32;&#32;if&#32;(!mtk_crtc-&gt;enabled)\r\n"
+ "&gt;&#32;&#32;return;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+mmsys_cnt++;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;/*&#32;Set&#32;all&#32;pending&#32;plane&#32;state&#32;to&#32;disabled&#32;*/\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;layer_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;drm_plane&#32;*plane&#32;=&#32;&amp;mtk_crtc-&gt;planes[i];\r\n"
+ "&gt;&#32;@@&#32;-776,7&#32;+895,21&#32;@@&#32;static&#32;void&#32;mtk_crtc_atomic_disable(struct&#32;drm_crtc&#32;*crtc,\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;drm_crtc_vblank_off(crtc);\r\n"
+ "&gt;&#32;&#32;mtk_crtc_ddp_hw_fini(mtk_crtc);\r\n"
+ "&gt;&#32;-mtk_ddp_comp_power_off(comp);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(mmsys_cnt&#32;&gt;&#32;1)&#32;{\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])&#32;{\r\n"
+ "&gt;&#32;+ret&#32;=&#32;pm_runtime_put(mtk_crtc-&gt;mmsys_dev[i]);\r\n"
+ "&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)\r\n"
+ "&gt;&#32;+DRM_DEV_ERROR(mtk_crtc-&gt;mmsys_dev[i],\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;&quot;Failed&#32;to&#32;disable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}&#32;else&#32;{\r\n"
+ "&gt;&#32;+ret&#32;=&#32;pm_runtime_put(comp-&gt;dev);\r\n"
+ "&gt;&#32;+if&#32;(ret&#32;&lt;&#32;0)\r\n"
+ "&gt;&#32;+DRM_DEV_ERROR(comp-&gt;dev,&#32;&quot;Failed&#32;to&#32;disable&#32;power&#32;domain:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;enabled&#32;=&#32;false;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;@@&#32;-937,49&#32;+1070,108&#32;@@&#32;struct&#32;device&#32;*mtk_crtc_dma_dev_get(struct&#32;drm_crtc&#32;*crtc)\r\n"
+ "&gt;&#32;&#32;return&#32;mtk_crtc-&gt;dma_dev;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;path_len,&#32;int&#32;priv_data_index,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;const&#32;struct&#32;mtk_drm_route&#32;*conn_routes,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;num_conn_routes)\r\n"
+ "&gt;&#32;+int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;enum&#32;mtk_crtc_path&#32;path_sel)\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*priv&#32;=&#32;drm_dev-&gt;dev_private;\r\n"
+ "&gt;&#32;&#32;struct&#32;device&#32;*dev&#32;=&#32;drm_dev-&gt;dev;\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_crtc&#32;*mtk_crtc;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;num_comp_planes&#32;=&#32;0;\r\n"
+ "&gt;&#32;&#32;int&#32;ret;\r\n"
+ "&gt;&#32;-int&#32;i;\r\n"
+ "&gt;&#32;+int&#32;i,&#32;j,&#32;k;\r\n"
+ "&gt;&#32;&#32;bool&#32;has_ctm&#32;=&#32;false;\r\n"
+ "&gt;&#32;&#32;uint&#32;gamma_lut_size&#32;=&#32;0;\r\n"
+ "&gt;&#32;&#32;struct&#32;drm_crtc&#32;*tmp;\r\n"
+ "&gt;&#32;&#32;int&#32;crtc_i&#32;=&#32;0;\r\n"
+ "&gt;&#32;-\r\n"
+ "&gt;&#32;-if&#32;(!path)\r\n"
+ "&gt;&#32;-return&#32;0;\r\n"
+ "&gt;&#32;-\r\n"
+ "&gt;&#32;-priv&#32;=&#32;priv-&gt;all_drm_private[priv_data_index];\r\n"
+ "&gt;&#32;+struct&#32;mtk_drm_private&#32;*subsys_priv;\r\n"
+ "&gt;&#32;+struct&#32;mtk_crtc_comp_info&#32;path[DDP_COMPONENT_ID_MAX];\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;path_len&#32;=&#32;0;\r\n"
+ "&gt;&#32;+const&#32;struct&#32;mtk_drm_route&#32;*conn_routes&#32;=&#32;NULL;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;num_conn_routes&#32;=&#32;0;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;conn_mmsys;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;drm_for_each_crtc(tmp,&#32;drm_dev)\r\n"
+ "&gt;&#32;&#32;crtc_i++;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;priv-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{\r\n"
+ "&gt;&#32;+for&#32;(k&#32;=&#32;0;&#32;k&#32;&lt;&#32;MAX_MMSYS;&#32;k++)&#32;{\r\n"
+ "&gt;&#32;+const&#32;unsigned&#32;int&#32;*subsys_path;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;subsys_path_len;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;order&#32;=&#32;0;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+subsys_priv&#32;=&#32;priv-&gt;all_drm_private[k];\r\n"
+ "&gt;&#32;+if&#32;(!subsys_priv)\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(path_sel&#32;==&#32;CRTC_MAIN)&#32;{\r\n"
+ "&gt;&#32;+subsys_path&#32;=&#32;subsys_priv-&gt;data-&gt;main_path;\r\n"
+ "&gt;&#32;+subsys_path_len&#32;=&#32;subsys_priv-&gt;data-&gt;main_len;\r\n"
+ "&gt;&#32;+order&#32;=&#32;subsys_priv-&gt;data-&gt;main_order;\r\n"
+ "&gt;&#32;+}&#32;else&#32;if&#32;(path_sel&#32;==&#32;CRTC_EXT)&#32;{\r\n"
+ "&gt;&#32;+subsys_path&#32;=&#32;subsys_priv-&gt;data-&gt;ext_path;\r\n"
+ "&gt;&#32;+subsys_path_len&#32;=&#32;subsys_priv-&gt;data-&gt;ext_len;\r\n"
+ "&gt;&#32;+order&#32;=&#32;subsys_priv-&gt;data-&gt;ext_order;\r\n"
+ "&gt;&#32;+}&#32;else&#32;if&#32;(path_sel&#32;==&#32;CRTC_THIRD)&#32;{\r\n"
+ "&gt;&#32;+subsys_path&#32;=&#32;subsys_priv-&gt;data-&gt;third_path;\r\n"
+ "&gt;&#32;+subsys_path_len&#32;=&#32;subsys_priv-&gt;data-&gt;third_len;\r\n"
+ "&gt;&#32;+order&#32;=&#32;subsys_priv-&gt;data-&gt;third_order;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(subsys_priv-&gt;data-&gt;num_conn_routes)&#32;{\r\n"
+ "&gt;&#32;+conn_routes&#32;=&#32;subsys_priv-&gt;data-&gt;conn_routes;\r\n"
+ "&gt;&#32;+num_conn_routes&#32;=&#32;subsys_priv-&gt;data-&gt;num_conn_routes;\r\n"
+ "&gt;&#32;+conn_mmsys&#32;=&#32;subsys_priv-&gt;data-&gt;mmsys_id;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(j&#32;!=&#32;order)\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+if&#32;(!subsys_path_len)\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;subsys_path_len;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+path[path_len].sys&#32;=&#32;subsys_priv-&gt;data-&gt;mmsys_id;\r\n"
+ "&gt;&#32;+path[path_len].comp_id&#32;=&#32;subsys_path[i];\r\n"
+ "&gt;&#32;+path_len++;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(!path_len)\r\n"
+ "&gt;&#32;+return&#32;0;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(num_conn_routes)&#32;{\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;num_conn_routes;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(conn_routes-&gt;crtc_id&#32;==&#32;crtc_i)\r\n"
+ "&gt;&#32;+break;\r\n"
+ "&gt;&#32;+if&#32;(i&#32;==&#32;num_conn_routes)&#32;{\r\n"
+ "&gt;&#32;+num_conn_routes&#32;=&#32;0;\r\n"
+ "&gt;&#32;+conn_routes&#32;=&#32;NULL;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;path_len;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;-enum&#32;mtk_ddp_comp_id&#32;comp_id&#32;=&#32;path[i];\r\n"
+ "&gt;&#32;+enum&#32;mtk_ddp_comp_id&#32;comp_id&#32;=&#32;path[i].comp_id;\r\n"
+ "&gt;&#32;&#32;struct&#32;device_node&#32;*node;\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[path[i].sys];\r\n"
+ "&gt;&#32;&#32;node&#32;=&#32;priv-&gt;comp_node[comp_id];\r\n"
+ "&gt;&#32;&#32;comp&#32;=&#32;&amp;priv-&gt;ddp_comp[comp_id];\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;/*&#32;Not&#32;all&#32;drm&#32;components&#32;have&#32;a&#32;DTS&#32;device&#32;node,&#32;such&#32;as&#32;ovl_adaptor,\r\n"
+ "&gt;&#32;&#32;&#32;*&#32;which&#32;is&#32;the&#32;drm&#32;bring&#32;up&#32;sub&#32;driver\r\n"
+ "&gt;&#32;&#32;&#32;*/\r\n"
+ "&gt;&#32;-if&#32;(!node&#32;&amp;&amp;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(!node&#32;&amp;&amp;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;&amp;&amp;\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;&amp;&amp;\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;&amp;&amp;\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;comp_id&#32;!=&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;&amp;&amp;\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;mtk_ddp_comp_get_type(comp_id)&#32;!=&#32;MTK_DISP_VIRTUAL)&#32;{\r\n"
+ "&gt;&#32;&#32;dev_info(dev,\r\n"
+ "&gt;&#32;&#32;&quot;Not&#32;creating&#32;crtc&#32;%d&#32;because&#32;component&#32;%d&#32;is&#32;disabled&#32;or&#32;missing&#92;n&quot;,\r\n"
+ "&gt;&#32;&#32;crtc_i,&#32;comp_id);\r\n"
+ "&gt;&#32;&#32;return&#32;0;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-if&#32;(!comp-&gt;dev)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(!comp-&gt;dev&#32;&amp;&amp;&#32;mtk_ddp_comp_get_type(comp_id)&#32;!=&#32;MTK_DISP_VIRTUAL)&#32;{\r\n"
+ "&gt;&#32;&#32;dev_err(dev,&#32;&quot;Component&#32;%pOF&#32;not&#32;initialized&#92;n&quot;,&#32;node);\r\n"
+ "&gt;&#32;&#32;return&#32;-ENODEV;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;@@&#32;-989,7&#32;+1181,9&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;if&#32;(!mtk_crtc)\r\n"
+ "&gt;&#32;&#32;return&#32;-ENOMEM;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-mtk_crtc-&gt;mmsys_dev&#32;=&#32;priv-&gt;mmsys_dev;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(priv-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;mmsys_dev[i]&#32;=&#32;priv-&gt;all_drm_private[i]-&gt;mmsys_dev;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;=&#32;path_len;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp&#32;=&#32;devm_kcalloc(dev,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;mtk_crtc-&gt;ddp_comp_nr&#32;+&#32;(conn_routes&#32;&#63;&#32;1&#32;:&#32;0),\r\n"
+ "&gt;&#32;@@&#32;-998,19&#32;+1192,36&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;if&#32;(!mtk_crtc-&gt;ddp_comp)\r\n"
+ "&gt;&#32;&#32;return&#32;-ENOMEM;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-mtk_crtc-&gt;mutex&#32;=&#32;mtk_mutex_get(priv-&gt;mutex_dev);\r\n"
+ "&gt;&#32;-if&#32;(IS_ERR(mtk_crtc-&gt;mutex))&#32;{\r\n"
+ "&gt;&#32;-ret&#32;=&#32;PTR_ERR(mtk_crtc-&gt;mutex);\r\n"
+ "&gt;&#32;-dev_err(dev,&#32;&quot;Failed&#32;to&#32;get&#32;mutex:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;-return&#32;ret;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;ddp_comp_sys&#32;=&#32;devm_kmalloc_array(dev,&#32;mtk_crtc-&gt;ddp_comp_nr&#32;+\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;(conn_routes&#32;&#63;&#32;1&#32;:&#32;0),\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;sizeof(mtk_crtc-&gt;ddp_comp_sys),&#32;GFP_KERNEL);\r\n"
+ "&gt;&#32;+if&#32;(!mtk_crtc-&gt;ddp_comp_sys)\r\n"
+ "&gt;&#32;+return&#32;-ENOMEM;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(!priv-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[i];\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;mutex[i]&#32;=&#32;mtk_mutex_get(priv-&gt;mutex_dev);\r\n"
+ "&gt;&#32;+if&#32;(IS_ERR(mtk_crtc-&gt;mutex[i]))&#32;{\r\n"
+ "&gt;&#32;+ret&#32;=&#32;PTR_ERR(mtk_crtc-&gt;mutex[i]);\r\n"
+ "&gt;&#32;+dev_err(dev,&#32;&quot;Failed&#32;to&#32;get&#32;mutex:&#32;%d&#92;n&quot;,&#32;ret);\r\n"
+ "&gt;&#32;+return&#32;ret;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;mtk_crtc-&gt;ddp_comp_nr;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;-unsigned&#32;int&#32;comp_id&#32;=&#32;path[i];\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;comp_id&#32;=&#32;path[i].comp_id;\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;*comp;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[path[i].sys];\r\n"
+ "&gt;&#32;&#32;comp&#32;=&#32;&amp;priv-&gt;ddp_comp[comp_id];\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_get_type(comp_id)&#32;==&#32;MTK_DISP_VIRTUAL)\r\n"
+ "&gt;&#32;+comp-&gt;id&#32;=&#32;comp_id;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp[i]&#32;=&#32;comp;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;ddp_comp_sys[i]&#32;=&#32;path[i].sys;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;exist[path[i].sys]&#32;=&#32;true;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(comp-&gt;funcs)&#32;{\r\n"
+ "&gt;&#32;&#32;if&#32;(comp-&gt;funcs-&gt;gamma_set&#32;&amp;&amp;&#32;comp-&gt;funcs-&gt;gamma_get_lut_size)&#32;{\r\n"
+ "&gt;&#32;@@&#32;-1047,8&#32;+1258,10&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;&#32;*&#32;In&#32;the&#32;case&#32;of&#32;ovl_adaptor&#32;sub&#32;driver,&#32;it&#32;needs&#32;to&#32;use&#32;the\r\n"
+ "&gt;&#32;&#32;&#32;*&#32;dma_dev_get&#32;function&#32;to&#32;get&#32;representative&#32;dma&#32;dev.\r\n"
+ "&gt;&#32;&#32;&#32;*/\r\n"
+ "&gt;&#32;-mtk_crtc-&gt;dma_dev&#32;=&#32;mtk_ddp_comp_dma_dev_get(&amp;priv-&gt;ddp_comp[path[0]]);\r\n"
+ "&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[path[0].sys];\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;dma_dev&#32;=&#32;mtk_ddp_comp_dma_dev_get(&amp;priv-&gt;ddp_comp[path[0].comp_id]);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;vdisp_ao_dev&#32;=&#32;priv-&gt;vdisp_ao_dev;\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;mtk_crtc_init(drm_dev,&#32;mtk_crtc,&#32;crtc_i);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret&#32;&lt;&#32;0)\r\n"
+ "&gt;&#32;&#32;return&#32;ret;\r\n"
+ "&gt;&#32;@@&#32;-1061,7&#32;+1274,7&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;#if&#32;IS_REACHABLE(CONFIG_MTK_CMDQ)\r\n"
+ "&gt;&#32;&#32;i&#32;=&#32;priv-&gt;mbox_index++;\r\n"
+ "&gt;&#32;-mtk_crtc-&gt;cmdq_client.client.dev&#32;=&#32;mtk_crtc-&gt;mmsys_dev;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;cmdq_client.client.dev&#32;=&#32;mtk_crtc-&gt;mmsys_dev[priv-&gt;data-&gt;mmsys_id];\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;cmdq_client.client.tx_block&#32;=&#32;false;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;cmdq_client.client.knows_txdone&#32;=&#32;true;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;cmdq_client.client.rx_callback&#32;=&#32;ddp_cmdq_cb;\r\n"
+ "&gt;&#32;@@&#32;-1101,6&#32;+1314,7&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;#endif\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(conn_routes)&#32;{\r\n"
+ "&gt;&#32;+priv&#32;=&#32;priv-&gt;all_drm_private[conn_mmsys];\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;num_conn_routes;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;comp_id&#32;=&#32;conn_routes[i].route_ddp;\r\n"
+ "&gt;&#32;&#32;struct&#32;device_node&#32;*node&#32;=&#32;priv-&gt;comp_node[comp_id];\r\n"
+ "&gt;&#32;@@&#32;-1117,6&#32;+1331,7&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;mtk_ddp_comp_encoder_index_set(&amp;priv-&gt;ddp_comp[comp_id]);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+mtk_crtc-&gt;conn_routes_sys&#32;=&#32;conn_mmsys;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;num_conn_routes&#32;=&#32;num_conn_routes;\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;conn_routes&#32;=&#32;conn_routes;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;@@&#32;-1124,5&#32;+1339,10&#32;@@&#32;int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;mtk_crtc-&gt;ddp_comp_nr++;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(mtk_crtc-&gt;exist[i])\r\n"
+ "&gt;&#32;+device_link_add(mtk_crtc-&gt;base.dev-&gt;dev,\r\n"
+ "&gt;&#32;+priv-&gt;all_drm_private[i]-&gt;mutex_dev,&#32;0);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;return&#32;0;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.h&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.h\r\n"
+ "&gt;&#32;index&#32;388e900b6f4d..255f2823d17a&#32;100644\r\n"
+ "&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_crtc.h\r\n"
+ "&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_crtc.h\r\n"
+ "&gt;&#32;@@&#32;-15,10&#32;+15,8&#32;@@\r\n"
+ "&gt;&#32;&#32;#define&#32;MTK_MIN_BPC3\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;void&#32;mtk_crtc_commit(struct&#32;drm_crtc&#32;*crtc);\r\n"
+ "&gt;&#32;-int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,&#32;const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;path_len,&#32;int&#32;priv_data_index,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;const&#32;struct&#32;mtk_drm_route&#32;*conn_routes,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;unsigned&#32;int&#32;num_conn_routes);\r\n"
+ "&gt;&#32;+int&#32;mtk_crtc_create(struct&#32;drm_device&#32;*drm_dev,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;enum&#32;mtk_crtc_path&#32;path_sel);\r\n"
+ "&gt;&#32;&#32;int&#32;mtk_crtc_plane_check(struct&#32;drm_crtc&#32;*crtc,&#32;struct&#32;drm_plane&#32;*plane,\r\n"
+ "&gt;&#32;&#32;&#32;struct&#32;mtk_plane_state&#32;*state);\r\n"
+ "&gt;&#32;&#32;void&#32;mtk_crtc_async_update(struct&#32;drm_crtc&#32;*crtc,&#32;struct&#32;drm_plane&#32;*plane,\r\n"
+ "&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c\r\n"
+ "&gt;&#32;index&#32;492b8d965309..f841184d1e06&#32;100644\r\n"
+ "&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c\r\n"
+ "&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c\r\n"
+ "&gt;&#32;@@&#32;-464,6&#32;+464,7&#32;@@&#32;static&#32;const&#32;char&#32;*&#32;const&#32;mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;[MTK_DISP_PWM]&#32;=&#32;&quot;pwm&quot;,\r\n"
+ "&gt;&#32;&#32;[MTK_DISP_RDMA]&#32;=&#32;&quot;rdma&quot;,\r\n"
+ "&gt;&#32;&#32;[MTK_DISP_UFOE]&#32;=&#32;&quot;ufoe&quot;,\r\n"
+ "&gt;&#32;+[MTK_DISP_VIRTUAL]&#32;=&#32;&quot;virtual&quot;,\r\n"
+ "&gt;&#32;&#32;[MTK_DISP_WDMA]&#32;=&#32;&quot;wdma&quot;,\r\n"
+ "&gt;&#32;&#32;[MTK_DP_INTF]&#32;=&#32;&quot;dp-intf&quot;,\r\n"
+ "&gt;&#32;&#32;[MTK_DPI]&#32;=&#32;&quot;dpi&quot;,\r\n"
+ "&gt;&#32;@@&#32;-487,6&#32;+488,15&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_ddp_comp_match&#32;mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_COLOR0]=&#32;{&#32;MTK_DISP_COLOR,0,&#32;&amp;ddp_color&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_COLOR1]=&#32;{&#32;MTK_DISP_COLOR,1,&#32;&amp;ddp_color&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DITHER0]=&#32;{&#32;MTK_DISP_DITHER,0,&#32;&amp;ddp_dither&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC0]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC1]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC8]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC21]&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC22]&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLI_ASYNC23]&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLO_ASYNC1]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLO_ASYNC2]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DLO_ASYNC3]&#32;&#32;&#32;&#32;&#32;&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DP_INTF0]=&#32;{&#32;MTK_DP_INTF,0,&#32;&amp;ddp_dpi&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DP_INTF1]=&#32;{&#32;MTK_DP_INTF,1,&#32;&amp;ddp_dpi&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DPI0]=&#32;{&#32;MTK_DPI,0,&#32;&amp;ddp_dpi&#32;},\r\n"
+ "&gt;&#32;@@&#32;-494,6&#32;+504,9&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_ddp_comp_match&#32;mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DRM_OVL_ADAPTOR]=&#32;{&#32;MTK_DISP_OVL_ADAPTOR,0,&#32;&amp;ddp_ovl_adaptor&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;0,&#32;&amp;ddp_ovlsys_adaptor},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;1,&#32;&amp;ddp_ovlsys_adaptor},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;0,&#32;&amp;ddp_ovlsys_adaptor},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;1,&#32;&amp;ddp_ovlsys_adaptor},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2]&#32;=&#32;{&#32;MTK_DISP_OVLSYS_ADAPTOR,&#32;2,&#32;&amp;ddp_ovlsys_adaptor},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DSC0]=&#32;{&#32;MTK_DISP_DSC,0,&#32;&amp;ddp_dsc&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DSC1]=&#32;{&#32;MTK_DISP_DSC,1,&#32;&amp;ddp_dsc&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_DSI0]=&#32;{&#32;MTK_DSI,0,&#32;&amp;ddp_dsi&#32;},\r\n"
+ "&gt;&#32;@@&#32;-510,7&#32;+523,10&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_ddp_comp_match&#32;mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OD0]=&#32;{&#32;MTK_DISP_OD,0,&#32;&amp;ddp_od&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OD1]=&#32;{&#32;MTK_DISP_OD,1,&#32;&amp;ddp_od&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OVL0]=&#32;{&#32;MTK_DISP_OVL,0,&#32;&amp;ddp_ovl&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_OVL0_DLO_ASYNC5]&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_OVL0_DLO_ASYNC6]&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OVL1]=&#32;{&#32;MTK_DISP_OVL,1,&#32;&amp;ddp_ovl&#32;},\r\n"
+ "&gt;&#32;+[DDP_COMPONENT_OVL1_DLO_ASYNC5]&#32;=&#32;{&#32;MTK_DISP_VIRTUAL,&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;-1,&#32;NULL&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OVL_2L0]=&#32;{&#32;MTK_DISP_OVL_2L,0,&#32;&amp;ddp_ovl&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OVL_2L1]=&#32;{&#32;MTK_DISP_OVL_2L,1,&#32;&amp;ddp_ovl&#32;},\r\n"
+ "&gt;&#32;&#32;[DDP_COMPONENT_OVL_2L2]=&#32;{&#32;MTK_DISP_OVL_2L,2,&#32;&amp;ddp_ovl&#32;},\r\n"
+ "&gt;&#32;@@&#32;-567,12&#32;+583,19&#32;@@&#32;static&#32;bool&#32;mtk_ddp_path_available(const&#32;unsigned&#32;int&#32;*path,\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;i;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+if&#32;(!path_len)\r\n"
+ "&gt;&#32;+return&#32;true;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;if&#32;(!path&#32;||&#32;!path_len)\r\n"
+ "&gt;&#32;&#32;return&#32;false;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0U;&#32;i&#32;&lt;&#32;path_len;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;&#32;/*&#32;OVL_ADAPTOR&#32;doesn&#39;t&#32;have&#32;a&#32;device&#32;node&#32;*/\r\n"
+ "&gt;&#32;-if&#32;(path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR)\r\n"
+ "&gt;&#32;+if&#32;(path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;||\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;||\r\n"
+ "&gt;&#32;+path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;||\r\n"
+ "&gt;&#32;+path[i]&#32;==&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;||\r\n"
+ "&gt;&#32;+mtk_ddp_comp_get_type(path[i])&#32;==&#32;MTK_DISP_VIRTUAL)\r\n"
+ "&gt;&#32;&#32;continue;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(!comp_node[path[i]])\r\n"
+ "&gt;&#32;@@&#32;-597,44&#32;+620,81&#32;@@&#32;int&#32;mtk_ddp_comp_get_id(struct&#32;device_node&#32;*node,\r\n"
+ "&gt;&#32;&#32;return&#32;-EINVAL;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+enum&#32;mtk_ddp_comp_type&#32;mtk_ddp_comp_get_type(unsigned&#32;int&#32;comp_id)\r\n"
+ "&gt;&#32;+{\r\n"
+ "&gt;&#32;+return&#32;mtk_ddp_matches[comp_id].type;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;int&#32;mtk_find_possible_crtcs(struct&#32;drm_device&#32;*drm,&#32;struct&#32;device&#32;*dev)\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*private&#32;=&#32;drm-&gt;dev_private;\r\n"
+ "&gt;&#32;&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;*data;\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*priv_n;\r\n"
+ "&gt;&#32;-int&#32;i&#32;=&#32;0,&#32;j;\r\n"
+ "&gt;&#32;&#32;int&#32;ret;\r\n"
+ "&gt;&#32;+int&#32;i&#32;=&#32;0,&#32;j,&#32;count&#32;=&#32;0;\r\n"
+ "&gt;&#32;+bool&#32;found&#32;=&#32;false;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{\r\n"
+ "&gt;&#32;&#32;priv_n&#32;=&#32;private-&gt;all_drm_private[j];\r\n"
+ "&gt;&#32;&#32;data&#32;=&#32;priv_n-&gt;data;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(mtk_ddp_path_available(data-&gt;main_path,&#32;data-&gt;main_len,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;priv_n-&gt;comp_node))&#32;{\r\n"
+ "&gt;&#32;-if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;main_path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;data-&gt;main_len,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))\r\n"
+ "&gt;&#32;-return&#32;BIT(i);\r\n"
+ "&gt;&#32;-i++;\r\n"
+ "&gt;&#32;-}\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;priv_n-&gt;comp_node))\r\n"
+ "&gt;&#32;+count++;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;main_path,&#32;data-&gt;main_len,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))\r\n"
+ "&gt;&#32;+found&#32;=&#32;true;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(count&#32;==&#32;private-&gt;data-&gt;mmsys_dev_num)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(found)\r\n"
+ "&gt;&#32;+return&#32;BIT(i);\r\n"
+ "&gt;&#32;+i++;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+count&#32;=&#32;0;\r\n"
+ "&gt;&#32;+found&#32;=&#32;false;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{\r\n"
+ "&gt;&#32;+priv_n&#32;=&#32;private-&gt;all_drm_private[j];\r\n"
+ "&gt;&#32;+data&#32;=&#32;priv_n-&gt;data;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(mtk_ddp_path_available(data-&gt;ext_path,&#32;data-&gt;ext_len,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;priv_n-&gt;comp_node))&#32;{\r\n"
+ "&gt;&#32;-if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;ext_path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;data-&gt;ext_len,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))\r\n"
+ "&gt;&#32;-return&#32;BIT(i);\r\n"
+ "&gt;&#32;-i++;\r\n"
+ "&gt;&#32;-}\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;priv_n-&gt;comp_node))\r\n"
+ "&gt;&#32;+count++;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;ext_path,&#32;data-&gt;ext_len,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))\r\n"
+ "&gt;&#32;+found&#32;=&#32;true;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(count&#32;==&#32;private-&gt;data-&gt;mmsys_dev_num)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(found)\r\n"
+ "&gt;&#32;+return&#32;BIT(i);\r\n"
+ "&gt;&#32;+i++;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+count&#32;=&#32;0;\r\n"
+ "&gt;&#32;+found&#32;=&#32;false;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{\r\n"
+ "&gt;&#32;+priv_n&#32;=&#32;private-&gt;all_drm_private[j];\r\n"
+ "&gt;&#32;+data&#32;=&#32;priv_n-&gt;data;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(mtk_ddp_path_available(data-&gt;third_path,&#32;data-&gt;third_len,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;priv_n-&gt;comp_node))&#32;{\r\n"
+ "&gt;&#32;-if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;third_path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;data-&gt;third_len,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))\r\n"
+ "&gt;&#32;-return&#32;BIT(i);\r\n"
+ "&gt;&#32;-i++;\r\n"
+ "&gt;&#32;-}\r\n"
+ "&gt;&#32;+priv_n-&gt;comp_node))\r\n"
+ "&gt;&#32;+count++;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(mtk_ddp_comp_find(dev,&#32;data-&gt;third_path,&#32;data-&gt;third_len,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;ddp_comp))\r\n"
+ "&gt;&#32;+found&#32;=&#32;true;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(count&#32;==&#32;private-&gt;data-&gt;mmsys_dev_num)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(found)\r\n"
+ "&gt;&#32;+return&#32;BIT(i);\r\n"
+ "&gt;&#32;+i++;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;mtk_ddp_comp_find_in_route(dev,\r\n"
+ "&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h\r\n"
+ "&gt;&#32;index&#32;ef64ce7a071f..badb42bd4f7c&#32;100644\r\n"
+ "&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h\r\n"
+ "&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h\r\n"
+ "&gt;&#32;@@&#32;-40,6&#32;+40,7&#32;@@&#32;enum&#32;mtk_ddp_comp_type&#32;{\r\n"
+ "&gt;&#32;&#32;MTK_DISP_PWM,\r\n"
+ "&gt;&#32;&#32;MTK_DISP_RDMA,\r\n"
+ "&gt;&#32;&#32;MTK_DISP_UFOE,\r\n"
+ "&gt;&#32;+MTK_DISP_VIRTUAL,\r\n"
+ "&gt;&#32;&#32;MTK_DISP_WDMA,\r\n"
+ "&gt;&#32;&#32;MTK_DPI,\r\n"
+ "&gt;&#32;&#32;MTK_DP_INTF,\r\n"
+ "&gt;&#32;@@&#32;-47,6&#32;+48,7&#32;@@&#32;enum&#32;mtk_ddp_comp_type&#32;{\r\n"
+ "&gt;&#32;&#32;MTK_OVL_BLENDER,\r\n"
+ "&gt;&#32;&#32;MTK_OVL_EXDMA,\r\n"
+ "&gt;&#32;&#32;MTK_OVL_OUTPROC,\r\n"
+ "&gt;&#32;+MTK_VDISP_AO,\r\n"
+ "&gt;&#32;&#32;MTK_DDP_COMP_TYPE_MAX,\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.c&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n"
+ "&gt;&#32;index&#32;7526bc38bcc7..0665a6feb546&#32;100644\r\n"
+ "&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n"
+ "&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n"
+ "&gt;&#32;@@&#32;-193,6&#32;+193,10&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_drm_route&#32;mt8188_mtk_ddp_main_routes[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;{0,&#32;DDP_COMPONENT_DSI0},\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+static&#32;const&#32;struct&#32;mtk_drm_route&#32;mt8196_mtk_ddp_routes[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+{2,&#32;DDP_COMPONENT_DSI0},\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;static&#32;const&#32;unsigned&#32;int&#32;mt8192_mtk_ddp_main[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;DDP_COMPONENT_OVL0,\r\n"
+ "&gt;&#32;&#32;DDP_COMPONENT_OVL_2L0,\r\n"
+ "&gt;&#32;@@&#32;-231,6&#32;+235,50&#32;@@&#32;static&#32;const&#32;unsigned&#32;int&#32;mt8195_mtk_ddp_ext[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;DDP_COMPONENT_DP_INTF1,\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_ovl0_main[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_OVL0_DLO_ASYNC5,\r\n"
+ "&gt;&#32;+};\r\n"
+ "\r\n"
+ "Separate&#32;MT8196&#32;part&#32;to&#32;another&#32;patch&#32;which&#32;add&#32;support&#32;MT8196.\r\n"
+ "Let&#32;this&#32;patch&#32;not&#32;related&#32;to&#32;specific&#32;SoC.\r\n"
+ "\r\n"
+ "Regards,\r\n"
+ "CK\r\n"
+ "\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp0_main[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLI_ASYNC0,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLO_ASYNC1,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp1_main[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLI_ASYNC21,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DVO0,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_ovl0_ext[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_OVL0_DLO_ASYNC6,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp0_ext[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLI_ASYNC1,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLO_ASYNC2,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp1_ext[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLI_ASYNC22,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DP_INTF0,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_ovl1_third[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_OVL1_DLO_ASYNC5,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp0_third[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLI_ASYNC8,\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLO_ASYNC3,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;unsigned&#32;int&#32;mt8196_mtk_ddp_disp1_third[]&#32;=&#32;{\r\n"
+ "&gt;&#32;+DDP_COMPONENT_DLI_ASYNC23,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt2701_mmsys_driver_data&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;.main_path&#32;=&#32;mt2701_mtk_ddp_main,\r\n"
+ "&gt;&#32;&#32;.main_len&#32;=&#32;ARRAY_SIZE(mt2701_mtk_ddp_main),\r\n"
+ "&gt;&#32;@@&#32;-327,6&#32;+375,67&#32;@@&#32;static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8195_vdosys1_driver_data&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;.min_height&#32;=&#32;1,\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_dispsys0_driver_data&#32;=&#32;{\r\n"
+ "&gt;&#32;+.main_path&#32;=&#32;mt8196_mtk_ddp_disp0_main,\r\n"
+ "&gt;&#32;+.main_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp0_main),\r\n"
+ "&gt;&#32;+.main_order&#32;=&#32;1,\r\n"
+ "&gt;&#32;+.ext_path&#32;=&#32;mt8196_mtk_ddp_disp0_ext,\r\n"
+ "&gt;&#32;+.ext_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp0_ext),\r\n"
+ "&gt;&#32;+.ext_order&#32;=&#32;1,\r\n"
+ "&gt;&#32;+.third_path&#32;=&#32;mt8196_mtk_ddp_disp0_third,\r\n"
+ "&gt;&#32;+.third_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp0_third),\r\n"
+ "&gt;&#32;+.third_order&#32;=&#32;1,\r\n"
+ "&gt;&#32;+.mmsys_id&#32;=&#32;DISPSYS0,\r\n"
+ "&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,\r\n"
+ "&gt;&#32;+.max_width&#32;=&#32;8191,\r\n"
+ "&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/\r\n"
+ "&gt;&#32;+.min_height&#32;=&#32;1,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_dispsys1_driver_data&#32;=&#32;{\r\n"
+ "&gt;&#32;+.main_path&#32;=&#32;mt8196_mtk_ddp_disp1_main,\r\n"
+ "&gt;&#32;+.main_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp1_main),\r\n"
+ "&gt;&#32;+.main_order&#32;=&#32;2,\r\n"
+ "&gt;&#32;+.ext_path&#32;=&#32;mt8196_mtk_ddp_disp1_ext,\r\n"
+ "&gt;&#32;+.ext_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp1_ext),\r\n"
+ "&gt;&#32;+.ext_order&#32;=&#32;2,\r\n"
+ "&gt;&#32;+.third_path&#32;=&#32;mt8196_mtk_ddp_disp1_third,\r\n"
+ "&gt;&#32;+.third_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_disp1_third),\r\n"
+ "&gt;&#32;+.conn_routes&#32;=&#32;mt8196_mtk_ddp_routes,\r\n"
+ "&gt;&#32;+.num_conn_routes&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_routes),\r\n"
+ "&gt;&#32;+.third_order&#32;=&#32;2,\r\n"
+ "&gt;&#32;+.mmsys_id&#32;=&#32;DISPSYS1,\r\n"
+ "&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,\r\n"
+ "&gt;&#32;+.max_width&#32;=&#32;8191,\r\n"
+ "&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/\r\n"
+ "&gt;&#32;+.min_height&#32;=&#32;1,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_ovlsys0_driver_data&#32;=&#32;{\r\n"
+ "&gt;&#32;+.main_path&#32;=&#32;mt8196_mtk_ddp_ovl0_main,\r\n"
+ "&gt;&#32;+.main_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_ovl0_main),\r\n"
+ "&gt;&#32;+.main_order&#32;=&#32;0,\r\n"
+ "&gt;&#32;+.ext_path&#32;=&#32;mt8196_mtk_ddp_ovl0_ext,\r\n"
+ "&gt;&#32;+.ext_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_ovl0_ext),\r\n"
+ "&gt;&#32;+.ext_order&#32;=&#32;0,\r\n"
+ "&gt;&#32;+.mmsys_id&#32;=&#32;OVLSYS0,\r\n"
+ "&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,\r\n"
+ "&gt;&#32;+.max_width&#32;=&#32;8191,\r\n"
+ "&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/\r\n"
+ "&gt;&#32;+.min_height&#32;=&#32;1,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+static&#32;const&#32;struct&#32;mtk_mmsys_driver_data&#32;mt8196_ovlsys1_driver_data&#32;=&#32;{\r\n"
+ "&gt;&#32;+.third_path&#32;=&#32;mt8196_mtk_ddp_ovl1_third,\r\n"
+ "&gt;&#32;+.third_len&#32;=&#32;ARRAY_SIZE(mt8196_mtk_ddp_ovl1_third),\r\n"
+ "&gt;&#32;+.third_order&#32;=&#32;0,\r\n"
+ "&gt;&#32;+.mmsys_id&#32;=&#32;OVLSYS1,\r\n"
+ "&gt;&#32;+.mmsys_dev_num&#32;=&#32;4,\r\n"
+ "&gt;&#32;+.max_width&#32;=&#32;8191,\r\n"
+ "&gt;&#32;+.min_width&#32;=&#32;2,&#32;/*&#32;2-pixel&#32;align&#32;when&#32;ethdr&#32;is&#32;bypassed&#32;*/\r\n"
+ "&gt;&#32;+.min_height&#32;=&#32;1,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_drm_of_ids[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt2701-mmsys&quot;,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;&amp;mt2701_mmsys_driver_data},\r\n"
+ "&gt;&#32;@@&#32;-354,6&#32;+463,14&#32;@@&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_drm_of_ids[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;&amp;mt8195_vdosys0_driver_data},\r\n"
+ "&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8195-vdosys1&quot;,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;&amp;mt8195_vdosys1_driver_data},\r\n"
+ "&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-dispsys0&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_dispsys0_driver_data},\r\n"
+ "&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-dispsys1&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_dispsys1_driver_data},\r\n"
+ "&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-ovlsys0&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_ovlsys0_driver_data},\r\n"
+ "&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-ovlsys1&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;.data&#32;=&#32;&amp;mt8196_ovlsys1_driver_data},\r\n"
+ "&gt;&#32;&#32;{&#32;}\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;MODULE_DEVICE_TABLE(of,&#32;mtk_drm_of_ids);\r\n"
+ "&gt;&#32;@@&#32;-368,7&#32;+485,7&#32;@@&#32;static&#32;int&#32;mtk_drm_match(struct&#32;device&#32;*dev,&#32;const&#32;void&#32;*data)\r\n"
+ "&gt;&#32;&#32;static&#32;bool&#32;mtk_drm_get_all_drm_priv(struct&#32;device&#32;*dev)\r\n"
+ "&gt;&#32;&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*drm_priv&#32;=&#32;dev_get_drvdata(dev);\r\n"
+ "&gt;&#32;-struct&#32;mtk_drm_private&#32;*all_drm_priv[MAX_CRTC];\r\n"
+ "&gt;&#32;+struct&#32;mtk_drm_private&#32;*all_drm_priv[MAX_MMSYS]&#32;=&#32;{NULL};\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_drm_private&#32;*temp_drm_priv;\r\n"
+ "&gt;&#32;&#32;struct&#32;device_node&#32;*phandle&#32;=&#32;dev-&gt;parent-&gt;of_node;\r\n"
+ "&gt;&#32;&#32;const&#32;struct&#32;of_device_id&#32;*of_id;\r\n"
+ "&gt;&#32;@@&#32;-395,23&#32;+512,18&#32;@@&#32;static&#32;bool&#32;mtk_drm_get_all_drm_priv(struct&#32;device&#32;*dev)\r\n"
+ "&gt;&#32;&#32;if&#32;(!temp_drm_priv)\r\n"
+ "&gt;&#32;&#32;continue;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-if&#32;(temp_drm_priv-&gt;data-&gt;main_len)\r\n"
+ "&gt;&#32;-all_drm_priv[CRTC_MAIN]&#32;=&#32;temp_drm_priv;\r\n"
+ "&gt;&#32;-else&#32;if&#32;(temp_drm_priv-&gt;data-&gt;ext_len)\r\n"
+ "&gt;&#32;-all_drm_priv[CRTC_EXT]&#32;=&#32;temp_drm_priv;\r\n"
+ "&gt;&#32;-else&#32;if&#32;(temp_drm_priv-&gt;data-&gt;third_len)\r\n"
+ "&gt;&#32;-all_drm_priv[CRTC_THIRD]&#32;=&#32;temp_drm_priv;\r\n"
+ "&gt;&#32;+all_drm_priv[temp_drm_priv-&gt;data-&gt;mmsys_id]&#32;=&#32;temp_drm_priv;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(temp_drm_priv-&gt;mtk_drm_bound)\r\n"
+ "&gt;&#32;&#32;cnt++;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-if&#32;(cnt&#32;==&#32;MAX_CRTC)\r\n"
+ "&gt;&#32;+if&#32;(cnt&#32;==&#32;temp_drm_priv-&gt;data-&gt;mmsys_dev_num)\r\n"
+ "&gt;&#32;&#32;break;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(drm_priv-&gt;data-&gt;mmsys_dev_num&#32;==&#32;cnt)&#32;{\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;cnt;&#32;i++)\r\n"
+ "&gt;&#32;-for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;cnt;&#32;j++)\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;MAX_MMSYS;&#32;j++)\r\n"
+ "&gt;&#32;&#32;all_drm_priv[j]-&gt;all_drm_private[i]&#32;=&#32;all_drm_priv[i];\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;return&#32;true;\r\n"
+ "&gt;&#32;@@&#32;-498,7&#32;+610,10&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)\r\n"
+ "&gt;&#32;&#32;drm-&gt;mode_config.funcs&#32;=&#32;&amp;mtk_drm_mode_config_funcs;\r\n"
+ "&gt;&#32;&#32;drm-&gt;mode_config.helper_private&#32;=&#32;&amp;mtk_drm_mode_config_helpers;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;+if&#32;(!private-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;drm-&gt;dev_private&#32;=&#32;private-&gt;all_drm_private[i];\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;component_bind_all(private-&gt;all_drm_private[i]-&gt;dev,&#32;drm);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret)\r\n"
+ "&gt;&#32;@@&#32;-521,8&#32;+636,10&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)\r\n"
+ "&gt;&#32;&#32;&#32;*&#32;&#32;&#32;&#32;third&#32;path.\r\n"
+ "&gt;&#32;&#32;&#32;*/\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_CRTC;&#32;i++)&#32;{\r\n"
+ "&gt;&#32;-for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;j++)&#32;{\r\n"
+ "&gt;&#32;+for&#32;(j&#32;=&#32;0;&#32;j&#32;&lt;&#32;MAX_MMSYS;&#32;j++)&#32;{\r\n"
+ "&gt;&#32;&#32;priv_n&#32;=&#32;private-&gt;all_drm_private[j];\r\n"
+ "&gt;&#32;+if&#32;(!priv_n)\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(priv_n-&gt;data-&gt;max_width)\r\n"
+ "&gt;&#32;&#32;drm-&gt;mode_config.max_width&#32;=&#32;priv_n-&gt;data-&gt;max_width;\r\n"
+ "&gt;&#32;@@&#32;-534,28&#32;+651,23&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)\r\n"
+ "&gt;&#32;&#32;drm-&gt;mode_config.min_height&#32;=&#32;priv_n-&gt;data-&gt;min_height;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;if&#32;(i&#32;==&#32;CRTC_MAIN&#32;&amp;&amp;&#32;priv_n-&gt;data-&gt;main_len)&#32;{\r\n"
+ "&gt;&#32;-ret&#32;=&#32;mtk_crtc_create(drm,&#32;priv_n-&gt;data-&gt;main_path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;main_len,&#32;j,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;conn_routes,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;num_conn_routes);\r\n"
+ "&gt;&#32;+ret&#32;=&#32;mtk_crtc_create(drm,&#32;CRTC_MAIN);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret)\r\n"
+ "&gt;&#32;&#32;goto&#32;err_component_unbind;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-continue;\r\n"
+ "&gt;&#32;+break;\r\n"
+ "&gt;&#32;&#32;}&#32;else&#32;if&#32;(i&#32;==&#32;CRTC_EXT&#32;&amp;&amp;&#32;priv_n-&gt;data-&gt;ext_len)&#32;{\r\n"
+ "&gt;&#32;-ret&#32;=&#32;mtk_crtc_create(drm,&#32;priv_n-&gt;data-&gt;ext_path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;ext_len,&#32;j,&#32;NULL,&#32;0);\r\n"
+ "&gt;&#32;+ret&#32;=&#32;mtk_crtc_create(drm,&#32;CRTC_EXT);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret)\r\n"
+ "&gt;&#32;&#32;goto&#32;err_component_unbind;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-continue;\r\n"
+ "&gt;&#32;+break;\r\n"
+ "&gt;&#32;&#32;}&#32;else&#32;if&#32;(i&#32;==&#32;CRTC_THIRD&#32;&amp;&amp;&#32;priv_n-&gt;data-&gt;third_len)&#32;{\r\n"
+ "&gt;&#32;-ret&#32;=&#32;mtk_crtc_create(drm,&#32;priv_n-&gt;data-&gt;third_path,\r\n"
+ "&gt;&#32;-&#32;&#32;&#32;&#32;&#32;&#32;priv_n-&gt;data-&gt;third_len,&#32;j,&#32;NULL,&#32;0);\r\n"
+ "&gt;&#32;+ret&#32;=&#32;mtk_crtc_create(drm,&#32;CRTC_THIRD);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret)\r\n"
+ "&gt;&#32;&#32;goto&#32;err_component_unbind;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-continue;\r\n"
+ "&gt;&#32;+break;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;@@&#32;-574,8&#32;+686,9&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)\r\n"
+ "&gt;&#32;&#32;goto&#32;err_component_unbind;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)\r\n"
+ "&gt;&#32;-private-&gt;all_drm_private[i]-&gt;dma_dev&#32;=&#32;dma_dev;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+private-&gt;all_drm_private[i]-&gt;dma_dev&#32;=&#32;dma_dev;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;/*\r\n"
+ "&gt;&#32;&#32;&#32;*&#32;Configure&#32;the&#32;DMA&#32;segment&#32;size&#32;to&#32;make&#32;sure&#32;we&#32;get&#32;contiguous&#32;IOVA\r\n"
+ "&gt;&#32;@@&#32;-593,11&#32;+706,13&#32;@@&#32;static&#32;int&#32;mtk_drm_kms_init(struct&#32;drm_device&#32;*drm)\r\n"
+ "&gt;&#32;&#32;return&#32;0;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;err_component_unbind:\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)\r\n"
+ "&gt;&#32;-component_unbind_all(private-&gt;all_drm_private[i]-&gt;dev,&#32;drm);\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+component_unbind_all(private-&gt;all_drm_private[i]-&gt;dev,&#32;drm);\r\n"
+ "&gt;&#32;&#32;put_mutex_dev:\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)\r\n"
+ "&gt;&#32;-put_device(private-&gt;all_drm_private[i]-&gt;mutex_dev);\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+put_device(private-&gt;all_drm_private[i]-&gt;mutex_dev);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;return&#32;ret;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;@@&#32;-661,6&#32;+776,19&#32;@@&#32;static&#32;int&#32;mtk_drm_bind(struct&#32;device&#32;*dev)\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;private-&gt;mutex_dev&#32;=&#32;&amp;pdev-&gt;dev;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+if&#32;(private-&gt;vdisp_ao_node)&#32;{\r\n"
+ "&gt;&#32;+pdev&#32;=&#32;of_find_device_by_node(private-&gt;vdisp_ao_node);\r\n"
+ "&gt;&#32;+if&#32;(!pdev)&#32;{\r\n"
+ "&gt;&#32;+dev_err(dev,&#32;&quot;Waiting&#32;for&#32;vdisp_ao&#32;device&#32;%pOF&#92;n&quot;,\r\n"
+ "&gt;&#32;+private-&gt;vdisp_ao_node);\r\n"
+ "&gt;&#32;+of_node_put(private-&gt;mutex_node);\r\n"
+ "&gt;&#32;+of_node_put(private-&gt;vdisp_ao_node);\r\n"
+ "&gt;&#32;+return&#32;-EPROBE_DEFER;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+private-&gt;vdisp_ao_dev&#32;=&#32;&amp;pdev-&gt;dev;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;private-&gt;mtk_drm_bound&#32;=&#32;true;\r\n"
+ "&gt;&#32;&#32;private-&gt;dev&#32;=&#32;dev;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;@@&#32;-673,8&#32;+801,9&#32;@@&#32;static&#32;int&#32;mtk_drm_bind(struct&#32;device&#32;*dev)\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;private-&gt;drm_master&#32;=&#32;true;\r\n"
+ "&gt;&#32;&#32;drm-&gt;dev_private&#32;=&#32;private;\r\n"
+ "&gt;&#32;-for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;private-&gt;data-&gt;mmsys_dev_num;&#32;i++)\r\n"
+ "&gt;&#32;-private-&gt;all_drm_private[i]-&gt;drm&#32;=&#32;drm;\r\n"
+ "&gt;&#32;+for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;MAX_MMSYS;&#32;i++)\r\n"
+ "&gt;&#32;+if&#32;(private-&gt;all_drm_private[i])\r\n"
+ "&gt;&#32;+private-&gt;all_drm_private[i]-&gt;drm&#32;=&#32;drm;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;mtk_drm_kms_init(drm);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret&#32;&lt;&#32;0)\r\n"
+ "&gt;&#32;@@&#32;-771,6&#32;+900,8&#32;@@&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_ddp_comp_dt_ids[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_MUTEX&#32;},\r\n"
+ "&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8195-disp-mutex&quot;,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_MUTEX&#32;},\r\n"
+ "&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-disp-mutex&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_MUTEX&#32;},\r\n"
+ "&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8173-disp-od&quot;,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DISP_OD&#32;},\r\n"
+ "&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt2701-disp-ovl&quot;,\r\n"
+ "&gt;&#32;@@&#32;-837,6&#32;+968,8&#32;@@&#32;static&#32;const&#32;struct&#32;of_device_id&#32;mtk_ddp_comp_dt_ids[]&#32;=&#32;{\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DSI&#32;},\r\n"
+ "&gt;&#32;&#32;{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8188-dsi&quot;,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_DSI&#32;},\r\n"
+ "&gt;&#32;+{&#32;.compatible&#32;=&#32;&quot;mediatek,mt8196-vdisp-ao&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;.data&#32;=&#32;(void&#32;*)MTK_VDISP_AO&#32;},\r\n"
+ "&gt;&#32;&#32;{&#32;}\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;@@&#32;-1111,7&#32;+1244,7&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)\r\n"
+ "&gt;&#32;&#32;private-&gt;data&#32;=&#32;mtk_drm_data;\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;-private-&gt;all_drm_private&#32;=&#32;devm_kmalloc_array(dev,&#32;private-&gt;data-&gt;mmsys_dev_num,\r\n"
+ "&gt;&#32;+private-&gt;all_drm_private&#32;=&#32;devm_kmalloc_array(dev,&#32;MAX_MMSYS,\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;sizeof(*private-&gt;all_drm_private),\r\n"
+ "&gt;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;GFP_KERNEL);\r\n"
+ "&gt;&#32;&#32;if&#32;(!private-&gt;all_drm_private)\r\n"
+ "&gt;&#32;@@&#32;-1163,6&#32;+1296,22&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)\r\n"
+ "&gt;&#32;&#32;component_match_add(dev,&#32;&amp;match,&#32;compare_dev,&#32;&amp;ovl_adaptor-&gt;dev);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+if&#32;(mtk_drm_find_mmsys_comp(private,&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2))&#32;{\r\n"
+ "&gt;&#32;+struct&#32;mtk_drm_ovlsys_private&#32;ovlsys_priv;\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;+ovlsys_priv.mmsys_dev&#32;=&#32;private-&gt;mmsys_dev;\r\n"
+ "&gt;&#32;+ovlsys_priv.use_path&#32;=\r\n"
+ "&gt;&#32;+mtk_drm_mmsys_comp_in_path(private,&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2);\r\n"
+ "&gt;&#32;+ovl_adaptor&#32;=&#32;platform_device_register_data(dev,&#32;&quot;mediatek-disp-ovlsys-adaptor&quot;,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;PLATFORM_DEVID_AUTO,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;(void&#32;*)&amp;ovlsys_priv,\r\n"
+ "&gt;&#32;+&#32;&#32;&#32;&#32;sizeof(struct&#32;mtk_drm_ovlsys_private));\r\n"
+ "&gt;&#32;+private-&gt;ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2].dev&#32;=&#32;&amp;ovl_adaptor-&gt;dev;\r\n"
+ "&gt;&#32;+mtk_ddp_comp_init(NULL,&#32;&amp;private-&gt;ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2],\r\n"
+ "&gt;&#32;+&#32;&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2);\r\n"
+ "&gt;&#32;+component_match_add(dev,&#32;&amp;match,&#32;compare_dev,&#32;&amp;ovl_adaptor-&gt;dev);\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;/*&#32;Iterate&#32;over&#32;sibling&#32;DISP&#32;function&#32;blocks&#32;*/\r\n"
+ "&gt;&#32;&#32;for_each_child_of_node(phandle-&gt;parent,&#32;node)&#32;{\r\n"
+ "&gt;&#32;&#32;enum&#32;mtk_ddp_comp_type&#32;comp_type;\r\n"
+ "&gt;&#32;@@&#32;-1189,6&#32;+1338,12&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)\r\n"
+ "&gt;&#32;&#32;continue;\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+if&#32;(comp_type&#32;==&#32;MTK_VDISP_AO)&#32;{\r\n"
+ "&gt;&#32;+private-&gt;vdisp_ao_node&#32;=&#32;of_node_get(node);\r\n"
+ "&gt;&#32;+dev_dbg(dev,&#32;&quot;get&#32;vdisp_ao&#32;node&quot;);\r\n"
+ "&gt;&#32;+continue;\r\n"
+ "&gt;&#32;+}\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;comp_id&#32;=&#32;mtk_ddp_comp_get_id(node,&#32;comp_type);\r\n"
+ "&gt;&#32;&#32;if&#32;(comp_id&#32;&lt;&#32;0)&#32;{\r\n"
+ "&gt;&#32;&#32;dev_warn(dev,&#32;&quot;Skipping&#32;unknown&#32;component&#32;%pOF&#92;n&quot;,\r\n"
+ "&gt;&#32;@@&#32;-1241,6&#32;+1396,9&#32;@@&#32;static&#32;int&#32;mtk_drm_probe(struct&#32;platform_device&#32;*pdev)\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;platform_set_drvdata(pdev,&#32;private);\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+if&#32;(!match)\r\n"
+ "&gt;&#32;+drm_of_component_match_add(dev,&#32;&amp;match,&#32;component_compare_of,&#32;NULL);\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;ret&#32;=&#32;component_master_add_with_match(dev,&#32;&amp;mtk_drm_ops,&#32;match);\r\n"
+ "&gt;&#32;&#32;if&#32;(ret)\r\n"
+ "&gt;&#32;&#32;goto&#32;err_pm;\r\n"
+ "&gt;&#32;@@&#32;-1264,6&#32;+1422,7&#32;@@&#32;static&#32;void&#32;mtk_drm_remove(struct&#32;platform_device&#32;*pdev)\r\n"
+ "&gt;&#32;&#32;component_master_del(&amp;pdev-&gt;dev,&#32;&amp;mtk_drm_ops);\r\n"
+ "&gt;&#32;&#32;pm_runtime_disable(&amp;pdev-&gt;dev);\r\n"
+ "&gt;&#32;&#32;of_node_put(private-&gt;mutex_node);\r\n"
+ "&gt;&#32;+of_node_put(private-&gt;vdisp_ao_node);\r\n"
+ "&gt;&#32;&#32;for&#32;(i&#32;=&#32;0;&#32;i&#32;&lt;&#32;DDP_COMPONENT_DRM_ID_MAX;&#32;i++)\r\n"
+ "&gt;&#32;&#32;of_node_put(private-&gt;comp_node[i]);\r\n"
+ "&gt;&#32;&#32;}\r\n"
+ "&gt;&#32;diff&#32;--git&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.h&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n"
+ "&gt;&#32;index&#32;aa17e743a1d0..36cfbfa30ff2&#32;100644\r\n"
+ "&gt;&#32;---&#32;a/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n"
+ "&gt;&#32;+++&#32;b/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n"
+ "&gt;&#32;@@&#32;-13,7&#32;+13,8&#32;@@\r\n"
+ "&gt;&#32;&#32;#define&#32;DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;(DDP_COMPONENT_ID_MAX&#32;+&#32;1)\r\n"
+ "&gt;&#32;&#32;#define&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;(DDP_COMPONENT_DRM_OVL_ADAPTOR&#32;+&#32;1)\r\n"
+ "&gt;&#32;&#32;#define&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0&#32;+&#32;1)\r\n"
+ "&gt;&#32;-#define&#32;DDP_COMPONENT_DRM_ID_MAX&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;+&#32;1)\r\n"
+ "&gt;&#32;+#define&#32;DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1&#32;+&#32;1)\r\n"
+ "&gt;&#32;+#define&#32;DDP_COMPONENT_DRM_ID_MAX&#32;(DDP_COMPONENT_DRM_OVLSYS_ADAPTOR2&#32;+&#32;1)\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;&#32;enum&#32;mtk_crtc_path&#32;{\r\n"
+ "&gt;&#32;&#32;CRTC_MAIN,\r\n"
+ "&gt;&#32;@@&#32;-22,6&#32;+23,14&#32;@@&#32;enum&#32;mtk_crtc_path&#32;{\r\n"
+ "&gt;&#32;&#32;MAX_CRTC,\r\n"
+ "&gt;&#32;&#32;};\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;+enum&#32;mtk_drm_mmsys&#32;{\r\n"
+ "&gt;&#32;+DISPSYS0,\r\n"
+ "&gt;&#32;+DISPSYS1,\r\n"
+ "&gt;&#32;+OVLSYS0,\r\n"
+ "&gt;&#32;+OVLSYS1,\r\n"
+ "&gt;&#32;+MAX_MMSYS,\r\n"
+ "&gt;&#32;+};\r\n"
+ "&gt;&#32;+\r\n"
+ "&gt;&#32;&#32;struct&#32;device;\r\n"
+ "&gt;&#32;&#32;struct&#32;device_node;\r\n"
+ "&gt;&#32;&#32;struct&#32;drm_crtc;\r\n"
+ "&gt;&#32;@@&#32;-38,10&#32;+47,13&#32;@@&#32;struct&#32;mtk_drm_route&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_mmsys_driver_data&#32;{\r\n"
+ "&gt;&#32;&#32;const&#32;unsigned&#32;int&#32;*main_path;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;main_len;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;main_order;\r\n"
+ "&gt;&#32;&#32;const&#32;unsigned&#32;int&#32;*ext_path;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;ext_len;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;ext_order;\r\n"
+ "&gt;&#32;&#32;const&#32;unsigned&#32;int&#32;*third_path;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;third_len;\r\n"
+ "&gt;&#32;+unsigned&#32;int&#32;third_order;\r\n"
+ "&gt;&#32;&#32;const&#32;struct&#32;mtk_drm_route&#32;*conn_routes;\r\n"
+ "&gt;&#32;&#32;unsigned&#32;int&#32;num_conn_routes;\r\n"
+ "&gt;&#32;&#32;\r\n"
+ "&gt;&#32;@@&#32;-63,6&#32;+75,8&#32;@@&#32;struct&#32;mtk_drm_private&#32;{\r\n"
+ "&gt;&#32;&#32;struct&#32;device_node&#32;*mutex_node;\r\n"
+ "&gt;&#32;&#32;struct&#32;device&#32;*mutex_dev;\r\n"
+ "&gt;&#32;&#32;struct&#32;device&#32;*mmsys_dev;\r\n"
+ "&gt;&#32;+struct&#32;device_node&#32;*vdisp_ao_node;\r\n"
+ "&gt;&#32;+struct&#32;device&#32;*vdisp_ao_dev;\r\n"
+ "&gt;&#32;&#32;struct&#32;device_node&#32;*comp_node[DDP_COMPONENT_DRM_ID_MAX];\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_ddp_comp&#32;ddp_comp[DDP_COMPONENT_DRM_ID_MAX];\r\n"
+ "&gt;&#32;&#32;struct&#32;mtk_mmsys_driver_data&#32;*data;\r\n"
+ "\r\n"
+ "\r\n"
+ "</pre>\r\n"
+ "</p></body></html><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice\r\n"
+ " ********************\r\n"
+ "The information contained in this e-mail message (including any \r\n"
+ "attachments) may be confidential, proprietary, privileged, or otherwise\r\n"
+ "exempt from disclosure under applicable laws. It is intended to be \r\n"
+ "conveyed only to the designated recipient(s). Any use, dissemination, \r\n"
+ "distribution, printing, retaining or copying of this e-mail (including its \r\n"
+ "attachments) by unintended recipient(s) is strictly prohibited and may \r\n"
+ "be unlawful. If you are not an intended recipient of this e-mail, or believe\r\n"
+ " \r\n"
+ "that you have received this e-mail in error, please notify the sender \r\n"
+ "immediately (by replying to this e-mail), delete any and all copies of \r\n"
+ "this e-mail (including any attachments) from your system, and do not\r\n"
+ "disclose the content of this e-mail to any other person. Thank you!\r\n"
+ </pre><!--}-->
 
-338a9cd4cf22274489ad53ff8076bcd47a3161b8d8f06beee2f989c95bd8ccb8
+be1e4980eca99f4b620e5735eb987dcd670e0c6a755a185aeddadbb99f16d60b

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.