From 75a01115a7f53d728e6abeb7b205676cc2a50bc0 Mon Sep 17 00:00:00 2001 From: Xianzhong Date: Sun, 9 Aug 2015 17:36:27 +0800 Subject: MGS-925 [#1818] fix GPU kernel crash with 2D OpenVG OpenVG cannot go to the GPU MMU virtual mapping code, This is regression from MGS-896 fix with the coding flaw, The fix is to keep OpenVG check path as original code. Date: Aug 09, 2015 Signed-off-by: Xianzhong (cherry picked from commit 112eb89c301d35fdfecb245e86f07b3fa6fec8fa) --- .../hal/kernel/gc_hal_kernel_video_memory.c | 56 +++++++++++----------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c index e0920e594893..16fd872b312b 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c @@ -1289,43 +1289,45 @@ _NeedVirtualMapping( } else #endif - /* Convert logical address into a physical address. */ - gcmkONERROR(gckOS_UserLogicalToPhysical( - Kernel->os, Node->Virtual.logical, &phys - )); + { + /* Convert logical address into a physical address. */ + gcmkONERROR(gckOS_UserLogicalToPhysical( + Kernel->os, Node->Virtual.logical, &phys + )); - gcmkSAFECASTPHYSADDRT(address, phys); + gcmkSAFECASTPHYSADDRT(address, phys); - gcmkONERROR(gckOS_GetBaseAddress(Kernel->os, &baseAddress)); + gcmkONERROR(gckOS_GetBaseAddress(Kernel->os, &baseAddress)); - gcmkASSERT(phys >= baseAddress); + gcmkASSERT(phys >= baseAddress); - /* Subtract baseAddress to get a GPU address used for programming. */ - address -= baseAddress; + /* Subtract baseAddress to get a GPU address used for programming. */ + address -= baseAddress; - /* If part of region is belong to gcvPOOL_VIRTUAL, - ** whole region has to be mapped. */ + /* If part of region is belong to gcvPOOL_VIRTUAL, + ** whole region has to be mapped. */ - gcmkSAFECASTSIZET(bytes, Node->Virtual.bytes); + gcmkSAFECASTSIZET(bytes, Node->Virtual.bytes); - end = address + bytes - 1; + end = address + bytes - 1; - if (!gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_MMU)) - { - gcmkONERROR(gckHARDWARE_SplitMemory( - Kernel->hardware, end, &pool, &offset - )); + if (!gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_MMU)) + { + gcmkONERROR(gckHARDWARE_SplitMemory( + Kernel->hardware, end, &pool, &offset + )); - *NeedMapping = (pool == gcvPOOL_VIRTUAL); - } - else - { - /* TODO: Check whether physical address in flat mapping. */ - gctUINT32 dynamicMappingStart = Kernel->mmu->dynamicMappingStart; - if( end < (dynamicMappingStart << gcdMMU_MTLB_SHIFT)) - *NeedMapping = gcvFALSE; + *NeedMapping = (pool == gcvPOOL_VIRTUAL); + } else - *NeedMapping = gcvTRUE; + { + /* TODO: Check whether physical address in flat mapping. */ + gctUINT32 dynamicMappingStart = Kernel->mmu->dynamicMappingStart; + if( end < (dynamicMappingStart << gcdMMU_MTLB_SHIFT)) + *NeedMapping = gcvFALSE; + else + *NeedMapping = gcvTRUE; + } } } else -- cgit v1.2.3