summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXianzhong <xianzhong.li@nxp.com>2017-10-13 19:15:34 +0800
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit5b62f5059a2fe41ac9f990edff036e28b2a1944c (patch)
tree84c034a41572538f834981c4f36a187900448fce
parentaca26b1e312689ef25cf946840cf64cf5e0b1bca (diff)
MGS-3214 gpu-viv: integrate 6.2.4 driver
add dmabuf/gem feature through drm galcore, include more bug-fixing in gpu kernel driver. Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
-rw-r--r--drivers/mxc/gpu-viv/Kbuild10
-rw-r--r--drivers/mxc/gpu-viv/config1
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c15
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h15
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c2608
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h14
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c27
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h3
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c545
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h50
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c143
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c852
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c65
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c377
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c1
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c443
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h3360
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h84
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h20
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h99
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h132
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h49
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h26
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h3
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h10
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h490
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h6
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h1
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c249
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c76
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c394
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c157
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c4
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c279
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h71
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c77
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h8
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c45
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c493
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c86
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c208
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h7
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h6
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.c11
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c10
45 files changed, 7373 insertions, 4257 deletions
diff --git a/drivers/mxc/gpu-viv/Kbuild b/drivers/mxc/gpu-viv/Kbuild
index 8ba72e790eb2..84f0225bf3fe 100644
--- a/drivers/mxc/gpu-viv/Kbuild
+++ b/drivers/mxc/gpu-viv/Kbuild
@@ -102,6 +102,10 @@ ifneq ($(CONFIG_IOMMU_SUPPORT),)
OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_iommu.o
endif
+ifneq ($(CONFIG_DRM),)
+OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_drm.o
+endif
+
OBJS += $(HAL_KERNEL_DIR)/gc_hal_kernel.o \
$(HAL_KERNEL_DIR)/gc_hal_kernel_command.o \
$(HAL_KERNEL_DIR)/gc_hal_kernel_async_command.o \
@@ -289,6 +293,10 @@ ifeq ($(SECURITY), 1)
EXTRA_CFLAGS += -DgcdSECURITY=1
endif
+ifneq ($(CONFIG_DRM),)
+EXTRA_CFLAGS += -DgcdENABLE_DRM=$(VIVANTE_ENABLE_DRM)
+endif
+
EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/inc
EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel
EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/arch
@@ -307,7 +315,7 @@ endif
EXTRA_CFLAGS += -DHOST=\"$(HOST)\"
-EXTRA_CFLAGS += -DgcdENABLE_TRUST_APPLICATION=0
+EXTRA_CFLAGS += -DgcdENABLE_TRUST_APPLICATION=1
obj-$(CONFIG_MXC_GPU_VIV) = $(MODULE_NAME).o
diff --git a/drivers/mxc/gpu-viv/config b/drivers/mxc/gpu-viv/config
index fa3287a9dd21..a4fe0590f57a 100644
--- a/drivers/mxc/gpu-viv/config
+++ b/drivers/mxc/gpu-viv/config
@@ -58,6 +58,7 @@ SDK_DIR ?= $(AQROOT)/build/sdk
VIVANTE_ENABLE_3D ?= 1
VIVANTE_ENABLE_2D ?= 1
VIVANTE_ENABLE_VG ?= 1
+VIVANTE_ENABLE_DRM ?= 1
NO_DMA_COHERENT ?= 0
USE_PLATFORM_DRIVER ?= 1
ENABLE_GPU_CLOCK_BY_DRIVER ?= 0
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c
index 69574f61298a..b20aaf5a60c2 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c
@@ -1223,13 +1223,14 @@ if (halti5){ vsConstBase = 0xD000;
index += _State(Context, index, 0x038C0 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
index += _State(Context, index, 0x03884 >> 2, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
2:0) - (0 ? 2:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 2:0) - (0 ? 2:0) + 1))))))) << (0 ?
- 2:0))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ? 2:0) - (0 ? 2:0) + 1) == 32) ?
- ~0U : (~(~0U << ((1 ? 2:0) - (0 ? 2:0) + 1))))))) << (0 ? 2:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 20:16) - (0 ? 20:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 20:16) - (0 ?
- 20:16) + 1))))))) << (0 ? 20:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 20:16) - (0 ? 20:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 20:16) - (0 ?
- 20:16) + 1))))))) << (0 ? 20:16))), 1, gcvFALSE, gcvFALSE);
- }
+ 2:0))) | (((gctUINT32) ((gctUINT32) (hardware->options.uscL1CacheRatio) & ((gctUINT32) ((((1 ?
+ 2:0) - (0 ? 2:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 2:0) - (0 ? 2:0) + 1))))))) << (0 ?
+ 2:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 20:16) - (0 ?
+ 20:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 20:16) - (0 ? 20:16) + 1))))))) << (0 ?
+ 20:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 20:16) - (0 ?
+ 20:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 20:16) - (0 ? 20:16) + 1))))))) << (0 ?
+ 20:16))), 1, gcvFALSE, gcvFALSE);
+ }
else
{
index += _State(Context, index, 0x03820 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h
index 2614ee92d9ea..6a9092683d37 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h
@@ -178,15 +178,12 @@ struct _gckCONTEXT
gctBOOL_PTR hint;
#endif
- gcsPROFILER_COUNTERS latestProfiler;
- gcsPROFILER_COUNTERS histroyProfiler;
- gcsPROFILER_COUNTERS preProfiler;
- gcsPROFILER_NEW_COUNTERS_PART1 latestNewProfiler_part1;
- gcsPROFILER_NEW_COUNTERS_PART1 histroyNewProfiler_part1;
- gcsPROFILER_NEW_COUNTERS_PART1 preNewProfiler_part1;
- gcsPROFILER_NEW_COUNTERS_PART2 latestNewProfiler_part2;
- gcsPROFILER_NEW_COUNTERS_PART2 histroyNewProfiler_part2;
- gcsPROFILER_NEW_COUNTERS_PART2 preNewProfiler_part2;
+ gcsPROFILER_COUNTERS_PART1 latestProfiler_part1;
+ gcsPROFILER_COUNTERS_PART1 histroyProfiler_part1;
+ gcsPROFILER_COUNTERS_PART1 preProfiler_part1;
+ gcsPROFILER_COUNTERS_PART2 latestProfiler_part2;
+ gcsPROFILER_COUNTERS_PART2 histroyProfiler_part2;
+ gcsPROFILER_COUNTERS_PART2 preProfiler_part2;
};
#ifdef __cplusplus
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
index c9512765ec54..ebec019f9972 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
@@ -1070,6 +1070,9 @@ _QueryFeatureDatabase(
{
available = gcvFALSE;
}
+#if !gcdDVFS
+ available = gcvFALSE;
+#endif
break;
case gcvFEATURE_ACE:
@@ -1113,7 +1116,7 @@ _QueryFeatureDatabase(
break;
case gcvFEATURE_FENCE_64BIT:
- available = database->REG_Halti5;
+ available = database->FENCE_64BIT;
break;
case gcvFEATURE_TEX_BASELOD:
@@ -1251,7 +1254,7 @@ _QueryFeatureDatabase(
break;
case gcvFEATURE_SECURITY:
- available = gcvFALSE;
+ available = database->SECURITY;
break;
case gcvFEATURE_TX_DESCRIPTOR:
@@ -1338,6 +1341,14 @@ _QueryFeatureDatabase(
available = database->ASYNC_BLT;
break;
+ case gcvFEATURE_COMPUTE_ONLY:
+ available = database->COMPUTE_ONLY;
+ break;
+
+ case gcvFEATURE_USC_FULLCACHE_FIX:
+ available = database->USC_FULL_CACHE_FIX;
+ break;
+
default:
gcmkFATAL("Invalid feature has been requested.");
available = gcvFALSE;
@@ -1435,6 +1446,122 @@ _ConfigurePolicyID(
));
}
}
+/****************************
+** Initialise hardware options
+*/
+static void
+_SetHardwareOptions(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gcsHAL_QUERY_CHIP_OPTIONS *options = &Hardware->options;
+
+ status = gckOS_QueryOption(Hardware->os, "powerManagement", (gctUINT32*)&options->powerManagement);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ /* Enable power management by default. */
+ Hardware->options.powerManagement = gcvTRUE;
+ }
+
+ /* Disable profiler by default */
+ status = gckOS_QueryOption(Hardware->os, "gpuProfiler", (gctUINT32*)&options->gpuProfiler);
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ /* Disable profiler by default */
+ Hardware->options.gpuProfiler= gcvFALSE;
+ }
+ gckOS_QueryOption(Hardware->os, "mmu", (gctUINT32_PTR)&options->enableMMU);
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_USC))
+ {
+ gctUINT L1cacheSize;
+ gcsFEATURE_DATABASE *database = Hardware->featureDatabase;
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_COMPUTE_ONLY))
+ {
+ L1cacheSize = database->L1CacheSize;
+ }
+ else
+ {
+ gctUINT attribBufSizeInKB;
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_TESSELLATION))
+ {
+ /* GS/TS must be bundled. */
+ gcmkASSERT(gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_GEOMETRY_SHADER));
+ attribBufSizeInKB = 42;
+ }
+ else
+ {
+ gcmkASSERT(!gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_GEOMETRY_SHADER));
+ attribBufSizeInKB = 8;
+ }
+ L1cacheSize = database->USC_MAX_PAGES - attribBufSizeInKB;
+ }
+ gcmkASSERT(L1cacheSize);
+ if (L1cacheSize >= database->L1CacheSize)
+ {
+ Hardware->options.uscL1CacheRatio = 0x0;
+ gcmkASSERT(gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_USC_FULLCACHE_FIX));
+ }
+ else
+ {
+ static const gctINT s_uscCacheRatio[] =
+ {
+ 100000,/* 1.0f */
+ 50000, /* 0.5f */
+ 25000, /* 0.25f */
+ 12500, /* 0.125f */
+ 62500, /* 0.0625f */
+ 3125, /* 0.03125f */
+ 75000, /* 0.75f */
+ 0, /*0.0f */
+ };
+ gctINT maxL1cacheSize = L1cacheSize * 100000;
+ gctINT delta = 2147483647; /* start with very big delta */
+ gctINT i = 0;
+ gctINT curIndex = -1;
+ for (; i < gcmCOUNTOF(s_uscCacheRatio); ++i)
+ {
+ gctINT curL1cacheSize = database->L1CacheSize * s_uscCacheRatio[i];
+
+ if ((maxL1cacheSize >= curL1cacheSize) &&
+ ((maxL1cacheSize - curL1cacheSize) < delta))
+ {
+ curIndex = i;
+ delta = maxL1cacheSize - curL1cacheSize;
+ }
+ }
+ gcmkASSERT(-1 != curIndex);
+ Hardware->options.uscL1CacheRatio = curIndex;
+ }
+ }
+
+ options->secureMode = gcvSECURE_NONE;
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY))
+ {
+ gctUINT32 ta = 0;
+
+ gcmkASSERT(gcvSTATUS_TRUE == gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY_AHB));
+
+ options->secureMode = gcvSECURE_IN_NORMAL;
+
+ status = gckOS_QueryOption(Hardware->os, "TA", &ta);
+
+ if (gcmIS_SUCCESS(status) && ta)
+ {
+ options->secureMode = gcvSECURE_IN_TA;
+ }
+ }
+ else if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY_AHB))
+ {
+ options->secureMode = gcvSECURE_IN_NORMAL;
+ }
+
+ return;
+}
/*
* State timer helper must be called with powerMutex held.
@@ -1575,6 +1702,8 @@ gckHARDWARE_Construct(
/* Identify the hardware. */
gcmkONERROR(_IdentifyHardwareByDatabase(hardware, Os, Core, &hardware->identity));
+ _SetHardwareOptions(hardware);
+
hardware->mmuVersion = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_MMU);
/* Get the system's physical base address for old MMU */
@@ -1707,23 +1836,6 @@ gckHARDWARE_Construct(
gcmkONERROR(gckOS_AtomConstruct(Os, &hardware->pendingEvent));
- status = gckOS_QueryOption(Os, "powerManagement", (gctUINT32*)&hardware->powerManagement);
-
- if (status == gcvSTATUS_NOT_SUPPORTED)
- {
- /* Enable power management by default. */
- hardware->powerManagement = gcvTRUE;
- }
-
- /* Disable profiler by default */
- hardware->gpuProfiler = gcvFALSE;
- status = gckOS_QueryOption(Os, "gpuProfiler", (gctUINT32*)&hardware->gpuProfiler);
- if (status == gcvSTATUS_NOT_SUPPORTED)
- {
- /* Enable power management by default. */
- hardware->gpuProfiler= gcvFALSE;
- }
-
#if defined(LINUX) || defined(__QNXNTO__) || defined(UNDER_CE)
if (hardware->mmuVersion)
{
@@ -1736,8 +1848,6 @@ gckHARDWARE_Construct(
hardware->stallFEPrefetch = gcvTRUE;
}
- gcmkONERROR(gckOS_QueryOption(Os, "mmu", (gctUINT32_PTR)&hardware->enableMMU));
-
hardware->minFscaleValue = 1;
hardware->waitCount = 200;
@@ -1747,25 +1857,7 @@ gckHARDWARE_Construct(
gcmkONERROR(gckQUEUE_Allocate(hardware->os, &hardware->linkQueue, gcdLINK_QUEUE_SIZE));
#endif
- if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SECURITY))
- {
- gctUINT32 ta = 0;
-
- gcmkASSERT(gcvSTATUS_TRUE == gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SECURITY_AHB));
-
- status = gckOS_QueryOption(Os, "TA", &ta);
-
- if (gcmIS_SUCCESS(status))
- {
- hardware->secureMode = ta ? gcvSECURE_IN_TA : gcvSECURE_IN_NORMAL;
- }
- }
- else if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SECURITY_AHB))
- {
- hardware->secureMode = gcvSECURE_IN_NORMAL;
- }
-
- if (hardware->secureMode == gcvSECURE_IN_NORMAL)
+ if (hardware->options.secureMode == gcvSECURE_IN_NORMAL)
{
hardware->pagetableArray.size = 4096;
@@ -2012,6 +2104,24 @@ gckHARDWARE_InitializeHardware(
11:11) - (0 ? 11:11) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 11:11) - (0 ?
11:11) + 1))))))) << (0 ? 11:11)))));
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY_AHB) &&
+ (Hardware->options.secureMode == gcvSECURE_IN_NORMAL))
+ {
+ gctUINT32 ahbControl = 0;
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x003A8,
+ &ahbControl));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x003A8,
+ ((((gctUINT32) (ahbControl)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ? 1:1) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))));
+ }
+
/* Reset memory counters. */
gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
Hardware->core,
@@ -2426,6 +2536,7 @@ gckHARDWARE_InitializeHardware(
0x0010C,
&data));
+#if gcdDVFS
/* Disable internal DFS. */
data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
18:18) - (0 ? 18:18) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 18:18) - (0 ?
@@ -2433,6 +2544,11 @@ gckHARDWARE_InitializeHardware(
18:18) - (0 ? 18:18) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 18:18) - (0 ?
18:18) + 1))))))) << (0 ? 18:18)));
+#else
+ /* Disable externl DVFS and auto-gating*/
+ data &= ~0x50000;
+ data |= 0x20000;
+#endif
gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
Hardware->core,
0x0010C,
@@ -2618,6 +2734,43 @@ gckHARDWARE_QueryChipIdentity(
/*******************************************************************************
**
+** gckHARDWARE_QueryChipOptions
+**
+** Query the options of the hardware.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gcsHAL_QUERY_CHIP_OPTIONS_PTR Options
+** Pointer to the identity structure.
+**
+*/
+gceSTATUS
+gckHARDWARE_QueryChipOptions(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_QUERY_CHIP_OPTIONS_PTR Options
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Options != gcvNULL);
+
+ *Options = Hardware->options;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+
+/*******************************************************************************
+**
** gckHARDWARE_SplitMemory
**
** Split a hardware specific memory address into a pool and offset.
@@ -2760,7 +2913,7 @@ gckHARDWARE_Execute(
gcmkONERROR(gckOS_MemoryBarrier(Hardware->os, gcvNULL));
/* Write control register. */
- switch (Hardware->secureMode)
+ switch (Hardware->options.secureMode)
{
case gcvSECURE_NONE:
gcmkONERROR(
@@ -4308,13 +4461,14 @@ gckHARDWARE_Interrupt(
&dataEx
));
- if (dataEx & 0x80000000)
- {
- /* Descriptor fetched, update counter. */
- gckFE_UpdateAvaiable(Hardware, &Hardware->kernel->asyncCommand->fe);
+ /* this bit looks useless now, we can use this check if this interrupt is from FE */
+ dataEx &= ~0x80000000;
- dataEx &= ~0x80000000;
- }
+ /* Descriptor fetched, update counter.
+ We can't do this at dataEx != 0 only, as read HW acknowledge register will overwrite
+ 0x007E4. At one interrupt we don't read it, we will miss it.
+ */
+ gckFE_UpdateAvaiable(Hardware, &Hardware->kernel->asyncCommand->fe);
if (dataEx)
{
@@ -4657,12 +4811,13 @@ gckHARDWARE_SetMMU(
0x0040C,
address));
}
- else if (Hardware->enableMMU == gcvTRUE && Hardware->secureMode != gcvSECURE_IN_TA)
+ else if (Hardware->options.enableMMU &&
+ (Hardware->options.secureMode != gcvSECURE_IN_TA))
{
gctBOOL hwMmuDisabled = gcvTRUE;
/* Force Disable MMU to guarantee setup command be read from physical addr */
- if (Hardware->secureMode == gcvSECURE_IN_NORMAL)
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
{
gctUINT32 regMmuCtrl = 0;
gcmkONERROR(gckOS_ReadRegisterEx(
@@ -4704,7 +4859,7 @@ gckHARDWARE_SetMMU(
*(endLogical + 1) = Hardware->executeCount + 1;
- if (Hardware->secureMode == gcvSECURE_IN_NORMAL)
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
{
gctUINT32_PTR safeLogical = Hardware->kernel->mmu->safePageLogical;
gctUINT32 extSafeAddress;
@@ -4838,7 +4993,7 @@ gckHARDWARE_SetMMU(
while (!(((((gctUINT32) (idle)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ));
/* Enable MMU. */
- if (Hardware->secureMode == gcvSECURE_IN_NORMAL)
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
{
gcmkONERROR(gckOS_WriteRegisterEx(
Hardware->os,
@@ -4885,6 +5040,7 @@ gckHARDWARE_FlushAsyncMMU(
{
gctUINT32 semaphore, stall;
gctUINT32_PTR buffer;
+ gceSTATUS status;
gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
Hardware, Logical, gcmOPT_VALUE(Bytes));
@@ -4897,7 +5053,9 @@ gckHARDWARE_FlushAsyncMMU(
{
buffer = (gctUINT32_PTR) Logical;
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ?
31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ?
31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ?
@@ -4911,15 +5069,21 @@ gckHARDWARE_FlushAsyncMMU(
25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ?
25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ?
25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ?
- 25:16)));
+ 25:16)))
+ ));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 1,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 0:0) - (0 ?
0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ?
0:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ?
- ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ ));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 2,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ?
31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ?
31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ?
@@ -4933,18 +5097,24 @@ gckHARDWARE_FlushAsyncMMU(
25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ?
25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ?
25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ?
- 25:16)));
+ 25:16)))
+ ));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 3,
(((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
4:4) - (0 ? 4:4) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ?
4:4))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ?
~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) & ((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
7:7) - (0 ? 7:7) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ?
7:7))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ?
- ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))));
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))))
+ ));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 4,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ?
31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ?
31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ?
@@ -4958,7 +5128,8 @@ gckHARDWARE_FlushAsyncMMU(
15:0) - (0 ? 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ?
15:0))) | (((gctUINT32) ((gctUINT32) (0x0E02) & ((gctUINT32) ((((1 ? 15:0) - (0 ?
15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ?
- 15:0)));
+ 15:0)))
+ ));
semaphore = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
4:0) - (0 ? 4:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ?
@@ -4978,14 +5149,19 @@ gckHARDWARE_FlushAsyncMMU(
29:28) + 1))))))) << (0 ? 29:28)));
}
- *buffer++ =
- semaphore;
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 5,
+ semaphore));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 6,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ?
31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ?
31:27))) | (((gctUINT32) (0x09 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ?
- ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ ));
stall = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
4:0) - (0 ? 4:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ?
@@ -5005,10 +5181,14 @@ gckHARDWARE_FlushAsyncMMU(
29:28) + 1))))))) << (0 ? 29:28)));
}
- *buffer++ =
- stall;
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 7,
+ stall));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 8,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ?
31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ?
31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ?
@@ -5022,13 +5202,17 @@ gckHARDWARE_FlushAsyncMMU(
25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ?
25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ?
25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ?
- 25:16)));
+ 25:16)))
+ ));
- *buffer++ =
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 9,
((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 0:0) - (0 ?
0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ?
0:0))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ?
- ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ ));
}
if (Bytes != gcvNULL)
@@ -5040,6 +5224,11 @@ gckHARDWARE_FlushAsyncMMU(
/* Success. */
gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
return gcvSTATUS_OK;
+
+OnError:
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return status;
}
/*******************************************************************************
@@ -5402,7 +5591,7 @@ gckHARDWARE_SetMMUStates(
ace = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ACE);
- switch (Hardware->secureMode)
+ switch (Hardware->options.secureMode)
{
case gcvSECURE_IN_NORMAL:
reserveBytes = 8 + 4 * 4;
@@ -5520,7 +5709,7 @@ gckHARDWARE_SetMMUStates(
{
buffer = Logical;
- if (Hardware->secureMode == gcvSECURE_IN_NORMAL)
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
{
/* Setup page table array entry. */
if (Hardware->bigEndian)
@@ -5564,7 +5753,7 @@ gckHARDWARE_SetMMUStates(
}
else
{
- gcmkASSERT(Hardware->secureMode == gcvSECURE_NONE);
+ gcmkASSERT(Hardware->options.secureMode == gcvSECURE_NONE);
*buffer++
= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
@@ -7058,6 +7247,7 @@ gckHARDWARE_SetFastClear(
#if gcdENABLE_3D
gctUINT32 debug;
gceSTATUS status;
+ gceCOMPRESSION_OPTION compression = (Compression == -1) ? gcvCOMPRESSION_OPTION_DEFAULT : (gceCOMPRESSION_OPTION)Compression;
gcmkHEADER_ARG("Hardware=0x%x Enable=%d Compression=%d",
Hardware, Enable, Compression);
@@ -7073,10 +7263,20 @@ gckHARDWARE_SetFastClear(
) ? 1 : 0;
}
- if (Compression == -1)
+ if (compression == gcvCOMPRESSION_OPTION_DEFAULT)
{
/* Determine automatic value for compression. */
- Compression = Enable & gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ZCOMPRESSION);
+ if (Enable)
+ {
+ if (gcvSTATUS_FALSE == gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ZCOMPRESSION))
+ {
+ compression &= ~gcvCOMPRESSION_OPTION_DEPTH;
+ }
+ }
+ else
+ {
+ compression = gcvCOMPRESSION_OPTION_NONE;
+ }
}
/* Read AQMemoryDebug register. */
@@ -7096,9 +7296,9 @@ gckHARDWARE_SetFastClear(
/* Set compression bypass. */
debug = ((((gctUINT32) (debug)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
21:21) - (0 ? 21:21) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 21:21) - (0 ?
- 21:21) + 1))))))) << (0 ? 21:21))) | (((gctUINT32) ((gctUINT32) (Compression == 0) & ((gctUINT32) ((((1 ?
- 21:21) - (0 ? 21:21) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 21:21) - (0 ?
- 21:21) + 1))))))) << (0 ? 21:21)));
+ 21:21) + 1))))))) << (0 ? 21:21))) | (((gctUINT32) ((gctUINT32) ((gcvCOMPRESSION_OPTION_NONE == compression) ?
+ 1 : 0) & ((gctUINT32) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0U : (~(~0U << ((1 ?
+ 21:21) - (0 ? 21:21) + 1))))))) << (0 ? 21:21)));
}
/* Write back AQMemoryDebug register. */
@@ -7109,8 +7309,8 @@ gckHARDWARE_SetFastClear(
debug));
/* Store fast clear and comprersison flags. */
- Hardware->allowFastClear = Enable;
- Hardware->allowCompression = Compression;
+ Hardware->options.allowFastClear = Enable;
+ Hardware->options.allowCompression = compression;
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
"FastClear=%d Compression=%d", Enable, Compression);
@@ -7456,7 +7656,7 @@ gckHARDWARE_SetPowerManagementState(
break;
}
- if (Hardware->powerManagement == gcvFALSE
+ if (Hardware->options.powerManagement == gcvFALSE
&& State != gcvPOWER_ON
)
{
@@ -7927,8 +8127,8 @@ gckHARDWARE_SetPowerManagementState(
gcmkONERROR(gckHARDWARE_InitializeHardware(Hardware));
gcmkONERROR(gckHARDWARE_SetFastClear(Hardware,
- Hardware->allowFastClear,
- Hardware->allowCompression));
+ Hardware->options.allowFastClear,
+ Hardware->options.allowCompression));
/* Force the command queue to reload the next context. */
command->currContext = gcvNULL;
@@ -8160,7 +8360,7 @@ gckHARDWARE_SetPowerManagement(
gcmkVERIFY_OK(
gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE));
- Hardware->powerManagement = PowerManagement;
+ Hardware->options.powerManagement = PowerManagement;
gcmkVERIFY_OK(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex));
@@ -8223,7 +8423,7 @@ gckHARDWARE_SetGpuProfiler(
data));
}
- Hardware->gpuProfiler = GpuProfiler;
+ Hardware->options.gpuProfiler= GpuProfiler;
if (GpuProfiler == gcvTRUE)
{
@@ -8551,22 +8751,6 @@ OnError:
/*******************************************************************************
** Handy macros that will help in reading those debug registers.
*/
-
-#define gcmkREAD_DEBUG_REGISTER(control, block, index, data) \
- gcmkONERROR(\
- gckOS_WriteRegisterEx(Hardware->os, \
- Hardware->core, \
- GC_DEBUG_CONTROL##control##_Address, \
- gcmSETFIELD(0, \
- GC_DEBUG_CONTROL##control, \
- block, \
- index))); \
- gcmkONERROR(\
- gckOS_ReadRegisterEx(Hardware->os, \
- Hardware->core, \
- GC_DEBUG_SIGNALS_##block##_Address, \
- &profiler->data))
-
#define gcmkREAD_DEBUG_REGISTER_PART1(control, block, index, data) \
gcmkONERROR(\
gckOS_WriteRegisterEx(Hardware->os, \
@@ -8596,18 +8780,6 @@ OnError:
Hardware->core, \
GC_DEBUG_SIGNALS_##block##_Address, \
&profiler_part2->data))
-#if USE_SW_RESET
-#define gcmkREAD_DEBUG_REGISTER_Q(control, block, index, data) \
- gcmkREAD_DEBUG_REGISTER(control, block, index, data); \
- tempCounterValue = profiler->data; \
- profiler->data = CalcDelta(profiler->data, profilerHistory.data); \
- profilerHistory.data = tempCounterValue
-
-#else
-#define gcmkREAD_DEBUG_REGISTER_Q(control, block, index, data) \
- gcmkREAD_DEBUG_REGISTER(control, block, index, data)
-
-#endif
#define gcmkREAD_DEBUG_REGISTER_N(control, block, index, data) \
gcmkONERROR(\
@@ -8642,83 +8814,6 @@ OnError:
block, \
0)))
-
-/*******************************************************************************
-**
-** gckHARDWARE_ProfileEngine2D
-**
-** Read the profile registers available in the 2D engine and sets them in the
-** profile. The function will also reset the pixelsRendered counter every time.
-**
-** INPUT:
-**
-** gckHARDWARE Hardware
-** Pointer to an gckHARDWARE object.
-**
-** OPTIONAL gcs2D_PROFILE_PTR Profile
-** Pointer to a gcs2D_Profile structure.
-**
-** OUTPUT:
-**
-** Nothing.
-*/
-gceSTATUS
-gckHARDWARE_ProfileEngine2D(
- IN gckHARDWARE Hardware,
- OPTIONAL gcs2D_PROFILE_PTR Profile
- )
-{
- gceSTATUS status;
- gcs2D_PROFILE_PTR profiler = Profile;
-
- gcmkHEADER_ARG("Hardware=0x%x", Hardware);
-
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
-
- if (Profile != gcvNULL)
- {
- /* Read the cycle count. */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00438,
- &Profile->cycleCount));
-
- /* Read pixels rendered by 2D engine. */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &profiler->pixelsRendered));
-
- /* Reset counter. */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))
-));
- }
-
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
-OnError:
- /* Return the status. */
- gcmkFOOTER();
- return status;
-}
-
-#if VIVANTE_PROFILER
-
static gctUINT32
CalcDelta(
IN gctUINT32 new,
@@ -8737,924 +8832,12 @@ CalcDelta(
#if USE_SW_RESET
-#define gcmkRESET_PROFILE_DATA(counterName, preCounters) \
- temp = profiler->counterName; \
- profiler->counterName = CalcDelta(temp, Context->preCounters.counterName); \
- Context->preCounters.counterName = temp
-
-#define gcmkRESET_PROFILE_DATA_PART1(counterName, preCounters) \
+#define gcmkRESET_PROFILE_DATA_PART1(counterName) \
temp = profiler_part1->counterName; \
- profiler_part1->counterName = CalcDelta(temp, Context->preCounters.counterName); \
- Context->preCounters.counterName = temp
-#endif
-
-gceSTATUS
-gckHARDWARE_QueryProfileRegisters(
- IN gckHARDWARE Hardware,
- IN gctBOOL Reset,
- OUT gcsPROFILER_COUNTERS * Counters
- )
-{
- gceSTATUS status;
- gcsPROFILER_COUNTERS * profiler = Counters;
- gctUINT i, clock;
- gctUINT32 colorKilled, colorDrawn, depthKilled, depthDrawn;
- gctUINT32 totalRead, totalWrite;
- gceCHIPMODEL chipModel;
- gctUINT32 chipRevision;
- gctUINT32 resetValue = 0xF;
- gctBOOL hasNewCounters = gcvFALSE;
- gctUINT32 mc_axi_max_min_latency;
- static gcsPROFILER_COUNTERS profilerHistory;
- static gctBOOL isFirstFrame = gcvTRUE;
- gctUINT32 tempCounterValue;
- gctUINT32 totalColorKilled = 0;
- gctUINT32 totalDepthKilled = 0;
- gctUINT32 totalColorDrawn = 0;
- gctUINT32 totalDepthDrawn = 0;
-
- gcmkHEADER_ARG("Hardware=0x%x Counters=0x%x", Hardware, Counters);
-
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
- if (isFirstFrame)
- {
- gckOS_ZeroMemory(&profilerHistory, sizeof(gcsPROFILER_COUNTERS));
- isFirstFrame = gcvFALSE;
- }
-
- chipModel = Hardware->identity.chipModel;
- chipRevision = Hardware->identity.chipRevision;
- if ((chipModel == gcv5000 && chipRevision == 0x5434) || (chipModel == gcv3000 && chipRevision == 0x5435))
- {
- resetValue = 0xFF;
- hasNewCounters = gcvTRUE;
- }
-
- /* Read the counters. */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00438,
- &profiler->gpuCyclesCounter));
-
- /* This counter should be equal to 0x00438. Currently it's not displayed in vAnalyzer */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00078,
- &profiler->gpuTotalCyclesCounter));
-
- if (chipModel == gcv2100 || chipModel == gcv2000 || chipModel == gcv880)
- {
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00078,
- &profiler->gpuIdleCyclesCounter));
- }
- else
- {
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x0007C,
- &profiler->gpuIdleCyclesCounter));
- }
-
- /* Read clock control register. */
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00000,
- &clock));
-
- profiler->gpuTotalRead64BytesPerFrame = 0;
- profiler->gpuTotalWrite64BytesPerFrame = 0;
- profiler->pe_pixel_count_killed_by_color_pipe = 0;
- profiler->pe_pixel_count_killed_by_depth_pipe = 0;
- profiler->pe_pixel_count_drawn_by_color_pipe = 0;
- profiler->pe_pixel_count_drawn_by_depth_pipe = 0;
-
- /* Walk through all avaiable pixel pipes. */
- for (i = 0; i < Hardware->identity.pixelPipes; ++i)
- {
- /* Select proper pipe. */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00000,
- ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:20) - (0 ? 23:20) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:20) - (0 ?
- 23:20) + 1))))))) << (0 ? 23:20))) | (((gctUINT32) ((gctUINT32) (i) & ((gctUINT32) ((((1 ?
- 23:20) - (0 ? 23:20) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:20) - (0 ?
- 23:20) + 1))))))) << (0 ? 23:20)))));
-
- /* BW */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00040,
- &totalRead));
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00044,
- &totalWrite));
-
- profiler->gpuTotalRead64BytesPerFrame += totalRead;
- profiler->gpuTotalWrite64BytesPerFrame += totalWrite;
-
- /* PE */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &colorKilled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &depthKilled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &colorDrawn));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &depthDrawn));
-
-#if USE_SW_RESET
- totalColorKilled += colorKilled;
- totalDepthKilled += depthKilled;
- totalColorDrawn += colorDrawn;
- totalDepthDrawn += depthDrawn;
-#else
- profiler->pe_pixel_count_killed_by_color_pipe += colorKilled;
- profiler->pe_pixel_count_killed_by_depth_pipe += depthKilled;
- profiler->pe_pixel_count_drawn_by_color_pipe += colorDrawn;
- profiler->pe_pixel_count_drawn_by_depth_pipe += depthDrawn;
-#endif
- }
-
-#if USE_SW_RESET
- profiler->pe_pixel_count_killed_by_color_pipe = CalcDelta(totalColorKilled, profilerHistory.pe_pixel_count_killed_by_color_pipe);
- profiler->pe_pixel_count_killed_by_depth_pipe = CalcDelta(totalDepthKilled, profilerHistory.pe_pixel_count_killed_by_depth_pipe);
- profiler->pe_pixel_count_drawn_by_color_pipe = CalcDelta(totalColorDrawn, profilerHistory.pe_pixel_count_drawn_by_color_pipe);
- profiler->pe_pixel_count_drawn_by_depth_pipe = CalcDelta(totalDepthDrawn, profilerHistory.pe_pixel_count_drawn_by_depth_pipe);
- profilerHistory.pe_pixel_count_killed_by_color_pipe = totalColorKilled;
- profilerHistory.pe_pixel_count_killed_by_depth_pipe = totalDepthKilled;
- profilerHistory.pe_pixel_count_drawn_by_color_pipe = totalColorDrawn;
- profilerHistory.pe_pixel_count_drawn_by_depth_pipe = totalDepthDrawn;
-#endif
-
- /* Reset clock control register. */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00000,
- clock));
-
- /* Reset counters. */
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 1));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 0));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00078, 0));
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))
-));
-#endif
-
- /* SH */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->ps_inst_counter)); tempCounterValue = profiler->ps_inst_counter;
- profiler->ps_inst_counter = CalcDelta(profiler->ps_inst_counter, profilerHistory.ps_inst_counter);
- profilerHistory.ps_inst_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->rendered_pixel_counter)); tempCounterValue = profiler->rendered_pixel_counter;
- profiler->rendered_pixel_counter = CalcDelta(profiler->rendered_pixel_counter,
- profilerHistory.rendered_pixel_counter); profilerHistory.rendered_pixel_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vs_inst_counter)); tempCounterValue = profiler->vs_inst_counter;
- profiler->vs_inst_counter = CalcDelta(profiler->vs_inst_counter, profilerHistory.vs_inst_counter);
- profilerHistory.vs_inst_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->rendered_vertice_counter)); tempCounterValue = profiler->rendered_vertice_counter;
- profiler->rendered_vertice_counter = CalcDelta(profiler->rendered_vertice_counter,
- profilerHistory.rendered_vertice_counter); profilerHistory.rendered_vertice_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vtx_branch_inst_counter)); tempCounterValue = profiler->vtx_branch_inst_counter;
- profiler->vtx_branch_inst_counter = CalcDelta(profiler->vtx_branch_inst_counter,
- profilerHistory.vtx_branch_inst_counter); profilerHistory.vtx_branch_inst_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vtx_texld_inst_counter)); tempCounterValue = profiler->vtx_texld_inst_counter;
- profiler->vtx_texld_inst_counter = CalcDelta(profiler->vtx_texld_inst_counter,
- profilerHistory.vtx_texld_inst_counter); profilerHistory.vtx_texld_inst_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->pxl_branch_inst_counter)); tempCounterValue = profiler->pxl_branch_inst_counter;
- profiler->pxl_branch_inst_counter = CalcDelta(profiler->pxl_branch_inst_counter,
- profilerHistory.pxl_branch_inst_counter); profilerHistory.pxl_branch_inst_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->pxl_texld_inst_counter)); tempCounterValue = profiler->pxl_texld_inst_counter;
- profiler->pxl_texld_inst_counter = CalcDelta(profiler->pxl_texld_inst_counter,
- profilerHistory.pxl_texld_inst_counter); profilerHistory.pxl_texld_inst_counter = tempCounterValue;
-
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (19) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vs_non_idle_starve_count)); tempCounterValue = profiler->vs_non_idle_starve_count;
- profiler->vs_non_idle_starve_count = CalcDelta(profiler->vs_non_idle_starve_count,
- profilerHistory.vs_non_idle_starve_count); profilerHistory.vs_non_idle_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vs_starve_count)); tempCounterValue = profiler->vs_starve_count;
- profiler->vs_starve_count = CalcDelta(profiler->vs_starve_count, profilerHistory.vs_starve_count);
- profilerHistory.vs_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (16) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vs_stall_count)); tempCounterValue = profiler->vs_stall_count;
- profiler->vs_stall_count = CalcDelta(profiler->vs_stall_count, profilerHistory.vs_stall_count);
- profilerHistory.vs_stall_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (21) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->vs_process_count)); tempCounterValue = profiler->vs_process_count;
- profiler->vs_process_count = CalcDelta(profiler->vs_process_count, profilerHistory.vs_process_count);
- profilerHistory.vs_process_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (20) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->ps_non_idle_starve_count)); tempCounterValue = profiler->ps_non_idle_starve_count;
- profiler->ps_non_idle_starve_count = CalcDelta(profiler->ps_non_idle_starve_count,
- profilerHistory.ps_non_idle_starve_count); profilerHistory.ps_non_idle_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (17) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->ps_starve_count)); tempCounterValue = profiler->ps_starve_count;
- profiler->ps_starve_count = CalcDelta(profiler->ps_starve_count, profilerHistory.ps_starve_count);
- profilerHistory.ps_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (18) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->ps_stall_count)); tempCounterValue = profiler->ps_stall_count;
- profiler->ps_stall_count = CalcDelta(profiler->ps_stall_count, profilerHistory.ps_stall_count);
- profilerHistory.ps_stall_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (22) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->ps_process_count)); tempCounterValue = profiler->ps_process_count;
- profiler->ps_process_count = CalcDelta(profiler->ps_process_count, profilerHistory.ps_process_count);
- profilerHistory.ps_process_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->shader_cycle_count)); tempCounterValue = profiler->shader_cycle_count;
- profiler->shader_cycle_count = CalcDelta(profiler->shader_cycle_count,
- profilerHistory.shader_cycle_count); profilerHistory.shader_cycle_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (23) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->tx_non_idle_starve_count)); tempCounterValue = profiler->tx_non_idle_starve_count;
- profiler->tx_non_idle_starve_count = CalcDelta(profiler->tx_non_idle_starve_count,
- profilerHistory.tx_non_idle_starve_count); profilerHistory.tx_non_idle_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (24) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->tx_starve_count)); tempCounterValue = profiler->tx_starve_count;
- profiler->tx_starve_count = CalcDelta(profiler->tx_starve_count, profilerHistory.tx_starve_count);
- profilerHistory.tx_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (25) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->tx_stall_count)); tempCounterValue = profiler->tx_stall_count;
- profiler->tx_stall_count = CalcDelta(profiler->tx_stall_count, profilerHistory.tx_stall_count);
- profilerHistory.tx_stall_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (26) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C,
- &profiler->tx_process_count)); tempCounterValue = profiler->tx_process_count;
- profiler->tx_process_count = CalcDelta(profiler->tx_process_count, profilerHistory.tx_process_count);
- profilerHistory.tx_process_count = tempCounterValue;
-
- }
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24)))
-));
-#endif
-
- /* PA */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_input_vtx_counter)); tempCounterValue = profiler->pa_input_vtx_counter;
- profiler->pa_input_vtx_counter = CalcDelta(profiler->pa_input_vtx_counter,
- profilerHistory.pa_input_vtx_counter); profilerHistory.pa_input_vtx_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_input_prim_counter)); tempCounterValue = profiler->pa_input_prim_counter;
- profiler->pa_input_prim_counter = CalcDelta(profiler->pa_input_prim_counter,
- profilerHistory.pa_input_prim_counter); profilerHistory.pa_input_prim_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_output_prim_counter)); tempCounterValue = profiler->pa_output_prim_counter;
- profiler->pa_output_prim_counter = CalcDelta(profiler->pa_output_prim_counter,
- profilerHistory.pa_output_prim_counter); profilerHistory.pa_output_prim_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_depth_clipped_counter)); tempCounterValue = profiler->pa_depth_clipped_counter;
- profiler->pa_depth_clipped_counter = CalcDelta(profiler->pa_depth_clipped_counter,
- profilerHistory.pa_depth_clipped_counter); profilerHistory.pa_depth_clipped_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_trivial_rejected_counter)); tempCounterValue = profiler->pa_trivial_rejected_counter;
- profiler->pa_trivial_rejected_counter = CalcDelta(profiler->pa_trivial_rejected_counter,
- profilerHistory.pa_trivial_rejected_counter); profilerHistory.pa_trivial_rejected_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_culled_counter)); tempCounterValue = profiler->pa_culled_counter;
- profiler->pa_culled_counter = CalcDelta(profiler->pa_culled_counter, profilerHistory.pa_culled_counter);
- profilerHistory.pa_culled_counter = tempCounterValue;
-
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_starve_count)); tempCounterValue = profiler->pa_starve_count;
- profiler->pa_starve_count = CalcDelta(profiler->pa_starve_count, profilerHistory.pa_starve_count);
- profilerHistory.pa_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_stall_count)); tempCounterValue = profiler->pa_stall_count;
- profiler->pa_stall_count = CalcDelta(profiler->pa_stall_count, profilerHistory.pa_stall_count);
- profilerHistory.pa_stall_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_process_count)); tempCounterValue = profiler->pa_process_count;
- profiler->pa_process_count = CalcDelta(profiler->pa_process_count, profilerHistory.pa_process_count);
- profilerHistory.pa_process_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460,
- &profiler->pa_non_idle_starve_count)); tempCounterValue = profiler->pa_non_idle_starve_count;
- profiler->pa_non_idle_starve_count = CalcDelta(profiler->pa_non_idle_starve_count,
- profilerHistory.pa_non_idle_starve_count); profilerHistory.pa_non_idle_starve_count = tempCounterValue;
-
- }
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0)))
-));
-#endif
-
- /* SE */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_culled_triangle_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_culled_lines_count));
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_receive_triangle_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_send_triangle_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_receive_lines_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_send_lines_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (19) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_process_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (20) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_non_idle_starve_count));
- }
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8)))
-));
-
- /* RA */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_valid_pixel_count)); tempCounterValue = profiler->ra_valid_pixel_count;
- profiler->ra_valid_pixel_count = CalcDelta(profiler->ra_valid_pixel_count,
- profilerHistory.ra_valid_pixel_count); profilerHistory.ra_valid_pixel_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_total_quad_count)); tempCounterValue = profiler->ra_total_quad_count;
- profiler->ra_total_quad_count = CalcDelta(profiler->ra_total_quad_count,
- profilerHistory.ra_total_quad_count); profilerHistory.ra_total_quad_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_valid_quad_count_after_early_z)); tempCounterValue = profiler->ra_valid_quad_count_after_early_z;
- profiler->ra_valid_quad_count_after_early_z = CalcDelta(profiler->ra_valid_quad_count_after_early_z,
- profilerHistory.ra_valid_quad_count_after_early_z); profilerHistory.ra_valid_quad_count_after_early_z = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_total_primitive_count)); tempCounterValue = profiler->ra_total_primitive_count;
- profiler->ra_total_primitive_count = CalcDelta(profiler->ra_total_primitive_count,
- profilerHistory.ra_total_primitive_count); profilerHistory.ra_total_primitive_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_pipe_cache_miss_counter)); tempCounterValue = profiler->ra_pipe_cache_miss_counter;
- profiler->ra_pipe_cache_miss_counter = CalcDelta(profiler->ra_pipe_cache_miss_counter,
- profilerHistory.ra_pipe_cache_miss_counter); profilerHistory.ra_pipe_cache_miss_counter = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_prefetch_cache_miss_counter)); tempCounterValue = profiler->ra_prefetch_cache_miss_counter;
- profiler->ra_prefetch_cache_miss_counter = CalcDelta(profiler->ra_prefetch_cache_miss_counter,
- profilerHistory.ra_prefetch_cache_miss_counter); profilerHistory.ra_prefetch_cache_miss_counter = tempCounterValue;
-
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_non_idle_starve_count)); tempCounterValue = profiler->ra_non_idle_starve_count;
- profiler->ra_non_idle_starve_count = CalcDelta(profiler->ra_non_idle_starve_count,
- profilerHistory.ra_non_idle_starve_count); profilerHistory.ra_non_idle_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_starve_count)); tempCounterValue = profiler->ra_starve_count;
- profiler->ra_starve_count = CalcDelta(profiler->ra_starve_count, profilerHistory.ra_starve_count);
- profilerHistory.ra_starve_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_stall_count)); tempCounterValue = profiler->ra_stall_count;
- profiler->ra_stall_count = CalcDelta(profiler->ra_stall_count, profilerHistory.ra_stall_count);
- profilerHistory.ra_stall_count = tempCounterValue;
-
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (16) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448,
- &profiler->ra_process_count)); tempCounterValue = profiler->ra_process_count;
- profiler->ra_process_count = CalcDelta(profiler->ra_process_count, profilerHistory.ra_process_count);
- profilerHistory.ra_process_count = tempCounterValue;
-
- }
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))
-));
-#endif
-
- /* TX */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_bilinear_requests));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_trilinear_requests));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_discarded_texture_requests));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_texture_requests));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_mem_read_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_mem_read_in_8B_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_miss_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_hit_texel_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_miss_texel_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24)))
-));
-
- /* MC */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_read_req_8B_from_pipeline));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_read_req_8B_from_IP));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_write_req_8B_from_pipeline));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0)))
-));
-
- /* HI */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_read_request_stalled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_write_request_stalled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_write_data_stalled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8)))
-));
-
- if (hasNewCounters)
- {
- /* latency */
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x0056C,
- &mc_axi_max_min_latency));
-
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00570,
- &profiler->mc_axi_total_latency));
-
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00574,
- &profiler->mc_axi_sample_count));
-
- /* Reset Latency counters */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00568,
- 0x10a));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00568,
- 0xa));
-
- profiler->mc_axi_min_latency = (mc_axi_max_min_latency & 0x0fff0000) >> 16;
- profiler->mc_axi_max_latency = (mc_axi_max_min_latency & 0x00000fff);
- if (profiler->mc_axi_min_latency == 4095)
- profiler->mc_axi_min_latency = 0;
-
- /* FE */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_draw_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_out_vertex_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0)))
-));
- }
-
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
-OnError:
- /* Return the status. */
- gcmkFOOTER();
- return status;
-}
+ profiler_part1->counterName = CalcDelta(temp, Context->preProfiler_part1.counterName); \
+ Context->preProfiler_part1.counterName = temp
#endif
-#define gcmkUPDATE_PROFILE_DATA(data) \
- profilerHistroy->data += profiler->data
-
#define gcmkUPDATE_PROFILE_DATA_PART1(data) \
profilerHistroy_part1->data += profiler_part1->data
#define gcmkUPDATE_PROFILE_DATA_PART2(data) \
@@ -9665,980 +8848,14 @@ gckHARDWARE_QueryContextProfile(
IN gckHARDWARE Hardware,
IN gctBOOL Reset,
IN gckCONTEXT Context,
- OUT gcsPROFILER_COUNTERS * Counters
- )
-{
- gceSTATUS status;
- gckCOMMAND command = Hardware->kernel->command;
- gcsPROFILER_COUNTERS * profiler = Counters;
-
- gcmkHEADER_ARG("Hardware=0x%x Counters=0x%x", Hardware, Counters);
-
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
-
- /* Acquire the context sequnence mutex. */
- gcmkONERROR(gckOS_AcquireMutex(
- command->os, command->mutexContextSeq, gcvINFINITE
- ));
-
- /* Read the counters. */
- gcmkVERIFY_OK(gckOS_MemCopy(
- profiler, &Context->histroyProfiler, gcmSIZEOF(gcsPROFILER_COUNTERS)
- ));
-
- /* Reset counters. */
- if (Reset)
- {
- gcmkVERIFY_OK(gckOS_ZeroMemory(
- &Context->histroyProfiler, gcmSIZEOF(gcsPROFILER_COUNTERS)
- ));
- }
-
- gcmkVERIFY_OK(gckOS_ReleaseMutex(
- command->os, command->mutexContextSeq
- ));
-
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
-OnError:
- /* Return the status. */
- gcmkFOOTER();
- return status;
-}
-
-gceSTATUS
-gckHARDWARE_UpdateContextProfile(
- IN gckHARDWARE Hardware,
- IN gckCONTEXT Context
- )
-{
- gceSTATUS status;
- gcsPROFILER_COUNTERS * profiler = &Context->latestProfiler;
- gcsPROFILER_COUNTERS * profilerHistroy = &Context->histroyProfiler;
- gceCHIPMODEL chipModel;
- gctUINT32 chipRevision;
- gctUINT32 i;
- gctUINT32 resetValue = 0xF;
- gctBOOL hasNewCounters = gcvFALSE;
-
- gcmkHEADER_ARG("Hardware=0x%x Context=0x%x", Hardware, Context);
-
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
- gcmkVERIFY_OBJECT(Context, gcvOBJ_CONTEXT);
-
- chipModel = Hardware->identity.chipModel;
- chipRevision = Hardware->identity.chipRevision;
- if ((chipModel == gcv5000 && chipRevision == 0x5434) || (chipModel == gcv3000 && chipRevision == 0x5435))
- {
- resetValue = 0xFF;
- hasNewCounters = gcvTRUE;
- }
-
- /* Read the counters. */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00438,
- &profiler->gpuCyclesCounter));
- gcmkUPDATE_PROFILE_DATA(gpuCyclesCounter);
-
- /* This counter should be equal to 0x00438. Currently it's not displayed in vAnalyzer */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00078,
- &profiler->gpuTotalCyclesCounter));
- gcmkUPDATE_PROFILE_DATA(gpuTotalCyclesCounter);
-
- if (chipModel == gcv2100 || chipModel == gcv2000 || chipModel == gcv880)
- {
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00078,
- &profiler->gpuIdleCyclesCounter));
- }
- else
- {
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x0007C,
- &profiler->gpuIdleCyclesCounter));
- }
- gcmkUPDATE_PROFILE_DATA(gpuIdleCyclesCounter);
-
- {
- gctUINT clock;
- gctUINT32 colorKilled = 0, colorDrawn = 0, depthKilled = 0, depthDrawn = 0;
- gctUINT32 totalRead, totalWrite;
- gctUINT32 mc_axi_max_min_latency;
-
- gctUINT32 temp;
-
- /* Read clock control register. */
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00000,
- &clock));
-
- profiler->gpuTotalRead64BytesPerFrame = 0;
- profiler->gpuTotalWrite64BytesPerFrame = 0;
- profiler->pe_pixel_count_killed_by_color_pipe = 0;
- profiler->pe_pixel_count_killed_by_depth_pipe = 0;
- profiler->pe_pixel_count_drawn_by_color_pipe = 0;
- profiler->pe_pixel_count_drawn_by_depth_pipe = 0;
-
- /* Walk through all avaiable pixel pipes. */
- for (i = 0; i < Hardware->identity.pixelPipes; ++i)
- {
- /* Select proper pipe. */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00000,
- ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:20) - (0 ? 23:20) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:20) - (0 ?
- 23:20) + 1))))))) << (0 ? 23:20))) | (((gctUINT32) ((gctUINT32) (i) & ((gctUINT32) ((((1 ?
- 23:20) - (0 ? 23:20) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:20) - (0 ?
- 23:20) + 1))))))) << (0 ? 23:20)))));
-
- /* BW */
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00040,
- &totalRead));
- gcmkONERROR(
- gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00044,
- &totalWrite));
-
- profiler->gpuTotalRead64BytesPerFrame += totalRead;
- profiler->gpuTotalWrite64BytesPerFrame += totalWrite;
-
- /* PE */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &colorKilled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &depthKilled));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &colorDrawn));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454,
- &depthDrawn));
-
- profiler->pe_pixel_count_killed_by_color_pipe += colorKilled;
- profiler->pe_pixel_count_killed_by_depth_pipe += depthKilled;
- profiler->pe_pixel_count_drawn_by_color_pipe += colorDrawn;
- profiler->pe_pixel_count_drawn_by_depth_pipe += depthDrawn;
- }
-
- gcmkUPDATE_PROFILE_DATA(gpuTotalRead64BytesPerFrame);
- gcmkUPDATE_PROFILE_DATA(gpuTotalWrite64BytesPerFrame);
-#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA(pe_pixel_count_killed_by_color_pipe, preProfiler);
- gcmkRESET_PROFILE_DATA(pe_pixel_count_killed_by_depth_pipe, preProfiler);
- gcmkRESET_PROFILE_DATA(pe_pixel_count_drawn_by_color_pipe, preProfiler);
- gcmkRESET_PROFILE_DATA(pe_pixel_count_drawn_by_depth_pipe, preProfiler);
-#endif
- gcmkUPDATE_PROFILE_DATA(pe_pixel_count_killed_by_color_pipe);
- gcmkUPDATE_PROFILE_DATA(pe_pixel_count_killed_by_depth_pipe);
- gcmkUPDATE_PROFILE_DATA(pe_pixel_count_drawn_by_color_pipe);
- gcmkUPDATE_PROFILE_DATA(pe_pixel_count_drawn_by_depth_pipe);
-
- /* Reset clock control register. */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00000,
- clock));
-
- /* Reset counters. */
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 1));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 0));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00078, 0));
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))
-));
-#endif
-
- /* SH */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->ps_inst_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->rendered_pixel_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vs_inst_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->rendered_vertice_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vtx_branch_inst_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vtx_texld_inst_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->pxl_branch_inst_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->pxl_texld_inst_counter));
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (19) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vs_non_idle_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vs_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (16) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vs_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (21) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vs_process_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (20) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->ps_non_idle_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (17) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->ps_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (18) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->ps_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (22) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->ps_process_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->shader_cycle_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (23) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->tx_non_idle_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (24) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->tx_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (25) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->tx_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (26) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->tx_process_count));
- }
-#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA(ps_inst_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(rendered_pixel_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(vs_inst_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(rendered_vertice_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(vtx_branch_inst_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(vtx_texld_inst_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pxl_branch_inst_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pxl_texld_inst_counter, preProfiler);
- if (hasNewCounters)
- {
- gcmkRESET_PROFILE_DATA(vs_non_idle_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(vs_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(vs_stall_count, preProfiler);
- gcmkRESET_PROFILE_DATA(vs_process_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ps_non_idle_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ps_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ps_stall_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ps_process_count, preProfiler);
- gcmkRESET_PROFILE_DATA(shader_cycle_count, preProfiler);
- gcmkRESET_PROFILE_DATA(tx_non_idle_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(tx_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(tx_stall_count, preProfiler);
- gcmkRESET_PROFILE_DATA(tx_process_count, preProfiler);
- }
-#endif
- gcmkUPDATE_PROFILE_DATA(ps_inst_counter);
- gcmkUPDATE_PROFILE_DATA(rendered_pixel_counter);
- gcmkUPDATE_PROFILE_DATA(vs_inst_counter);
- gcmkUPDATE_PROFILE_DATA(rendered_vertice_counter);
- gcmkUPDATE_PROFILE_DATA(vtx_branch_inst_counter);
- gcmkUPDATE_PROFILE_DATA(vtx_texld_inst_counter);
- gcmkUPDATE_PROFILE_DATA(pxl_branch_inst_counter);
- gcmkUPDATE_PROFILE_DATA(pxl_texld_inst_counter);
- if (hasNewCounters)
- {
- gcmkUPDATE_PROFILE_DATA(vs_non_idle_starve_count);
- gcmkUPDATE_PROFILE_DATA(vs_starve_count);
- gcmkUPDATE_PROFILE_DATA(vs_stall_count);
- gcmkUPDATE_PROFILE_DATA(vs_process_count);
- gcmkUPDATE_PROFILE_DATA(ps_non_idle_starve_count);
- gcmkUPDATE_PROFILE_DATA(ps_starve_count);
- gcmkUPDATE_PROFILE_DATA(ps_stall_count);
- gcmkUPDATE_PROFILE_DATA(ps_process_count);
- gcmkUPDATE_PROFILE_DATA(shader_cycle_count);
- gcmkUPDATE_PROFILE_DATA(tx_non_idle_starve_count);
- gcmkUPDATE_PROFILE_DATA(tx_starve_count);
- gcmkUPDATE_PROFILE_DATA(tx_stall_count);
- gcmkUPDATE_PROFILE_DATA(tx_process_count);
- }
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24)))
-));
-#endif
-
- /* PA */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_input_vtx_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_input_prim_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_output_prim_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_depth_clipped_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_trivial_rejected_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_culled_counter));
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_non_idle_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_process_count));
- }
-#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA(pa_input_vtx_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_input_prim_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_output_prim_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_depth_clipped_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_trivial_rejected_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_culled_counter, preProfiler);
- if (hasNewCounters)
- {
- gcmkRESET_PROFILE_DATA(pa_non_idle_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_stall_count, preProfiler);
- gcmkRESET_PROFILE_DATA(pa_process_count, preProfiler);
- }
-#endif
- gcmkUPDATE_PROFILE_DATA(pa_input_vtx_counter);
- gcmkUPDATE_PROFILE_DATA(pa_input_prim_counter);
- gcmkUPDATE_PROFILE_DATA(pa_output_prim_counter);
- gcmkUPDATE_PROFILE_DATA(pa_depth_clipped_counter);
- gcmkUPDATE_PROFILE_DATA(pa_trivial_rejected_counter);
- gcmkUPDATE_PROFILE_DATA(pa_culled_counter);
- if (hasNewCounters)
- {
- gcmkUPDATE_PROFILE_DATA(pa_non_idle_starve_count);
- gcmkUPDATE_PROFILE_DATA(pa_starve_count);
- gcmkUPDATE_PROFILE_DATA(pa_stall_count);
- gcmkUPDATE_PROFILE_DATA(pa_process_count);
- }
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0)))
-));
-#endif
-
- /* SE */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_culled_triangle_count));
- gcmkUPDATE_PROFILE_DATA(se_culled_triangle_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_culled_lines_count));
- gcmkUPDATE_PROFILE_DATA(se_culled_lines_count);
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_starve_count));
- gcmkUPDATE_PROFILE_DATA(se_starve_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_stall_count));
- gcmkUPDATE_PROFILE_DATA(se_stall_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_receive_triangle_count));
- gcmkUPDATE_PROFILE_DATA(se_receive_triangle_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_send_triangle_count));
- gcmkUPDATE_PROFILE_DATA(se_send_triangle_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_receive_lines_count));
- gcmkUPDATE_PROFILE_DATA(se_receive_lines_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_send_lines_count));
- gcmkUPDATE_PROFILE_DATA(se_send_lines_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (19) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_process_count));
- gcmkUPDATE_PROFILE_DATA(se_process_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (20) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_non_idle_starve_count));
- gcmkUPDATE_PROFILE_DATA(se_non_idle_starve_count);
- }
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8)))
-));
-
- /* RA */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_valid_pixel_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_total_quad_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_valid_quad_count_after_early_z));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_total_primitive_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_pipe_cache_miss_counter));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_prefetch_cache_miss_counter));
- if (hasNewCounters)
- {
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_non_idle_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_starve_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_stall_count));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (16) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_process_count));
- }
-#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA(ra_valid_pixel_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_total_quad_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_valid_quad_count_after_early_z, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_total_primitive_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_pipe_cache_miss_counter, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_prefetch_cache_miss_counter, preProfiler);
- if (hasNewCounters)
- {
- gcmkRESET_PROFILE_DATA(ra_non_idle_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_starve_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_stall_count, preProfiler);
- gcmkRESET_PROFILE_DATA(ra_process_count, preProfiler);
- }
-#endif
- gcmkUPDATE_PROFILE_DATA(ra_valid_pixel_count);
- gcmkUPDATE_PROFILE_DATA(ra_total_quad_count);
- gcmkUPDATE_PROFILE_DATA(ra_valid_quad_count_after_early_z);
- gcmkUPDATE_PROFILE_DATA(ra_total_primitive_count);
- gcmkUPDATE_PROFILE_DATA(ra_pipe_cache_miss_counter);
- gcmkUPDATE_PROFILE_DATA(ra_prefetch_cache_miss_counter);
- if (hasNewCounters)
- {
- gcmkUPDATE_PROFILE_DATA(ra_non_idle_starve_count);
- gcmkUPDATE_PROFILE_DATA(ra_starve_count);
- gcmkUPDATE_PROFILE_DATA(ra_stall_count);
- gcmkUPDATE_PROFILE_DATA(ra_process_count);
- }
-#if !USE_SW_RESET
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
- 23:16) + 1))))))) << (0 ? 23:16)))
-));
-#endif
-
- /* TX */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_bilinear_requests));
- gcmkUPDATE_PROFILE_DATA(tx_total_bilinear_requests);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_trilinear_requests));
- gcmkUPDATE_PROFILE_DATA(tx_total_trilinear_requests);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_discarded_texture_requests));
- gcmkUPDATE_PROFILE_DATA(tx_total_discarded_texture_requests);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_texture_requests));
- gcmkUPDATE_PROFILE_DATA(tx_total_texture_requests);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_mem_read_count));
- gcmkUPDATE_PROFILE_DATA(tx_mem_read_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_mem_read_in_8B_count));
- gcmkUPDATE_PROFILE_DATA(tx_mem_read_in_8B_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_miss_count));
- gcmkUPDATE_PROFILE_DATA(tx_cache_miss_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_hit_texel_count));
- gcmkUPDATE_PROFILE_DATA(tx_cache_hit_texel_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_miss_texel_count));
- gcmkUPDATE_PROFILE_DATA(tx_cache_miss_texel_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
- 31:24) - (0 ? 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ?
- 31:24) + 1))))))) << (0 ? 31:24)))
-));
-
- /* MC */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_read_req_8B_from_pipeline));
- gcmkUPDATE_PROFILE_DATA(mc_total_read_req_8B_from_pipeline);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_read_req_8B_from_IP));
- gcmkUPDATE_PROFILE_DATA(mc_total_read_req_8B_from_IP);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_write_req_8B_from_pipeline));
- gcmkUPDATE_PROFILE_DATA(mc_total_write_req_8B_from_pipeline);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0)))
-));
-
- /* read latency counters */
- if (hasNewCounters)
- {
- /* latency */
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x0056C,
- &mc_axi_max_min_latency));
-
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00570,
- &profiler->mc_axi_total_latency));
-
- gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
- Hardware->core,
- 0x00574,
- &profiler->mc_axi_sample_count));
-
- /* Reset Latency counters */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00568,
- 0x10a));
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
- Hardware->core,
- 0x00568,
- 0xa));
-
- profiler->mc_axi_min_latency = (mc_axi_max_min_latency & 0x0fff0000) >> 16;
- profiler->mc_axi_max_latency = (mc_axi_max_min_latency & 0x00000fff);
- if (profiler->mc_axi_min_latency == 4095)
- profiler->mc_axi_min_latency = 0;
-
- gcmkUPDATE_PROFILE_DATA(mc_axi_min_latency);
- gcmkUPDATE_PROFILE_DATA(mc_axi_max_latency);
- gcmkUPDATE_PROFILE_DATA(mc_axi_total_latency);
- gcmkUPDATE_PROFILE_DATA(mc_axi_sample_count);
-
- /* FE */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_draw_count));
- gcmkUPDATE_PROFILE_DATA(fe_draw_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_out_vertex_count));
- gcmkUPDATE_PROFILE_DATA(fe_draw_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_stall_count));
- gcmkUPDATE_PROFILE_DATA(fe_draw_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00450, &profiler->fe_starve_count));
- gcmkUPDATE_PROFILE_DATA(fe_draw_count);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
- 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
- 7:0)))
-));
- }
-
- /* HI */
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_read_request_stalled));
- gcmkUPDATE_PROFILE_DATA(hi_axi_cycles_read_request_stalled);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_write_request_stalled));
- gcmkUPDATE_PROFILE_DATA(hi_axi_cycles_write_request_stalled);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_write_data_stalled));
- gcmkUPDATE_PROFILE_DATA(hi_axi_cycles_write_data_stalled);
- gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (resetValue) & ((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) ));
-gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
- 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ?
- 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ?
- 15:8)))
-));
- }
-
-
-
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
-OnError:
- /* Return the status. */
- gcmkFOOTER();
- return status;
-}
-
-
-gceSTATUS
-gckHARDWARE_QueryContextNewProfile(
- IN gckHARDWARE Hardware,
- IN gctBOOL Reset,
- IN gckCONTEXT Context,
- OUT gcsPROFILER_NEW_COUNTERS_PART1 * Counters_part1,
- OUT gcsPROFILER_NEW_COUNTERS_PART2 * Counters_part2
+ OUT gcsPROFILER_COUNTERS_PART1 * Counters_part1,
+ OUT gcsPROFILER_COUNTERS_PART2 * Counters_part2
)
{
gceSTATUS status;
gckCOMMAND command = Hardware->kernel->command;
- gcsPROFILER_NEW_COUNTERS_PART1 * profiler_part1 = Counters_part1;
- gcsPROFILER_NEW_COUNTERS_PART2 * profiler_part2 = Counters_part2;
+ gcsPROFILER_COUNTERS_PART1 * profiler_part1 = Counters_part1;
+ gcsPROFILER_COUNTERS_PART2 * profiler_part2 = Counters_part2;
gcmkHEADER_ARG("Hardware=0x%x Counters_part1=0x%x, Counters_part2=0x%x", Hardware, Counters_part1, Counters_part2);
@@ -10658,13 +8875,13 @@ gckHARDWARE_QueryContextNewProfile(
if (Counters_part1)
{
gcmkVERIFY_OK(gckOS_MemCopy(
- profiler_part1, &Context->histroyNewProfiler_part1, gcmSIZEOF(gcsPROFILER_NEW_COUNTERS_PART1)
+ profiler_part1, &Context->histroyProfiler_part1, gcmSIZEOF(gcsPROFILER_COUNTERS_PART1)
));
}
else if (Counters_part2)
{
gcmkVERIFY_OK(gckOS_MemCopy(
- profiler_part2, &Context->histroyNewProfiler_part2, gcmSIZEOF(gcsPROFILER_NEW_COUNTERS_PART2)
+ profiler_part2, &Context->histroyProfiler_part2, gcmSIZEOF(gcsPROFILER_COUNTERS_PART2)
));
}
@@ -10674,13 +8891,13 @@ gckHARDWARE_QueryContextNewProfile(
if (Counters_part1)
{
gcmkVERIFY_OK(gckOS_ZeroMemory(
- &Context->histroyNewProfiler_part1, gcmSIZEOF(gcsPROFILER_NEW_COUNTERS_PART1)
+ &Context->histroyProfiler_part1, gcmSIZEOF(gcsPROFILER_COUNTERS_PART1)
));
}
else if (Counters_part2)
{
gcmkVERIFY_OK(gckOS_ZeroMemory(
- &Context->histroyNewProfiler_part2, gcmSIZEOF(gcsPROFILER_NEW_COUNTERS_PART2)
+ &Context->histroyProfiler_part2, gcmSIZEOF(gcsPROFILER_COUNTERS_PART2)
));
}
}
@@ -10700,16 +8917,16 @@ OnError:
}
gceSTATUS
-gckHARDWARE_UpdateContextNewProfile(
+gckHARDWARE_UpdateContextProfile(
IN gckHARDWARE Hardware,
IN gckCONTEXT Context
)
{
gceSTATUS status;
- gcsPROFILER_NEW_COUNTERS_PART1 * profiler_part1 = &Context->latestNewProfiler_part1;
- gcsPROFILER_NEW_COUNTERS_PART1 * profilerHistroy_part1 = &Context->histroyNewProfiler_part1;
- gcsPROFILER_NEW_COUNTERS_PART2 * profiler_part2 = &Context->latestNewProfiler_part2;
- gcsPROFILER_NEW_COUNTERS_PART2 * profilerHistroy_part2 = &Context->histroyNewProfiler_part2;
+ gcsPROFILER_COUNTERS_PART1 * profiler_part1 = &Context->latestProfiler_part1;
+ gcsPROFILER_COUNTERS_PART1 * profilerHistroy_part1 = &Context->histroyProfiler_part1;
+ gcsPROFILER_COUNTERS_PART2 * profiler_part2 = &Context->latestProfiler_part2;
+ gcsPROFILER_COUNTERS_PART2 * profilerHistroy_part2 = &Context->histroyProfiler_part2;
gceCHIPMODEL chipModel;
gctUINT32 chipRevision;
gctUINT32 i;
@@ -10864,14 +9081,14 @@ gckHARDWARE_UpdateContextNewProfile(
gcmkUPDATE_PROFILE_DATA_PART2(hi_total_read_8B_count);
gcmkUPDATE_PROFILE_DATA_PART2(hi_total_write_8B_count);
#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_killed_by_color_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_killed_by_depth_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_drawn_by_color_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_drawn_by_depth_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_killed_by_color_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_killed_by_depth_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_drawn_by_color_pipe, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_drawn_by_depth_pipe, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_killed_by_color_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_killed_by_depth_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_drawn_by_color_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe0_pixel_count_drawn_by_depth_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_killed_by_color_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_killed_by_depth_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_drawn_by_color_pipe);
+ gcmkRESET_PROFILE_DATA_PART1(pe1_pixel_count_drawn_by_depth_pipe);
#endif
gcmkUPDATE_PROFILE_DATA_PART1(pe0_pixel_count_killed_by_color_pipe);
gcmkUPDATE_PROFILE_DATA_PART1(pe0_pixel_count_killed_by_depth_pipe);
@@ -10888,15 +9105,11 @@ gckHARDWARE_UpdateContextNewProfile(
0x00000,
clock));
- /* Reset counters. */
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 1));
- gcmkONERROR(
- gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 0));
gcmkONERROR(
gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0));
gcmkONERROR(
gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00078, 0));
+
#if !USE_SW_RESET
gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
23:16) - (0 ? 23:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 23:16) - (0 ?
@@ -11098,29 +9311,29 @@ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profile
gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler_part1->tx_process_count));
}
#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA_PART1(ps_inst_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_rendered_pixel_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_inst_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_rendered_vertice_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_branch_inst_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_texld_inst_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_branch_inst_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_texld_inst_counter, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(ps_inst_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ps_rendered_pixel_counter);
+ gcmkRESET_PROFILE_DATA_PART1(vs_inst_counter);
+ gcmkRESET_PROFILE_DATA_PART1(vs_rendered_vertice_counter);
+ gcmkRESET_PROFILE_DATA_PART1(vs_branch_inst_counter);
+ gcmkRESET_PROFILE_DATA_PART1(vs_texld_inst_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ps_branch_inst_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ps_texld_inst_counter);
if (hasNewCounters)
{
- gcmkRESET_PROFILE_DATA_PART1(vs_non_idle_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_stall_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(vs_process_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_non_idle_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_stall_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ps_process_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(shader_cycle_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(tx_non_idle_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(tx_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(tx_stall_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(tx_process_count, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(vs_non_idle_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(vs_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(vs_stall_count);
+ gcmkRESET_PROFILE_DATA_PART1(vs_process_count);
+ gcmkRESET_PROFILE_DATA_PART1(ps_non_idle_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(ps_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(ps_stall_count);
+ gcmkRESET_PROFILE_DATA_PART1(ps_process_count);
+ gcmkRESET_PROFILE_DATA_PART1(shader_cycle_count);
+ gcmkRESET_PROFILE_DATA_PART1(tx_non_idle_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(tx_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(tx_stall_count);
+ gcmkRESET_PROFILE_DATA_PART1(tx_process_count);
}
#endif
gcmkUPDATE_PROFILE_DATA_PART1(ps_inst_counter);
@@ -11238,20 +9451,20 @@ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profile
gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler_part1->pa_process_count));
}
#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA_PART1(pa_input_vtx_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_input_prim_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_output_prim_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_depth_clipped_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_trivial_rejected_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_culled_prim_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_droped_prim_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_frustum_clipped_prim_counter, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(pa_input_vtx_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_input_prim_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_output_prim_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_depth_clipped_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_trivial_rejected_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_culled_prim_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_droped_prim_counter);
+ gcmkRESET_PROFILE_DATA_PART1(pa_frustum_clipped_prim_counter);
if (hasNewCounters)
{
- gcmkRESET_PROFILE_DATA_PART1(pa_non_idle_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_stall_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(pa_process_count, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(pa_non_idle_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(pa_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(pa_stall_count);
+ gcmkRESET_PROFILE_DATA_PART1(pa_process_count);
}
#endif
gcmkUPDATE_PROFILE_DATA_PART1(pa_input_vtx_counter);
@@ -11476,21 +9689,21 @@ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profile
gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler_part1->ra_process_count));
}
#if USE_SW_RESET
- gcmkRESET_PROFILE_DATA_PART1(ra_valid_pixel_count_to_render, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_total_quad_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_valid_quad_count_after_early_z, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_input_prim_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_pipe_cache_miss_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_prefetch_cache_miss_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_eez_culled_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_pipe_hz_cache_miss_counter, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_prefetch_hz_cache_miss_counter, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(ra_valid_pixel_count_to_render);
+ gcmkRESET_PROFILE_DATA_PART1(ra_total_quad_count);
+ gcmkRESET_PROFILE_DATA_PART1(ra_valid_quad_count_after_early_z);
+ gcmkRESET_PROFILE_DATA_PART1(ra_input_prim_count);
+ gcmkRESET_PROFILE_DATA_PART1(ra_pipe_cache_miss_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ra_prefetch_cache_miss_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ra_eez_culled_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ra_pipe_hz_cache_miss_counter);
+ gcmkRESET_PROFILE_DATA_PART1(ra_prefetch_hz_cache_miss_counter);
if (hasNewCounters)
{
- gcmkRESET_PROFILE_DATA_PART1(ra_non_idle_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_starve_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_stall_count, preNewProfiler_part1);
- gcmkRESET_PROFILE_DATA_PART1(ra_process_count, preNewProfiler_part1);
+ gcmkRESET_PROFILE_DATA_PART1(ra_non_idle_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(ra_starve_count);
+ gcmkRESET_PROFILE_DATA_PART1(ra_stall_count);
+ gcmkRESET_PROFILE_DATA_PART1(ra_process_count);
}
#endif
gcmkUPDATE_PROFILE_DATA_PART1(ra_valid_pixel_count_to_render);
@@ -11678,6 +9891,66 @@ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profile
7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
7:0))) ));
gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mcc_total_write_req_from_others));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (21) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_fe_read_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (22) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_mmu_read_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (23) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_blt_read_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (24) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_sh0_read_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (25) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_sh1_read_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (26) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_pe_write_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (27) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_blt_write_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (28) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_sh0_write_bandwidth));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (29) & ((gctUINT32) ((((1 ? 7:0) - (0 ?
+ 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
+ 7:0))) ));
+gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler_part2->mc_sh1_write_bandwidth));
+
+ /* Reset counters. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 1));
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 0));
gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
7:0) - (0 ? 7:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ?
@@ -11705,6 +9978,15 @@ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((g
gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_write_req_8B_from_others);
gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_from_others);
gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_write_req_from_others);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_fe_read_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_mmu_read_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_blt_read_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_sh0_read_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_sh1_read_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_pe_write_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_blt_write_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_sh0_write_bandwidth);
+ gcmkUPDATE_PROFILE_DATA_PART2(mc_sh1_write_bandwidth);
/* read latency counters */
if (hasNewCounters)
@@ -12020,15 +10302,29 @@ _ResetGPU(
0x00000,
control));
- /* Set soft reset. */
- gcmkONERROR(gckOS_WriteRegisterEx(Os,
- Core,
- 0x00000,
- ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY_AHB) &&
+ (Hardware->options.secureMode == gcvSECURE_IN_NORMAL))
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x003A8,
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))));
+ }
+ else
+ {
+ /* Set soft reset. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x00000,
+ ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
12:12) - (0 ? 12:12) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 12:12) - (0 ?
12:12) + 1))))))) << (0 ? 12:12))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
12:12) - (0 ? 12:12) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 12:12) - (0 ?
12:12) + 1))))))) << (0 ? 12:12)))));
+ }
/* Wait for reset. */
gcmkONERROR(gckOS_Delay(Os, 1));
@@ -12327,7 +10623,7 @@ gckHARDWARE_DumpMMUException(
gcmkHEADER_ARG("Hardware=0x%x", Hardware);
#if gcdENABLE_TRUST_APPLICATION
- if (Hardware->secureMode == gcvSECURE_IN_TA)
+ if (Hardware->options.secureMode == gcvSECURE_IN_TA)
{
gcmkVERIFY_OK(gckKERNEL_SecurityDumpMMUException(Hardware->kernel));
@@ -12338,7 +10634,7 @@ gckHARDWARE_DumpMMUException(
}
else
#endif
- if (Hardware->secureMode == gcvSECURE_NONE)
+ if (Hardware->options.secureMode == gcvSECURE_NONE)
{
mmuStatusRegAddress = 0x00188;
mmuExceptionAddress = 0x00190;
@@ -12465,7 +10761,7 @@ gckHARDWARE_HandleFault(
gcmkHEADER_ARG("Hardware=0x%x", Hardware);
- if (Hardware->secureMode == gcvSECURE_NONE)
+ if (Hardware->options.secureMode == gcvSECURE_NONE)
{
mmuStatusRegAddress = 0x00188;
mmuExceptionAddress = 0x00190;
@@ -12478,7 +10774,7 @@ gckHARDWARE_HandleFault(
/* Get MMU exception address. */
#if gcdENABLE_TRUST_APPLICATION
- if (Hardware->secureMode == gcvSECURE_IN_TA)
+ if (Hardware->options.secureMode == gcvSECURE_IN_TA)
{
gckKERNEL_ReadMMUException(Hardware->kernel, &mmuStatus, &address);
}
@@ -12522,7 +10818,7 @@ gckHARDWARE_HandleFault(
gcmkONERROR(gckVIDMEM_FindVIDMEM(Hardware->kernel, address, &node, &entryValue));
#if gcdENABLE_TRUST_APPLICATION
- if (Hardware->secureMode == gcvSECURE_IN_TA)
+ if (Hardware->options.secureMode == gcvSECURE_IN_TA)
{
gckKERNEL_HandleMMUException(
Hardware->kernel,
@@ -13555,7 +11851,9 @@ gckHARDWARE_PrepareFunctions(
&endBytes
));
- if (Hardware->mmuVersion > 0 && Hardware->enableMMU && Hardware->secureMode != gcvSECURE_IN_TA)
+ if ((Hardware->mmuVersion > 0) &&
+ Hardware->options.enableMMU &&
+ (Hardware->options.secureMode != gcvSECURE_IN_TA))
{
gctUINT32 mmuBytes;
gctPHYS_ADDR_T physical = 0;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
index 68a8f9bade71..8cc00eff4719 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
@@ -170,8 +170,7 @@ struct _gckHARDWARE
/* Chip characteristics. */
gcsHAL_QUERY_CHIP_IDENTITY identity;
- gctBOOL allowFastClear;
- gctBOOL allowCompression;
+ gcsHAL_QUERY_CHIP_OPTIONS options;
gctUINT32 powerBaseAddress;
gctBOOL extraEventStates;
@@ -198,11 +197,6 @@ struct _gckHARDWARE
gctUINT32 mmuVersion;
- /* Whether use new MMU. It is meaningless
- ** for old MMU since old MMU is always enabled.
- */
- gctBOOL enableMMU;
-
/* Type */
gceHARDWARE_TYPE type;
@@ -220,10 +214,6 @@ struct _gckHARDWARE
#if gcdLINK_QUEUE_SIZE
struct _gckQUEUE linkQueue;
#endif
-
- gctBOOL powerManagement;
- gctBOOL gpuProfiler;
-
gctBOOL stallFEPrefetch;
gctUINT32 minFscaleValue;
@@ -258,8 +248,6 @@ struct _gckHARDWARE
gcsHARDWARE_PAGETABLE_ARRAY pagetableArray;
- gceSECURE_MODE secureMode;
-
gctUINT64 contextID;
gctBOOL forcePowerOff;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
index a852913599c7..73eda6340796 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
@@ -441,7 +441,7 @@ gckVGHARDWARE_Construct(
gcmkERR_BREAK(gckOS_CreateMutex(Os, &hardware->powerMutex));
/* Enable power management by default. */
- hardware->powerManagement = gcvTRUE;
+ hardware->options.powerManagement = gcvTRUE;
/* Return pointer to the gckVGHARDWARE object. */
*Hardware = hardware;
@@ -669,6 +669,7 @@ gckVGHARDWARE_QueryChipIdentity(
OUT gctUINT32 * ChipRevision,
OUT gctUINT32 * ProductID,
OUT gctUINT32 * EcoID,
+ OUT gctUINT32* CustomerID,
OUT gctUINT32* ChipFeatures,
OUT gctUINT32* ChipMinorFeatures,
OUT gctUINT32* ChipMinorFeatures2
@@ -701,7 +702,7 @@ gckVGHARDWARE_QueryChipIdentity(
{
features = ((((gctUINT32) (features)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ?
- 0:0))) | (((gctUINT32) ((gctUINT32) (Hardware->allowFastClear) & ((gctUINT32) ((((1 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (Hardware->options.allowFastClear) & ((gctUINT32) ((((1 ?
0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ?
0:0)));
}
@@ -743,8 +744,20 @@ gckVGHARDWARE_QueryChipIdentity(
*ChipMinorFeatures2 = Hardware->chipMinorFeatures2;
}
- *ProductID = Hardware->productID;
- *EcoID = Hardware->ecoID;
+ if (ProductID != gcvNULL)
+ {
+ *ProductID = Hardware->productID;
+ }
+
+ if (EcoID != gcvNULL)
+ {
+ *EcoID = Hardware->ecoID;
+ }
+
+ if (CustomerID != gcvNULL)
+ {
+ *CustomerID = Hardware->customerID;
+ }
gcmkFOOTER_NO();
/* Success. */
@@ -1574,7 +1587,7 @@ gckVGHARDWARE_SetFastClear(
0x00414,
debug));
- Hardware->allowFastClear = Enable;
+ Hardware->options.allowFastClear = Enable;
status = gcvFALSE;
}
@@ -1774,7 +1787,7 @@ gckVGHARDWARE_SetPowerManagementState(
command = Hardware->kernel->command;
gcmkVERIFY_OBJECT(command, gcvOBJ_COMMAND);
- if (Hardware->powerManagement == gcvFALSE)
+ if (Hardware->options.powerManagement == gcvFALSE)
{
gcmkFOOTER_NO();
return gcvSTATUS_OK;
@@ -2212,7 +2225,7 @@ gckVGHARDWARE_SetPowerManagement(
/* Verify the arguments. */
gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
- Hardware->powerManagement = PowerManagement;
+ Hardware->options.powerManagement = PowerManagement;
/* Success. */
gcmkFOOTER_NO();
diff --git a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h
index 18c50bc32dcf..c2d16cbe7128 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h
@@ -77,7 +77,6 @@ struct _gckVGHARDWARE
gctUINT32 chipFeatures;
gctUINT32 chipMinorFeatures;
gctUINT32 chipMinorFeatures2;
- gctBOOL allowFastClear;
/* Features. */
gctBOOL fe20;
@@ -105,7 +104,7 @@ struct _gckVGHARDWARE
gctPOINTER powerOffTimer;
#endif
- gctBOOL powerManagement;
+ gcsHAL_QUERY_CHIP_OPTIONS options;
gctPOINTER featureDatabase;
};
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
index 9ee3a82baa04..6726a88695e9 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -105,10 +105,10 @@ gctCONST_STRING _DispatchText[] =
gcmDEFINE2TEXT(gcvHAL_WRITE_REGISTER),
gcmDEFINE2TEXT(gcvHAL_GET_PROFILE_SETTING),
gcmDEFINE2TEXT(gcvHAL_SET_PROFILE_SETTING),
- gcmDEFINE2TEXT(gcvHAL_READ_ALL_PROFILE_REGISTERS),
gcmDEFINE2TEXT(gcvHAL_PROFILE_REGISTERS_2D),
- gcmDEFINE2TEXT(gcvHAL_READ_ALL_PROFILE_NEW_REGISTERS),
- gcmDEFINE2TEXT(gcvHAL_READ_PROFILER_NEW_REGISTER_SETTING),
+ gcmDEFINE2TEXT(gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1),
+ gcmDEFINE2TEXT(gcvHAL_READ_ALL_PROFILE_REGISTERS_PART2),
+ gcmDEFINE2TEXT(gcvHAL_READ_PROFILER_REGISTER_SETTING),
gcmDEFINE2TEXT(gcvHAL_SET_POWER_MANAGEMENT_STATE),
gcmDEFINE2TEXT(gcvHAL_QUERY_POWER_MANAGEMENT_STATE),
gcmDEFINE2TEXT(gcvHAL_GET_BASE_ADDRESS),
@@ -135,20 +135,29 @@ gctCONST_STRING _DispatchText[] =
gcmDEFINE2TEXT(gcvHAL_FREE_VIRTUAL_COMMAND_BUFFER),
gcmDEFINE2TEXT(gcvHAL_SET_FSCALE_VALUE),
gcmDEFINE2TEXT(gcvHAL_GET_FSCALE_VALUE),
+ gcmDEFINE2TEXT(gcvHAL_EXPORT_VIDEO_MEMORY),
gcmDEFINE2TEXT(gcvHAL_NAME_VIDEO_MEMORY),
gcmDEFINE2TEXT(gcvHAL_IMPORT_VIDEO_MEMORY),
gcmDEFINE2TEXT(gcvHAL_QUERY_RESET_TIME_STAMP),
gcmDEFINE2TEXT(gcvHAL_READ_REGISTER_EX),
gcmDEFINE2TEXT(gcvHAL_WRITE_REGISTER_EX),
gcmDEFINE2TEXT(gcvHAL_CREATE_NATIVE_FENCE),
+ gcmDEFINE2TEXT(gcvHAL_WAIT_NATIVE_FENCE),
gcmDEFINE2TEXT(gcvHAL_DESTROY_MMU),
gcmDEFINE2TEXT(gcvHAL_SHBUF),
+ gcmDEFINE2TEXT(gcvHAL_GET_GRAPHIC_BUFFER_FD),
gcmDEFINE2TEXT(gcvHAL_GET_VIDEO_MEMORY_FD),
gcmDEFINE2TEXT(gcvHAL_CONFIG_POWER_MANAGEMENT),
gcmDEFINE2TEXT(gcvHAL_WRAP_USER_MEMORY),
gcmDEFINE2TEXT(gcvHAL_WAIT_FENCE),
- gcmDEFINE2TEXT(gcvHAL_GET_VIDEO_MEMORY_FD),
+#if gcdDEC_ENABLE_AHB
+ gcmDEFINE2TEXT(gcvHAL_DEC300_READ),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_WRITE),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_FLUSH),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_FLUSH_WAIT),
+#endif
gcmDEFINE2TEXT(gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_CHIP_OPTION),
};
#endif
@@ -545,11 +554,30 @@ gckKERNEL_Construct(
if (Core == gcvCORE_VG)
{
+ gctUINT32 contiguousBase;
+ gctUINT32 contiguousSize = 0;
+
/* Construct the gckMMU object. */
gcmkONERROR(
gckVGKERNEL_Construct(Os, Context, kernel, &kernel->vg));
kernel->timeOut = gcdGPU_TIMEOUT;
+
+ status = gckOS_QueryOption(Os, "contiguousBase", &contiguousBase);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckOS_QueryOption(Os, "contiguousSize", &contiguousSize);
+ }
+
+ if (gcmIS_SUCCESS(status) && contiguousSize)
+ {
+ gctUINT64 gpuContiguousBase;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(Os, contiguousBase, &gpuContiguousBase));
+
+ gcmkSAFECASTPHYSADDRT(kernel->contiguousBaseAddress, gpuContiguousBase);
+ }
}
else
#endif
@@ -567,18 +595,10 @@ gckKERNEL_Construct(
;
/* Initialize virtual command buffer. */
-#if (defined(LINUX) || defined(__QNXNTO__)) && !defined(EMULATOR) && !gcdALLOC_CMD_FROM_RESERVE
- kernel->virtualCommandBuffer = gcvTRUE;
-#else
- kernel->virtualCommandBuffer = gcvFALSE;
-#endif
-
-#if defined(UNDER_CE) && USE_KERNEL_VIRTUAL_BUFFERS
- kernel->virtualCommandBuffer = gcvTRUE;
-#endif
-
-#if gcdSECURITY || gcdDISABLE_GPU_VIRTUAL_ADDRESS
+#if gcdALLOC_CMD_FROM_RESERVE || gcdSECURITY || gcdDISABLE_GPU_VIRTUAL_ADDRESS || !USE_KERNEL_VIRTUAL_BUFFERS
kernel->virtualCommandBuffer = gcvFALSE;
+#else
+ kernel->virtualCommandBuffer = kernel->hardware->options.enableMMU;
#endif
#if gcdSHARED_PAGETABLE
@@ -609,6 +629,9 @@ gckKERNEL_Construct(
gcmkVERIFY_OK(gckMMU_AttachHardware(kernel->mmu, kernel->hardware));
#endif
+ kernel->contiguousBaseAddress = kernel->mmu->contiguousBaseAddress;
+ kernel->externalBaseAddress = kernel->mmu->externalBaseAddress;
+
/* Construct the gckCOMMAND object. */
gcmkONERROR(
gckCOMMAND_Construct(kernel, &kernel->command));
@@ -657,7 +680,6 @@ gckKERNEL_Construct(
/* Initialize profile setting */
kernel->profileEnable = gcvFALSE;
kernel->profileCleanRegister = gcvTRUE;
- kernel->profileSyncMode = gcvTRUE;
#endif
#if gcdANDROID_NATIVE_FENCE_SYNC
@@ -973,6 +995,8 @@ gckKERNEL_AllocateLinearMemory(
gctBOOL contiguous = gcvFALSE;
gctBOOL cacheable = gcvFALSE;
gctBOOL secure = gcvFALSE;
+ gctBOOL fastPools = gcvFALSE;
+ gctBOOL hasFastPools = gcvFALSE;
gctSIZE_T bytes = Bytes;
gctUINT32 handle = 0;
gceDATABASE_TYPE type;
@@ -990,6 +1014,11 @@ gckKERNEL_AllocateLinearMemory(
contiguous = Flag & gcvALLOC_FLAG_CONTIGUOUS;
cacheable = Flag & gcvALLOC_FLAG_CACHEABLE;
secure = Flag & gcvALLOC_FLAG_SECURITY;
+ if (Flag & gcvALLOC_FLAG_FAST_POOLS)
+ {
+ fastPools = gcvTRUE;
+ Flag &= ~gcvALLOC_FLAG_FAST_POOLS;
+ }
#if gcdALLOC_ON_FAULT
if (Type == gcvSURF_RENDER_TARGET)
@@ -1091,6 +1120,7 @@ AllocateMemory:
else
#endif
{
+ hasFastPools = gcvTRUE;
status = gckVIDMEM_AllocateLinear(Kernel,
videoMemory,
Bytes,
@@ -1126,6 +1156,13 @@ AllocateMemory:
else
if (pool == gcvPOOL_SYSTEM)
{
+ /* Do not go ahead to try relative slow pools */
+ if (fastPools && hasFastPools)
+ {
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ break;
+ }
+
/* Advance to contiguous memory. */
pool = gcvPOOL_CONTIGUOUS;
}
@@ -1208,6 +1245,7 @@ AllocateMemory:
gcvNULL,
bytes));
+
/* Return status. */
gcmkFOOTER_ARG("*Pool=%d *Node=0x%x", *Pool, *Node);
return gcvSTATUS_OK;
@@ -1225,12 +1263,6 @@ OnError:
gcmkVERIFY_OK(gckVIDMEM_Free(Kernel, node));
}
- /* For some case like chrome with webgl test, it needs too much memory so that it invokes oom_killer
- * And the case is killed by oom_killer, the user wants not to see the crash and hope the case iteself handles the condition
- * So the patch reports the out_of_memory to the case */
- if ( status == gcvSTATUS_OUT_OF_MEMORY && (Flag & gcvALLOC_FLAG_MEMLIMIT) )
- gcmkPRINT("The running case is out_of_memory");
-
/* Return the status. */
gcmkFOOTER();
return status;
@@ -1385,6 +1417,7 @@ gckKERNEL_LockVideoMemory(
Core,
FromUser,
Interface->u.LockVideoMemory.address,
+ node->VidMem.pool,
&pointer));
Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(pointer);
@@ -1486,35 +1519,25 @@ gckKERNEL_UnlockVideoMemory(
{
gceSTATUS status;
gckVIDMEM_NODE nodeObject;
-#if gcdSECURE_USER
gcuVIDMEM_NODE_PTR node;
-#endif
+ gctSIZE_T bytes;
gcmkHEADER_ARG("Kernel=0x%08X ProcessID=%d",
Kernel, ProcessID);
+ Interface->u.UnlockVideoMemory.pool = gcvPOOL_UNKNOWN;
+ Interface->u.UnlockVideoMemory.bytes = 0;
+
gcmkONERROR(gckVIDMEM_HANDLE_Lookup(
Kernel,
ProcessID,
(gctUINT32)Interface->u.UnlockVideoMemory.node,
&nodeObject));
-#if gcdSECURE_USER
node = nodeObject->node;
-
- /* Unlock video memory. */
- /* Save node information before it disappears. */
- if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
- {
- logical = gcvNULL;
- bytes = 0;
- }
- else
- {
- logical = node->Virtual.logical;
- bytes = node->Virtual.bytes;
- }
-#endif
+ bytes = (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ ? node->VidMem.bytes
+ : node->Virtual.bytes;
/* Unlock video memory. */
gcmkONERROR(gckVIDMEM_Unlock(
@@ -1525,15 +1548,18 @@ gckKERNEL_UnlockVideoMemory(
#if gcdSECURE_USER
/* Flush the translation cache for virtual surfaces. */
- if (logical != gcvNULL)
+ if (node->VidMem.memory->object.type != gcvOBJ_VIDMEM)
{
gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(Kernel,
cache,
- logical,
+ node->Virtual.logical,
bytes));
}
#endif
+ Interface->u.UnlockVideoMemory.pool = nodeObject->pool;
+ Interface->u.UnlockVideoMemory.bytes = (gctUINT)bytes;
+
gcmkFOOTER_NO();
return gcvSTATUS_OK;
@@ -1602,6 +1628,94 @@ gckKERNEL_BottomHalfUnlockVideoMemory(
return gcvSTATUS_OK;
}
+/*******************************************************************************
+**
+** gckKERNEL_QueryVidMemPoolNodes
+**
+** Loop all databases to query used memory nodes of a specific pool.
+**
+** INPUT:
+**
+** Pool The memory pool for query.
+
+** TotalSize Total size of the used contiguous memory.
+**
+** MemoryBlocks Used contiguous memory block info.
+**
+** NumMaxBlock The count of memory blocks array provided by the caller.
+**
+** NumBlocks The actual number of memory blocks returned.
+**
+** OUTPUT:
+**
+** Error status. Should always be gcvSTATUS_SUCCESS since a query should always succeed.
+*/
+gceSTATUS
+gckKERNEL_QueryVidMemPoolNodes(
+ gckKERNEL Kernel,
+ gcePOOL Pool,
+ gctUINT32 * TotalSize,
+ gcsContiguousBlock * MemoryBlocks,
+ gctUINT32 NumMaxBlocks,
+ gctUINT32 * NumBlocks
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctINT i;
+ gctINT bcount;
+ gctUINT32 num_blocks = 0;
+ gctSIZE_T total_size = 0;
+ gckVIDMEM memory;
+ gcuVIDMEM_NODE_PTR nodes, node;
+
+ do
+ {
+ /* Get the heap and nodes. */
+ status = gckKERNEL_GetVideoMemoryPool(Kernel, Pool, &memory);
+ if (status != gcvSTATUS_OK)
+ break;
+
+ status = gckVIDMEM_QueryNodes(Kernel, Pool, &bcount, &nodes);
+ if (status != gcvSTATUS_OK)
+ break;
+
+ /* Iterate all nodes. */
+ for (i = 0; i < bcount; i++)
+ {
+ node = nodes[i].VidMem.next;
+ do
+ {
+ if (node == gcvNULL)
+ {
+ break;
+ }
+
+ /* Is it in the "free" list? */
+ if (node->VidMem.nextFree == gcvNULL)
+ {
+ if (num_blocks < NumMaxBlocks)
+ {
+ MemoryBlocks[num_blocks].ptr = (gctUINT32)node->VidMem.offset + memory->baseAddress;
+ MemoryBlocks[num_blocks].size = node->VidMem.bytes;
+ }
+ total_size += node->VidMem.bytes;
+ num_blocks++;
+ }
+
+ node = node->VidMem.next;
+ } while (node != &nodes[i]);
+ }
+ }
+ while (gcvFALSE);
+
+ if (TotalSize != gcvNULL)
+ *TotalSize = (gctUINT32)total_size;
+
+ if (NumBlocks != gcvNULL)
+ *NumBlocks = num_blocks;
+
+ return status;
+}
gceSTATUS
gckKERNEL_QueryDatabase(
@@ -1703,66 +1817,6 @@ OnError:
}
gceSTATUS
-gckKERNEL_WrapUserMemory(
- IN gckKERNEL Kernel,
- IN gctUINT32 ProcessID,
- IN gcsUSER_MEMORY_DESC_PTR Desc,
- OUT gctUINT32 * Node
- )
-{
- gceSTATUS status;
- gcuVIDMEM_NODE_PTR node = gcvNULL;
- gctUINT32 handle;
- gceDATABASE_TYPE databaseRecordType;
-
- gcmkHEADER_ARG("Kernel=0x%X Desc=%x", Kernel, Desc);
-
- gcmkONERROR(gckVIDMEM_ConstructVirtualFromUserMemory(
- Kernel,
- Desc,
- &node
- ));
-
- /* Allocate handle for this video memory. */
- gcmkONERROR(gckVIDMEM_NODE_Allocate(
- Kernel,
- node,
- gcvSURF_BITMAP,
- gcvPOOL_VIRTUAL,
- &handle
- ));
-
- /* Wrapped node is treated as gcvPOOL_VIRTUAL, but in statistic view,
- * it is gcvPOOL_USER.
- */
- databaseRecordType
- = gcvDB_VIDEO_MEMORY
- | (gcvSURF_BITMAP << gcdDB_VIDEO_MEMORY_TYPE_SHIFT)
- | (gcvPOOL_VIRTUAL << gcdDB_VIDEO_MEMORY_POOL_SHIFT)
- ;
-
- /* Record in process db. */
- gcmkONERROR(gckKERNEL_AddProcessDB(
- Kernel,
- ProcessID,
- databaseRecordType,
- gcmINT2PTR(handle),
- gcvNULL,
- node->Virtual.bytes
- ));
-
- /* Return handle of the node. */
- *Node = handle;
-
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
-OnError:
- gcmkFOOTER();
- return status;
-}
-
-gceSTATUS
gckKERNEL_WaitFence(
IN gckKERNEL Kernel,
IN gctUINT32 Handle,
@@ -1835,6 +1889,127 @@ OnError:
return status;
}
+#ifdef __linux__
+
+typedef struct _gcsGRRAPHIC_BUFFER_PARCLE
+{
+ gcsFDPRIVATE base;
+ gckKERNEL kernel;
+
+ gckVIDMEM_NODE node[3];
+ gctSHBUF shBuf;
+ gctINT32 signal;
+}
+gcsGRAPHIC_BUFFER_PARCLE;
+
+static void
+_ReleaseGraphicBuffer(
+ gckKERNEL Kernel,
+ gcsGRAPHIC_BUFFER_PARCLE * Parcle
+ )
+{
+ gctUINT i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (Parcle->node[i])
+ {
+ gckVIDMEM_NODE_Dereference(Kernel, Parcle->node[i]);
+ }
+ }
+
+ if (Parcle->shBuf)
+ {
+ gckKERNEL_DestroyShBuffer(Kernel, Parcle->shBuf);
+ }
+
+ if (Parcle->signal)
+ {
+ gckOS_DestroyUserSignal(Kernel->os, Parcle->signal);
+ }
+
+ gcmkOS_SAFE_FREE(Kernel->os, Parcle);
+}
+
+static gctINT
+_FdReleaseGraphicBuffer(
+ gcsFDPRIVATE_PTR Private
+ )
+{
+ gcsGRAPHIC_BUFFER_PARCLE * parcle = (gcsGRAPHIC_BUFFER_PARCLE *) Private;
+
+ _ReleaseGraphicBuffer(parcle->kernel, parcle);
+ return 0;
+}
+
+static gceSTATUS
+_GetGraphicBufferFd(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Node[3],
+ IN gctUINT64 ShBuf,
+ IN gctUINT64 Signal,
+ OUT gctINT32 * Fd
+ )
+{
+ gceSTATUS status;
+ gctUINT i;
+ gcsGRAPHIC_BUFFER_PARCLE * parcle = gcvNULL;
+
+ gcmkONERROR(gckOS_Allocate(
+ Kernel->os,
+ gcmSIZEOF(gcsGRAPHIC_BUFFER_PARCLE),
+ (gctPOINTER *)&parcle
+ ));
+
+ gckOS_ZeroMemory(parcle, sizeof(gcsGRAPHIC_BUFFER_PARCLE));
+
+ parcle->base.release = _FdReleaseGraphicBuffer;
+ parcle->kernel = Kernel;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (Node[i] != 0)
+ {
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_LookupAndReference(Kernel, Node[i], &parcle->node[i]));
+ }
+ }
+
+ if (ShBuf)
+ {
+ gctSHBUF shBuf = gcmUINT64_TO_PTR(ShBuf);
+
+ gcmkONERROR(gckKERNEL_MapShBuffer(Kernel, shBuf));
+ parcle->shBuf = shBuf;
+ }
+
+ if (Signal)
+ {
+ gctSIGNAL signal = gcmUINT64_TO_PTR(Signal);
+
+ gcmkONERROR(
+ gckOS_MapSignal(Kernel->os,
+ signal,
+ (gctHANDLE)(gctUINTPTR_T)ProcessID,
+ &signal));
+
+ parcle->signal= (gctINT32)Signal;
+ }
+
+ gcmkONERROR(gckOS_GetFd("viv-gr", &parcle->base, Fd));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (parcle)
+ {
+ _ReleaseGraphicBuffer(Kernel, parcle);
+ }
+ return status;
+}
+#endif
+
/*******************************************************************************
**
** gckKERNEL_Dispatch
@@ -2173,12 +2348,12 @@ gckKERNEL_Dispatch(
}
gcmkONERROR(gckEVENT_Commit(
- Kernel->asyncEvent, gcmUINT64_TO_PTR(Interface->u.Event.queue)));
+ Kernel->asyncEvent, gcmUINT64_TO_PTR(Interface->u.Event.queue), gcvFALSE));
}
else
{
gcmkONERROR(gckEVENT_Commit(
- Kernel->eventObj, gcmUINT64_TO_PTR(Interface->u.Event.queue)));
+ Kernel->eventObj, gcmUINT64_TO_PTR(Interface->u.Event.queue), gcvFALSE));
}
gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
@@ -2210,12 +2385,12 @@ gckKERNEL_Dispatch(
gcmkONERROR(gckEVENT_Commit(
Kernel->asyncEvent,
- gcmUINT64_TO_PTR(Interface->u.Commit.queue)
+ gcmUINT64_TO_PTR(Interface->u.Commit.queue),
+ gcvFALSE
));
}
else
{
- /* XXX: Workaround nxp dual GPU hang issue, bug #17898, Jira IMX-603. */
if (Interface->u.Commit.count > 1 && Interface->engine == gcvENGINE_RENDER)
{
gctUINT32 i;
@@ -2236,7 +2411,6 @@ gckKERNEL_Dispatch(
gcmNAME_TO_PTR(Interface->u.Commit.contexts[0]) : gcvNULL,
gcmUINT64_TO_PTR(Interface->u.Commit.commandBuffers[0]),
gcmUINT64_TO_PTR(Interface->u.Commit.deltas[0]),
- gcmUINT64_TO_PTR(Interface->u.Commit.queue),
processID,
Interface->u.Commit.shared,
Interface->u.Commit.index,
@@ -2249,6 +2423,16 @@ gckKERNEL_Dispatch(
gcmkONERROR(status);
}
+ /* Force an event if powerManagement is on. */
+ status = gckEVENT_Commit(Kernel->eventObj,
+ gcmUINT64_TO_PTR(Interface->u.Commit.queue),
+ Kernel->hardware->options.powerManagement);
+
+ if (status != gcvSTATUS_INTERRUPTED)
+ {
+ gcmkONERROR(status);
+ }
+
if (Interface->u.Commit.count > 1 && Interface->engine == gcvENGINE_RENDER)
{
gctUINT32 i;
@@ -2264,7 +2448,6 @@ gckKERNEL_Dispatch(
Interface->u.Commit.commandBuffers[i] ?
gcmUINT64_TO_PTR(Interface->u.Commit.commandBuffers[i]) : gcmUINT64_TO_PTR(Interface->u.Commit.commandBuffers[0]),
gcmUINT64_TO_PTR(Interface->u.Commit.deltas[i]),
- gcvNULL,
processID,
Interface->u.Commit.shared,
Interface->u.Commit.commandBuffers[i] ?
@@ -2277,6 +2460,16 @@ gckKERNEL_Dispatch(
{
gcmkONERROR(status);
}
+
+ /* Force an event if powerManagement is on. */
+ status = gckEVENT_Commit(kernel->eventObj,
+ gcvNULL,
+ kernel->hardware->options.powerManagement);
+
+ if (status != gcvSTATUS_INTERRUPTED)
+ {
+ gcmkONERROR(status);
+ }
}
}
}
@@ -2474,71 +2667,31 @@ gckKERNEL_Dispatch(
#endif
break;
- case gcvHAL_READ_ALL_PROFILE_REGISTERS:
-#if VIVANTE_PROFILER
- if (Kernel->profileSyncMode)
- {
- /* Read profile data according to the context. */
- gcmkONERROR(
- gckHARDWARE_QueryContextProfile(
- Kernel->hardware,
- Kernel->profileCleanRegister,
- gcmNAME_TO_PTR(Interface->u.RegisterProfileData.context),
- &Interface->u.RegisterProfileData.counters));
- }
- else
- {
- /* Read all 3D profile registers. */
- gcmkONERROR(
- gckHARDWARE_QueryProfileRegisters(
- Kernel->hardware,
- Kernel->profileCleanRegister,
- &Interface->u.RegisterProfileData.counters));
- }
-#elif VIVANTE_PROFILER
- /* Read all 3D profile registers. */
+ case gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1:
+ /* Read profile data according to the context. */
gcmkONERROR(
- gckHARDWARE_QueryProfileRegisters(
+ gckHARDWARE_QueryContextProfile(
Kernel->hardware,
Kernel->profileCleanRegister,
- &Interface->u.RegisterProfileData.counters));
-#else
- status = gcvSTATUS_OK;
-#endif
- break;
-
- case gcvHAL_READ_ALL_PROFILE_NEW_REGISTERS_PART1:
- if (Kernel->profileSyncMode)
- {
- /* Read profile data according to the context. */
- gcmkONERROR(
- gckHARDWARE_QueryContextNewProfile(
- Kernel->hardware,
- Kernel->profileCleanRegister,
- gcmNAME_TO_PTR(Interface->u.RegisterProfileNewData_part1.context),
- &Interface->u.RegisterProfileNewData_part1.newCounters,
- gcvNULL));
- }
+ gcmNAME_TO_PTR(Interface->u.RegisterProfileData_part1.context),
+ &Interface->u.RegisterProfileData_part1.Counters,
+ gcvNULL));
break;
- case gcvHAL_READ_ALL_PROFILE_NEW_REGISTERS_PART2:
- if (Kernel->profileSyncMode)
- {
- /* Read profile data according to the context. */
- gcmkONERROR(
- gckHARDWARE_QueryContextNewProfile(
- Kernel->hardware,
- Kernel->profileCleanRegister,
- gcmNAME_TO_PTR(Interface->u.RegisterProfileNewData_part2.context),
- gcvNULL,
- &Interface->u.RegisterProfileNewData_part2.newCounters));
- }
+ case gcvHAL_READ_ALL_PROFILE_REGISTERS_PART2:
+ /* Read profile data according to the context. */
+ gcmkONERROR(
+ gckHARDWARE_QueryContextProfile(
+ Kernel->hardware,
+ Kernel->profileCleanRegister,
+ gcmNAME_TO_PTR(Interface->u.RegisterProfileData_part2.context),
+ gcvNULL,
+ &Interface->u.RegisterProfileData_part2.Counters));
break;
case gcvHAL_GET_PROFILE_SETTING:
#if VIVANTE_PROFILER
/* Get profile setting */
Interface->u.GetProfileSetting.enable = Kernel->profileEnable;
- Interface->u.GetProfileSetting.syncMode = Kernel->profileSyncMode;
#endif
status = gcvSTATUS_OK;
@@ -2547,10 +2700,9 @@ gckKERNEL_Dispatch(
case gcvHAL_SET_PROFILE_SETTING:
#if VIVANTE_PROFILER
/* Set profile setting */
- if(Kernel->hardware->gpuProfiler)
+ if(Kernel->hardware->options.gpuProfiler)
{
Kernel->profileEnable = Interface->u.SetProfileSetting.enable;
- Kernel->profileSyncMode = Interface->u.SetProfileSetting.syncMode;
if (Kernel->profileEnable)
{
@@ -2568,7 +2720,7 @@ gckKERNEL_Dispatch(
status = gcvSTATUS_OK;
break;
- case gcvHAL_READ_PROFILER_NEW_REGISTER_SETTING:
+ case gcvHAL_READ_PROFILER_REGISTER_SETTING:
Kernel->profileCleanRegister = Interface->u.SetProfilerRegisterClear.bclear;
status = gcvSTATUS_OK;
break;
@@ -2825,6 +2977,15 @@ gckKERNEL_Dispatch(
#endif
break;
+ case gcvHAL_EXPORT_VIDEO_MEMORY:
+ /* Unlock video memory. */
+ gcmkONERROR(gckVIDMEM_NODE_Export(Kernel,
+ Interface->u.ExportVideoMemory.node,
+ Interface->u.ExportVideoMemory.flags,
+ gcvNULL,
+ &Interface->u.ExportVideoMemory.fd));
+ break;
+
case gcvHAL_NAME_VIDEO_MEMORY:
gcmkONERROR(gckVIDMEM_NODE_Name(Kernel,
Interface->u.NameVideoMemory.handle,
@@ -3006,18 +3167,36 @@ gckKERNEL_Dispatch(
}
break;
+#ifdef __linux__
+ case gcvHAL_GET_GRAPHIC_BUFFER_FD:
+ gcmkONERROR(_GetGraphicBufferFd(
+ Kernel,
+ processID,
+ Interface->u.GetGraphicBufferFd.node,
+ Interface->u.GetGraphicBufferFd.shBuf,
+ Interface->u.GetGraphicBufferFd.signal,
+ &Interface->u.GetGraphicBufferFd.fd
+ ));
+ break;
+#endif
+
case gcvHAL_CONFIG_POWER_MANAGEMENT:
gcmkONERROR(gckKERNEL_ConfigPowerManagement(Kernel, Interface));
break;
case gcvHAL_WRAP_USER_MEMORY:
- gcmkONERROR(gckKERNEL_WrapUserMemory(
- Kernel,
- processID,
- &Interface->u.WrapUserMemory.desc,
- &Interface->u.WrapUserMemory.node
- ));
+ gcmkONERROR(gckVIDMEM_NODE_WrapUserMemory(Kernel,
+ &Interface->u.WrapUserMemory.desc,
+ &Interface->u.WrapUserMemory.node));
+
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID,
+ gcvDB_VIDEO_MEMORY,
+ gcmINT2PTR(Interface->u.WrapUserMemory.node),
+ gcvNULL,
+ 0));
break;
case gcvHAL_WAIT_FENCE:
@@ -3066,6 +3245,14 @@ gckKERNEL_Dispatch(
#endif
+ case gcvHAL_QUERY_CHIP_OPTION:
+ /* Query chip options. */
+ gcmkONERROR(
+ gckHARDWARE_QueryChipOptions(
+ Kernel->hardware,
+ &Interface->u.QueryChipOptions));
+ break;
+
default:
/* Invalid command. */
gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
@@ -4323,7 +4510,7 @@ gckKERNEL_AllocateVirtualMemory(
&buffer->gpuAddress));
#if gcdENABLE_TRUST_APPLICATION
- if (Kernel->hardware->secureMode == gcvSECURE_IN_TA)
+ if (Kernel->hardware->options.secureMode == gcvSECURE_IN_TA)
{
gcmkONERROR(gckKERNEL_MapInTrustApplicaiton(
Kernel,
@@ -5709,6 +5896,7 @@ gckDEVICE_Construct(
{
device->coreInfoArray[i].type = gcvHARDWARE_INVALID;
}
+ device->defaultHwType = gcvHARDWARE_INVALID;
gckOS_ZeroMemory(device, gcmSIZEOF(gcsDEVICE));
@@ -5749,6 +5937,7 @@ gckDEVICE_AddCore(
gctUINT32 i;
gcsCORE_LIST *coreList;
gceHARDWARE_TYPE kernelType;
+ gceHARDWARE_TYPE defaultHwType;
gckKERNEL kernel;
gcmkASSERT(Device->coreNum < gcvCORE_COUNT);
@@ -5806,15 +5995,27 @@ gckDEVICE_AddCore(
/* Setup gceHARDWARE_TYPE to gceCORE mapping. */
coreList->kernels[coreList->num++] = kernel;
+ defaultHwType = kernelType;
if (kernelType == gcvHARDWARE_3D2D)
{
coreList = &Device->map[gcvHARDWARE_3D];
coreList->kernels[coreList->num++] = kernel;
+ defaultHwType = gcvHARDWARE_3D;
}
/* Advance total core number. */
Device->coreNum++;
+ /* Default HW type was chosen: 3D > 2D > VG */
+ if (Device->defaultHwType == gcvHARDWARE_INVALID)
+ {
+ Device->defaultHwType = defaultHwType;
+ }
+ else if (Device->defaultHwType > defaultHwType)
+ {
+ Device->defaultHwType = defaultHwType;
+ }
+
return gcvSTATUS_OK;
OnError:
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
index fa0c29703b1e..55fcc8919ef4 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
@@ -255,6 +255,12 @@ typedef struct _gcsDATABASE
/* Process ID. */
gctUINT32 processID;
+ /* Open-Close ref count */
+ gctPOINTER refs;
+
+ /* Already mark for delete and cannot reenter */
+ gctBOOL deleted;
+
/* Sizes to query. */
gcsDATABASE_COUNTERS vidMem;
gcsDATABASE_COUNTERS nonPaged;
@@ -580,8 +586,6 @@ struct _gckKERNEL
#if VIVANTE_PROFILER
/* Enable profiling */
gctBOOL profileEnable;
- /* profiling sync mode*/
- gctBOOL profileSyncMode;
/* Clear profile register or not*/
gctBOOL profileCleanRegister;
#endif
@@ -641,7 +645,7 @@ struct _gckKERNEL
gctUINT32 lastCommitStamp;
gctUINT32 timer;
gctUINT32 restoreAddress;
- gctINT32 restoreMask;
+ gctINT32 restoreMask;
/* 3DBLIT */
gckASYNC_COMMAND asyncCommand;
@@ -651,6 +655,9 @@ struct _gckKERNEL
gckDEVICE device;
gctUINT chipID;
+
+ gctUINT32 contiguousBaseAddress;
+ gctUINT32 externalBaseAddress;
};
struct _FrequencyHistory
@@ -1064,6 +1071,9 @@ struct _gckVIDMEM
/* Pointer to gckOS object. */
gckOS os;
+ /* mdl record pointer... a kmalloc address. Process agnostic. */
+ gctPHYS_ADDR physical;
+
/* Information for this video memory heap. */
gctUINT32 baseAddress;
gctSIZE_T bytes;
@@ -1088,6 +1098,9 @@ typedef struct _gcsVIDMEM_NODE
/* Pointer to gcuVIDMEM_NODE. */
gcuVIDMEM_NODE_PTR node;
+ /* Pointer to gckKERNEL object. */
+ gckKERNEL kernel;
+
/* Mutex to protect node. */
gctPOINTER mutex;
@@ -1097,6 +1110,9 @@ typedef struct _gcsVIDMEM_NODE
/* Name for client to import. */
gctUINT32 name;
+ /* dma_buf */
+ gctPOINTER dmabuf;
+
#if gcdPROCESS_ADDRESS_SPACE
/* Head of mapping list. */
gcsGPU_MAP_PTR mapHead;
@@ -1170,6 +1186,7 @@ typedef struct _gcsDEVICE
gcsCORE_INFO coreInfoArray[gcvCORE_COUNT];
gctUINT32 coreNum;
gcsCORE_LIST map[gcvHARDWARE_NUM_TYPES];
+ gceHARDWARE_TYPE defaultHwType;
gckOS os;
@@ -1231,17 +1248,26 @@ gckVIDMEM_NODE_Dereference(
);
gceSTATUS
+gckVIDMEM_NODE_Export(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Handle,
+ IN gctINT32 Flags,
+ OUT gctPOINTER *DmaBuf,
+ OUT gctINT32 *FD
+ );
+
+gceSTATUS
gckVIDMEM_NODE_Name(
IN gckKERNEL Kernel,
IN gctUINT32 Handle,
- IN gctUINT32 * Name
+ OUT gctUINT32 * Name
);
gceSTATUS
gckVIDMEM_NODE_Import(
IN gckKERNEL Kernel,
IN gctUINT32 Name,
- IN gctUINT32 * Handle
+ OUT gctUINT32 * Handle
);
gceSTATUS
@@ -1267,10 +1293,10 @@ gckVIDMEM_HANDLE_Lookup(
);
gceSTATUS
-gckVIDMEM_ConstructVirtualFromUserMemory(
+gckVIDMEM_NODE_WrapUserMemory(
IN gckKERNEL Kernel,
IN gcsUSER_MEMORY_DESC_PTR Desc,
- OUT gcuVIDMEM_NODE_PTR * Node
+ OUT gctUINT32 * Handle
);
gceSTATUS
@@ -1281,6 +1307,13 @@ gckVIDMEM_FindVIDMEM(
OUT gctUINT32_PTR PageTableEntryValue
);
+gceSTATUS
+gckVIDMEM_QueryNodes(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ OUT gctINT32 *Count,
+ OUT gcuVIDMEM_NODE_PTR *Nodes
+ );
#if gcdPROCESS_ADDRESS_SPACE
gceSTATUS
@@ -1355,6 +1388,9 @@ struct _gckMMU
struct _gckQUEUE recentFreedAddresses;
gcsADDRESS_AREA area[gcvADDRESS_AREA_COUNT];
+
+ gctUINT32 contiguousBaseAddress;
+ gctUINT32 externalBaseAddress;
};
typedef struct _gcsASYNC_COMMAND
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c
index 1dc58f3c8e27..2044cf1de7bb 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c
@@ -1762,7 +1762,6 @@ gckCOMMAND_Commit(
IN gckCONTEXT Context,
IN gcoCMDBUF CommandBuffer,
IN gcsSTATE_DELTA_PTR StateDelta,
- IN gcsQUEUE_PTR EventQueue,
IN gctUINT32 ProcessID,
IN gctBOOL Shared,
IN gctUINT32 Index,
@@ -1775,8 +1774,6 @@ gckCOMMAND_Commit(
gctBOOL contextAcquired = gcvFALSE;
gckHARDWARE hardware;
gctBOOL needCopy = gcvFALSE;
- gcsQUEUE_PTR eventRecord = gcvNULL;
- gcsQUEUE_PTR nextEventRecord;
gctBOOL commandBufferMapped = gcvFALSE;
gcoCMDBUF commandBufferObject = gcvNULL;
gctBOOL stall = gcvFALSE;
@@ -1784,12 +1781,11 @@ gckCOMMAND_Commit(
#if !gcdNULL_DRIVER
gcsCONTEXT_PTR contextBuffer;
+ struct _gcoCMDBUF _commandBufferObject;
gctPHYS_ADDR_T commandBufferPhysical;
gctUINT8_PTR commandBufferLogical = gcvNULL;
gctUINT32 commandBufferAddress = 0;
- gctUINT8_PTR commandBufferLink = gcvNULL;
gctUINT8_PTR commandBufferTail = gcvNULL;
- gctUINT8_PTR commandBufferFence = gcvNULL;
gctUINT commandBufferSize;
gctSIZE_T nopBytes;
gctUINT32 pipeBytes;
@@ -1812,9 +1808,6 @@ gckCOMMAND_Commit(
gctPOINTER waitLinkLogical;
gctUINT32 waitLinkAddress;
gctUINT32 waitLinkBytes;
- gctUINT32 waitPhysical;
- gctPOINTER waitLogical;
- gctUINT32 waitAddress;
gctUINT32 waitOffset;
gctUINT32 waitSize;
@@ -1841,10 +1834,10 @@ gckCOMMAND_Commit(
gckVIRTUAL_COMMAND_BUFFER_PTR virtualCommandBuffer = gcvNULL;
gctUINT64 asyncCommandStamp = 0;
gcoCMDBUF lastCommandBuffer = gcvNULL;
-#endif
-
gctPOINTER pointer = gcvNULL;
+#endif
+
gcmkHEADER_ARG(
"Command=0x%x CommandBuffer=0x%x ProcessID=%d",
Command, CommandBuffer, ProcessID
@@ -1902,8 +1895,7 @@ gckCOMMAND_Commit(
#else
if (needCopy)
{
- gcmkONERROR(gckOS_Allocate(Command->os, gcmSIZEOF(struct _gcoCMDBUF), &pointer));
- commandBufferObject = pointer;
+ commandBufferObject = &_commandBufferObject;
gcmkONERROR(gckOS_CopyFromUserData(
Command->os,
@@ -2286,11 +2278,6 @@ gckCOMMAND_Commit(
&waitSize
));
- /* Compute the location if WAIT command. */
- waitPhysical = waitLinkPhysical + waitOffset;
- waitLogical = (gctUINT8_PTR) waitLinkLogical + waitOffset;
- waitAddress = waitLinkAddress + waitOffset;
-
#if gcdNONPAGED_MEMORY_CACHEABLE
/* Flush the command queue cache. */
gcmkONERROR(gckOS_CacheClean(
@@ -2309,33 +2296,21 @@ gckCOMMAND_Commit(
+ commandBufferSize
- commandBufferObject->reservedTail;
- if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_FENCE_64BIT))
- {
- /* Determine the location of the FENCE command in the command buffer. */
- commandBufferFence = commandBufferTail;
-
- /* Determine the location of the LINK command in the command buffer. */
- commandBufferLink = commandBufferTail + gcdRENDER_FENCE_LENGTH;
- }
- else
- {
- /* Determine the location of the LINK command in the command buffer. */
- commandBufferLink = commandBufferTail;
- }
-
/* Generate command which writes out commit stamp. */
- if (commandBufferFence)
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_FENCE_64BIT))
{
gctUINT32 bytes;
gcmkONERROR(gckHARDWARE_Fence(
hardware,
gcvENGINE_RENDER,
- commandBufferFence,
+ commandBufferTail,
Command->fence->address,
Command->commitStamp,
&bytes
));
+
+ commandBufferTail += gcdRENDER_FENCE_LENGTH;
}
/* Generate a LINK from the end of the command buffer being scheduled
@@ -2345,7 +2320,7 @@ gckCOMMAND_Commit(
{
gcmkONERROR(gckHARDWARE_Link(
hardware,
- commandBufferLink,
+ commandBufferTail,
exitAddress,
exitBytes,
&linkBytes,
@@ -2355,7 +2330,7 @@ gckCOMMAND_Commit(
}
else
{
- gctUINT8_PTR link = commandBufferLink + Index * 16;
+ gctUINT8_PTR link = commandBufferTail + Index * 16;
gctSIZE_T bytes = 8;
gcmkONERROR(gckHARDWARE_ChipEnable(
@@ -2518,9 +2493,9 @@ gckCOMMAND_Commit(
Command->newQueue = gcvFALSE;
/* Update address of last WAIT. */
- Command->waitPhysical = waitPhysical;
- Command->waitLogical = waitLogical;
- Command->waitAddress = waitAddress;
+ Command->waitPhysical = waitLinkPhysical + waitOffset;
+ Command->waitLogical = (gctUINT8_PTR)waitLinkLogical + waitOffset;
+ Command->waitAddress = waitLinkAddress + waitOffset;
Command->waitSize = waitSize;
/* Update queue tail pointer. */
@@ -2563,82 +2538,19 @@ gckCOMMAND_Commit(
gcmkONERROR(gckCOMMAND_ExitCommit(Command, gcvFALSE));
commitEntered = gcvFALSE;
- if ((Command->kernel->hardware->gpuProfiler == gcvTRUE) &&
- (Command->kernel->profileEnable == gcvTRUE) &&
- (Command->kernel->profileSyncMode == gcvTRUE))
+ if ((Command->kernel->hardware->options.gpuProfiler == gcvTRUE) &&
+ (Command->kernel->profileEnable == gcvTRUE))
{
gcmkONERROR(gckCOMMAND_Stall(Command, gcvTRUE));
if (Command->currContext)
{
- gcmkONERROR(gckHARDWARE_UpdateContextNewProfile(
+ gcmkONERROR(gckHARDWARE_UpdateContextProfile(
hardware,
Command->currContext));
}
}
- /* Loop while there are records in the queue. */
- while (EventQueue != gcvNULL)
- {
- if (needCopy)
- {
- gcmkONERROR(gckOS_Allocate(Command->os, gcmSIZEOF(gcsQUEUE), &pointer));
-
- /* Point to stack record. */
- eventRecord = pointer;
-
- /* Copy the data from the client. */
- gcmkONERROR(gckOS_CopyFromUserData(
- Command->os, eventRecord, EventQueue, gcmSIZEOF(gcsQUEUE)
- ));
- }
- else
- {
- /* Map record into kernel memory. */
- gcmkONERROR(gckOS_MapUserPointer(Command->os,
- EventQueue,
- gcmSIZEOF(gcsQUEUE),
- &pointer));
-
- eventRecord = pointer;
- }
-
- /* Append event record to event queue. */
- gcmkONERROR(gckEVENT_AddList(
- Command->kernel->eventObj, &eventRecord->iface, gcvKERNEL_PIXEL, gcvTRUE, gcvFALSE
- ));
-
- /* Next record in the queue. */
- nextEventRecord = gcmUINT64_TO_PTR(eventRecord->next);
-
- if (!needCopy)
- {
- /* Unmap record from kernel memory. */
- gcmkONERROR(gckOS_UnmapUserPointer(
- Command->os, EventQueue, gcmSIZEOF(gcsQUEUE), (gctPOINTER *) eventRecord
- ));
-
- eventRecord = gcvNULL;
- }
- else
- {
- gcmkONERROR(gckOS_Free(Command->os,eventRecord));
- eventRecord = gcvNULL;
- }
-
- EventQueue = nextEventRecord;
- }
-
- if (Command->kernel->eventObj->queueHead == gcvNULL
- && Command->kernel->hardware->powerManagement == gcvTRUE)
- {
- /* Commit done event by which work thread knows all jobs done. */
- gcmkVERIFY_OK(
- gckEVENT_CommitDone(Command->kernel->eventObj, gcvKERNEL_PIXEL, Command->currContext));
- }
-
- /* Submit events. */
- status = gckEVENT_Submit(Command->kernel->eventObj, gcvTRUE, gcvFALSE);
if (status == gcvSTATUS_INTERRUPTED)
{
gcmkTRACE(
@@ -2678,31 +2590,12 @@ gckCOMMAND_Commit(
commandBufferMapped = gcvFALSE;
}
- else if (needCopy)
- {
- gcmkONERROR(gckOS_Free(Command->os, commandBufferObject));
- }
/* Return status. */
gcmkFOOTER();
return gcvSTATUS_OK;
OnError:
- if ((eventRecord != gcvNULL) && !needCopy)
- {
- /* Roll back. */
- gcmkVERIFY_OK(gckOS_UnmapUserPointer(
- Command->os,
- EventQueue,
- gcmSIZEOF(gcsQUEUE),
- (gctPOINTER *) eventRecord
- ));
- }
- else if ((eventRecord != gcvNULL) && needCopy)
- {
- gcmkVERIFY_OK(gckOS_Free(Command->os, eventRecord));
- }
-
if (contextAcquired)
{
/* Release the context switching mutex. */
@@ -2736,10 +2629,6 @@ OnError:
commandBufferObject
));
}
- else if (needCopy)
- {
- gcmkVERIFY_OK(gckOS_Free(Command->os, commandBufferObject));
- }
/* Return status. */
gcmkFOOTER();
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
index f33f650cd89e..765231be9e5e 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
@@ -64,114 +64,6 @@
(gctUINT32)(gcmPTR_TO_UINT64(x) % gcmCOUNTOF(database->list))
/*******************************************************************************
-** gckKERNEL_NewDatabase
-**
-** Create a new database structure and insert it to the head of the hash list.
-**
-** INPUT:
-**
-** gckKERNEL Kernel
-** Pointer to a gckKERNEL object.
-**
-** gctUINT32 ProcessID
-** ProcessID that identifies the database.
-**
-** OUTPUT:
-**
-** gcsDATABASE_PTR * Database
-** Pointer to a variable receiving the database structure pointer on
-** success.
-*/
-static gceSTATUS
-gckKERNEL_NewDatabase(
- IN gckKERNEL Kernel,
- IN gctUINT32 ProcessID,
- OUT gcsDATABASE_PTR * Database
- )
-{
- gceSTATUS status;
- gcsDATABASE_PTR database;
- gctPOINTER pointer = gcvNULL;
- gctBOOL acquired = gcvFALSE;
- gctSIZE_T slot;
- gcsDATABASE_PTR existingDatabase;
-
- gcmkHEADER_ARG("Kernel=0x%x ProcessID=%d", Kernel, ProcessID);
-
- /* Acquire the database mutex. */
- gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
- acquired = gcvTRUE;
-
- /* Compute the hash for the database. */
- slot = ProcessID % gcmCOUNTOF(Kernel->db->db);
-
- /* Walk the hash list. */
- for (existingDatabase = Kernel->db->db[slot];
- existingDatabase != gcvNULL;
- existingDatabase = existingDatabase->next)
- {
- if (existingDatabase->processID == ProcessID)
- {
- /* One process can't be added twice. */
- gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
- }
- }
-
- if (Kernel->db->freeDatabase != gcvNULL)
- {
- /* Allocate a database from the free list. */
- database = Kernel->db->freeDatabase;
- Kernel->db->freeDatabase = database->next;
- }
- else
- {
- /* Allocate a new database from the heap. */
- gcmkONERROR(gckOS_Allocate(Kernel->os,
- gcmSIZEOF(gcsDATABASE),
- &pointer));
-
- gckOS_ZeroMemory(pointer, gcmSIZEOF(gcsDATABASE));
-
- database = pointer;
-
- gcmkONERROR(gckOS_CreateMutex(Kernel->os, &database->counterMutex));
- }
-
- /* Insert the database into the hash. */
- database->next = Kernel->db->db[slot];
- Kernel->db->db[slot] = database;
-
- /* Save the hash slot. */
- database->slot = slot;
-
- /* Release the database mutex. */
- gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
-
- /* Return the database. */
- *Database = database;
-
- /* Success. */
- gcmkFOOTER_ARG("*Database=0x%x", *Database);
- return gcvSTATUS_OK;
-
-OnError:
- if (pointer)
- {
- gcmkOS_SAFE_FREE(Kernel->os, pointer);
- }
-
- if (acquired)
- {
- /* Release the database mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
- }
-
- /* Return the status. */
- gcmkFOOTER();
- return status;
-}
-
-/*******************************************************************************
** gckKERNEL_FindDatabase
**
** Find a database identified by a process ID and move it to the head of the
@@ -286,9 +178,9 @@ OnError:
}
/*******************************************************************************
-** gckKERNEL_DeleteDatabase
+** gckKERNEL_DeinitDatabase
**
-** Remove a database from the hash list and delete its structure.
+** De-init a database structure.
**
** INPUT:
**
@@ -296,104 +188,54 @@ OnError:
** Pointer to a gckKERNEL object.
**
** gcsDATABASE_PTR Database
-** Pointer to the database structure to remove.
+** Pointer to the database structure to deinit.
**
** OUTPUT:
**
** Nothing.
*/
static gceSTATUS
-gckKERNEL_DeleteDatabase(
+gckKERNEL_DeinitDatabase(
IN gckKERNEL Kernel,
IN gcsDATABASE_PTR Database
)
{
- gceSTATUS status;
- gctBOOL acquired = gcvFALSE;
- gcsDATABASE_PTR database;
-
gcmkHEADER_ARG("Kernel=0x%x Database=0x%x", Kernel, Database);
- /* Acquire the database mutex. */
- gcmkONERROR(
- gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
- acquired = gcvTRUE;
-
- /* Check slot value. */
- gcmkVERIFY_ARGUMENT(Database->slot < gcmCOUNTOF(Kernel->db->db));
-
- if (Database->slot < gcmCOUNTOF(Kernel->db->db))
+ if (Database)
{
- /* Check if database if the head of the hash list. */
- if (Kernel->db->db[Database->slot] == Database)
+ Database->deleted = gcvFALSE;
+
+ /* Destory handle db. */
+ if (Database->refs)
{
- /* Remove the database from the hash list. */
- Kernel->db->db[Database->slot] = Database->next;
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Kernel->os, Database->refs));
+ Database->refs = gcvNULL;
}
- else
- {
- /* Walk the has list to find the database. */
- for (database = Kernel->db->db[Database->slot];
- database != gcvNULL;
- database = database->next
- )
- {
- /* Check if the next list entry is this database. */
- if (database->next == Database)
- {
- /* Remove the database from the hash list. */
- database->next = Database->next;
- break;
- }
- }
- if (database == gcvNULL)
- {
- /* Ouch! Something got corrupted. */
- gcmkONERROR(gcvSTATUS_INVALID_DATA);
- }
+ if (Database->handleDatabase)
+ {
+ gcmkVERIFY_OK(gckKERNEL_DestroyIntegerDatabase(Kernel, Database->handleDatabase));
+ Database->handleDatabase = gcvNULL;
}
- }
-
- if (Kernel->db->lastDatabase != gcvNULL)
- {
- /* Insert database to the free list. */
- Kernel->db->lastDatabase->next = Kernel->db->freeDatabase;
- Kernel->db->freeDatabase = Kernel->db->lastDatabase;
- }
-
- /* Keep database as the last database. */
- Kernel->db->lastDatabase = Database;
- /* Destory handle db. */
- gcmkVERIFY_OK(gckKERNEL_DestroyIntegerDatabase(Kernel, Database->handleDatabase));
- Database->handleDatabase = gcvNULL;
- gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Database->handleDatabaseMutex));
- Database->handleDatabaseMutex = gcvNULL;
+ if (Database->handleDatabaseMutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Database->handleDatabaseMutex));
+ Database->handleDatabaseMutex = gcvNULL;
+ }
#if gcdPROCESS_ADDRESS_SPACE
- /* Destory process MMU. */
- gcmkVERIFY_OK(gckEVENT_DestroyMmu(Kernel->eventObj, Database->mmu, gcvKERNEL_PIXEL));
- Database->mmu = gcvNULL;
+ if (Database->mmu)
+ {
+ gcmkONERROR(gckEVENT_DestroyMmu(Kernel->eventObj, Database->mmu, gcvKERNEL_PIXEL));
+ Database->mmu = gcvNULL;
+ }
#endif
+ }
- /* Release the database mutex. */
- gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
-
- /* Success. */
gcmkFOOTER_NO();
return gcvSTATUS_OK;
-
-OnError:
- if (acquired)
- {
- /* Release the database mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
- }
-
- /* Return the status. */
- gcmkFOOTER();
- return status;
}
/*******************************************************************************
@@ -712,39 +554,86 @@ gckKERNEL_CreateProcessDB(
IN gctUINT32 ProcessID
)
{
- gceSTATUS status;
+ gceSTATUS status = gcvSTATUS_OK;
gcsDATABASE_PTR database = gcvNULL;
+ gctPOINTER pointer = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+ gctSIZE_T slot;
gctUINT32 i;
gcmkHEADER_ARG("Kernel=0x%x ProcessID=%d", Kernel, ProcessID);
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ /* Compute the hash for the database. */
+ slot = ProcessID % gcmCOUNTOF(Kernel->db->db);
+
+ /* Acquire the database mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Walk the hash list. */
+ for (database = Kernel->db->db[slot];
+ database != gcvNULL;
+ database = database->next)
+ {
+ if (database->processID == ProcessID)
+ {
+ gctINT32 oldVal = 0;
+
+ if (database->deleted)
+ {
+ gcmkFATAL("%s(%d): DB of Process=0x%x cannot be reentered since it was in deletion\n",
+ __FUNCTION__, __LINE__, ProcessID);
+ gcmkONERROR(gcvSTATUS_INVALID_REQUEST);
+ }
+
+ gcmkVERIFY_OK(gckOS_AtomIncrement(Kernel->os, database->refs, &oldVal));
+ goto OnExit;
+ }
+ }
- /* Create a new database. */
- gcmkONERROR(gckKERNEL_NewDatabase(Kernel, ProcessID, &database));
+ if (Kernel->db->freeDatabase)
+ {
+ /* Allocate a database from the free list. */
+ database = Kernel->db->freeDatabase;
+ Kernel->db->freeDatabase = database->next;
+ }
+ else
+ {
+ /* Allocate a new database from the heap. */
+ gcmkONERROR(gckOS_Allocate(Kernel->os,
+ gcmSIZEOF(gcsDATABASE),
+ &pointer));
+
+ gckOS_ZeroMemory(pointer, gcmSIZEOF(gcsDATABASE));
+
+ database = pointer;
+
+ gcmkONERROR(gckOS_CreateMutex(Kernel->os, &database->counterMutex));
+ }
/* Initialize the database. */
- database->processID = ProcessID;
- database->vidMem.bytes = 0;
- database->vidMem.maxBytes = 0;
- database->vidMem.totalBytes = 0;
- database->nonPaged.bytes = 0;
- database->nonPaged.maxBytes = 0;
- database->nonPaged.totalBytes = 0;
- database->contiguous.bytes = 0;
- database->contiguous.maxBytes = 0;
- database->contiguous.totalBytes = 0;
- database->mapMemory.bytes = 0;
- database->mapMemory.maxBytes = 0;
- database->mapMemory.totalBytes = 0;
- database->mapUserMemory.bytes = 0;
- database->mapUserMemory.maxBytes = 0;
- database->mapUserMemory.totalBytes = 0;
+ /* Save the hash slot. */
+ database->slot = slot;
+ database->processID = ProcessID;
+ database->vidMem.bytes = 0;
+ database->vidMem.maxBytes = 0;
+ database->vidMem.totalBytes = 0;
+ database->nonPaged.bytes = 0;
+ database->nonPaged.maxBytes = 0;
+ database->nonPaged.totalBytes = 0;
+ database->contiguous.bytes = 0;
+ database->contiguous.maxBytes = 0;
+ database->contiguous.totalBytes = 0;
+ database->mapMemory.bytes = 0;
+ database->mapMemory.maxBytes = 0;
+ database->mapMemory.totalBytes = 0;
+ database->mapUserMemory.bytes = 0;
+ database->mapUserMemory.maxBytes = 0;
+ database->mapUserMemory.totalBytes = 0;
for (i = 0; i < gcmCOUNTOF(database->list); i++)
{
- database->list[i] = gcvNULL;
+ database->list[i] = gcvNULL;
}
for (i = 0; i < gcvSURF_NUM_TYPES; i++)
@@ -761,37 +650,38 @@ gckKERNEL_CreateProcessDB(
database->vidMemPool[i].totalBytes = 0;
}
+ gcmkASSERT(database->refs == gcvNULL);
+ gcmkONERROR(gckOS_AtomConstruct(Kernel->os, &database->refs));
+ gcmkONERROR(gckOS_AtomSet(Kernel->os, database->refs, 1));
+
gcmkASSERT(database->handleDatabase == gcvNULL);
- gcmkONERROR(
- gckKERNEL_CreateIntegerDatabase(Kernel, &database->handleDatabase));
+ gcmkONERROR(gckKERNEL_CreateIntegerDatabase(Kernel, &database->handleDatabase));
gcmkASSERT(database->handleDatabaseMutex == gcvNULL);
- gcmkONERROR(
- gckOS_CreateMutex(Kernel->os, &database->handleDatabaseMutex));
+ gcmkONERROR(gckOS_CreateMutex(Kernel->os, &database->handleDatabaseMutex));
#if gcdPROCESS_ADDRESS_SPACE
gcmkASSERT(database->mmu == gcvNULL);
- gcmkONERROR(
- gckMMU_Construct(Kernel, gcdMMU_SIZE, &database->mmu));
+ gcmkONERROR(gckMMU_Construct(Kernel, gcdMMU_SIZE, &database->mmu));
#endif
#if gcdSECURE_USER
{
- gctINT slot;
+ gctINT idx;
gcskSECURE_CACHE * cache = &database->cache;
/* Setup the linked list of cache nodes. */
- for (slot = 1; slot <= gcdSECURE_CACHE_SLOTS; ++slot)
+ for (idx = 1; idx <= gcdSECURE_CACHE_SLOTS; ++idx)
{
- cache->cache[slot].logical = gcvNULL;
+ cache->cache[idx].logical = gcvNULL;
#if gcdSECURE_CACHE_METHOD != gcdSECURE_CACHE_TABLE
- cache->cache[slot].prev = &cache->cache[slot - 1];
- cache->cache[slot].next = &cache->cache[slot + 1];
+ cache->cache[idx].prev = &cache->cache[idx - 1];
+ cache->cache[idx].next = &cache->cache[idx + 1];
# endif
#if gcdSECURE_CACHE_METHOD == gcdSECURE_CACHE_HASH
- cache->cache[slot].nextHash = gcvNULL;
- cache->cache[slot].prevHash = gcvNULL;
+ cache->cache[idx].nextHash = gcvNULL;
+ cache->cache[idx].prevHash = gcvNULL;
# endif
}
@@ -808,10 +698,10 @@ gckKERNEL_CreateProcessDB(
#if gcdSECURE_CACHE_METHOD == gcdSECURE_CACHE_HASH
/* Zero out the hash table. */
- for (slot = 0; slot < gcmCOUNTOF(cache->hash); ++slot)
+ for (idx = 0; idx < gcmCOUNTOF(cache->hash); ++idx)
{
- cache->hash[slot].logical = gcvNULL;
- cache->hash[slot].nextHash = gcvNULL;
+ cache->hash[idx].logical = gcvNULL;
+ cache->hash[idx].nextHash = gcvNULL;
}
# endif
@@ -822,14 +712,31 @@ gckKERNEL_CreateProcessDB(
}
#endif
+ /* Insert the database into the hash. */
+ database->next = Kernel->db->db[slot];
+ Kernel->db->db[slot] = database;
+
/* Reset idle timer. */
Kernel->db->lastIdle = 0;
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
OnError:
+ if (gcmIS_ERROR(status))
+ {
+ gcmkVERIFY_OK(gckKERNEL_DeinitDatabase(Kernel, database));
+
+ if (pointer)
+ {
+ gcmkOS_SAFE_FREE(Kernel->os, pointer);
+ }
+ }
+
+OnExit:
+ if (acquired)
+ {
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+ }
+
/* Return the status. */
gcmkFOOTER();
return status;
@@ -1245,14 +1152,13 @@ gckKERNEL_DestroyProcessDB(
IN gctUINT32 ProcessID
)
{
- gceSTATUS status;
- gcsDATABASE_PTR database;
- gcsDATABASE_RECORD_PTR record, next;
- gctBOOL asynchronous = gcvTRUE;
- gckVIDMEM_NODE nodeObject;
- gctPHYS_ADDR physical;
+ gceSTATUS status = gcvSTATUS_OK;
gckKERNEL kernel = Kernel;
- gctUINT32 handle;
+ gcsDATABASE_PTR previous = gcvNULL;
+ gcsDATABASE_PTR database = gcvNULL;
+ gcsDATABASE_PTR db = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+ gctSIZE_T slot;
gctUINT32 i;
gcmkHEADER_ARG("Kernel=0x%x ProcessID=%d", Kernel, ProcessID);
@@ -1260,8 +1166,50 @@ gckKERNEL_DestroyProcessDB(
/* Verify the arguments. */
gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
- /* Find the database. */
- gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, gcvFALSE, &database));
+ /* Compute the hash for the database. */
+ slot = ProcessID % gcmCOUNTOF(Kernel->db->db);
+
+ /* Acquire the database mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Walk the hash list. */
+ for (database = Kernel->db->db[slot];
+ database != gcvNULL;
+ database = database->next)
+ {
+ if (database->processID == ProcessID)
+ {
+ break;
+ }
+ }
+
+ if (database)
+ {
+ gctINT32 oldVal = 0;
+ gcmkONERROR(gckOS_AtomDecrement(Kernel->os, database->refs, &oldVal));
+ if (oldVal != 1)
+ {
+ goto OnExit;
+ }
+
+ /* Mark it for delete so disallow reenter until really delete it */
+ gcmkASSERT(!database->deleted);
+ database->deleted = gcvTRUE;
+ }
+ else
+ {
+ gcmkFATAL("%s(%d): DB destroy of Process=0x%x cannot match with creation\n",
+ __FUNCTION__, __LINE__, ProcessID);
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+ /* Cannot remove the database from the hash list
+ ** since later records deinit need to access from the hash
+ */
+
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+ acquired = gcvFALSE;
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DATABASE,
"DB(%d): VidMem: total=%lu max=%lu",
@@ -1294,236 +1242,286 @@ gckKERNEL_DestroyProcessDB(
ProcessID);
}
- for(i = 0; i < gcmCOUNTOF(database->list); i++)
- {
-
- /* Walk all records. */
- for (record = database->list[i]; record != gcvNULL; record = next)
+ for (i = 0; i < gcmCOUNTOF(database->list); i++)
{
- /* Next next record. */
- next = record->next;
+ gcsDATABASE_RECORD_PTR record, next;
- /* Dispatch on record type. */
- switch (record->type)
+ /* Walk all records. */
+ for (record = database->list[i]; record != gcvNULL; record = next)
{
- case gcvDB_VIDEO_MEMORY:
- gcmkERR_BREAK(gckVIDMEM_HANDLE_Lookup(record->kernel,
- ProcessID,
- gcmPTR2INT32(record->data),
- &nodeObject));
-
- /* Free the video memory. */
- gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
- ProcessID,
- gcmPTR2INT32(record->data)));
-
- gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
- nodeObject));
-
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: VIDEO_MEMORY 0x%x (status=%d)",
- record->data, status);
- break;
+ gctBOOL asynchronous = gcvTRUE;
+ gckVIDMEM_NODE nodeObject;
+ gctPHYS_ADDR physical;
+ gctUINT32 handle;
- case gcvDB_NON_PAGED:
- physical = gcmNAME_TO_PTR(record->physical);
- /* Unmap user logical memory first. */
- status = gckOS_UnmapUserLogical(Kernel->os,
- physical,
- record->bytes,
- record->data);
-
- /* Free the non paged memory. */
- status = gckEVENT_FreeNonPagedMemory(record->kernel->eventObj,
- record->bytes,
- physical,
- record->data,
- gcvKERNEL_PIXEL);
- gcmRELEASE_NAME(record->physical);
-
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: NON_PAGED 0x%x, bytes=%lu (status=%d)",
- record->data, record->bytes, status);
- break;
+ /* Next next record. */
+ next = record->next;
- case gcvDB_COMMAND_BUFFER:
- /* Free the command buffer. */
- status = gckEVENT_DestroyVirtualCommandBuffer(record->kernel->eventObj,
- record->bytes,
- gcmNAME_TO_PTR(record->physical),
- record->data,
- gcvKERNEL_PIXEL);
- gcmRELEASE_NAME(record->physical);
-
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: COMMAND_BUFFER 0x%x, bytes=%lu (status=%d)",
- record->data, record->bytes, status);
- break;
+ /* Dispatch on record type. */
+ switch (record->type)
+ {
+ case gcvDB_VIDEO_MEMORY:
+ gcmkERR_BREAK(gckVIDMEM_HANDLE_Lookup(record->kernel,
+ ProcessID,
+ gcmPTR2INT32(record->data),
+ &nodeObject));
- case gcvDB_CONTIGUOUS:
- physical = gcmNAME_TO_PTR(record->physical);
- /* Unmap user logical memory first. */
- status = gckOS_UnmapUserLogical(Kernel->os,
- physical,
- record->bytes,
- record->data);
-
- /* Free the contiguous memory. */
- status = gckEVENT_FreeContiguousMemory(record->kernel->eventObj,
- record->bytes,
- physical,
- record->data,
- gcvKERNEL_PIXEL);
- gcmRELEASE_NAME(record->physical);
-
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: CONTIGUOUS 0x%x bytes=%lu (status=%d)",
- record->data, record->bytes, status);
- break;
+ /* Free the video memory. */
+ gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
+ ProcessID,
+ gcmPTR2INT32(record->data)));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
+ nodeObject));
+
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: VIDEO_MEMORY 0x%x (status=%d)",
+ record->data, status);
+ break;
+
+ case gcvDB_NON_PAGED:
+ physical = gcmNAME_TO_PTR(record->physical);
+ /* Unmap user logical memory first. */
+ status = gckOS_UnmapUserLogical(Kernel->os,
+ physical,
+ record->bytes,
+ record->data);
+
+ /* Free the non paged memory. */
+ status = gckEVENT_FreeNonPagedMemory(record->kernel->eventObj,
+ record->bytes,
+ physical,
+ record->data,
+ gcvKERNEL_PIXEL);
+ gcmRELEASE_NAME(record->physical);
+
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: NON_PAGED 0x%x, bytes=%lu (status=%d)",
+ record->data, record->bytes, status);
+ break;
+
+ case gcvDB_COMMAND_BUFFER:
+ /* Free the command buffer. */
+ status = gckEVENT_DestroyVirtualCommandBuffer(record->kernel->eventObj,
+ record->bytes,
+ gcmNAME_TO_PTR(record->physical),
+ record->data,
+ gcvKERNEL_PIXEL);
+ gcmRELEASE_NAME(record->physical);
+
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: COMMAND_BUFFER 0x%x, bytes=%lu (status=%d)",
+ record->data, record->bytes, status);
+ break;
+
+ case gcvDB_CONTIGUOUS:
+ physical = gcmNAME_TO_PTR(record->physical);
+ /* Unmap user logical memory first. */
+ status = gckOS_UnmapUserLogical(Kernel->os,
+ physical,
+ record->bytes,
+ record->data);
+
+ /* Free the contiguous memory. */
+ status = gckEVENT_FreeContiguousMemory(record->kernel->eventObj,
+ record->bytes,
+ physical,
+ record->data,
+ gcvKERNEL_PIXEL);
+ gcmRELEASE_NAME(record->physical);
+
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: CONTIGUOUS 0x%x bytes=%lu (status=%d)",
+ record->data, record->bytes, status);
+ break;
- case gcvDB_SIGNAL:
+ case gcvDB_SIGNAL:
#if USE_NEW_LINUX_SIGNAL
- status = gcvSTATUS_NOT_SUPPORTED;
+ status = gcvSTATUS_NOT_SUPPORTED;
#else
- /* Free the user signal. */
- status = gckOS_DestroyUserSignal(Kernel->os,
- gcmPTR2INT32(record->data));
+ /* Free the user signal. */
+ status = gckOS_DestroyUserSignal(Kernel->os,
+ gcmPTR2INT32(record->data));
#endif /* USE_NEW_LINUX_SIGNAL */
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: SIGNAL %d (status=%d)",
- (gctINT)(gctUINTPTR_T)record->data, status);
- break;
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: SIGNAL %d (status=%d)",
+ (gctINT)(gctUINTPTR_T)record->data, status);
+ break;
- case gcvDB_VIDEO_MEMORY_LOCKED:
- handle = gcmPTR2INT32(record->data);
+ case gcvDB_VIDEO_MEMORY_LOCKED:
+ handle = gcmPTR2INT32(record->data);
- gcmkERR_BREAK(gckVIDMEM_HANDLE_Lookup(record->kernel,
- ProcessID,
- handle,
- &nodeObject));
+ gcmkERR_BREAK(gckVIDMEM_HANDLE_Lookup(record->kernel,
+ ProcessID,
+ handle,
+ &nodeObject));
- /* Unlock what we still locked */
- status = gckVIDMEM_Unlock(record->kernel,
- nodeObject,
- nodeObject->type,
- &asynchronous);
+ /* Unlock what we still locked */
+ status = gckVIDMEM_Unlock(record->kernel,
+ nodeObject,
+ nodeObject->type,
+ &asynchronous);
#if gcdENABLE_VG
- if (record->kernel->core == gcvCORE_VG)
- {
- if (gcmIS_SUCCESS(status) && (gcvTRUE == asynchronous))
+ if (record->kernel->core == gcvCORE_VG)
{
- status = gckVIDMEM_Unlock(record->kernel,
- nodeObject,
- nodeObject->type,
- gcvNULL);
- }
-
- gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
- ProcessID,
- handle));
+ if (gcmIS_SUCCESS(status) && (gcvTRUE == asynchronous))
+ {
+ status = gckVIDMEM_Unlock(record->kernel,
+ nodeObject,
+ nodeObject->type,
+ gcvNULL);
+ }
+
+ gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
+ ProcessID,
+ handle));
- gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
- nodeObject));
- }
- else
-#endif
- {
- gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
- ProcessID,
- handle));
-
- if (gcmIS_SUCCESS(status) && (gcvTRUE == asynchronous))
- {
- status = gckEVENT_Unlock(record->kernel->eventObj,
- gcvKERNEL_PIXEL,
- nodeObject,
- nodeObject->type);
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
+ nodeObject));
}
else
+#endif
{
- gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
- nodeObject));
+ gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
+ ProcessID,
+ handle));
+
+ if (gcmIS_SUCCESS(status) && (gcvTRUE == asynchronous))
+ {
+ status = gckEVENT_Unlock(record->kernel->eventObj,
+ gcvKERNEL_PIXEL,
+ nodeObject,
+ nodeObject->type);
+ }
+ else
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
+ nodeObject));
+ }
}
- }
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: VIDEO_MEMORY_LOCKED 0x%x (status=%d)",
- record->data, status);
- break;
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: VIDEO_MEMORY_LOCKED 0x%x (status=%d)",
+ record->data, status);
+ break;
- case gcvDB_CONTEXT:
- status = gckCOMMAND_Detach(record->kernel->command, gcmNAME_TO_PTR(record->data));
- gcmRELEASE_NAME(record->data);
+ case gcvDB_CONTEXT:
+ status = gckCOMMAND_Detach(record->kernel->command, gcmNAME_TO_PTR(record->data));
+ gcmRELEASE_NAME(record->data);
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: CONTEXT 0x%x (status=%d)",
- record->data, status);
- break;
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: CONTEXT 0x%x (status=%d)",
+ record->data, status);
+ break;
- case gcvDB_MAP_MEMORY:
- /* Unmap memory. */
- status = gckKERNEL_UnmapMemory(record->kernel,
- record->physical,
- record->bytes,
- record->data,
- ProcessID);
-
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: MAP MEMORY %d (status=%d)",
- gcmPTR2INT32(record->data), status);
- break;
+ case gcvDB_MAP_MEMORY:
+ /* Unmap memory. */
+ status = gckKERNEL_UnmapMemory(record->kernel,
+ record->physical,
+ record->bytes,
+ record->data,
+ ProcessID);
+
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: MAP MEMORY %d (status=%d)",
+ gcmPTR2INT32(record->data), status);
+ break;
- case gcvDB_MAP_USER_MEMORY:
- status = gckOS_UnmapUserMemory(Kernel->os,
- Kernel->core,
- record->physical,
- record->bytes,
- gcmNAME_TO_PTR(record->data),
- 0);
- gcmRELEASE_NAME(record->data);
-
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: MAP USER MEMORY %d (status=%d)",
- gcmPTR2INT32(record->data), status);
- break;
+ case gcvDB_MAP_USER_MEMORY:
+ status = gckOS_UnmapUserMemory(Kernel->os,
+ Kernel->core,
+ record->physical,
+ record->bytes,
+ gcmNAME_TO_PTR(record->data),
+ 0);
+ gcmRELEASE_NAME(record->data);
+
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: MAP USER MEMORY %d (status=%d)",
+ gcmPTR2INT32(record->data), status);
+ break;
- case gcvDB_SHBUF:
- /* Free shared buffer. */
- status = gckKERNEL_DestroyShBuffer(record->kernel,
- (gctSHBUF) record->data);
+ case gcvDB_SHBUF:
+ /* Free shared buffer. */
+ status = gckKERNEL_DestroyShBuffer(record->kernel,
+ (gctSHBUF) record->data);
- gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
- "DB: SHBUF %u (status=%d)",
- (gctUINT32)(gctUINTPTR_T) record->data, status);
- break;
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "DB: SHBUF %u (status=%d)",
+ (gctUINT32)(gctUINTPTR_T) record->data, status);
+ break;
+
+ default:
+ gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DATABASE,
+ "DB: Correcupted record=0x%08x type=%d",
+ record, record->type);
+ break;
+ }
+
+ /* Delete the record. */
+ gcmkONERROR(gckKERNEL_DeleteRecord(Kernel,
+ database,
+ record->type,
+ record->data,
+ gcvNULL));
+ }
+ }
+
+ /* Acquire the database mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+ acquired = gcvTRUE;
- default:
- gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DATABASE,
- "DB: Correcupted record=0x%08x type=%d",
- record, record->type);
+ /* Walk the hash list. */
+ for (db = Kernel->db->db[slot];
+ db != gcvNULL;
+ db = db->next)
+ {
+ if (db->processID == ProcessID)
+ {
break;
}
+ previous = db;
+ }
- /* Delete the record. */
- gcmkONERROR(gckKERNEL_DeleteRecord(Kernel,
- database,
- record->type,
- record->data,
- gcvNULL));
+ if (db != database || !db->deleted)
+ {
+ gcmkFATAL("%s(%d): DB of Process=0x%x corrupted after found in deletion\n",
+ __FUNCTION__, __LINE__, ProcessID);
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
+ /* Remove the database from the hash list. */
+ if (previous)
+ {
+ previous->next = database->next;
+ }
+ else
+ {
+ Kernel->db->db[slot] = database->next;
}
- /* Delete the database. */
- gcmkONERROR(gckKERNEL_DeleteDatabase(Kernel, database));
+ /* Deinit current database. */
+ gcmkVERIFY_OK(gckKERNEL_DeinitDatabase(Kernel, database));
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
+ if (Kernel->db->lastDatabase)
+ {
+ /* Insert last database to the free list. */
+ Kernel->db->lastDatabase->next = Kernel->db->freeDatabase;
+ Kernel->db->freeDatabase = Kernel->db->lastDatabase;
+ }
+
+ /* Update last database to current one. */
+ Kernel->db->lastDatabase = database;
OnError:
+OnExit:
+ if (acquired)
+ {
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+ }
/* Return the status. */
gcmkFOOTER();
return status;
@@ -1581,9 +1579,7 @@ gckKERNEL_QueryProcessDB(
Type &= gcdDATABASE_TYPE_MASK;
/* Find the database. */
- gcmkONERROR(
- gckKERNEL_FindDatabase(Kernel, ProcessID, LastProcessID, &database));
-
+ gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, LastProcessID, &database));
gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, database->counterMutex, gcvINFINITE));
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
index 9c556c47f4fe..c5f067a8db31 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
@@ -1459,56 +1459,6 @@ OnError:
return status;
}
-/*******************************************************************************
-**
-** gckEVENT_CommitDone
-**
-** Schedule an event to wake up work thread when commit is done by GPU.
-**
-** INPUT:
-**
-** gckEVENT Event
-** Pointer to an gckEVENT object.
-**
-** gceKERNEL_WHERE FromWhere
-** Place in the pipe where the event needs to be generated.
-**
-** OUTPUT:
-**
-** Nothing.
-*/
-gceSTATUS
-gckEVENT_CommitDone(
- IN gckEVENT Event,
- IN gceKERNEL_WHERE FromWhere,
- IN gckCONTEXT Context
- )
-{
- gceSTATUS status;
- gcsHAL_INTERFACE iface;
-
- gcmkHEADER_ARG("Event=0x%x FromWhere=%d", Event, FromWhere);
-
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
-
- iface.command = gcvHAL_COMMIT_DONE;
-
- iface.u.CommitDone.context = gcmPTR_TO_UINT64(Context);
-
- /* Append it to the queue. */
- gcmkONERROR(gckEVENT_AddList(Event, &iface, FromWhere, gcvFALSE, gcvTRUE));
-
- /* Success. */
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-
-OnError:
- /* Return the status. */
- gcmkFOOTER();
- return status;
-}
-
#if gcdPROCESS_ADDRESS_SPACE
gceSTATUS
gckEVENT_DestroyMmu(
@@ -1949,6 +1899,10 @@ OnError:
** gcsQUEUE_PTR Queue
** User event queue.
**
+** gctBOOL Forced
+** Force fire a event. There won't be interrupt if there's no events
+ queued. Force a event by append a dummy one if this parameter is on.
+**
** OUTPUT:
**
** Nothing.
@@ -1956,7 +1910,8 @@ OnError:
gceSTATUS
gckEVENT_Commit(
IN gckEVENT Event,
- IN gcsQUEUE_PTR Queue
+ IN gcsQUEUE_PTR Queue,
+ IN gctBOOL Forced
)
{
gceSTATUS status;
@@ -2025,6 +1980,14 @@ gckEVENT_Commit(
Queue = next;
}
+ if (Forced && Event->queueHead == gcvNULL)
+ {
+ gcsHAL_INTERFACE iface;
+ iface.command = gcvHAL_COMMIT_DONE;
+
+ gcmkONERROR(gckEVENT_AddList(Event, &iface, gcvKERNEL_PIXEL, gcvFALSE, gcvTRUE));
+ }
+
/* Submit the event list. */
gcmkONERROR(gckEVENT_Submit(Event, gcvTRUE, gcvFALSE));
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
index 6aa793643298..149cced61430 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
@@ -105,13 +105,13 @@ gcsSharedPageTable;
static gcsSharedPageTable_PTR sharedPageTable = gcvNULL;
#endif
-typedef struct _gcsDynamicSpaceNode * gcsDynamicSpaceNode_PTR;
-typedef struct _gcsDynamicSpaceNode
+typedef struct _gcsFreeSpaceNode * gcsFreeSpaceNode_PTR;
+typedef struct _gcsFreeSpaceNode
{
gctUINT32 start;
gctINT32 entries;
}
-gcsDynamicSpaceNode;
+gcsFreeSpaceNode;
#if gcdENDIAN_BIG
@@ -468,6 +468,140 @@ OnError:
return status;
}
+static gceSTATUS
+_CollectFreeSpace(
+ IN gckMMU Mmu,
+ OUT gcsFreeSpaceNode_PTR *Array,
+ OUT gctINT * Size
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctPOINTER pointer = gcvNULL;
+ gcsFreeSpaceNode_PTR array = gcvNULL;
+ gcsFreeSpaceNode_PTR node = gcvNULL;
+ gctINT size = 0;
+ gctINT i = 0;
+
+ for (i = 0; i < gcdMMU_MTLB_ENTRY_NUM; i++)
+ {
+ if (!Mmu->mtlbLogical[i])
+ {
+ if (!node)
+ {
+ /* This is the first entry of the free space. */
+ node += 1;
+ size++;
+
+ }
+ }
+ else if (node)
+ {
+ /* Reset the start. */
+ node = gcvNULL;
+ }
+ }
+
+ /* Allocate memory for the array. */
+ gcmkONERROR(gckOS_Allocate(Mmu->os,
+ gcmSIZEOF(*array) * size,
+ &pointer));
+
+ array = (gcsFreeSpaceNode_PTR)pointer;
+ node = gcvNULL;
+
+ for (i = 0, size = 0; i < gcdMMU_MTLB_ENTRY_NUM; i++)
+ {
+ if (!Mmu->mtlbLogical[i])
+ {
+ if (!node)
+ {
+ /* This is the first entry of the free space. */
+ node = &array[size++];
+
+ node->start = i;
+ node->entries = 0;
+ }
+
+ node->entries++;
+ }
+ else if (node)
+ {
+ /* Reset the start. */
+ node = gcvNULL;
+ }
+ }
+
+#if gcdMMU_TABLE_DUMP
+ for (i = 0; i < size; i++)
+ {
+ gckOS_Print("%s(%d): [%d]: start=%d, entries=%d.\n",
+ __FUNCTION__, __LINE__,
+ i,
+ array[i].start,
+ array[i].entries);
+ }
+#endif
+
+ *Array = array;
+ *Size = size;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (pointer != gcvNULL)
+ {
+ gckOS_Free(Mmu->os, pointer);
+ }
+
+ return status;
+}
+
+gceSTATUS
+_GetMtlbFreeSpace(
+ IN gckMMU Mmu,
+ IN gctUINT32 NumEntries,
+ OUT gctUINT32 *MtlbStart,
+ OUT gctUINT32 *MtlbEnd
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsFreeSpaceNode_PTR nodeArray = gcvNULL;
+ gctINT i, nodeArraySize = 0;
+ gctINT numEntries = gcdMMU_MTLB_ENTRY_NUM;
+ gctINT32 mStart = -1;
+ gctINT32 mEnd = -1;
+
+ gcmkONERROR(_CollectFreeSpace(Mmu, &nodeArray, &nodeArraySize));
+
+ /* Find the smallest space for NumEntries */
+ for (i = 0; i < nodeArraySize; i++)
+ {
+ if (nodeArray[i].entries < numEntries && NumEntries <= (gctUINT32)nodeArray[i].entries)
+ {
+ numEntries = nodeArray[i].entries;
+
+ mStart = nodeArray[i].start;
+ mEnd = nodeArray[i].start + NumEntries - 1;
+ }
+ }
+
+ if (mStart == -1 && mEnd == -1)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ *MtlbStart = (gctUINT32)mStart;
+ *MtlbEnd = (gctUINT32)mEnd;
+
+OnError:
+ if (nodeArray)
+ {
+ gckOS_Free(Mmu->os, (gctPOINTER)nodeArray);
+ }
+
+ return status;
+}
+
#if gcdPROCESS_ADDRESS_SPACE
gctUINT32
_StlbOffset(
@@ -557,22 +691,23 @@ OnError:
static gceSTATUS
_FillFlatMapping(
IN gckMMU Mmu,
- IN gctUINT32 PhysBase,
- OUT gctSIZE_T Size
+ IN gctUINT64 PhysBase,
+ OUT gctSIZE_T Size,
+ OUT gctUINT32 *GpuBaseAddress
)
{
gceSTATUS status;
gctUINT32 mtlb;
+ gctUINT32 physBase;
gcsADDRESS_AREA_PTR area = &Mmu->area[0];
/************************ look up existing flat mapping ranges. ****************/
- gctUINT64 flatBase = (gctUINT64)PhysBase;
+ gctUINT64 flatBase = PhysBase;
gctUINT32 flatSize = (gctUINT32)Size;
gctUINT64 base = flatBase;
gctUINT32 size = flatSize;
gctUINT64 end = base + size;
gctUINT32 i;
- end = gcmMIN(end, 0x100000000ull);
for (i = 0; i < Mmu->flatMappingRangeCount; i++)
{
@@ -585,13 +720,8 @@ _FillFlatMapping(
{
base = gcmMAX(base, Mmu->flatMappingRanges[i].end);
- flatBase = (gctUINT32) base;
+ flatBase = base;
flatSize = (gctUINT32) (end - base);
-
- if (base > 0xFFFFFFFF)
- {
- flatSize = 0;
- }
}
else
{
@@ -601,6 +731,11 @@ _FillFlatMapping(
if (flatSize == 0)
{
+ if (GpuBaseAddress)
+ {
+ *GpuBaseAddress = (gctUINT32) PhysBase;
+ }
+
return gcvSTATUS_OK;
}
}
@@ -612,10 +747,11 @@ _FillFlatMapping(
gcmkASSERT(Mmu->flatMappingRangeCount <= gcdMAX_FLAT_MAPPING_COUNT);
/* overwrite the orignal parameters */
- PhysBase = (gctUINT32)flatBase;
+ PhysBase = flatBase;
+ physBase = (gctUINT32)flatBase;
Size = (gctSIZE_T)flatSize;
- mtlb = _MtlbOffset(PhysBase);
+ mtlb = _MtlbOffset(physBase);
/************************ Setup flat mapping in dynamic range. ****************/
@@ -625,7 +761,7 @@ _FillFlatMapping(
gctUINT32_PTR stlbEntry;
gctUINT i;
- stlbEntry = _StlbEntry(area, PhysBase);
+ stlbEntry = _StlbEntry(area, physBase);
/* Must be aligned to page. */
gcmkASSERT((Size & 0xFFF) == 0);
@@ -633,13 +769,13 @@ _FillFlatMapping(
for (i = 0; i < (Size / 4096); i++)
{
/* Flat mapping in page table. */
- _WritePageEntry(stlbEntry, _SetPage(PhysBase + i * 4096, 0, gcvTRUE));
+ _WritePageEntry(stlbEntry, _SetPage(physBase + i * 4096, 0, gcvTRUE));
}
gcmkSAFECASTSIZET(size, Size);
/* Flat mapping in map. */
- _FillFlatMappingInMap(area, _AddressToIndex(area, PhysBase), size / 4096);
+ _FillFlatMappingInMap(area, _AddressToIndex(area, physBase), size / 4096);
return gcvSTATUS_OK;
}
@@ -647,8 +783,9 @@ _FillFlatMapping(
/************************ Setup flat mapping in non dynamic range. **************/
{
gctBOOL mutex = gcvFALSE;
- gctUINT32 start = PhysBase & ~gcdMMU_PAGE_64K_MASK;
- gctUINT32 end = (gctUINT32) (PhysBase + Size - 1) & ~gcdMMU_PAGE_64K_MASK;
+ gctUINT32 physBaseExt = (gctUINT32) (PhysBase >> 32);
+ gctUINT32 start = physBase & ~gcdMMU_PAGE_64K_MASK;
+ gctUINT32 end = (gctUINT32) (physBase + Size - 1) & ~gcdMMU_PAGE_64K_MASK;
gctUINT32 mStart = start >> gcdMMU_MTLB_SHIFT;
gctUINT32 mEnd = end >> gcdMMU_MTLB_SHIFT;
gctUINT32 sStart = (start & gcdMMU_STLB_64K_MASK) >> gcdMMU_STLB_64K_SHIFT;
@@ -658,14 +795,38 @@ _FillFlatMapping(
gctUINT32 stlbIndex = 0;
gctUINT32 totalNewStlbs = 0;
gctINT32 firstMtlbEntry = -1;
- gctUINT32 mtlbCurEntry = mStart;
+ gctUINT32 mtlbCurEntry;
gcsMMU_STLB_CHUNK_PTR curStlbChunk = gcvNULL;
gctUINT32 seqs[2] = {0, 0};
gctUINT32 seqIdx = 0;
+
/* Grab the mutex. */
gcmkONERROR(gckOS_AcquireMutex(Mmu->os, Mmu->pageTableMutex, gcvINFINITE));
mutex = gcvTRUE;
+ if (PhysBase + Size - 1 > 0xffffffff)
+ {
+ gctUINT32 mEntries;
+ gctUINT32 sEntries;
+
+ mEntries = (gctUINT32)(Size + (1 << gcdMMU_MTLB_SHIFT) - 1) / (1 << gcdMMU_MTLB_SHIFT);
+
+ gcmkONERROR(_GetMtlbFreeSpace(Mmu, mEntries, &mStart, &mEnd));
+
+ sStart = 0;
+ sEntries = (gctUINT32)(Size + gcdMMU_PAGE_64K_SIZE - 1) / gcdMMU_PAGE_64K_SIZE;
+ sEnd = (sEntries - 1) % gcdMMU_STLB_64K_ENTRY_NUM;
+ }
+
+ if (GpuBaseAddress)
+ {
+ *GpuBaseAddress = (mStart << gcdMMU_MTLB_SHIFT)
+ | (sStart << gcdMMU_STLB_64K_SHIFT)
+ | (physBase & gcdMMU_PAGE_64K_MASK);
+ }
+
+ mtlbCurEntry = mStart;
+
/* find all new stlbs, part of new flat mapping range may already have stlbs*/
while (mtlbCurEntry <= mEnd)
{
@@ -824,13 +985,13 @@ _FillFlatMapping(
gcmkASSERT(0);
}
}
- /* Fill STLB. */
- sStart = (start & gcdMMU_STLB_64K_MASK) >> gcdMMU_STLB_64K_SHIFT;
while (sStart <= last)
{
gcmkASSERT(!(start & gcdMMU_PAGE_64K_MASK));
- _WritePageEntry(stlbLogical + sStart, _SetPage(start, 0, gcvTRUE));
+
+ _WritePageEntry(stlbLogical + sStart, _SetPage(start, physBaseExt, gcvTRUE));
+
#if gcdMMU_TABLE_DUMP
gckOS_Print("%s(%d): insert STLB[%d]: %08x\n",
__FUNCTION__, __LINE__,
@@ -839,10 +1000,15 @@ _FillFlatMapping(
#endif
/* next page. */
start += gcdMMU_PAGE_64K_SIZE;
+ if (start == 0)
+ {
+ physBaseExt++;
+ }
sStart++;
curStlbChunk->pageCount++;
}
+ sStart = 0;
++mStart;
}
@@ -868,9 +1034,9 @@ _FillFlatMapping(
gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
#if gcdENABLE_TRUST_APPLICATION
- if (Mmu->hardware->secureMode == gcvSECURE_IN_TA)
+ if (Mmu->hardware->options.secureMode == gcvSECURE_IN_TA)
{
- gckKERNEL_SecurityMapMemory(Mmu->hardware->kernel, gcvNULL, PhysBase, (gctUINT32)Size/4096, &PhysBase);
+ gckKERNEL_SecurityMapMemory(Mmu->hardware->kernel, gcvNULL, physBase, (gctUINT32)Size/4096, &physBase);
}
#endif
@@ -902,91 +1068,6 @@ OnError:
}
static gceSTATUS
-_FindDynamicSpace(
- IN gckMMU Mmu,
- OUT gcsDynamicSpaceNode_PTR *Array,
- OUT gctINT * Size
- )
-{
- gceSTATUS status = gcvSTATUS_OK;
- gctPOINTER pointer = gcvNULL;
- gcsDynamicSpaceNode_PTR array = gcvNULL;
- gctINT size = 0;
- gctINT i = 0, nodeStart = -1, nodeEntries = 0;
-
- /* Allocate memory for the array. */
- gcmkONERROR(gckOS_Allocate(Mmu->os,
- gcmSIZEOF(*array) * (gcdMMU_MTLB_ENTRY_NUM / 2),
- &pointer));
-
- array = (gcsDynamicSpaceNode_PTR)pointer;
-
- /* Loop all the entries. */
- while (i < gcdMMU_MTLB_ENTRY_NUM)
- {
- if (!Mmu->mtlbLogical[i])
- {
- if (nodeStart < 0)
- {
- /* This is the first entry of the dynamic space. */
- nodeStart = i;
- nodeEntries = 1;
- }
- else
- {
- /* Other entries of the dynamic space. */
- nodeEntries++;
- }
- }
- else if (nodeStart >= 0)
- {
- /* Save the previous node. */
- array[size].start = nodeStart;
- array[size].entries = nodeEntries;
- size++;
-
- /* Reset the start. */
- nodeStart = -1;
- nodeEntries = 0;
- }
-
- i++;
- }
-
- /* Save the previous node. */
- if (nodeStart >= 0)
- {
- array[size].start = nodeStart;
- array[size].entries = nodeEntries;
- size++;
- }
-
-#if gcdMMU_TABLE_DUMP
- for (i = 0; i < size; i++)
- {
- gckOS_Print("%s(%d): [%d]: start=%d, entries=%d.\n",
- __FUNCTION__, __LINE__,
- i,
- array[i].start,
- array[i].entries);
- }
-#endif
-
- *Array = array;
- *Size = size;
-
- return gcvSTATUS_OK;
-
-OnError:
- if (pointer != gcvNULL)
- {
- gckOS_Free(Mmu->os, pointer);
- }
-
- return status;
-}
-
-static gceSTATUS
_SetupAddressArea(
IN gckOS Os,
IN gcsADDRESS_AREA_PTR Area,
@@ -1024,7 +1105,7 @@ _SetupDynamicSpace(
)
{
gceSTATUS status;
- gcsDynamicSpaceNode_PTR nodeArray = gcvNULL;
+ gcsFreeSpaceNode_PTR nodeArray = gcvNULL;
gctINT i, nodeArraySize = 0;
gctPHYS_ADDR_T physical;
gctUINT32 address;
@@ -1035,8 +1116,8 @@ _SetupDynamicSpace(
gcsADDRESS_AREA_PTR areaSecure = &Mmu->area[gcvADDRESS_AREA_SECURE];
gctUINT32 secureAreaSize = 0;
- /* Find all the dynamic address space. */
- gcmkONERROR(_FindDynamicSpace(Mmu, &nodeArray, &nodeArraySize));
+ /* Find all the free address space. */
+ gcmkONERROR(_CollectFreeSpace(Mmu, &nodeArray, &nodeArraySize));
for (i = 0; i < nodeArraySize; i++)
{
@@ -1225,6 +1306,8 @@ _Construct(
gctUINT32 physSize;
gctUINT32 contiguousBase;
gctUINT32 contiguousSize = 0;
+ gctUINT32 externalBase;
+ gctUINT32 externalSize = 0;
gctUINT32 gpuAddress;
gctPHYS_ADDR_T gpuPhysical;
gcsADDRESS_AREA_PTR area = gcvNULL;
@@ -1301,6 +1384,19 @@ _Construct(
map[1] = ~0U;
area->heapList = 0;
area->freeNodes = gcvFALSE;
+
+ status = gckOS_QueryOption(mmu->os, "contiguousBase", &contiguousBase);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckOS_QueryOption(mmu->os, "contiguousSize", &contiguousSize);
+ }
+
+ if (gcmIS_SUCCESS(status) && contiguousSize)
+ {
+ mmu->contiguousBaseAddress = contiguousBase - Kernel->hardware->baseAddress;
+ }
+
}
else
{
@@ -1365,9 +1461,25 @@ _Construct(
if (physSize)
{
/* Setup user specified flat mapping. */
- gcmkONERROR(_FillFlatMapping(mmu, gpuAddress, physSize));
+ gcmkONERROR(_FillFlatMapping(mmu, gpuAddress, physSize, gcvNULL));
}
+#ifndef EMULATOR
+ if (!_ReadPageEntry(mmu->mtlbLogical + 0))
+ {
+ gctUINT32 mtlbEntry;
+ /*
+ * Reserved 0~4MB space.
+ * 64KB page size, Ingore exception, Not Present.
+ */
+ mtlbEntry = (1 << 2)
+ | (0 << 1)
+ | (0 << 0);
+
+ _WritePageEntry(mmu->mtlbLogical + 0, mtlbEntry);
+ }
+#endif
+
status = gckOS_QueryOption(mmu->os, "contiguousBase", &contiguousBase);
if (gcmIS_SUCCESS(status))
@@ -1377,8 +1489,35 @@ _Construct(
if (gcmIS_SUCCESS(status) && contiguousSize)
{
+ gctUINT64 gpuContiguousBase;
+ gctUINT32 contiguousBaseAddress;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(mmu->os, contiguousBase, &gpuContiguousBase));
+
/* Setup flat mapping for reserved memory (VIDMEM). */
- gcmkONERROR(_FillFlatMapping(mmu, contiguousBase, contiguousSize));
+ gcmkONERROR(_FillFlatMapping(mmu, gpuContiguousBase, contiguousSize, &contiguousBaseAddress));
+
+ mmu->contiguousBaseAddress = contiguousBaseAddress;
+ }
+
+ status = gckOS_QueryOption(mmu->os, "externalBase", &externalBase);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckOS_QueryOption(mmu->os, "externalSize", &externalSize);
+ }
+
+ if (gcmIS_SUCCESS(status) && externalSize)
+ {
+ gctUINT64 gpuExternalBase;
+ gctUINT32 externalBaseAddress;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(mmu->os, externalBase, &gpuExternalBase));
+
+ /* Setup flat mapping for external memory. */
+ gcmkONERROR(_FillFlatMapping(mmu, gpuExternalBase, externalSize, &externalBaseAddress));
+
+ mmu->externalBaseAddress = externalBaseAddress;
}
gcmkONERROR(_SetupDynamicSpace(mmu));
@@ -2119,7 +2258,7 @@ _FreePages(
acquired = gcvFALSE;
#if gcdENABLE_TRUST_APPLICATION
- if (Mmu->hardware->secureMode == gcvSECURE_IN_TA)
+ if (Mmu->hardware->options.secureMode == gcvSECURE_IN_TA)
{
gckKERNEL_SecurityUnmapMemory(Mmu->hardware->kernel, Address, (gctUINT32)PageCount);
}
@@ -2323,7 +2462,7 @@ gckMMU_FlatMapping(
_WritePageEntry(pageTable, _SetPage(Physical + i * 4096, 0));
}
- gcmkONERROR(_FillFlatMappingInMap(Mmu, index, NumPages));
+ gcmkONERROR(_FillFlatMapping(Mmu, PhysBase, Size, gcvNULL));
return gcvSTATUS_OK;
@@ -2671,7 +2810,7 @@ gckMMU_FillFlatMapping(
if (hardware->mmuVersion)
{
- gcmkONERROR(_FillFlatMapping(Mmu, PhysBase, Size));
+ gcmkONERROR(_FillFlatMapping(Mmu, PhysBase, Size, gcvNULL));
}
return gcvSTATUS_OK;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
index c6423d1e3bad..167e65d37a85 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
@@ -305,6 +305,7 @@ gceSTATUS gckVGKERNEL_Dispatch(
&kernelInterface->u.QueryChipIdentity.chipRevision,
&kernelInterface->u.QueryChipIdentity.productID,
&kernelInterface->u.QueryChipIdentity.ecoID,
+ &kernelInterface->u.QueryChipIdentity.customerID,
&kernelInterface->u.QueryChipIdentity.chipFeatures,
&kernelInterface->u.QueryChipIdentity.chipMinorFeatures,
&kernelInterface->u.QueryChipIdentity.chipMinorFeatures2
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
index 2826a0a5ab35..18620175fe87 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
@@ -422,6 +422,7 @@ gckVIDMEM_Construct(
/* Allocate the gckVIDMEM object. */
gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(struct _gckVIDMEM), &pointer));
+ gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckVIDMEM));
memory = pointer;
@@ -1532,9 +1533,8 @@ gckVIDMEM_Lock(
#if !gcdPROCESS_ADDRESS_SPACE
gctBOOL needMapping = gcvFALSE;
#endif
- gctUINT64 physicalAddress;
+ gctUINT64 physicalAddress = ~0ULL;
gcuVIDMEM_NODE_PTR node = Node->node;
- gctPHYS_ADDR_T physical;
gctSIZE_T pageSize;
gctUINT32 pageMask;
@@ -1574,35 +1574,20 @@ gckVIDMEM_Lock(
/* Increment the lock count. */
node->VidMem.locked ++;
- /* Return the physical address of the node. */
gcmkSAFECASTSIZET(offset, node->VidMem.offset);
+ physicalAddress = node->VidMem.memory->baseAddress
+ + offset
+ + node->VidMem.alignment;
- *Address = node->VidMem.memory->baseAddress
- + offset
- + node->VidMem.alignment;
-
- physicalAddress = *Address;
-
- /* Get hardware specific address. */
-#if gcdENABLE_VG
- if (Kernel->vg == gcvNULL)
-#endif
+ if (node->VidMem.pool == gcvPOOL_LOCAL_EXTERNAL)
{
- if (Kernel->hardware->mmuVersion == 0)
- {
- /* Convert physical to GPU address for old mmu. */
- gcmkASSERT(*Address > Kernel->hardware->baseAddress);
- *Address -= Kernel->hardware->baseAddress;
- }
+ *Address = Kernel->externalBaseAddress + offset;
+ }
+ else
+ {
+ gcmkASSERT(node->VidMem.pool == gcvPOOL_SYSTEM);
+ *Address = Kernel->contiguousBaseAddress + offset;
}
-
- gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
- Kernel->os,
- *Address,
- &physical
- ));
-
- gcmkSAFECASTSIZET(*Address, physical);
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
"Locked node 0x%x (%d) @ 0x%08X",
@@ -1726,9 +1711,9 @@ gckVIDMEM_Lock(
{
#if gcdENABLE_TRUST_APPLICATION
#if gcdENABLE_VG
- if (Kernel->core != gcvCORE_VG && Kernel->hardware->secureMode == gcvSECURE_IN_TA)
+ if (Kernel->core != gcvCORE_VG && Kernel->hardware->options.secureMode == gcvSECURE_IN_TA)
#else
- if (Kernel->hardware->secureMode == gcvSECURE_IN_TA)
+ if (Kernel->hardware->options.secureMode == gcvSECURE_IN_TA)
#endif
{
gcmkONERROR(gckKERNEL_MapInTrustApplicaiton(
@@ -2633,6 +2618,7 @@ gckVIDMEM_NODE_Allocate(
node = pointer;
node->node = VideoNode;
+ node->kernel = Kernel;
node->type = Type;
node->pool = Pool;
@@ -2745,6 +2731,266 @@ gckVIDMEM_NODE_Dereference(
return gcvSTATUS_OK;
}
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+
+/*******************************************************************************
+**
+**
+** Code for dma_buf ops
+**
+**
+*******************************************************************************/
+
+#include <linux/slab.h>
+#include <linux/mm_types.h>
+#include <linux/dma-buf.h>
+
+static struct sg_table *_dmabuf_map(struct dma_buf_attachment *attachment,
+ enum dma_data_direction direction)
+{
+ struct sg_table *sgt = gcvNULL;
+ struct dma_buf *dmabuf = attachment->dmabuf;
+ gckVIDMEM_NODE nodeObject = dmabuf->priv;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ do
+ {
+ gcuVIDMEM_NODE_PTR node = nodeObject->node;
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T offset = 0;
+ gctSIZE_T bytes = 0;
+
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.memory->physical;
+ offset = node->VidMem.offset;
+ bytes = node->VidMem.bytes;
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ offset = 0;
+ bytes = node->Virtual.bytes;
+ }
+
+ gcmkERR_BREAK(gckOS_MemoryGetSGT(nodeObject->kernel->os, physical, offset, bytes, (gctPOINTER*)&sgt));
+
+ if (dma_map_sg(attachment->dev, sgt->sgl, sgt->nents, direction) == 0)
+ {
+ sg_free_table(sgt);
+ kfree(sgt);
+ sgt = gcvNULL;
+ gcmkERR_BREAK(gcvSTATUS_GENERIC_IO);
+ }
+ }
+ while (gcvFALSE);
+
+ return sgt;
+}
+
+static void _dmabuf_unmap(struct dma_buf_attachment *attachment,
+ struct sg_table *sgt,
+ enum dma_data_direction direction)
+{
+ dma_unmap_sg(attachment->dev, sgt->sgl, sgt->nents, direction);
+
+ sg_free_table(sgt);
+ kfree(sgt);
+}
+
+static int _dmabuf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
+{
+ gckVIDMEM_NODE nodeObject = dmabuf->priv;
+ gcuVIDMEM_NODE_PTR node = nodeObject->node;
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T skipPages = vma->vm_pgoff;
+ gctSIZE_T numPages = PAGE_ALIGN(vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.memory->physical;
+ skipPages += (node->VidMem.offset >> PAGE_SHIFT);
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ }
+
+ gcmkONERROR(gckOS_MemoryMmap(nodeObject->kernel->os, physical, skipPages, numPages, vma));
+
+OnError:
+ return gcmIS_ERROR(status) ? -EINVAL : 0;
+}
+
+static void _dmabuf_release(struct dma_buf *dmabuf)
+{
+ gckVIDMEM_NODE nodeObject = dmabuf->priv;
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Reference(nodeObject->kernel, nodeObject));
+}
+
+static void *_dmabuf_kmap(struct dma_buf *dmabuf, unsigned long offset)
+{
+ gckVIDMEM_NODE nodeObject = dmabuf->priv;
+ gcuVIDMEM_NODE_PTR node = nodeObject->node;
+ gctINT8_PTR kvaddr = gcvNULL;
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T bytes = 0;
+ gctSIZE_T pageCount = 0;
+
+ offset = (offset << PAGE_SHIFT);
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.memory->physical;
+ offset += node->VidMem.offset;
+ bytes = node->VidMem.bytes;
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ bytes = node->Virtual.bytes;
+ }
+
+ if (gcmIS_SUCCESS(gckOS_CreateKernelVirtualMapping(
+ nodeObject->kernel->os, physical, bytes, (gctPOINTER*)&kvaddr, &pageCount)))
+ {
+ kvaddr += offset;
+ }
+
+ return (gctPOINTER)kvaddr;
+}
+
+static void _dmabuf_kunmap(struct dma_buf *dmabuf, unsigned long offset, void *ptr)
+{
+ gckVIDMEM_NODE nodeObject = dmabuf->priv;
+ gcuVIDMEM_NODE_PTR node = nodeObject->node;
+ gctINT8_PTR kvaddr = (gctINT8_PTR)ptr - (offset << PAGE_SHIFT);
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T bytes = 0;
+
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.memory->physical;
+ kvaddr -= node->VidMem.offset;
+ bytes = node->VidMem.bytes;
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ bytes = node->Virtual.bytes;
+ }
+
+ gcmkVERIFY_OK(gckOS_DestroyKernelVirtualMapping(
+ nodeObject->kernel->os, physical, bytes, (gctPOINTER*)&kvaddr));
+}
+
+static struct dma_buf_ops _dmabuf_ops =
+{
+ .map_dma_buf = _dmabuf_map,
+ .unmap_dma_buf = _dmabuf_unmap,
+ .mmap = _dmabuf_mmap,
+ .release = _dmabuf_release,
+ .kmap_atomic = _dmabuf_kmap,
+ .kunmap_atomic = _dmabuf_kunmap,
+ .kmap = _dmabuf_kmap,
+ .kunmap = _dmabuf_kunmap,
+};
+#endif
+
+gceSTATUS
+gckVIDMEM_NODE_Export(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Handle,
+ IN gctINT32 Flags,
+ OUT gctPOINTER *DmaBuf,
+ OUT gctINT32 *FD
+ )
+{
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+ gceSTATUS status = gcvSTATUS_OK;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctUINT32 processID = 0;
+ struct dma_buf *dmabuf = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p Handle=0x%x", Kernel, Handle);
+
+ gckOS_GetProcessID(&processID);
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(Kernel, processID, Handle, &nodeObject));
+
+ dmabuf = nodeObject->dmabuf;
+ if (!dmabuf)
+ {
+ gctSIZE_T bytes = 0;
+ gctPHYS_ADDR physical = gcvNULL;
+ gcuVIDMEM_NODE_PTR node = nodeObject->node;
+
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.memory->physical;
+ bytes = node->VidMem.bytes;
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ bytes = node->Virtual.bytes;
+ }
+
+ /* Donot really get SGT, just check if the allocator support GetSGT. */
+ gcmkONERROR(gckOS_MemoryGetSGT(Kernel->os, physical, 0, 0, NULL));
+
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+ DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
+ exp_info.ops = &_dmabuf_ops;
+ exp_info.size = bytes;
+ exp_info.flags = Flags;
+ exp_info.priv = nodeObject;
+ dmabuf = dma_buf_export(&exp_info);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ dmabuf = dma_buf_export(nodeObject, &_dmabuf_ops, bytes, Flags, NULL);
+#else
+ dmabuf = dma_buf_export(nodeObject, &_dmabuf_ops, bytes, Flags);
+#endif
+ }
+
+ if (IS_ERR(dmabuf))
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ /* Reference this gckVIDMEM_NODE object. */
+ gckVIDMEM_NODE_Reference(Kernel, nodeObject);
+ nodeObject->dmabuf = dmabuf;
+ }
+
+ if (DmaBuf)
+ {
+ *DmaBuf = nodeObject->dmabuf;
+ }
+
+ if (FD)
+ {
+ gctINT fd = dma_buf_fd(dmabuf, Flags);
+
+ if (fd < 0)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ *FD = fd;
+ }
+
+OnError:
+ gcmkFOOTER_ARG("*DmaBuf=%p *FD=0x%x", gcmOPT_POINTER(DmaBuf), gcmOPT_VALUE(FD));
+ return status;
+#else
+ gcmkFATAL("The kernel did NOT support CONFIG_DMA_SHARED_BUFFER");
+ return gcvSTATUS_NOT_SUPPORTED;
+#endif
+}
+
+
/*******************************************************************************
**
** gckVIDMEM_NODE_Name
@@ -2769,7 +3015,7 @@ gceSTATUS
gckVIDMEM_NODE_Name(
IN gckKERNEL Kernel,
IN gctUINT32 Handle,
- IN gctUINT32 * Name
+ OUT gctUINT32 * Name
)
{
gceSTATUS status;
@@ -2852,7 +3098,7 @@ gceSTATUS
gckVIDMEM_NODE_Import(
IN gckKERNEL Kernel,
IN gctUINT32 Name,
- IN gctUINT32 * Handle
+ OUT gctUINT32 * Handle
)
{
gceSTATUS status;
@@ -2992,54 +3238,101 @@ OnError:
}
gceSTATUS
-gckVIDMEM_ConstructVirtualFromUserMemory(
+gckVIDMEM_NODE_WrapUserMemory(
IN gckKERNEL Kernel,
IN gcsUSER_MEMORY_DESC_PTR Desc,
- OUT gcuVIDMEM_NODE_PTR * Node
+ OUT gctUINT32 * Handle
)
{
- gckOS os;
- gceSTATUS status;
- gcuVIDMEM_NODE_PTR node = gcvNULL;
- gctPOINTER pointer = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+ gctBOOL found = gcvFALSE;
gcmkHEADER_ARG("Kernel=0x%x", Kernel);
/* Verify the arguments. */
gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
- gcmkVERIFY_ARGUMENT(Node != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Desc);
+ gcmkVERIFY_ARGUMENT(Handle);
- /* Extract the gckOS object pointer. */
- os = Kernel->os;
- gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
-
- /* Allocate an gcuVIDMEM_NODE union. */
- gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(gcuVIDMEM_NODE), &pointer));
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+ if (Desc->flag & gcvALLOC_FLAG_DMABUF)
+ {
+ struct dma_buf *dmabuf;
+ int fd = (int)Desc->handle;
- gckOS_ZeroMemory(pointer, gcmSIZEOF(gcuVIDMEM_NODE));
+ if (fd >= 0)
+ {
+ /* Import dma buf handle. */
+ dmabuf = dma_buf_get(fd);
- node = pointer;
+ Desc->handle = -1;
+ Desc->dmabuf = gcmPTR_TO_UINT64(dmabuf);
- /* Initialize gcuVIDMEM_NODE union for virtual memory. */
- node->Virtual.kernel = Kernel;
+ dma_buf_put(dmabuf);
+ }
+ else
+ {
+ dmabuf = gcmUINT64_TO_PTR(Desc->dmabuf);
+ }
- /* Wrap Memory. */
- gcmkONERROR(gckOS_WrapMemory(
- os, Desc, &node->Virtual.bytes, &node->Virtual.physical, &node->Virtual.contiguous));
+ if (dmabuf->ops == &_dmabuf_ops)
+ {
+ gctBOOL referenced = gcvFALSE;
+ gckVIDMEM_NODE nodeObject = dmabuf->priv;
- /* Return pointer to the gcuVIDMEM_NODE union. */
- *Node = node;
+ do
+ {
+ /* Reference the node. */
+ gcmkERR_BREAK(gckVIDMEM_NODE_Reference(Kernel, nodeObject));
+ /* Allocate a handle for current process. */
+ gcmkERR_BREAK(gckVIDMEM_HANDLE_Allocate(Kernel, nodeObject, Handle));
+ found = gcvTRUE;
+ }
+ while (gcvFALSE);
- /* Success. */
- gcmkFOOTER_ARG("*Node=0x%x", *Node);
- return gcvSTATUS_OK;
+ if (gcmIS_ERROR(status) && referenced)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, nodeObject));
+ }
+ }
+ }
+#endif
-OnError:
- /* Roll back. */
- if (node != gcvNULL)
+ if (!found)
{
- /* Free the structure. */
- gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
+ gckOS os = Kernel->os;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ do {
+ /* Allocate an gcuVIDMEM_NODE union. */
+ gcmkERR_BREAK(gckOS_Allocate(os, gcmSIZEOF(gcuVIDMEM_NODE), (gctPOINTER*)&node));
+ gckOS_ZeroMemory(node, gcmSIZEOF(gcuVIDMEM_NODE));
+
+ /* Initialize gcuVIDMEM_NODE union for virtual memory. */
+ node->Virtual.kernel = Kernel;
+
+ /* Wrap Memory. */
+ gcmkERR_BREAK(gckOS_WrapMemory(os, Desc, &node->Virtual.bytes,
+ &node->Virtual.physical, &node->Virtual.contiguous));
+
+ /* Allocate handle for this video memory. */
+ gcmkERR_BREAK(gckVIDMEM_NODE_Allocate(
+ Kernel,
+ node,
+ gcvSURF_BITMAP,
+ gcvPOOL_VIRTUAL,
+ Handle
+ ));
+ }
+ while (gcvFALSE);
+
+ if (gcmIS_ERROR(status) && node)
+ {
+ /* Free the structure. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
+ }
}
/* Return the status. */
@@ -3142,3 +3435,31 @@ gckVIDMEM_FindVIDMEM(
return status;
}
+/* Get the nodes of all banks. */
+gceSTATUS
+gckVIDMEM_QueryNodes(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ OUT gctINT32 *Count,
+ OUT gcuVIDMEM_NODE_PTR *Nodes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckVIDMEM memory = gcvNULL;
+
+ do
+ {
+ status = gckKERNEL_GetVideoMemoryPool(Kernel, Pool, &memory);
+ if (status != gcvSTATUS_OK)
+ break;
+
+ if (memory != gcvNULL)
+ {
+ *Count = gcmCOUNTOF(memory->sentinel);
+ *Nodes = memory->sentinel;
+ }
+ }
+ while (gcvFALSE);
+
+ return status;
+}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h
index 0e929401fffd..b64014be720a 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h
@@ -53,7 +53,7 @@
*****************************************************************************/
-/*Auto created on 2017-07-28 05:38*/
+/*Auto created on 2017-09-29 05:51*/
#ifndef _gc_feature_database_h_
#define _gc_feature_database_h_
@@ -479,6 +479,12 @@ typedef struct
gctUINT32 SEPARATE_LS:1;
gctUINT32 MCFE:1;
gctUINT32 WIDELINE_TRIANGLE_EMU:1;
+ gctUINT32 VG_RESOLUTION_8K:1;
+ gctUINT32 FENCE_32BIT:1;
+ gctUINT32 FENCE_64BIT:1;
+ gctUINT32 NN_INTERLEVE8:1;
+ gctUINT32 TP_REORDER:1;
+ gctUINT32 PE_DEPTH_ONLY_OQFIX:1;
} gcsFEATURE_DATABASE;
static gcsFEATURE_DATABASE gChipInfo[] = {
@@ -903,6 +909,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* dc0000_5560 */
{
@@ -1325,6 +1337,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc200_4650 */
{
@@ -1747,6 +1765,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc200_4621 */
{
@@ -2169,6 +2193,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc300_4650 */
{
@@ -2591,6 +2621,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc300_4650_guoke */
{
@@ -3013,6 +3049,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc300_4_6_6_rc0 */
{
@@ -3435,6 +3477,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320_5007 */
{
@@ -3461,7 +3509,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_VALUE_L1CacheSize */
0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
0x0, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -3857,6 +3905,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320_5220 */
{
@@ -4279,6 +4333,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320_5303 */
{
@@ -4701,6 +4761,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320_5303_1 */
{
@@ -5123,6 +5189,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320_5340 */
{
@@ -5545,6 +5617,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320c_5341 */
{
@@ -5967,6 +6045,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc320_5341 */
{
@@ -6389,6 +6473,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520l_5_3_5_rc0 */
{
@@ -6811,6 +6901,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc355_v121_rc5 */
{
@@ -7233,6 +7329,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc355_v121x */
{
@@ -7655,6 +7757,440 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ },
+ /* gc355_8Kx8K */
+ {
+ 0x355, /* ChipID */
+ 0x1217, /* ChipRevision */
+ 0x3003550, /* ProductID */
+ 0x0, /* EcoID */
+ 0x407, /* CustomerID */
+ 0x0, /* PatchVersion */
+ 0x0, /* FormalRelease */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x1, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x0, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x0, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x1, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x1, /* gcFEATURE_BIT_REG_YUY2Averaging */
+ 0x0, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x0, /* gcFEATURE_BIT_REG_HalfTXCache */
+ 0x0, /* gcFEATURE_BIT_REG_YUY2RenderTarget */
+ 0x1, /* gcFEATURE_BIT_REG_Mem32BitSupport */
+ 0x1, /* gcFEATURE_BIT_REG_PipeVG */
+ 0x1, /* gcFEATURE_BIT_REG_VGTS */
+ 0x1, /* gcFEATURE_BIT_REG_FE20 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x1, /* gcFEATURE_BIT_REG_FlipY */
+ 0x1, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x1, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x1, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x0, /* gcFEATURE_BIT_REG_2DPE20 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable */
+ 0x0, /* gcFEATURE_BIT_REG_Render8K */
+ 0x0, /* gcFEATURE_BIT_REG_TileStatus2Bits */
+ 0x0, /* gcFEATURE_BIT_REG_SeparateTileStatusWhenInterleaved */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiled32x32 */
+ 0x1, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x1, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x0, /* gcFEATURE_BIT_REG_MC20 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_HierarchicalZ */
+ 0x0, /* gcFEATURE_BIT_REG_NewTexture */
+ 0x0, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x0, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x1, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureStride */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes3 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable1 */
+ 0x1, /* gcFEATURE_BIT_REG_AutoRestartTS */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes4 */
+ 0x0, /* gcFEATURE_BIT_REG_L2Windowing */
+ 0x0, /* gcFEATURE_BIT_REG_HalfFloatPipe */
+ 0x0, /* gcFEATURE_BIT_REG_PixelDither */
+ 0x0, /* gcFEATURE_BIT_REG_TwoStencilReference */
+ 0x0, /* gcFEATURE_BIT_REG_ExtendedPixelFormat */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectMinMaxDepth */
+ 0x1, /* gcFEATURE_BIT_REG_DitherAndFilterPlusAlpha2D */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes5 */
+ 0x0, /* gcFEATURE_BIT_REG_New2D */
+ 0x0, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x0, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x0, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x0, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x0, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x0, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x0, /* gcFEATURE_BIT_REG_MMU */
+ 0x0, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x0, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x0, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x0, /* gcFEATURE_BIT_REG_S1S8 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti1 */
+ 0x0, /* gcFEATURE_BIT_REG_RGB888 */
+ 0x0, /* gcFEATURE_BIT_REG_TX_YUVAssembler */
+ 0x0, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x0, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x0, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x0, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x0, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x0, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_HIEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes16 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x0, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x0, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x0, /* gcFEATURE_BIT_REG_Probe */
+ 0x0, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x0, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x0, /* gcFEATURE_BIT_REG_EEZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x0, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x0, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x0, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x0, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x0, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x0, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x0, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x0, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
+ 0x0, /* gcFEATURE_BIT_REG_DEC */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12 */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12_10BIT */
+ 0x0, /* gcFEATURE_BIT_RenderTarget8 */
+ 0x0, /* gcFEATURE_BIT_TxLodFlowCorrection */
+ 0x0, /* gcFEATURE_BIT_FaceLod */
+ 0x0, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x0, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x0, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x0, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* gcFEATURE_BIT_V4Compression */
+ 0x0, /* gcFEATURE_BIT_PE2D_MAJOR_SUPER_TILE */
+ 0x0, /* gcFEATURE_BIT_PE_32BPC_COLORMASK_FIX */
+ 0x0, /* gcFEATURE_BIT_ALPHA_BLENDING_OPT */
+ 0x0, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x0, /* gcFEATURE_BIT_PIPELINE_32_ATTRIBUTES */
+ 0x0, /* gcFEATURE_BIT_MSAA_SHADING */
+ 0x0, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x0, /* gcFEATURE_BIT_NO_ASTC */
+ 0x0, /* gcFEATURE_BIT_NO_DXT */
+ 0x0, /* gcFEATURE_BIT_HWTFB */
+ 0x0, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x0, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_HALFDEPENDENCY_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_MCFILL_FIX */
+ 0x0, /* gcFEATURE_BIT_TPG_TCPERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_MDFIFO_OVERFLOW_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_BARRIER_IN_CS_FIX */
+ 0x0, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x0, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ADVANCED_INSTR */
+ 0x0, /* gcFEATURE_BIT_SH_FLAT_INTERPOLATION_DUAL16_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_CONTINUOUS_FLUS_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_V4 */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_ALPHA_KILL */
+ 0x0, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x0, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x0, /* gcFEATURE_BIT_SUPPORT_MOVAI */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_MAXPAGES_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_RGBA16I_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_8bpp_256TILE_FC_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_64bit_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_FULL_CACHE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_YUV_ASSEMBLER_10BIT */
+ 0x0, /* gcFEATURE_BIT_FE_32bit_INDEX_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_64bpp_MASKED_CLEAR_FIX */
+ 0x0, /* gcFEATURE_BIT_SECURITY */
+ 0x0, /* gcFEATURE_BIT_ROBUSTNESS */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x0, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x1, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LDST_CLAMP */
+ 0x0, /* gcFEATURE_BIT_SH_ICACHE_ALLOC_COUNT_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_VG_DOUBLE_IMAGE */
+ 0x0, /* gcFEATURE_BIT_VG_RECTANGLE_STRIPE_MODE */
+ 0x1, /* gcFEATURE_BIT_VG_MMU */
+ 0x1, /* gcFEATURE_BIT_VG_IM_FILTER */
+ 0x1, /* gcFEATURE_BIT_VG_IM_YUV_PACKET */
+ 0x1, /* gcFEATURE_BIT_VG_IM_YUV_PLANAR */
+ 0x1, /* gcFEATURE_BIT_VG_PE_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_COLOR_PRECISION_8_BIT */
+ 0x0, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_DEFER_FILL_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_CLOCK_GATE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_NEED_DUMMYDRAW */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x0, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x0, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_GPIPE_ACCESS_FULLTEMPS */
+ 0x0, /* gcFEATURE_BIT_PSIO_INTERLOCK */
+ 0x0, /* gcFEATURE_BIT_PA_WIDELINE_FIX */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_HELPER_FIX */
+ 0x0, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x0, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x0, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x0, /* gcFEATURE_BIT_DC_QOS */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x0, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x0, /* gcFEATURE_BIT_MULTICORE_SEMAPHORESTALL_V3 */
+ 0x0, /* gcFEATURE_BIT_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x0, /* gcFEATURE_BIT_SH_IDIV0_SWZL_EHS */
+ 0x0, /* gcFEATURE_BIT_TX_LERP_LESS_BIT */
+ 0x0, /* gcFEATURE_BIT_SH_GM_ENDIAN */
+ 0x0, /* gcFEATURE_BIT_SH_GM_USC_UNALLOC */
+ 0x0, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc400_4633 */
{
@@ -8077,6 +8613,440 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ },
+ /* gc600_4633 */
+ {
+ 0x600, /* ChipID */
+ 0x4633, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ 0x1, /* FormalRelease */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x20, /* gcFEATURE_VALUE_TempRegisters */
+ 0x40, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x1, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x0, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x0, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x1, /* gcFEATURE_BIT_REG_YUY2Averaging */
+ 0x0, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x0, /* gcFEATURE_BIT_REG_HalfTXCache */
+ 0x0, /* gcFEATURE_BIT_REG_YUY2RenderTarget */
+ 0x0, /* gcFEATURE_BIT_REG_Mem32BitSupport */
+ 0x0, /* gcFEATURE_BIT_REG_PipeVG */
+ 0x0, /* gcFEATURE_BIT_REG_VGTS */
+ 0x0, /* gcFEATURE_BIT_REG_FE20 */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x1, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x1, /* gcFEATURE_BIT_REG_FlipY */
+ 0x1, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x1, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x1, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* gcFEATURE_BIT_REG_2DPE20 */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisable */
+ 0x1, /* gcFEATURE_BIT_REG_Render8K */
+ 0x1, /* gcFEATURE_BIT_REG_TileStatus2Bits */
+ 0x1, /* gcFEATURE_BIT_REG_SeparateTileStatusWhenInterleaved */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiled32x32 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x1, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x1, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x0, /* gcFEATURE_BIT_REG_MC20 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_HierarchicalZ */
+ 0x0, /* gcFEATURE_BIT_REG_NewTexture */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x1, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureStride */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes3 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable1 */
+ 0x0, /* gcFEATURE_BIT_REG_AutoRestartTS */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes4 */
+ 0x0, /* gcFEATURE_BIT_REG_L2Windowing */
+ 0x0, /* gcFEATURE_BIT_REG_HalfFloatPipe */
+ 0x1, /* gcFEATURE_BIT_REG_PixelDither */
+ 0x1, /* gcFEATURE_BIT_REG_TwoStencilReference */
+ 0x0, /* gcFEATURE_BIT_REG_ExtendedPixelFormat */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectMinMaxDepth */
+ 0x1, /* gcFEATURE_BIT_REG_DitherAndFilterPlusAlpha2D */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes5 */
+ 0x0, /* gcFEATURE_BIT_REG_New2D */
+ 0x0, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x0, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x0, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x0, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x1, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x1, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x0, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x0, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x0, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x0, /* gcFEATURE_BIT_REG_S1S8 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti1 */
+ 0x0, /* gcFEATURE_BIT_REG_RGB888 */
+ 0x0, /* gcFEATURE_BIT_REG_TX_YUVAssembler */
+ 0x0, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x0, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x0, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x0, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x0, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x0, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x0, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_HIEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes16 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x0, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x0, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x0, /* gcFEATURE_BIT_REG_Probe */
+ 0x0, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x0, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x0, /* gcFEATURE_BIT_REG_EEZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x0, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x0, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x0, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x0, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x0, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x0, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x0, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x0, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
+ 0x0, /* gcFEATURE_BIT_REG_DEC */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12 */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12_10BIT */
+ 0x0, /* gcFEATURE_BIT_RenderTarget8 */
+ 0x0, /* gcFEATURE_BIT_TxLodFlowCorrection */
+ 0x0, /* gcFEATURE_BIT_FaceLod */
+ 0x0, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x0, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x0, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x0, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* gcFEATURE_BIT_V4Compression */
+ 0x0, /* gcFEATURE_BIT_PE2D_MAJOR_SUPER_TILE */
+ 0x0, /* gcFEATURE_BIT_PE_32BPC_COLORMASK_FIX */
+ 0x0, /* gcFEATURE_BIT_ALPHA_BLENDING_OPT */
+ 0x0, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x0, /* gcFEATURE_BIT_PIPELINE_32_ATTRIBUTES */
+ 0x0, /* gcFEATURE_BIT_MSAA_SHADING */
+ 0x0, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x0, /* gcFEATURE_BIT_NO_ASTC */
+ 0x0, /* gcFEATURE_BIT_NO_DXT */
+ 0x0, /* gcFEATURE_BIT_HWTFB */
+ 0x0, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x0, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_HALFDEPENDENCY_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_MCFILL_FIX */
+ 0x0, /* gcFEATURE_BIT_TPG_TCPERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_MDFIFO_OVERFLOW_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_BARRIER_IN_CS_FIX */
+ 0x0, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x0, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ADVANCED_INSTR */
+ 0x0, /* gcFEATURE_BIT_SH_FLAT_INTERPOLATION_DUAL16_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_CONTINUOUS_FLUS_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_V4 */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_ALPHA_KILL */
+ 0x0, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x0, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x0, /* gcFEATURE_BIT_SUPPORT_MOVAI */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_MAXPAGES_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_RGBA16I_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_8bpp_256TILE_FC_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_64bit_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_FULL_CACHE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_YUV_ASSEMBLER_10BIT */
+ 0x0, /* gcFEATURE_BIT_FE_32bit_INDEX_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_64bpp_MASKED_CLEAR_FIX */
+ 0x0, /* gcFEATURE_BIT_SECURITY */
+ 0x0, /* gcFEATURE_BIT_ROBUSTNESS */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x0, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LDST_CLAMP */
+ 0x0, /* gcFEATURE_BIT_SH_ICACHE_ALLOC_COUNT_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_VG_DOUBLE_IMAGE */
+ 0x0, /* gcFEATURE_BIT_VG_RECTANGLE_STRIPE_MODE */
+ 0x0, /* gcFEATURE_BIT_VG_MMU */
+ 0x0, /* gcFEATURE_BIT_VG_IM_FILTER */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PLANAR */
+ 0x0, /* gcFEATURE_BIT_VG_PE_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_COLOR_PRECISION_8_BIT */
+ 0x0, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_DEFER_FILL_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_CLOCK_GATE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_NEED_DUMMYDRAW */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x0, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x0, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_GPIPE_ACCESS_FULLTEMPS */
+ 0x0, /* gcFEATURE_BIT_PSIO_INTERLOCK */
+ 0x0, /* gcFEATURE_BIT_PA_WIDELINE_FIX */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_HELPER_FIX */
+ 0x0, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x0, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x0, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x0, /* gcFEATURE_BIT_DC_QOS */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x0, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x0, /* gcFEATURE_BIT_MULTICORE_SEMAPHORESTALL_V3 */
+ 0x0, /* gcFEATURE_BIT_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x0, /* gcFEATURE_BIT_SH_IDIV0_SWZL_EHS */
+ 0x0, /* gcFEATURE_BIT_TX_LERP_LESS_BIT */
+ 0x0, /* gcFEATURE_BIT_SH_GM_ENDIAN */
+ 0x0, /* gcFEATURE_BIT_SH_GM_USC_UNALLOC */
+ 0x0, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc400_4645 */
{
@@ -8499,6 +9469,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc400L_0x465x */
{
@@ -8921,6 +9897,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000nano_0x4652 */
{
@@ -9343,6 +10325,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000nano_0x4652 */
{
@@ -9765,6 +10753,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc420_5325 */
{
@@ -10187,6 +11181,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc420_5336 */
{
@@ -10609,6 +11609,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc420cpd_533rc7a */
{
@@ -11031,6 +12037,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc428_5421 */
{
@@ -11453,6 +12465,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc428c_5_4_2_rc3a */
{
@@ -11875,6 +12893,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520_5341 */
{
@@ -12297,6 +13321,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520_5540_rc0 */
{
@@ -12719,6 +13749,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520l_5_3_4_rc2b */
{
@@ -13141,6 +14177,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520c_5_5_0 */
{
@@ -13563,6 +14605,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520c_5_5_4_rc1 */
{
@@ -13985,6 +15033,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520sp_5_5_2_rc0a */
{
@@ -14407,6 +15461,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520_v552_rc1 */
{
@@ -14829,6 +15889,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc520_5_5_3_rc2a */
{
@@ -15251,6 +16317,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc600L_0x465x */
{
@@ -15673,6 +16745,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000nanoultra_4_6_5_rc3a */
{
@@ -16095,6 +17173,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000nanoultra_4_6_5_rc3b */
{
@@ -16517,6 +17601,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000nanoultra_4_6_5_rc3e */
{
@@ -16939,6 +18029,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc620_5_5_3_rc0 */
{
@@ -17361,6 +18457,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc620_5_5_5_rc0d */
{
@@ -17783,6 +18885,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc620tpc_5_5_6_rc0a */
{
@@ -18205,6 +19313,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc860L_0x464x */
{
@@ -18627,6 +19741,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc880_5106 */
{
@@ -19049,6 +20169,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc880_5122 */
{
@@ -19471,6 +20597,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc880TM_0x512x */
{
@@ -19893,6 +21025,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc900_5250 */
{
@@ -20315,6 +21453,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc1000_5036 */
{
@@ -20737,6 +21881,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc1000_5037 */
{
@@ -21159,6 +22309,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc1000_5037_1 */
{
@@ -21581,6 +22737,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc1000_5039 */
{
@@ -22003,6 +23165,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc1500_5246 */
{
@@ -22425,6 +23593,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc2000_5108 */
{
@@ -22847,6 +24021,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc2000_5140 */
{
@@ -23269,6 +24449,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc2000w_5_1_4_rc0e */
{
@@ -23691,6 +24877,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc2500_5422 */
{
@@ -24113,6 +25305,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc6400_5422 */
{
@@ -24535,6 +25733,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc3000_5435 */
{
@@ -24957,6 +26161,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc2000_ffff5450 */
{
@@ -25379,6 +26589,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc3000_5450 */
{
@@ -25801,6 +27017,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc3000_5451 */
{
@@ -26223,6 +27445,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_551x */
{
@@ -26645,6 +27873,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_5512 */
{
@@ -27067,6 +28301,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_5514 */
{
@@ -27489,6 +28729,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc4000_5222 */
{
@@ -27911,6 +29157,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc4000_5245 */
{
@@ -28333,6 +29585,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc5000_5434 */
{
@@ -28755,6 +30013,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000_551x */
{
@@ -29177,6 +30441,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000_5513 */
{
@@ -29599,6 +30869,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gcXAQ2_CMODEL */
{
@@ -29610,23 +30886,23 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* PatchVersion */
0x0, /* FormalRelease */
0x10, /* gcFEATURE_VALUE_Streams */
- 0x200, /* gcFEATURE_VALUE_TempRegisters */
- 0x100, /* gcFEATURE_VALUE_ThreadCount */
- 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
0x8, /* gcFEATURE_VALUE_NumShaderCores */
0x2, /* gcFEATURE_VALUE_NumPixelPipes */
- 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
0x0, /* gcFEATURE_VALUE_BufferSize */
0x200, /* gcFEATURE_VALUE_InstructionCount */
0x140, /* gcFEATURE_VALUE_NumberOfConstants */
0x1, /* gcFEATURE_VALUE_CoreCount */
0x1f, /* gcFEATURE_VALUE_VaryingCount */
- 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
- 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
0x100, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
0x2, /* gcFEATURE_VALUE_NumResolvePipes */
- 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
0x0, /* gcFEATURE_VALUE_NNCoreCount */
@@ -30021,6 +31297,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_600x */
{
@@ -30443,6 +31725,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_6008 */
{
@@ -30865,6 +32153,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XSVX_600x */
{
@@ -31287,6 +32581,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XSVX_6008 */
{
@@ -31709,6 +33009,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XSVX_6009 */
{
@@ -32131,6 +33437,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000_6100 */
{
@@ -32553,6 +33865,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_6100 */
{
@@ -32975,6 +34293,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_6100 */
{
@@ -33397,6 +34721,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip7000UL_6100 */
{
@@ -33423,7 +34753,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x10, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -33819,6 +35149,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000_6200 */
{
@@ -34241,6 +35577,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000UL_6200 */
{
@@ -34663,6 +36005,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000ULVX_6200 */
{
@@ -35085,6 +36433,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip7000L_6200 */
{
@@ -35111,7 +36465,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x20, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -35507,6 +36861,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip7000UL_6200 */
{
@@ -35533,7 +36893,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x10, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -35929,6 +37289,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip7000UL_6211 */
{
@@ -35955,7 +37321,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x10, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -36351,6 +37717,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip8000UL_6211 */
{
@@ -36374,10 +37746,10 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x1, /* gcFEATURE_VALUE_CoreCount */
0x10, /* gcFEATURE_VALUE_VaryingCount */
0x10, /* gcFEATURE_VALUE_LocalStorageSize */
- 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -36773,6 +38145,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip8000ULFN_6211 */
{
@@ -36796,10 +38174,10 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x1, /* gcFEATURE_VALUE_CoreCount */
0x10, /* gcFEATURE_VALUE_VaryingCount */
0x10, /* gcFEATURE_VALUE_LocalStorageSize */
- 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -37195,6 +38573,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip8000UL_6211 */
{
@@ -37218,10 +38602,10 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x1, /* gcFEATURE_VALUE_CoreCount */
0x10, /* gcFEATURE_VALUE_VaryingCount */
0x10, /* gcFEATURE_VALUE_LocalStorageSize */
- 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -37615,8 +38999,14 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
- 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vipnano */
{
@@ -37643,7 +39033,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x8, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -38037,8 +39427,14 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
- 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gcnanovip */
{
@@ -38459,8 +39855,14 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
- 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vipnano-q */
{
@@ -38487,7 +39889,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x10, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -38881,8 +40283,14 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
- 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip8000UL-s */
{
@@ -38909,7 +40317,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x10, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -39303,8 +40711,14 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
- 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip8000UL-q */
{
@@ -39331,7 +40745,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x10, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x40, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -39725,8 +41139,1298 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ },
+ /* vip8000UL */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ 0x0, /* FormalRelease */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x18, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x1, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x1, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x0, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x0, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x1, /* gcFEATURE_BIT_REG_YUY2Averaging */
+ 0x0, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x0, /* gcFEATURE_BIT_REG_HalfTXCache */
+ 0x0, /* gcFEATURE_BIT_REG_YUY2RenderTarget */
+ 0x0, /* gcFEATURE_BIT_REG_Mem32BitSupport */
+ 0x0, /* gcFEATURE_BIT_REG_PipeVG */
+ 0x0, /* gcFEATURE_BIT_REG_VGTS */
+ 0x0, /* gcFEATURE_BIT_REG_FE20 */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x1, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x1, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x1, /* gcFEATURE_BIT_REG_FlipY */
+ 0x1, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x1, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x1, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* gcFEATURE_BIT_REG_2DPE20 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable */
+ 0x1, /* gcFEATURE_BIT_REG_Render8K */
+ 0x1, /* gcFEATURE_BIT_REG_TileStatus2Bits */
+ 0x1, /* gcFEATURE_BIT_REG_SeparateTileStatusWhenInterleaved */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiled32x32 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x1, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x1, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* gcFEATURE_BIT_REG_MC20 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_HierarchicalZ */
+ 0x0, /* gcFEATURE_BIT_REG_NewTexture */
+ 0x0, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x1, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureStride */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes3 */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisable1 */
+ 0x0, /* gcFEATURE_BIT_REG_AutoRestartTS */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes4 */
+ 0x0, /* gcFEATURE_BIT_REG_L2Windowing */
+ 0x1, /* gcFEATURE_BIT_REG_HalfFloatPipe */
+ 0x1, /* gcFEATURE_BIT_REG_PixelDither */
+ 0x1, /* gcFEATURE_BIT_REG_TwoStencilReference */
+ 0x1, /* gcFEATURE_BIT_REG_ExtendedPixelFormat */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectMinMaxDepth */
+ 0x1, /* gcFEATURE_BIT_REG_DitherAndFilterPlusAlpha2D */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes5 */
+ 0x0, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x1, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x1, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x1, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x1, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x1, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x1, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x1, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x1, /* gcFEATURE_BIT_REG_S1S8 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti1 */
+ 0x0, /* gcFEATURE_BIT_REG_RGB888 */
+ 0x1, /* gcFEATURE_BIT_REG_TX_YUVAssembler */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x1, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x1, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x1, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x1, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_HIEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes16 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x1, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x0, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x0, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x0, /* gcFEATURE_BIT_REG_Probe */
+ 0x1, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x0, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x1, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x0, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x0, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x1, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x1, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x1, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x1, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x1, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x1, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x1, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x1, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
+ 0x0, /* gcFEATURE_BIT_REG_DEC */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12 */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12_10BIT */
+ 0x0, /* gcFEATURE_BIT_RenderTarget8 */
+ 0x0, /* gcFEATURE_BIT_TxLodFlowCorrection */
+ 0x0, /* gcFEATURE_BIT_FaceLod */
+ 0x0, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x1, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x0, /* gcFEATURE_BIT_PE2D_MAJOR_SUPER_TILE */
+ 0x1, /* gcFEATURE_BIT_PE_32BPC_COLORMASK_FIX */
+ 0x1, /* gcFEATURE_BIT_ALPHA_BLENDING_OPT */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x0, /* gcFEATURE_BIT_PIPELINE_32_ATTRIBUTES */
+ 0x0, /* gcFEATURE_BIT_MSAA_SHADING */
+ 0x0, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x1, /* gcFEATURE_BIT_NO_ASTC */
+ 0x0, /* gcFEATURE_BIT_NO_DXT */
+ 0x0, /* gcFEATURE_BIT_HWTFB */
+ 0x1, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x1, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_HALFDEPENDENCY_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MCFILL_FIX */
+ 0x1, /* gcFEATURE_BIT_TPG_TCPERF_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MDFIFO_OVERFLOW_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_BARRIER_IN_CS_FIX */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ADVANCED_INSTR */
+ 0x1, /* gcFEATURE_BIT_SH_FLAT_INTERPOLATION_DUAL16_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_CONTINUOUS_FLUS_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_V4 */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_ALPHA_KILL */
+ 0x1, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* gcFEATURE_BIT_SUPPORT_MOVAI */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_MAXPAGES_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_RGBA16I_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_8bpp_256TILE_FC_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_64bit_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_FULL_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_YUV_ASSEMBLER_10BIT */
+ 0x1, /* gcFEATURE_BIT_FE_32bit_INDEX_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_64bpp_MASKED_CLEAR_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY */
+ 0x1, /* gcFEATURE_BIT_ROBUSTNESS */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x1, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x1, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x1, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_SNAPPAGE_CMD */
+ 0x1, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x1, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x1, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_CLAMP */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_ALLOC_COUNT_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_VG_DOUBLE_IMAGE */
+ 0x0, /* gcFEATURE_BIT_VG_RECTANGLE_STRIPE_MODE */
+ 0x0, /* gcFEATURE_BIT_VG_MMU */
+ 0x0, /* gcFEATURE_BIT_VG_IM_FILTER */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PLANAR */
+ 0x0, /* gcFEATURE_BIT_VG_PE_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_COLOR_PRECISION_8_BIT */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x1, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_DEFER_FILL_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_CLOCK_GATE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_NEED_DUMMYDRAW */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x0, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x0, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_GPIPE_ACCESS_FULLTEMPS */
+ 0x0, /* gcFEATURE_BIT_PSIO_INTERLOCK */
+ 0x1, /* gcFEATURE_BIT_PA_WIDELINE_FIX */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_HELPER_FIX */
+ 0x0, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x0, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x0, /* gcFEATURE_BIT_DC_QOS */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x0, /* gcFEATURE_BIT_MULTICORE_SEMAPHORESTALL_V3 */
+ 0x0, /* gcFEATURE_BIT_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x0, /* gcFEATURE_BIT_SH_IDIV0_SWZL_EHS */
+ 0x0, /* gcFEATURE_BIT_TX_LERP_LESS_BIT */
+ 0x0, /* gcFEATURE_BIT_SH_GM_ENDIAN */
+ 0x0, /* gcFEATURE_BIT_SH_GM_USC_UNALLOC */
+ 0x0, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x1, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ },
+ /* vip8000-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x45080000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x72, /* CustomerID */
+ 0x0, /* PatchVersion */
+ 0x0, /* FormalRelease */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x1, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x1, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x0, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x0, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x1, /* gcFEATURE_BIT_REG_YUY2Averaging */
+ 0x0, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x0, /* gcFEATURE_BIT_REG_HalfTXCache */
+ 0x0, /* gcFEATURE_BIT_REG_YUY2RenderTarget */
+ 0x0, /* gcFEATURE_BIT_REG_Mem32BitSupport */
+ 0x0, /* gcFEATURE_BIT_REG_PipeVG */
+ 0x0, /* gcFEATURE_BIT_REG_VGTS */
+ 0x0, /* gcFEATURE_BIT_REG_FE20 */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x1, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x1, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x1, /* gcFEATURE_BIT_REG_FlipY */
+ 0x1, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x1, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x1, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* gcFEATURE_BIT_REG_2DPE20 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable */
+ 0x1, /* gcFEATURE_BIT_REG_Render8K */
+ 0x1, /* gcFEATURE_BIT_REG_TileStatus2Bits */
+ 0x1, /* gcFEATURE_BIT_REG_SeparateTileStatusWhenInterleaved */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiled32x32 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x1, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x1, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* gcFEATURE_BIT_REG_MC20 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_HierarchicalZ */
+ 0x0, /* gcFEATURE_BIT_REG_NewTexture */
+ 0x0, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x1, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureStride */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes3 */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisable1 */
+ 0x0, /* gcFEATURE_BIT_REG_AutoRestartTS */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes4 */
+ 0x0, /* gcFEATURE_BIT_REG_L2Windowing */
+ 0x1, /* gcFEATURE_BIT_REG_HalfFloatPipe */
+ 0x1, /* gcFEATURE_BIT_REG_PixelDither */
+ 0x1, /* gcFEATURE_BIT_REG_TwoStencilReference */
+ 0x1, /* gcFEATURE_BIT_REG_ExtendedPixelFormat */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectMinMaxDepth */
+ 0x1, /* gcFEATURE_BIT_REG_DitherAndFilterPlusAlpha2D */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes5 */
+ 0x0, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x1, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x1, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x1, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x1, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x1, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x1, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x1, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x1, /* gcFEATURE_BIT_REG_S1S8 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti1 */
+ 0x0, /* gcFEATURE_BIT_REG_RGB888 */
+ 0x1, /* gcFEATURE_BIT_REG_TX_YUVAssembler */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x1, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x1, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x1, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x1, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_HIEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes16 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x1, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x0, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x0, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x0, /* gcFEATURE_BIT_REG_Probe */
+ 0x1, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x0, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x1, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x0, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x0, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x1, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x1, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x1, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x1, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x1, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x1, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x1, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x1, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
+ 0x0, /* gcFEATURE_BIT_REG_DEC */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12 */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12_10BIT */
+ 0x0, /* gcFEATURE_BIT_RenderTarget8 */
+ 0x0, /* gcFEATURE_BIT_TxLodFlowCorrection */
+ 0x0, /* gcFEATURE_BIT_FaceLod */
+ 0x0, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x1, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x0, /* gcFEATURE_BIT_PE2D_MAJOR_SUPER_TILE */
+ 0x1, /* gcFEATURE_BIT_PE_32BPC_COLORMASK_FIX */
+ 0x1, /* gcFEATURE_BIT_ALPHA_BLENDING_OPT */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x0, /* gcFEATURE_BIT_PIPELINE_32_ATTRIBUTES */
+ 0x0, /* gcFEATURE_BIT_MSAA_SHADING */
+ 0x0, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x1, /* gcFEATURE_BIT_NO_ASTC */
+ 0x0, /* gcFEATURE_BIT_NO_DXT */
+ 0x0, /* gcFEATURE_BIT_HWTFB */
+ 0x1, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x1, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_HALFDEPENDENCY_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MCFILL_FIX */
+ 0x1, /* gcFEATURE_BIT_TPG_TCPERF_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MDFIFO_OVERFLOW_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_BARRIER_IN_CS_FIX */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ADVANCED_INSTR */
+ 0x1, /* gcFEATURE_BIT_SH_FLAT_INTERPOLATION_DUAL16_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_CONTINUOUS_FLUS_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_V4 */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_ALPHA_KILL */
+ 0x1, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* gcFEATURE_BIT_SUPPORT_MOVAI */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_MAXPAGES_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_RGBA16I_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_8bpp_256TILE_FC_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_64bit_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_FULL_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_YUV_ASSEMBLER_10BIT */
+ 0x1, /* gcFEATURE_BIT_FE_32bit_INDEX_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_64bpp_MASKED_CLEAR_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY */
+ 0x1, /* gcFEATURE_BIT_ROBUSTNESS */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x1, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x1, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x1, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_SNAPPAGE_CMD */
+ 0x1, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x1, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x1, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_CLAMP */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_ALLOC_COUNT_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_VG_DOUBLE_IMAGE */
+ 0x0, /* gcFEATURE_BIT_VG_RECTANGLE_STRIPE_MODE */
+ 0x0, /* gcFEATURE_BIT_VG_MMU */
+ 0x0, /* gcFEATURE_BIT_VG_IM_FILTER */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PLANAR */
+ 0x0, /* gcFEATURE_BIT_VG_PE_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_COLOR_PRECISION_8_BIT */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x1, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_DEFER_FILL_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_CLOCK_GATE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_NEED_DUMMYDRAW */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x0, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x0, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_GPIPE_ACCESS_FULLTEMPS */
+ 0x0, /* gcFEATURE_BIT_PSIO_INTERLOCK */
+ 0x1, /* gcFEATURE_BIT_PA_WIDELINE_FIX */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_HELPER_FIX */
+ 0x0, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x0, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x0, /* gcFEATURE_BIT_DC_QOS */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x0, /* gcFEATURE_BIT_MULTICORE_SEMAPHORESTALL_V3 */
+ 0x0, /* gcFEATURE_BIT_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x0, /* gcFEATURE_BIT_SH_IDIV0_SWZL_EHS */
+ 0x0, /* gcFEATURE_BIT_TX_LERP_LESS_BIT */
+ 0x0, /* gcFEATURE_BIT_SH_GM_ENDIAN */
+ 0x0, /* gcFEATURE_BIT_SH_GM_USC_UNALLOC */
+ 0x0, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x2a, /* CustomerID */
+ 0x0, /* PatchVersion */
+ 0x0, /* FormalRelease */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x1, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x1, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x0, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x0, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x1, /* gcFEATURE_BIT_REG_YUY2Averaging */
+ 0x0, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x0, /* gcFEATURE_BIT_REG_HalfTXCache */
+ 0x0, /* gcFEATURE_BIT_REG_YUY2RenderTarget */
+ 0x0, /* gcFEATURE_BIT_REG_Mem32BitSupport */
+ 0x0, /* gcFEATURE_BIT_REG_PipeVG */
+ 0x0, /* gcFEATURE_BIT_REG_VGTS */
+ 0x0, /* gcFEATURE_BIT_REG_FE20 */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x1, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x1, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x1, /* gcFEATURE_BIT_REG_FlipY */
+ 0x1, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x1, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x1, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* gcFEATURE_BIT_REG_2DPE20 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable */
+ 0x1, /* gcFEATURE_BIT_REG_Render8K */
+ 0x1, /* gcFEATURE_BIT_REG_TileStatus2Bits */
+ 0x1, /* gcFEATURE_BIT_REG_SeparateTileStatusWhenInterleaved */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiled32x32 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x1, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x1, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* gcFEATURE_BIT_REG_MC20 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_HierarchicalZ */
+ 0x0, /* gcFEATURE_BIT_REG_NewTexture */
+ 0x0, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x1, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureStride */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes3 */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisable1 */
+ 0x0, /* gcFEATURE_BIT_REG_AutoRestartTS */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes4 */
+ 0x0, /* gcFEATURE_BIT_REG_L2Windowing */
+ 0x1, /* gcFEATURE_BIT_REG_HalfFloatPipe */
+ 0x1, /* gcFEATURE_BIT_REG_PixelDither */
+ 0x1, /* gcFEATURE_BIT_REG_TwoStencilReference */
+ 0x1, /* gcFEATURE_BIT_REG_ExtendedPixelFormat */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectMinMaxDepth */
+ 0x1, /* gcFEATURE_BIT_REG_DitherAndFilterPlusAlpha2D */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes5 */
+ 0x0, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x1, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x1, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x1, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x1, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x1, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x1, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x1, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x1, /* gcFEATURE_BIT_REG_S1S8 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti1 */
+ 0x0, /* gcFEATURE_BIT_REG_RGB888 */
+ 0x1, /* gcFEATURE_BIT_REG_TX_YUVAssembler */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x1, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x1, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x1, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x1, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_HIEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes16 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x1, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x0, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x0, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x0, /* gcFEATURE_BIT_REG_Probe */
+ 0x1, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x0, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x1, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x0, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x0, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x1, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x1, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x1, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x1, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x1, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x1, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x1, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x1, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
+ 0x0, /* gcFEATURE_BIT_REG_DEC */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12 */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12_10BIT */
+ 0x0, /* gcFEATURE_BIT_RenderTarget8 */
+ 0x0, /* gcFEATURE_BIT_TxLodFlowCorrection */
+ 0x0, /* gcFEATURE_BIT_FaceLod */
+ 0x0, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x1, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x0, /* gcFEATURE_BIT_PE2D_MAJOR_SUPER_TILE */
+ 0x1, /* gcFEATURE_BIT_PE_32BPC_COLORMASK_FIX */
+ 0x1, /* gcFEATURE_BIT_ALPHA_BLENDING_OPT */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x0, /* gcFEATURE_BIT_PIPELINE_32_ATTRIBUTES */
+ 0x0, /* gcFEATURE_BIT_MSAA_SHADING */
+ 0x0, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x1, /* gcFEATURE_BIT_NO_ASTC */
+ 0x0, /* gcFEATURE_BIT_NO_DXT */
+ 0x0, /* gcFEATURE_BIT_HWTFB */
+ 0x1, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x1, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_HALFDEPENDENCY_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MCFILL_FIX */
+ 0x1, /* gcFEATURE_BIT_TPG_TCPERF_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MDFIFO_OVERFLOW_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_BARRIER_IN_CS_FIX */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_ADVANCED_INSTR */
+ 0x1, /* gcFEATURE_BIT_SH_FLAT_INTERPOLATION_DUAL16_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_CONTINUOUS_FLUS_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_V4 */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_ALPHA_KILL */
+ 0x1, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* gcFEATURE_BIT_SUPPORT_MOVAI */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_MAXPAGES_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_RGBA16I_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_8bpp_256TILE_FC_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_64bit_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_FULL_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_YUV_ASSEMBLER_10BIT */
+ 0x1, /* gcFEATURE_BIT_FE_32bit_INDEX_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_64bpp_MASKED_CLEAR_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY */
+ 0x1, /* gcFEATURE_BIT_ROBUSTNESS */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x1, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x1, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x1, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_SNAPPAGE_CMD */
+ 0x1, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x1, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x1, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_CLAMP */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_ALLOC_COUNT_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_VG_DOUBLE_IMAGE */
+ 0x0, /* gcFEATURE_BIT_VG_RECTANGLE_STRIPE_MODE */
+ 0x0, /* gcFEATURE_BIT_VG_MMU */
+ 0x0, /* gcFEATURE_BIT_VG_IM_FILTER */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PLANAR */
+ 0x0, /* gcFEATURE_BIT_VG_PE_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_COLOR_PRECISION_8_BIT */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x1, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_DEFER_FILL_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_CLOCK_GATE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_NEED_DUMMYDRAW */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x0, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x0, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_GPIPE_ACCESS_FULLTEMPS */
+ 0x0, /* gcFEATURE_BIT_PSIO_INTERLOCK */
+ 0x1, /* gcFEATURE_BIT_PA_WIDELINE_FIX */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_HELPER_FIX */
+ 0x0, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x0, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x0, /* gcFEATURE_BIT_DC_QOS */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x0, /* gcFEATURE_BIT_MULTICORE_SEMAPHORESTALL_V3 */
+ 0x0, /* gcFEATURE_BIT_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x0, /* gcFEATURE_BIT_SH_IDIV0_SWZL_EHS */
+ 0x0, /* gcFEATURE_BIT_TX_LERP_LESS_BIT */
+ 0x0, /* gcFEATURE_BIT_SH_GM_ENDIAN */
+ 0x0, /* gcFEATURE_BIT_SH_GM_USC_UNALLOC */
+ 0x0, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7400_551x */
{
@@ -40149,6 +42853,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc8000UL_6200 */
{
@@ -40571,6 +43281,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* v630 */
{
@@ -40993,6 +43709,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_6200 */
{
@@ -41415,6 +44137,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_6200 */
{
@@ -41837,6 +44565,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000LXS_6200 */
{
@@ -42259,6 +44993,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* vip7000_6200 */
{
@@ -42681,6 +45421,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000ULVX_V11_6200 */
{
@@ -43103,6 +45849,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000ULVX_V12_6200 */
{
@@ -43525,6 +46277,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000ULVX_6200_pid0x60 */
{
@@ -43947,6 +46705,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_6FFF */
{
@@ -44369,6 +47133,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000_6210 */
{
@@ -44791,6 +47561,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000_6210 */
{
@@ -45213,6 +47989,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_6210 */
{
@@ -45635,6 +48417,440 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ },
+ /* gc8000XS_6210 */
+ {
+ 0x8000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x80004, /* ProductID */
+ 0x0, /* EcoID */
+ 0xd, /* CustomerID */
+ 0x0, /* PatchVersion */
+ 0x0, /* FormalRelease */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x1, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x1, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x0, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x0, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x1, /* gcFEATURE_BIT_REG_YUY2Averaging */
+ 0x0, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x0, /* gcFEATURE_BIT_REG_HalfTXCache */
+ 0x0, /* gcFEATURE_BIT_REG_YUY2RenderTarget */
+ 0x0, /* gcFEATURE_BIT_REG_Mem32BitSupport */
+ 0x0, /* gcFEATURE_BIT_REG_PipeVG */
+ 0x0, /* gcFEATURE_BIT_REG_VGTS */
+ 0x0, /* gcFEATURE_BIT_REG_FE20 */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x1, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x1, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x1, /* gcFEATURE_BIT_REG_FlipY */
+ 0x1, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x1, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x1, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* gcFEATURE_BIT_REG_2DPE20 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisable */
+ 0x1, /* gcFEATURE_BIT_REG_Render8K */
+ 0x1, /* gcFEATURE_BIT_REG_TileStatus2Bits */
+ 0x1, /* gcFEATURE_BIT_REG_SeparateTileStatusWhenInterleaved */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiled32x32 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x1, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x1, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* gcFEATURE_BIT_REG_MC20 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_HierarchicalZ */
+ 0x0, /* gcFEATURE_BIT_REG_NewTexture */
+ 0x0, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x1, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureStride */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes3 */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisable1 */
+ 0x0, /* gcFEATURE_BIT_REG_AutoRestartTS */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes4 */
+ 0x0, /* gcFEATURE_BIT_REG_L2Windowing */
+ 0x1, /* gcFEATURE_BIT_REG_HalfFloatPipe */
+ 0x1, /* gcFEATURE_BIT_REG_PixelDither */
+ 0x1, /* gcFEATURE_BIT_REG_TwoStencilReference */
+ 0x1, /* gcFEATURE_BIT_REG_ExtendedPixelFormat */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectMinMaxDepth */
+ 0x1, /* gcFEATURE_BIT_REG_DitherAndFilterPlusAlpha2D */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes5 */
+ 0x0, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x1, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x1, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x1, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x1, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x1, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x1, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x1, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x1, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x1, /* gcFEATURE_BIT_REG_S1S8 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti1 */
+ 0x0, /* gcFEATURE_BIT_REG_RGB888 */
+ 0x0, /* gcFEATURE_BIT_REG_TX_YUVAssembler */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x1, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x1, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x1, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x1, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x1, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_HIEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_FEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes16 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x1, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x0, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x1, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x0, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x1, /* gcFEATURE_BIT_REG_Probe */
+ 0x1, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x0, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x1, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x1, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x0, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x1, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x1, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x1, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x1, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x1, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x1, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x1, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x0, /* gcFEATURE_BIT_REG_Evis */
+ 0x1, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes23 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes24 */
+ 0x0, /* gcFEATURE_BIT_REG_DEC */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12 */
+ 0x0, /* gcFEATURE_BIT_REG_VSTileNV12_10BIT */
+ 0x0, /* gcFEATURE_BIT_RenderTarget8 */
+ 0x0, /* gcFEATURE_BIT_TxLodFlowCorrection */
+ 0x0, /* gcFEATURE_BIT_FaceLod */
+ 0x0, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x1, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x0, /* gcFEATURE_BIT_PE2D_MAJOR_SUPER_TILE */
+ 0x1, /* gcFEATURE_BIT_PE_32BPC_COLORMASK_FIX */
+ 0x1, /* gcFEATURE_BIT_ALPHA_BLENDING_OPT */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x0, /* gcFEATURE_BIT_PIPELINE_32_ATTRIBUTES */
+ 0x1, /* gcFEATURE_BIT_MSAA_SHADING */
+ 0x0, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x0, /* gcFEATURE_BIT_NO_ASTC */
+ 0x0, /* gcFEATURE_BIT_NO_DXT */
+ 0x1, /* gcFEATURE_BIT_HWTFB */
+ 0x1, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x1, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_HALFDEPENDENCY_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MCFILL_FIX */
+ 0x1, /* gcFEATURE_BIT_TPG_TCPERF_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_MDFIFO_OVERFLOW_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_BARRIER_IN_CS_FIX */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_ADVANCED_INSTR */
+ 0x1, /* gcFEATURE_BIT_SH_FLAT_INTERPOLATION_DUAL16_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_CONTINUOUS_FLUS_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_V4 */
+ 0x0, /* gcFEATURE_BIT_SH_SUPPORT_ALPHA_KILL */
+ 0x1, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* gcFEATURE_BIT_SUPPORT_MOVAI */
+ 0x1, /* gcFEATURE_BIT_SH_SNAP2PAGE_MAXPAGES_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_RGBA16I_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_8bpp_256TILE_FC_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_64bit_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_FULL_CACHE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_YUV_ASSEMBLER_10BIT */
+ 0x1, /* gcFEATURE_BIT_FE_32bit_INDEX_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_64bpp_MASKED_CLEAR_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY */
+ 0x1, /* gcFEATURE_BIT_ROBUSTNESS */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x1, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x1, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x1, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x1, /* gcFEATURE_BIT_SNAPPAGE_CMD */
+ 0x1, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x1, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_CLAMP */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_ALLOC_COUNT_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 0x0, /* gcFEATURE_BIT_VG_AYUV_INPUT_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_VG_DOUBLE_IMAGE */
+ 0x0, /* gcFEATURE_BIT_VG_RECTANGLE_STRIPE_MODE */
+ 0x0, /* gcFEATURE_BIT_VG_MMU */
+ 0x0, /* gcFEATURE_BIT_VG_IM_FILTER */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_IM_YUV_PLANAR */
+ 0x0, /* gcFEATURE_BIT_VG_PE_YUV_PACKET */
+ 0x0, /* gcFEATURE_BIT_VG_COLOR_PRECISION_8_BIT */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x1, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_DEFER_FILL_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_CLOCK_GATE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_NEED_DUMMYDRAW */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x1, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_GPIPE_ACCESS_FULLTEMPS */
+ 0x0, /* gcFEATURE_BIT_PSIO_INTERLOCK */
+ 0x1, /* gcFEATURE_BIT_PA_WIDELINE_FIX */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_HELPER_FIX */
+ 0x0, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x0, /* gcFEATURE_BIT_DC_QOS */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x0, /* gcFEATURE_BIT_MULTICORE_SEMAPHORESTALL_V3 */
+ 0x0, /* gcFEATURE_BIT_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x0, /* gcFEATURE_BIT_SH_IDIV0_SWZL_EHS */
+ 0x0, /* gcFEATURE_BIT_TX_LERP_LESS_BIT */
+ 0x0, /* gcFEATURE_BIT_SH_GM_ENDIAN */
+ 0x0, /* gcFEATURE_BIT_SH_GM_USC_UNALLOC */
+ 0x0, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x0, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XS_6210 */
{
@@ -46057,6 +49273,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_6210 */
{
@@ -46479,6 +49701,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_6210 */
{
@@ -46901,6 +50129,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000LXS_6210 */
{
@@ -47323,6 +50557,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XSVX_6210 */
{
@@ -47745,6 +50985,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000XSVX_6210 */
{
@@ -48167,6 +51413,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7000L_DEC400 */
{
@@ -48589,6 +51841,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7400_0002 */
{
@@ -49011,6 +52269,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc7400_0003 */
{
@@ -49433,6 +52697,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc8400_6300 */
{
@@ -49855,6 +53125,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc8100_6300_pid0x43 */
{
@@ -50277,6 +53553,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* gc8200_6300_pid0x46 */
{
@@ -50699,6 +53981,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* cc8000_6220 */
{
@@ -50725,7 +54013,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x40, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -51121,6 +54409,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x0, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
/* cc8000_6330 */
{
@@ -51147,7 +54441,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x20, /* gcFEATURE_VALUE_L1CacheSize */
0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
0x14, /* gcFEATURE_VALUE_ShaderPCLength */
- 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
0x0, /* gcFEATURE_VALUE_NNMadPerCore */
@@ -51543,6 +54837,12 @@ static gcsFEATURE_DATABASE gChipInfo[] = {
0x1, /* gcFEATURE_BIT_SEPARATE_LS */
0x0, /* gcFEATURE_BIT_MCFE */
0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
},
};
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
index 4945dca90ec1..9b3c60ca8c7c 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
@@ -310,6 +310,14 @@ typedef struct _gckHARDWARE * gckHARDWARE;
# define gcmVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
#endif
+typedef struct _gcsContiguousBlock
+{
+ gctUINT32 ptr;
+ gctSIZE_T size;
+}
+gcsContiguousBlock;
+
+
/******************************************************************************\
********************************** gckOS Object *********************************
\******************************************************************************/
@@ -1162,6 +1170,26 @@ gckOS_UnmapUserMemory(
IN gctUINT32 Address
);
+/* Get scatter-gather table from memory. */
+gceSTATUS
+gckOS_MemoryGetSGT(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *SGT
+ );
+
+/* Map a page range of memory to user space. */
+gceSTATUS
+gckOS_MemoryMmap(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT gctPOINTER Vma
+ );
+
/* Wrap a user memory to gctPHYS_ADDR. */
gceSTATUS
gckOS_WrapMemory(
@@ -1780,6 +1808,17 @@ gckKERNEL_QueryVideoMemory(
OUT struct _gcsHAL_INTERFACE * Interface
);
+/* Query used memory nodes of a specific pool. */
+gceSTATUS
+gckKERNEL_QueryVidMemPoolNodes(
+ gckKERNEL Kernel,
+ gcePOOL Pool,
+ gctUINT32 * TotalSize, /* sum of the sizes of the contiguous blocks (i.e. total memory used at current time) : to be filled by the called function */
+ gcsContiguousBlock * MemoryBlocks, /* previously allocated by the calling function : to be filled by the called function */
+ gctUINT32 NumMaxBlocks, /* provided by the calling function */
+ gctUINT32 * NumBlocks /* actual number of contiguous blocks : to be filled by the called function */
+ );
+
/* Lookup the gckVIDMEM object for a pool. */
gceSTATUS
gckKERNEL_GetVideoMemoryPool(
@@ -1855,6 +1894,7 @@ gckKERNEL_MapVideoMemoryEx(
IN gctUINT32 Pid,
IN gctUINT32 Bytes,
#endif
+ IN gcePOOL Pool,
OUT gctPOINTER * Logical
);
@@ -2114,6 +2154,12 @@ gckHARDWARE_QueryChipIdentity(
OUT gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity
);
+gceSTATUS
+gckHARDWARE_QueryChipOptions(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_QUERY_CHIP_OPTIONS_PTR Options
+ );
+
/* Query the shader uniforms support. */
gceSTATUS
gckHARDWARE_QueryShaderCaps(
@@ -2513,13 +2559,6 @@ gckEVENT_Unlock(
IN gceSURF_TYPE Type
);
-gceSTATUS
-gckEVENT_CommitDone(
- IN gckEVENT Event,
- IN gceKERNEL_WHERE FromWhere,
- IN gckCONTEXT Context
- );
-
/* Schedule a FreeVirtualCommandBuffer event. */
gceSTATUS
gckEVENT_DestroyVirtualCommandBuffer(
@@ -2540,7 +2579,8 @@ gckEVENT_Submit(
gceSTATUS
gckEVENT_Commit(
IN gckEVENT Event,
- IN gcsQUEUE_PTR Queue
+ IN gcsQUEUE_PTR Queue,
+ IN gctBOOL Forced
);
/* Event callback routine. */
@@ -2618,7 +2658,6 @@ gckCOMMAND_Commit(
IN gckCONTEXT Context,
IN gcoCMDBUF CommandBuffer,
IN gcsSTATE_DELTA_PTR StateDelta,
- IN gcsQUEUE_PTR EventQueue,
IN gctUINT32 ProcessID,
IN gctBOOL Shared,
IN gctUINT32 Index,
@@ -2763,21 +2802,13 @@ gckMMU_IsFlatMapped(
);
-#if VIVANTE_PROFILER
-gceSTATUS
-gckHARDWARE_QueryProfileRegisters(
- IN gckHARDWARE Hardware,
- IN gctBOOL Reset,
- OUT gcsPROFILER_COUNTERS * Counters
- );
-#endif
-
gceSTATUS
gckHARDWARE_QueryContextProfile(
IN gckHARDWARE Hardware,
IN gctBOOL Reset,
IN gckCONTEXT Context,
- OUT gcsPROFILER_COUNTERS * Counters
+ OUT gcsPROFILER_COUNTERS_PART1 * Counters_part1,
+ OUT gcsPROFILER_COUNTERS_PART2 * Counters_part2
);
gceSTATUS
@@ -2787,21 +2818,6 @@ gckHARDWARE_UpdateContextProfile(
);
gceSTATUS
-gckHARDWARE_QueryContextNewProfile(
- IN gckHARDWARE Hardware,
- IN gctBOOL Reset,
- IN gckCONTEXT Context,
- OUT gcsPROFILER_NEW_COUNTERS_PART1 * Counters_part1,
- OUT gcsPROFILER_NEW_COUNTERS_PART2 * Counters_part2
- );
-
-gceSTATUS
-gckHARDWARE_UpdateContextNewProfile(
- IN gckHARDWARE Hardware,
- IN gckCONTEXT Context
- );
-
-gceSTATUS
gckHARDWARE_InitProfiler(
IN gckHARDWARE Hardware
);
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
index 0bd63e16fc8c..9d24c5bd49f7 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
@@ -577,6 +577,13 @@ gcoHAL_SetBltNP2Texture(
);
gceSTATUS
+gcoHAL_ExportVideoMemory(
+ IN gctUINT32 Handle,
+ IN gctUINT32 Flags,
+ OUT gctINT32 * FD
+ );
+
+gceSTATUS
gcoHAL_NameVideoMemory(
IN gctUINT32 Handle,
OUT gctUINT32 * Name
@@ -1070,6 +1077,14 @@ gcoHAL_ScheduleSignal(
IN gceKERNEL_WHERE FromWhere
);
+gceSTATUS
+gcoHAL_GetGraphicBufferFd(
+ IN gctUINT32 Node[3],
+ IN gctSHBUF ShBuf,
+ IN gctSIGNAL Signal,
+ OUT gctINT32 * Fd
+ );
+
/******************************************************************************\
********************************** gcoOS Object *********************************
\******************************************************************************/
@@ -4077,7 +4092,8 @@ gckOS_DebugFlush(
**
** ... Optional arguments.
*/
-#if gcdDUMP
+
+#if gcdDUMP || gcdDUMP_2DVG
gceSTATUS
gcfDump(
IN gcoOS Os,
@@ -4165,7 +4181,7 @@ gckOS_DebugFlush(
** Number of bytes.
*/
-#if gcdDUMP || gcdDUMP_COMMAND
+#if gcdDUMP || gcdDUMP_COMMAND || gcdDUMP_2DVG
gceSTATUS
gcfDumpBuffer(
IN gcoOS Os,
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
index 628f13cf5a4f..7a41b0a5a854 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
@@ -126,11 +126,10 @@ typedef enum _gceHAL_COMMAND_CODES
gcvHAL_GET_PROFILE_SETTING,
gcvHAL_SET_PROFILE_SETTING,
- gcvHAL_READ_ALL_PROFILE_REGISTERS,
gcvHAL_PROFILE_REGISTERS_2D,
- gcvHAL_READ_ALL_PROFILE_NEW_REGISTERS_PART1,
- gcvHAL_READ_ALL_PROFILE_NEW_REGISTERS_PART2,
- gcvHAL_READ_PROFILER_NEW_REGISTER_SETTING,
+ gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1,
+ gcvHAL_READ_ALL_PROFILE_REGISTERS_PART2,
+ gcvHAL_READ_PROFILER_REGISTER_SETTING,
/* Power management. */
gcvHAL_SET_POWER_MANAGEMENT_STATE,
@@ -196,6 +195,8 @@ typedef enum _gceHAL_COMMAND_CODES
gcvHAL_SET_FSCALE_VALUE,
gcvHAL_GET_FSCALE_VALUE,
+ /* Export video memory as dma_buf fd */
+ gcvHAL_EXPORT_VIDEO_MEMORY,
gcvHAL_NAME_VIDEO_MEMORY,
gcvHAL_IMPORT_VIDEO_MEMORY,
@@ -218,6 +219,13 @@ typedef enum _gceHAL_COMMAND_CODES
/* Shared buffer. */
gcvHAL_SHBUF,
+ /*
+ * Fd representation of android graphic buffer contents.
+ * Currently, it is only to reference video nodes, signal, etc to avoid being
+ * destroyed when trasfering across processes.
+ */
+ gcvHAL_GET_GRAPHIC_BUFFER_FD,
+
/* Connect a video node to an OS native fd. */
gcvHAL_GET_VIDEO_MEMORY_FD,
@@ -238,7 +246,8 @@ typedef enum _gceHAL_COMMAND_CODES
gcvHAL_DEC300_FLUSH_WAIT,
#endif
- gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY
+ gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY,
+ gcvHAL_QUERY_CHIP_OPTION
}
gceHAL_COMMAND_CODES;
@@ -264,6 +273,7 @@ typedef struct _gcsUSER_MEMORY_DESC
/* gcvALLOC_FLAG_DMABUF */
gctUINT32 handle;
+ gctUINT64 dmabuf;
/* gcvALLOC_FLAG_USERMEMORY */
gctUINT64 logical;
@@ -360,6 +370,23 @@ typedef struct _gcsHAL_QUERY_CHIP_IDENTITY
}
gcsHAL_QUERY_CHIP_IDENTITY;
+typedef struct _gcsHAL_QUERY_CHIP_OPTIONS * gcsHAL_QUERY_CHIP_OPTIONS_PTR;
+typedef struct _gcsHAL_QUERY_CHIP_OPTIONS
+{
+ gctBOOL gpuProfiler;
+ gctBOOL allowFastClear;
+ gctBOOL powerManagement;
+ /* Whether use new MMU. It is meaningless
+ ** for old MMU since old MMU is always enabled.
+ */
+ gctBOOL enableMMU;
+ gceCOMPRESSION_OPTION allowCompression;
+ gctUINT uscL1CacheRatio;
+ gceSECURE_MODE secureMode;
+
+}
+gcsHAL_QUERY_CHIP_OPTIONS;
+
typedef struct _gcsHAL_INTERFACE
{
/* Command code. */
@@ -554,6 +581,12 @@ typedef struct _gcsHAL_INTERFACE
/* Type of surface. */
IN gceSURF_TYPE type;
+ /* Pool of the unlock node */
+ OUT gcePOOL pool;
+
+ /* Bytes of the unlock node */
+ OUT gctUINT bytes;
+
/* Flag to unlock surface asynchroneously. */
IN OUT gctBOOL asynchroneous;
}
@@ -844,7 +877,6 @@ typedef struct _gcsHAL_INTERFACE
{
/* Enable profiling */
OUT gctBOOL enable;
- OUT gctBOOL syncMode;
}
GetProfileSetting;
@@ -853,7 +885,6 @@ typedef struct _gcsHAL_INTERFACE
{
/* Enable profiling */
IN gctBOOL enable;
- IN gctBOOL syncMode;
}
SetProfileSetting;
@@ -865,36 +896,25 @@ typedef struct _gcsHAL_INTERFACE
}
SetProfilerRegisterClear;
- /* gcvHAL_READ_ALL_PROFILE_REGISTERS */
- struct _gcsHAL_READ_ALL_PROFILE_REGISTERS
- {
- /* Context buffer object gckCONTEXT. Just a name. */
- IN gctUINT32 context;
-
- /* Data read. */
- OUT gcsPROFILER_COUNTERS counters;
- }
- RegisterProfileData;
-
- struct _gcsHAL_READ_ALL_PROFILE_NEW_REGISTERS_PART1
+ struct _gcsHAL_READ_ALL_PROFILE_REGISTERS_PART1
{
/* Context buffer object gckCONTEXT. Just a name. */
IN gctUINT32 context;
/* Data read. */
- OUT gcsPROFILER_NEW_COUNTERS_PART1 newCounters;
+ OUT gcsPROFILER_COUNTERS_PART1 Counters;
}
- RegisterProfileNewData_part1;
+ RegisterProfileData_part1;
- struct _gcsHAL_READ_ALL_PROFILE_NEW_REGISTERS_PART2
+ struct _gcsHAL_READ_ALL_PROFILE_REGISTERS_PART2
{
/* Context buffer object gckCONTEXT. Just a name. */
IN gctUINT32 context;
/* Data read. */
- OUT gcsPROFILER_NEW_COUNTERS_PART2 newCounters;
+ OUT gcsPROFILER_COUNTERS_PART2 Counters;
}
- RegisterProfileNewData_part2;
+ RegisterProfileData_part2;
/* gcvHAL_PROFILE_REGISTERS_2D */
struct _gcsHAL_PROFILE_REGISTERS_2D
@@ -1130,6 +1150,20 @@ typedef struct _gcsHAL_INTERFACE
}
GetFscaleValue;
+ /* gcvHAL_EXPORT_VIDEO_MEMORY */
+ struct _gcsHAL_EXPORT_VIDEO_MEMORY
+ {
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+
+ /* Export flags */
+ IN gctUINT32 flags;
+
+ /* Exported dma_buf fd */
+ OUT gctINT32 fd;
+ }
+ ExportVideoMemory;
+
struct _gcsHAL_NAME_VIDEO_MEMORY
{
IN gctUINT32 handle;
@@ -1194,6 +1228,21 @@ typedef struct _gcsHAL_INTERFACE
}
ShBuf;
+ struct _gcsHAL_GET_GRAPHIC_BUFFER_FD
+ {
+ /* Max 3 video nodes, node handle here. */
+ IN gctUINT32 node[3];
+
+ /* A shBuf. */
+ IN gctUINT64 shBuf;
+
+ /* A signal. */
+ IN gctUINT32 signal;
+
+ OUT gctINT32 fd;
+ }
+ GetGraphicBufferFd;
+
struct _gcsHAL_GET_VIDEO_MEMORY_FD
{
@@ -1282,6 +1331,8 @@ typedef struct _gcsHAL_INTERFACE
IN gceSURF_TYPE type;
}
BottomHalfUnlockVideoMemory;
+
+ gcsHAL_QUERY_CHIP_OPTIONS QueryChipOptions;
}
u;
}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h
new file mode 100644
index 000000000000..8e08290f7624
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2017 Vivante Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*
+*****************************************************************************
+*
+* The GPL License (GPL)
+*
+* Copyright (C) 2014 - 2017 Vivante Corporation
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*****************************************************************************
+*
+* Note: This software is released under dual MIT and GPL licenses. A
+* recipient may use this file under the terms of either the MIT license or
+* GPL License. If you wish to use only one license not the other, you can
+* indicate your decision by deleting one of the above license notices in your
+* version of this file.
+*
+*****************************************************************************/
+
+
+/*
+ * Copyright (C) 2015 Etnaviv Project
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GC_HAL_DRM_H__
+#define __GC_HAL_DRM_H__
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+enum VIV_GEM_PARAM {
+ VIV_GEM_PARAM_NODE = 0,
+ VIV_GEM_PARAM_POOL,
+ VIV_GEM_PARAM_SIZE,
+};
+
+struct drm_viv_gem_create {
+ __u64 size; /* in */
+ __u32 flags; /* in */
+ __u32 handle; /* out */
+};
+
+struct drm_viv_gem_lock {
+ __u32 handle;
+ __u32 cacheable;
+ __u32 gpu_va;
+ __u64 cpu_va;
+};
+
+struct drm_viv_gem_unlock {
+ __u32 handle;
+};
+
+struct drm_viv_gem_cache {
+ __u32 handle;
+ __u32 op;
+ __u64 logical;
+ __u64 bytes;
+};
+
+struct drm_viv_gem_getinfo {
+ __u32 handle;
+ __u32 param;
+ __u64 value;
+};
+
+#define DRM_VIV_GEM_CREATE 0x00
+#define DRM_VIV_GEM_LOCK 0x01
+#define DRM_VIV_GEM_UNLOCK 0x02
+#define DRM_VIV_GEM_CACHE 0x03
+#define DRM_VIV_GEM_GETINFO 0x04
+#define DRM_VIV_NUM_IOCTLS 0x05
+
+#define DRM_IOCTL_VIV_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_CREATE, struct drm_viv_gem_create)
+#define DRM_IOCTL_VIV_GEM_LOCK DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_LOCK, struct drm_viv_gem_lock)
+#define DRM_IOCTL_VIV_GEM_UNLOCK DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_UNLOCK, struct drm_viv_gem_unlock)
+#define DRM_IOCTL_VIV_GEM_CACHE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_CACHE, struct drm_viv_gem_cache)
+#define DRM_IOCTL_VIV_GEM_GETINFO DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_GETINFO, struct drm_viv_gem_getinfo)
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ETNAVIV_DRM_H__ */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h
index b7629819c31a..69693e6ace0c 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h
@@ -325,6 +325,7 @@ typedef enum _gceSPLIT_DRAW_TYPE
gcvSPLIT_DRAW_INDEX_FETCH,
gcvSPLIT_DRAW_TCS,
gcvSPLIT_DRAW_WIDE_LINE,
+ gcvSPLIT_DRAW_STIPPLE,
gcvSPLIT_DRAW_LAST
}
gceSPLIT_DRAW_TYPE;
@@ -532,12 +533,6 @@ gcoBUFOBJ_IsFenceEnabled(
);
gceSTATUS
-gcoSURF_SetSharedLock(
- IN gcoSURF Surface,
- IN gctPOINTER SharedLock
- );
-
-gceSTATUS
gcoSURF_GetFence(
IN gcoSURF Surface,
IN gceFENCE_TYPE Type
@@ -570,12 +565,6 @@ gcoINDEX_WaitFence(
);
gceSTATUS
-gcoINDEX_SetSharedLock(
- IN gcoINDEX Index,
- IN gctPOINTER SharedLock
- );
-
-gceSTATUS
gcoSURF_DrawBlit(
gcsSURF_VIEW *SrcView,
gcsSURF_VIEW *DstView,
@@ -2333,6 +2322,13 @@ gcoTEXTURE_IsComplete(
);
gceSTATUS
+gcoTEXTURE_CheckTexLevel0Attrib(
+ IN gcoTEXTURE Texture,
+ IN gctINT MaxLevel,
+ IN gctINT usedLevel
+ );
+
+gceSTATUS
gcoTEXTURE_BindTexture(
IN gcoTEXTURE Texture,
IN gctINT Target,
@@ -2426,12 +2422,6 @@ typedef enum _gceATTRIB_SCHEME
} gceATTRIB_SCHEME;
gceSTATUS
-gcoSTREAM_SetSharedLock(
- IN gcoSTREAM Stream,
- IN gctPOINTER sharedLock
- );
-
-gceSTATUS
gcoSTREAM_Construct(
IN gcoHAL Hal,
OUT gcoSTREAM * Stream
@@ -2463,12 +2453,6 @@ gcoSTREAM_SetStride(
);
gceSTATUS
-gcoSTREAM_Size(
- IN gcoSTREAM Stream,
- OUT gctSIZE_T *Size
- );
-
-gceSTATUS
gcoSTREAM_Node(
IN gcoSTREAM Stream,
OUT gcsSURF_NODE_PTR * Node
@@ -2497,14 +2481,6 @@ gcoSTREAM_Flush(
IN gcoSTREAM Stream
);
-/* Dynamic buffer API. */
-gceSTATUS
-gcoSTREAM_SetDynamic(
- IN gcoSTREAM Stream,
- IN gctSIZE_T Bytes,
- IN gctUINT Buffers
- );
-
typedef struct _gcsSTREAM_INFO
{
gctUINT index;
@@ -2518,15 +2494,6 @@ typedef struct _gcsSTREAM_INFO
gcsSTREAM_INFO, * gcsSTREAM_INFO_PTR;
gceSTATUS
-gcoSTREAM_UploadDynamic(
- IN gcoSTREAM Stream,
- IN gctUINT VertexCount,
- IN gctUINT InfoCount,
- IN gcsSTREAM_INFO_PTR Info,
- IN gcoVERTEX Vertex
- );
-
-gceSTATUS
gcoSTREAM_CPUCacheOperation(
IN gcoSTREAM Stream,
IN gceCACHEOPERATION Operation
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
index 08a651dfa79c..71e424bf7e12 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
@@ -148,6 +148,7 @@ typedef enum _gceFEATURE
gcvFEATURE_VG_FILTER,
gcvFEATURE_VG21,
gcvFEATURE_VG_DOUBLE_BUFFER,
+ gcvFEATURE_VG_RESOLUTION_8K,
gcvFEATURE_MC20,
gcvFEATURE_SUPER_TILED,
gcvFEATURE_FAST_CLEAR_FLUSH,
@@ -510,6 +511,9 @@ typedef enum _gceFEATURE
gcvFEATURE_ASYNC_FE_FENCE_FIX,
gcvFEATURE_PSCS_THROTTLE,
gcvFEATURE_WIDELINE_TRIANGLE_EMU,
+ gcvFEATURE_FENCE,
+ gcvFEATURE_PE_DEPTH_ONLY_OQFIX,
+
/* Insert features above this comment only. */
gcvFEATURE_COUNT /* Not a feature. */
}
@@ -559,6 +563,7 @@ typedef enum _gceOPTION
gcvOPTION_GPU_BUFOBJ_UPLOAD = 56,
gcvOPTION_OCL_ASYNC_BLT = 57,
gcvOPTION_OCL_IN_THREAD = 58,
+ gcvOPTION_COMPRESSION_DEC400 = 59,
/* Insert option above this comment only */
gcvOPTION_COUNT /* Not a OPTION*/
@@ -2080,6 +2085,24 @@ typedef enum _gceSECURE_MODE
}
gceSECURE_MODE;
+/* kernel driver compression option, as it's a system global option,
+** it means kernel driver allows the options, NOT necessarily means it must be on.
+*/
+typedef enum _gceCOMPRESSION_OPTION
+{
+ gcvCOMPRESSION_OPTION_NONE = 0x0, /* No any compression */
+ gcvCOMPRESSION_OPTION_COLOR = 0x1, /* Compression for non-msaa color format */
+ gcvCOMPRESSION_OPTION_DEPTH = 0x2, /* Compression for non-msaa depth format */
+ gcvCOMPRESSION_OPTION_MSAA_COLOR = 0x4, /* Compression for msaa color */
+ gcvCOMPRESSION_OPTION_MSAA_DEPTH = 0x8, /* Compression for msaa depth */
+
+ /* default compressio option */
+ gcvCOMPRESSION_OPTION_DEFAULT = gcvCOMPRESSION_OPTION_DEPTH |
+ gcvCOMPRESSION_OPTION_COLOR |
+ gcvCOMPRESSION_OPTION_MSAA_COLOR |
+ gcvCOMPRESSION_OPTION_MSAA_DEPTH,
+}
+gceCOMPRESSION_OPTION;
/* No special needs. */
#define gcvALLOC_FLAG_NONE 0x00000000
@@ -2093,6 +2116,9 @@ gceSECURE_MODE;
/* Physical non contiguous. */
#define gcvALLOC_FLAG_NON_CONTIGUOUS 0x00000008
+/* Do not try slow pools (gcvPOOL_VIRTUAL/gcvPOOL_CONTIGUOUS) */
+#define gcvALLOC_FLAG_FAST_POOLS 0x00000100
+
/* Import DMABUF. */
#define gcvALLOC_FLAG_DMABUF 0x00001000
/* Import USERMEMORY. */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
index dc018f961fdd..9e3c58a9dd5e 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
@@ -300,6 +300,9 @@ struct _gcoQUEUE
/* Number of records currently in queue */
gctUINT32 recordCount;
+ /* Max size of pending unlock node in vidmem pool not committed */
+ gctUINT maxUnlockBytes;
+
gceENGINE engine;
};
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h
index 9e62f99a6210..72815f618d7e 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h
@@ -82,7 +82,7 @@ This define enables the use of VM for gckCommand and fence buffers.
#if defined(UNDER_CE)
# define USE_KERNEL_VIRTUAL_BUFFERS 1
#else
-# define USE_KERNEL_VIRTUAL_BUFFERS 0
+# define USE_KERNEL_VIRTUAL_BUFFERS 1
#endif
#endif
@@ -214,6 +214,10 @@ This define enables the use of VM for gckCommand and fence buffers.
# define gcdDUMP_API 0
#endif
+#ifndef gcdDUMP_2DVG
+# define gcdDUMP_2DVG 0
+#endif
+
/*
gcdDUMP_AHB_ACCESS
@@ -382,7 +386,6 @@ This define enables the use of VM for gckCommand and fence buffers.
Set to 1 for infinite speed hardware.
Set to 2 for bypassing the HAL.
- Set to 3 for bypassing the drivers.
*/
#ifndef gcdNULL_DRIVER
# define gcdNULL_DRIVER 0
@@ -1386,7 +1389,8 @@ VIV:gcdUSE_MMU_EXCEPTION
Default is 0 which means 32bytes aligned.
*/
#ifndef gcd2D_COMPRESSION_DEC400_ALIGN_MODE
-# define gcd2D_COMPRESSION_DEC400_ALIGN_MODE 1
+# define gcd2D_COMPRESSION_DEC400_ALIGN_MODE 1
#endif
+
#endif /* __gc_hal_options_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
index 3415e040cecc..a811ad2e79e7 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
@@ -72,13 +72,6 @@ extern "C" {
#define GLBUFOBJ_OBJECT 40
#define GLBUFOBJ_OBJECT_BYTES 41
-#if VIVANTE_PROFILER
-#define gcmPROFILE_GC(Enum, Value) gcoPROFILER_Count(gcvNULL, Enum, Value)
-#else
-#define gcmPROFILE_GC(Enum, Value) do { } while (gcvFALSE)
-#endif
-
-
#define ES11_CALLS 151
#define ES11_DRAWCALLS (ES11_CALLS + 1)
#define ES11_STATECHANGECALLS (ES11_DRAWCALLS + 1)
@@ -546,6 +539,16 @@ extern "C" {
#define VPNC_MCCAXIMAXLATENCY (VPNG_MCC + 16)
#define VPNC_MCCAXITOTALLATENCY (VPNG_MCC + 17)
#define VPNC_MCCAXISAMPLECOUNT (VPNG_MCC + 18)
+#define VPNC_MCCFEREADBANDWIDTH (VPNG_MCC + 19)
+#define VPNC_MCCMMUREADBANDWIDTH (VPNG_MCC + 20)
+#define VPNC_MCCBLTREADBANDWIDTH (VPNG_MCC + 21)
+#define VPNC_MCCSH0READBANDWIDTH (VPNG_MCC + 22)
+#define VPNC_MCCSH1READBANDWIDTH (VPNG_MCC + 23)
+#define VPNC_MCCPEWRITEBANDWIDTH (VPNG_MCC + 24)
+#define VPNC_MCCBLTWRITEBANDWIDTH (VPNG_MCC + 25)
+#define VPNC_MCCSH0WRITEBANDWIDTH (VPNG_MCC + 26)
+#define VPNC_MCCSH1WRITEBANDWIDTH (VPNG_MCC + 27)
+
/* HW: MCZ Counters. */
#define VPNC_MCZREADREQ8BCOLORPIPE (VPNG_MCZ + 1)
@@ -658,6 +661,103 @@ extern "C" {
+ MODULE_GPUL2_CACHE_COUNTER_NUM)
+#ifdef ANDROID
+#define DEFAULT_PROFILE_FILE_NAME "/sdcard/vprofiler.vpd"
+#else
+#define DEFAULT_PROFILE_FILE_NAME "vprofiler.vpd"
+#endif
+
+#if gcdENDIAN_BIG
+#define BIG_ENDIAN_TRANS_INT(x) ((gctUINT32)( \
+ (((gctUINT32)(x) & (gctUINT32)0x000000FFUL) << 24) | \
+ (((gctUINT32)(x) & (gctUINT32)0x0000FF00UL) << 8) | \
+ (((gctUINT32)(x) & (gctUINT32)0x00FF0000UL) >> 8) | \
+ (((gctUINT32)(x) & (gctUINT32)0xFF000000UL) >> 24)))
+#else
+#define BIG_ENDIAN_TRANS_INT(x) x
+#endif
+
+/* Write a data value. */
+#define gcmWRITE_VALUE(IntData) \
+ do \
+ { \
+ gceSTATUS status; \
+ gctINT32 value = IntData; \
+ value = BIG_ENDIAN_TRANS_INT(value); \
+ gcmERR_BREAK(gcoPROFILER_Write(Profiler, gcmSIZEOF(value), &value)); \
+ } \
+ while (gcvFALSE)
+
+#define gcmWRITE_CONST(Const) \
+ do \
+ { \
+ gceSTATUS status; \
+ gctINT32 data = Const; \
+ data = BIG_ENDIAN_TRANS_INT(data); \
+ gcmERR_BREAK(gcoPROFILER_Write(Profiler, gcmSIZEOF(data), &data)); \
+ } \
+ while (gcvFALSE)
+
+#define gcmWRITE_COUNTER(Counter, Value) \
+ gcmWRITE_CONST(Counter); \
+ gcmWRITE_VALUE(Value)
+
+/* Write a string value (char*). */
+#define gcmWRITE_STRING(String) \
+ do \
+ { \
+ gceSTATUS status; \
+ gctINT32 length; \
+ length = (gctINT32) gcoOS_StrLen((gctSTRING)String, gcvNULL); \
+ length = BIG_ENDIAN_TRANS_INT(length); \
+ gcmERR_BREAK(gcoPROFILER_Write(Profiler, gcmSIZEOF(length), &length)); \
+ gcmERR_BREAK(gcoPROFILER_Write(Profiler, length, String)); \
+ } \
+ while (gcvFALSE)
+
+#define gcmWRITE_BUFFER(Size, Buffer) \
+ do \
+ { \
+ gceSTATUS status; \
+ gcmERR_BREAK(gcoPROFILER_Write(Profiler, Size, Buffer)); \
+ } \
+ while (gcvFALSE)
+
+#define gcmGET_COUNTER(counter, counterId) \
+ do \
+ { \
+ if ((gctUINT32)*(memory + counterId + offset) == 0xdeaddead) \
+ { \
+ counter = 0xdeaddead; \
+ } \
+ else \
+ { \
+ gctUINT64_PTR Memory = memory; \
+ Memory += TOTAL_PROBE_NUMBER * CoreId; \
+ counter = (gctUINT32)*(Memory + counterId + offset); \
+ } \
+ } \
+ while (gcvFALSE)
+
+#define gcmGET_LATENCY_COUNTER(minLatency, maxLatency, counterId) \
+ do \
+ { \
+ if ((gctUINT32)*(memory + counterId + offset) == 0xdeaddead) \
+ { \
+ minLatency = maxLatency = 0xdeaddead; \
+ } \
+ else \
+ { \
+ gctUINT64_PTR Memory = memory; \
+ Memory += TOTAL_PROBE_NUMBER * CoreId; \
+ maxLatency = (((gctUINT32)*(Memory + counterId + offset) & 0xfff000) >> 12); \
+ minLatency = ((gctUINT32)*(Memory + counterId + offset) & 0x000fff); \
+ if (minLatency == 4095) \
+ minLatency = 0; \
+ } \
+ } \
+ while (gcvFALSE)
+
typedef enum _gceCOUNTER
{
gcvCOUNTER_FRONT_END,
@@ -677,9 +777,20 @@ typedef enum _gceCOUNTER
}
gceCOUNTER;
+typedef enum _gceProfilerClient
+{
+ gcvCLIENT_OPENGLES11 = 1,
+ gcvCLIENT_OPENGLES,
+ gcvCLIENT_OPENGL,
+ gcvCLIENT_OPENVG,
+ gcvCLIENT_OPENCL,
+ gcvCLIENT_OPENVX,
+ gcvCLIENT_OPENVK,
+}
+gceProfilerClient;
/* HW profile information. */
-typedef struct _gcsPROFILER_NEW_COUNTERS_PART1
+typedef struct _gcsPROFILER_COUNTERS_PART1
{
gctUINT32 gpuTotalRead64BytesPerFrame;
gctUINT32 gpuTotalWrite64BytesPerFrame;
@@ -785,9 +896,9 @@ typedef struct _gcsPROFILER_NEW_COUNTERS_PART1
gctUINT32 tx_stall_count;
gctUINT32 tx_process_count;
}
-gcsPROFILER_NEW_COUNTERS_PART1;
+gcsPROFILER_COUNTERS_PART1;
-typedef struct _gcsPROFILER_NEW_COUNTERS_PART2
+typedef struct _gcsPROFILER_COUNTERS_PART2
{
/* MCC */
gctUINT32 mcc_total_read_req_8B_from_colorpipe;
@@ -808,6 +919,15 @@ typedef struct _gcsPROFILER_NEW_COUNTERS_PART2
gctUINT32 mcc_axi_sample_count;
gctUINT32 mcc_axi_max_latency;
gctUINT32 mcc_axi_min_latency;
+ gctUINT32 mc_fe_read_bandwidth;
+ gctUINT32 mc_mmu_read_bandwidth;
+ gctUINT32 mc_blt_read_bandwidth;
+ gctUINT32 mc_sh0_read_bandwidth;
+ gctUINT32 mc_sh1_read_bandwidth;
+ gctUINT32 mc_pe_write_bandwidth;
+ gctUINT32 mc_blt_write_bandwidth;
+ gctUINT32 mc_sh0_write_bandwidth;
+ gctUINT32 mc_sh1_write_bandwidth;
/* MCZ */
gctUINT32 mcz_total_read_req_8B_from_colorpipe;
@@ -869,134 +989,16 @@ typedef struct _gcsPROFILER_NEW_COUNTERS_PART2
gctUINT32 l2_axi1_total_latency;
gctUINT32 l2_axi1_total_request_count;
}
-gcsPROFILER_NEW_COUNTERS_PART2;
-
-typedef struct _gcsPROFILER_NEW_COUNTERS
-{
- gctUINT32 drawID;
- gcsPROFILER_NEW_COUNTERS_PART1 counters_part1;
- gcsPROFILER_NEW_COUNTERS_PART2 counters_part2;
-}
-gcsPROFILER_NEW_COUNTERS;
+gcsPROFILER_COUNTERS_PART2;
typedef struct _gcsPROFILER_COUNTERS
{
- /* HW static counters. */
- gctUINT32 gpuClock;
- gctUINT32 axiClock;
- gctUINT32 shaderClock;
-
- /* HW vairable counters. */
- gctUINT32 gpuClockStart;
- gctUINT32 gpuClockEnd;
-
- /* HW vairable counters. */
- gctUINT32 gpuCyclesCounter;
- gctUINT32 gpuTotalCyclesCounter;
- gctUINT32 gpuIdleCyclesCounter;
- gctUINT32 gpuTotalRead64BytesPerFrame;
- gctUINT32 gpuTotalWrite64BytesPerFrame;
-
- /* PE */
- gctUINT32 pe_pixel_count_killed_by_color_pipe;
- gctUINT32 pe_pixel_count_killed_by_depth_pipe;
- gctUINT32 pe_pixel_count_drawn_by_color_pipe;
- gctUINT32 pe_pixel_count_drawn_by_depth_pipe;
-
- /* SH */
- gctUINT32 ps_inst_counter;
- gctUINT32 rendered_pixel_counter;
- gctUINT32 vs_inst_counter;
- gctUINT32 rendered_vertice_counter;
- gctUINT32 vtx_branch_inst_counter;
- gctUINT32 vtx_texld_inst_counter;
- gctUINT32 pxl_branch_inst_counter;
- gctUINT32 pxl_texld_inst_counter;
- gctUINT32 vs_non_idle_starve_count;
- gctUINT32 vs_starve_count;
- gctUINT32 vs_stall_count;
- gctUINT32 vs_process_count;
- gctUINT32 ps_non_idle_starve_count;
- gctUINT32 ps_starve_count;
- gctUINT32 ps_stall_count;
- gctUINT32 ps_process_count;
- gctUINT32 shader_cycle_count;
-
- /* PA */
- gctUINT32 pa_input_vtx_counter;
- gctUINT32 pa_input_prim_counter;
- gctUINT32 pa_output_prim_counter;
- gctUINT32 pa_depth_clipped_counter;
- gctUINT32 pa_trivial_rejected_counter;
- gctUINT32 pa_culled_counter;
- gctUINT32 pa_non_idle_starve_count;
- gctUINT32 pa_starve_count;
- gctUINT32 pa_stall_count;
- gctUINT32 pa_process_count;
-
- /* SE */
- gctUINT32 se_culled_triangle_count;
- gctUINT32 se_culled_lines_count;
- gctUINT32 se_starve_count;
- gctUINT32 se_stall_count;
- gctUINT32 se_receive_triangle_count;
- gctUINT32 se_send_triangle_count;
- gctUINT32 se_receive_lines_count;
- gctUINT32 se_send_lines_count;
- gctUINT32 se_process_count;
- gctUINT32 se_non_idle_starve_count;
-
- /* RA */
- gctUINT32 ra_valid_pixel_count;
- gctUINT32 ra_total_quad_count;
- gctUINT32 ra_valid_quad_count_after_early_z;
- gctUINT32 ra_total_primitive_count;
- gctUINT32 ra_pipe_cache_miss_counter;
- gctUINT32 ra_prefetch_cache_miss_counter;
- gctUINT32 ra_eez_culled_counter;
- gctUINT32 ra_non_idle_starve_count;
- gctUINT32 ra_starve_count;
- gctUINT32 ra_stall_count;
- gctUINT32 ra_process_count;
-
- /* TX */
- gctUINT32 tx_total_bilinear_requests;
- gctUINT32 tx_total_trilinear_requests;
- gctUINT32 tx_total_discarded_texture_requests;
- gctUINT32 tx_total_texture_requests;
- gctUINT32 tx_mem_read_count;
- gctUINT32 tx_mem_read_in_8B_count;
- gctUINT32 tx_cache_miss_count;
- gctUINT32 tx_cache_hit_texel_count;
- gctUINT32 tx_cache_miss_texel_count;
- gctUINT32 tx_non_idle_starve_count;
- gctUINT32 tx_starve_count;
- gctUINT32 tx_stall_count;
- gctUINT32 tx_process_count;
-
- /* MC */
- gctUINT32 mc_total_read_req_8B_from_pipeline;
- gctUINT32 mc_total_read_req_8B_from_IP;
- gctUINT32 mc_total_write_req_8B_from_pipeline;
- gctUINT32 mc_axi_total_latency;
- gctUINT32 mc_axi_sample_count;
- gctUINT32 mc_axi_max_latency;
- gctUINT32 mc_axi_min_latency;
-
- /* HI */
- gctUINT32 hi_axi_cycles_read_request_stalled;
- gctUINT32 hi_axi_cycles_write_request_stalled;
- gctUINT32 hi_axi_cycles_write_data_stalled;
-
- /* FE */
- gctUINT32 fe_draw_count;
- gctUINT32 fe_out_vertex_count;
- gctUINT32 fe_stall_count;
- gctUINT32 fe_starve_count;
+ gcsPROFILER_COUNTERS_PART1 counters_part1;
+ gcsPROFILER_COUNTERS_PART2 counters_part2;
}
gcsPROFILER_COUNTERS;
-#define NumOfDrawBuf 1024
+#define NumOfDrawBuf 128
typedef enum _gceCOUNTER_OPTYPE
{
@@ -1005,24 +1007,18 @@ typedef enum _gceCOUNTER_OPTYPE
gcvCOUNTER_OP_COMPUTE = 2,
gcvCOUNTER_OP_RS = 3,
gcvCOUNTER_OP_FINISH = 4,
- gcvCOUNTER_OP_NONE = 5
+ gcvCOUNTER_OP_FRAME = 5,
+ gcvCOUNTER_OP_NONE = 6
}
gceCOUNTER_OPTYPE;
-typedef struct _gcsPROBEBUFFER
-{
- gctHANDLE newCounterBuf[NumOfDrawBuf];
- gctUINT32 curBufId;
- gceCOUNTER_OPTYPE opType[NumOfDrawBuf];
-}
-gcsPROBEBUFFER;
-
typedef struct _gcsCounterBuffer
{
- gcsPROFILER_NEW_COUNTERS counters;
+ gcsPROFILER_COUNTERS *counters;
gctHANDLE couterBufobj;
gctUINT32 probeAddress;
gceCOUNTER_OPTYPE opType;
+ gctUINT32 opID;
}
gcsCounterBuffer;
@@ -1031,17 +1027,23 @@ typedef struct _gcoPROFILER * gcoPROFILER;
struct _gcoPROFILER
{
gctBOOL enable;
- gctBOOL isSyncMode;
+ gctBOOL enablePrint;
+ gctBOOL disableProbe;
+ gctBOOL probeMode;
gctFILE file;
gctCHAR* fileName;
gcsCounterBuffer counterBuf[NumOfDrawBuf];
+ gcsPROFILER_COUNTERS *preCounters;
gctINT32 curBufId;
gctBOOL perDrawMode;
gctBOOL needDump;
gctBOOL counterEnable;
+
+ gceProfilerClient profilerClient;
+ gctUINT32 coreCount;
};
typedef enum _gceProbeStatus
@@ -1067,231 +1069,51 @@ typedef struct _gcsPROBESTATES
gctUINT32 probeAddress;
}gcsPROBESTATES;
-/* HAL profile information. */
-typedef struct _gcsPROFILER
-{
- gctUINT32 enable;
- gctBOOL enableHal;
- gctBOOL enableHW;
- gctBOOL enableSH;
- gctBOOL isSyncMode;
- gctBOOL isCLMode;
- gctBOOL enablePrint;
- gctBOOL disableOutputCounter;
-
- gctBOOL useSocket;
- gctINT sockFd;
-
- gctFILE file;
-
- /* Aggregate Information */
-
- /* Clock Info */
- gctUINT64 frameStart;
- gctUINT64 frameEnd;
-
- /* Current frame information */
- gctUINT32 frameNumber;
- gctUINT64 frameStartTimeusec;
- gctUINT64 frameEndTimeusec;
- gctUINT64 frameStartCPUTimeusec;
- gctUINT64 frameEndCPUTimeusec;
-
-#if PROFILE_HAL_COUNTERS
- gctUINT32 vertexBufferTotalBytesAlloc;
- gctUINT32 vertexBufferNewBytesAlloc;
- int vertexBufferTotalObjectsAlloc;
- int vertexBufferNewObjectsAlloc;
-
- gctUINT32 indexBufferTotalBytesAlloc;
- gctUINT32 indexBufferNewBytesAlloc;
- int indexBufferTotalObjectsAlloc;
- int indexBufferNewObjectsAlloc;
-
- gctUINT32 textureBufferTotalBytesAlloc;
- gctUINT32 textureBufferNewBytesAlloc;
- int textureBufferTotalObjectsAlloc;
- int textureBufferNewObjectsAlloc;
-
- gctUINT32 numCommits;
- gctUINT32 drawPointCount;
- gctUINT32 drawLineCount;
- gctUINT32 drawTriangleCount;
- gctUINT32 drawVertexCount;
- gctUINT32 redundantStateChangeCalls;
-#endif
-}
-gcsPROFILER;
-
-/* Memory profile information. */
-struct _gcsMemProfile
-{
- /* Memory Usage */
- gctUINT32 videoMemUsed;
- gctUINT32 systemMemUsed;
- gctUINT32 commitBufferSize;
- gctUINT32 contextBufferCopyBytes;
-};
-
-/* Shader profile information. */
-struct _gcsSHADER_PROFILER
-{
- gctUINT32 shaderLength;
- gctUINT32 shaderALUCycles;
- gctUINT32 shaderTexLoadCycles;
- gctUINT32 shaderTempRegCount;
- gctUINT32 shaderSamplerRegCount;
- gctUINT32 shaderInputRegCount;
- gctUINT32 shaderOutputRegCount;
-};
-
/* Construct a Profiler object per context. */
gceSTATUS
-gcoPROFILER_NEW_Construct(
+gcoPROFILER_Construct(
OUT gcoPROFILER * Profiler
);
gceSTATUS
-gcoPROFILER_NEW_Destroy(
+gcoPROFILER_Destroy(
IN gcoPROFILER Profiler
);
gceSTATUS
-gcoPROFILER_NEW_Enable(
+gcoPROFILER_Enable(
IN gcoPROFILER Profiler
);
gceSTATUS
-gcoPROFILER_NEW_Disable(
+gcoPROFILER_Disable(
void
-);
-
-gceSTATUS
-gcoPROFILER_NEW_Begin(
- IN gcoPROFILER Profiler,
- IN gceCOUNTER_OPTYPE operationType
- );
-
-gceSTATUS
-gcoPROFILER_NEW_End(
- IN gcoPROFILER Profiler,
- IN gctUINT32 DrawID,
- IN gceCOUNTER_OPTYPE Type
- );
-
-gceSTATUS
-gcoPROFILER_NEW_EndFrame(
- IN gcoPROFILER Profiler,
- IN gceCOUNTER_OPTYPE Type
- );
-
-gceSTATUS
-gcoPROFILER_NEW_RecordCounters(
- IN gctPOINTER Logical,
- OUT gcsPROFILER_NEW_COUNTERS * Counters
- );
-
-gceSTATUS
-gcoPROFILER_NEW_WriteCounters(
- IN gcoPROFILER Profiler,
- IN gcsPROFILER_NEW_COUNTERS Counters,
- IN gceCOUNTER_OPTYPE opType
- );
-
-gceSTATUS
-gcoPROFILER_NEW_Write(
- IN gcoPROFILER Profiler,
- IN gctSIZE_T ByteCount,
- IN gctCONST_POINTER Data
);
gceSTATUS
-gcoPROFILER_NEW_GetPos(
+gcoPROFILER_Begin(
IN gcoPROFILER Profiler,
- OUT gctUINT32 * Position
+ IN gceCOUNTER_OPTYPE operationType
);
gceSTATUS
-gcoPROFILER_NEW_Seek(
+gcoPROFILER_End(
IN gcoPROFILER Profiler,
- IN gctUINT32 Offset,
- IN gceFILE_WHENCE Whence
+ IN gceCOUNTER_OPTYPE operationType,
+ IN gctUINT32 OpID
);
gceSTATUS
-gcoPROFILER_NEW_Flush(
- IN gcoPROFILER Profiler
- );
-
-/* Initialize the gcsProfiler. */
-gceSTATUS
-gcoPROFILER_Initialize(
- IN gcoHAL Hal,
- IN gco3D Engine,
- IN gctBOOL Enable
- );
-
-/* Destroy the gcProfiler. */
-gceSTATUS
-gcoPROFILER_Destroy(
- IN gcoHAL Hal
- );
-
-/* Write data to profiler. */
-gceSTATUS
gcoPROFILER_Write(
- IN gcoHAL Hal,
+ IN gcoPROFILER Profiler,
IN gctSIZE_T ByteCount,
IN gctCONST_POINTER Data
);
-/* Flush data out. */
gceSTATUS
gcoPROFILER_Flush(
- IN gcoHAL Hal
- );
-
-/* Call to signal end of frame. */
-gceSTATUS
-gcoPROFILER_EndFrame(
- IN gcoHAL Hal
- );
-
-gceSTATUS
-gcoPROFILER_Begin(
- IN gcoHAL Hal,
- IN gceCOUNTER_OPTYPE operationType
- );
-
-/* Call to signal end of draw. */
-gceSTATUS
-gcoPROFILER_End(
- IN gcoHAL Hal,
- IN gctBOOL FirstDraw
- );
-
-/* Increase profile counter Enum by Value. */
-gceSTATUS
-gcoPROFILER_Count(
- IN gcoHAL Hal,
- IN gctUINT32 Enum,
- IN gctINT Value
- );
-
-/* Profile input vertex shader. */
-gceSTATUS
-gcoPROFILER_ShaderVS(
- IN gcoHAL Hal,
- IN gctPOINTER Vs
- );
-
-/* Profile input fragment shader. */
-gceSTATUS
-gcoPROFILER_ShaderFS(
- IN gcoHAL Hal,
- IN gctPOINTER Fs
+ IN gcoPROFILER Profiler
);
-
#ifdef __cplusplus
}
#endif
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h
index f5237cbb935e..e9c02f9452ca 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h
@@ -60,10 +60,10 @@
#define gcvVERSION_MINOR 2
-#define gcvVERSION_PATCH 3
+#define gcvVERSION_PATCH 4
-#define gcvVERSION_BUILD 129602
+#define gcvVERSION_BUILD 136949
-#define gcvVERSION_STRING "6.2.3.129602"
+#define gcvVERSION_STRING "6.2.4.pre6.136949"
#endif /* __gc_hal_version_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h
index 5914d159c030..aa6ad711e1e9 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h
@@ -467,6 +467,7 @@ gckVGHARDWARE_QueryChipIdentity(
OUT gctUINT32* ChipRevision,
OUT gctUINT32* ProductID,
OUT gctUINT32* EcoID,
+ OUT gctUINT32* CustomerID,
OUT gctUINT32* ChipFeatures,
OUT gctUINT32* ChipMinorFeatures,
OUT gctUINT32* ChipMinorFeatures1
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c
index 8d456e98d212..fd5721ee49c6 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c
@@ -216,6 +216,71 @@ OnError:
return status;
}
+static gceSTATUS
+_DmaGetSGT(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *SGT
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
+ struct page ** pages = gcvNULL;
+ struct page * page = gcvNULL;
+ struct sg_table *sgt = NULL;
+ struct mdl_dma_priv *mdlPriv = (struct mdl_dma_priv*)Mdl->priv;
+
+ gceSTATUS status = gcvSTATUS_OK;
+ gctSIZE_T offset = Offset & ~PAGE_MASK; /* Offset to the first page */
+ gctINT skipPages = Offset >> PAGE_SHIFT; /* skipped pages */
+ gctINT numPages = (PAGE_ALIGN(Offset + Bytes) >> PAGE_SHIFT) - skipPages;
+ gctINT i;
+
+ gcmkASSERT(Offset + Bytes <= Mdl->numPages << PAGE_SHIFT);
+
+ sgt = kmalloc(sizeof(struct sg_table), GFP_KERNEL | gcdNOWARN);
+ if (!sgt)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ pages = kmalloc(sizeof(struct page*) * numPages, GFP_KERNEL | gcdNOWARN);
+ if (!pages)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ page = virt_to_page(mdlPriv->kvaddr);
+ for (i = 0; i < numPages; ++i)
+ {
+ pages[i] = nth_page(page, i + skipPages);
+ }
+
+ if (sg_alloc_table_from_pages(sgt, pages, numPages, offset, Bytes, GFP_KERNEL) < 0)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ *SGT = (gctPOINTER)sgt;
+
+OnError:
+ if (pages)
+ {
+ kfree(pages);
+ }
+
+ if (gcmIS_ERROR(status) && sgt)
+ {
+ kfree(sgt);
+ }
+
+ return status;
+#else
+ return gcvSTATUS_NOT_SUPPORTED;
+#endif
+}
+
static void
_DmaFree(
IN gckALLOCATOR Allocator,
@@ -240,113 +305,50 @@ _DmaFree(
atomic_sub(Mdl->numPages, &allocatorPriv->usage);
}
-static gctINT
-_DmaMapUser(
- gckALLOCATOR Allocator,
- PLINUX_MDL Mdl,
- gctBOOL Cacheable,
- OUT gctPOINTER * UserLogical
+static gceSTATUS
+_DmaMmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT struct vm_area_struct *vma
)
{
+ struct mdl_dma_priv *mdlPriv = (struct mdl_dma_priv*)Mdl->priv;
+ gceSTATUS status = gcvSTATUS_OK;
- PLINUX_MDL mdl = Mdl;
- struct mdl_dma_priv *mdlPriv=(struct mdl_dma_priv *)Mdl->priv;
- struct vm_area_struct * vma;
- gctPOINTER userLogical = gcvNULL;
-
- gcmkHEADER_ARG("Allocator=%p Mdl=%p Cacheable=%d", Allocator, Mdl, Cacheable);
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
- userLogical = (gctSTRING)vm_mmap(gcvNULL,
- 0L,
- mdl->numPages * PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- 0);
-#else
- down_write(&current->mm->mmap_sem);
-
- userLogical = (gctSTRING)do_mmap_pgoff(gcvNULL,
- 0L,
- mdl->numPages * PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- 0);
-
- up_write(&current->mm->mmap_sem);
-#endif
-
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): vmaAddr->%p for phys_addr->%p",
- __FUNCTION__, __LINE__, userLogical, mdl
- );
-
- if (IS_ERR(userLogical))
- {
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): do_mmap_pgoff error",
- __FUNCTION__, __LINE__
- );
-
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
- }
-
- down_write(&current->mm->mmap_sem);
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma);
- vma = find_vma(current->mm, (unsigned long)userLogical);
-
- if (vma == gcvNULL)
- {
- up_write(&current->mm->mmap_sem);
-
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): find_vma error",
- __FUNCTION__, __LINE__
- );
-
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_RESOURCES);
- return gcvSTATUS_OUT_OF_RESOURCES;
- }
+ gcmkASSERT(skipPages + numPages <= Mdl->numPages);
/* map kernel memory to user space.. */
#if defined CONFIG_MIPS || defined CONFIG_CPU_CSKYV2 || defined CONFIG_PPC
if (remap_pfn_range(
vma,
vma->vm_start,
- mdlPriv->dmaHandle >> PAGE_SHIFT,
- mdl->numPages * PAGE_SIZE,
+ (mdlPriv->dmaHandle >> PAGE_SHIFT) + skipPages,
+ numPages << PAGE_SHIFT,
gcmkNONPAGED_MEMROY_PROT(vma->vm_page_prot)) < 0)
#else
/* map kernel memory to user space.. */
if (dma_mmap_writecombine(gcvNULL,
vma,
- mdlPriv->kvaddr,
- mdlPriv->dmaHandle,
- mdl->numPages * PAGE_SIZE) < 0)
+ (gctINT8_PTR)mdlPriv->kvaddr + (skipPages << PAGE_SHIFT),
+ mdlPriv->dmaHandle + (skipPages << PAGE_SHIFT),
+ numPages << PAGE_SHIFT) < 0)
#endif
{
- up_write(&current->mm->mmap_sem);
-
gcmkTRACE_ZONE(
gcvLEVEL_WARNING, gcvZONE_OS,
"%s(%d): dma_mmap_attrs error",
__FUNCTION__, __LINE__
);
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
+ status = gcvSTATUS_OUT_OF_MEMORY;
}
- up_write(&current->mm->mmap_sem);
-
- *UserLogical = userLogical;
-
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
+ gcmkFOOTER();
+ return status;
}
static void
@@ -387,6 +389,87 @@ _DmaUnmapUser(
}
static gceSTATUS
+_DmaMapUser(
+ gckALLOCATOR Allocator,
+ PLINUX_MDL Mdl,
+ gctBOOL Cacheable,
+ OUT gctPOINTER * UserLogical
+ )
+{
+ gctPOINTER userLogical = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p Cacheable=%d", Allocator, Mdl, Cacheable);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
+ userLogical = (gctPOINTER)vm_mmap(gcvNULL,
+ 0L,
+ Mdl->numPages * PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED,
+ 0);
+#else
+ down_write(&current->mm->mmap_sem);
+ userLogical = (gctPOINTER)do_mmap_pgoff(gcvNULL,
+ 0L,
+ Mdl->numPages * PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED,
+ 0);
+ up_write(&current->mm->mmap_sem);
+#endif
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): vmaAddr->%p for phys_addr->%p",
+ __FUNCTION__, __LINE__, userLogical, Mdl
+ );
+
+ if (IS_ERR(userLogical))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): do_mmap_pgoff error",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ down_write(&current->mm->mmap_sem);
+ do
+ {
+ struct vm_area_struct *vma = find_vma(current->mm, (unsigned long)userLogical);
+ if (vma == gcvNULL)
+ {
+ up_write(&current->mm->mmap_sem);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): find_vma error",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ gcmkERR_BREAK(_DmaMmap(Allocator, Mdl, 0, Mdl->numPages, vma));
+
+ *UserLogical = userLogical;
+ }
+ while (gcvFALSE);
+ up_write(&current->mm->mmap_sem);
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ _DmaUnmapUser(Allocator, Mdl, userLogical, Mdl->numPages * PAGE_SIZE);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
_DmaMapKernel(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
@@ -455,12 +538,14 @@ _DmaAllocatorDestructor(
gcsALLOCATOR_OPERATIONS DmaAllocatorOperations = {
.Alloc = _DmaAlloc,
.Free = _DmaFree,
+ .Mmap = _DmaMmap,
.MapUser = _DmaMapUser,
.UnmapUser = _DmaUnmapUser,
.MapKernel = _DmaMapKernel,
.UnmapKernel = _DmaUnmapKernel,
.Cache = _DmaCache,
.Physical = _DmaPhysical,
+ .GetSGT = _DmaGetSGT,
};
/* Default allocator entry. */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c
index 7eb2a84d4b40..49f0a30217ff 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c
@@ -76,7 +76,6 @@ typedef struct _gcsDMABUF
struct dma_buf_attachment * attachment;
struct sg_table * sgtable;
unsigned long * pagearray;
- int fd;
int npages;
int pid;
@@ -132,9 +131,9 @@ static int dma_buf_info_show(struct seq_file* m, void* data)
exp_name = "unknown";
#endif
- seq_printf(m, "%6d %6d %8d %8zu %10s",
+ seq_printf(m, "%6d %p %8d %8zu %10s",
buf_desc->pid,
- buf_desc->fd,
+ buf_desc->dmabuf,
buf_desc->npages,
buf_obj->size,
exp_name);
@@ -204,9 +203,7 @@ _DmabufAttach(
gckOS os = Allocator->os;
- int fd = (int) Desc->dmaBuf.fd;
-
- struct dma_buf *dmabuf = NULL;
+ struct dma_buf *dmabuf = Desc->dmaBuf.dmabuf;
struct sg_table *sgt = NULL;
struct dma_buf_attachment *attachment = NULL;
int npages = 0;
@@ -220,14 +217,12 @@ _DmabufAttach(
gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
- /* Import dma buf handle. */
- dmabuf = dma_buf_get(fd);
-
if (!dmabuf)
{
gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
}
+ get_dma_buf(dmabuf);
attachment = dma_buf_attach(dmabuf, &os->device->platform->device->dev);
if (!attachment)
@@ -264,7 +259,6 @@ _DmabufAttach(
/* Prepare descriptor. */
gcmkONERROR(gckOS_Allocate(os, sizeof(gcsDMABUF), (gctPOINTER *)&buf_desc));
- buf_desc->fd = fd;
buf_desc->dmabuf = dmabuf;
buf_desc->pagearray = pagearray;
buf_desc->attachment = attachment;
@@ -324,7 +318,28 @@ _DmabufFree(
gckOS_Free(os, buf_desc);
}
-static gctINT
+static void
+_DmabufUnmapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Size
+ )
+{
+ gcsDMABUF *buf_desc = Mdl->priv;
+ gctINT8_PTR userLogical = Logical;
+
+ if (unlikely(current->mm == gcvNULL))
+ {
+ /* Do nothing if process is exiting. */
+ return;
+ }
+
+ userLogical -= buf_desc->sgtable->sgl->offset;
+ vm_munmap((unsigned long)userLogical, Mdl->numPages >> PAGE_SHIFT);
+}
+
+static gceSTATUS
_DmabufMapUser(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
@@ -333,52 +348,39 @@ _DmabufMapUser(
)
{
gcsDMABUF *buf_desc = Mdl->priv;
- gceSTATUS status;
- PLINUX_MDL mdl = Mdl;
- struct file * file = buf_desc->dmabuf->file;
+ gctINT8_PTR userLogical = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
- *UserLogical = (gctSTRING)vm_mmap(file,
+ userLogical = (gctINT8_PTR)vm_mmap(buf_desc->dmabuf->file,
0L,
- mdl->numPages * PAGE_SIZE,
+ Mdl->numPages << PAGE_SHIFT,
PROT_READ | PROT_WRITE,
MAP_SHARED,
0);
- if (IS_ERR(*UserLogical))
+ if (IS_ERR(userLogical))
{
gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
}
+ userLogical += buf_desc->sgtable->sgl->offset;
/* To make sure the mapping is created. */
- if (access_ok(VERIFY_READ, *UserLogical, 4))
+ if (access_ok(VERIFY_READ, userLogical, 4))
{
uint32_t mem;
- get_user(mem, (uint32_t *) *UserLogical);
+ get_user(mem, (uint32_t *)userLogical);
- (void) mem;
+ (void)mem;
}
- return gcvSTATUS_OK;
+ *UserLogical = (gctPOINTER)userLogical;
OnError:
- return status;
-}
-
-static void
-_DmabufUnmapUser(
- IN gckALLOCATOR Allocator,
- IN PLINUX_MDL Mdl,
- IN gctPOINTER Logical,
- IN gctUINT32 Size
- )
-{
- if (unlikely(current->mm == gcvNULL))
+ if (gcmIS_ERROR(status))
{
- /* Do nothing if process is exiting. */
- return;
+ _DmabufUnmapUser(Allocator, Mdl, *UserLogical, Mdl->numPages >> PAGE_SHIFT);
}
-
- vm_munmap((unsigned long)Logical, Size);
+ return status;
}
static gceSTATUS
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c
index 7242e20fb223..cdf267e840df 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c
@@ -260,80 +260,6 @@ _NonContiguousAlloc(
return pages;
}
-static gceSTATUS
-gfp_mmap_internal(
- IN struct gfp_mdl_priv *MdlPriv,
- IN struct vm_area_struct *vma
- )
-{
- gcsPLATFORM * platform = MdlPriv->platform;
- gctUINT32 numPages;
- unsigned long start;
- unsigned long pfn;
- gctINT i;
-
- gcmkHEADER_ARG("MdlPriv=%p vma=%p", MdlPriv, vma);
-
- vma->vm_flags |= gcdVM_FLAGS;
-
- if (MdlPriv->cacheable == gcvFALSE)
- {
- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
- }
-
- if (platform && platform->ops->adjustProt)
- {
- platform->ops->adjustProt(vma);
- }
-
- numPages = (vma->vm_end - vma->vm_start) / PAGE_SIZE;
-
- /* Now map all the vmalloc pages to this user address. */
- if (MdlPriv->contiguous)
- {
- /* map kernel memory to user space.. */
- if (remap_pfn_range(vma,
- vma->vm_start,
- page_to_pfn(MdlPriv->contiguousPages),
- vma->vm_end - vma->vm_start,
- vma->vm_page_prot) < 0)
- {
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): unable to mmap ret",
- __FUNCTION__, __LINE__
- );
-
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
- }
- }
- else
- {
- start = vma->vm_start;
-
- for (i = 0; i < numPages; i++)
- {
- pfn = page_to_pfn(MdlPriv->nonContiguousPages[i]);
-
- if (remap_pfn_range(vma,
- start,
- pfn,
- PAGE_SIZE,
- vma->vm_page_prot) < 0)
- {
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
- }
-
- start += PAGE_SIZE;
- }
- }
-
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-}
-
/***************************************************************************\
************************ GFP Allocator **********************************
\***************************************************************************/
@@ -507,6 +433,77 @@ OnError:
return status;
}
+static gceSTATUS
+_GFPGetSGT(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *SGT
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
+ struct page ** pages = gcvNULL;
+ struct page ** tmpPages = gcvNULL;
+ struct sg_table *sgt = NULL;
+ struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv;
+
+ gceSTATUS status = gcvSTATUS_OK;
+ gctSIZE_T offset = Offset & ~PAGE_MASK; /* Offset to the first page */
+ gctINT skipPages = Offset >> PAGE_SHIFT; /* skipped pages */
+ gctINT numPages = (PAGE_ALIGN(Offset + Bytes) >> PAGE_SHIFT) - skipPages;
+ gctINT i;
+
+ gcmkASSERT(Offset + Bytes <= Mdl->numPages << PAGE_SHIFT);
+
+ if (Mdl->contiguous)
+ {
+ pages = tmpPages = kmalloc(sizeof(struct page*) * numPages, GFP_KERNEL | gcdNOWARN);
+ if (!pages)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ for (i = 0; i < numPages; ++i)
+ {
+ pages[i] = nth_page(mdlPriv->contiguousPages, i + skipPages);
+ }
+ }
+ else
+ {
+ pages = &mdlPriv->nonContiguousPages[skipPages];
+ }
+
+ sgt = kmalloc(sizeof(struct sg_table), GFP_KERNEL | gcdNOWARN);
+ if (!sgt)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ if (sg_alloc_table_from_pages(sgt, pages, numPages, offset, Bytes, GFP_KERNEL) < 0)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ *SGT = (gctPOINTER)sgt;
+
+OnError:
+ if (tmpPages)
+ {
+ kfree(tmpPages);
+ }
+
+ if (gcmIS_ERROR(status) && sgt)
+ {
+ kfree(sgt);
+ }
+
+ return status;
+#else
+ return gcvSTATUS_NOT_SUPPORTED;
+#endif
+}
+
static void
_GFPFree(
IN gckALLOCATOR Allocator,
@@ -578,7 +575,128 @@ _GFPFree(
gcmkOS_SAFE_FREE(Allocator->os, Mdl->priv);
}
-static gctINT
+static gceSTATUS
+_GFPMmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT struct vm_area_struct *vma
+ )
+{
+ struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv;
+ gcsPLATFORM *platform = mdlPriv->platform;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma);
+
+ vma->vm_flags |= gcdVM_FLAGS;
+ if (mdlPriv->cacheable == gcvFALSE)
+ {
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+ }
+
+ if (platform && platform->ops->adjustProt)
+ {
+ platform->ops->adjustProt(vma);
+ }
+
+ gcmkASSERT(skipPages + numPages <= Mdl->numPages);
+
+ /* Now map all the vmalloc pages to this user address. */
+ if (mdlPriv->contiguous)
+ {
+ /* map kernel memory to user space.. */
+ if (remap_pfn_range(vma,
+ vma->vm_start,
+ page_to_pfn(mdlPriv->contiguousPages) + skipPages,
+ numPages << PAGE_SHIFT,
+ vma->vm_page_prot) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): remap_pfn_range error.",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+ else
+ {
+ gctUINT i;
+ unsigned long start = vma->vm_start;
+
+ for (i = 0; i < numPages; ++i)
+ {
+ unsigned long pfn = page_to_pfn(mdlPriv->nonContiguousPages[i + skipPages]);
+
+ if (remap_pfn_range(vma,
+ start,
+ pfn,
+ PAGE_SIZE,
+ vma->vm_page_prot) < 0)
+ {
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): remap_pfn_range error.",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ start += PAGE_SIZE;
+ }
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+_GFPUnmapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Size
+ )
+{
+ struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv;
+
+ mdlPriv->cacheable = gcvFALSE;
+
+ if (unlikely(current->mm == gcvNULL))
+ {
+ /* Do nothing if process is exiting. */
+ return;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ if (vm_munmap((unsigned long)Logical, Size) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): vm_munmap failed",
+ __FUNCTION__, __LINE__
+ );
+ }
+#else
+ down_write(&current->mm->mmap_sem);
+ if (do_munmap(current->mm, (unsigned long)Logical, Size) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): do_munmap failed",
+ __FUNCTION__, __LINE__
+ );
+ }
+ up_write(&current->mm->mmap_sem);
+#endif
+}
+
+static gceSTATUS
_GFPMapUser(
gckALLOCATOR Allocator,
PLINUX_MDL Mdl,
@@ -586,35 +704,26 @@ _GFPMapUser(
OUT gctPOINTER * UserLogical
)
{
- gckOS os = Allocator->os;
-
- PLINUX_MDL mdl = Mdl;
- gctPOINTER userLogical = gcvNULL;
- struct vm_area_struct * vma;
- struct gfp_mdl_priv *mdlPriv = Mdl->priv;
+ gctPOINTER userLogical = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
gcmkHEADER_ARG("Allocator=%p Mdl=%p Cacheable=%d", Allocator, Mdl, Cacheable);
- /* mdlPriv->cacheable must be used under protection of mdl->mapMutex. */
- mdlPriv->cacheable = Cacheable;
-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
- userLogical = (void *)vm_mmap(NULL,
+ userLogical = (gctPOINTER)vm_mmap(NULL,
0L,
- mdl->numPages * PAGE_SIZE,
+ Mdl->numPages * PAGE_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
0);
#else
down_write(&current->mm->mmap_sem);
-
- userLogical = (void *)do_mmap_pgoff(NULL,
+ userLogical = (gctPOINTER)do_mmap_pgoff(NULL,
0L,
- mdl->numPages * PAGE_SIZE,
+ Mdl->numPages * PAGE_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
0);
-
up_write(&current->mm->mmap_sem);
#endif
@@ -623,7 +732,7 @@ _GFPMapUser(
"%s(%d): vmaAddr->%p for phys_addr->%p",
__FUNCTION__, __LINE__,
userLogical,
- mdl
+ Mdl
);
if (IS_ERR(userLogical))
@@ -636,89 +745,54 @@ _GFPMapUser(
userLogical = gcvNULL;
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
- /* Remap here since there is no file and ops->mmap(). */
down_write(&current->mm->mmap_sem);
-
- vma = find_vma(current->mm, (unsigned long)userLogical);
-
- if (vma == gcvNULL)
+ do
{
- up_write(&current->mm->mmap_sem);
-
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): find_vma error",
- __FUNCTION__, __LINE__
- );
+ struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv;
+ struct vm_area_struct *vma = find_vma(current->mm, (unsigned long)userLogical);
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_RESOURCES);
- return gcvSTATUS_OUT_OF_RESOURCES;
- }
+ if (vma == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): find_vma error",
+ __FUNCTION__, __LINE__
+ );
- if (gcmIS_ERROR(gfp_mmap_internal(mdlPriv, vma)))
- {
- up_write(&current->mm->mmap_sem);
+ gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES);
+ }
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
+ /* mdlPriv->cacheable must be used under protection of mdl->mapMutex. */
+ mdlPriv->cacheable = Cacheable;
+ gcmkERR_BREAK(_GFPMmap(Allocator, Mdl, 0, Mdl->numPages, vma));
}
-
+ while (gcvFALSE);
up_write(&current->mm->mmap_sem);
- gcmkVERIFY_OK(gckOS_CacheFlush(
- os,
- _GetProcessID(),
- mdl,
- gcvINVALID_ADDRESS,
- userLogical,
- mdl->numPages * PAGE_SIZE
- ));
-
- *UserLogical = userLogical;
-
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-}
-
-static void
-_GFPUnmapUser(
- IN gckALLOCATOR Allocator,
- IN PLINUX_MDL Mdl,
- IN gctPOINTER Logical,
- IN gctUINT32 Size
- )
-{
- if (unlikely(current->mm == gcvNULL))
+ if (gcmIS_SUCCESS(status))
{
- /* Do nothing if process is exiting. */
- return;
- }
+ gcmkONERROR(gckOS_CacheFlush(
+ Allocator->os,
+ _GetProcessID(),
+ Mdl,
+ gcvINVALID_ADDRESS,
+ userLogical,
+ Mdl->numPages * PAGE_SIZE
+ ));
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- if (vm_munmap((unsigned long)Logical, Size) < 0)
- {
- gcmkTRACE_ZONE(
- gcvLEVEL_WARNING, gcvZONE_OS,
- "%s(%d): vm_munmap failed",
- __FUNCTION__, __LINE__
- );
+ *UserLogical = userLogical;
}
-#else
- down_write(&current->mm->mmap_sem);
- if (do_munmap(current->mm, (unsigned long)Logical, Size) < 0)
+
+OnError:
+ if (gcmIS_ERROR(status))
{
- gcmkTRACE_ZONE(
- gcvLEVEL_WARNING, gcvZONE_OS,
- "%s(%d): do_munmap failed",
- __FUNCTION__, __LINE__
- );
+ _GFPUnmapUser(Allocator, Mdl, *UserLogical, Mdl->numPages * PAGE_SIZE);
}
- up_write(&current->mm->mmap_sem);
-#endif
+ gcmkFOOTER();
+ return status;
}
static gceSTATUS
@@ -865,12 +939,14 @@ _GFPAllocatorDestructor(
static gcsALLOCATOR_OPERATIONS GFPAllocatorOperations = {
.Alloc = _GFPAlloc,
.Free = _GFPFree,
+ .Mmap = _GFPMmap,
.MapUser = _GFPMapUser,
.UnmapUser = _GFPUnmapUser,
.MapKernel = _GFPMapKernel,
.UnmapKernel = _GFPUnmapKernel,
.Cache = _GFPCache,
.Physical = _GFPPhysical,
+ .GetSGT = _GFPGetSGT,
};
/* GFP allocator entry. */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c
index d788df2545ac..3f378807eda4 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c
@@ -212,27 +212,64 @@ reserved_mem_detach(
kfree(res);
}
-static void
-munmap_user(unsigned long vaddr, unsigned long size)
+static gceSTATUS
+reserved_mem_mmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT struct vm_area_struct *vma
+ )
{
- if (unlikely(!current->mm))
- return;
+ struct reserved_mem *res = (struct reserved_mem*)Mdl->priv;
+ unsigned long pfn;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma);
+
+ gcmkASSERT(skipPages + numPages <= Mdl->numPages);
-#if defined(CONFIG_X86)
- if (set_memory_wb(vaddr, size >> PAGE_SHIFT))
+ pfn = (res->start >> PAGE_SHIFT) + skipPages;
+
+ /* Make this mapping non-cached. */
+ vma->vm_flags |= gcdVM_FLAGS;
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ if (remap_pfn_range(vma, vma->vm_start,
+ pfn, numPages << PAGE_SHIFT, vma->vm_page_prot) < 0)
{
- printk("%s: failed to set_memory_wb\n", __func__);
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): remap_pfn_range error.",
+ __FUNCTION__, __LINE__
+ );
+
+ status = gcvSTATUS_OUT_OF_MEMORY;
}
-#endif
+
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+reserved_mem_unmap_user(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Size
+ )
+{
+ if (unlikely(!current->mm))
+ return;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
- if (vm_munmap(vaddr, size) < 0)
+ if (vm_munmap((unsigned long)Logical, (unsigned long)Size) < 0)
{
printk("%s: vm_munmap failed\n", __func__);
}
#else
down_write(&current->mm->mmap_sem);
- if (do_munmap(current->mm, vaddr, size) < 0)
+ if (do_munmap(current->mm, (unsigned long)Logical, (unsigned long)Size) < 0)
{
printk("%s: do_munmap failed\n", __func__);
}
@@ -240,7 +277,7 @@ munmap_user(unsigned long vaddr, unsigned long size)
#endif
}
-static gctINT
+static gceSTATUS
reserved_mem_map_user(
gckALLOCATOR Allocator,
PLINUX_MDL Mdl,
@@ -248,87 +285,68 @@ reserved_mem_map_user(
OUT gctPOINTER *UserLogical
)
{
- struct reserved_mem *res = Mdl->priv;
- unsigned long vaddr;
- struct vm_area_struct *vma;
- unsigned int npages;
- unsigned long pfn;
+ struct reserved_mem *res = (struct reserved_mem*)Mdl->priv;
+ gctPOINTER userLogical = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
gcmkHEADER_ARG("Allocator=%p Mdl=%p Cacheable=%d", Allocator, Mdl, Cacheable);
- npages = res->size >> PAGE_SHIFT;
- pfn = res->start >> PAGE_SHIFT;
-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
- vaddr = vm_mmap(NULL, 0L, res->size,
+ userLogical = (gctPOINTER)vm_mmap(NULL, 0L, res->size,
PROT_READ | PROT_WRITE, MAP_SHARED, 0);
#else
down_write(&current->mm->mmap_sem);
-
- vaddr = do_mmap_pgoff(NULL, 0L, res->size,
+ userLogical = (gctPOINTER)do_mmap_pgoff(NULL, 0L, res->size,
PROT_READ | PROT_WRITE, MAP_SHARED, 0);
-
up_write(&current->mm->mmap_sem);
#endif
- if (IS_ERR_VALUE(vaddr))
- {
- vaddr = 0;
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
- }
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): vmaAddr->%p for phys_addr->%p",
+ __FUNCTION__, __LINE__, userLogical, Mdl
+ );
- /* Remap here since there is no file and ops->mmap(). */
- down_write(&current->mm->mmap_sem);
-
- vma = find_vma(current->mm, vaddr);
-
- if (!vma)
+ if (IS_ERR(userLogical))
{
- up_write(&current->mm->mmap_sem);
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): do_mmap_pgoff error",
+ __FUNCTION__, __LINE__
+ );
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_RESOURCES);
- return gcvSTATUS_OUT_OF_RESOURCES;
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
- /* Make this mapping non-cached. */
- vma->vm_flags |= gcdVM_FLAGS;
- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-
-#if defined(CONFIG_X86)
- if (set_memory_wc(vma->vm_start, npages))
+ down_write(&current->mm->mmap_sem);
+ do
{
- printk("%s: failed to set_memory_wc\n", __func__);
- }
-#endif
+ struct vm_area_struct *vma = find_vma(current->mm, (unsigned long)userLogical);
+ if (vma == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): find_vma error",
+ __FUNCTION__, __LINE__
+ );
- if (remap_pfn_range(vma, vma->vm_start,
- pfn, res->size, vma->vm_page_prot) < 0)
- {
- up_write(&current->mm->mmap_sem);
+ gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES);
+ }
- munmap_user(vaddr, res->size);
+ gcmkERR_BREAK(reserved_mem_mmap(Allocator, Mdl, 0, Mdl->numPages, vma));
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
+ *UserLogical = userLogical;
}
-
+ while (gcvFALSE);
up_write(&current->mm->mmap_sem);
- *UserLogical = (void *)vaddr;
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
-}
-
-static void
-reserved_mem_unmap_user(
- IN gckALLOCATOR Allocator,
- IN PLINUX_MDL Mdl,
- IN gctPOINTER Logical,
- IN gctUINT32 Size
- )
-{
- munmap_user((unsigned long)Logical, (unsigned long)Size);
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ reserved_mem_unmap_user(Allocator, Mdl, *UserLogical, res->size);
+ }
+ gcmkFOOTER();
+ return status;
}
static gceSTATUS
@@ -420,6 +438,7 @@ static gcsALLOCATOR_OPERATIONS reserved_mem_ops = {
.Alloc = NULL,
.Attach = reserved_mem_attach,
.Free = reserved_mem_detach,
+ .Mmap = reserved_mem_mmap,
.MapUser = reserved_mem_map_user,
.UnmapUser = reserved_mem_unmap_user,
.MapKernel = reserved_mem_map_kernel,
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c
index ef5c8125ea1f..26a81b678c13 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c
@@ -552,7 +552,7 @@ _UserMemoryFree(
gcmkFOOTER_NO();
}
-static gctINT
+static gceSTATUS
_UserMemoryMapUser(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
@@ -564,7 +564,7 @@ _UserMemoryMapUser(
*UserLogical = (gctPOINTER)userMemory->user_vaddr;
- return 0;
+ return gcvSTATUS_OK;
}
static void
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c
index 9a17b8c8b9ef..b623ae1a250b 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c
@@ -185,6 +185,71 @@ OnError:
return status;
}
+static gceSTATUS
+_CMAFSLGetSGT(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *SGT
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
+ struct page ** pages = gcvNULL;
+ struct page * page = gcvNULL;
+ struct sg_table *sgt = NULL;
+ struct mdl_cma_priv *mdl_priv = (struct mdl_cma_priv*)Mdl->priv;
+
+ gceSTATUS status = gcvSTATUS_OK;
+ gctSIZE_T offset = Offset & ~PAGE_MASK; /* Offset to the first page */
+ gctINT skipPages = Offset >> PAGE_SHIFT; /* skipped pages */
+ gctINT numPages = (PAGE_ALIGN(Offset + Bytes) >> PAGE_SHIFT) - skipPages;
+ gctINT i;
+
+ gcmkASSERT(Offset + Bytes <= Mdl->numPages << PAGE_SHIFT);
+
+ sgt = kmalloc(sizeof(struct sg_table), GFP_KERNEL | gcdNOWARN);
+ if (!sgt)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ pages = kmalloc(sizeof(struct page*) * numPages, GFP_KERNEL | gcdNOWARN);
+ if (!pages)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ page = virt_to_page(mdl_priv->kvaddr);
+ for (i = 0; i < numPages; ++i)
+ {
+ pages[i] = nth_page(page, i + skipPages);
+ }
+
+ if (sg_alloc_table_from_pages(sgt, pages, numPages, offset, Bytes, GFP_KERNEL) < 0)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ *SGT = (gctPOINTER)sgt;
+
+OnError:
+ if (pages)
+ {
+ kfree(pages);
+ }
+
+ if (gcmIS_ERROR(status) && sgt)
+ {
+ kfree(sgt);
+ }
+
+ return status;
+#else
+ return gcvSTATUS_NOT_SUPPORTED;
+#endif
+}
+
static void
_CMAFSLFree(
IN gckALLOCATOR Allocator,
@@ -192,134 +257,65 @@ _CMAFSLFree(
)
{
gckOS os = Allocator->os;
- struct mdl_cma_priv *mdl_priv=(struct mdl_cma_priv *)Mdl->priv;
+ struct mdl_cma_priv *mdlPriv=(struct mdl_cma_priv *)Mdl->priv;
gcsCMA_PRIV_PTR priv = (gcsCMA_PRIV_PTR)Allocator->privateData;
dma_free_writecombine(&os->device->platform->device->dev,
Mdl->numPages * PAGE_SIZE,
- mdl_priv->kvaddr,
- mdl_priv->physical);
- gckOS_Free(os, mdl_priv);
+ mdlPriv->kvaddr,
+ mdlPriv->physical);
+ gckOS_Free(os, mdlPriv);
atomic_sub(Mdl->numPages, &priv->cmasize);
}
-static gctINT
-_CMAFSLMapUser(
+static gceSTATUS
+_CMAFSLMmap(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
- IN gctBOOL Cacheable,
- OUT gctPOINTER * UserLogical
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT struct vm_area_struct *vma
)
{
- PLINUX_MDL mdl = Mdl;
- struct mdl_cma_priv *mdl_priv=(struct mdl_cma_priv *)Mdl->priv;
- gckOS os = Allocator->os;
- struct vm_area_struct * vma;
- gctPOINTER userLogical = gcvNULL;
-
- gcmkHEADER_ARG("Allocator=%p Mdl=%p Cacheable=%d", Allocator, Mdl, Cacheable);
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
- userLogical = (gctSTRING)vm_mmap(gcvNULL,
- 0L,
- mdl->numPages * PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_NORESERVE,
- 0);
-#else
- down_write(&current->mm->mmap_sem);
-
- userLogical = (gctSTRING)do_mmap_pgoff(gcvNULL,
- 0L,
- mdl->numPages * PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- 0);
-
- up_write(&current->mm->mmap_sem);
-#endif
-
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): vmaAddr->%p for phys_addr->%p",
- __FUNCTION__, __LINE__, userLogical, mdl
- );
-
- if (IS_ERR(userLogical))
- {
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): do_mmap_pgoff error",
- __FUNCTION__, __LINE__
- );
-
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
- }
-
- down_write(&current->mm->mmap_sem);
-
- vma = find_vma(current->mm, (unsigned long)userLogical);
-
- if (vma == gcvNULL)
- {
- up_write(&current->mm->mmap_sem);
+ gckOS os = Allocator->os;
+ struct mdl_cma_priv *mdlPriv = (struct mdl_cma_priv*)Mdl->priv;
+ gceSTATUS status = gcvSTATUS_OK;
- gcmkTRACE_ZONE(
- gcvLEVEL_INFO, gcvZONE_OS,
- "%s(%d): find_vma error",
- __FUNCTION__, __LINE__
- );
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma);
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_RESOURCES);
- return gcvSTATUS_OUT_OF_RESOURCES;
- }
+ gcmkASSERT(skipPages + numPages <= Mdl->numPages);
/* Now map all the vmalloc pages to this user address. */
- if (mdl->contiguous)
+ if (Mdl->contiguous)
{
/* map kernel memory to user space.. */
if (dma_mmap_writecombine(&os->device->platform->device->dev,
vma,
- mdl_priv->kvaddr,
- mdl_priv->physical,
- mdl->numPages * PAGE_SIZE) < 0)
+ (gctINT8_PTR)mdlPriv->kvaddr + (skipPages << PAGE_SHIFT),
+ mdlPriv->physical + (skipPages << PAGE_SHIFT),
+ numPages << PAGE_SHIFT) < 0)
{
- up_write(&current->mm->mmap_sem);
-
gcmkTRACE_ZONE(
gcvLEVEL_WARNING, gcvZONE_OS,
"%s(%d): dma_mmap_attrs error",
__FUNCTION__, __LINE__
);
- gcmkFOOTER_ARG("*status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
}
else
{
- gckOS_Print("incorrect mdl:conti%d\n",mdl->contiguous);
+ gcmkFATAL("%s(%d): unexpected noncontiguous mdl\n");
+ gcmkONERROR(gcvSTATUS_HEAP_CORRUPTED);
}
- up_write(&current->mm->mmap_sem);
-
- gcmkVERIFY_OK(gckOS_CacheFlush(
- os,
- _GetProcessID(),
- mdl,
- gcvINVALID_ADDRESS,
- (gctPOINTER)userLogical,
- mdl->numPages * PAGE_SIZE
- ));
-
- *UserLogical = userLogical;
-
- gcmkFOOTER_NO();
- return gcvSTATUS_OK;
+OnError:
+ gcmkFOOTER();
+ return status;
}
static void
-_CMAUnmapUser(
+_CMAFSLUnmapUser(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
IN gctPOINTER Logical,
@@ -356,6 +352,97 @@ _CMAUnmapUser(
}
static gceSTATUS
+_CMAFSLMapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctBOOL Cacheable,
+ OUT gctPOINTER * UserLogical
+ )
+{
+ gctPOINTER userLogical = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p Cacheable=%d", Allocator, Mdl, Cacheable);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
+ userLogical = (gctPOINTER)vm_mmap(gcvNULL,
+ 0L,
+ Mdl->numPages * PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_NORESERVE,
+ 0);
+#else
+ down_write(&current->mm->mmap_sem);
+ userLogical = (gctPOINTER)do_mmap_pgoff(gcvNULL,
+ 0L,
+ Mdl->numPages * PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED,
+ 0);
+ up_write(&current->mm->mmap_sem);
+#endif
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): vmaAddr->%p for phys_addr->%p",
+ __FUNCTION__, __LINE__, userLogical, Mdl
+ );
+
+ if (IS_ERR(userLogical))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): do_mmap_pgoff error",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ down_write(&current->mm->mmap_sem);
+ do
+ {
+ struct vm_area_struct *vma = find_vma(current->mm, (unsigned long)userLogical);
+ if (vma == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): find_vma error",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ gcmkERR_BREAK(_CMAFSLMmap(Allocator, Mdl, 0, Mdl->numPages, vma));
+ }
+ while (gcvFALSE);
+ up_write(&current->mm->mmap_sem);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ gcmkONERROR(gckOS_CacheFlush(
+ Allocator->os,
+ _GetProcessID(),
+ Mdl,
+ gcvINVALID_ADDRESS,
+ userLogical,
+ Mdl->numPages * PAGE_SIZE
+ ));
+
+ *UserLogical = userLogical;
+ }
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ _CMAFSLUnmapUser(Allocator, Mdl, userLogical, Mdl->numPages * PAGE_SIZE);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
_CMAMapKernel(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
@@ -425,12 +512,14 @@ static gcsALLOCATOR_OPERATIONS CMAFSLAllocatorOperations =
{
.Alloc = _CMAFSLAlloc,
.Free = _CMAFSLFree,
+ .Mmap = _CMAFSLMmap,
.MapUser = _CMAFSLMapUser,
- .UnmapUser = _CMAUnmapUser,
+ .UnmapUser = _CMAFSLUnmapUser,
.MapKernel = _CMAMapKernel,
.UnmapKernel = _CMAUnmapKernel,
.Cache = _CMACache,
.Physical = _CMAPhysical,
+ .GetSGT = _CMAFSLGetSGT,
};
/* Default allocator entry. */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h
index 59a582dd9db9..a854d6e20a99 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h
@@ -58,6 +58,7 @@
#include "gc_hal_kernel_linux.h"
#include <linux/slab.h>
+#include <linux/mm_types.h>
typedef struct _gcsALLOCATOR * gckALLOCATOR;
typedef union _gcsATTACH_DESC * gcsATTACH_DESC_PTR;
@@ -125,6 +126,40 @@ typedef struct _gcsALLOCATOR_OPERATIONS
/**************************************************************************
**
+ ** Mmap
+ **
+ ** Map a page range of the memory to user space.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Pointer to a Mdl.
+ **
+ ** gctSIZE_T skipPages
+ ** Number of page to be skipped from beginning of this memory.
+ **
+ ** gctSIZE_T numPages
+ ** Number of pages to be mapped from skipPages.
+ **
+ ** INOUT:
+ **
+ ** struct vm_area_struct *vma
+ ** Pointer to VMM memory area.
+ **
+ */
+ gceSTATUS
+ (*Mmap)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT struct vm_area_struct *vma
+ );
+
+ /**************************************************************************
+ **
** MapUser
**
** Map memory to user space.
@@ -147,7 +182,7 @@ typedef struct _gcsALLOCATOR_OPERATIONS
** Nothing.
**
*/
- gctINT
+ gceSTATUS
(*MapUser)(
IN gckALLOCATOR Allocator,
IN PLINUX_MDL Mdl,
@@ -325,6 +360,38 @@ typedef struct _gcsALLOCATOR_OPERATIONS
IN gcsATTACH_DESC_PTR Desc,
OUT PLINUX_MDL Mdl
);
+
+ /**************************************************************************
+ **
+ ** GetSGT
+ **
+ ** Get scatter-gather table from a range of the memory.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** gctUINT32 Handle
+ ** Handle of the memory.
+ **
+ ** gctSIZE_T Offset
+ ** Offset to the beginning of this mdl.
+ **
+ ** gctSIZE_T Bytes
+ ** Total bytes form Offset.
+ **
+ ** OUTPUT:
+ ** gctPOINTER *SGT
+ ** scatter-gather table
+ **
+ */
+ gceSTATUS (*GetSGT)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *SGT
+ );
}
gcsALLOCATOR_OPERATIONS;
@@ -370,7 +437,7 @@ typedef union _gcsATTACH_DESC
/* gcvALLOC_FLAG_DMABUF */
struct
{
- gctINT fd;
+ gctPOINTER dmabuf;
}
dmaBuf;
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c
index 26a974ae14a4..f2138cfc93f6 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c
@@ -599,7 +599,7 @@ gc_dump_trigger_show(struct seq_file *m, void *data)
#if gcdENABLE_3D || gcdENABLE_2D
seq_printf(m, "Get dump from /proc/kmsg or /sys/kernel/debug/gc/galcore_trace\n");
- if (kernel && kernel->hardware->powerManagement == gcvFALSE)
+ if (kernel && kernel->hardware->options.powerManagement == gcvFALSE)
{
_DumpState(kernel);
}
@@ -856,6 +856,7 @@ _SetupVidMem(
if (gcmIS_SUCCESS(status))
{
+ device->contiguousVidMem->physical = device->contiguousPhysical;
device->contiguousBase = physAddr;
break;
}
@@ -906,11 +907,12 @@ _SetupVidMem(
&device->contiguousPhysical
));
+ device->contiguousVidMem->physical = device->contiguousPhysical;
device->requestedContiguousBase = ContiguousBase;
device->requestedContiguousSize = ContiguousSize;
device->contiguousPhysicalName = 0;
- device->contiguousSize = ContiguousSize;
+ device->contiguousSize = ContiguousSize;
}
}
}
@@ -1106,6 +1108,8 @@ gckGALDEVICE_Construct(
IN gctSIZE_T RegisterMemSizeVG,
IN gctUINT32 ContiguousBase,
IN gctSIZE_T ContiguousSize,
+ IN gctUINT32 ExternalBase,
+ IN gctSIZE_T ExternalSize,
IN gctSIZE_T BankSize,
IN gctINT FastClear,
IN gctINT Compression,
@@ -1120,8 +1124,7 @@ gckGALDEVICE_Construct(
)
{
gctUINT32 internalBaseAddress = 0, internalAlignment = 0;
- gctUINT32 externalBaseAddress = 0, externalAlignment = 0;
- gctUINT32 horizontalTileSize, verticalTileSize;
+ gctUINT32 externalAlignment = 0;
gctUINT32 physical;
gckGALDEVICE device;
gceSTATUS status;
@@ -1314,6 +1317,10 @@ gckGALDEVICE_Construct(
gcmkONERROR(_SetupVidMem(device, ContiguousBase, ContiguousSize, BankSize, Args));
+ /* Set external base and size */
+ device->externalBase = ExternalBase;
+ device->externalSize = ExternalSize;
+
if (device->irqLines[gcvCORE_MAJOR] != -1)
{
gcmkONERROR(gcTA_Construct(device->taos, gcvCORE_MAJOR, &globalTA[gcvCORE_MAJOR]));
@@ -1459,13 +1466,6 @@ gckGALDEVICE_Construct(
&device->systemMemorySize,
&device->systemMemoryBaseAddress
));
- /* query the amount of video memory */
- gcmkONERROR(gckVGHARDWARE_QueryMemory(
- device->kernels[i]->vg->hardware,
- &device->internalSize, &internalBaseAddress, &internalAlignment,
- &device->externalSize, &externalBaseAddress, &externalAlignment,
- &horizontalTileSize, &verticalTileSize
- ));
}
else
#endif
@@ -1476,17 +1476,8 @@ gckGALDEVICE_Construct(
&device->systemMemorySize,
&device->systemMemoryBaseAddress
));
-
- /* query the amount of video memory */
- gcmkONERROR(gckHARDWARE_QueryMemory(
- device->kernels[i]->hardware,
- &device->internalSize, &internalBaseAddress, &internalAlignment,
- &device->externalSize, &externalBaseAddress, &externalAlignment,
- &horizontalTileSize, &verticalTileSize
- ));
}
-
/* Grab the first availiable kernel */
for (i = 0; i < gcdMAX_GPU_COUNT; i++)
{
@@ -1523,7 +1514,6 @@ gckGALDEVICE_Construct(
}
device->internalPhysical = (gctPHYS_ADDR)(gctUINTPTR_T) physical;
- device->internalPhysicalName = gcmPTR_TO_NAME(device->internalPhysical);
physical += device->internalSize;
}
}
@@ -1533,30 +1523,37 @@ gckGALDEVICE_Construct(
/* create the external memory heap */
status = gckVIDMEM_Construct(
device->os,
- externalBaseAddress, device->externalSize, externalAlignment,
+ device->externalBase, device->externalSize, externalAlignment,
0, &device->externalVidMem
);
if (gcmIS_ERROR(status))
{
- /* Error, disable internal heap. */
+ /* Error, disable external heap. */
device->externalSize = 0;
}
else
{
/* Map external memory. */
- device->externalLogical
- = (gctPOINTER) ioremap_nocache(physical, device->externalSize);
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ device->os,
+ device->externalBase, device->externalSize,
+ "galcore external memory",
+ gcvTRUE,
+ &device->externalPhysical
+ ));
+ device->externalVidMem->physical = device->externalPhysical;
+ }
+ }
- if (device->externalLogical == gcvNULL)
- {
- gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
- }
+ if (device->internalPhysical)
+ {
+ device->internalPhysicalName = gcmPTR_TO_NAME(device->internalPhysical);
+ }
- device->externalPhysical = (gctPHYS_ADDR)(gctUINTPTR_T) physical;
- device->externalPhysicalName = gcmPTR_TO_NAME(device->externalPhysical);
- physical += device->externalSize;
- }
+ if (device->externalPhysical)
+ {
+ device->externalPhysicalName = gcmPTR_TO_NAME(device->externalPhysical);
}
if (device->contiguousPhysical)
@@ -1655,10 +1652,16 @@ gckGALDEVICE_Destroy(
Device->internalVidMem = gcvNULL;
}
+ if (Device->externalPhysical != gcvNULL)
+ {
+ gckOS_ReleaseReservedMemory(
+ Device->os,
+ Device->externalPhysical
+ );
+ }
+
if (Device->externalLogical != gcvNULL)
{
- /* Unmap the external memory. */
- iounmap(Device->externalLogical);
Device->externalLogical = gcvNULL;
}
@@ -1679,7 +1682,6 @@ gckGALDEVICE_Destroy(
Device->contiguousPhysical
));
}
-#if !USE_LINUX_PCIE
else
{
gckOS_ReleaseReservedMemory(
@@ -1690,7 +1692,6 @@ gckGALDEVICE_Destroy(
Device->requestedContiguousBase = 0;
Device->requestedContiguousSize = 0;
}
-#endif
Device->contiguousLogical = gcvNULL;
Device->contiguousPhysical = gcvNULL;
@@ -2205,7 +2206,7 @@ gckGALDEVICE_Stop(
{
gcmkONERROR(gckHARDWARE_SetPowerManagement(
Device->kernels[i]->hardware, gcvTRUE
- ));
+ ));
/* Switch to OFF power state. */
gcmkONERROR(gckHARDWARE_SetPowerManagementState(
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h
index f5470d8cf494..aab2712b2cd8 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h
@@ -101,6 +101,8 @@ typedef struct _gckGALDEVICE
gctUINT32 internalPhysicalName;
gctPOINTER internalLogical;
gckVIDMEM internalVidMem;
+
+ gctUINT32 externalBase;
gctSIZE_T externalSize;
gctPHYS_ADDR externalPhysical;
gctUINT32 externalPhysicalName;
@@ -159,6 +161,10 @@ typedef struct _gckGALDEVICE
/* gctsOs object for trust application. */
gctaOS taos;
+
+#if gcdENABLE_DRM
+ void* drm;
+#endif
}
* gckGALDEVICE;
@@ -218,6 +224,8 @@ gceSTATUS gckGALDEVICE_Construct(
IN gctSIZE_T RegisterMemSizeVG,
IN gctUINT32 ContiguousBase,
IN gctSIZE_T ContiguousSize,
+ IN gctUINT32 ExternalBase,
+ IN gctSIZE_T ExternalSize,
IN gctSIZE_T BankSize,
IN gctINT FastClear,
IN gctINT Compression,
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
index 42a5a0a605b3..05474e78553d 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
@@ -72,7 +72,7 @@ MODULE_LICENSE("Dual MIT/GPL");
#if gcdFPGA_BUILD && !defined(CONFIG_PPC)
#define USE_MSI 0
#else
-#define USE_MIS 1
+#define USE_MSI 1
#endif
static struct class* gpuClass;
@@ -140,6 +140,14 @@ static ulong contiguousBase = 0;
module_param(contiguousBase, ulong, 0644);
MODULE_PARM_DESC(contiguousBase, "Base address of memory reserved for GC, if it is 0, GC driver will try to allocate a buffer whose size defined by contiguousSize");
+static ulong externalSize = 0;
+module_param(externalSize, ulong, 0644);
+MODULE_PARM_DESC(externalSize, "Size of external memory, if it is 0, means there is no external pool");
+
+static ulong externalBase = 0;
+module_param(externalBase, ulong, 0644);
+MODULE_PARM_DESC(externalBase, "Base address of external memory");
+
static int fastClear = -1;
module_param(fastClear, int, 0644);
MODULE_PARM_DESC(fastClear, "Disable fast clear if set it to 0, enabled by default");
@@ -232,9 +240,11 @@ _UpdateModuleParam(
#endif
contiguousSize = Param->contiguousSize;
contiguousBase = Param->contiguousBase;
+ externalSize = Param->externalSize;
+ externalBase = Param->externalBase;
bankSize = Param->bankSize;
fastClear = Param->fastClear;
- compression = Param->compression;
+ compression = (gctINT)Param->compression;
powerManagement = Param->powerManagement;
gpuProfiler = Param->gpuProfiler;
signal = Param->signal;
@@ -291,6 +301,8 @@ gckOS_DumpParam(
printk(" contiguousSize = 0x%08lX\n", contiguousSize);
printk(" contiguousBase = 0x%08lX\n", contiguousBase);
+ printk(" externalSize = 0x%08lX\n", externalSize);
+ printk(" externalBase = 0x%08lX\n", externalBase);
printk(" bankSize = 0x%08lX\n", bankSize);
printk(" fastClear = %d\n", fastClear);
printk(" compression = %d\n", compression);
@@ -703,6 +715,7 @@ static int drv_init(void)
irqLineVG,
registerMemBaseVG, registerMemSizeVG,
contiguousBase, contiguousSize,
+ externalBase, externalSize,
bankSize, fastClear, compression, baseAddress, physSize, signal,
logFileSize,
powerManagement,
@@ -851,6 +864,11 @@ static void drv_exit(void)
gcmkFOOTER_NO();
}
+#if gcdENABLE_DRM
+int viv_drm_probe(struct device *dev);
+int viv_drm_remove(struct device *dev);
+#endif
+
#if USE_LINUX_PCIE
static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
#else /* USE_LINUX_PCIE */
@@ -874,9 +892,10 @@ static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
.registerMemSizeVG = registerMemSizeVG,
.contiguousSize = contiguousSize,
.contiguousBase = contiguousBase,
+ .externalSize = externalSize,
+ .externalBase = externalBase,
.bankSize = bankSize,
.fastClear = fastClear,
- .compression = compression,
.powerManagement = powerManagement,
.gpuProfiler = gpuProfiler,
.signal = signal,
@@ -896,7 +915,7 @@ static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
memcpy(moduleParam.registerBases, registerBases, gcmSIZEOF(gctUINT) * gcvCORE_COUNT);
memcpy(moduleParam.registerSizes, registerSizes, gcmSIZEOF(gctUINT) * gcvCORE_COUNT);
memcpy(moduleParam.chipIDs, chipIDs, gcmSIZEOF(gctUINT) * gcvCORE_COUNT);
-
+ moduleParam.compression = (compression == -1) ? gcvCOMPRESSION_OPTION_DEFAULT : (gceCOMPRESSION_OPTION)compression;
platform->device = pdev;
#if USE_LINUX_PCIE
if (pci_enable_device(pdev)) {
@@ -948,11 +967,19 @@ static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
platform_set_drvdata(pdev, galDevice);
#endif
- gcmkFOOTER_NO();
- return ret;
+#if gcdENABLE_DRM
+ ret = viv_drm_probe(&pdev->dev);
+#endif
}
- gcmkFOOTER_ARG(KERN_INFO "Failed to register gpu driver: %d\n", ret);
+ if (ret < 0)
+ {
+ gcmkFOOTER_ARG(KERN_INFO "Failed to register gpu driver: %d\n", ret);
+ }
+ else
+ {
+ gcmkFOOTER_NO();
+ }
return ret;
}
@@ -968,6 +995,10 @@ static void gpu_remove(struct pci_dev *pdev)
{
gcmkHEADER();
+#if gcdENABLE_DRM
+ viv_drm_remove(&pdev->dev);
+#endif
+
drv_exit();
if (platform->ops->putPower)
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c
new file mode 100644
index 000000000000..2291a89dd0c1
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c
@@ -0,0 +1,493 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2017 Vivante Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*
+*****************************************************************************
+*
+* The GPL License (GPL)
+*
+* Copyright (C) 2014 - 2017 Vivante Corporation
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*****************************************************************************
+*
+* Note: This software is released under dual MIT and GPL licenses. A
+* recipient may use this file under the terms of either the MIT license or
+* GPL License. If you wish to use only one license not the other, you can
+* indicate your decision by deleting one of the above license notices in your
+* version of this file.
+*
+*****************************************************************************/
+
+
+#if gcdENABLE_DRM
+
+#include <drm/drmP.h>
+#include <drm/drm_gem.h>
+#include <linux/dma-buf.h>
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_drm.h"
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+/******************************************************************************\
+******************************* gckKERNEL DRM Code ******************************
+\******************************************************************************/
+
+struct viv_gem_object {
+ struct drm_gem_object base;
+
+ uint32_t node;
+};
+
+struct dma_buf *viv_gem_prime_export(struct drm_device *drm,
+ struct drm_gem_object *gem_obj,
+ int flags)
+{
+ struct viv_gem_object *viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+ struct dma_buf *dmabuf = gcvNULL;
+ gckGALDEVICE gal_dev = (gckGALDEVICE)drm->dev_private;
+
+ if (gal_dev)
+ {
+ gckKERNEL kernel = gal_dev->device->map[gal_dev->device->defaultHwType].kernels[0];
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Export(kernel, viv_obj->node, flags,
+ (gctPOINTER*)&dmabuf, gcvNULL));
+ }
+
+ return dmabuf;
+}
+
+struct drm_gem_object *viv_gem_prime_import(struct drm_device *drm,
+ struct dma_buf *dmabuf)
+{
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj;
+
+ gcsHAL_INTERFACE iface;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_WRAP_USER_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.WrapUserMemory.desc.flag = gcvALLOC_FLAG_DMABUF;
+ iface.u.WrapUserMemory.desc.handle = -1;
+ iface.u.WrapUserMemory.desc.dmabuf = gcmPTR_TO_UINT64(dmabuf);
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ /* ioctl output */
+ gem_obj = kzalloc(sizeof(struct viv_gem_object), GFP_KERNEL);
+ drm_gem_private_object_init(drm, gem_obj, dmabuf->size);
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+ viv_obj->node = iface.u.WrapUserMemory.node;
+
+OnError:
+ return gem_obj;
+}
+
+void viv_gem_free_object(struct drm_gem_object *gem_obj)
+{
+ struct viv_gem_object *viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+ struct drm_device *drm = gem_obj->dev;
+
+ gcsHAL_INTERFACE iface;
+ gckGALDEVICE gal_dev = (gckGALDEVICE)drm->dev_private;
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_RELEASE_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.ReleaseVideoMemory.node = viv_obj->node;
+ gcmkVERIFY_OK(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ drm_gem_object_release(gem_obj);
+ kfree(gem_obj);
+}
+
+static int viv_ioctl_gem_create(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ int ret = 0;
+ struct drm_viv_gem_create *args = (struct drm_viv_gem_create*)data;
+ struct drm_gem_object *gem_obj;
+ struct viv_gem_object *viv_obj;
+
+ gcsHAL_INTERFACE iface;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.AllocateLinearVideoMemory.bytes = PAGE_ALIGN(args->size);
+ iface.u.AllocateLinearVideoMemory.alignment = 256;
+ iface.u.AllocateLinearVideoMemory.type = gcvSURF_RENDER_TARGET; /* should be general */
+ iface.u.AllocateLinearVideoMemory.flag = args->flags;
+ iface.u.AllocateLinearVideoMemory.pool = gcvPOOL_DEFAULT;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ /* ioctl output */
+ gem_obj = kzalloc(sizeof(struct viv_gem_object), GFP_KERNEL);
+ drm_gem_private_object_init(drm, gem_obj, iface.u.AllocateLinearVideoMemory.bytes);
+ ret = drm_gem_handle_create(file, gem_obj, &args->handle);
+
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+ viv_obj->node = iface.u.AllocateLinearVideoMemory.node;
+
+ /* drop reference from allocate - handle holds it now */
+ drm_gem_object_unreference_unlocked(gem_obj);
+
+OnError:
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_lock(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_lock *args = (struct drm_viv_gem_lock*)data;
+ struct drm_gem_object *gem_obj;
+ struct viv_gem_object *viv_obj;
+
+ gcsHAL_INTERFACE iface;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gem_obj = drm_gem_object_lookup(file, args->handle);
+ if (!gem_obj)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_LOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.LockVideoMemory.node = viv_obj->node;
+ iface.u.LockVideoMemory.cacheable = args->cacheable;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ args->cpu_va = iface.u.LockVideoMemory.memory;
+ args->gpu_va = iface.u.LockVideoMemory.address;
+
+OnError:
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_unlock(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_unlock *args = (struct drm_viv_gem_unlock*)data;
+ struct drm_gem_object *gem_obj;
+ struct viv_gem_object *viv_obj;
+
+ gcsHAL_INTERFACE iface;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gem_obj = drm_gem_object_lookup(file, args->handle);
+ if (!gem_obj)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+ drm_gem_object_unreference_unlocked(gem_obj);
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_UNLOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.UnlockVideoMemory.node = (gctUINT64)viv_obj->node;
+ iface.u.UnlockVideoMemory.type = gcvSURF_TYPE_UNKNOWN;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ /*
+ * decrease obj->refcount one more time because we has already
+ * increased it at viv_ioctl_gem_lock().
+ */
+ drm_gem_object_unreference_unlocked(gem_obj);
+
+OnError:
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_cache(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_cache *args = (struct drm_viv_gem_cache*)data;
+ struct drm_gem_object *gem_obj;
+ struct viv_gem_object *viv_obj;
+
+ gcsHAL_INTERFACE iface;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gem_obj = drm_gem_object_lookup(file, args->handle);
+ if (!gem_obj)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+ drm_gem_object_unreference_unlocked(gem_obj);
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_CACHE;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.Cache.node = viv_obj->node;
+ iface.u.Cache.operation = args->op;
+ iface.u.Cache.logical = args->logical;
+ iface.u.Cache.bytes = args->bytes;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+OnError:
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_getinfo(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_getinfo *args = (struct drm_viv_gem_getinfo*)data;
+ struct drm_gem_object *gem_obj;
+ struct viv_gem_object *viv_obj;
+
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+ gckKERNEL kernel;
+ gctUINT32 processID;
+ gckVIDMEM_NODE node = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ kernel = gal_dev->device->map[gal_dev->device->defaultHwType].kernels[0];
+
+ gem_obj = drm_gem_object_lookup(file, args->handle);
+ if (!gem_obj)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+ drm_gem_object_unreference_unlocked(gem_obj);
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(kernel, processID, viv_obj->node, &node));
+ switch (args->param)
+ {
+ case VIV_GEM_PARAM_NODE:
+ args->value = (__u64)viv_obj->node;
+ break;
+ case VIV_GEM_PARAM_POOL:
+ args->value = (__u64)node->pool;
+ break;
+ case VIV_GEM_PARAM_SIZE:
+ args->value = (node->node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ ? (__u64)node->node->VidMem.bytes
+ : (__u64)node->node->Virtual.bytes;;
+ break;
+ default:
+ break;
+ }
+
+OnError:
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static const struct drm_ioctl_desc viv_ioctls[] =
+{
+ DRM_IOCTL_DEF_DRV(VIV_GEM_CREATE, viv_ioctl_gem_create, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_LOCK, viv_ioctl_gem_lock, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_UNLOCK, viv_ioctl_gem_unlock, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_CACHE, viv_ioctl_gem_cache, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_GETINFO, viv_ioctl_gem_getinfo, DRM_AUTH | DRM_RENDER_ALLOW),
+};
+
+int viv_drm_open(struct drm_device *drm, struct drm_file *file)
+{
+ gctINT i;
+ gctUINT32 pid = _GetProcessID();
+ gckGALDEVICE gal_dev = (gckGALDEVICE)drm->dev_private;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; ++i)
+ {
+ if (gal_dev->kernels[i])
+ {
+ gcmkONERROR(gckKERNEL_AttachProcessEx(gal_dev->kernels[i], gcvTRUE, pid));
+ }
+ }
+ file->driver_priv = gcmINT2PTR(pid);
+
+OnError:
+ return gcmIS_ERROR(status) ? -ENODEV : 0;
+}
+
+void viv_drm_postclose(struct drm_device *drm, struct drm_file *file)
+{
+ gctINT i;
+ gctUINT32 pid = gcmPTR2INT(file->driver_priv);
+ gckGALDEVICE gal_dev = (gckGALDEVICE)drm->dev_private;
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; ++i)
+ {
+ if (gal_dev->kernels[i])
+ {
+ gcmkVERIFY_OK(gckKERNEL_AttachProcessEx(gal_dev->kernels[i], gcvFALSE, pid));
+ }
+ }
+}
+
+static const struct file_operations viv_drm_fops = {
+ .owner = THIS_MODULE,
+ .open = drm_open,
+ .release = drm_release,
+ .unlocked_ioctl = drm_ioctl,
+ .compat_ioctl = drm_compat_ioctl,
+ .poll = drm_poll,
+ .read = drm_read,
+ .llseek = no_llseek,
+};
+
+static struct drm_driver viv_drm_driver = {
+ .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER,
+ .open = viv_drm_open,
+ .postclose = viv_drm_postclose,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
+ .gem_free_object_unlocked = viv_gem_free_object,
+#else
+ .gem_free_object = viv_gem_free_object,
+#endif
+ .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+ .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
+ .gem_prime_export = viv_gem_prime_export,
+ .gem_prime_import = viv_gem_prime_import,
+ .ioctls = viv_ioctls,
+ .num_ioctls = DRM_VIV_NUM_IOCTLS,
+ .fops = &viv_drm_fops,
+ .name = "vivante",
+ .desc = "vivante DRM",
+ .date = "20170808",
+ .major = 1,
+ .minor = 0,
+};
+
+int viv_drm_probe(struct device *dev)
+{
+ int ret = 0;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+ struct drm_device *drm = gcvNULL;
+
+ gal_dev = (gckGALDEVICE)dev_get_drvdata(dev);
+ if (!gal_dev)
+ {
+ ret = -ENODEV;
+ gcmkONERROR(gcvSTATUS_INVALID_OBJECT);
+ }
+
+ drm = drm_dev_alloc(&viv_drm_driver, dev);
+ if (IS_ERR(drm))
+ {
+ ret = PTR_ERR(drm);
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ drm->dev_private = (void*)gal_dev;
+
+ ret = drm_dev_register(drm, 0);
+ if (ret)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ gal_dev->drm = (void*)drm;
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ if (drm)
+ {
+ drm_dev_unref(drm);
+ }
+ printk(KERN_ERR "galcore: Failed to setup drm device.\n");
+ }
+ return ret;
+}
+
+int viv_drm_remove(struct device *dev)
+{
+ gckGALDEVICE gal_dev = (gckGALDEVICE)dev_get_drvdata(dev);
+
+ if (gal_dev)
+ {
+ struct drm_device *drm = (struct drm_device*)gal_dev->drm;
+
+ drm_dev_unregister(drm);
+ drm_dev_unref(drm);
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
index 0578656e4f8e..02a71859185b 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
@@ -288,17 +288,20 @@ gckKERNEL_MapVideoMemoryEx(
IN gceCORE Core,
IN gctBOOL InUserSpace,
IN gctUINT32 Address,
+ IN gcePOOL Pool,
OUT gctPOINTER * Logical
)
{
gckGALDEVICE device = gcvNULL;
- gcePOOL pool = gcvPOOL_UNKNOWN;
gctUINT32 offset = 0;
gctUINT32 base = 0;
+ gctSIZE_T bytes = 0;
+ gctPHYS_ADDR physical = gcvNULL;
gceSTATUS status;
gctPOINTER logical = gcvNULL;
- gctUINT32 baseAddress;
- gctPHYS_ADDR_T physical;
+#if gcdENABLE_VG
+ gcePOOL pool = gcvPOOL_UNKNOWN;
+#endif
gcmkHEADER_ARG("Kernel=%p InUserSpace=%d Address=%08x",
Kernel, InUserSpace, Address);
@@ -320,13 +323,11 @@ gckKERNEL_MapVideoMemoryEx(
else
#endif
{
- /* Split the memory address into a pool type and offset. */
- gcmkONERROR(
- gckHARDWARE_SplitMemory(Kernel->hardware, Address, &pool, &offset));
+ offset = Address;
}
/* Dispatch on pool. */
- switch (pool)
+ switch (Pool)
{
case gcvPOOL_LOCAL_INTERNAL:
/* Internal memory. */
@@ -336,68 +337,46 @@ gckKERNEL_MapVideoMemoryEx(
break;
case gcvPOOL_LOCAL_EXTERNAL:
- /* External memory. */
- logical = device->externalLogical;
- /* Impossible to use per device logical for all user processes. */
- BUG_ON("Incorrect path");
- break;
-
- case gcvPOOL_SYSTEM:
- /* System memory. */
- {
- PLINUX_MDL mdl;
- PLINUX_MDL_MAP mdlMap;
-
- mdl = (PLINUX_MDL) device->contiguousPhysical;
-
- mutex_lock(&mdl->mapsMutex);
- mdlMap = FindMdlMap(mdl, _GetProcessID());
- mutex_unlock(&mdl->mapsMutex);
-
- if (!mdlMap)
- {
- gcmkPRINT("%s: SYSTEM pool is not mapped", __func__);
- gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
- }
-
- logical = (gctPOINTER) mdlMap->vmaAddr;
- }
+ physical = device->externalPhysical;
+ bytes = device->externalSize;
#if gcdENABLE_VG
if (Core == gcvCORE_VG)
{
gcmkVERIFY_OK(
gckVGHARDWARE_SplitMemory(Kernel->vg->hardware,
- device->contiguousVidMem->baseAddress,
+ device->externalVidMem->baseAddress,
&pool,
&base));
}
else
#endif
{
- gctUINT32 systemBaseAddress = 0;
-
- if (Kernel->hardware->mmuVersion == 0)
- {
- gcmkONERROR(gckOS_GetBaseAddress(Kernel->os, &systemBaseAddress));
- }
+ base = Kernel->externalBaseAddress;
+ }
- gcmkVERIFY_OK(
- gckOS_CPUPhysicalToGPUPhysical(
- Kernel->os,
- device->contiguousVidMem->baseAddress - systemBaseAddress,
- &physical
- ));
+ break;
- gcmkSAFECASTPHYSADDRT(baseAddress, physical);
+ case gcvPOOL_SYSTEM:
+ /* System memory. */
+ physical = device->contiguousPhysical;
+ bytes = device->contiguousSize;
+#if gcdENABLE_VG
+ if (Core == gcvCORE_VG)
+ {
gcmkVERIFY_OK(
- gckHARDWARE_SplitMemory(Kernel->hardware,
- baseAddress,
+ gckVGHARDWARE_SplitMemory(Kernel->vg->hardware,
+ device->contiguousVidMem->baseAddress,
&pool,
&base));
}
- offset -= base;
+ else
+#endif
+ {
+ base = Kernel->contiguousBaseAddress;
+ }
+
break;
default:
@@ -405,6 +384,11 @@ gckKERNEL_MapVideoMemoryEx(
gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
}
+ gcmkONERROR(gckOS_MapMemory(Kernel->os, physical, bytes, &logical));
+
+ /* GPU address offset */
+ offset -= base;
+
/* Build logical address of specified address. */
*Logical = (gctPOINTER) ((gctUINT8_PTR) logical + offset);
@@ -450,7 +434,7 @@ gckKERNEL_MapVideoMemory(
OUT gctPOINTER * Logical
)
{
- return gckKERNEL_MapVideoMemoryEx(Kernel, gcvCORE_MAJOR, InUserSpace, Address, Logical);
+ return gckKERNEL_MapVideoMemoryEx(Kernel, gcvCORE_MAJOR, InUserSpace, Address, gcvPOOL_SYSTEM, Logical);
}
/*******************************************************************************
**
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
index 2c8cc4b928fd..f050781fad3a 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
@@ -191,10 +191,10 @@ FindMdlMap(
static PLINUX_MDL
_CreateMdl(
- void
+ IN gckOS Os
)
{
- PLINUX_MDL mdl;
+ PLINUX_MDL mdl;
gcmkHEADER();
@@ -202,6 +202,8 @@ _CreateMdl(
if (mdl)
{
+ mdl->os = Os;
+ atomic_set(&mdl->refs, 1);
mutex_init(&mdl->mapsMutex);
INIT_LIST_HEAD(&mdl->mapsHead);
}
@@ -215,19 +217,42 @@ _DestroyMdl(
IN PLINUX_MDL Mdl
)
{
- PLINUX_MDL_MAP mdlMap, next;
-
gcmkHEADER_ARG("Mdl=0x%X", Mdl);
/* Verify the arguments. */
gcmkVERIFY_ARGUMENT(Mdl != gcvNULL);
- list_for_each_entry_safe(mdlMap, next, &Mdl->mapsHead, link)
+ if (atomic_dec_and_test(&Mdl->refs))
{
- gcmkVERIFY_OK(_DestroyMdlMap(Mdl, mdlMap));
- }
+ gckOS os = Mdl->os;
+ gckALLOCATOR allocator = Mdl->allocator;
+ PLINUX_MDL_MAP mdlMap, next;
+
+ /* Valid private means alloc/attach successfully */
+ if (Mdl->priv)
+ {
+ if (Mdl->addr)
+ {
+ allocator->ops->UnmapKernel(allocator, Mdl, Mdl->addr);
+ }
+ allocator->ops->Free(allocator, Mdl);
+ }
+
+ list_for_each_entry_safe(mdlMap, next, &Mdl->mapsHead, link)
+ {
+ gcmkVERIFY_OK(_DestroyMdlMap(Mdl, mdlMap));
+ }
+
+ if (Mdl->link.next)
+ {
+ /* Remove the node from global list.. */
+ mutex_lock(&os->mdlMutex);
+ list_del(&Mdl->link);
+ mutex_unlock(&os->mdlMutex);
+ }
- kfree(Mdl);
+ kfree(Mdl);
+ }
gcmkFOOTER_NO();
return gcvSTATUS_OK;
@@ -1117,10 +1142,7 @@ gckOS_MapMemory(
if (mdlMap == gcvNULL)
{
- mutex_unlock(&mdl->mapsMutex);
-
- gcmkFOOTER_ARG("status=%d", gcvSTATUS_OUT_OF_MEMORY);
- return gcvSTATUS_OUT_OF_MEMORY;
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
}
@@ -1142,6 +1164,8 @@ gckOS_MapMemory(
return gcvSTATUS_OK;
OnError:
+ mutex_unlock(&mdl->mapsMutex);
+
gcmkFOOTER();
return status;
}
@@ -1389,7 +1413,7 @@ gckOS_AllocateNonPagedMemory(
numPages = GetPageCount(bytes, 0);
/* Allocate mdl structure */
- mdl = _CreateMdl();
+ mdl = _CreateMdl(Os);
if (mdl == gcvNULL)
{
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
@@ -1411,15 +1435,6 @@ gckOS_AllocateNonPagedMemory(
/* Point to dma coherent allocator. */
if (strcmp(allocator->name, "dma"))
{
- /*!VIV:
- * For historical issue, we force allocate all non-paged memory from
- * dma coherent pool when it is not disabled.
- *
- * The code below changes the scheme a little: force allocate
- * non-paged memory whose size is larger than 1 pages, can try other
- * allocators otherwise. This is to save memory usage of dma
- * coherent pool.
- */
if (((flag & allocator->capability) != flag) ||
(numPages > 1))
{
@@ -1473,15 +1488,13 @@ gckOS_AllocateNonPagedMemory(
*Logical = addr;
}
- mutex_lock(&Os->mdlMutex);
-
/*
* Add this to a global list.
* Will be used by get physical address
* and mapuser pointer functions.
*/
+ mutex_lock(&Os->mdlMutex);
list_add_tail(&mdl->link, &Os->mdlHead);
-
mutex_unlock(&Os->mdlMutex);
/* Return allocated memory. */
@@ -1494,12 +1507,6 @@ gckOS_AllocateNonPagedMemory(
return gcvSTATUS_OK;
OnError:
- if (mdlMap != gcvNULL)
- {
- /* Free LINUX_MDL_MAP. */
- gcmkVERIFY_OK(_DestroyMdlMap(mdl, mdlMap));
- }
-
if (mdl != gcvNULL)
{
/* Free LINUX_MDL. */
@@ -1543,9 +1550,7 @@ gceSTATUS gckOS_FreeNonPagedMemory(
IN gctPOINTER Logical
)
{
- PLINUX_MDL mdl;
-
- gckALLOCATOR allocator;
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
gcmkHEADER_ARG("Os=0x%X Bytes=%lu Physical=0x%X Logical=0x%X",
Os, Bytes, Physical, Logical);
@@ -1556,21 +1561,6 @@ gceSTATUS gckOS_FreeNonPagedMemory(
gcmkVERIFY_ARGUMENT(Physical != 0);
gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
- /* Convert physical address into a pointer to a MDL. */
- mdl = (PLINUX_MDL) Physical;
-
- allocator = mdl->allocator;
-
- allocator->ops->UnmapKernel(allocator, mdl, mdl->addr);
- allocator->ops->Free(allocator, mdl);
-
- mutex_lock(&Os->mdlMutex);
-
- /* Remove the node from global list.. */
- list_del(&mdl->link);
-
- mutex_unlock(&Os->mdlMutex);
-
gcmkVERIFY_OK(_DestroyMdl(mdl));
/* Success. */
@@ -1617,8 +1607,7 @@ gckOS_RequestReservedMemory(
/* Round up to page size. */
Size = (Size + ~PAGE_MASK) & PAGE_MASK;
- mdl = _CreateMdl();
-
+ mdl = _CreateMdl(Os);
if (!mdl)
{
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
@@ -1647,15 +1636,13 @@ gckOS_RequestReservedMemory(
mdl->dmaHandle = Start;
mdl->gid = 0;
- mutex_lock(&Os->mdlMutex);
-
/*
* Add this to a global list.
* Will be used by get physical address
* and mapuser pointer functions.
*/
+ mutex_lock(&Os->mdlMutex);
list_add_tail(&mdl->link, &Os->mdlHead);
-
mutex_unlock(&Os->mdlMutex);
*MemoryHandle = (void *)mdl;
@@ -3236,7 +3223,7 @@ gckOS_AllocatePagedMemoryEx(
numPages = GetPageCount(bytes, 0);
- mdl = _CreateMdl();
+ mdl = _CreateMdl(Os);
if (mdl == gcvNULL)
{
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
@@ -3285,15 +3272,13 @@ gckOS_AllocatePagedMemoryEx(
*Gid = mdl->gid;
}
- mutex_lock(&Os->mdlMutex);
-
/*
* Add this to a global list.
* Will be used by get physical address
* and mapuser pointer functions.
*/
+ mutex_lock(&Os->mdlMutex);
list_add_tail(&mdl->link, &Os->mdlHead);
-
mutex_unlock(&Os->mdlMutex);
/* Return physical address. */
@@ -3343,8 +3328,7 @@ gckOS_FreePagedMemory(
IN gctSIZE_T Bytes
)
{
- PLINUX_MDL mdl = (PLINUX_MDL) Physical;
- gckALLOCATOR allocator = (gckALLOCATOR)mdl->allocator;
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
gcmkHEADER_ARG("Os=0x%X Physical=0x%X Bytes=%lu", Os, Physical, Bytes);
@@ -3353,15 +3337,6 @@ gckOS_FreePagedMemory(
gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
gcmkVERIFY_ARGUMENT(Bytes > 0);
- mutex_lock(&Os->mdlMutex);
-
- /* Remove the node from global list. */
- list_del(&mdl->link);
-
- mutex_unlock(&Os->mdlMutex);
-
- allocator->ops->Free(allocator, mdl);
-
/* Free the structure... */
gcmkVERIFY_OK(_DestroyMdl(mdl));
@@ -6237,7 +6212,7 @@ _QuerySignal(
* spinlock for 'Os->signalDB.lock' and 'signal->obj.wait.lock'.
*/
gceSTATUS status;
- gcsSIGNAL_PTR signal;
+ gcsSIGNAL_PTR signal = gcvNULL;
status = _QueryIntegerId(&Os->signalDB,
(gctUINT32)(gctUINTPTR_T)Signal,
@@ -6284,7 +6259,7 @@ gckOS_MapSignal(
)
{
gceSTATUS status;
- gcsSIGNAL_PTR signal;
+ gcsSIGNAL_PTR signal = gcvNULL;
gcmkHEADER_ARG("Os=0x%X Signal=0x%X Process=0x%X", Os, Signal, Process);
gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
@@ -7352,7 +7327,7 @@ gckOS_CreateNativeFence(
struct sync_file *sync = NULL;
int fd;
struct viv_sync_timeline *timeline;
- gcsSIGNAL_PTR signal;
+ gcsSIGNAL_PTR signal = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
/* Create fence. */
@@ -7706,6 +7681,16 @@ gckOS_QueryOption(
*Value = (gctUINT32)device->contiguousBase;
return gcvSTATUS_OK;
}
+ else if (!strcmp(Option, "externalSize"))
+ {
+ *Value = device->externalSize;
+ return gcvSTATUS_OK;
+ }
+ else if (!strcmp(Option, "externalBase"))
+ {
+ *Value = device->externalBase;
+ return gcvSTATUS_OK;
+ }
else if (!strcmp(Option, "recovery"))
{
*Value = device->args.recovery;
@@ -7723,11 +7708,7 @@ gckOS_QueryOption(
}
else if (!strcmp(Option, "TA"))
{
-#if USE_LINUX_PCIE
- *Value = 0;
-#else
*Value = 0;
-#endif
return gcvSTATUS_OK;
}
else if (!strcmp(Option, "gpuProfiler"))
@@ -7739,6 +7720,73 @@ gckOS_QueryOption(
return gcvSTATUS_NOT_SUPPORTED;
}
+gceSTATUS
+gckOS_MemoryGetSGT(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *SGT
+ )
+{
+ PLINUX_MDL mdl;
+ gckALLOCATOR allocator;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (!Physical)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ mdl = (PLINUX_MDL)Physical;
+ allocator = mdl->allocator;
+
+ if (!allocator->ops->GetSGT)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ if (Bytes > 0)
+ {
+ gcmkONERROR(allocator->ops->GetSGT(allocator, mdl, Offset, Bytes, SGT));
+ }
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckOS_MemoryMmap(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ INOUT gctPOINTER Vma
+ )
+{
+ PLINUX_MDL mdl;
+ gckALLOCATOR allocator;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (!Physical)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ mdl = (PLINUX_MDL)Physical;
+ allocator = mdl->allocator;
+
+ if (!allocator->ops->Mmap)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ gcmkONERROR(allocator->ops->Mmap(allocator, mdl, skipPages, numPages, Vma));
+
+OnError:
+ return status;
+}
+
/*******************************************************************************
**
** gckOS_WrapMemory
@@ -7782,7 +7830,7 @@ gckOS_WrapMemory(
gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
- mdl = _CreateMdl();
+ mdl = _CreateMdl(Os);
if (mdl == gcvNULL)
{
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
@@ -7790,7 +7838,7 @@ gckOS_WrapMemory(
if (Desc->flag & gcvALLOC_FLAG_DMABUF)
{
- desc.dmaBuf.fd = (gctINT) Desc->handle;
+ desc.dmaBuf.dmabuf = gcmUINT64_TO_PTR(Desc->dmabuf);
}
else if (Desc->flag & gcvALLOC_FLAG_USERMEMORY)
{
@@ -7853,15 +7901,13 @@ gckOS_WrapMemory(
*Contiguous = mdl->contiguous;
- mutex_lock(&Os->mdlMutex);
-
/*
* Add this to a global list.
* Will be used by get physical address
* and mapuser pointer functions.
*/
+ mutex_lock(&Os->mdlMutex);
list_add_tail(&mdl->link, &Os->mdlHead);
-
mutex_unlock(&Os->mdlMutex);
/* Success. */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
index c17a8f5c56d7..4fcf6969567b 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
@@ -70,6 +70,10 @@ struct _LINUX_MDL_MAP
struct _LINUX_MDL
{
+ gckOS os;
+
+ atomic_t refs;
+
char * addr;
gctINT numPages;
@@ -85,6 +89,9 @@ struct _LINUX_MDL
/* Private data used by allocator. */
void * priv;
+ /* exported dma_buf */
+ void * dmabuf;
+
uint gid;
struct list_head link;
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h
index 1d2773893390..e7feddadd515 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h
@@ -75,9 +75,11 @@ typedef struct _gcsMODULE_PARAMETERS
gctUINT contiguousSize;
gctUINT contiguousBase;
gctUINT contiguousRequested;
+ gctUINT externalSize;
+ gctUINT externalBase;
gctUINT bankSize;
gctINT fastClear;
- gctINT compression;
+ gceCOMPRESSION_OPTION compression;
gctINT powerManagement;
gctINT gpuProfiler;
gctINT signal;
@@ -212,7 +214,7 @@ typedef struct soc_platform_ops
/*******************************************************************************
**
- ** getGPUPhysical
+ ** getCPUPhysical
**
** Convert GPU physical address to CPU physical address if they are
** different.
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.c
index 0f69de361052..c728045be5ce 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.c
@@ -1044,6 +1044,17 @@ static inline int get_power_imx8_subsystem(struct device *pdev)
continue;
}
+#if defined(CONFIG_ANDROID) && LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0)
+ /* TODO: freescale BSP issue in some platform like imx8dv. */
+ clk_prepare(clk_core);
+ clk_set_rate(clk_core, 800000000);
+ clk_unprepare(clk_core);
+
+ clk_prepare(clk_shader);
+ clk_set_rate(clk_shader, 800000000);
+ clk_unprepare(clk_shader);
+#endif
+
priv->imx_gpu_clks[core].clk_shader = clk_shader;
priv->imx_gpu_clks[core].clk_core = clk_core;
priv->imx_gpu_clks[core].clk_axi = clk_axi;
diff --git a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c
index db1a26be0b79..f032e7ac9524 100644
--- a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c
+++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c
@@ -383,7 +383,7 @@ gctaHARDWARE_Construct(
)
{
gceSTATUS status;
- gcTA_HARDWARE hardware;
+ gcTA_HARDWARE hardware = gcvNULL;
gctaOS os = TA->os;
@@ -413,12 +413,18 @@ gctaHARDWARE_Construct(
0x00000900
);
- _IdentifyHardwareByDatabase(hardware);
+ gcmkONERROR(_IdentifyHardwareByDatabase(hardware));
*Hardware = hardware;
return gcvSTATUS_OK;
+
OnError:
+ if (hardware)
+ {
+ gctaOS_Free(hardware);
+ }
+
return status;
}