mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-23 09:42:19 +03:00
Occasionally, there are cases where the BO is being freed before the display has been updated to use the next BO. If the SMMU is enabled this causes SMMU faults to occur. This problem occurs when the vertical blanking interrupt occurs at the same time the BO used by the display is updated. In this case, the interrupt handler, tegra_dc_irq(), is called to handle the vertial blanking interrupt, which in turn calls drm_crtc_handle_vblank() to discard the previous BO. However, the programming of the display controller did not actually complete before the vertical blanking and the display is still using the previous BO. Hence, the display continues to use the prevoius BO which is then freed. Fix this by disabling the vertical blanking interrupt during the time where the display is updated and then in the Tegra interrupt handler ensure that we only handle interrupts that are currently enabled. Finally, before calling drm_crtc_handle_vblank() in the interrupt handler, check that the programming of the display controller has completed and it is safe to release the BO. JIRA LS-128 Change-Id: I1c9523f2b0a3ea406d651c2d1988e452d412e204 Signed-off-by: Jon Hunter <jonathanh@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2660852 Reviewed-by: Thierry Reding <treding@nvidia.com> Reviewed-by: Mikko Perttunen <mperttunen@nvidia.com> Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com> GVS: Gerrit_Virtual_Submit