From 791ea1313a069606ee1ab124bdf6a6984e661a71 Mon Sep 17 00:00:00 2001 From: Wujian sun Date: Thu, 7 Nov 2019 17:20:50 +0800 Subject: MGS-5261 [#imx-1771] Both vdk ES20 test and ctrl c stress test met GPU hang on G2D compositor For 8MM_EVK maybe power off is failed,the GPU still has been power on. so we need to check the mmu enable flag to see if we need to dummy draw Signed-off-by: Wujian sun --- .../hal/kernel/arch/gc_hal_kernel_hardware.c | 45 ++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'drivers/mxc/gpu-viv') diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c index adaf7f22661c..432b0d5c704a 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c +++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c @@ -11144,6 +11144,48 @@ gckHARDWARE_SetPowerManagementState( if (flag & gcvPOWER_FLAG_INITIALIZE) { + gctBOOL hwMmuDisabled = gcvTRUE; + + /* VIV for 8MM_EVK, maybe power off is failed, the GPU still has been power on, + so we need to check the mmu enable flag to see if we need to dummy draw */ + if (_IsHardwareMatch(Hardware, gcv600, 0x4653)) + { + if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL) + { + gctUINT32 regMmuCtrl = 0; + gcmkONERROR(gckOS_ReadRegisterEx( + Hardware->os, + Hardware->core, + 0x00388, + ®MmuCtrl + )); + + hwMmuDisabled = ((((((gctUINT32) (regMmuCtrl)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0x1) + ? gcvFALSE + : gcvTRUE; + } + else + { + gctUINT32 regMmuCtrl = 0; + + gcmkONERROR(gckOS_ReadRegisterEx( + Hardware->os, + Hardware->core, + 0x0018C, + ®MmuCtrl + )); + + hwMmuDisabled = ((((((gctUINT32) (regMmuCtrl)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0x1) + ? gcvFALSE + : gcvTRUE; + } + } + + if(hwMmuDisabled) + { + command->dummyDraw = gcvTRUE; + } + /* Initialize hardware. */ gcmkONERROR(gckHARDWARE_InitializeHardware(Hardware)); @@ -11153,9 +11195,6 @@ gckHARDWARE_SetPowerManagementState( /* Force the command queue to reload the next context. */ command->currContext = gcvNULL; - - /* Trigger a possible dummy draw. */ - command->dummyDraw = gcvTRUE; } /* Get time until initialized. */ -- cgit v1.2.3