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

From: Peter Geis
Date: Tue Aug 10 2021 - 19:47:06 EST


On Tue, Aug 10, 2021 at 7:11 PM Heiko Stübner <heiko@xxxxxxxxx> wrote:
>
> 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.

Thanks, that was it.
I had tried removing the link previously, but I had to also disable
that controller altogether or the vop fails to probe silently.

That is a common issue I ran into when getting this all set up,
anything failed to probe for the dsi panel the vop just silently dies
in the background and graphics fail everywhere.

>
>
> 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>;
> >
>
>
>
>