LF-3652 gpu-viv: Integrate 6.4.3.p2 20210416 release
authorXianzhong <xianzhong.li@nxp.com>
Wed, 21 Apr 2021 10:15:22 +0000 (18:15 +0800)
committerXianzhong <xianzhong.li@nxp.com>
Wed, 21 Apr 2021 10:48:05 +0000 (18:48 +0800)
This version includes more bug-fixings for 8ULP GPU

Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
18 files changed:
drivers/mxc/gpu-viv/Kbuild
drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_func_flop_reset.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h
drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c

index afe6b54..9d0cf64 100644 (file)
@@ -324,7 +324,6 @@ endif
 EXTRA_CFLAGS += -DHOST=\"$(HOST)\"
 
 EXTRA_CFLAGS += -DgcdENABLE_TRUST_APPLICATION=1
-EXTRA_CFLAGS += -DgcdSYS_HAS_SG_CHAIN=1
 
 obj-$(CONFIG_MXC_GPU_VIV) = $(MODULE_NAME).o
 
index b78d87c..a31808d 100644 (file)
@@ -4695,18 +4695,25 @@ gckHARDWARE_Notify(
     )
 {
     gceSTATUS status;
+    gceEVENT_FAULT fault;
+
     gcmkHEADER_ARG("Hardware=%p", Hardware);
 
     /* Handle events. */
-    status = gckEVENT_Notify(Hardware->kernel->eventObj, 0);
+    status = gckEVENT_Notify(Hardware->kernel->eventObj, 0, &fault);
 
     if (Hardware->asyncFE)
     {
-        status = gckEVENT_Notify(Hardware->kernel->asyncEvent, 0);
+        status = gckEVENT_Notify(Hardware->kernel->asyncEvent, 0, &fault);
+    }
+
+    if (fault & gcvEVENT_BUS_ERROR_FAULT)
+    {
+        status = gckKERNEL_Recovery(Hardware->kernel);
     }
 
-     gcmkFOOTER();
-     return status;
+    gcmkFOOTER();
+    return status;
 }
 
 /*******************************************************************************
@@ -11960,7 +11967,7 @@ gckHARDWARE_Reset(
     /* Jump to address into which GPU should run if it doesn't stuck. */
     if (Hardware->wlFE)
     {
-        gcmkONERROR(gckWLFE_Execute(Hardware, Hardware->kernel->restoreAddress, 16));
+        gcmkONERROR(gckWLFE_Execute(Hardware, Hardware->lastWaitLink, 16));
     }
 
     gcmkPRINT("[galcore]: recovery done");
index 6d57034..14d5a33 100644 (file)
@@ -6898,6 +6898,7 @@ gckHARDWARE_ResetFlopWithTP(
         gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
     }
 
+
     dataType = 0x0;
 
     gcmkONERROR(_GetNNDataSize(dataType, &itemBytes));
index 81a8625..697cc68 100644 (file)
@@ -198,8 +198,12 @@ _MonitorTimerFunction(
             &pendingMask
             ));
 
-        gcmkPRINT("[galcore]: Number of pending interrupt is %d mask is %x",
-                  pendingInterrupt, pendingMask);
+        gcmkTRACE_N(
+            gcvLEVEL_ERROR,
+            gcmSIZEOF(pendingInterrupt) + gcmSIZEOF(pendingMask),
+            "[galcore]: Number of pending interrupt is %d mask is %x",
+            pendingInterrupt, pendingMask
+            );
 
         while (i--)
         {
@@ -3984,6 +3988,8 @@ gckKERNEL_Recovery(
     hardware = Kernel->hardware;
     gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
 
+    gckOS_AcquireMutex(Kernel->os, Kernel->device->commitMutex, gcdRECOVERY_FORCE_TIMEOUT);
+
     if (Kernel->stuckDump == gcvSTUCK_DUMP_NONE)
     {
         gcmkPRINT("[galcore]: GPU[%d] hang, automatic recovery.", Kernel->core);
@@ -4033,7 +4039,17 @@ gckKERNEL_Recovery(
     /* Issuing a soft reset for the GPU. */
     gcmkONERROR(gckHARDWARE_Reset(hardware));
 
-    mask = Kernel->restoreMask;
+    gcmkVERIFY_OK(gckOS_AtomGet(
+        Kernel->os,
+        Kernel->hardware->pendingEvent,
+        (gctINT32 *)&mask
+        ));
+
+    if (mask)
+    {
+        /* Handle all outstanding events now. */
+        gcmkONERROR(gckOS_AtomSet(Kernel->os, eventObj->pending, mask));
+    }
 
     for (i = 0; i < 32; i++)
     {
@@ -4043,8 +4059,6 @@ gckKERNEL_Recovery(
         }
     }
 
-    /* Handle all outstanding events now. */
-    gcmkONERROR(gckOS_AtomSet(Kernel->os, eventObj->pending, mask));
 
 #if gcdINTERRUPT_STATISTIC
     while (count--)
@@ -4059,10 +4073,12 @@ gckKERNEL_Recovery(
     gckOS_AtomClearMask(Kernel->hardware->pendingEvent, mask);
 #endif
 
-    gcmkONERROR(gckEVENT_Notify(eventObj, 1));
+    gcmkONERROR(gckEVENT_Notify(eventObj, 1, gcvNULL));
 
     gcmkVERIFY_OK(gckOS_GetTime(&Kernel->resetTimeStamp));
 
+    gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+
     /* Success. */
     gcmkFOOTER_NO();
     return gcvSTATUS_OK;
index 72eca46..c2d93ce 100644 (file)
@@ -75,6 +75,8 @@
 extern "C" {
 #endif
 
+#define gcdRECOVERY_FORCE_TIMEOUT 100
+
 /*******************************************************************************
 ***** New MMU Defination *******************************************************/
 
@@ -328,6 +330,13 @@ gcsFDPRIVATE;
 typedef struct _gcsRECORDER * gckRECORDER;
 
 
+typedef enum _gceEVENT_FAULT
+{
+    gcvEVENT_NO_FAULT,
+    gcvEVENT_BUS_ERROR_FAULT,
+}
+gceEVENT_FAULT;
+
 /* Create a process database that will contain all its allocations. */
 gceSTATUS
 gckKERNEL_CreateProcessDB(
@@ -1058,7 +1067,8 @@ gckEVENT_Commit(
 gceSTATUS
 gckEVENT_Notify(
     IN gckEVENT Event,
-    IN gctUINT32 IDs
+    IN gctUINT32 IDs,
+    OUT gceEVENT_FAULT *Fault
     );
 
 /* Event callback routine. */
index 6fe2a23..96a61ad 100644 (file)
@@ -3447,7 +3447,7 @@ gckVGCOMMAND_Execute(
         kernelEntry->commandBuffer = CommandBuffer;
         kernelEntry->handler = _FreeKernelCommandBuffer;
 
-        /* Unlock the current queue. */
+        /* Lock the current queue. */
         gcmkERR_BREAK(_UnlockCurrentQueue(
             Command, 1
             ));
@@ -3461,19 +3461,19 @@ gckVGCOMMAND_Execute(
 
 gceSTATUS
 gckVGCOMMAND_Commit(
-    IN gckVGCOMMAND Command,
-    IN gcsVGCONTEXT_PTR Context,
-    IN gcsVGCMDQUEUE_PTR Queue,
-    IN gctUINT EntryCount,
-    IN gcsTASK_MASTER_TABLE_PTR TaskTable
-    )
+        IN gckVGCOMMAND Command,
+        IN gcsVGCONTEXT_PTR Context,
+        IN gcsVGCMDQUEUE_PTR Queue,
+        IN gctUINT EntryCount,
+        IN gcsTASK_MASTER_TABLE_PTR TaskTable
+        )
 {
     /*
-        The first buffer is executed through a direct gckVGHARDWARE_Execute call,
-        therefore only an update is needed after the execution is over. All
-        consequent buffers need to be executed upon the first update call from
-        the FE interrupt handler.
-    */
+       The first buffer is executed through a direct gckVGHARDWARE_Execute call,
+       therefore only an update is needed after the execution is over. All
+       consequent buffers need to be executed upon the first update call from
+       the FE interrupt handler.
+       */
     static gcsQUEUE_UPDATE_CONTROL _dynamicBuffer[] =
     {
         {
@@ -3506,8 +3506,8 @@ gckVGCOMMAND_Commit(
         }
     };
 
-    gceSTATUS status, last;
-    struct _gcsTASK_MASTER_TABLE  _TaskTable;
+    gceSTATUS status;
+    struct _gcsTASK_MASTER_TABLE _TaskTable;
 #ifdef __QNXNTO__
     gcsVGCONTEXT_PTR userContext = gcvNULL;
     gctBOOL userContextMapped = gcvFALSE;
@@ -3518,6 +3518,27 @@ gckVGCOMMAND_Commit(
     struct _gcsVGCONTEXT  _Context;
     gctBOOL needCopy = gcvFALSE;
 
+
+    gctBOOL haveFETasks;
+    gctUINT queueSize = 0;
+    gcsVGCMDQUEUE_PTR mappedQueue = gcvNULL;
+    gcsVGCMDQUEUE_PTR userEntry = gcvNULL;
+    gcsKERNEL_CMDQUEUE_PTR kernelEntry;
+    gcsQUEUE_UPDATE_CONTROL_PTR queueControl;
+    gctUINT currentLength;
+    gctUINT queueLength;
+    gctUINT entriesQueued;
+    gctUINT8_PTR previousEnd;
+    gctBOOL previousDynamic;
+    gctBOOL previousExecuted;
+    gctUINT controlIndex;
+    gctINT pid;
+    gctBOOL powerSemaphoreAcquired = gcvFALSE;
+    gctBOOL commitMutexAcquired = gcvFALSE;
+    gctBOOL queueMutexAcquired = gcvFALSE;
+
+
+
     gcmkHEADER_ARG("Command=%p Context=%p Queue=%p EntryCount=0x%x TaskTable=%p",
             Command, Context, Queue, EntryCount, TaskTable);
 
@@ -3527,375 +3548,360 @@ gckVGCOMMAND_Commit(
     gcmkVERIFY_ARGUMENT(Queue != gcvNULL);
     gcmkVERIFY_ARGUMENT(EntryCount > 1);
 
-    do
-    {
-        gctBOOL haveFETasks;
-        gctUINT queueSize = 0;
-        gcsVGCMDQUEUE_PTR mappedQueue=gcvNULL;
-        gcsVGCMDQUEUE_PTR userEntry=gcvNULL;
-        gcsKERNEL_CMDQUEUE_PTR kernelEntry;
-        gcsQUEUE_UPDATE_CONTROL_PTR queueControl;
-        gctUINT currentLength;
-        gctUINT queueLength;
-        gctUINT entriesQueued;
-        gctUINT8_PTR previousEnd;
-        gctBOOL previousDynamic;
-        gctBOOL previousExecuted;
-        gctUINT controlIndex;
-        gctINT pid;
+
 #ifdef __QNXNTO__
-        /* Map the context into the kernel space. */
-        userContext = Context;
+    /* Map the context into the kernel space. */
+    userContext = Context;
 
-        gcmkERR_BREAK(gckOS_MapUserPointer(
-                    Command->os,
-                    userContext,
-                    gcmSIZEOF(*userContext),
-                    &pointer));
+    gcmkONERROR(gckOS_MapUserPointer(
+                Command->os,
+                userContext,
+                gcmSIZEOF(*userContext),
+                &pointer));
 
-        Context = pointer;
+    Context = pointer;
 
-        userContextMapped = gcvTRUE;
+    userContextMapped = gcvTRUE;
 
-        /* Map the taskTable into the kernel space. */
-        userTaskTable = TaskTable;
+    /* Map the taskTable into the kernel space. */
+    userTaskTable = TaskTable;
 
-        gcmkERR_BREAK(gckOS_MapUserPointer(
-                    Command->os,
-                    userTaskTable,
-                    gcmSIZEOF(*userTaskTable),
-                    &pointer));
+    gcmkONERROR(gckOS_MapUserPointer(
+                Command->os,
+                userTaskTable,
+                gcmSIZEOF(*userTaskTable),
+                &pointer));
 
-        TaskTable = pointer;
+    TaskTable = pointer;
 
-        userTaskTableMapped = gcvTRUE;
+    userTaskTableMapped = gcvTRUE;
 
-        /* Update the signal info. */
-        TaskTable->coid  = Context->coid;
-        TaskTable->rcvid = Context->rcvid;
+    /* Update the signal info. */
+    TaskTable->coid  = Context->coid;
+    TaskTable->rcvid = Context->rcvid;
 #endif
 
-        gcmkERR_BREAK(gckOS_GetProcessID((gctUINT32_PTR)&pid));
-        gcmkERR_BREAK(gckOS_QueryNeedCopy(Command->os, pid, &needCopy));
-        if(needCopy)
-        {
-            gcmkERR_BREAK(gckOS_CopyFromUserData(
-                        Command->os,
-                        &_TaskTable,
-                        TaskTable,
-                        gcmSIZEOF(struct _gcsTASK_MASTER_TABLE)
-                        ));
-            TaskTable = &_TaskTable;
-            /* Determine whether there are FE tasks to be performed. */
-            gcmkERR_BREAK(gckOS_CopyFromUserData(
-                        Command->os,
-                        &_Context,
-                        Context,
-                        gcmSIZEOF(struct _gcsVGCONTEXT)
-                        ));
-            Context = &_Context;
-        }
-
-        gcmkERR_BREAK(gckVGHARDWARE_SetPowerState(
-                    Command->hardware, gcvPOWER_ON_AUTO
+    gcmkONERROR(gckOS_GetProcessID((gctUINT32_PTR)&pid));
+    gcmkONERROR(gckOS_QueryNeedCopy(Command->os, pid, &needCopy));
+    if(needCopy)
+    {
+        gcmkONERROR(gckOS_CopyFromUserData(
+                    Command->os,
+                    &_TaskTable,
+                    TaskTable,
+                    gcmSIZEOF(struct _gcsTASK_MASTER_TABLE)
                     ));
-
-        /* Acquire the power semaphore. */
-        gcmkERR_BREAK(gckOS_AcquireSemaphore(
-                    Command->os, Command->powerSemaphore
+        TaskTable = &_TaskTable;
+        /* Determine whether there are FE tasks to be performed. */
+        gcmkONERROR(gckOS_CopyFromUserData(
+                    Command->os,
+                    &_Context,
+                    Context,
+                    gcmSIZEOF(struct _gcsVGCONTEXT)
                     ));
+        Context = &_Context;
+    }
+
+    gcmkONERROR(gckVGHARDWARE_SetPowerState(
+                Command->hardware, gcvPOWER_ON_AUTO
+                ));
 
-        /* Acquire the commit mutex. */
-        status = gckOS_AcquireMutex(
+    /* Acquire the power semaphore. */
+    gcmkONERROR(gckOS_AcquireSemaphore(
+                Command->os, Command->powerSemaphore
+                ));
+    powerSemaphoreAcquired = gcvTRUE;
+    /* Acquire the mutex. */
+    gcmkONERROR(gckOS_AcquireMutex(
                 Command->os,
                 Command->commitMutex,
                 gcvINFINITE
-                );
+                ));
+    commitMutexAcquired = gcvTRUE;
 
-        if (gcmIS_ERROR(status))
-        {
-            gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
-                        Command->os, Command->powerSemaphore));
-            break;
-        }
 
-        do
-        {
-            gcmkERR_BREAK(_FlushMMU(Command));
+    gcmkONERROR(_FlushMMU(Command));
 
-            /* Assign a context ID if not yet assigned. */
-            if (Context->id == 0)
-            {
-                /* Assign the next context number. */
-                Context->id = ++ Command->contextCounter;
-                /* See if we overflowed. */
-                if (Command->contextCounter == 0)
-                {
-                    /* We actually did overflow, wow... */
-                    status = gcvSTATUS_OUT_OF_RESOURCES;
-                    break;
-                }
-            }
+    /* Assign a context ID if not yet assigned. */
+    if (Context->id == 0)
+    {
+        /* Assign the next context number. */
+        Context->id = ++ Command->contextCounter;
+        /* See if we overflowed. */
+        if (Command->contextCounter == 0)
+        {
+            /* We actually did overflow, wow... */
+            gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+        }
+    }
 
-            /* The first entry in the queue is always the context buffer.
-               Verify whether the user context is the same as the current
-               context and if that's the case, skip the first entry. */
-            if (Context->id == Command->currentContext)
-            {
-                /* Same context as before, skip the first entry. */
-                EntryCount -= 1;
-                Queue      += 1;
+    /* The first entry in the queue is always the context buffer.
+       Verify whether the user context is the same as the current
+       context and if that's the case, skip the first entry. */
+    if (Context->id == Command->currentContext)
+    {
+        /* Same context as before, skip the first entry. */
+        EntryCount -= 1;
+        Queue      += 1;
 
-                /* Set the signal to avoid user waiting. */
+        /* Set the signal to avoid user waiting. */
 #ifdef __QNXNTO__
-                gcmkERR_BREAK(gckOS_UserSignal(
-                            Command->os,
-                            Context->userSignal,
-                            Context->rcvid,
-                            Context->coid
-                            ));
+        gcmkONERROR(gckOS_UserSignal(
+                    Command->os,
+                    Context->userSignal,
+                    Context->rcvid,
+                    Context->coid
+                    ));
 #else
-                gcmkERR_BREAK(gckOS_UserSignal(
-                            Command->os, Context->signal, Context->process
-                            ));
+        gcmkONERROR(gckOS_UserSignal(
+                    Command->os, Context->signal, Context->process
+                    ));
 #endif
-            }
-            else
-            {
-                /* Different user context - keep the first entry.
-                   Set the user context as the current one. */
-                Command->currentContext = Context->id;
-            }
+    }
+    else
+    {
+        /* Different user context - keep the first entry.
+           Set the user context as the current one. */
+        Command->currentContext = Context->id;
+    }
+
+    /* Reset pointers. */
+    queueControl = gcvNULL;
+    previousEnd  = gcvNULL;
+
+    haveFETasks = (TaskTable->table[gcvBLOCK_COMMAND].head != gcvNULL);
+
+    /* Determine the size of the queue. */
+    queueSize = EntryCount * gcmSIZEOF(gcsVGCMDQUEUE);
+    if(needCopy)
+    {
+        gctPOINTER pointer = gcvNULL;
+        gcmkONERROR(gckOS_Allocate(
+                    Command->os,
+                    queueSize,
+                    &pointer
+                    ));
+        userEntry = pointer;
+        mappedQueue = pointer;
+        gcmkONERROR(gckOS_CopyFromUserData(
+                    Command->os,
+                    userEntry,
+                    Queue,
+                    queueSize
+                    ));
+    }
+    else
+    {
+        /* Map the command queue into the kernel space. */
+        gcmkONERROR(gckOS_MapUserPointer(
+                    Command->os,
+                    Queue,
+                    queueSize,
+                    (gctPOINTER *) &mappedQueue
+                    ));
+        userEntry = mappedQueue;
+    }
+    /* Set the first entry. */
 
-            /* Reset pointers. */
-            queueControl = gcvNULL;
-            previousEnd  = gcvNULL;
+    /* Process the command queue. */
+    while (EntryCount)
+    {
+        /* Lock the current queue. */
+        gcmkONERROR(_LockCurrentQueue(
+                    Command, &kernelEntry, &queueLength
+                    ));
+        queueMutexAcquired = gcvTRUE;
+
+        /* Determine the number of entries to process. */
+        currentLength = (queueLength < EntryCount)
+            ? queueLength
+            : EntryCount;
+
+        /* Update the number of the entries left to process. */
+        EntryCount -= currentLength;
+
+        /* Reset previous flags. */
+        previousDynamic  = gcvFALSE;
+        previousExecuted = gcvFALSE;
 
-            haveFETasks = (TaskTable->table[gcvBLOCK_COMMAND].head != gcvNULL);
+        /* Set the initial control index. */
+        controlIndex = 0;
 
-            /* Determine the size of the queue. */
-            queueSize = EntryCount * gcmSIZEOF(gcsVGCMDQUEUE);
-            if(needCopy)
+        /* Process entries. */
+        for (entriesQueued = 0; entriesQueued < currentLength; entriesQueued += 1)
+        {
+            /* Get the kernel pointer to the command buffer header. */
+            gcsCMDBUFFER_PTR commandBuffer = gcvNULL;
+            gcmkONERROR(_ConvertUserCommandBufferPointer(
+                        Command,
+                        userEntry->commandBuffer,
+                        &commandBuffer
+                        ));
+
+            /* Is it a dynamic command buffer? */
+            if (userEntry->dynamic)
             {
-                gctPOINTER pointer = gcvNULL;
-                gcmkERR_BREAK(gckOS_Allocate(
-                            Command->os,
-                            queueSize,
-                            &pointer
-                            ));
-                userEntry = pointer;
-                mappedQueue = pointer;
-                gcmkERR_BREAK(gckOS_CopyFromUserData(
-                            Command->os,
-                            userEntry,
-                            Queue,
-                            queueSize
-                            ));
+                /* Select dynamic buffer control functions. */
+                queueControl = &_dynamicBuffer[controlIndex];
             }
+
+            /* No, a static command buffer. */
             else
             {
-                /* Map the command queue into the kernel space. */
-                gcmkERR_BREAK(gckOS_MapUserPointer(
-                            Command->os,
-                            Queue,
-                            queueSize,
-                            (gctPOINTER *) &mappedQueue
-                            ));
-                userEntry = mappedQueue;
+                /* Select static buffer control functions. */
+                queueControl = &_staticBuffer[controlIndex];
             }
-            /* Set the first entry. */
 
-            /* Process the command queue. */
-            while (EntryCount)
+            /* Set the command buffer pointer to the entry. */
+            kernelEntry->commandBuffer = commandBuffer;
+
+            /* If the previous entry was a dynamic command buffer,
+               link it to the current. */
+            if (previousDynamic)
             {
-                /* Lock the current queue. */
-                gcmkERR_BREAK(_LockCurrentQueue(
-                            Command, &kernelEntry, &queueLength
+                gcmkONERROR(gckVGCOMMAND_FetchCommand(
+                            Command,
+                            previousEnd,
+                            commandBuffer->address,
+                            commandBuffer->dataCount,
+                            gcvNULL
                             ));
 
-                /* Determine the number of entries to process. */
-                currentLength = (queueLength < EntryCount)
-                    ? queueLength
-                    : EntryCount;
+                /* The buffer will be auto-executed, only need to
+                   update it after it has been executed. */
+                kernelEntry->handler = queueControl->update;
 
-                /* Reset previous flags. */
-                previousDynamic  = gcvFALSE;
+                /* The buffer is only being updated. */
                 previousExecuted = gcvFALSE;
+            }
+            else
+            {
+                /* Set the buffer up for execution. */
+                kernelEntry->handler = queueControl->execute;
 
-                /* Set the initial control index. */
-                controlIndex = 0;
-
-                /* Process entries. */
-                for (entriesQueued = 0; entriesQueued < currentLength; entriesQueued += 1)
-                {
-                    /* Get the kernel pointer to the command buffer header. */
-                    gcsCMDBUFFER_PTR commandBuffer = gcvNULL;
-                    gcmkONERROR(_ConvertUserCommandBufferPointer(
-                                Command,
-                                userEntry->commandBuffer,
-                                &commandBuffer
-                                ));
-
-                    /* Is it a dynamic command buffer? */
-                    if (userEntry->dynamic)
-                    {
-                        /* Select dynamic buffer control functions. */
-                        queueControl = &_dynamicBuffer[controlIndex];
-                    }
-
-                    /* No, a static command buffer. */
-                    else
-                    {
-                        /* Select static buffer control functions. */
-                        queueControl = &_staticBuffer[controlIndex];
-                    }
-
-                    /* Set the command buffer pointer to the entry. */
-                    kernelEntry->commandBuffer = commandBuffer;
-
-                    /* If the previous entry was a dynamic command buffer,
-                       link it to the current. */
-                    if (previousDynamic)
-                    {
-                        gcmkONERROR(gckVGCOMMAND_FetchCommand(
-                                    Command,
-                                    previousEnd,
-                                    commandBuffer->address,
-                                    commandBuffer->dataCount,
-                                    gcvNULL
-                                    ));
-
-                        /* The buffer will be auto-executed, only need to
-                           update it after it has been executed. */
-                        kernelEntry->handler = queueControl->update;
+                /* The buffer is being updated. */
+                previousExecuted = gcvTRUE;
+            }
 
-                        /* The buffer is only being updated. */
-                        previousExecuted = gcvFALSE;
-                    }
-                    else
-                    {
-                        /* Set the buffer up for execution. */
-                        kernelEntry->handler = queueControl->execute;
+            /* The current buffer's END command becomes the last END. */
+            previousEnd
+                = ((gctUINT8_PTR) commandBuffer)
+                + commandBuffer->bufferOffset
+                + commandBuffer->dataCount * Command->info.commandAlignment
+                - Command->info.staticTailSize;
 
-                        /* The buffer is being updated. */
-                        previousExecuted = gcvTRUE;
-                    }
+            /* Update the last entry info. */
+            previousDynamic = userEntry->dynamic;
 
-                    /* The current buffer's END command becomes the last END. */
-                    previousEnd
-                        = ((gctUINT8_PTR) commandBuffer)
-                        + commandBuffer->bufferOffset
-                        + commandBuffer->dataCount * Command->info.commandAlignment
-                        - Command->info.staticTailSize;
+            /* Advance entries. */
+            userEntry   ++;
+            kernelEntry ++;
 
-                    /* Update the last entry info. */
-                    previousDynamic = userEntry->dynamic;
+            /* Update the control index. */
+            controlIndex = 1;
+        }
 
-                    /* Advance entries. */
-                    userEntry   ++;
-                    kernelEntry ++;
+        /* If the previous entry was a dynamic command buffer,
+           terminate it with an END. */
+        if (previousDynamic)
+        {
+            gcmkONERROR(gckVGCOMMAND_EndCommand(
+                        Command,
+                        previousEnd,
+                        Command->info.feBufferInt,
+                        gcvNULL
+                        ));
+        }
 
-                    /* Update the control index. */
-                    controlIndex = 1;
+        /* Last buffer? */
+        if (EntryCount == 0)
+        {
+            /* Modify the last command buffer's routines to handle
+               tasks if any.*/
+            if (haveFETasks && controlIndex == 1)
+            {
+                if (previousExecuted)
+                {
+                    kernelEntry[-1].handler = queueControl->lastExecute;
                 }
-
-                /* If the previous entry was a dynamic command buffer,
-                   terminate it with an END. */
-                if (previousDynamic)
+                else
                 {
-                    gcmkONERROR(gckVGCOMMAND_EndCommand(
-                                Command,
-                                previousEnd,
-                                Command->info.feBufferInt,
-                                gcvNULL
-                                ));
+                    kernelEntry[-1].handler = queueControl->lastUpdate;
                 }
+            }
 
-                /* Last buffer? */
-                if (EntryCount - entriesQueued == 0)
-                {
-                    /* Modify the last command buffer's routines to handle
-                       tasks if any.*/
-                    if (haveFETasks && controlIndex == 1)
-                    {
-                        if (previousExecuted)
-                        {
-                            kernelEntry[-1].handler = queueControl->lastExecute;
-                        }
-                        else
-                        {
-                            kernelEntry[-1].handler = queueControl->lastUpdate;
-                        }
-                    }
+            /* Release the mutex. */
+            gcmkONERROR(gckOS_ReleaseMutex(
+                        Command->os,
+                        Command->queueMutex
+                        ));
+            queueMutexAcquired = gcvFALSE;
+            /* Add a semaphore stall after PE EVENT (Before the END). */
+            {
+                gctUINT32_PTR memory = (gctUINT32_PTR)(previousEnd - 0x10);
+                *memory++ = 0x10000007;
+                *memory++ = 0;
 
-                    /* Release the queue mutex. */
-                    gcmkERR_BREAK(gckOS_ReleaseMutex(
-                                Command->os,
-                                Command->queueMutex
-                                ));
-                    /* Add a semaphore stall after PE EVENT (Before the END). */
-                    {
-                        gctUINT32_PTR memory = (gctUINT32_PTR)(previousEnd - 0x10);
-                        *memory++ = 0x10000007;
-                        *memory++ = 0;
+                *memory++ = 0x20000007;
+                *memory++ = 0;
+            }
+            /* Schedule tasks. */
+            gcmkONERROR(_ScheduleTasks(Command, TaskTable, previousEnd - 0x10));
 
-                        *memory++ = 0x20000007;
-                        *memory++ = 0;
-                    }
-                    /* Schedule tasks. */
-                    gcmkERR_BREAK(_ScheduleTasks(Command, TaskTable, previousEnd - 0x10));
+            /* Acquire the mutex. */
+            gcmkONERROR(gckOS_AcquireMutex(
+                        Command->os,
+                        Command->queueMutex,
+                        gcvINFINITE
+                        ));
+            queueMutexAcquired = gcvTRUE;
+        }
 
-                    /* Acquire back the queue mutex. */
-                    gcmkERR_BREAK(gckOS_AcquireMutex(
-                                Command->os,
-                                Command->queueMutex,
-                                gcvINFINITE
-                                ));
-                }
+        /* Unkock and schedule the current queue for execution. */
+        gcmkONERROR(_UnlockCurrentQueue(
+                    Command, currentLength
+                    ));
+        queueMutexAcquired = gcvFALSE;
+    }
 
 OnError:
-                /* Update the number of the entries left to process. */
-                EntryCount -= entriesQueued;
-
-                /* Unlock and schedule the current queue for execution. */
-                gcmkCHECK_STATUS(_UnlockCurrentQueue(
-                            Command, entriesQueued
-                            ));
-                /* Report the status error if any. */
-                gcmkERR_BREAK(status);
-            }
+    if (queueMutexAcquired)
+    {
+        gcmkVERIFY_OK(gckOS_ReleaseMutex(
+                    Command->os,
+                    Command->queueMutex
+                    ));
+    }
+    if (mappedQueue)
+    {
+        if(!needCopy)
+        {
+            /* Unmap the user command buffer. */
+            gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+                        Command->os,
+                        Queue,
+                        queueSize,
+                        mappedQueue
+                        ));
         }
-        while (gcvFALSE);
-
-        if (mappedQueue)
+        else
         {
-            if(!needCopy)
-            {
-                /* Unmap the user command buffer. */
-                gcmkCHECK_STATUS(gckOS_UnmapUserPointer(
-                            Command->os,
-                            Queue,
-                            queueSize,
-                            mappedQueue
-                            ));
-            }
-            else
-            {
-                gcmkCHECK_STATUS(gckOS_Free(Command->os, mappedQueue));
-            }
+            gcmkVERIFY_OK(gckOS_Free(Command->os, mappedQueue));
         }
-
-        /* Release the commit mutex. */
-        gcmkCHECK_STATUS(gckOS_ReleaseMutex(
+    }
+    /* Release the mutex. */
+    if (commitMutexAcquired)
+    {
+        gcmkVERIFY_OK(gckOS_ReleaseMutex(
                     Command->os,
                     Command->commitMutex
                     ));
-
-        /* Release the power semaphore. */
+    }
+    if (powerSemaphoreAcquired)
+    {
         gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
                     Command->os, Command->powerSemaphore));
     }
-    while (gcvFALSE);
 #ifdef __QNXNTO__
     if (userContextMapped)
     {
index 9f12fea..647e53f 100644 (file)
@@ -1458,7 +1458,7 @@ gckEVENT_Submit(
             /* Notify immediately on infinite hardware. */
             gcmkONERROR(gckEVENT_Interrupt(Event, 1 << id));
 
-            gcmkONERROR(gckEVENT_Notify(Event, 0));
+            gcmkONERROR(gckEVENT_Notify(Event, 0, gcvNULL));
 #endif
         }
 
@@ -1701,7 +1701,8 @@ gckEVENT_Interrupt(
 gceSTATUS
 gckEVENT_Notify(
     IN gckEVENT Event,
-    IN gctUINT32 IDs
+    IN gctUINT32 IDs,
+    OUT gceEVENT_FAULT *Fault
     )
 {
     gceSTATUS status = gcvSTATUS_OK;
@@ -1711,6 +1712,7 @@ gckEVENT_Notify(
     gctBOOL acquired = gcvFALSE;
     gctSIGNAL signal;
     gctUINT pending = 0;
+    gceEVENT_FAULT fault = gcvEVENT_NO_FAULT;
 
 #if gcmIS_DEBUG(gcdDEBUG_TRACE)
     gctINT eventNumber = 0;
@@ -1767,8 +1769,9 @@ gckEVENT_Notify(
         if (pending & 0x80000000)
         {
             gcmkPRINT("AXI BUS ERROR");
-            gckHARDWARE_DumpGPUState(Event->kernel->hardware);
             pending &= 0x7FFFFFFF;
+
+            fault |= gcvEVENT_BUS_ERROR_FAULT;
         }
 
         if ((pending & 0x40000000) && Event->kernel->hardware->mmuVersion)
@@ -1844,6 +1847,12 @@ gckEVENT_Notify(
                 pending
                 );
 
+            /* Clear the BUS ERROR event. */
+            if (fault & gcvEVENT_BUS_ERROR_FAULT)
+            {
+                pending |= (1 << 31);
+            }
+
             gckOS_AtomClearMask(Event->pending, pending);
 
             /* Release the mutex queue. */
@@ -2113,6 +2122,11 @@ gckEVENT_Notify(
     /* End of event handling. */
     Event->notifyState = -1;
 
+    if (Fault != gcvNULL)
+    {
+        *Fault = fault;
+    }
+
     /* Success. */
     gcmkFOOTER_NO();
     return gcvSTATUS_OK;
index 44cc48a..2058252 100644 (file)
@@ -1447,7 +1447,7 @@ gckMMU_SetupDynamicSpace(
     gckOS_Free(Mmu->os, (gctPOINTER)nodeArray);
 
 #if gcdENABLE_TRUST_APPLICATION
-    if (gckHARDWARE_IsFeatureAvailable(Mmu->hardware, gcvFEATURE_SECURITY) == gcvSTATUS_TRUE)
+    if (Mmu->hardware->options.secureMode == gcvSECURE_IN_TA)
     {
         /* Setup secure address area when needed. */
         gctUINT32 secureAreaSize = gcdMMU_SECURE_AREA_SIZE;
@@ -3161,6 +3161,15 @@ gckMMU_SetupSRAM(
                 /* Map the internal SRAM. */
                 if (needMapInternalSRAM)
                 {
+                    if (Device->showSRAMMapInfo)
+                    {
+                            gcmkPRINT("Galcore Info: MMU mapped core%d SRAM base=0x%llx size=0x%x",
+                            i,
+                            reservedBase,
+                            reservedSize
+                            );
+                    }
+
                     /*
                      * Default gpu virtual base = 0.
                      * It can be specified if not conflict with existing mapping.
index eb6edf5..41e70a1 100644 (file)
@@ -53,7 +53,7 @@
 *****************************************************************************/
 
 
-/*Auto created on 2021-03-05 22:36*/
+/*Auto created on 2021-04-14 20:50*/
 #ifndef _gc_feature_database_h_
 #define _gc_feature_database_h_
 
@@ -101,6 +101,7 @@ typedef struct
     gctUINT32 RESULT_WINDOW_MAX_SIZE;
     gctUINT32 ClusterAliveMask;
     gctUINT32 G2D_DEC400_MINOR;
+    gctUINT32 PS_INSTRUCTION_COUNT;
     gctUINT32 NNMadPerCore;
     gctUINT32 NNCoreCount;
     gctUINT32 NN_ACTIVE_CORE_COUNT;
@@ -150,6 +151,7 @@ typedef struct
     gctUINT32 NN_CLUSTER_NUM_FOR_POWER_CONTROL;
     gctUINT32 NN_IN_LINES_PER_CYCLE;
     gctUINT32 VIP_CLUSTER_COUNT;
+    gctUINT32 NN_MP_INTER_CONNECT_RING_COUNT;
     gctUINT32 REG_FastClear:1;
     gctUINT32 REG_SpecialAntiAliasing:1;
     gctUINT32 REG_Pipe3D:1;
@@ -557,6 +559,7 @@ typedef struct
     gctUINT32 IMGLD_WIDTH_LT16_FIX:1;
     gctUINT32 TX_FILTER_ROUND_FIX:1;
     gctUINT32 SH_FP32_FMA_SUPPORT:1;
+    gctUINT32 TX_ETC2_COMPRESSION:1;
     gctUINT32 VG_TS_CULLING:1;
     gctUINT32 VG_FP25:1;
     gctUINT32 VG_AYUV_INPUT_OUTPUT:1;
@@ -684,6 +687,7 @@ typedef struct
     gctUINT32 NN_TRANSPOSE_PHASE2:1;
     gctUINT32 NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD:1;
     gctUINT32 NN_CONV_CORE_BYPASS:1;
+    gctUINT32 NN_TENSOR_ADD_RELU:1;
     gctUINT32 TPLITE_SUPPORT_TP_DATA_TRANSPOSE:1;
     gctUINT32 NN_SUPPORT_CONV_1D:1;
     gctUINT32 USE_VIPSRAM_FOR_KERNEL_STREAMING:1;
@@ -775,6 +779,7 @@ typedef struct
     gctUINT32 NN_JD_DIRECT_MODE_FIX:1;
     gctUINT32 NN_KERNEL_DIRECT_WRONG_PUSH_FIX:1;
     gctUINT32 HI_DEFAULT_ENABLE_REORDER_FIX:1;
+    gctUINT32 V83_INTILESIZE_1X1_10BITS_FIX:1;
     gctUINT32 NN_INTERLEVE8:1;
     gctUINT32 NN_FP16_ALU:1;
     gctUINT32 NN_INT16_ALU:1;
@@ -834,6 +839,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -883,6 +889,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -1290,6 +1297,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -1417,6 +1425,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -1508,6 +1517,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -1565,6 +1575,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -1614,6 +1625,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -2021,6 +2033,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -2148,6 +2161,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -2239,6 +2253,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -2296,6 +2311,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -2345,6 +2361,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -2752,6 +2769,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -2879,6 +2897,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -2970,6 +2989,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -3027,6 +3047,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -3076,6 +3097,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -3483,6 +3505,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -3610,6 +3633,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -3701,6 +3725,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -3758,6 +3783,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -3807,6 +3833,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -4214,6 +4241,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -4341,6 +4369,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -4432,6 +4461,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -4489,6 +4519,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -4538,6 +4569,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -4945,6 +4977,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -5072,6 +5105,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -5163,6 +5197,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -5220,6 +5255,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -5269,6 +5305,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -5676,6 +5713,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -5803,6 +5841,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -5894,6 +5933,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -5951,6 +5991,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -6000,6 +6041,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x0, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -6407,6 +6449,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -6534,6 +6577,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -6625,6 +6669,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -6682,6 +6727,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -6731,6 +6777,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -7138,6 +7185,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -7265,6 +7313,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -7356,6 +7405,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -7413,6 +7463,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -7462,6 +7513,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -7869,6 +7921,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -7996,6 +8049,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -8087,6 +8141,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -8144,6 +8199,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -8193,6 +8249,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -8600,6 +8657,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -8727,6 +8785,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -8818,6 +8877,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -8875,6 +8935,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -8924,6 +8985,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -9331,6 +9393,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -9458,6 +9521,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -9549,6 +9613,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -9606,6 +9671,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -9655,6 +9721,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -10062,6 +10129,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -10189,6 +10257,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -10280,6 +10349,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -10337,6 +10407,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -10386,6 +10457,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -10793,6 +10865,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -10920,6 +10993,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -11011,6 +11085,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -11068,6 +11143,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -11117,6 +11193,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -11524,6 +11601,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -11651,6 +11729,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -11742,6 +11821,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -11799,6 +11879,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -11848,6 +11929,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -12255,6 +12337,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -12382,6 +12465,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -12473,6 +12557,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -12530,6 +12615,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -12579,6 +12665,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -12986,6 +13073,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -13113,6 +13201,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -13204,6 +13293,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -13261,6 +13351,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -13310,6 +13401,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -13717,6 +13809,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -13844,6 +13937,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -13935,6 +14029,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -13992,6 +14087,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -14041,6 +14137,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -14263,7 +14360,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_REG_RSS8 */
         0x1, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
         0x1, /* gcFEATURE_BIT_REG_Halti5 */
-        0x1, /* gcFEATURE_BIT_REG_Evis */
+        0x0, /* gcFEATURE_BIT_REG_Evis */
         0x0, /* gcFEATURE_BIT_REG_BltEngine */
         0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
         0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
@@ -14448,6 +14545,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -14489,17 +14587,17 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_NONZERO_BORDER */
         0x0, /* gcFEATURE_BIT_NN_MIRROR_BORDER */
         0x0, /* gcFEATURE_BIT_AI_GPU */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_DP32 */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_FILTER */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_IADD */
-        0x0, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_DP32 */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_FILTER */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_IADD */
+        0x1, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
         0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
         0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
-        0x1, /* gcFEATURE_BIT_EVIS_VX2 */
+        0x0, /* gcFEATURE_BIT_EVIS_VX2 */
         0x0, /* gcFEATURE_BIT_TP_ENGINE */
         0x0, /* gcFEATURE_BIT_VIP_V7 */
         0x0, /* gcFEATURE_BIT_TP_TENSOR_ADD_MUL */
@@ -14575,6 +14673,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -14666,6 +14765,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -14723,6 +14823,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -14772,6 +14873,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -15179,6 +15281,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -15306,6 +15409,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -15397,6 +15501,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -15454,6 +15559,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -15503,6 +15609,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -15910,6 +16017,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -16037,6 +16145,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -16128,6 +16237,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -16185,6 +16295,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -16234,6 +16345,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -16641,6 +16753,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -16768,6 +16881,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -16859,6 +16973,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -16916,6 +17031,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -16965,6 +17081,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -17372,6 +17489,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -17499,6 +17617,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -17590,6 +17709,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -17647,6 +17767,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -17696,6 +17817,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -18103,6 +18225,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -18230,6 +18353,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -18321,6 +18445,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -18378,6 +18503,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -18427,6 +18553,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -18834,6 +18961,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -18961,6 +19089,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -19052,6 +19181,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -19109,6 +19239,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x3, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -19158,6 +19289,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -19565,6 +19697,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -19692,6 +19825,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -19783,6 +19917,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -19840,6 +19975,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x3, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x0, /* gcFEATURE_VALUE_NNMadPerCore */
         0x0, /* gcFEATURE_VALUE_NNCoreCount */
         0x0, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -19889,6 +20025,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x0, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x0, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x1, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -20296,6 +20433,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -20423,6 +20561,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -20514,6 +20653,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x0, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x0, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x0, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -20571,6 +20711,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x40, /* gcFEATURE_VALUE_NNMadPerCore */
         0x6, /* gcFEATURE_VALUE_NNCoreCount */
         0x6, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -20620,6 +20761,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x3, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x1, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -21027,6 +21169,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -21154,6 +21297,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -21245,6 +21389,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x1, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x1, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x1, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
@@ -21302,6 +21447,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
         0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
         0x0, /* gcFEATURE_VALUE_G2D_DEC400_MINOR */
+        0x0, /* gcFEATURE_VALUE_PS_INSTRUCTION_COUNT */
         0x40, /* gcFEATURE_VALUE_NNMadPerCore */
         0x6, /* gcFEATURE_VALUE_NNCoreCount */
         0x6, /* gcFEATURE_VALUE_NN_ACTIVE_CORE_COUNT */
@@ -21351,6 +21497,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_VALUE_NN_CLUSTER_NUM_FOR_POWER_CONTROL */
         0x3, /* gcFEATURE_VALUE_NN_IN_LINES_PER_CYCLE */
         0x1, /* gcFEATURE_VALUE_VIP_CLUSTER_COUNT */
+        0x0, /* gcFEATURE_VALUE_NN_MP_INTER_CONNECT_RING_COUNT */
         0x0, /* gcFEATURE_BIT_REG_FastClear */
         0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
         0x1, /* gcFEATURE_BIT_REG_Pipe3D */
@@ -21758,6 +21905,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x1, /* gcFEATURE_BIT_IMGLD_WIDTH_LT16_FIX */
         0x0, /* gcFEATURE_BIT_TX_FILTER_ROUND_FIX */
         0x0, /* gcFEATURE_BIT_SH_FP32_FMA_SUPPORT */
+        0x0, /* gcFEATURE_BIT_TX_ETC2_COMPRESSION */
         0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
         0x0, /* gcFEATURE_BIT_VG_FP25 */
         0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
@@ -21885,6 +22033,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_TRANSPOSE_PHASE2 */
         0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD */
         0x0, /* gcFEATURE_BIT_NN_CONV_CORE_BYPASS */
+        0x0, /* gcFEATURE_BIT_NN_TENSOR_ADD_RELU */
         0x0, /* gcFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE */
         0x0, /* gcFEATURE_BIT_NN_SUPPORT_CONV_1D */
         0x0, /* gcFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING */
@@ -21976,6 +22125,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
         0x0, /* gcFEATURE_BIT_NN_JD_DIRECT_MODE_FIX */
         0x1, /* gcFEATURE_BIT_NN_KERNEL_DIRECT_WRONG_PUSH_FIX */
         0x1, /* gcFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX */
+        0x1, /* gcFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX */
         0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
         0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
         0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
index 6feb9be..4c0fd1b 100644 (file)
@@ -374,19 +374,6 @@ _DmabufMapUser(
     }
     userLogical += buf_desc->sgt->sgl->offset;
 
-    /* To make sure the mapping is created. */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
-    if (access_ok(userLogical, 4))
-#else
-    if (access_ok(VERIFY_READ, userLogical, 4))
-#endif
-    {
-        uint32_t mem;
-        get_user(mem, (uint32_t *)userLogical);
-
-        (void)mem;
-    }
-
     MdlMap->vmaAddr = (gctPOINTER)userLogical;
     MdlMap->cacheable = Cacheable;
 
index 4d5096e..ff241c6 100644 (file)
@@ -615,8 +615,7 @@ _GFPAlloc(
                 gcmkONERROR(_NonContiguousAlloc(mdlPriv, NumPages, gfp));
             }
         }
-
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
         result = sg_alloc_table_from_pages(&mdlPriv->sgt,
                     mdlPriv->nonContiguousPages, NumPages, 0,
                     NumPages << PAGE_SHIFT, GFP_KERNEL);
@@ -656,7 +655,7 @@ _GFPAlloc(
                 _NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
             }
 
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
             sg_free_table(&mdlPriv->sgt);
 #else
             kfree(mdlPriv->sgt.sgl);
@@ -817,7 +816,7 @@ _GFPFree(
         dma_unmap_sg(galcore_device, mdlPriv->sgt.sgl, mdlPriv->sgt.nents,
                 DMA_FROM_DEVICE);
 
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
         sg_free_table(&mdlPriv->sgt);
 #else
         kfree(mdlPriv->sgt.sgl);
index d88879f..ffdec26 100644 (file)
@@ -185,7 +185,7 @@ static int import_page_map(struct um_desc *um,
         }
     }
 
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
     result = sg_alloc_table_from_pages(&um->sgt, pages, page_count,
                     addr & ~PAGE_MASK, size, GFP_KERNEL | gcdNOWARN);
 
@@ -214,7 +214,7 @@ static int import_page_map(struct um_desc *um,
     return 0;
 
 error:
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
     sg_free_table(&um->sgt);
 #else
     kfree(um->sgt.sgl);
@@ -346,7 +346,7 @@ static int import_pfn_map(struct um_desc *um,
 
     if (pageCount == pfn_count)
     {
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
         result = sg_alloc_table_from_pages(&um->sgt, pages, pfn_count,
                         addr & ~PAGE_MASK, pfn_count * PAGE_SIZE, GFP_KERNEL | gcdNOWARN);
 
@@ -366,7 +366,7 @@ static int import_pfn_map(struct um_desc *um,
 
         if (unlikely(result != um->sgt.nents))
         {
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
             sg_free_table(&um->sgt);
 #else
             kfree(um->sgt.sgl);
@@ -664,7 +664,7 @@ static void release_page_map(struct um_desc *um)
 
     dma_unmap_sg(galcore_device, um->sgt.sgl, um->sgt.nents, DMA_FROM_DEVICE);
 
-#if gcdSYS_HAS_SG_CHAIN
+#if gcdUSE_Linux_SG_TABLE_API
     sg_free_table(&um->sgt);
 #else
     kfree(um->sgt.sgl);
index 83f006d..146cd3a 100644 (file)
@@ -178,7 +178,7 @@ gckOS_FreeAllocators(
     return gcvSTATUS_OK;
 }
 
-#if !gcdSYS_HAS_SG_CHAIN
+#if !gcdUSE_Linux_SG_TABLE_API
 
 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
 static inline void sg_set_page(struct scatterlist *sg, struct page *page,
index 0d54779..630538a 100644 (file)
@@ -561,7 +561,7 @@ OnError:
     return status;
 }
 
-#if !gcdSYS_HAS_SG_CHAIN
+#if !gcdUSE_Linux_SG_TABLE_API
 int
 alloc_sg_list_from_pages(
     struct scatterlist **sgl,
index e444f58..c3cd8f3 100644 (file)
 
 #define _GC_OBJ_ZONE    gcvZONE_DEVICE
 
-#define DEBUG_FILE          "galcore_trace"
-#define PARENT_FILE         "gpu"
-
-#define gcdDEBUG_FS_WARN    "Experimental debug entry, may be removed in future release, do NOT rely on it!\n"
-
 static gckGALDEVICE galDevice;
 
 extern gcTA globalTA[16];
@@ -1019,6 +1014,7 @@ _DumpState(
 **  Suspend: Time GPU stays in gcvPOWER_SUSPEND.
 */
 static int dumpCore = 0;
+static gctBOOL dumpAllCore = gcvFALSE;
 
 static int
 gc_dump_trigger_show(struct seq_file *m, void *data)
@@ -1027,28 +1023,149 @@ gc_dump_trigger_show(struct seq_file *m, void *data)
     gcsINFO_NODE *node = m->private;
     gckGALDEVICE device = node->device;
     gckKERNEL kernel = gcvNULL;
+    gckHARDWARE Hardware = gcvNULL;
+    gctBOOL powerManagement = gcvFALSE;
+    gceSTATUS status = gcvSTATUS_OK;
+    gceCHIPPOWERSTATE statesStored, state;
 
-    if (dumpCore >= gcvCORE_MAJOR && dumpCore < gcvCORE_COUNT)
+    if (((dumpCore < gcvCORE_MAJOR) || (dumpCore >= gcvCORE_COUNT)) && (!dumpAllCore))
     {
-        kernel = device->kernels[dumpCore];
+        return -ENXIO;
     }
 
-    if (!kernel)
-        return -ENXIO;
+    seq_printf(m, "Dump one core: For example, dump core 0: echo 0 > /sys/kernel/debug/gc/dump_trigger; cat /sys/kernel/debug/gc/dump_trigger\n");
+    seq_printf(m, "Dump all cores: echo all > /sys/kernel/debug/gc/dump_trigger; cat /sys/kernel/debug/gc/dump_trigger\n");
+    seq_printf(m, "The dump will be in [dmesg].\n");
 
-#endif
+    if (dumpAllCore)
+    {
+        gctINT8 i = 0;
+
+        for (i = 0; i < gcvCORE_COUNT; ++i)
+        {
+            if (!device->kernels[i])
+            {
+                continue;
+            }
 
-    seq_printf(m, gcdDEBUG_FS_WARN);
+            kernel = device->kernels[i];
+            Hardware = kernel->hardware;
+            powerManagement = Hardware->options.powerManagement;
 
-#if gcdENABLE_3D || gcdENABLE_2D
-    seq_printf(m, "Get dump from /proc/kmsg or /sys/kernel/debug/gc/galcore_trace\n");
+            if (powerManagement)
+            {
+                gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+                    Hardware, gcvFALSE
+                    ));
+            }
+
+            gcmkONERROR(gckHARDWARE_QueryPowerState(
+                Hardware, &statesStored
+                ));
 
-    if (kernel && kernel->hardware->options.powerManagement == gcvFALSE)
+            gcmkONERROR(gckHARDWARE_SetPowerState(
+                Hardware, gcvPOWER_ON_AUTO
+                ));
+
+            _DumpState(kernel);
+
+            switch(statesStored)
+            {
+            case gcvPOWER_OFF:
+                state = gcvPOWER_OFF_BROADCAST;
+                break;
+            case gcvPOWER_IDLE:
+                state = gcvPOWER_IDLE_BROADCAST;
+                break;
+            case gcvPOWER_SUSPEND:
+                state = gcvPOWER_SUSPEND_BROADCAST;
+                break;
+            case gcvPOWER_ON:
+                state = gcvPOWER_ON_AUTO;
+                break;
+            default:
+                state = statesStored;
+                break;
+            }
+
+            if (powerManagement)
+            {
+                gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+                    Hardware, gcvTRUE
+                    ));
+            }
+
+            gcmkONERROR(gckHARDWARE_SetPowerState(
+                Hardware, state
+                ));
+
+        }
+    }
+    else
     {
+        if (device->kernels[dumpCore])
+        {
+            kernel = device->kernels[dumpCore];
+        }
+        else
+        {
+            seq_printf(m, "Dump core from invalid coreid.\n");
+            goto OnError;
+        }
+
+        Hardware = kernel->hardware;
+        powerManagement = Hardware->options.powerManagement;
+
+        if (powerManagement)
+        {
+            gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+                Hardware, gcvFALSE
+                ));
+        }
+
+        gcmkONERROR(gckHARDWARE_QueryPowerState(
+            Hardware, &statesStored
+            ));
+
+        gcmkONERROR(gckHARDWARE_SetPowerState(
+            Hardware, gcvPOWER_ON_AUTO
+            ));
+
         _DumpState(kernel);
+
+        switch(statesStored)
+        {
+        case gcvPOWER_OFF:
+            state = gcvPOWER_OFF_BROADCAST;
+            break;
+        case gcvPOWER_IDLE:
+            state = gcvPOWER_IDLE_BROADCAST;
+            break;
+        case gcvPOWER_SUSPEND:
+            state = gcvPOWER_SUSPEND_BROADCAST;
+            break;
+        case gcvPOWER_ON:
+            state = gcvPOWER_ON_AUTO;
+            break;
+        default:
+            state = statesStored;
+            break;
+        }
+
+        if (powerManagement)
+        {
+            gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+                Hardware, gcvTRUE
+                ));
+        }
+
+        gcmkONERROR(gckHARDWARE_SetPowerState(
+            Hardware, state
+            ));
     }
-#endif
 
+OnError:
+#endif
     return 0;
 }
 
@@ -1330,7 +1447,25 @@ static int gc_vidmem_write(const char __user *buf, size_t count, void* data)
 
 static int gc_dump_trigger_write(const char __user *buf, size_t count, void* data)
 {
-    return strtoint_from_user(buf, count, &dumpCore);
+    char str[1 + sizeof(long) * 8 + 1 + 1];
+
+    size_t len = min(count, sizeof(str) - 1);
+
+    if (copy_from_user(str, buf, len))
+        return -EFAULT;
+
+    str[len] = '\0';
+
+    if (str[0] == 'a' && str[1] == 'l' && str[2] == 'l')
+    {
+        dumpAllCore = gcvTRUE;
+        return count;
+    }
+    else
+    {
+        dumpAllCore = gcvFALSE;
+        return strtoint_from_user(buf, count, &dumpCore);
+    }
 }
 
 static int gc_clk_show(struct seq_file* m, void* data)
index 60a76e6..1f8f807 100644 (file)
@@ -84,8 +84,7 @@ struct viv_gem_object {
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,11,0)
 void viv_gem_free_object(struct drm_gem_object *gem_obj);
-struct dma_buf *viv_gem_prime_export(struct drm_gem_object *gem_obj,
-                int flags);
+struct dma_buf *viv_gem_prime_export(struct drm_gem_object *gem_obj, int flags);
 
 static const struct drm_gem_object_funcs viv_gem_object_funcs = {
     .free = viv_gem_free_object,
index 09f0011..a436edb 100644 (file)
 #define untagged_addr(addr) (addr)
 #endif
 
+#if (LINUX_VERSION_CODE > KERNEL_VERSION (4,20,17) && !defined(CONFIG_ARCH_NO_SG_CHAIN)) ||   \
+    (LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0)       \
+    && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN)))
+#define gcdUSE_Linux_SG_TABLE_API 1
+#else
+#define gcdUSE_Linux_SG_TABLE_API 0
+#endif
+
+
 extern struct device *galcore_device;
 
 /******************************************************************************\
index bba9150..55f6a4e 100644 (file)
@@ -492,6 +492,7 @@ _QueryProcessPageTable(
             return gcvSTATUS_NOT_FOUND;
 
         pte = pte_offset_map_lock(current->mm, pmd, logical, &ptl);
+
         if (!pte_present(*pte))
         {
             pte_unmap_unlock(pte, ptl);