summaryrefslogtreecommitdiff
path: root/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
diff options
context:
space:
mode:
authorXianzhong <xianzhong.li@nxp.com>2017-03-10 17:20:43 +0800
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit1336320dead835faa96c418030d370fd7a7662c0 (patch)
tree987e286f8deb72cad12740c87958c703463b1ded /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
parentde43b77c9626da39239ca18a5ce2e7900b7a792f (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.c104
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;