Re: [BUG] dw-mipi-dsi-rockchip display corruption with dsi panel

From: Heiko Stübner
Date: Tue Aug 10 2021 - 19:11:41 EST


Hi Peter,

Am Mittwoch, 11. August 2021, 00:31:24 CEST schrieb Peter Geis:
> Good Evening,
>
> I've been attempting to light off the feiyang fy07024di26a30d panel on
> the rockpro64. This is the official panel from the Pine64 store.
> I've confirmed it works with the downstream kernel on both the rk3399
> and rk3566, but on the mainline driver the display is partially
> corrupted (see attached photo: [1]).
>
> As you can see, the left half of the display is fine, but the right half
> of the display is corrupted with the pixels smearing horizontally.
>
> I saw when the panel was added, some additional code was added to
> handle burst mode in the sun6_mipi_dsi driver [2].
> I've seen that the dw-mipi-dsi driver appears to already support burst
> mode and I can't find anything out of place there.
> I also haven't had much success finding anything obviously different in
> the downstream driver vs the upstream driver that would explain this.
>
> Attached below is the in-progress dts changes for an example of how the
> panel is plugged in.

is that really a dual-dsi panel needing two dsi controllers to drive it?

With that tiny resultion of 1024x600 I definitly wouldn't expect this,
in contrast to say the 2048x1536 dual-dsi displays used in the
Gru-Scarlet ChromeOS tablets.

So maybe just drop the 2nd dsi controller connection in a first step?
Because I really don't think that is the case on the hardware.

The dual-dsi setup means that you have one vop supplying half of its
display data to each of the 2 involved dsi controllers. And you're missing
in fact half of your display data.


Heiko



> I admit, I have little understanding of the mipi-dsi internal workings,
> so I'm reaching out to the experts on how to correct this.
>
> Thank you for your time,
> Peter Geis
>
> [1] https://photos.app.goo.gl/LBA9M2WcweGaEb4cA
> [2] https://patchwork.kernel.org/project/linux-arm-kernel/cover/20181116163916.29621-1-jagan@xxxxxxxxxxxxxxxxxxxx/
>
> diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> index 687a5afa5d2c..af55a30297ae 100644
> --- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> +++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> @@ -20,6 +20,13 @@ chosen {
> stdout-path = "serial2:1500000n8";
> };
>
> + backlight: backlight {
> + compatible = "pwm-backlight";
> + pwms = <&pwm0 0 1000000 0>;
> + brightness-levels = <0 4 8 16 32 64 128 255>;
> + default-brightness-level = <128>;
> + };
> +
> clkin_gmac: external-gmac-clock {
> compatible = "fixed-clock";
> clock-frequency = <125000000>;
> @@ -69,7 +76,7 @@ diy_led: led-1 {
>
> fan: pwm-fan {
> compatible = "pwm-fan";
> - cooling-levels = <0 150 200 255>;
> + cooling-levels = <0 100 150 255>;
> #cooling-cells = <2>;
> fan-supply = <&vcc12v_dcin>;
> pwms = <&pwm1 0 50000 0>;
> @@ -220,6 +227,16 @@ vdd_log: vdd-log {
> regulator-max-microvolt = <1700000>;
> vin-supply = <&vcc5v0_sys>;
> };
> +
> + avdd: avdd {
> + compatible = "regulator-fixed";
> + regulator-name = "avdd";
> + regulator-always-on;
> + regulator-boot-on;
> + regulator-min-microvolt = <11000000>;
> + regulator-max-microvolt = <11000000>;
> + vin-supply = <&vcc3v3_s0>;
> + };
> };
>
> &cpu_l0 {
> @@ -428,8 +445,8 @@ regulator-state-mem {
>
> vcc3v0_touch: LDO_REG2 {
> regulator-name = "vcc3v0_touch";
> - regulator-always-on;
> - regulator-boot-on;
> +// regulator-always-on;
> +// regulator-boot-on;
> regulator-min-microvolt = <3000000>;
> regulator-max-microvolt = <3000000>;
> regulator-state-mem {
> @@ -518,8 +535,8 @@ regulator-state-mem {
>
> vcc3v3_s0: SWITCH_REG2 {
> regulator-name = "vcc3v3_s0";
> - regulator-always-on;
> - regulator-boot-on;
> +// regulator-always-on;
> +// regulator-boot-on;
> regulator-state-mem {
> regulator-off-in-suspend;
> };
> @@ -593,6 +610,19 @@ fusb0: typec-portc@22 {
> vbus-supply = <&vcc5v0_typec>;
> status = "okay";
> };
> +
> + touch: touchscreen@5d {
> + compatible = "goodix,gt911";
> + reg = <0x5d>;
> + AVDD28-supply = <&vcc3v0_touch>;
> + VDDIO-supply = <&vcc3v0_touch>;
> + interrupt-parent = <&gpio4>;
> + interrupts = <RK_PD5 IRQ_TYPE_EDGE_FALLING>;
> + irq-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>;
> + reset-gpios = <&gpio4 RK_PD6 GPIO_ACTIVE_HIGH>;
> +// touchscreen-inverted-x;
> +// touchscreen-inverted-y;
> + };
> };
>
> &i2s0 {
> @@ -628,6 +658,88 @@ &io_domains {
> gpio1830-supply = <&vcc_3v0>;
> };
>
> +&mipi_dsi {
> + status = "okay";
> + clock-master;
> +
> + ports {
> + mipi_out: port@1 {
> + reg = <1>;
> +
> + mipi_out_panel: endpoint {
> + remote-endpoint = <&mipi_in_panel>;
> + };
> + };
> + };
> +
> + mipi_panel: panel@0 {
> + compatible = "feiyang,fy07024di26a30d";
> + reg = <0>;
> + backlight = <&backlight>;
> + reset-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
> +// enable-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
> + width-mm = <154>;
> + height-mm = <86>;
> + rotation = <0>;
> + avdd-supply = <&avdd>;
> + dvdd-supply = <&vcc3v3_s0>;
> +
> + display-timings {
> + native-mode = <&timing0>;
> + timing0: timing0 {
> + clock-frequency = <50000000>;
> + hactive = <1024>;
> + vactive = <600>;
> + hfront-porch = <160>;
> + hback-porch = <160>;
> + hsync-len = <10>;
> + vback-porch = <23>;
> + vfront-porch = <12>;
> + vsync-len = <1>;
> + hsync-active = <0>;
> + vsync-active = <0>;
> + pixelclk-active = <0>;
> + de-active = <0>;
> + };
> + };
> +
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + port@0 {
> + reg = <0>;
> +
> + mipi_in_panel: endpoint {
> + remote-endpoint = <&mipi_out_panel>;
> + };
> + };
> +
> + port@1 {
> + reg = <1>;
> +
> + mipi1_in_panel: endpoint@1 {
> + remote-endpoint = <&mipi1_out_panel>;
> + };
> + };
> + };
> + };
> +};
> +
> +&mipi_dsi1 {
> + status = "okay";
> +
> + ports {
> + mipi1_out: port@1 {
> + reg = <1>;
> +
> + mipi1_out_panel: endpoint {
> + remote-endpoint = <&mipi1_in_panel>;
> + };
> + };
> + };
> +};
> +
> &pcie0 {
> ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
> num-lanes = <4>;
>