diff options
author | Xianzhong <xianzhong.li@nxp.com> | 2017-03-10 17:20:43 +0800 |
---|---|---|
committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
commit | 1336320dead835faa96c418030d370fd7a7662c0 (patch) | |
tree | 987e286f8deb72cad12740c87958c703463b1ded /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | |
parent | de43b77c9626da39239ca18a5ce2e7900b7a792f (diff) |
MGS-2721: gpu: integrate 6.2.2 early release driver
integrated critical gpu bug-fixing for i.MX6/i.MX7ULP/i.MX8,
solved gpu hang and khronos conformance issues for below features:
- OpenGL ES11/ES20/ES30/ES31/ES32,
- OpenCL 1.1/1.2FP,
- OpenVX 1.0.1
- Vulkan 1.0
- OpenVG 1.1
Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
Diffstat (limited to 'drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c')
-rw-r--r-- | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | 104 |
1 files changed, 54 insertions, 50 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c index 147b0ff908ad..e3b403a77c2d 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c @@ -2,7 +2,7 @@ * * The MIT License (MIT) * -* Copyright (c) 2014 - 2016 Vivante Corporation +* Copyright (c) 2014 - 2017 Vivante Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -26,7 +26,7 @@ * * The GPL License (GPL) * -* Copyright (C) 2014 - 2016 Vivante Corporation +* Copyright (C) 2014 - 2017 Vivante Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -570,8 +570,6 @@ gckKERNEL_Construct( : gcdGPU_TIMEOUT ; - /* Initialize virtual command buffer. */ - /* TODO: Remove platform limitation after porting. */ #if (defined(LINUX) || defined(__QNXNTO__)) && !defined(EMULATOR) && !gcdALLOC_CMD_FROM_RESERVE kernel->virtualCommandBuffer = gcvTRUE; #else @@ -626,7 +624,6 @@ gckKERNEL_Construct( /* Construct gckEVENT for BLT. */ gcmkONERROR(gckEVENT_Construct(kernel, &kernel->asyncEvent)); - /* TODO: Need a decent interface to connect event and command object. */ kernel->asyncEvent->asyncCommand = kernel->asyncCommand; kernel->command->asyncCommand = kernel->asyncCommand; @@ -841,20 +838,6 @@ gckKERNEL_Destroy( else #endif { - if (Kernel->mmu) - { -#if gcdSHARED_PAGETABLE - /* Destroy the gckMMU object. */ - gcmkVERIFY_OK(gckMMU_Destroy(Kernel->mmu)); -#else - if (Kernel->mmu->hardware == Kernel->hardware) - { - /* Destroy the gckMMU object. */ - gcmkVERIFY_OK(gckMMU_Destroy(Kernel->mmu)); - } -#endif - } - if (Kernel->command) { /* Destroy the gckCOMMNAND object. */ @@ -877,6 +860,22 @@ gckKERNEL_Destroy( gcmkVERIFY_OK(gckEVENT_Destroy(Kernel->eventObj)); } + gcmkVERIFY_OK(gckHARDWARE_DestroyFunctions(Kernel->hardware)); + + if (Kernel->mmu) + { +#if gcdSHARED_PAGETABLE + /* Destroy the gckMMU object. */ + gcmkVERIFY_OK(gckMMU_Destroy(Kernel->mmu)); +#else + if (Kernel->mmu->hardware == Kernel->hardware) + { + /* Destroy the gckMMU object. */ + gcmkVERIFY_OK(gckMMU_Destroy(Kernel->mmu)); + } +#endif + } + if (Kernel->hardware) { /* Destroy the gckHARDWARE object. */ @@ -2802,11 +2801,6 @@ gckKERNEL_Dispatch( &Interface->u.Compose)); break; - case gcvHAL_SET_TIMEOUT: - /* set timeOut value from user */ - gckKERNEL_SetTimeOut(Kernel, Interface->u.SetTimeOut.timeOut); - break; - case gcvHAL_GET_FRAME_INFO: gcmkONERROR(gckHARDWARE_GetFrameInfo( Kernel->hardware, @@ -4067,19 +4061,6 @@ OnError: return status; } -void -gckKERNEL_SetTimeOut( - IN gckKERNEL Kernel, - IN gctUINT32 timeOut - ) -{ - gcmkHEADER_ARG("Kernel=0x%x timeOut=%d", Kernel, timeOut); -#if gcdGPU_TIMEOUT - Kernel->timeOut = timeOut; -#endif - gcmkFOOTER_NO(); -} - gceSTATUS gckKERNEL_AllocateVirtualCommandBuffer( IN gckKERNEL Kernel, @@ -4221,7 +4202,7 @@ gckKERNEL_AllocateVirtualMemory( gctSIZE_T pageCount; gctSIZE_T bytes = *Bytes; gckVIRTUAL_BUFFER_PTR buffer = gcvNULL; - gckMMU mmu; + gckMMU mmu = gcvNULL; gctUINT32 flag = gcvALLOC_FLAG_NON_CONTIGUOUS; gcmkHEADER_ARG("Os=0x%X InUserSpace=%d *Bytes=%lu", @@ -4371,13 +4352,8 @@ gckKERNEL_AllocateVirtualMemory( OnError: if (buffer && buffer->gpuAddress) { -#if gcdPROCESS_ADDRESS_SPACE gcmkVERIFY_OK( gckMMU_FreePages(mmu, gcvFALSE, buffer->gpuAddress, buffer->pageTable, buffer->pageCount)); -#else - gcmkVERIFY_OK( - gckMMU_FreePages(Kernel->mmu, gcvFALSE, buffer->gpuAddress, buffer->pageTable, buffer->pageCount)); -#endif } if (NonPaged && buffer->physical) @@ -5552,7 +5528,7 @@ gckFENCE_Create( gctSIZE_T pageSize = 4096; gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsFENCE), (gctPOINTER *)&fence)); - + gcmkONERROR(gckOS_ZeroMemory(fence, gcmSIZEOF(gcsFENCE))); gcmkONERROR(gckOS_CreateMutex(Os, (gctPOINTER *)&fence->mutex)); fence->kernel = Kernel; @@ -5630,12 +5606,10 @@ gckFENCE_Destory( #if USE_KERNEL_VIRTUAL_BUFFERS if (Fence->kernel->virtualCommandBuffer) { - gckVIRTUAL_COMMAND_BUFFER_PTR buffer = (gckVIRTUAL_COMMAND_BUFFER_PTR)Fence->physical; - gcmkVERIFY_OK(gckKERNEL_FreeVirtualMemory( Fence->physical, Fence->logical, - gcvTRUE + gcvFALSE )); } else @@ -5762,7 +5736,7 @@ gckDEVICE_AddCore( gcmkASSERT(Device->coreNum < gcvCORE_COUNT); - if (Core >= gcvCORE_MAJOR && Core <= gcvCORE_3D3) + if (Core >= gcvCORE_MAJOR && Core <= gcvCORE_3D_MAX) { /* Chip ID is only used for 3D cores. */ if (ChipID == gcvCHIP_ID_DEFAULT) @@ -5876,10 +5850,10 @@ gckDEVICE_Destroy( IN gckDEVICE Device ) { - gctUINT i; + gctINT i; gcsCORE_INFO * info = Device->coreInfoArray; - for (i = 0; i < Device->coreNum; i++) + for (i = Device->coreNum - 1; i >= 0 ; i--) { if (info[i].kernel != gcvNULL) { @@ -5901,6 +5875,32 @@ gckDEVICE_Destroy( return gcvSTATUS_OK; } +static gceSTATUS +gckDEVICE_SetTimeOut( + IN gckDEVICE Device, + IN gcsHAL_INTERFACE_PTR Interface + ) +{ +#if gcdGPU_TIMEOUT + gckKERNEL kernel; + gctUINT i; + gceHARDWARE_TYPE type = Interface->hardwareType; + gcsCORE_LIST *coreList; + + coreList = &Device->map[type]; + + for (i = 0; i < coreList->num; i++) + { + kernel = coreList->kernels[i]; + + kernel->timeOut = Interface->u.SetTimeOut.timeOut; + } +#endif + + return gcvSTATUS_OK; +} + + gceSTATUS gckDEVICE_Dispatch( IN gckDEVICE Device, @@ -5922,6 +5922,10 @@ gckDEVICE_Dispatch( status = gckDEVICE_Version(Device, Interface); break; + case gcvHAL_SET_TIMEOUT: + status = gckDEVICE_SetTimeOut(Device, Interface); + break; + default: status = gcvSTATUS_NOT_SUPPORTED; break; |