Hi,
On Tue, Sep 24, 2019 at 02:40:54PM +0200, megous hlavni wrote:
On first run of the X server, only the black screen and the layer containing the cursor is visible. Switching to console and back corrects the situation.
I have dumped registers, and found out this:
(In both cases there are two enabled planes, plane 1 with zpos 0 and plane 3 with zpos 1).
- First Xorg run:
0x01101000 : 00000201 0x01101080 : 00000030
BLD_FILL_COLOR_CTL: (aka SUN8I_MIXER_BLEND_PIPE_CTL) P1_EN
BLD_CH_RTCTL: (aka SUN8I_MIXER_BLEND_ROUTE) P0_RTCTL channel0 P1_RTCTL channel3
- After switch to console and back to Xorg:
0x01101000 : 00000301 0x01101080 : 00000031
BLD_FILL_COLOR_CTL: P1_EN and P0_EN
BLD_CH_RTCTL: P0_RTCTL channel1 P1_RTCTL channel3
What happens is that sun8i_ui_layer_enable() function may disable blending pipes even if it is no longer assigned to its layer, because of incorrect state/zpos tracking in the driver.
In particular, layer 1 is configured to zpos 0 and thus uses pipe 0. When layer 3 is enabled by X server, sun8i_ui_layer_enable() will get called with old_zpos=0 zpos=1, which will lead to disabling of pipe 0.
In general this issue can happen to any layer during enable or zpos changes on multiple layers at once.
To correct this we now pass previous enabled/disabled state of the layer, and pass real previous zpos of the layer to sun8i_ui_layer_enable() and rework the sun8i_ui_layer_enable() function to react to the state changes correctly. In order to not complicate the atomic_disable callback with all of the above changes, we simply remove it and implement all the chanes as part of atomic_update, which also reduces the code duplication.
I'm not even sure why we need that old state. Can't we just reset completely the whole thing and do the configuration all over again?
That would be nice from a dev standpoint if we can get a complete state for all planes at once from DRM core, but how? DRM helper gives callbacks for updating individual planes with prev and new state. These individual layer change notifications don't map nicely to how pipes are represented in the mixer registers.
If anyone wants to pursue this further, feel free to. I'm not planning to pursue this fix further, at the moment.
regards, o.