overview:
0x01. 个人理解,全志H3的display engine和mali-400 mp2 GPU之间不是关联的,而是各自独立工作的,GPU负责渲染任务,DE负责显示image layer,用户空间的开源lima驱动实现GPU的调用,然后通过drm驱动将数据传输到de进行显示,两者之间是完全依赖软件层进行连接的。
0x02. 如果需要实现GPU加速,首先需要drm驱动的支持,drm实际上驱动的是全志H3的display engine(DE),安装成功drm驱动后,会出现drm设备 /dev/dri/card0(注意:不是card0 + renderD128),成功加载lima驱动(Lima驱动支持mali-400和mali-450)后会出现/dev/dri/card1 和/dev/dri/renderD128 这两个设备,此时只需要安装支持lima驱动的用户空间opengl库就可以实现GPU加速了,如较新版本的mesa库,之后可通过安装kmscube进行测试,H3渲染帧率在50-60fps,执行后会打印openGL库信息,注意看渲染器栏,正常是Mali-400,如果是llvm…,则GPU驱动或opengl库有问题,导致采用的软件渲染。
0x01 传输链
1. DE传输到mixer0 ,mixer0 传输到 tcon0。
de: display-engine {
compatible = "allwinner,sun8i-h3-display-engine";
allwinner,pipelines = <&mixer0>;
status = "okay";
};
mixer0: mixer@1100000 {
compatible = "allwinner,sun8i-h3-de2-mixer-0";
reg = <0x01100000 0x100000>;
clocks = <&display_clocks CLK_BUS_MIXER0>,<&display_clocks CLK_MIXER0>;
clock-names = "bus","mod";
resets = <&display_clocks RST_MIXER0>;
ports {
#address-cells = <1>;
#size-cells = <0>;
mixer0_out: port@1 {
reg = <1>;
mixer0_out_tcon0: endpoint {
remote-endpoint = <&tcon0_in_mixer0>;
};
};
};
};
2. tcon0传输到hdmi。
tcon0: lcd-controller@1c0c000 {
compatible = "allwinner,sun8i-h3-tcon-tv",
"allwinner,sun8i-a83t-tcon-tv";
reg = <0x01c0c000 0x1000>;
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_TCON0>, <&ccu CLK_TCON0>;
clock-names = "ahb", "tcon-ch1";
resets = <&ccu RST_BUS_TCON0>;
reset-names = "lcd";
ports {
#address-cells = <1>;
#size-cells = <0>;
tcon0_in: port@0 {
reg = <0>;
tcon0_in_mixer0: endpoint {
remote-endpoint = <&mixer0_out_tcon0>;
};
};
tcon0_out: port@1 {
#address-cells = <1>;
#size-cells = <0>;
reg = <1>;
tcon0_out_hdmi: endpoint@1 {
reg = <1>;
remote-endpoint = <&hdmi_in_tcon0>;
};
};
};
};
2. hdmi传输到connector(接口)。
hdmi: hdmi@1ee0000 {
compatible = "allwinner,sun8i-h3-dw-hdmi","allwinner,sun8i-a83t-dw-hdmi";
reg = <0x01ee0000 0x10000>;
reg-io-width = <1>;
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_HDMI>, <&ccu CLK_HDMI_DDC>,<&ccu CLK_HDMI>, <&rtc 0>;
clock-names = "iahb", "isfr", "tmds", "cec";
resets = <&ccu RST_BUS_HDMI1>;
reset-names = "ctrl";
phys = <&hdmi_phy>;
phy-names = "phy";
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
hdmi_in: port@0 {
reg = <0>;
hdmi_in_tcon0: endpoint {
remote-endpoint = <&tcon0_out_hdmi>;
};
};
hdmi_out: port@1 {
reg = <1>;
remote-endpoint = <&hdmi_con_in>;
};
};
};
connector {
compatible = "hdmi-connector";
type = "a";
port {
hdmi_con_in: endpoint {
remote-endpoint = <&hdmi_out_con>;
};
};
};